|
|
  |
ARM. Энкодеры и акселерометры, Помогите решить задачу |
|
|
|
Oct 18 2009, 17:23
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
На CDC реализации драйвер CYUSB заработал после редактирования INFа к драйверу. Есть ли у кого нормальная реализация дескрипторов для этого драйвера? Не хочется использовать CDC, и все его вспомогательные дескрипторы.
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Oct 22 2009, 19:17
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Не знаю в чем конкретная проблема, попробую описать. Пришел от хоста запрос, я его обработал. Отсылаю дескриптор, а мне в терминале следующая запись: Код USB_Init DisconnectUSB END USBD_STATE_POWERED Don't do anything EndBusResProcessing AT91C_UDP_RXSUSP = USBD_STATE_SUSPENDED = USBD_STATE_POWERED Don't do anything EndBusResProcessing REQUEST_TYPE_STANDARD=256 devDescriptor Где проблема? Код додаю.
Прикрепленные файлы
Code.rar ( 7.65 килобайт )
Кол-во скачиваний: 16
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Oct 22 2009, 20:41
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Oct 22 2009, 22:24)  Лучше изложите проблему конкретно - что просит хост, что отправляете, и что получается в результате. Запись в терминале вряд ли понятна кому-нибудь, кроме вас самих. Инициализировал USB. При подключение устройства к шины, происходят прерывания. Обрабатываю их функцией USBD_InterruptHandler. При появлении прерывания от конечной точки обрабатываю его функцией ControlCommandProcessing. Пришел первый стандартный USB Request. Из него получаю getDescriptor, CurrentUSBRequest.wValue = 256. Отправляю дескриптор AT91F_USB_SendData (Тут вопрос, как определить, получил ли хост его?). Дальше не пойму, что следующий запрос CurrentUSBRequest.wValue = 1 хочет. То есть, дескриптор отправил, дальше следует EndBusResProcessing, и снова запрос CurrentUSBRequest.wValue = 256. Несколько раз повторяется, а затем функция AT91F_USB_SendStall, и прощаемся USBD_STATE_SUSPENDED
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Oct 22 2009, 20:55
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
И что делать? Не могу въехать. Он запрашивает getConfiguration?
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Oct 22 2009, 20:58
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Oct 23 2009, 00:55)  И что делать? Не могу въехать. Отправить не более того, сколько разрешают. Цитата(Zliva @ Oct 23 2009, 00:55)  Он запрашивает getConfiguration? Нет.
|
|
|
|
|
Oct 23 2009, 18:42
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Oct 22 2009, 23:50)  Вы не смотрите запрашиваемую хостом длину (wLength), а пытаетесь сразу закинуть ему все 18 байт, на что, естественно, получаете сброс. В первый раз он просит 8. Как Вы определили, что там такое значение? Как обработать эти запросы? Что здесь вообще туго.
Сообщение отредактировал Zliva - Oct 23 2009, 18:46
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Oct 23 2009, 19:53
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Oct 23 2009, 22:42)  Как Вы определили, что там такое значение? Опыт-с. Цитата(Zliva @ Oct 23 2009, 22:42)  Как обработать эти запросы? Что здесь вообще туго. В запросе есть поле wLength, вот что говорит о нем спецификация USB 1.1: Цитата On an input request, a device must never return more data than is indicated by the wLength value; it may return less. Т.е. если ваш дескриптор имеет длину 18 байт, а хост просит 8, то вернуть ему нужно 8. Остальные он спросит потом - сделает запрос device descriptor'а с wLength = 18.
|
|
|
|
|
Oct 23 2009, 21:41
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638

|
господа не сочтите за флуд, но думаю что для понимания данной темы будет очень полезна презентация от ST по ссылке ниже: memsgyroscopes
--------------------
Завтра пойму, что нужно было сделать вчера...
|
|
|
|
|
Oct 24 2009, 19:23
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
У меня получается размер запроса не 8, а 64. Как быть?
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Oct 24 2009, 21:20
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Ну а это зачем "исправили": Код 0x40,//0x08, // bMaxPacketSize0 Максимальный размер пакета для нулевой точки в случае SAM7 - 8 байт. Цитата(Zliva @ Oct 24 2009, 23:23)  Как быть? Еще раз прочитать процитированный мной отрывок из спецификации.
|
|
|
|
|
Oct 25 2009, 21:33
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Прочитал пост с нуля, понял что я тоже нуль. Страшно представить что можно задавать такие глупые вопросы. Огромное СПАСИБО aaarrrr за терпение. И так, дескриптор устройства отправил. Получил 8, передал 8 получил 18, передал 18. С этим понятно. Потом пришел запрос USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE. Обработал и отправил. Все дескрипторы переписываю из примера от Cypress. Затем пришел запрос конфигурации. Спрашивает 9, отвечаю тем же. Потом спрашивает 73, отвечаю. Затем стринг запрос, отвечаю. Но USBVIEW не видит дескриптора конфигурации. Видит только дескриптор устройства. Что делать? Вот привожу объявление дескрипторов: CODE static const USB_DEVICE_DESCRIPTOR f_DeviceDescriptor = { sizeof(USB_DEVICE_DESCRIPTOR), //bLength USB_DEVICE_DESCRIPTOR_TYPE, //bDescriptorType 0x0110, //bcdUSB - 1. 0x00, //bDeviceClass 0x00, //bDeviceSubClass 0x00, //bDeviceProtocol 0x08, //bMaxPacketSize0 - для нулевой точки DEVICE_VID, //idVendor - LCARD DEVICE_PID, //idProduct 1, //bcdDevice 0x01, //iManufacturer 0x02, //iProduct 0x00, //iSerialNumber -- могло бы быть 3 0x01 //bNumConfigurations };
static const USB_DEVICE_QUALIFIER_DESCRIPTOR f_QalifierDescriptor= { sizeof(USB_DEVICE_QUALIFIER_DESCRIPTOR), //bLength USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE, 0x0110, // bcdUSB; 0x00, // bDeviceClass; 0x00, // bDeviceSubClass; 0x00, // bDeviceProtocol; 0x08, // bMaxPacketSize0; 0x01, // bNumConfigurations; 0x00 // bReserved; };
static const FULL_CONFIG_DESCRIPTOR f_ConfigurationDescriptor_Full= { // USB_CONFIGURATION_DESCRIPTOR g_ConfigurationDescriptor = { sizeof(USB_CONFIGURATION_DESCRIPTOR), //bLength USB_CONFIGURATION_DESCRIPTOR_TYPE, //bDescriptorType
sizeof(USB_CONFIGURATION_DESCRIPTOR) + sizeof(USB_INTERFACE_DESCRIPTOR) + sizeof(USB_ENDPOINT_DESCRIPTOR) + sizeof(USB_INTERFACE_DESCRIPTOR) + sizeof(USB_ENDPOINT_DESCRIPTOR) + sizeof(USB_INTERFACE_DESCRIPTOR) + sizeof(USB_ENDPOINT_DESCRIPTOR) + sizeof(USB_INTERFACE_DESCRIPTOR) + sizeof(USB_ENDPOINT_DESCRIPTOR), //wTotalLength 0x01, //bNumInterfaces 0x01, //bConfigurationValue 0x00, //iConfiguration /*1*/ USB_CONFIG_BUS_NOWAKEUP, // 0xA0 // attribute : Bus-powered, no wakeup /*1*/ CURRENT_CONSUMPTION_MA/2 // Maximum power consumption (in 2mA unit, so 0x64 =100= 200mA) },
//Interface Descriptor********************************************************** { sizeof(USB_INTERFACE_DESCRIPTOR), //bLength USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType 0x00, //bInterfaceNumber 0x00, //bAlternateSetting 0x01,//ENDPOINT_COUNT, //bNumEndpoints 0xFF, //bInterfaceClass 0x00, //bInterfaceSubClass 0x00, //bInterfaceProtocol нет протокола 0x00 //iInterface }, //Endpoint Descriptor*********************************************************** { sizeof(USB_ENDPOINT_DESCRIPTOR), //bLength USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType, 0x82, //bEndpointAddress - LTR 10 USB_ENDPOINT_TYPE_BULK, //bmAttributes 0x0040, //wMaxPacketSize 0x01 //bInterval }, //Interface Descriptor 1 ******************************************************* { sizeof(USB_INTERFACE_DESCRIPTOR), //bLength USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType 0x00, //bInterfaceNumber 0x01, //bAlternateSetting 0x01, //ENDPOINT_COUNT, //bNumEndpoints 0xFF, //bInterfaceClass 0x00, //bInterfaceSubClass 0x00, //bInterfaceProtocol нет протокола 0x00 //iInterface }, //Endpoint Descriptor 1 ******************************************************** { sizeof(USB_ENDPOINT_DESCRIPTOR), //bLength USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType, 0x02, //bEndpointAddress - LTR 10 USB_ENDPOINT_TYPE_BULK, //bmAttributes 0x0040, //wMaxPacketSize 0x01 //bInterval }, //Interface Descriptor 2 ******************************************************* { sizeof(USB_INTERFACE_DESCRIPTOR), //bLength USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType 0x00, //bInterfaceNumber 0x02, //bAlternateSetting 0x01, //ENDPOINT_COUNT, //bNumEndpoints 0xFF, //bInterfaceClass 0x00, //bInterfaceSubClass 0x00, //bInterfaceProtocol нет протокола 0x00 //iInterface }, //Endpoint Descriptor 2 ******************************************************** { sizeof(USB_ENDPOINT_DESCRIPTOR), //bLength USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType, 0x82, //bEndpointAddress - LTR 10 USB_ENDPOINT_TYPE_ISOCHRONOUS, //bmAttributes 0x0040, //wMaxPacketSize 0x01 //bInterval }, //Interface Descriptor 3 ******************************************************* { sizeof(USB_INTERFACE_DESCRIPTOR), //bLength USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType 0x00, //bInterfaceNumber 0x03, //bAlternateSetting 0x01, //ENDPOINT_COUNT, //bNumEndpoints 0xFF, //bInterfaceClass 0x00, //bInterfaceSubClass 0x00, //bInterfaceProtocol нет протокола 0x00 //iInterface }, //Endpoint Descriptor 3 ******************************************************** { sizeof(USB_ENDPOINT_DESCRIPTOR), //bLength USB_ENDPOINT_DESCRIPTOR_TYPE, //bDescriptorType, 0x02, //bEndpointAddress - LTR 10 USB_ENDPOINT_TYPE_ISOCHRONOUS, //bmAttributes 0x0040, //wMaxPacketSize 0x01 //bInterval } };
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Oct 25 2009, 21:55
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Oct 26 2009, 00:33)  Потом пришел запрос USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE. Обработал и отправил. Для USB 1.1 он необязателен. И запрашиваться не должен, если в device descriptor не стоит версия 2. Это подозрительно. Цитата(Zliva @ Oct 26 2009, 00:33)  USBVIEW не видит дескриптора конфигурации. Видит только дескриптор устройства. Что делать? Судя по тому, что хост "проглотил" конфигурацию и попросил стринг, его все устроило. По USBVIEW, к сожалению, ничего не подскажу, т.к. не использовал.
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|