这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » PDIUSBD12鼠标:给入门者(3)

共12条 1/2 1 2 跳转至

PDIUSBD12鼠标:给入门者(3)

菜鸟
2005-05-07 01:02:48     打赏

PDIUSBD12鼠标:给入门者(3)

文件说明:

请先阅读HID设备规范: [[upload=zip]viewFile.asp?ID=5467[/upload]]

d12_pc.c: 打开giveio,然后调用USB测试函数usb_main。 mainloop.c: 实现USB的拔插操作usb_disconnect/usb_connect; 实现SETUP包的分析setup_handler:注意,在这一部分中,字节的排列顺序要搞清 (LITTLE ENDIAN),和用51编程是相反的; 实现主循环while(!exit_flag){}; 注意下面的代码是为了保证有鼠标键按下后,及时弹起: if(s[0]!=0) { s[0]=0x00; s[1]=0; s[2]=0; s[3]=0; Hal4D12_ReadLastTransactionStatus(3); Hal4D12_WriteEndpoint(3,4,s); } 下面的代码是模拟鼠标动作,在鼠标的REPORT中描述了其格式由4个字节组成,分别 表示鼠标的button和x,y,z方向的现对移动: switch(getch()) { case 0x4b: // Left Arrow Key s[0]=0x00; s[1]=-10; s[2]=0; s[3]=0; break; case 0x48: // Up Arrow Key s[0]=0x00; s[1]=0; s[2]=-10; s[3]=0; break; case 0x4d: // Right Arrow Key s[0]=0x00; s[1]=10; s[2]=0; s[3]=0; break; case 0x50: // Down Arrow Key s[0]=0x00; s[1]=0; s[2]=10; s[3]=0; break; case 0x53: // Delete Key s[0]=0x01; s[1]=0; s[2]=0; s[3]=0; break; case 0x51: // End Key s[0]=0x02; s[1]=0; s[2]=0; s[3]=0; break; case 0x4f: // PageDown Key s[0]=0x04; s[1]=0; s[2]=0; s[3]=0; break; default: break; } Hal4D12_ReadLastTransactionStatus(3); Hal4D12_WriteEndpoint(3,4,s); delay_ms(50);

std_defs.h: 一个移植性很好的定义文件 d12_hal.c/d12_hal.h: 实现了底层硬件的操作 isr.c: 实现中断处理(目前用的是查询方式) hal4sys.c/hal4sys.h/hal4d12.c/hal4d12.h: 实现D12基本操作 chap_9.c/chap_9.h: USB协议第9章的实现,注意在Chap9_GetDescriptor函数中, 增加了USB_HID_DEV_TYPE/USB_HID_REPORT_TYPE两个case, 这是HID设备必须的 descp_ms.h: 这个文件包含必要的描述符,鼠标不同于普通的USB设备,主要体现 在CONFIGURATION描述符中,下面定义设备为Mouse: ...... 0x03, // bInterfaceClass: HID-class 0x01, // bInterfaceSubClass 0x02, // bInterfaceProtocol: Mouse ...... 下面定义鼠标数据的类型为REPORT,共1个: //--------------------------------------------------------------------------------------------------------------------- // HID-CLASS DESCRIPTOR //--------------------------------------------------------------------------------------------------------------------- 0x09, // bLength: Size of descriptor 0x21, // bDescriptorType: HID Class 0x01,0x01, // bcdHID: HID Class version 1.1 0x00, // bCountryCode: none 0x01, // bNumDescriptors: 1 report descp 0x22, // bDescriptorType: report descriptor type REP_LEN,0x00, // wDescriptorLength

下面定义了具体的鼠标返回数据的格式,在HID规范里都可以找到说明,也可以用下面的 软件生成[[upload=zip]viewFile.asp?ID=5468[/upload]],从下面的注释中,基本可以看出需要从鼠标的中断端点向HOST发送4个字节, 分别表示3个button和x,y,z相对位移:

BYTE Rep_Descp[] = { 0x05, 0x01, // Usage Page (Generic Desktop), 0x09, 0x02, // Usage (Mouse), 0xA1, 0x01, // Collection (Application), 0x09, 0x01, // Usage (Pointer), 0xA1, 0x00, // Collection (Physical), 0x05, 0x09, // Usage Page (Buttons), 0x19, 0x01, // Usage Minimum (01), 0x29, 0x03, // Usage Maximun (03), 0x15, 0x00, // Logical Minimum (0), 0x25, 0x01, // Logical Maximum (1), 0x95, 0x03, // Report Count (3), 0x75, 0x01, // Report Size (1), 0x81, 0x02, // Input (Data, Variable, Absolute), ;3 button bits 0x95, 0x01, // Report Count (1), 0x75, 0x05, // Report Size (5), 0x81, 0x01, // Input (Constant), ;5 bit padding 0x05, 0x01, // Usage Page (Generic Desktop), 0x09, 0x30, // Usage (X), 0x09, 0x31, // Usage (Y), 0x09, 0x38, // Usage (Wheel), 0x15, 0x81, // Logical Minimum (-127), 0x25, 0x7F, // Logical Maximum (127), 0x75, 0x08, // Report Size (8), 0x95, 0x03, // Report Count (3), 0x81, 0x06, // Input (Data, Variable, Relative), ;3 position bytes 0xC0, // End Collection, 0xC0}; // End Collection

注:另外两个文件descp_kb.h和ds_ms_kb.h分别表示如何设计一个USB键盘和鼠标+键盘的composite设备,基本原理 类似,不过测试程序要修改一下,大家权当练习。 如果你按照上面的程序正确的实现了一个USB鼠标,那么制作一个USB设备也就了解的差不多了,因为HID设备不 需要编写驱动程序,故实现起来相当容易。对于设备驱动程序的编写,请到www.driverdevelop.com等网站上上 找相关帖子。 随后,将陆续推出基于Brk-d12的USB转串口设备的设计、U盘设计、USB打印机设计等(都不需要编写驱动程序:)), 请关注,代码的编制尽量硬件无关,基本上所有代码都会在如下芯片中测试:D12、SL811HS、ISP1161等;大家有 什么好的创意,也请不吝赐教。

[align=right][color=#000066][此贴子已经被作者于2005-5-6 17:05:51编辑过][/color][/align]



关键词: PDIUSBD12     鼠标     入门     Usage    

菜鸟
2005-05-18 06:20:00     打赏
2楼

顶上去!!!

好歹斑竹花了那么多时间啊~~


菜鸟
2005-05-20 01:15:00     打赏
3楼
好的

菜鸟
2005-06-08 01:04:00     打赏
4楼
hao

菜鸟
2005-06-10 03:28:00     打赏
5楼
版主真是好人哪,坚决支持版主,看得出版主才学好,人品更好

菜鸟
2005-06-21 17:54:00     打赏
6楼

当代的雷锋

[em02]

菜鸟
2006-05-28 04:13:00     打赏
7楼
re

菜鸟
2006-06-19 21:52:00     打赏
8楼
收藏

菜鸟
2006-08-22 23:26:00     打赏
9楼
不顶对不住老大!

菜鸟
2006-10-06 09:59:00     打赏
10楼
鼠标的数据如何得到是PC驱动程序的任务,而作为Slave端,只需要 按照格式发送给PC即可。你可否说清楚哪些是关键的?我可以进一步 整理相关资料。

共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]