реклама на сайте
подробности

 
 
> Работа с радиомышкой в МХ6, Куда копать - без понятия..
mantech
сообщение Aug 11 2015, 14:15
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Приветствую.
Всю башку сломал по поводу этих композитных устройств, будь они не ладны!
Вообщем суть вопроса такая - есть обычная проводная мышь, у которой 1 интерфейс-дескриптор, все работает норм, а есть радио, у которой их 2, причем первый, с которым работает моя прога - клавиатура, а мышь - следующий.

В драйвере усб этого камня, есть список, в котором считывается конфиг. дескр., затем интерфейс 1, хид1, контр. точка1, затем интерфейс 2, хид2, контр. точка2, и тд., если есть еще. Вопрос, как заставить прогу поллить не 1, а второй интерфейс? В драйвере от фрискейла только магические цифры...Может кто в курсе?? Хотя, о чем я спрашиваю - в тренде же линукс-онли rolleyes.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Aug 12 2015, 12:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Ну вот это я и хочу узнать, например - wValue - это что за поле, в каком месте из 8 байт запроса оно распологается? И остальные..

ну так это не к процессору же... Это к стандарту USB надо обращаться, посмотрите где то он тут был... Там расписаны и команды и структуры и какое поле чего значит.
Оно для того и было сделано USB, чтобы от реализаций не зависеть.
Go to the top of the page
 
+Quote Post
mantech
сообщение Aug 12 2015, 12:25
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Golikov A. @ Aug 12 2015, 15:12) *
ну так это не к процессору же... Это к стандарту USB надо обращаться,


Это я понимаю, просто вдруг у кого есть кусочек кода для инициализации 2х или более интерфейсных девайсов...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 12 2015, 12:28
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Не нужно в вашем случае никакой специфической инициализации.
Go to the top of the page
 
+Quote Post
mantech
сообщение Aug 12 2015, 13:46
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(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);

}







Сообщение отредактировал mantech - Aug 12 2015, 13:53
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 12 2015, 14:20
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

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

Для работы со вторым интерфейсом нужно всего лишь брать данные с EP 2 IN (82h) вместо 1 IN (81h). Ничего инициализировать НЕ НУЖНО.
Go to the top of the page
 
+Quote Post
mantech
сообщение Aug 12 2015, 15:04
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(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;
}
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 12 2015, 15:26
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(mantech @ Aug 12 2015, 18:04) *
Ещеб знать, как ее туда впихнуть...

Начните с перекапывания usbh_get_interface_desc() - он, я так подозреваю, возвращает первый попавшийся дескриптор интерфейса, а нужно чтобы возвращал правильный.
Go to the top of the page
 
+Quote Post
mantech
сообщение Aug 12 2015, 15:40
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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


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

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

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

Так что это где-то в настройках поллинга кон.точки, только без доков тут не разобраться...

Сообщение отредактировал mantech - Aug 12 2015, 15:52
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 12 2015, 17:12
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Адрес точки тоже должен браться из дескриптора, поищите. Вряд ли его стали бы жестко устанавливать, хотя и такое можно представить. Но в любом случае какой-то адрес должен фигурировать при транзакции.
Go to the top of the page
 
+Quote Post
mantech
сообщение Aug 12 2015, 18:46
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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


Нет, не вижу вообще связи ничего, кроме длины репорта.
ЗЫ. После анализа этого быдлокода, я уже все могу представить wacko.gif
Вообще, по-уму, где должна быть привязка кон. точек к системе опроса порта?

Сообщение отредактировал mantech - Aug 12 2015, 18:48
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- mantech   Работа с радиомышкой в МХ6   Aug 11 2015, 14:15
- - prottoss   Цитата(mantech @ Aug 11 2015, 20:15) В др...   Aug 11 2015, 17:01
|- - mantech   Цитата(prottoss @ Aug 11 2015, 20:01) Есл...   Aug 11 2015, 17:14
|- - mantech   Цитата(mantech @ Aug 11 2015, 20:14) Если...   Aug 12 2015, 08:56
- - aaarrr   Цитата(mantech @ Aug 12 2015, 11:56) Тут ...   Aug 12 2015, 09:09
|- - mantech   Цитата(aaarrr @ Aug 12 2015, 12:09) Обычн...   Aug 12 2015, 10:37
|- - aaarrr   Цитата(mantech @ Aug 12 2015, 13:37) Ну э...   Aug 12 2015, 10:51
- - Golikov A.   ЦитатаВам просто нужно работать с конечными точкам...   Aug 12 2015, 11:00
|- - aaarrr   Цитата(Golikov A. @ Aug 12 2015, 14:00) к...   Aug 12 2015, 11:25
- - Golikov A.   А мне то откуда знать беспроводная мышь, которая е...   Aug 12 2015, 11:45
|- - kovigor   Цитата(Golikov A. @ Aug 12 2015, 14:45) А...   Aug 12 2015, 11:49
|- - mantech   Цитата(kovigor @ Aug 12 2015, 14:49) Почт...   Aug 12 2015, 12:03
|- - kovigor   Цитата(mantech @ Aug 12 2015, 15:03) Ну в...   Aug 12 2015, 12:05
|- - aaarrr   Цитата(mantech @ Aug 12 2015, 21:46) Вооб...   Aug 12 2015, 18:58
|- - mantech   Цитата(aaarrr @ Aug 12 2015, 21:58) По-ум...   Aug 12 2015, 19:02
|- - mantech   Закрываю тему, похоже никто тут с этими контроллер...   Aug 13 2015, 09:55
- - Golikov A.   сильно зависит от того на чем там хост сделан. LPC...   Aug 13 2015, 10:17
- - mantech   Цитата(Golikov A. @ Aug 13 2015, 13:17) М...   Aug 13 2015, 11:20
- - mantech   Перенес тему в - http://electronix.ru/forum/index...   Aug 16 2015, 16:24


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01503 секунд с 7
ELECTRONIX ©2004-2016