设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

构建一个属于软件开发者的键盘

2015-2-5 21:49| 发布者: joejoe0332| 查看: 6764| 评论: 0|原作者: 陈明|来自: DZone

摘要: 作为软件开发者,键盘可以说是我们最亲密的“朋友”之一。频繁的敲击键盘让定制键盘成为急需品,而软件工程师LÁSZLÓ MONDA为我们详细介绍了其制作“终极黑客键盘”的具体过程。 ...
  作为软件开发者,键盘可以说是我们最亲密的“朋友”之一。频繁的敲击键盘让定制键盘成为急需品,而软件工程师LÁSZLÓ MONDA为我们详细介绍了其制作“终极黑客键盘”的具体过程。

  【编者按】软件工程师LÁSZLÓ MONDA为了解决每天频繁“奔走”于键盘各块件之间,创建了“终极黑客键盘”。该键盘分为左右两部分,拥有LED灯,而其中所涉及到的具体技术和过程,你可以在本文中找到答案。


以下为译文:

  早在2007年8月的某一天工作中,我不禁意识到普通的PC键盘无法尽可能多的满足于我,每天,我的手指不得不在键盘各块件成百上千次的“奔走”,我想必须要有一个很好的解决办法。


  当我想创造一个完美的黑客键盘并去实现它时,我才意识到,作为一名软件开发者,我对硬件是一无所知。(PS:这是多么痛的领悟)


  我设法去学习一个全新的技能,同时说服我一位杰出的机械工程师朋友András V?lgyi加入到制作键盘的项目中,并投入足够的时间创建工作原型。如今,“终极黑客键盘”已经成为现实。


  对于没有任何电子知识的软件背景,设计和构建一个强大的硬件设备是一个有趣和迷人的经验,在本文中我将描述这个电子杰作是如何工作的。对电子线路图有基本了解的你可以更容易的理解。



如何去构建一个键盘

第一步:没有键的键盘

  首先让我们做一个发出x字符(基于每秒一次)的USB键盘,Arduino Micro开发板是实现该目标的一个不错的选择,因为它的功能ATmega32U4microcontroller(一种AVR microcrontroller)和相同的处理器是UHK的大脑。

  说到USB-capable AVR microcontrollers,用于AVR(LUFA)的轻量级USB框架是库的选择。它使得这些处理器成为打印机、MIDI设备、键盘或任何其他USB设备类型的“大脑”。


  当设备插入USB端口时,设备会传递一些被称为USB描述符的特殊数据结构。这些描述符会告知主机所连接设备的类型和性质,并由一个树结构表示。一个设备可以实现的不止一个函数,而是多个。这让事情更加复杂。让我们看看UHK描述符的结构:


  大多数键盘只暴露单一的键盘接口描述符,这是有道理的。然而UHK也会暴露鼠标接口描述符,因为用户可以指令键盘的任意键来控制鼠标指针,所以键盘可以当作鼠标使用。GenericHID接口服务相当于一个为所有特性键盘交换配置信息的通信通道。(你可以在这里看到在LUFA中完整的UHK实施和配置描述符:点此进入


  现在我们已经创建了描述符,下面代码则演示了其每秒一次发送x字符:

  1. uint8_t isSecondElapsed = 0;  
  2.    
  3. int main(void)  
  4. {  
  5.     while (1) {  
  6.         _delay_us(1000);  
  7.         isSecondElapsed = 1;  
  8.     }  
  9. }  
  10.    
  11. bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,  
  12.                                          uint8_t* const ReportID,  
  13.                                          const uint8_t ReportType,  
  14.                                          void* ReportData,  
  15.                                          uint16_t* const ReportSize)  
  16. {  
  17.     USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData;  
  18.     if (isSecondElapsed) {  
  19.         KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_X;  
  20.         isSecondElapsed = 0;  
  21.     }  
  22.     *ReportSize = sizeof(USB_KeyboardReport_Data_t);  
  23.     return false;  
  24. }  

  USB是一种查询协议,这意味着主机定期间隔(通常是125次/s)查询设备,以此来找出是否有任何新的数据发送。与此相关的回调是CALLBACK_HID_Device_CreateHIDReport()函数,在isSecondElapsed变量为1情况下向主机发送x字符的扫描码,isSecondElapsed在每秒的基础上循环的设置为1,回调时设置为0。



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部