mantech 53 16 августа, 2015 Опубликовано 16 августа, 2015 (изменено) · Жалоба Приветствую. Совсем запарился с этим чудом, по-началу задача была сделать так, чтобы заставить работать радиомышку с двумя и более интерфейсами, с одним драйвер работает, но в радиомышах 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: Есть подозрение на это - 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. Хотя фиг знает... Изменено 16 августа, 2015 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться