百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

如何从零开始做一个 USB 键盘?

csdh11 2025-01-05 16:41 27 浏览

分两种情况:

1、做一个真正的USB键盘,这种设计基本上不涉及大量的软件编码。

2、做一个模拟的USB键盘,实际上可以没有按键功能,这种的需要考虑大量的软件编码,实际上是一个单片机。

第一种设计:买现成的USB设备芯片,然后焊好就可以了,几乎没听说过谁自己从零开始做USB设备芯片的,首先晶振之类的如何满足要求就是一个问题。

基本原理就是按键,转换扫描码,写入寄存器,然后等主机那边去读就可以了。

主机端实际上不需要做什么设计,因为键盘属于标准的class设备,都是自带驱动的。

第二种设计:首先要找到一个支持OTG的单片机(板子),编写完整的USB Device Stack(大概几万行),定义好USB描述符(Descriptor)和HID描述符(Windows需要),然后等待主机的中断传输请求即可。

每次把需要发送的扫描码(scan code)写到中断传输的缓冲区里,让device stack把数据发送走即可。

至于硬件信号部分,这些都是USB控制器(简称控制器,下同)集成的,如果说你要自己写一个控制器,那么需要的技术就太复杂了,全球也没有多少厂商能弄出来自己的控制器。做控制器需要熟练背诵USB2.0技术规范以及EHCI/UHCI/OHCI技术规范。

---------------------既然问具体怎么做,那么我也补充一些吧---------------------

首先,需要一个支持OTG或者USB Device工作模式的板子/芯片/模块。板子可大可小,可以是工业级的带OTG的板子,也可以是小小的只有一个单片机的那种。小的那种我没有用过,我就说大的。

OTG的意思可以大概理解为这个USB口既可以作为主机口接设备,也可以作为设备接入主机,新一点的手机都带这个功能。

我所知道的OTG控制器有Mentor Graphics的,还有Freescale有一些板子也支持。

找到这样的板子,然后就是找代码了,Linux里实际上就有这样的代码,比如Mentor Graphics的控制器驱动的代码在:linux-3.7.1\drivers\usb\musb,这里,当然如果你用的是别的版本的Linux,在相应的位置也能找到代码。不知道Linux源码从哪里找?传送门:The Linux Kernel Archives

有了代码,你还需要U-boot或者其它的东西去启动这个板子,同时要使用对应的交叉编译器,应该是arm的交叉编译器。

于是,板子能起来了,接到主机(比如PC上)也能识别出来一个“未知设备”了,剩下的工作就是给这个未知设备写驱动。

首先,要通过控制器代码去编写相关的USB设备描述符,PC能识别各种设备都是靠描述符,对此,需要先了解USB技术规范:《Universal Serial Bus Specification Revision 2.0》,这个百度一下就能下载,但是全英文的,我见过中文的,但翻译的很糟糕并且不全。

在此技术规范的章节:9.6.1 Device里有详细描述了USB设备描述符的信息。具体怎么把描述符写到驱动里,这个我不是特别清楚,所以只能说你要自己看代码了。

有了设备描述符,实际上还有很多别的描述符要设置,比如接口描述符、配置描述符等等,这些规范里都有,需要一一阅读。

有了这些,你只是制造了一个USB设备,但Windows还不认账,此时,需要设置HID描述符,因为键盘输入HID设备,关于HID的描述也有技术规范《Device Class Definition for Human Interface Devices (HID) Version 1.11》,同样没有中文的。

然后,你就可以根据这个规范发送对应的中断传输(interrupt)信号,就可以跟主机通信了。然后具体你想模拟哪个按键,需要发送对应的扫描码,具体的内容参考这里:Scancode,扫描码的介绍是有中文的,找到以后,你就可以很开心的发送键盘按键信息了。

然后,就完事了,难度就是要阅读很多技术规范,以及大量的代码。

当然,某些商用的嵌入式系统自带USB设备模拟驱动,如果有钱(很贵的),买一套成品过来,找一个板子就可以了。

— 完 —

相关推荐

pdf怎么在线阅读?这几种在线阅读方法看看

pdf怎么在线阅读?我们日常生活中经常使用到pdf文档。这种格式的文档在不同平台和设备上的可移植性,以及保留文档格式和布局的能力都很强。在阅读这种文档的时候,很多人会选择使用在线阅读的方法。在线阅读P...

PDF比对不再眼花缭乱:开源神器diff-pdf助你轻松揪出差异

PDF比对不再眼花缭乱:开源神器diff-pdf助你轻松揪出差异在日常工作和学习中,PDF文件可谓是无处不在。然而,有时我们需要比较两个PDF文件之间的差异,这可不是一件轻松的事情。手动逐页对比简直是...

全网爆火!580页Python编程快速上手,零基础也能轻松学会

Python虽然一向号称新手友好,但对完全零基础的编程小白来讲,总会在很长时间内,都对某些概念似懂非懂,每次拿起书本教程,都要从第一章看起。对于这种迟迟入不了门的情况,给大家推荐一份简单易懂的入门级教...

我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元

晓查发自凹非寺量子位报道|公众号QbitAI猜猜它是什么?印着姓名、职位和邮箱,看起来是个名片。可是右下角有芯片,看起来又像是个PCB电路板。其实它是一台超迷你的ARM计算机,不仅能够运...

由浅入深学shell,70页shell脚本编程入门,满满干货建议收藏

不会Linux的程序员不是好程序员,不会shell编程就不能说自己会Linux。shell作为Unix第一个脚本语言,结合了延展性和高效的优点,保持独有的编程特色,并不断地优化,使得它能与其他脚本语言...

真工程师:20块钱做了张「名片」,可以跑Linux和Python

机器之心报道参与:思源、杜伟、泽南对于一个工程师来说,如何在一张名片上宣告自己的实力?在上面制造一台完整的计算机说不定是个好主意。最近,美国一名嵌入式系统工程师GeorgeHilliard的名片...

《Linux 命令行大全》.pdf

今天跟大家推荐个Linux命令行教程:《TheLinuxCommandLine》,中文译名:《Linux命令行大全》。该书作者出自自美国一名开发者,兼知名Linux博客LinuxCo...

PDF转换是难题? 搜狗浏览器即开即看

由于PDF文件兼容性相当广泛,越来越多的电子图书、产品说明、公司文告、网络资料、电子邮件选择开始使用这种格式来进行内容的展示,以便给用户更好的再现原稿的细节,但需要下载专用阅读器进行转化才能浏览的问题...

彻底搞懂 Netty 线程模型

点赞再看,养成习惯,微信搜一搜【...

2022通俗易懂Redis的线程模型看完就会

Redis真的是单线程吗?我们一般说Redis是单线程,是指Redis的网络IO和键值对操作是一个线程完成的,这就是Redis对外提供键值存储服务的主要流程。Redis的其他功能,例如持久化、异步删除...

实用C语言编程(第三版)高清PDF

编写C程序不仅仅需要语法正确,最关键的是所编代码应该便于维护和修改。现在有很多介绍C语言的著作,但是本书在这一方面的确与众不同,例如在讨论C中运算优先级时,15种级别被归纳为下面两条原则:需要的...

手拉手教你搭建redis集群(redis cluster)

背景:最近需要使用redis存储数据,但是随着时间的增加,发现原本的单台redis已经不满足要求了,于是就倒腾了一下搭建redistclusterredis集群。好了,话不多说,下面开始展示:...

记录处理登录页面显示: HTTP Error 503. The service is unavailable.

某天一个系统的登录页面无法显示,显示ServiceUnavailableHTTPError503.Theserviceisunavailable,马上登录服务器上查看IIS是否正常。...

黑道圣徒杀出地狱破解版下载 免安装硬盘版

游戏名称:黑道圣徒杀出地狱英文名称:SaintsRow:GatOutofHell游戏类型:动作冒险类(ACT)游戏游戏制作:DeepSilverVolition/HighVoltage...

Exchange Server 2019 实战操作指南

...