[21IC首页] [21IC资料下载] [21IC器件搜索[alldatasheet网] [中国芯片手册网] [电子查询网] [磁动力工作室] [驱动程序开发网] [射频网络] [液晶之家] [可控硅应用技术网]

Computer○○的家当®

《圈圈教你玩USB》
网上购书点

当当网    淘宝网
中国互动出版社
卓越亚马逊
更多网点...
 
 
载入中...
   
                             设置为首页      [站长入口]    站点2: [EDN站点]   站点3: [与非站点]   站点4: [电子园站点]   我的USB专区: [圈圈的USB专区]

 




载入中...

日志内容


自制USB鼠标来玩玩~~~~(源代码+原理图)
电脑圈圈 发表于 2007-3-24 0:25:00

花了一个晚上,把USB键盘的程序改了改,就成了USB鼠标了~~~~~~
只是修改了一下报告描述符,以及返回数据等,修改很少。
 
点击此处下载 USB鼠标源代码包.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标准请求................................
    获取描述符(从接口)..............................
 
在设备管理器里的显示:
 
 
原理图(用的是键盘的硬件,8键鼠标上移,4键鼠标左移,6键鼠标右移,2键鼠标下移,
9键往上滚动,3键往下滚动,alt键鼠标左键,0键鼠标中键,enter键鼠标右键):
(注意:原理图上所标的晶体值是以前的,这个程序中使用的是22.1184M的晶体.它关系到串口波特率,如果你不使用串口,那么可以不用理会它.)
 
注意:图中串口电平转换部分的C8和C10接反了,C11负端应接VDD。D12的SUSPEND(12脚)应该接地。USB接头的D+和D-跟芯的D+和D-之间应该串联22欧姆的匹配电阻。由于图得比较匆忙,所以没留意。右击选择图片另存为可以看到完整图片了.
 
 
 
实物图片(键盘是外接的):



阅读全文 | 回复(123) | 引用通告 | 编辑       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2009-6-6 8:50:00

computer00参考《圈圈教你玩USB》的第四章,有两种方法都可以实现。
两个接口,或者一个报告、两个报告的方式都可以实现。
源代码可参看:
user1/2198/archives/2008/54259.html

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
joeyaung发表评论于2009-6-6 7:04:00

joeyaung顺便介绍一个USBlyzer的软件 可以帮助你从电脑上查看 你定义的USB功能的各个描述
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
joeyaung发表评论于2009-6-6 7:01:00

joeyaung圈圈大侠 有没有可能把键盘和鼠标的功能 做在一个usb口上
如果可以的话
是需要定义2个interface呢
还是可以定义一个interface 把2种功能放在一个report报告描述中

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
kaira(游客)发表评论于2008-9-2 11:19:00

kaira(游客)
以下引用oncemore(游客)在2007-12-14 15:07:00发表的评论:
00,请问PC Windows系统识别USB设备的过程能详细解释下么,我想先作到让电脑识别出我的USB HID设备。


个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2008-7-17 10:23:00

computer00密码就是computer00吧,自己看看压缩包的注释。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
leader(游客)发表评论于2008-7-17 10:07:00

leader(游客)怎么下载后解压要密码丫,密码是多少丫???
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2008-1-10 14:57:00

computer00我没试过,应该不行吧。从我对数据手册的理解上来看,直接接地比较好。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
LW(游客)发表评论于2008-1-10 14:22:00

LW(游客)00,还想请教一个问题,就是d12的suspend脚是一直接地吗?如果直接上拉行不行?
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2008-1-10 13:19:00

computer00有可能是线路没连好,或者总线速度太快,导致写数据不正确。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
LW(游客)发表评论于2008-1-10 10:19:00

LW(游客)00,我做了一个d12的板子,读id和读中断寄存器都没有问题,但是setmode时,改变不了clkout的频率,请教一下问题出在哪里了?
void outportb(unsigned int dataorcmd, unsigned char data)
{
if(dataorcmd == 0) //d12_data=0,d12_command=1
a0=0;
else a0=1;

d12wr = 1;
p0 = data; //p0口接d12的数据端
d12wr = 0;
d12wr = 1;
}

void d12_setmode(unsigned char bconfig, unsigned char bclkdiv)
{

outportb(d12_command, 0xf3);

outportb(d12_data, bconfig);

outportb(d12_data, bclkdiv);

}

我用的是77e58来控制d12,单片机晶振用的是22.1184m。

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-12-21 1:41:00

computer001. 下载我最新发布的程序试试。
2. 降低时钟频率试试,或者在对D12的操作上加延时。
3. 对照我最新的EDN USB板电路图,看是否有错误的地方。
4. 检查10K上拉排阻是否焊接正确。
5. 检查D12是否焊接正确。

最新的程序请在接口技术里面找,就是EDN USB学习那些。

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
gj(游客)发表评论于2007-12-20 22:06:00

gj(游客)今天给圈圈发了邮件还没有回答我,,
就是我搭的usb 鼠标电路不能正常工作,windowxp根本不和
D12沟通,每次插上usb,串行口的数据如下

系统启动................................
断开USB连接........................
USBD12芯片初始化
设置地址.....................
地址为: 0
连接USB...............
USB总线复位................................
USB总线挂起................................


D12的灯闪烁一下就灭了了,
我用圈圈的测试程序测试D12又是正常的,可以
读出D12的ID,请在线的大侠们给我建议一下,
我的cpu是stc89c58rd+,
网友之前的建议我都试了无效.

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-12-15 14:51:00

computer00你可以看看我的一系列入门文章:

http://computer00.21ic.org/user1/2198/cmd.html?do=blogs&id=1150&uid=2198

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
23(游客)发表评论于2007-12-14 15:09:00

23(游客)00,请问PC Windows系统识别USB设备的过程能详细解释下么,我想先作到让电脑识别出我的USB HID设备。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
oncemore(游客)发表评论于2007-12-14 15:07:00

oncemore(游客)00,请问PC Windows系统识别USB设备的过程能详细解释下么,我想先作到让电脑识别出我的USB HID设备。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-11-23 1:26:00

computer001. set_usb_addr(0) 你要去掉也无妨,我习惯了在程序中确认写一下,不依赖复位值。

2. 那个swap的确是我搞错了,直接从上面复制的代码。不过下面有句
if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
所以没出问题。

3. write_endpoint_buff(1,0,0); 是返回0长度的数据包。

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
xcc(游客)发表评论于2007-11-22 17:34:00

xcc(游客)00:
重新阅读了你的程序,你的程序中有几处还可以改进下:
void init_usb(void)
{
Prints("USBD12芯片初始化",1);
//set_usb_addr(0);
set_endpoint_enable();
} //set_usb_addr(0);可以不用,系统默认用0号端点。

还有后面的有个地方:
Control_Data.wCount=SWAP16(sizeof(MouseReportDescriptor));应该改为Control_Data.wCount=sizeof(MouseReportDescriptor);
我用串口调试出来的数据显示,如果用SWAP的话,wCount的值是:0x3400,但报告描述符只有52个字节,所以SWAP要去掉,不然是反向的。52个字节,写4次就可以写完了,你源程序中写了8次才写完。

还有个问题请教:write_endpoint_buff(1,0,0); 这个函数是什么用?谢谢00^_^

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-11-22 0:49:00

computer00not_end 是用来标志数据是否已经传送完毕的吧。由于端点大小有限,一个阶段数据比较多时,必须分成几次传,用 not_end 来标志下面是否还需要再传。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
xcc(游客)发表评论于2007-11-21 19:36:00

xcc(游客)00加油,拿个最佳斑竹~~~
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
xcc(游客)发表评论于2007-11-21 19:34:00

xcc(游客)哦,谢谢00
还有个问题:
uint8 not_end :1;
这个标志位看不懂到底是什么用

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-11-21 17:02:00

computer00为了实现单片机按下复位后,D12自动与PC断开连接。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
xcc(游客)发表评论于2007-11-21 9:58:00

xcc(游客)00:
你程序里,有几段是:
disconnect_usb();init_usb();connect_usb();
这几段是否是为了实现上电之后设备的复位?还是D12的固件程序?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-11-16 0:32:00

computer00这个好象没有什么算法呀,只是按照协议来做就行了。你可以去网上找找鼠标原理来看看。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
hlm(游客)发表评论于2007-11-15 20:37:00

hlm(游客)可以给我讲一讲鼠标原理和实现算法吗?我邮箱2502105027@163.com。帮帮忙,谢谢!
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
wlzz(游客)发表评论于2007-11-12 18:44:00

wlzz(游客)谁能教做鼠标滚轴感应器。给钱也行。qkrs@163.com
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-9-20 1:00:00

computer00多个键的应该直接修改报告描述符就行了吧. HID协议方面的,我在我的小组里上传过,你可以去找找.

http://group.ednchina.com/93/

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
fbeyond(游客)发表评论于2007-9-19 20:43:00

fbeyond(游客)圈圈看来真的是字节对齐和big endian的问题,现在已经通过了。如果你把涉及到big endian的几个整形的直接都用SWAP16()包起来那你的程序就做的非常的完美了。非常欣赏你的代码,整齐,容易阅读,估计你原来也是搞软件的。还有最后一个问题:如果多个键的鼠标mousereportdescriptor会怎样?是不是还要自己写鼠标的驱动?我在usb.org的网站上找不到HID的描述符介绍。我再找找看。谢谢你的帮助。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-9-17 9:41:00

computer00430是16位机吧?大于8位的MCU,还要考虑对齐问题。通常编译器会有个伪指令设置如何对齐的,看看它的帮助。

51是大端结构,所以有些地方要交换。如果你现在用的是小端结构,那么需要把所有牵涉到
大小端部分的代码都得改了。

只要是描述符中出现short int或者long int的地方你都得检查一下。

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
fbeyond(游客)发表评论于2007-9-16 23:49:00

fbeyond(游客)圈圈,会不会是big endian和little endian的问题,因为我用的是msp430的芯片,并把程序改为#define swap16() (x)。这样系统才不会出现无法识别的USB.我把device_descriptor的USB版本号改为0x0110就不会出现“此设备可提高性能,如果您将此USB2.0设备连接到高速SUB2.0端口,可以提高其性能。”这句话了,但是查看设备管理程序,上面的USB人体学输入设备仍然有个感叹号,属性仍然中提示:该设备无法启动 (代码10)
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
fbeyond(游客)发表评论于2007-9-16 23:02:00

fbeyond(游客)有2000个字数限制,没办法发上来,能否有你的QQ或MSN
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
fbeyond(游客)发表评论于2007-9-16 22:55:00

fbeyond(游客)USB控制芯片是D12,用你的程序,但没有用51芯片,跟踪了一下到第四个“获取配置描述符”之后,“设置配置”之前程序卡住了。也就是说程序执行到了第四个“获取配置描述符”之后,但没有执行到“设置配置”。这时候出现了错误。我的操作系统是WinXP,给你看一下BusHound的结果:
Device - Device ID (followed by the endpoint for USB devices)
(20) USB 人体学输入设备
Phase - Phase Type
CTL USB control transfer LEN Data length
DI Data in STAK NT IRP stack location
IRP NT I/O request packet URB USB request block
Data - Hex dump of the data transferred
Descr - Description of the phase
Cmd... - Position in the captured data
Time - Time the phase occurred in hour:minute:second.millisec form



个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-9-15 20:16:00

computer00不会吧?我没遇到过这个情况。你的USB控制芯片是什么?
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:圈圈,能否问一下,用你的程序在winXP下会报USB2.0设备
fbeyond(游客)发表评论于2007-9-15 13:42:00

fbeyond(游客)圈圈,能否问一下,用你的程序在winXP下会报USB2.0设备错误。详细提示如下:
此设备可提高性能,如果您将此USB2.0设备连接到高速SUB2.0端口,可以提高其性能。
查看设备管理程序,上面的USB人体学输入设备有个感叹号,属性中提示:该设备无法启动 (代码10)
这是怎么一回事呀?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-8-25 10:47:00

computer00发现程序的一个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;
}
/******************************************************************************/

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-8-19 22:32:00

computer00看USB HID类的协议吧,里面有定义,是一张表。关于协议你可以在我发的文章里面找找,或者去www.usb.org下载。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
bage(游客)发表评论于2007-8-19 16:14:00

bage(游客)圈圈:
你那些鼠标还有键盘的功能键的16进制键码是怎么来的?
我在网上找了好久都找不到~
难道是UNICODE?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
xcc(游客)发表评论于2007-8-16 17:15:00

xcc(游客)看了,我加上了2个20欧的电阻,因为22的没有。可能是系统缘故吧我想
我是用热转印来扩展D12引脚的,00,你更强啊,直接焊。
但从图片上看,那个不像是松香,倒像是一层塑料薄膜,有很明显的层次感

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-8-16 16:43:00

computer00那个是松香,保护引线用的。我的芯片是直接使用很细的铜丝连到引脚上去的,一不小心就会刮断了,所以加点松香保护一下。

不知道你注意看了我关于原理图的补充部分没,也许是漏了匹配电阻的原因?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
xcc(游客)发表评论于2007-8-16 10:26:00

xcc(游客)00:
谢谢你啊,我的鼠标成功了,就是枚举的时候有时候还是不能识别。
你的USB芯片上面还贴了一层像塑料样的东西,那是干吗用的?
防静电?还是防氧化?还是。。。

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:自制USB鼠标来玩玩~~~~(源代码+原理图)
computer00发表评论于2007-8-14 21:20:00

computer00这些是unicode编码,你找到对应的汉字对应的编码,然后去修改字符串就可以了。unicode最简单的例子就是数字和英文字符,直接在原来的ASCII码后面加0x20即可,你可以看到我的字符串中有一些这样的地方,例如我的网址。
个人主页 | 引用 | 返回 | 删除 | 回复       

发表评论:
载入中...

 
 

 

用户信息

载入中...

    
    
 
家当信息
载入中...

站长简介:  

    Computer00,男。B型血,天蝎座。爱好电子技术及计算机技术。21IC中国电子网[技术交流]版版主。

 

最新回复

载入中...

圈圈公告 
载入中...

最新家当

载入中...

友情链接 

 

家当主题

载入中...

最新留言

载入中...

搜我的家当 

          chunyang工作室
        为您提供无线通讯模块