2008.1.22
近来要做9200 usb device的驱动,对USB我是一点都不了解哦,就是一张白纸。经过几天的看书,查资料。了解了一些基本概念。我准备先在7s64上实现按个按键,点个小灯,通过USB进行传输数据。相当的痛苦。。。。
一些基本概念的理解
1.主机是控制器。USB设备回应主机的请求,但USB设备之间不能互送信息。当主机向USB外设发送数据时,主机发出1个OUT信号。外设如果有时间接收数据,并接收无误,就返回1个ACK信号给主机;如果忙,就返回1个NAK信号;如果发现错误,就不返回信号。
2.OUT表示从主机到外设,IN表示从外设到主机。
3.当USB设备接入HUB(集线器)后,主机控制器和主机软件能自动侦测到设备的接入。然后,主机软件读取一系列的数据用于确认设备特征,如Vendor ID、Product ID、接口工作方式、功率消耗等参数。之后,主机分配给外设一个单独的地址。地址是动态分配的,各次可能不同。在分配完地址之后,对设备进行初始化,初始化完成以后,就可以对设备进行I/O操作了。
4.四种传输类型
①块传输。块传输用于支持突发的大量的数据,以8、16、32或64字节的信息包传送。
②中断传输。中断传输用于量少且不经常传送的周期性数据。中断数据的包长限制在64字节内。
③同步传输。同步传输主要用于音频和视频数据流,不具有USB定义的格式。
④控制传输。控制传输应用于控制命令和状态命令的传送。
2008.1.25
经过几天的折腾,系统终于识别出HID设备了,遇到一个问题,我到现在还不清楚怎么回事。
const char keyboardDescriptor[] = {
0x0105, // Usage Page (Generic Desktop)
0x0609, // Usage (keyboard)
0x01A1, // Collection (Application)
0x0705, // Usage (Pointer)
0xe019,//usage min (224) //60, 61
0xe729,//usage max (231) //62, 63
0x0015, //logical min (0) //64, 65
0x0125,//logical max (1) //66, 67
0x0175,//report size (1) //68, 69
0x0895,//report count (8) //70, 71
0x0281,//input (data, variable, absolute) [modifier byte] //72, 73
0x0195, //report count (1) //74, 75
0x0875, //report size (8) //76, 77
0x0381, //input (constant) [reserved byte] //78, 79
0x0595, //report count (5) //80, 81
0x0175, //report size (1) //82, 83
0x0805, //usage page (page# for leds) //84, 85
0x0119, //usage min (1) //86, 87
0x0529, //usage max (5) //88, 89
0x0291, //output (data, var, abs) [led report] //90, 91
0x0195, //report count (1) //92, 93
0x0375, //report size (3) //94, 95
0x0391, //output (constant) [led report padding] //96, 97
0x0695, //report count (5) //98, 99
0x0875, //report size (8) //100, 101
0x0015, //logical min (0) //102, 103
0xFF25, //logical max (101) //104, 105
0x0705, //usage page (key codes) //106, 107
0x0019, //usage min (0) //108, 109
0x6529,//usage max (101) //110, 111
0x0081, //input (data, array) //112, 113
0xC0 //end collection //114
}
const char keyboardDescriptor[] = {
0x05, 0x01, //usage page (generic desktop) //52, 53
0x09, 0x06, //usage (keyboard) //54, 55
0xA1, 0x01, //collection (application) //56, 57
0x05, 0x07, //usage page (key codes) //58, 59
0x19, 0xE0, //usage min (224) //60, 61
0x29, 0xE7, //usage max (231) //62, 63
0x15, 0x00, //logical min (0) //64, 65
0x25, 0x01, //logical max (1) //66, 67
0x75, 0x01, //report size (1) //68, 69
0x95, 0x08, //report count (8) //70, 71
0x81, 0x02, //input (data, variable, absolute) [modifier byte] //72, 73
0x95, 0x01, //report count (1) //74, 75
0x75, 0x08, //report size (8) //76, 77
0x81, 0x01, //input (constant) [reserved byte] //78, 79
0x95, 0x05, //report count (5) //80, 81
0x75, 0x01, //report size (1) //82, 83
0x05, 0x08, //usage page (page# for leds) //84, 85
0x19, 0x01, //usage min (1) //86, 87
0x29, 0x05, //usage max (5) //88, 89
0x91, 0x02, //output (data, var, abs) [led report] //90, 91
0x95, 0x01, //report count (1) //92, 93
0x75, 0x03, //report size (3) //94, 95
0x91, 0x01, //output (constant) [led report padding] //96, 97
0x95, 0x05, //report count (5) //98, 99
0x75, 0x08, //report size (8) //100, 101
0x15, 0x00, //logical min (0) //102, 103
0x25, 0x65, //logical max (101) //104, 105
0x05, 0x07, //usage page (key codes) //106, 107
0x19, 0x00, //usage min (0) //108, 109
0x29, 0x65, //usage max (101) //110, 111
0x81, 0x00, //input (data, array) //112, 113
0xC0 //end collection //114
}
不知道为什么定义成short型,枚举过程就有问题。改成char就OK了!!
编译环境是ADS,我用busbound抓包,两种定义格式的数据都是一样的,不明白。。。