Приветствую.

Совсем запарился с этим чудом, по-началу задача была сделать так, чтобы заставить работать радиомышку с двумя и более интерфейсами, с одним драйвер работает, но в радиомышах 1й интерфейс - клавиатура, а мышь - второй.

На сколько мне удалось разобраться в этом:

1) нужно создать основной список указателей хоста:

periodic_base = usbh_periodic_schedule_init(usbhModule, FRAME_LIST_SIZE, (&frame_list1[0]));

2) нужно создать запись конечной точки 1

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

сама процедура - *:
* @param max_packet maximum packet length for the endpoint
* @param head used to mark the QH as the first in the linked list (not used for interrupt QHs)
* @param eps end point speed
* @param epnum end point number
* @param dev_addr device address
* @param smask interrupt schedule mask (only used for periodic schedule QHs)
*/

usbhQueueHead_t *usbh_qh_init(uint32_t max_packet, uint32_t head, uint32_t eps, uint32_t epnum,
uint32_t dev_addr, uint32_t smask)





3) прописываем указатель на нее в основном списке

*(uint32_t *)(periodic_base) = (uint32_t)usbhMouse->usb_qh_ep1 + 0x002;

Вопрос - что означает + 0x002; - так и не понял

4) Задаем размер читаемых данных, из того, что прочитано при нумерации мыши

usbhMouse->int_packet_size = usbhMouse->ep_descriptor[04];

5) Задаем размер транзакции (почему *20 - х.з.)

usbhMouse->int_transfer_size = 20 * usbhMouse->int_packet_size;

6) Создаем транзакцию

usbhMouse->int_qtd = usbh_qtd_init(usbhMouse->int_transfer_size, 1, IN_PID, (uint32_t*) usbhMouse->usbhMouseData);

* @param transferSize number of bytes to be transferred
* @param ioc interrupt on complete flag
* @param pid PID code for the transfer
* @param bufferPointer pointer to the data buffer
*/
usbhTransferDescriptor_t *usbh_qtd_init(uint32_t transferSize, uint32_t ioc, uint32_t pid,
uint32_t * bufferPointer)




7) Т.к. используется только один дескриптор, зацикливаем его на себя

usbhMouse->usb_qh_ep1->nextQtd = (uint32_t) usbhMouse->int_qtd;

Все это работает для конечной точки 1, как заставить работать с к.т2 или с двумя одновременно??

Пробовал задать все тоже самое для к.т.2 но не работает, видать есть подводные камни, может кто поможет? laughing.gif

Есть подозрение на это -
If the queue head is for an interrupt endpoint (for example, non-zero S-mask field), then
the FRINDEX[2:0] field must identify a bit in the S-mask field that has one in it.
For example, an S-mask value of 00100000b would evaluate to true only when
FRINDEX[2:0] is equal to 101b. If this condition is met then the host controller considers
this queue head for a transaction.

Хотя фиг знает...