前言:

前段时间上科大嵌入式安卓开发溜了个作业,开发一个驱动,可以实现读取USB热插拔信息,程序调用显示USB设备名称和插拔时间。代码已经放在了我的Github上,供大家参考。

思路:

USB热插拔的读取插拔信息项目应该是USB驱动层的很简单的一个应用。起初我想自己在网上寻找USB插拔信息如何调取,几乎没有什么案例。最终引导我的就是Linux内核网站中USB hotplugging的说明。简单看文档,这似乎就是我想用的东西,USB设备插入后进行识别,虽然要通过usb_device_id进行校验ID,但是只要我把ID范围设的很宽,任意USB设备都可以通过呢?尽管这是一种不完美的方法,但是总比没有路要好。又参考了USB Drive in Linux章节所给的案例,这似乎是难以实现的。usb_driver结构体似乎是针对某种USB设备进行驱动开发所用到的。被迫放弃了这条路。

再考虑老师给的参考函数,注意到notifier_block结构体(内核通知链)似乎就是重点。初始化此结构体,设定.notifier_call函数地址,在函数中,用usb_device结构体指向dev地址。那么对于USB设备的变动通知就可以获取,这里除了老师给的,也参考了Notifier Function。到这里解决了信息如何获取的问题。

依照作业要求,需要添加循环队列缓冲(ring buffer),环形队列实现很简单。图方便,我直接移植了suspend_monitor的部分表述方法。没有直接在suspend_monitor代码的基础上修改,是因为我发现,对于我的这个APP功能要求有很多冗余的地方,不考虑后期工程添加和革新,我需要的功能就只是环形队列和/proc文件交互应用。另外,不管是什么USB设备插拔,都只要放在一个队列中即可,通过一个简单的标志位来判断是插入还是拔出。

通过字符设备驱动方法,让用户和驱动程序交互。这里主要参考了suspend_monitor,使用proc_create的方法,创建/proc/usb_monitor文件。考虑程序简易性,工程中只有读方法(.read),舍去了写方法(.write)。读函数中也参考了suspend_monitor中许多保护和进程阻塞优化的部分。到此,最终实现也只要在用户程序中读取/proc/usb_monitor即可。

总的来说,理清思路后,工程很简单。

工程测试:

实际工程测试,遇到很多有意思的问题。实际环境变化莫测,坑有很多,这也是需要完善的地方。

测试设备有以下(以下顺序和图片从左到右一致):

ST-Link,SanDisk U盘,Arduino UNO(板载USB转Serial芯片),有线鼠标

前期测试遇到的问题

读取USB设备名称可以直接访问usb_device下的product参数。product的类型是char*,如果没有设备名称那么,product就会是一个NULL指针。这是不允许在我的字符串读取操作之中的。由于之前没有经验,没有考虑到这个问题,在几次测试中,直接导致我的驱动出错,系统死机。这样的USB设备我直接命名为NULL。

这个设备就是Arduino UNO(板载USB转Serial芯片),一个很简单的单片机开发板。其他的USB测试设备没啥问题。

实验结果呈现(这里为了缩短篇幅,就放一个结果吧):

  1. 插拔ST-Link

dmesg调试信息显示(### 开头)

用户端读取,USB名称为STM32 STLink

工程代码:

  Github

Linux内核驱动开发-USB热插拔信息调取相关推荐

  1. 嵌入式 Linux 内核驱动开发【The first day: 36093万字】

    嵌入式 Linux 内核驱动开发[1] 嵌入式 Linux 内核驱动开发前言 第1章 Linux 内核裁剪和定制 [1]Linux 内核开发简介 [2] Linux 源码阅读工具 [1.2.1]Sou ...

  2. 树莓派基于Linux内核驱动开发详解

    一.驱动认知 首先理解Linux内核框图 文件系统认知,Linux内核框图 1.什么是驱动 linux内核驱动.软件层面上的驱动 广义上是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序 ...

  3. Linux内核驱动开发的EXPORT_SYMBOL

    前言 很抱歉各位粉丝啊,博主好久没有更新原创文章,从今天起开始恢复写文章的时光.前段时间各种不顺利,到时心情低落.现在恢复状态了. 简介 本文主要来讲讲Linux内核驱动中,EXPORT_SYMBOL ...

  4. Linux内核驱动开发(一)

    Linux内核初探 linux操作系统历史 开发模式 git 分布式管理 git clone 获取 git push 提交 git pull 更新 邮件组 mailing list patch 内核代 ...

  5. linux 内核驱动开发

    一.为什么要学习内核? 有些人要学习内核,而有些人则可以不学习它.你如果以后要从事系统研发或驱动开发的话,就要学习内核. 刚刚接触内核,主要学习内核的接口函数.不要深入的去读内核,因为你读也读不懂,内 ...

  6. Linux 内核驱动开发基础

    1.裸板驱动和linux驱动的异同点 裸板驱动:uart驱动程序:uart_inituart_putsuart_getsi2c控制器驱动:i2c_starti2c_stopi2c_txi2c_rxg- ...

  7. 树莓派基于Linux内核驱动开发

    一.驱动认知 1.1 为什么要学习写驱动 树莓派开发简单是因为有厂家提供的wiringPi库,实现超声波,实现继电器操作,做灯的点亮-都非常简单. 但未来做开发时,不一定都是用树莓派,则没有wirin ...

  8. 第三阶段:43-47.树莓派基于Linux内核驱动开发

    目录 一.驱动认知 1.1 为什么要学习写驱动 1.2 文件名与设备号 1.3 open函数打通上层到底层硬件的详细过程 二.基于框架编写驱动代码 2.1 编写上层应用代码 2.2 修改内核驱动框架代 ...

  9. linux内核驱动开发 培训,嵌入式Linux驱动开发培训 - 华清远见教育集团官网

    9.LINUX下USB驱动开发基础 9.1 USB规范介绍 9.2 USB主机控制器 9.3 USB HUB 9.4 USB设备状态 9.5 USB描述符 9.6 USB请求 9.7 USB通讯数据格 ...

最新文章

  1. 理解 CSS 布局和块级格式上下文
  2. VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)
  3. MySQL字段拼接Concat
  4. Session 实现、配置与使用详解
  5. Linux IO模型漫谈(4)- 非阻塞IO
  6. STM32F103单片机驱动蜂鸣器
  7. MyBatis核心流程三大阶段之数据读写阶段
  8. adobe怎么统计字数_pdf文档统计字数的问题
  9. 本地获取jqdata的港股通资金数据保存为sql数据库
  10. 理解O(log2N)和O(Nlog2N)
  11. ACLSCO链路介绍
  12. excel选择性粘贴为何是html,Excel选择性粘贴预览有什么功能
  13. 平滑处理--拉普拉斯(Laplace Smoothing)
  14. RSA进阶之低加密指数攻击
  15. Git命令: rebase 和 squash命令
  16. python 实时获取股票行情脚本
  17. 自学Java怎样入门
  18. 计算机仿真cad答案,计算机仿真技术及CAD
  19. 4 年前端狗 2 年 CTO
  20. 不是笑话的笑话-《迁徙猿漫漫归家路》

热门文章

  1. 联想Y50C加内存条
  2. 学习自旋电子学的笔记01:微磁模拟软件OOMMF的教程(中文版)7.3.5-9章
  3. 吃鸡显示服务器人太多,《绝地求生》回应服务器不给力:玩家太多
  4. APP渗透测试准备(一)
  5. 人工智能洗衣机模糊推理系统实验(课本实验)
  6. 财务报表分析:理论框架方法与案例
  7. Yocto系列讲解[技巧篇]47 - bb文件中如何获取源码或指定本地目录
  8. 英国python工资_就业强势起薪高?英国BA硕士哪家强?!
  9. android am stop 命令,如何使用am命令启动Android应用
  10. 前端vue基于onlyoffice实现在线预览