Artem
							
								Интересующийся 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 «  : 28-07-2006 08:37 »   | 
								
								 | 
							  
							 
							Доброго времени суток! Есть USB девайс, имеющий 1 конфигурацию и два интерфейса. В одном одна конечная точка типа INT, а в другом две типа BULK. По умолчанию драйвер конфигурируется на интерфейс 0. А мне нужен интерфейс 1(где две конечных точки). Как в драйвере переключать интерфейсы? (пишу на DDK, точнее пыиаюсь писать) 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							IRP
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 28-07-2006 15:14 »   | 
								
								 | 
							  
							 
							URB_FUNCTION_SELECT_INTERFACE 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Artem
							
								Интересующийся 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #2 : 31-07-2006 03:07 »   | 
								
								 | 
							  
							 
							Спасибо. А по подробнее можно? Примерчик кода бы какой-нибудь, если не жалко 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							IRP
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 31-07-2006 07:14 »   | 
								
								 | 
							  
							 
							Живого примера нет, но если почитаешь DDK там написано что для заполнения стуктуры данного типа, можно использовать функцию UsbBuildSelectInterfaceRequest один из параметров которой InterfaceNumber. В результате обработки данного IRP тебе будет заполнена структура USBD_INTERFACE_INFORMATION которая содержит массив хендлов для каждого пайпа в этом интерфейсе. Для определения размера URB структуры можно воспользоваться макросом GET_SELECT_INTERFACE_REQUEST_SIZE.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							maaaaaad
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #4 : 31-07-2006 08:21 »   | 
								
								 | 
							  
							 
							есть еще макто UsbBuildSelectConfigurationRequest
  или  1. Создаешь рекваест, например USB_DEVICE_DESCRIPTOR dd; URB urb; UsbBuildGetDescriptorRequest(&urb,    sizeof(_URB_CONTROL_DESCRIPTOR_REQUEST),   USB_DEVICE_DESCRIPTOR_TYPE, 0, 0, &dd, NULL,   sizeof(dd), NULL); 2. Отправляешь его о ожидаешь выполнения  NTSTATUS SendAwaitUrb(PDEVICE_OBJECT fdo, PURB urb)   {   PDEVICE_EXTENSION pdx =     (PDEVICE_EXTENSION) fdo->DeviceExtension;   KEVENT event;   KeInitializeEvent(&event, NotificationEvent, FALSE);   IO_STATUS_BLOCK iostatus;   PIRP Irp = IoBuildDeviceIoControlRequest     (IOCTL_INTERNAL_USB_SUBMIT_URB, pdx->LowerDeviceObject,     NULL, 0, NULL, 0, TRUE, &event, &iostatus);   PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp);   stack->Parameters.Others.Argument1 = (PVOID) urb;   NTSTATUS status = IoCallDriver(pdx->LowerDeviceObject, Irp);   if (status  == STATUS_PENDING)     {     KeWaitForSingleObject(&event, Executive, KernelMode,       FALSE, NULL);     status = iostatus.Status;     }   return status;   }
 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							IRP
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 31-07-2006 08:25 »   | 
								
								 | 
							  
							 
							У него то конфигурация 1, а интерфейсов несколько. Это запрос он должен был сделать до переключения (выбора) интерфейсов. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							maaaaaad
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 31-07-2006 08:38 »   | 
								
								 | 
							  
							 
							я привел пример для UsbBuildGetDescriptorRequest, большая разница что-ли? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							IRP
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 31-07-2006 08:43 »   | 
								
								 | 
							  
							 
							А я по поводу UsbBuildSelectConfigurationRequest отвечал   К коду ни каких притензий, все правильно!  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Artem
							
								Интересующийся 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 31-07-2006 09:44 »   | 
								
								 | 
							  
							 
							Спасибо за ответы! Т.е. мне можно применить этот примерчик, только вместо UsbBuildGetDescriptorRequest поставить UsbBuildSelectInterfaceRequest ?
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							IRP
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #9 : 31-07-2006 09:54 »   | 
								
								 | 
							  
							 
							Нет. Для того что бы начать работу с USB устройством ты должен:
  1. Запросить дискриптор устройства используя URB запрос URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
  2. Затем дискриптор конфигурации (в котором и содержится информация об конфигурациях устройства и конфигурациях интерфейсов) URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
  3. Если необходимо запросить дополнительные дискрипторы URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
  4. Выполнить выбор конфигурации. URB_FUNCTION_SELECT_CONFIGURATION
  5. И наконец выбрать интерфейс в выбраной конфигурации. URB_FUNCTION_SELECT_INTERFACE
  6. Еще какая то инициализация, если нужна и собственно работа....
  Microsoft облегчила жизнь програмистам и создала несколько обверточных функций который помогут тебе заполнять структуры URB запросов, это функции UsbBuild... как ими пользоваться найдешь в DDK. В качестве примера можешь глянуть  \WINDDK\3790\src\wdm\usb\bulkusb\
  И еще советую поставить какой нибудь USB монитор и посмотреть как начинают работать драйвера с USB устройством. Процесс инициализации у них практически идентичный... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 31-07-2006 09:58 от IRP »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Artem
							
								Интересующийся 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 01-08-2006 05:15 »   | 
								
								 | 
							  
							 
							там в DDK вроде через urb = USBD_CreateConfigurationRequestEx(ConfigurationDescriptor, tmp); делается? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							IRP
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #11 : 01-08-2006 06:56 »   | 
								
								 | 
							  
							 
							Можно и так, а можно и ручками с помошью ExAllocatePool...выделить память и заполнить структуру...дело твое. Вообще советую еще раз: поставь USB монитор и посмотри как работают с USB девайсами, потому как мне кажется что тебе поручили задачу с которой ты еще не разобрался... Разобраться как работать с URB запросами и т.д...
 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Artem
							
								Интересующийся 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #12 : 01-08-2006 08:19 »   | 
								
								 | 
							  
							 
							так вот я и разбираюсь! Понятно, что можно сделатьпо разному..  А скажите как лучше и проще? Если я ни разу не писал дрова, то конечно очень много нового и непонятного.. Спасибо , что помогаете разобраться! 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							IRP
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #13 : 01-08-2006 09:17 »   | 
								
								 | 
							  
							 
							Как лучше сказать не могу.. каждый сам выбирает как ему работать. Только скажу, если Вы ни разу не писали драйвера, то будет сложно, а темболее в такой теме как USB. Советую найти и почитать немного книгу Walter Oney 2nd ed. Она написано довольно хорошо, и есть раздел который посвящен USB. Затем открываем DDK и читаем весь материал посвященный URB запросам. Это для понимания того как общается USB драйвер с хост контроллером. Вот после того как у Вас будет понимание работы USB драйверов в Windows, можно приступать к написанию драйвера.  Я так понимаю что железка работает по определенному протоколу, который Вам прийдется поддерживать на уровне URB протокола.
 
 
 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Artem
							
								Интересующийся 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #14 : 02-08-2006 04:18 »   | 
								
								 | 
							  
							 
							Эта железка - это макетная плата с микроконтроллером AT91SAM7S64. С прошивкой от ИАРа. (Basic USB). Вот хочу с ниим разобраться для начала. Но там 1 конфигурация и два интерфейса, в одном 1 к.т., а в другом - 2 к.т. Вот я и хочу переключить интерфейс. А как сделать пока не знаю... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							IRP
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #15 : 02-08-2006 06:32 »   | 
								
								 | 
							  
							 
							Все понятно, но опять же, по хорошему действовать нужно по выше описанному алгоритму, выполнить вот те 5 шагов, а дальше переключай интерфейсы как хочешь. Все равно скоро тебе понадобится еще и данные передавать или получать, а без понимания протокола завернутого в URB запросы - никуда. Примеры смотри в DDK, они довольно хорошо написаны.
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Artem
							
								Интересующийся 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #16 : 02-08-2006 09:21 »   | 
								
								 | 
							  
							 
							А может есть у кого нибудь исходник для примера? А то в DDK слишком большой и трудный для понимания на начальных порах... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Sdefs
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #17 : 26-10-2006 15:14 »   | 
								
								 | 
							  
							 
							Здоров! Чесно говоря разбираюсь с той же темой!  AT91SAM7S64. Нужно разобраться с интерфейсом USB. Ты же разбирался с этим почти 3 месяца назад, многое узнал наверно. Подскажешь, можно ли отлаживать драйвер в вижуале? Есть ли у тебя такой драйвер? 
						 | 
					 
					
						
							
								
									 
									
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Artem
							
								Интересующийся 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #18 : 09-11-2006 06:02 »   | 
								
								 | 
							  
							 
							Привет. Вроде разобрался. Но в Вижуале я не работаю, поэтому не знаю как так отлаживаться. Я пишу в редакторе и компилирую DDK. Отлаживаюсь в СофтАйсе. Если интересно - пиши  Ctrl_Shift@ngs.ru 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Артем
							
								Опытный 
								
								 
								  Offline
								Пол:   
								Beware the wolf in sheep's clothing.
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #19 : 16-01-2007 19:11 »   | 
								
								 | 
							  
							 
							Вообще советую еще раз: поставь USB монитор...
  а можешь посоветовать какой-нибудь USB монитор?  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Ochkarik
							
						 | 
						
							
								  | 
								
									
									«  Ответ #20 : 18-01-2007 10:04 »    | 
								
								 | 
							  
							 
							USB Monitor  http://www.hhdsoftware.com/Products/home/usb-monitor.htmlэксперементировал на FTDI и ставил его. но была лишь триальная версия на 14 дней с сайте производителя... но попользовавшись - дико понравилась прога) ето мое ИМХО.  но были и еще пару программулек...  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 18-01-2007 12:09 от Ochkarik »
								 | 
								
									 
									Записан
								 | 
							  
							 
							RTFM уже хоть раз наконец!     :[ ну или хотя бы  STFW...  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Artem
							
								Интересующийся 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #21 : 19-01-2007 05:00 »   | 
								
								 | 
							  
							 
							Да, программа хорошая, только таблетки на неё я не нашёл..     . Может у кого есть?  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	| 
		
		
	 | 
	
		
		
			
				
					
						
							Artem
							
								Интересующийся 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #23 : 22-01-2007 04:38 »   | 
								
								 | 
							  
							 
							Мне понравилась ещё SourceUSB, но на неё тоже таблетку не нашёл. Сейчас юзаю USBTrace, и лекарство на него у меня есть. Прога такая-же почти такая-же как и те. В общем за неимением ничего устраивает. Ещё можно юзать SnoopyPro. Она тоже показывает что при энумерации происходит. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 22-01-2007 04:42 от Artem »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	 |