没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux驱动深度解析:Fasync与同步机制详解
Linux驱动深度解析:Fasync与同步机制详解
需积分: 0 3 下载量 191 浏览量
更新于2024-06-30
收藏 71KB DOCX 举报
本资源主要针对Linux系统深入学习,特别是对于驱动程序开发进行了详细的概述和讲解。首先,它涵盖了Linux内核中的关键模块,如Fasync(异步I/O支持),这涉及到驱动程序如何响应文件描述符(filp)上的FASYNC标志变化,通过实现fasync()函数来处理这些事件。这部分强调了与应用程序通信的重要性,例如使用fcntl()函数设置和修改文件描述符的同步属性。 接着,讨论了同步互斥阻塞,特别是在原子操作方面,介绍了如何利用内核提供的原子操作函数(如atomic_read(), atomic_inc(), atomic_dec())来确保数据的一致性和并发控制。这些操作在保证多线程环境下的数据安全至关重要。 后续内容涵盖了Linux驱动程序的多个具体领域,如输入子系统、LCD和触摸屏驱动、USB驱动、块设备驱动、NAND和NOR FLASH驱动、网络接口卡(NIC)、I2C、RTC(实时时钟)、声卡驱动等,这些内容不仅涉及硬件驱动的编写,还包括了底层通信协议的理解。 此外,还提到了事件管理(uevent)、裸板调试和驱动调试技巧,以及如何进行应用调试,甚至包括如何编写自己的bootloader和移植u-boot以及最新的Linux内核版本(3.4.2)。tslib的编译使用方法也被提及,这对于理解和整合驱动到特定内核版本中至关重要。 最后,资源还包含了如何查看原理图、初接触开发板的基本操作,以及如何将所有驱动迁移到3.4.2内核,以及针对该内核的特定I2C驱动的移植和理解。对于开发者来说,这是一个全面且深入的指南,有助于理解和实践Linux驱动程序开发的各种技能和知识。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/86381697/bgf.jpg)
15
0000090 29a4 0000 ed48 0008 0001 014a 0000 0000
00000a0 29a4 0000 ed4a 0008 0000 0000 0000 0000
使用:
七、USB 设备驱动程序
现象:把 USB 设备接到 PC
1. 右下角弹出"发现 android phone"
2. 跳出一个对话框,提示你安装驱动程序
问 1. 既然还没有"驱动程序",为何能知道是"android phone"
答 1. windows 里已经有了 USB 的总线驱动程序,接入 USB 设备后,是"总线驱动程序"知道
你是"android phone"
提示你安装的是"设备驱动程序"
USB 总线驱动程序负责:识别 USB 设备, 给 USB 设备找到对应的驱动程序
问 2. USB 设备种类非常多,为什么一接入电脑,就能识别出来?
答 2. PC 和 USB 设备都得遵守一些规范。
比如:USB 设备接入电脑后,PC 机会发出"你是什么"?
USB 设备就必须回答"我是 xxx", 并且回答的语言必须是中文
![](https://csdnimg.cn/release/download_crawler_static/86381697/bg10.jpg)
16
USB 总线驱动程序会发出某些命令想获取设备信息(描述符),
USB 设备必须返回"描述符"给 PC
问 3. PC 机上接有非常多的 USB 设备,怎么分辨它们?
USB 接口只有 4 条线: 5V,GND,D-,D+
答 3. 每一个 USB 设备接入 PC 时,USB 总线驱动程序都会给它分配一个编号
接在 USB 总线上的每一个 USB 设备都有自己的编号(地址)
PC 机想访问某个 USB 设备时,发出的命令都含有对应的编号(地址)
问 4. USB 设备刚接入 PC 时,还没有编号;那么 PC 怎么把"分配的编号"告诉它?
答 4. 新接入的 USB 设备的默认编号是 0,在未分配新编号前,PC 使用 0 编号和它通信。
问 5. 为什么一接入 USB 设备,PC 机就能发现它?
答 5. PC 的 USB 口内部,D-和 D+接有 15K 的下拉电阻,未接 USB 设备时为低电平
USB 设备的 USB 口内部,D-或 D+接有 1.5K 的上拉电阻;它一接入 PC,就会把 PC USB
口的 D-或 D+拉高,从硬件的角度通知 PC 有新设备接入
其他概念:
1. USB 是主从结构的
所有的 USB 传输,都是从 USB 主机这方发起;USB 设备没有"主动"通知 USB 主机的能力。
例子:USB 鼠标滑动一下立刻产生数据,但是它没有能力通知 PC 机来读数据,只能被动
地等得 PC 机来读。
2. USB 的传输类型:
a. 控制传输:可靠,时间有保证,比如:USB 设备的识别过程
b. 批量传输: 可靠, 时间没有保证, 比如:U 盘
c. 中断传输:可靠,实时,比如:USB 鼠标
d. 实时传输:不可靠,实时,比如:USB 摄像头
![](https://csdnimg.cn/release/download_crawler_static/86381697/bg11.jpg)
17
3. USB 传输的对象:端点(endpoint)
我们说"读 U 盘"、"写 U 盘",可以细化为:把数据写到 U 盘的端点 1,从 U 盘的端点 2
里读出数据
除了端点 0 外,每一个端点只支持一个方向的数据传输
端点 0 用于控制传输,既能输出也能输入
4. 每一个端点都有传输类型,传输方向
5. 术语里、程序里说的输入(IN)、输出(OUT) "都是" 基于 USB 主机的立场说的。
比如鼠标的数据是从鼠标传到 PC 机, 对应的端点称为"输入端点"
6. USB 总线驱动程序的作用
a. 识别 USB 设备
b. 查找并安装对应的设备驱动程序
c. 提供 USB 读写函数
USB 驱动程序框架:
app:
-------------------------------------------
USB 设备驱动程序 // 知道数据含义
内核 --------------------------------------
USB 总线驱动程序 // 1. 识别, 2. 找到匹配的设备驱动, 3. 提供 USB 读写函
数 (它不知道数据含义)
-------------------------------------------
USB 主机控制器
UHCI OHCI EHCI
硬件 -----------
![](https://csdnimg.cn/release/download_crawler_static/86381697/bg12.jpg)
18
USB 设备
UHCI: intel, 低速(1.5Mbps)/全速(12Mbps)
OHCI: microsoft 低速/全速
EHCI: 高速(480Mbps)
USB 总线驱动程序的作用
1. 识别 USB 设备
1.1 分配地址
1.2 并告诉 USB 设备(set address)
1.3 发出命令获取描述符
描述符的信息可以在 include\linux\usb\Ch9.h 看到
2. 查找并安装对应的设备驱动程序
3. 提供 USB 读写函数
把 USB 设备接到开发板上,看输出信息:
usb 1-1: new full speed USB device using s3c2410-ohci and address 2
usb 1-1: configuration #1 chosen from 1 choice
scsi0 : SCSI emulation for USB Mass Storage devices
scsi 0:0:0:0: Direct-Access HTC Android Phone 0100 PQ: 0 ANSI: 2
sd 0:0:0:0: [sda] Attached SCSI removable disk
拔掉
usb 1-1: USB disconnect, address 2
![](https://csdnimg.cn/release/download_crawler_static/86381697/bg13.jpg)
19
再接上:
usb 1-1: new full speed USB device using s3c2410-ohci and address 3
usb 1-1: configuration #1 chosen from 1 choice
scsi1 : SCSI emulation for USB Mass Storage devices
scsi 1:0:0:0: Direct-Access HTC Android Phone 0100 PQ: 0 ANSI: 2
sd 1:0:0:0: [sda] Attached SCSI removable disk
在内核目录下搜:
grep "USB device using" * -nR
drivers/usb/core/hub.c:2186: "%s %s speed %sUSB device using %s and
address %d\n",
hub_irq
kick_khubd
hub_thread
hub_events
hub_port_connect_change
udev = usb_alloc_dev(hdev, hdev->bus, port1);
dev->dev.bus = &usb_bus_type;
choose_address(udev); // 给新设备分配编号(地址)
hub_port_init // usb 1-1: new full speed USB device using
s3c2410-ohci and address 3
hub_set_address // 把编号(地址)告诉 USB 设备
剩余92页未读,继续阅读
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)