Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с радиомышкой в МХ6
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
mantech
Приветствую.
Всю башку сломал по поводу этих композитных устройств, будь они не ладны!
Вообщем суть вопроса такая - есть обычная проводная мышь, у которой 1 интерфейс-дескриптор, все работает норм, а есть радио, у которой их 2, причем первый, с которым работает моя прога - клавиатура, а мышь - следующий.

В драйвере усб этого камня, есть список, в котором считывается конфиг. дескр., затем интерфейс 1, хид1, контр. точка1, затем интерфейс 2, хид2, контр. точка2, и тд., если есть еще. Вопрос, как заставить прогу поллить не 1, а второй интерфейс? В драйвере от фрискейла только магические цифры...Может кто в курсе?? Хотя, о чем я спрашиваю - в тренде же линукс-онли rolleyes.gif
prottoss
Цитата(mantech @ Aug 11 2015, 20:15) *
В драйвере усб этого камня, есть список, в котором считывается конфиг. дескр., затем интерфейс 1, хид1, контр. точка1, затем интерфейс 2, хид2, контр. точка2, и тд., если есть еще. Вопрос, как заставить прогу поллить не 1, а второй интерфейс? В драйвере от фрискейла только магические цифры...Может кто в курсе?? Хотя, о чем я спрашиваю - в тренде же линукс-онли rolleyes.gif
Если Вы про Win32 спрашиваете, то Вам нужно:
1. Провести перечисление USB устройств с целью поиска искомого устройства с помощью функций Windows Setup API
2. Если устройтсво имеет несколько интерфейсов то выбрать нужный.
3. Работать с помощью Create/Read/Write File
mantech
Цитата(prottoss @ Aug 11 2015, 20:01) *
Если Вы про Win32 спрашиваете, то Вам нужно:


Еслиб про винду, так там уже давно все понятно, нет, это контроллер кортекс А9
mantech
Цитата(mantech @ Aug 11 2015, 20:14) *
Еслиб про винду, так там уже давно все понятно, нет, это контроллер кортекс А9

Вообщем, вот пример запроса на задание конфигурации:

usbhSetupCommand[0] = 0x00000900 | ((0x7F & config_value) <<16);
usbhSetupCommand[1] = 0x00000000;

usb_qtd1 = usbh_qtd_init(0x8, 0, SETUP_PID, usbhSetupCommand);
usb_qtd2 = usbh_qtd_init(0x0, 1, IN_PID, 0);

Тут идет передача от хоста к уст-ву, приема нет, вопрос, что за магические цифры?

То, что понял - 0x00000900 - от мл к ст...00-запрос SET, 09-Set Config, остальное - хз.
Второе - 0x00000000 - первые 2 байта - хз, 3й- длина ответа уст-ва(0) - нет ответа, 4й тоже непонятно что...

Может кто разбирался с этими запросами, у Агурова все мутно очень wacko.gif
aaarrr
Цитата(mantech @ Aug 12 2015, 11:56) *
Тут идет передача от хоста к уст-ву, приема нет, вопрос, что за магические цифры?

Обычный запрос SET_CONFIGURATION:
mRequestType = 00000000B
bRequest = SET_CONFIGURATION (9)
wValue = config_value
wIndex = Zero
wLength = Zero
Data = None
mantech
Цитата(aaarrr @ Aug 12 2015, 12:09) *
Обычный запрос SET_CONFIGURATION:


Ну это я понимаю, что обычный, вопрос в том, где можео узнать, что за поля в запросе и что они означают, без воды и мутностей?
ЗЫ. И второе, если вы в курсе, как заставить уст-во работать не с 1, а вторым интерфейсом. Я догадываюсь, что есть запрос на переключение или добавление считывания данных для моей ситуации, но пока знаний не хватает...
aaarrr
Цитата(mantech @ Aug 12 2015, 13:37) *
Ну это я понимаю, что обычный, вопрос в том, где можео узнать, что за поля в запросе и что они означают, без воды и мутностей?

В спецификации USB.

Цитата(mantech @ Aug 12 2015, 13:37) *
ЗЫ. И второе, если вы в курсе, как заставить уст-во работать не с 1, а вторым интерфейсом. Я догадываюсь, что есть запрос на переключение или добавление считывания данных для моей ситуации, но пока знаний не хватает...

Вам просто нужно работать с конечными точками второго интерфейса, каких-либо дополнительных действий не требуется.
Golikov A.
Цитата
Вам просто нужно работать с конечными точками второго интерфейса, каких-либо дополнительных действий не требуется.

как так не требуется? А команда Set Configuration к чему? в которой wValue как раз выбирает конфигурацию? и команда Set Interface 1B wValue - Alternate setting, wIndex - Interface

aaarrr
Цитата(Golikov A. @ Aug 12 2015, 14:00) *
как так не требуется? А команда Set Configuration к чему? в которой wValue как раз выбирает конфигурацию? и команда Set Interface 1B wValue - Alternate setting, wIndex - Interface

И? Сколько у рассматриваемой мышки конфигураций? А есть ли alternate settings у интерфейсов?
Golikov A.
А мне то откуда знатьsm.gif беспроводная мышь, которая еще в придачу и клавиатура... всяко бывает, это автору виднее, мы же дескрипторы то не читали...
kovigor
Цитата(Golikov A. @ Aug 12 2015, 14:45) *
А мне то откуда знатьsm.gif беспроводная мышь, которая еще в придачу и клавиатура... всяко бывает, это автору виднее, мы же дескрипторы то не читали...

Почти наверняка это самое обычное устройство с одной конфигурацией и двумя интерфейсами ...
mantech
Цитата(kovigor @ Aug 12 2015, 14:49) *
Почти наверняка это самое обычное устройство с одной конфигурацией и двумя интерфейсами ...


Вот это что, да обычная радиомышка defender biggrin.gif

CODE
Device Descriptor 2.4G Keyboard Mouse
Offset Field Size Value Description
0 bLength 1 12h
1 bDescriptorType 1 01h Device
2 bcdUSB 2 0110h USB Spec 1.1
4 bDeviceClass 1 00h Class info in Ifc Descriptors
5 bDeviceSubClass 1 00h
6 bDeviceProtocol 1 00h
7 bMaxPacketSize0 1 08h 8 bytes
8 idVendor 2 062Ah Creative Labs
10 idProduct 2 4127h
12 bcdDevice 2 0210h 2.10
14 iManufacturer 1 01h "MOSART Semi."
15 iProduct 1 02h "2.4G Keyboard Mouse"
16 iSerialNumber 1 00h
17 bNumConfigurations 1 01h

Configuration Descriptor 1 Bus Powered, 100 mA
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 02h Configuration
2 wTotalLength 2 003Bh
4 bNumInterfaces 1 02h
5 bConfigurationValue 1 01h
6 iConfiguration 1 00h
7 bmAttributes 1 A0h Bus Powered, Remote Wakeup
4..0: Reserved ...00000
5: Remote Wakeup ..1..... Yes
6: Self Powered .0...... No, Bus Powered
7: Reserved (set to one)
(bus-powered for 1.0) 1.......
8 bMaxPower 1 32h 100 mA

Interface Descriptor 0/0 HID, 1 Endpoint
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 04h Interface
2 bInterfaceNumber 1 00h
3 bAlternateSetting 1 00h
4 bNumEndpoints 1 01h
5 bInterfaceClass 1 03h HID
6 bInterfaceSubClass 1 01h Boot Interface
7 bInterfaceProtocol 1 01h Keyboard
8 iInterface 1 00h

HID Descriptor
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 21h HID
2 bcdHID 2 0110h 1.10
4 bCountryCode 1 00h
5 bNumDescriptors 1 01h
6 bDescriptorType 1 22h Report
7 wDescriptorLength 2 0041h 65 bytes

Endpoint Descriptor 81 1 In, Interrupt, 10 ms
Offset Field Size Value Description
0 bLength 1 07h
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 81h 1 In
3 bmAttributes 1 03h Interrupt
1..0: Transfer Type ......11 Interrupt
7..2: Reserved 000000..
4 wMaxPacketSize 2 0008h 8 bytes
6 bInterval 1 0Ah 10 ms

Interface Descriptor 1/0 HID, 1 Endpoint
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 04h Interface
2 bInterfaceNumber 1 01h
3 bAlternateSetting 1 00h
4 bNumEndpoints 1 01h
5 bInterfaceClass 1 03h HID
6 bInterfaceSubClass 1 01h Boot Interface
7 bInterfaceProtocol 1 02h Mouse
8 iInterface 1 00h

HID Descriptor
Offset Field Size Value Description
0 bLength 1 09h
1 bDescriptorType 1 21h HID
2 bcdHID 2 0110h 1.10
4 bCountryCode 1 00h
5 bNumDescriptors 1 01h
6 bDescriptorType 1 22h Report
7 wDescriptorLength 2 00A8h 168 bytes

Endpoint Descriptor 82 2 In, Interrupt, 4 ms
Offset Field Size Value Description
0 bLength 1 07h
1 bDescriptorType 1 05h Endpoint
2 bEndpointAddress 1 82h 2 In
3 bmAttributes 1 03h Interrupt
1..0: Transfer Type ......11 Interrupt
7..2: Reserved 000000..
4 wMaxPacketSize 2 0007h 7 bytes
6 bInterval 1 04h 4 ms

Interface 0 HID Report Descriptor Keyboard
Item Tag (Value) Raw Data
Usage Page (Generic Desktop) 05 01
Usage (Keyboard) 09 06
Collection (Application) A1 01
Usage Page (Keyboard/Keypad) 05 07
Usage Minimum (Keyboard Left Control) 19 E0
Usage Maximum (Keyboard Right GUI) 29 E7
Logical Minimum (0) 15 00
Logical Maximum (1) 25 01
Report Size (1) 75 01
Report Count (8) 95 08
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
Report Size (8) 75 08
Report Count (1) 95 01
Input (Cnst,Ary,Abs) 81 01
Report Size (1) 75 01
Report Count (3) 95 03
Usage Page (LEDs) 05 08
Usage Minimum (Num Lock) 19 01
Usage Maximum (Scroll Lock) 29 03
Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02
Report Size (1) 75 01
Report Count (5) 95 05
Output (Cnst,Ary,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 01
Report Size (8) 75 08
Report Count (6) 95 06
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Usage Page (Keyboard/Keypad) 05 07
Usage Minimum (Undefined) 19 00
Usage Maximum 2A FF 00
Input (Data,Ary,Abs) 81 00
End Collection C0

Interface 1 HID Report Descriptor Mouse
Item Tag (Value) Raw Data
Usage Page (Generic Desktop) 05 01
Usage (Mouse) 09 02
Collection (Application) A1 01
Report ID (3) 85 03
Usage (Pointer) 09 01
Collection (Physical) A1 00
Usage Page (Button) 05 09
Usage Minimum (Button 1) 19 01
Usage Maximum (Button 5) 29 05
Logical Minimum (0) 15 00
Logical Maximum (1) 25 01
Report Size (1) 75 01
Report Count (5) 95 05
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
Report Size (3) 75 03
Report Count (1) 95 01
Input (Cnst,Ary,Abs) 81 01
Usage Page (Generic Desktop) 05 01
Usage (X) 09 30
Usage (Y) 09 31
Logical Minimum (-2047) 16 01 F8
Logical Maximum (2047) 26 FF 07
Report Size (12) 75 0C
Report Count (2) 95 02
Input (Data,Var,Rel,NWrp,Lin,Pref,NNul,Bit) 81 06
Usage (Wheel) 09 38
Logical Minimum (-127) 15 81
Logical Maximum (127) 25 7F
Report Size (8) 75 08
Report Count (1) 95 01
Input (Data,Var,Rel,NWrp,Lin,Pref,NNul,Bit) 81 06
End Collection C0
Usage Page (Consumer Devices) 05 0C
Logical Minimum (-127) 15 81
Logical Maximum (127) 25 7F
Report Size (8) 75 08
Report Count (1) 95 01
Usage (AC Pan) 0A 38 02
Input (Data,Var,Rel,NWrp,Lin,Pref,NNul,Bit) 81 06
End Collection C0
Usage Page (Consumer Devices) 05 0C
Usage (Consumer Control) 09 01
Collection (Application) A1 01
Report ID (1) 85 01
Usage Minimum (Undefined) 19 00
Usage Maximum 2A 80 03
Logical Minimum (0) 15 00
Logical Maximum (896) 26 80 03
Report Size (16) 75 10
Report Count (1) 95 01
Input (Data,Ary,Abs) 81 00
End Collection C0
Usage Page (Generic Desktop) 05 01
Usage (System Control) 09 80
Collection (Application) A1 01
Report ID (2) 85 02
Usage Minimum (System Power Down) 19 81
Usage Maximum (System Wake Up) 29 83
Logical Maximum (1) 25 01
Report Size (1) 75 01
Report Count (3) 95 03
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
Report Count (5) 95 05
Input (Cnst,Ary,Abs) 81 01
End Collection C0
Usage Page 06 F2 F1
Usage 0A F2 F1
Collection (Application) A1 01
Report ID (5) 85 05
Usage 09 00
Report Count (6) 95 06
Report Size (8) 75 08
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02
Usage 09 00
Report Count (5) 95 05
Report Size (8) 75 08
Logical Minimum (0) 15 00
Logical Maximum (255) 26 FF 00
Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02
End Collection C0


Цитата(mantech @ Aug 12 2015, 14:58) *
1


Как видите, Interface Descriptor 0 - это клавиатура, с чем и пытается работать моя прога безуспешно, а
Interface Descriptor 1 - это мышь, вот к ней надо "достучаться"...

Цитата(Golikov A. @ Aug 12 2015, 14:00) *
как так не требуется? А команда Set Configuration к чему? в которой wValue как раз выбирает конфигурацию? и команда Set Interface 1B wValue - Alternate setting, wIndex - Interface


Ну вот это я и хочу узнать, например - wValue - это что за поле, в каком месте из 8 байт запроса оно распологается? И остальные..
kovigor
Цитата(mantech @ Aug 12 2015, 15:03) *
Ну вот это я и хочу узнать, например - wValue - это что за поле, в каком месте из 8 байт запроса оно распологается? И остальные..

Книжку Гука посмотрите, там все это расписано:
http://www.twirpx.com/file/97618/
Golikov A.
Цитата
Ну вот это я и хочу узнать, например - wValue - это что за поле, в каком месте из 8 байт запроса оно распологается? И остальные..

ну так это не к процессору же... Это к стандарту USB надо обращаться, посмотрите где то он тут был... Там расписаны и команды и структуры и какое поле чего значит.
Оно для того и было сделано USB, чтобы от реализаций не зависеть.
mantech
Цитата(Golikov A. @ Aug 12 2015, 15:12) *
ну так это не к процессору же... Это к стандарту USB надо обращаться,


Это я понимаю, просто вдруг у кого есть кусочек кода для инициализации 2х или более интерфейсных девайсов...
aaarrr
Цитата(mantech @ Aug 12 2015, 15:25) *
Это я понимаю, просто вдруг у кого есть кусочек кода для инициализации 2х или более интерфейсных девайсов...

Не нужно в вашем случае никакой специфической инициализации.
mantech
Цитата(aaarrr @ Aug 12 2015, 15:28) *
Не нужно в вашем случае никакой специфической инициализации.


У вас есть какой-нибудь пример инициализации?

Вот, что у меня-

CODE
int emuerateDevice(usb_module_t *port, usbhQueueHead_t *usb_qh_ep0, usbDeviceDescriptor_t *device_descriptor,uint8_t *config_descriptor,uint8_t *interface_descriptor,
uint8_t *hid_descriptor,uint8_t *ep_descriptor,uint8_t *report_descriptor )
{
usbh_bus_reset(port);
hal_delay_us(500);
//printf("Device reset.\n");
/*!
* Read the first 8 bytes of the device descriptor as we do not yet know the max packet size\n
* Our new device has address 0 at this time.
*/

usbh_get_dev_desc(port, usb_qh_ep0, device_descriptor);
/*!
* Update the maximum packet size in the queue head
*/

// Stop schedule to avoid contention with controller
usbh_disable_asynchronous_schedule(port);
// printf("Device 2\n");

/* Set the max packet size in the QH to the max packet size in the device descriptor */
usb_qh_ep0->endpointCharacteristics = ((usb_qh_ep0->endpointCharacteristics & ~USB_QH_EP_CHAR_MAX_PACKET(0x7FF))
| USB_QH_EP_CHAR_MAX_PACKET(device_descriptor->bMaxPacketSize));


usb_qh_ep0->endpointCharacteristics &= ~(0x7FF << 16); // clear max packet size
usb_qh_ep0->endpointCharacteristics |= ((uint32_t)(device_descriptor->bMaxPacketSize)) << 16;

// Restart asynchronous schedule
usbh_enable_asynchronous_schedule(port);

/* Send set address command */
usbh_set_device_address(port, usb_qh_ep0, DEVICE_ADDRESS);

/* Read in the full device descriptor */
usbh_get_dev_desc(port, usb_qh_ep0, device_descriptor);

/* Read in the configuration descriptor */
usbh_get_config_desc(port, usb_qh_ep0, config_descriptor);
/* Read in the interface, HID, and endpoint descriptors */
usbh_get_interface_desc(port, usb_qh_ep0, interface_descriptor,hid_descriptor,ep_descriptor);

/* Test the interface descriptor parameters to check if the attached
* device is in the HID class and that it is also a mouse.
*/

/*
if( (interface_descriptor[5] != 0x3) | (interface_descriptor[7] != 0x2))
{
//printf("Device enumerated.\n");
return 0; // not a mouse; return
}
*/
/* Set the configuration for the device */
/* We already know the device is a USB mouse, so there is only one possible
* configuration for the device.
*/

// Эт строка для смены интерфейса
usbh_set_interface_desc(port, usb_qh_ep0, DEVICE_ADDRESS);
usbh_set_configuration(port, usb_qh_ep0, CONFIG_VALUE);
usbh_get_report_desc(port, usb_qh_ep0, report_descriptor);
return 1;
}



//сама процедура, по логике интерфейс должен измениться на 1 с 0го, но по факту ничего не работает


void usbh_set_interface_desc(usb_module_t *port, usbhQueueHead_t *usb_qh_ep0, uint32_t device_address)
{
usbhTransferDescriptor_t * usb_qtd1, *usb_qtd2;
uint32_t temp;
//uint32_t usbhSetupCommand[2];
uint32_t core = (uint32_t)port->controllerID;

usbhSetupCommand[0] = 0x00011100;
usbhSetupCommand[1] = 0x00000001;

usb_qtd1 = usbh_qtd_init(0x8, 0, SETUP_PID, usbhSetupCommand);
usb_qtd2 = usbh_qtd_init(0x0, 1, IN_PID, 0);

usb_qtd1->nextQtd = (uint32_t)usb_qtd2;
TmpUSB_wait=0;
while(usb_qh_ep0->qtdToken & 0x80) /* wait for active bit to clear */
{if (TmpUSB_wait++>100000) break;}
/* Point the QH to the linked list of qTDs */
usb_qh_ep0->nextQtd = (uint32_t)usb_qtd1;

/* Wait for transaction to complete and clear interrpt flag */
#ifdef USB_USE_INT
while (usb_utmi_int_flag == 0);
usb_utmi_int_flag = 0;
#else
TmpUSB_wait=0;
while(!(HW_USBC_USBSTS_RD(core) & BM_USBC_UH1_USBSTS_UI))
{if (TmpUSB_wait++>100000) break;}
HW_USBC_USBSTS_WR(core, HW_USBC_USBSTS_RD(core) | BM_USBC_UH1_USBSTS_UI);
#endif

/* Wait until the active bit is cleared in the last qtd. */
TmpUSB_wait=0;
while(usb_qtd2->qtdToken & 0x80)
{if (TmpUSB_wait++>100000) break;}

/* Check for errors */
if(HW_USBC_USBSTS_RD(core) & BM_USBC_UH1_USBSTS_UEI)
{
printf("ERROR!!!\n");
temp = *(uint32_t *)((HW_USBC_ASYNCLISTADDR_RD(core)) + 0x18);
printf("qTD status = 0x%08x\n",temp);
}
else
{
printf("Set configuration command complete!!\n\n");
#ifdef DEBUG_PRINT
//printf("USBSTS = 0x%08x\n",(HW_USBC_USBSTS_RD(core)));
#endif
}
/* Clear the USB error bit */
HW_USBC_USBSTS_WR(core, HW_USBC_USBSTS_RD(core) | BM_USBC_UH1_USBSTS_UEI);

}





aaarrr
Цитата(mantech @ Aug 12 2015, 16:46) *
Вот, что у меня-

Этим запросом вы пытаетесь выбрать alternate setting 1 для интерфейса 1. У интерфейса 1 вашей мышки НЕТ alternate setting 1.
И код запроса должен быть не 0x11 (такого нет), а 0x0B.

Для работы со вторым интерфейсом нужно всего лишь брать данные с EP 2 IN (82h) вместо 1 IN (81h). Ничего инициализировать НЕ НУЖНО.
mantech
Цитата(aaarrr @ Aug 12 2015, 17:20) *
Для работы со вторым интерфейсом нужно всего лишь брать данные с EP 2 IN 1h). Ничего инициализировать НЕ НУЖНО.


Ещеб знать, как ее туда впихнуть...

CODE
usb_port_speed = usb_get_port_speed(usbhModule);


/*!
* Create a QueueHead to use for EndPoint0. This single QH will be the\n
* asynchronous schedule during enumeration.
*/
usbhMouse->usb_qh_ep0 = NULL;
switch (usb_port_speed)
{
case usbSpeedFull:
usbhMouse->usb_qh_ep0 = usbh_qh_init(0x40, 1, EPS_FULL, 0, 0, 0);
// printf("Device connected at FULL speed\n");
break;
case usbSpeedLow:
usbhMouse->usb_qh_ep0 = usbh_qh_init(0x8, 1, EPS_LOW, 0, 0, 0);
// printf("Device connected at LOW speed\n");
break;
case usbSpeedHigh:
usbhMouse->usb_qh_ep0 = usbh_qh_init(0x40, 1, EPS_HIGH, 0, 0, 0);
// printf("Device connected at HIGH speed\n");
break;
default :
break; //error! restart host...
}

if (usbhMouse->usb_qh_ep0==NULL) {usbhMouse->hid_status=0;return;}


// Put this queue head on the Asynchronous Schedule.\n
// This is our first queue head on the AS so we point the controller to this QH\n
//Any further queue heads will be linked to this HQ.


HW_USBC_ASYNCLISTADDR_WR(usbhMouse->usb_core, (uint32_t)usbhMouse->usb_qh_ep0);


//! Enable the asynchronous schedule
usbh_enable_asynchronous_schedule(usbhModule);


//! Enumerate the attached device

// printf("\n enumeration...\n");

if (emuerateDevice(usbhModule, usbhMouse->usb_qh_ep0, usbhMouse->device_descriptor, usbhMouse->config_descriptor,
usbhMouse->interface_descriptor,usbhMouse->hid_descriptor, usbhMouse->ep_descriptor, usbhMouse->report_descriptor )) ;
// printf("USB mouse enumerated!!\n");
else
{
//printf("\nDevice is not a mouse. No further processing is performed\n");
usbhMouse->hid_status=2; //device unknown, detach required!
return;

}



// printf("Move mouse, and the mouse reports will be printed on the terminal.\n Press left button to exit.\n");

//! if we have a mouse connected.
//! Initialize the periodic schedule for the interrupt endpoint
if (usbhMouse->hid_num==0)
{
xmemset(frame_list1, 0, sizeof(frame_list1));
periodic_base = usbh_periodic_schedule_init(usbhModule, FRAME_LIST_SIZE, (&frame_list1[0]));
}
else
{
xmemset(frame_list2, 0, sizeof(frame_list2));
periodic_base = usbh_periodic_schedule_init(usbhModule, FRAME_LIST_SIZE, (&frame_list2[0]));
}

//! Create a queue head for endpoint 1

usbhMouse->usb_qh_ep1 = usbh_qh_init(0x8,0, EPS_LOW,1,DEVICE_ADDRESS,1);

//! - Invalidate the QH horizontal pointer since the init function will point the QH back to itself.
usbhMouse->usb_qh_ep1->queueHeadLinkPointer |= USB_QH_LINK_PTR_T;

/* This version of the code just polls the mouse once per iteration of
* the frame list. The polling rate can be adjusted changing the size
* of the frame list and/or pointing more of the frame list entries
* to the interrupt QH.
*/

//! - Put the queue head on the periodic schedule
*(uint32_t *)(periodic_base) = (uint32_t)usbhMouse->usb_qh_ep1 + 0x002;

/*
* Initialize the amount of data to receive. In this case we will
* receive 20 packets per loop. ep_desc[04] inidicates the size of
* each packet. So transfer_size = 20 * ep_desc[04].
*/
usbhMouse->int_packet_size = usbhMouse->ep_descriptor[04];
usbhMouse->int_transfer_size = 20 * usbhMouse->int_packet_size;

//! Create a qTD to transfer 20 packets worth of data
usbhMouse->int_qtd = usbh_qtd_init(usbhMouse->int_transfer_size, 1, IN_PID, (uint32_t*) usbhMouse->usbhMouseData);

//! Activate the queue head to start polling the device
/*
* This while(1) loop will allow for continuously receiving mouse data. Some
* packets could be lost due to the time needed to reinitialize the qTD for the
* next batch of transfers. So a more correct way to do this would be to create
* multiple qTDs and rotate them for each iteration of the loop. For a mouse
* application some data loss is acceptable, so only one qTD is used.
*/
usbhMouse->usb_qh_ep1->nextQtd = (uint32_t) usbhMouse->int_qtd;
usbhMouse->bytes_received = 0;
usbhMouse->hid_status=3; //mouse installed!
}
else return; //device not attach
}
if (usbhMouse->hid_status==2)
{
//printf("\nDevice is not a mouse. No further processing is performed\n");
if (HW_USBC_PORTSC1_RD(usbhMouse->usb_core) & BM_USBC_UH1_PORTSC1_CCS);
else usbhMouse->hid_status=0;
}
aaarrr
Цитата(mantech @ Aug 12 2015, 18:04) *
Ещеб знать, как ее туда впихнуть...

Начните с перекапывания usbh_get_interface_desc() - он, я так подозреваю, возвращает первый попавшийся дескриптор интерфейса, а нужно чтобы возвращал правильный.
mantech
Цитата(aaarrr @ Aug 12 2015, 18:26) *
Начните с перекапывания usbh_get_interface_desc() - он, я так подозреваю, возвращает первый попавшийся дескриптор интерфейса, а нужно чтобы возвращал правильный.


Он получает сразу все, т.е. дескриптора конфигурации, там 1 конф, затем интерфейс 0, затем хид0, и кон.точку 0.
Далее сразу интерфейс 1, затем хид1, и кон.точку 1.

В поля пишется параметры инт 0. Но могу добавить смещение и будут писаться для инт 1

ЗЫ. Похоже все эти параметры нафиг не нужны для работы системы, кроме дескр кон.точки[4], берется размер пакета.

Так что это где-то в настройках поллинга кон.точки, только без доков тут не разобраться...
aaarrr
Цитата(mantech @ Aug 12 2015, 18:40) *
ЗЫ. Похоже все эти параметры нафиг не нужны для работы системы, кроме дескр кон.точки[4], берется размер пакета.

Адрес точки тоже должен браться из дескриптора, поищите. Вряд ли его стали бы жестко устанавливать, хотя и такое можно представить. Но в любом случае какой-то адрес должен фигурировать при транзакции.
mantech
Цитата(aaarrr @ Aug 12 2015, 20:12) *
Адрес точки тоже должен браться из дескриптора, поищите. Вряд ли его стали бы жестко устанавливать, хотя и такое можно представить. Но в любом случае какой-то адрес должен фигурировать при транзакции.


Нет, не вижу вообще связи ничего, кроме длины репорта.
ЗЫ. После анализа этого быдлокода, я уже все могу представить wacko.gif
Вообще, по-уму, где должна быть привязка кон. точек к системе опроса порта?
aaarrr
Цитата(mantech @ Aug 12 2015, 21:46) *
Вообще, по-уму, где должна быть привязка кон. точек к системе опроса порта?

По-уму, код должен был бы распарсить интерфейсы, выбрать нужный (мышь), и из него взять номер точки.
mantech
Цитата(aaarrr @ Aug 12 2015, 21:58) *
По-уму, код должен был бы распарсить интерфейсы, выбрать нужный (мышь), и из него взять номер точки.


Ну хорошо, я распарсил его своим кодом, теперь в дескрипторах находятся только данные по интерфейсу мышки, я знаю его точку, и что дальше делать?
ее же нужно поставить на опрос контроллера, а там полный мрак со всякими листами трансфер дескрипторов...

HW_USBC_ASYNCLISTADDR_WR(usbhMouse->usb_core, (uint32_t)usbhMouse->usb_qh_ep0); - здесь, я так понял,
задается адрес КТ0 - основной в устройстве.

Вот здесь -
usbhMouse->usb_qh_ep1 = usbh_qh_init(0x8,0, EPS_LOW,1,DEVICE_ADDRESS,1);

//! - Invalidate the QH horizontal pointer since the init function will point the QH back to itself.
usbhMouse->usb_qh_ep1->queueHeadLinkPointer |= USB_QH_LINK_PTR_T;

в параметрах нашел, что EPS_LOW,1,DEVICE_ADDRESS, "1" - это номер КТ Пробовал ставить 2 - не помогло.
что вот это такое - usb_qh_ep1->queueHeadLinkPointer |= USB_QH_LINK_PTR_T; - без понятия вообще, в доках ет ничего.

mantech
Закрываю тему, похоже никто тут с этими контроллерами незнаком, перебъемся с проводными мышами.

Интересно только, вибридовский контроллер с мх6 совместим или как всегда - нет?
Golikov A.
сильно зависит от того на чем там хост сделан. LPC1768, например имеет стандартный OHCI и для того чтобы на нем что-то запустить, надо взять доку на OHCI и в регистры правильно писать, а он все остальное сам сделает. А что у вас там за контроллер хоста стоит фиг знает. Может такое быть что он вообще программный и тогда вам нужен хороший, правильный "стэк" который наверняка в линуксе для этих процов предложен. Может его оттуда можно выдрать, и тогда работа с мышой пойдет лучше...
mantech
Цитата(Golikov A. @ Aug 13 2015, 13:17) *
Может такое быть что он вообще программный и тогда вам нужен хороший, правильный "стэк" который наверняка в линуксе для этих процов предложен. Может его оттуда можно выдрать, и тогда работа с мышой пойдет лучше...


Развеселили точно! biggrin.gif

Пробовали из линукса что-то подобное "вырезать"??? Уж лучще я поищу переходники какие-то, думаю проще получится laughing.gif

А контроллер там, да х.з. какой, не программный, но и не стандартный похоже.
mantech
Перенес тему в - http://electronix.ru/forum/index.php?showtopic=129848

Если кому есть, что сказать - пишите rolleyes.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.