Linux 2.6内核中包含了HID驱动,能够自动把USB Key等HID外设识别成“/dev/hiddev0”之类的设备。但是该驱动没有实现write接口,因此无法象Windows平台那样使用 ReadFile和WriteFile来读写HID设备,而只能使用ioctl接口。
      网上有各种各样读写HID设备的源代码例子,有的是通过HIDIOCSUSAGE和HIDIOCGUSAGE来每次收发4个字节,适合鼠标、键盘之类数据传输量小的设备;有的是通过HIDIOCSUSAGES和HIDIOCGUSAGES来连续接收和发送多个字节,适合USB Key一类的设备。
      在上一篇日志(已删除)中,介绍了如何利用《USB and PIC: quick guide to an USB HID framework》一文提供的方法与USB Key进行通信(先发送HIDIOCSUSAGES和HIDIOCSREPORT进行写操作,再发送HIDIOCGREPORT和HIDIOCGUSAGES进行读操作,从而完成一次通信过程)。但是经过好友测试,发现该方法不论是在PC机上,还是在Cavium Octeon 52XX开发板上均存在问题,读出的数据始终是第一次通信的结果,除非在每次通信之前都发送HIDIOCINITREPORT控制码,但这又会造成相当长时间的阻塞。
      进一步的测试表明,如果按照HIDIOCGUCODE、HIDIOCSUSAGES、HIDIOCSREPORT、HIDIOCGUCODE、HIDIOCGUSAGES的顺序发送控制码,那么可以每次都读出正确数据。不过该方法虽然在PC机上只需400毫秒延时,但是在Octeon开发板上仍会长时间阻塞在usbhid_wait_io函数那里。
      无奈之下,我只好根据Cavium SDK自带的Linux内核源码中的usb_skeleton.c写了一个USB设备驱动程序,试图通过直接读写USB端点来完成通信过程。以下是在开发和调试过程中需要注意的几个问题:
      首先,必须卸载Linux内核自带的HID驱动,否则它会自动“接管”新插入的USB Key,导致我们自己编写的驱动程序找不到设备。对于开发板,可以在编译内核时去掉HID相关的选项;对于PC机上已经安装好的Linux,我也不知道该怎么卸载其中的HID驱动。
      其次,端点类型。在usb_skeleton.c中是通过bulk端点来访问USB设备的,而USB Key作为HID设备,一般只有0号控制端点和一个中断输入端点(例如3号)。对于中断端点,可以用usb_interrupt_msg(其实就是usb_bulk_msg)函数进行访问;对于控制端点,则稍微麻烦一些,因为除了数据,还需要构造一个8字节的setup包。有关setup包的详细结构,可以参考USB和HID规范。获取setup包具体数值最简单的方法,就是在Windows环境下用BusHound观察USB Key的通信过程。
      最后,关于Report ID。在Windows环境下通过ReadFile和WriteFile访问HID设备时,必须在数据开头附加1字节的Report ID(一般为0)。在Linux环境下,如果使用HID驱动的ioctl接口,那么需要在hiddev_usage_ref结构中指定Report ID;如果使用自己编写的USB驱动程序,则不需要考虑Report ID,直接发送数据就得了。
      经过测试,利用自己编写的驱动程序,可以在Octeon开发板上正确读写HID类型的USB Key,而且读写之间的时间间隔也可以缩短至50毫秒。

在Linux 2.6环境下读写HID设备(USB Key)相关推荐

  1. Linux创建线程读取双口数据,linux环境下读写一次双口ram尽然要十几个毫秒。(附驱动代码)...

    linux环境下读写一次双口ram尽然要十几个毫秒.(附驱动代码) 我用的双口ram是IDT70V28,手册上说的读写时间应该是几个纳秒,我写了个linux驱动,然后做测试,发现读写一次的时间尽然是十 ...

  2. linux下dds软件,【数据库】Linux 单实例环境下实现Oracle数据库和DDS软件的开机自动重启...

    Linux 单实例环境下实现Oracle数据库和DDS软件的开机自动重启1.修改/etc/oratab# vi /etc/orataboradb:/opt/ora10/product/10.2 首页 ...

  3. Linux无桌面环境下,实现USB的自动挂载/卸载

    Linux无桌面环境下,实现USB的自动挂载/卸载 1.gnome桌面环境如何实现USB的自动挂载 2.udev 3.单个设备自动挂载/卸载 4.usbmount工具实现自动挂载卸载 linux无桌面 ...

  4. Linux服务器docker环境下Jasper Report报错

    Linux服务器docker环境下Jasper Report报错 Jasperreports模板制作方法在网上都有很多教程,可以自行探索一下 我用的模板参考:https://blog.csdn.net ...

  5. Hadoop2.6.0+Linux Centos7+idea环境下:MapReduce二度好友推荐案例

    目录 一.问题描述 二.intellij idea中编写代码+打包项目 三.xftp中上传jar包到Linux 四.hadoop中准备输入数据+运行jar包+查看输出结果 一.问题描述 使用MapRe ...

  6. 浅析单一冗余校验RAID缺陷--云存储环境下IP存储设备组建策略

    浅析单一冗余校验RAID缺陷--云存储环境下IP存储设备组建策略 前面的话 摘要 一.当前常见阵列组建模式及云存储环境下IP存储设备特点 1.只求容量及读写性能的RAID0: 2.为了数据安全宁可牺牲 ...

  7. windows下学习linux,在Windows环境下学习Linux命令行的几种方法

    Linux高手通常将Windows工作平台的人鄙视得一无是处, 其实这完全没有必要.请不要装. 对于想进军linux的人来说, 学好linux命令行无疑是最基本的东西. 本文讲述如何在Windows环 ...

  8. linux环境下调试嵌入式设备时出现Aborted、segmentation fault、卡死的问题以及关于指针使用的一点想法

    linux环境下调试一些嵌入式设备时出现Aborted.segmentation fault.卡死的问题,这些问题可能的原因为: 1.Aborted的问题,例如: # ./logUtils0322 [ ...

  9. linux开发 stc_Linux环境下搭建STC单片机平台的指南

    Linux 环境下的头文件定义 编译文件以及转换bin文件等 操作系统:Ubuntu16.04 单片机:STC89C52RC 所需工具: 1.编辑器 - vim 2.编译器 - sdcc 3.转换程序 ...

最新文章

  1. VBScript在服务器上创建目录
  2. win10 家庭版 CredSSP加密Oracle修正 设置方法
  3. postgresql 远程用户_构建Python pandas基于SSH远程MySQL和PostgreSQL的数据分析
  4. AOSP6.0.1 launcher3入门篇—解析launcher.java文件
  5. 如何做一个国产数据库(六) 网络传输 nodejs做测试客户端
  6. 编程实现 带符号减法溢出判断
  7. 工业互联网联盟发布工业物联网安全框架
  8. IT 已成为最疯狂的加班行业,没有之一
  9. html5打印样式没有加载,cad打印样式不见了(cad没有打印样式表)
  10. asp企业建站系统 最新推出的 免费下载
  11. openwrt添加me909s-8201
  12. 3D游戏开发所需的数学基础——矩阵
  13. MSDC 4.3 接口规范(3)
  14. 2019 icpc南昌邀请赛 G Winner
  15. Hadoop fs 常用命令
  16. 个人习惯养成的简单公式
  17. 暴力破解工具——Hydra使用教程
  18. 演讲比赛流程管理系统(C++)
  19. 【调剂】仲恺农业工程学院接收调剂研究生,​优先考虑本科专业为计算机、电子、机电、自动化、物联网等相关专业...
  20. heic(HEIF)格式图像处理(四)

热门文章

  1. 学一下这个60秒的男人
  2. ionic3学习历程(1)
  3. 看懂“天猫双11”支付技术的前世今生,就看懂新商业的变革基础
  4. 控制器和PLC有什么区别?工业网关能用吗?
  5. js replace 全部替换
  6. python数字位数重排_数位重排
  7. 用C#垂直调整Kinect马达的的仰角
  8. 浅谈position属性
  9. 应届生是选大厂offer还是小厂offer?
  10. 关于Linux 自动唤醒和关闭的实现方法