Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ARM. Энкодеры и акселерометры
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2, 3, 4
Zliva
На CDC реализации драйвер CYUSB заработал после редактирования INFа к драйверу.
Есть ли у кого нормальная реализация дескрипторов для этого драйвера? Не хочется использовать CDC, и все его вспомогательные дескрипторы.
aaarrr
Цитата(Zliva @ Oct 18 2009, 21:23) *
Есть ли у кого нормальная реализация дескрипторов для этого драйвера?

Напишите самостоятельно. Всего-то нужно Device, Configuration (Interface, Endpoint * N) и опционально String'и.
Zliva
Не знаю в чем конкретная проблема, попробую описать. Пришел от хоста запрос, я его обработал. Отсылаю дескриптор, а мне в терминале следующая запись:
Код
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

Где проблема? Код додаю.
aaarrr
Лучше изложите проблему конкретно - что просит хост, что отправляете, и что получается в результате. Запись в терминале вряд ли понятна кому-нибудь, кроме вас самих.
Zliva
Цитата(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
aaarrr
Вы не смотрите запрашиваемую хостом длину (wLength), а пытаетесь сразу закинуть ему все 18 байт, на что, естественно, получаете сброс. В первый раз он просит 8.
Zliva
И что делать? Не могу въехать. Он запрашивает getConfiguration?
aaarrr
Цитата(Zliva @ Oct 23 2009, 00:55) *
И что делать? Не могу въехать.

Отправить не более того, сколько разрешают.

Цитата(Zliva @ Oct 23 2009, 00:55) *
Он запрашивает getConfiguration?

Нет.
Zliva
Цитата(aaarrr @ Oct 22 2009, 23:50) *
Вы не смотрите запрашиваемую хостом длину (wLength), а пытаетесь сразу закинуть ему все 18 байт, на что, естественно, получаете сброс. В первый раз он просит 8.

Как Вы определили, что там такое значение?
Как обработать эти запросы? Что здесь вообще туго.
aaarrr
Цитата(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.
Faradey
господа не сочтите за флуд, но думаю что для понимания данной темы будет очень полезна презентация от ST по ссылке ниже:
memsgyroscopes
Zliva
У меня получается размер запроса не 8, а 64. Как быть?
aaarrr
Ну а это зачем "исправили":
Код
0x40,//0x08,   // bMaxPacketSize0

Максимальный размер пакета для нулевой точки в случае SAM7 - 8 байт.

Цитата(Zliva @ Oct 24 2009, 23:23) *
Как быть?

Еще раз прочитать процитированный мной отрывок из спецификации.
Zliva
Прочитал пост с нуля, понял что я тоже нуль. Страшно представить что можно задавать такие глупые вопросы.
Огромное СПАСИБО 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
}
};


aaarrr
Цитата(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, к сожалению, ничего не подскажу, т.к. не использовал.
Zliva
Ради прикола оставил только конфигурацию, интерфейс и ендпоинт, заменил DEVICE_PID и USBlyzer увидел все. Странно. Буду разбираться.

Нашел проблему. Что-то сильно намудрил с интересами. Буду разбираться

Набросайте пожалуйста последовательность чтения и записи в USB.
aaarrr
Цитата(Zliva @ Oct 26 2009, 02:01) *
Набросайте пожалуйста последовательность чтения и записи в USB.

Чтения и записи чего, чем, куда, откуда?
Zliva
Цитата(aaarrr @ Oct 26 2009, 02:09) *
Чтения и записи чего, чем, куда, откуда?

Имелось в виду передача простого байта из контроллера в хост. Или я чтото не так спрашиваю?
aaarrr
Цитата(Zliva @ Oct 26 2009, 23:36) *
Имелось в виду передача простого байта из контроллера в хост.

В даташите весьма подробно по пунктам расписаны действия. Все не сильно отличается от работы с нулевой точкой.

Цитата(Zliva @ Oct 26 2009, 23:36) *
Или я чтото не так спрашиваю?

Очень туманно порой sad.gif
Zliva
Народ, что могут означать эти две ошибки? Куда я уже залез?
Error[Lp011]: section placement failed: unable to allocate space for sections/blocks with a total estimated minimum size of 0x9a98 bytes in <[mem:0x200100-mem:0x207fff]> (total uncommitted space 0x7f00)
Error[Lp011]: section placement failed: unable to place 0xffffffffffffffc7 initializer bytes in <[mem:0x102bcc-mem:0x11ffff]>
aaarrr
А что предшествовало появлению этих ошибок? Первая выглядит вполне адекватно, а вот вторая - 0xffffffffffffffc7 initializer bytes cranky.gif
Zliva
Цитата(aaarrr @ Oct 28 2009, 02:17) *
А что предшествовало появлению этих ошибок? Первая выглядит вполне адекватно, а вот вторая - 0xffffffffffffffc7 initializer bytes cranky.gif

Компилировал с дивайсом AT91SAM7Х256 – работало нормально. Поменял проц на 128 - ошибки. Поменял также - Linker configuration file на AT91SAM7S128_FLASH.icf, и умерла программа.
Zliva
Подскажите пожалуйста, почему IAR ругается на такую вот запись:
Код
typedef unsigned int  UINT;
aaarrr
Цитата(Zliva @ Nov 5 2009, 01:06) *
Подскажите пожалуйста, почему IAR ругается на такую вот запись

Как именно ругается? Приведите сообщение об ошибке полностью.

Ругаться не должен, если только UINT не объявлен уже где-то еще.
Zliva
Цитата(aaarrr @ Nov 5 2009, 02:16) *
Как именно ругается? Приведите сообщение об ошибке полностью.

Error[42]: Duplicate label:'typedef' D:\My doc\_DISER\=ARM_Project=\Proba2\at91lib\boards\at91sam7s-ek\board.h 15
Error[40]: Bad instruction D:\My doc\_DISER\=ARM_Project=\Proba2\at91lib\boards\at91sam7s-ek\board.h 15
aaarrr
Ну и зачем было скармливать сишный хидер ассемблеру?
Zliva
С инициализацией USB закончил. CyConsole видит мое устройство. Посылаю данные на устройство, и в дебугере вижу их.
Как передать на хост один байт данных?
aaarrr
Записать байт в FIFO и взвести TXPKTRDY.
Zliva
Не получаться передать данные на хост. Делаю так:
Код
AT91C_BASE_UDP->UDP_FDR[0x01] = 255;
AT91C_BASE_UDP->UDP_CSR[0x01] |= AT91C_UDP_TXPKTRDY;

И еще, анализируя полученные пакеты в процессе энумерации USB с помощью утилиты USBTrace, вижу, что дескриптор строки передается 2 раза, так должно быть?
aaarrr
Цитата(Zliva @ Nov 12 2009, 00:55) *
Делаю так

А хостом что делаете в это время?

Цитата(Zliva @ Nov 12 2009, 00:55) *
И еще, анализируя полученные пакеты в процессе энумерации USB с помощью утилиты USBTrace, вижу, что дескриптор строки передается 2 раза, так должно быть?

Все, или какой-то один?
Zliva
Цитата(aaarrr @ Nov 12 2009, 10:25) *
А хостом что делаете в это время?

Ничего не делаю. Жду пока не получу значения.
Цитата
Все, или какой-то один?

Дескриптор производителя - LNTU-2009 – 2 раза
Дескриптор продукта - VibroAnalyzer – 2 раза
aaarrr
Цитата(Zliva @ Nov 12 2009, 13:02) *
Ничего не делаю. Жду пока не получу значения.

Что значит ничего и как именно ждете? Если ничего не делать, то ничего и не получите.

Цитата(Zliva @ Nov 12 2009, 13:02) *
Дескриптор производителя - LNTU-2009 – 2 раза
Дескриптор продукта - VibroAnalyzer – 2 раза

По идее так быть не должно, но и "состав преступления" притянуть трудно.
Zliva
Цитата(aaarrr @ Nov 12 2009, 13:10) *
Что значит ничего и как именно ждете? Если ничего не делать, то ничего и не получите.

Что нужно делать? Читаю спецификацию, может я это упустил или не совсем внимательно читаю. Разве здесь не так как у СОМ- порте, инициализировал и пиши туда сюда?
Цитата
По идее так быть не должно, но и "состав преступления" притянуть трудно.

Поигрался немного с консолью (CYConsole ). Отправляю пакеты без проблем, но они тоже по два приходят! Странно. К примеру отправляю 0х01 count=10, получаю 0х01 count=10 два раза.
Zliva
М-да. Это не СОМ-порт. Все намного сложнее чем я думал.
Разобрался с транзакциями и передачей данных.
Буду лезть в Delphi (просто я его знаю немного лучше чем Си) и писать софт со стороны хоста. Может кто имеет заготовки для Delphi для работы с USB? Не хочется с нуля вникать. Пример если не жалко.
aaarrr
Цитата(Zliva @ Nov 13 2009, 01:13) *
Буду лезть в Delphi (просто я его знаю немного лучше чем Си) и писать софт со стороны хоста.

Не советую. Если уж хотите использовать борландовскую продукцию, то возьмите хотя бы билдер. Иначе вам придется городить свой аналог cyapi.lib, что не прибавит радости.

Да и программу для контроллера все равно ведь на C пишете.
Zliva
Здесь кое-что нашел. Не охота переходить на Си серьезно, хотя понимаю, без него – НИКУДА.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.