Jump to content

    
Sign in to follow this  
mantech

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

Recommended Posts

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

 

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

 

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

Edited by mantech

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this