这段时间尝试把cc2540 usb dongle改造成一个普通的usb hid输入输出设备,遇到一些问题,在此总结一下问题以及解决的方案。主要内容如下:
linux hid设备驱动支持
如何把HIDAdvRemoteDongle例程改成普通usb hid设备
DB 006H, 0A0H, 0FFH ; Usage Page (unk) DB 009H, 0A5H ; Usage (0xA5) DB 0A1H, 001H ; Collection (Application) DB 009H, 0A6H ; Usage (0xA6) DB 009H, 0A7H ; Usage (0xA7) DB 015H, 000H ; Logical Minimum (0) DB 026H, 000H, 0FFH ; Logical Maximum (-256) DB 075H, 008H ; Report Size (8) DB 095H, 040H ; Report Count (64) DB 081H, 002H ; Input (Var) DB 009H, 0A9H ; Usage (0xA9) DB 015H, 000H ; Logical Minimum (0) DB 026H, 000H, 0FFH ; Logical Maximum (-256) DB 075H, 008H ; Report Size (8) DB 095H, 040H ; Report Count (64) DB 091H, 002H ; Output (Var) DB 0C0H ; End Collection
修改之后可以编译一个hex通过ccdebuger烧包,最后usb dongle插上电脑,用软件UsbTreeView.exe识别看看是否是预期的一样。TI本身提供的代码找不到langid等字符串描述符,需要简单修改代码编译即可,不细说。 相互通信
一次收到数据多次中断
上面的代码中我假设收到的都是1个字符,实际上我echo带hidraw0的时候就是只echo一个字符,并且我上面的汇编代码中设定了endpoint4就是out方向的,那么这里同样存在附加的两个问题。 //file:usb_interrupt.h/// Endpoint 4 OUT data received from host (FIFO disarmed) / stall sent#define USBIRQ_EVENT_EP4OUT 0x2000/// Endpoint 5 OUT data received from host (FIFO disarmed) / stall sent#define USBIRQ_EVENT_EP5OUT 0x4000/*balabal*/#define USBIRQ_CLEAR_EVENTS(mask) (usbirqData.eventMask &= ((mask) ^ 0xFF))
很显然这里应该用0xFFFF去除标记,因为 USBIRQ_EVENT_EP5OUT这样的事件标记是0xXXXX的,0xFF只能清掉低两位。修改,编译,烧包,是否能够皆大欢喜?是的不会多次发送数据到主机了,但是不幸的是,第二次向usb写数据的时候,会有如下提示: 主机给usb发送数据只有第一次成功,之后超时
|
|
来自: iamlijin > 《TI CC2540》