Перейти к содержанию
    

Работа с композитным устройством

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

 

Совсем запарился с этим чудом, по-началу задача была сделать так, чтобы заставить работать радиомышку с двумя и более интерфейсами, с одним драйвер работает, но в радиомышах 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.

 

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

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...