真正做完了USB驱动,看了《Linux那些事》之后,才知道Linux的USB host驱动有多复杂。我做的还只是USB驱动中的一小部分USB转串口。而且还只是读代码和做小的改动,真正写这些的都是天才。

有关USB驱动的部分在我会在别的文章中逐步的介绍,这里介绍的是从Linux内核初始化到USB设备插入USB口到虚拟出tty设备的过程。先上一个原创的图,画的还挺丑的,不过应该能把过程说清楚:

一,Linux系统初始化阶段:

1 在usb.c中的usb_init()函数会调用bus_register(&usb_bus_type)注册一条USB总线。

2 在usb.c中会在这条总线上注册一个驱动程序:usb_generic_driver{

generic_probe()

device_id

}

在这个驱动中包含自己的probe函数和USB设备的ID(注意,这里是设备ID而不是接口的ID)。

3 在usb_serial.c中的usb_serial_init()函数会再次调用bus_register(&usb_serial_bus_type)注册USB转串口总线。

4 usb_serial_init()函数会调用tty_register_driver(usb_serial_tty_driver)向内核注册tty类的设备驱动,并在USB转串口总线上添加这个驱动。

5 option.c中的option_init()函数调用usb_register(&option_driver){

usb_serial_probe()

ids_table{0x19d2,0x0031}

}

在USB总线上注册USB驱动,该驱动是接口的驱动。

6 option.c中的option_init()函数调用usb_serial_register(&option_1port_device)在USB转串口总线上注册驱动option_1port_device(注意,这仅仅是在总线上注册,并不向内核注册)。

到这里,总线跟驱动都已经注册完毕了,就等着设备过来了。

二 从设备插入到进入自己的probe函数——usb_serial_probe()的过程

7 当我们的USB Modem设备插入USB端口时,要调用bus_add_device()在USB总线上添加一个USB设备。

8 该USB设备由于有USB设备号,会找到刚才注册的usb_generic_driver中的generic_probe()函数,在这个函数中经过一系列的函数调用最后会  进入usb_set_configuration()。

9 usb_set_configuration()函数会根据HOST和Device沟通的情况,进行总线枚举,这个我们的设备会生成3个interface,该函数会依次将这三个interface添加到USB总线上。

10 每个interface会根据VID和PID找到合适自己的probe函数,这里我们设备的三个接口会依次进入usb_serial_probe()。

三 从进入自己的probe到虚拟出ttyUSB设备

11 在usb_serial_probe()中,首先生成三个usb_serial_port,port1,port2,port3。接着调用device add()函数 。。。。。。。。(这段有待考证)调用tty_register_device()。

12 tty_register_device()函数主要做了三件事:

(1)向系统注册这三个串口设备。

(2)将串口设备,次设备号,串口驱动usb_serial_tty_driver绑定到一起。

(3)在/dev目录下生成/dev/ttyUSB1,/dev/ttyUSB2,/dev/ttyUSB3三个设备。

linux内核ttyusb实现,[zhuan]Linux的USB-Serial驱动(从系统初始化到生成tty设备的全过程)...相关推荐

  1. ubuntu linux内核版本>5.15安装usb无线网卡驱动

    真没想到ubuntu 22.04上安装无线网卡驱动这么曲折! 系统:ubuntu 22.04 我的网卡芯片为:RTL8812AU 遇到的问题: 内核版本与大多现有驱动不兼容 比如我买的绿联网卡,芯片为 ...

  2. linux网卡驱动rtl8188cu,linux下编译基于rtl8188cu控制芯片的USB无线网卡驱动 -电脑资料...

    本人因为实验的需要,需要在嵌入式linux环境下添加wifi功能,通过在网上调研,选择基于rtl8188cu控制芯片的水星NW150UM无线USB网卡,现简单记录下配置过程, 1.下载最新的rtl81 ...

  3. linux内核培训广州,嵌入式Linux驱动开发高级培训班-华清远见嵌入式培训中心

    课程目标 本课程以案例教学为主,系统地介绍Linux下有关FrameBuffer.MMC卡.USB设备的驱动程序开发.参加本课程学习的学员,因为具备了Linux设备驱动开发基础,所以本课程针对性较强, ...

  4. 搭建《深入Linux内核架构》的Linux环境

    搭建<深入Linux内核架构>的Linux环境 阅读目录(Content) 作者 软件 概述 正文 一.安装GCC 二.编译Linux内核 三.制作跟文件系统 四.运行qemu 五.启动l ...

  5. linux内核 lts长期演进,Linux Kernel 4.19 将成为下一个LTS(长期支持)系列

    最近Linux内核开发人员和维护人员Greg Kroah-Hartman透露,Linux Kernel 4.19将下一个长期支持的Linux内核系列. 现在Linux Kernel 4.17已经达到使 ...

  6. linux内核竞争条件漏洞,Linux内核竞争条件漏洞-导致远程代码执行

    原标题: Linux内核竞争条件漏洞-导致远程代码执行 导读*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. 运行了Linux发行版 ...

  7. Linux内核网络数据发送(六)——网络设备驱动

    Linux内核网络数据发送(六)--网络设备驱动 1. 前言 2. 驱动回调函数注册 3. `ndo_start_xmit` 发送数据 4. `igb_tx_map` 1. 前言 本文主要介绍设备通过 ...

  8. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

  9. 【Linux 内核】进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )

    文章目录 一.Linux 内核中的进程状态 二.TASK_RUNNING 状态 三.TASK_RUNNING 状态 四.TASK_UNINTERRUPTIBLE 状态 五.__TASK_STOPPED ...

最新文章

  1. 机器学习已能翻译失传已久的语言
  2. 数据中心空调施工工序工艺管理要点
  3. redis:消息发布与订阅频道
  4. portainer MySQL_portainer
  5. 《面向机器智能的TensorFlow实践》一 2.8 测试TensorFlow、Jupyter Notebook及matplotlib...
  6. arcgis栅格邻域统计_运用ArcGIS进行影像分类
  7. (原创)javascript进阶(三)
  8. popen函数的实现
  9. vue使用echarts地图数据分析
  10. 思维导图——史上最详细的计算机基础进制转换讲解
  11. 快速在网站跳转支付宝付款链接
  12. ls、du命令的用法
  13. RecyclerView+自定义IndexBar实现自定义带索引的通讯录
  14. 产品狗的Python之路(2):excel表格拆分桌面小程序
  15. V神最新发文:Rollups有望成为以太坊扩容的基石
  16. 腾云忆想构建云化IT生态,助力我国“双循环经济”数字化升级
  17. Docker下删除镜像报错 (cannot be forced) - image has dependent child images
  18. 梁静茹晒巨肚孕照引惊叹 被疑怀双胞胎
  19. python表单验证wtf_关于python 3.x:无法验证Flask WTF-Form
  20. 毕业设计 stm32地下井盖管道安全监控系统 - 物联网 单片机

热门文章

  1. golang基础02
  2. PS VR发售临近,索尼的VR影视内容也不远了
  3. 第 2 章 MongoDB
  4. 技术变革解锁人文新维度
  5. 《Redis官方文档》Redis简介
  6. HTTP协议:GET请求
  7. Windows连接Linux的常用工具
  8. NeHe OpenGL第二十五课:变形
  9. 基础管理薄弱服装企业如何实施ERP
  10. Python3 GUI:PyQt5环境搭建