Linux内核驱动开发-USB热插拔信息调取
前言:
前段时间上科大嵌入式安卓开发溜了个作业,开发一个驱动,可以实现读取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测试设备没啥问题。
实验结果呈现(这里为了缩短篇幅,就放一个结果吧):
- 插拔ST-Link
dmesg调试信息显示(### 开头)
用户端读取,USB名称为STM32 STLink
工程代码:
Github
Linux内核驱动开发-USB热插拔信息调取相关推荐
- 嵌入式 Linux 内核驱动开发【The first day: 36093万字】
嵌入式 Linux 内核驱动开发[1] 嵌入式 Linux 内核驱动开发前言 第1章 Linux 内核裁剪和定制 [1]Linux 内核开发简介 [2] Linux 源码阅读工具 [1.2.1]Sou ...
- 树莓派基于Linux内核驱动开发详解
一.驱动认知 首先理解Linux内核框图 文件系统认知,Linux内核框图 1.什么是驱动 linux内核驱动.软件层面上的驱动 广义上是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序 ...
- Linux内核驱动开发的EXPORT_SYMBOL
前言 很抱歉各位粉丝啊,博主好久没有更新原创文章,从今天起开始恢复写文章的时光.前段时间各种不顺利,到时心情低落.现在恢复状态了. 简介 本文主要来讲讲Linux内核驱动中,EXPORT_SYMBOL ...
- Linux内核驱动开发(一)
Linux内核初探 linux操作系统历史 开发模式 git 分布式管理 git clone 获取 git push 提交 git pull 更新 邮件组 mailing list patch 内核代 ...
- linux 内核驱动开发
一.为什么要学习内核? 有些人要学习内核,而有些人则可以不学习它.你如果以后要从事系统研发或驱动开发的话,就要学习内核. 刚刚接触内核,主要学习内核的接口函数.不要深入的去读内核,因为你读也读不懂,内 ...
- Linux 内核驱动开发基础
1.裸板驱动和linux驱动的异同点 裸板驱动:uart驱动程序:uart_inituart_putsuart_getsi2c控制器驱动:i2c_starti2c_stopi2c_txi2c_rxg- ...
- 树莓派基于Linux内核驱动开发
一.驱动认知 1.1 为什么要学习写驱动 树莓派开发简单是因为有厂家提供的wiringPi库,实现超声波,实现继电器操作,做灯的点亮-都非常简单. 但未来做开发时,不一定都是用树莓派,则没有wirin ...
- 第三阶段:43-47.树莓派基于Linux内核驱动开发
目录 一.驱动认知 1.1 为什么要学习写驱动 1.2 文件名与设备号 1.3 open函数打通上层到底层硬件的详细过程 二.基于框架编写驱动代码 2.1 编写上层应用代码 2.2 修改内核驱动框架代 ...
- 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通讯数据格 ...
最新文章
- 理解 CSS 布局和块级格式上下文
- VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)
- MySQL字段拼接Concat
- Session 实现、配置与使用详解
- Linux IO模型漫谈(4)- 非阻塞IO
- STM32F103单片机驱动蜂鸣器
- MyBatis核心流程三大阶段之数据读写阶段
- adobe怎么统计字数_pdf文档统计字数的问题
- 本地获取jqdata的港股通资金数据保存为sql数据库
- 理解O(log2N)和O(Nlog2N)
- ACLSCO链路介绍
- excel选择性粘贴为何是html,Excel选择性粘贴预览有什么功能
- 平滑处理--拉普拉斯(Laplace Smoothing)
- RSA进阶之低加密指数攻击
- Git命令: rebase 和 squash命令
- python 实时获取股票行情脚本
- 自学Java怎样入门
- 计算机仿真cad答案,计算机仿真技术及CAD
- 4 年前端狗 2 年 CTO
- 不是笑话的笑话-《迁徙猿漫漫归家路》
热门文章
- 联想Y50C加内存条
- 学习自旋电子学的笔记01:微磁模拟软件OOMMF的教程(中文版)7.3.5-9章
- 吃鸡显示服务器人太多,《绝地求生》回应服务器不给力:玩家太多
- APP渗透测试准备(一)
- 人工智能洗衣机模糊推理系统实验(课本实验)
- 财务报表分析:理论框架方法与案例
- Yocto系列讲解[技巧篇]47 - bb文件中如何获取源码或指定本地目录
- 英国python工资_就业强势起薪高?英国BA硕士哪家强?!
- android am stop 命令,如何使用am命令启动Android应用
- 前端vue基于onlyoffice实现在线预览