原创 自制USB键盘来玩玩~~~~(源代码,原理图)

2007-3-31 01:17 10512 9 19 分类: MCU/ 嵌入式
哈哈,终于搞了一回USB HID设备,做了一个USB键盘来玩玩~~~~

其中的报告描述符让我晕了几天~~~~~几份HID相关的协议还是蛮长的~~~~~~
明天再弄个USB鼠标设备玩玩~~~~~~~有空的话再搞个红外遥控器玩玩~~~
这回是拿以前做的Mass storage来改的,所以比较快,修改了一下描述符
以及端点处理等,就行了。用了一个4*4的小键盘,有0-9十个数字键,
Num Lock键,Caps Lock键,Shift键,Ctrl键,Alt键,回车键等。

最多可以有三个键同时按下,如果相交的话,最多只能两个键按下。

 

下载全部源代码face11.gif USB键盘源代码包.rar  rar

 

 

以下是通过串口返回的调试信息:

 

系统启动................................
断开USB连接........................
USBD12芯片初始化
   设置地址.....................
       地址为:  0
连接USB...............
USB总线复位................................
USB总线挂起................................
USB总线复位................................
USB总线挂起................................
USB总线复位................................
USB标准请求................................
    获取描述符................................
        获取设备描述符................................
USB总线复位................................
USB标准请求................................
   设置地址.....................
       地址为:  2
USB标准请求................................
    获取描述符................................
        获取设备描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取配置描述符................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取语言ID................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取设备序列号................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取配置描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取语言ID................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取产品字符串................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取语言ID................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取产品字符串................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取设备描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取配置描述符................................
USB标准请求................................
    获取描述符................................
        获取配置描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    设置配置................................
USB类请求................................
    设置空闲................................
USB标准请求................................
    获取描述符(从接口)..............................
        获取报告描述符................................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................
端点2输出................................
    端点2的数据是  0x01
端点2输出................................
    端点2的数据是  0x03
端点2输出................................
    端点2的数据是  0x01
端点2输出................................
    端点2的数据是  0x00
端点2输出................................
    端点2的数据是  0x02
端点2输出................................
    端点2的数据是  0x03

 

在设备管理器里看到的图:

点击看大图


 

1c43dc98-af71-430c-b429-0214d8996d47.JPG

 

原理图
(用的是以前做IDE转USB的板,所以上面还有个IDE接口和573锁存器,可以不用理会它们):

(注意:原理图上所标的晶体值是以前的,这个程序中使用的是22.1184M的晶体.它关系到串口波特率,如果你不使用串口,那么可以不用理会它.)

注意:图中串口电平转换部分的C8和C10接反了,C11负端应接VDD。D12的SUSPEND(12脚)应该接地。USB接头处的D+和D-应该分别串联22欧姆的匹配电阻。由于图得比较匆忙,所以没留意。


点击看大图


点击看大图

 

点击看大图

点击看大图

点击看大图


PARTNER CONTENT

文章评论12条评论)

登录后参与讨论

用户216809 2007-11-24 11:52

你没有考虑搞个USB红外接收设备吗?最好能支持linux

computer00 2007-8-25 11:16

发现程序的一个BUG,有些朋友提到枚举不正常,可能是下面这个函数的问题,替换它再试试.

/***************************设置地址***************************************/
void set_usb_address(void)
{
usb_flags.flags.set_addr=1;
set_usb_addr(Control_Data.DeviceRequest.wValue);
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
while(select_endpoint(1)&0x01);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/

用户87040 2007-7-16 07:26

 

 谢谢 , 我这就动手查资料!

computer00 2007-7-15 22:30

好象复合设备就可以...你找找USB关于复合设备方面的文档吧.....

用户87040 2007-7-15 18:54

 

 圈圈你好:

   小弟有一事请教能不能用该框架不变的情况下,也发送鼠标消息。也就是它能轮流发送鼠标和键盘消息!

computer00 2007-6-5 14:51

也许是你的端口初始化不对吧.这个需要一步步跟踪调试,才能确认故障在哪.

computer00 2007-5-30 12:59

呵呵,恭喜了~~~~~~

computer00 2007-5-19 10:59

都可以.只要能显示串口数据即可。

computer00 2007-5-18 11:10

程序应该是没有问题的(当然硬件要一致才行),我是最后烧到片子里面去试过才发上来的。建议你还是搞个串口出来,然后返回一些信息来看看,否则一点信息都没有,就像盲人摸象。另外再装上BUS HOUND,来看看数据包。

computer00 2007-5-17 19:47

不用安装驱动程序,这个驱动程序是windows自带的。也许你哪里搞错了,用BUS HOUND来看看数据,是否有数据包返回. 另外,原理图上的晶体频率太高,你换成22.1184M的试试,然后看看串口的返回信息.

你可以去设备管理器里面去看看它的PID和UID,看是否为0,如果为0,就表示没有枚举成功. 也许是你的D+和D-接反了?仔细检查一下。

我的D12是用飞线连起来的,封起来只是为了防止刮断线而已。

相关推荐阅读
computer00 2013-06-05 16:27
[招聘]Android系统开发工程师
任职要求: 1. 扎实的C/C++基础,熟悉嵌入式Linux和Android操作系统的软件开发; 2. 良好的沟通能力和逻辑思维能力; 3. 良好的英文文献阅读能力; 4. 具备...
computer00 2013-06-04 09:26
[招聘]Android应用开发工程师
任职要求: 1. 具备扎实的面向对象编程思想和JAVA编程基础; 2. 熟悉Eclipse+ADT开发环境,熟练掌握Android基本类库; 3. 熟悉网络应用和多媒体应用开发; ...
computer00 2012-09-26 13:15
圈圈的新浪官方围脖
http://weibo.com/computer00  ...
computer00 2012-09-26 13:12
欢迎大家去收听圈圈弹的曲子
http://www.tudou.com/home/_105209016  ...
computer00 2009-06-29 15:07
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)下载地址1:下载地址2: 勘误.pdf...
computer00 2009-06-25 11:23
一块磐正845GE主板PS2接口的修复
圈圈有一部台式机,某天开机时,发现键盘用不了了,停留在输入BIOS密码那里。主机自检通过,但是蜂鸣器却发出很微弱的、连续的声音,同时键盘的三个LED也没有出现象往常一样的闪烁一下。圈圈以为多日未用,积...
EE直播间
更多
我要评论
12
9
关闭 站长推荐上一条 /1 下一条