il-2 (30.12.2014 12:07, просмотров: 9225)
STM32_USB-FS-Device_Lib_V4.0.0 - я в ахуе!!!! За почти месяц бодания с Сабжем я сделал там кучку мелких допилов. Но вчера я просто ах$ел. Оказывается, эти (БИ-БИ) умудрились перепутать местами ст. и мл. байты переменных, в которых хранятся параметры Setup-пакета wValue, wIndex и wLength!!!
// usb_core.h
typedef union
{
uint16_t w;
struct BW
{
uint8_t bb1; //Старший байт!!!
uint8_t bb0; //Младший байт!!!
}
bw;
} uint16_t_uint8_t;
Далее при заполнении таких переменных они специально свапают местами байты:
Device_Info.USBwValues.w = ByteSwap(*pBuf.w++); /* wValue */
pBuf.w += offset;
Device_Info.USBwIndexs.w = ByteSwap(*pBuf.w++); /* wIndex */
pBuf.w += offset;
Device_Info.USBwLengths.w = *pBuf.w; /* wLength - не свапается!!! */
В результате с побайтовым доступом к wValue и wIndex все нормально, а вот при работе с 2-байтовыми величинами полная Жо, т.к. байты перепутаны. С переменной wLength ситуация обратная - значение переменной доступно нормально, а доступ к байтам перепутан!!!.
Я проанализировал код библиотеки и приложенных к ней примеров реализации различных USB-классов и выяснил:
1. Доступ к переменным wValue и wIndex используется побайтовый, поэтому все работает.
2. Имеется несколько мест, где доступ к wValue и wIndex - 2-байтовый, но при этом значения переменных используются для сравнения с 0, поэтому все работает.
3. Доступ к переменной wLength побайтно не используется, поэтому все работает.
Вывод - ВСЕ У НИХ РАБОТАЕТ, ИНДУСЫ ГЕНИИ.
Вот только у меня почему-то проблемы из-за их кривой библиотеки.