il-2 (08.02.2017 15:15 - 15:22, просмотров: 9895)
Про библиотеку STM32_USB-Host-Device_Lib_V2.2.0. Выступаю в своем амплуа: Делаю USB Host на STM32F105 для работы с флэшками. Собственно, сейчас нахожусь в процессе прикручивания исходников библиотеки к проекту. Как любой нормальный человек, который ВЫНУЖДЕННО наступает на кучу гуано, делаю это с зажмуренными глазами и зажатым носом :-) Но полностью зажмуриться не удалось :-)
Началось все достаточно невинно - я увидел, что пользовательские callback для получения ProductString, ManufacturerString и SerialString возвращают нуль-терминированную строку в ASCII. Из любопытства решил глянуть, как он это преобразует из UNICODE. Лучше бы я этого не делал!!! Привожу куски глючного кода и жирным - исправленный вариант. UPD - что-то выделение не работает
/* usbh_core.c */
uint8_t Local_Buffer[64];
...
if ( USBH_Get_StringDesc(pdev,
phost,
phost->device_prop.Dev_Desc.iManufacturer,
Local_Buffer ,
0xFF sizeof(Local_Buffer)) == USBH_OK) //<--- замена 0xFF на sizeof(Local_Buffer)
Дальше
/* usbh_stdreq.c */
USBH_Status USBH_Get_StringDesc(USB_OTG_CORE_HANDLE *pdev,
USBH_HOST *phost,
uint8_t string_index,
uint8_t *buff,
uint16_t length)
{
USBH_Status status;
if((status = USBH_GetDescriptor(pdev,
phost,
USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD,
USB_DESC_STRING | string_index,
pdev->host.Rx_Buffer,
length MAX_DATA_LENGTH)) == USBH_OK) //<--- Замена length на MAX_DATA_LENGTH
{
/* Commands successfully sent and Response Received */
USBH_ParseStringDesc(pdev->host.Rx_Buffer,buff, length);
}
return status;
}
Дальше вообще бред:
/* usbh_stdreq.c */
static void USBH_ParseStringDesc (uint8_t* psrc,
uint8_t* pdest,
uint16_t length)
{
uint16_t strlength;
uint16_t idx;
/* The UNICODE string descriptor is not NULL-terminated. The string length is
computed by subtracting two from the value of the first byte of the descriptor.
*/
/* Check which is lower size, the Size of string or the length of bytes read
from the device */
if ( psrc[1] == USB_DESC_TYPE_STRING)
{ /* Make sure the Descriptor is String Type */
/* psrc[0] contains Size of Descriptor, subtract 2 to get the length of string */
strlength = ( ( (psrc[0]-2) <= length) ? (psrc[0]-2) :length); //<--- Это убирается
strlength = ( ( (psrc[0]-2) < length) ? (psrc[0]-2) : (length-1)); //<--- Это добавляется
strlength *= 2; //<--- Это добавляется
psrc += 2; /* Adjust the offset ignoring the String Len and Descriptor type */
for (idx = 0; idx < strlength; idx+=2 )
{/* Copy Only the string and ignore the UNICODE ID, hence add the src */
*pdest = psrc[idx];
pdest++;
}
*pdest = 0; /* mark end of string */
}
}
И это только то, что я нашел случайно и с первого раза!!! Писец короче...