看了很多USB的文章,USB hid的协议等等,也问了很多高手,回答都是“USB很难很麻烦,但是USB hid还是很简单的”。一直看,期间似乎也有些头绪很心得,也转载了很多文章,但是老觉得不是特别明白,看了usb文字描述的,基本也知道:
usb设备插上去,就会产生一个中断信号(所以应该是中断方式),PC就会问设备是什么,就进入枚举过程:刚开始默认是端口0,问设备的设备描述符、配置描述符、接口描述符,知道什么设备了,那么就分配一个端口给设备(但是hid的控制端口就是0),那么以后这个端口就给这个设备了,然后再重新发送设备描述符请求,然后就设备描述符、配置描述符、字符串描述符、接口描述符、端点描述符。但是HID有自己的几个描述符和类命令请求,但是看了很多文章都没有写到,看了很多东西都是对HID的通讯描述,没办法,我用的是NXP1768的板子,只能看它的demo程序了。
看了几天,没搞懂,以前看程序都是从main函数看,可是这里的main函数只有:整个demo程序就是
但是这个demo有说明这个程序是干嘛用的,我直接把hex文件下到板子,运行一遍就大概知道,这里的GetInReport (void)、SetOutReport (void)就是功能函数,就一直找怎么调用的这个函数,加上usb hid的流程,我决定从中断函数去看,但是还是找不到每个函数的衔接点,不知道哪个调用哪个,最后只能按照自己理解的usb操作流程,找到中断函数 USB_IRQHandler (void) ,然后端点函数USB_EndPoint0 (U32 event) 这个调用 HID_GetReport() ,这个函数调用GetInReport (void)。发现这个思路是错的。后来问了高人,高人指点,用source insight软件看成程序,说我水平太差,没有读代码的能力,我觉得说的有道理,然后告诉我usb hid的程序方法,关键就是两个call函数,一个是中断call,一个是 HID_GetReport() call,首先知道中断,那么到底是怎么联系在一起,就是一个关键的端点函数函数指针数组
这个数组里的函数是通过 #define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL)定义的。
搞清楚这些,那么一切都明白了,那么接下来就大的程序进行看,我就又不是很明白细节问题,始终不明白问题,后来继续看了USBhid的基础解释,有些收获。
首先是USB_IRQHandler (void)这个函数:
在比较 disr = LPC_USB->USBDevIntSt; /* Device Interrupt Status */它直接跳到了
那么我们具体分析, 这几个函数。关键就是判断是event是 setup,in,out,以及是那个端点,在函数中我们可以知道,只有端口0对setup、in、out有分析,端口1对in有分析,其他端口空着就是不用的,就不用管了。那么直接进入端口0函数去看,全在里面了,数据怎么处理。这个下次有时间再写