图书介绍

Linux驱动开发入门与实战 第2版2025|PDF|Epub|mobi|kindle电子书版本百度云盘下载

Linux驱动开发入门与实战 第2版
  • 郑强等编著 著
  • 出版社: 北京:清华大学出版社
  • ISBN:9787302337768
  • 出版时间:2014
  • 标注页数:435页
  • 文件大小:124MB
  • 文件页数:454页
  • 主题词:Linux操作系统

PDF下载


点此进入-本书在线PDF格式电子书下载【推荐-云解压-方便快捷】直接下载PDF格式图书。移动端-PC端通用
种子下载[BT下载速度快]温馨提示:(请使用BT下载软件FDM进行下载)软件下载地址页直链下载[便捷但速度慢]  [在线试读本书]   [在线获取解压码]

下载说明

Linux驱动开发入门与实战 第2版PDF格式电子书版下载

下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。

建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!

(文件页数 要大于 标注页数,上中下等多册电子书除外)

注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具

图书目录

第1篇 Linux驱动开发基础2

第1章 Linux驱动开发概述2

1.1 Linux设备驱动的基本概念2

1.1.1 设备驱动程序概述2

1.1.2 设备驱动程序的作用2

1.1.3 设备驱动的分类3

1.2 Linux操作系统与驱动的关系4

1.3 Linux驱动程序开发4

1.3.1 用户态和内核态4

1.3.2 模块机制5

1.3.3 编写设备驱动程序需要了解的知识6

1.4 编写设备驱动程序的注意事项6

1.4.1 应用程序开发与驱动程序开发的差异6

1.4.2 GUN C开发驱动程序7

1.4.3 不能使用C库开发驱动程序7

1.4.4 没有内存保护机制8

1.4.5 小内核栈8

1.4.6 重视可移植性8

1.5 Linux驱动的发展趋势9

1.5.1 Linux驱动的发展9

1.5.2 驱动的应用9

1.5.3 相关学习资源9

1.6 小结10

第2章 嵌入式处理器和开发板简介11

2.1 处理器的选择11

2.1.1 处理器简述11

2.1.2 处理器的种类11

2.2 ARM处理器13

2.2.1 ARM处理器简介14

2.2.2 ARM处理器系列14

2.2.3 ARM处理器的应用16

2.2.4 ARM处理器的选型16

2.2.5 ARM处理器选型举例19

2.3 S3C2440开发板20

2.3.1 S3C2440开发板简介20

2.3.2 S3C2440开发板的特性20

2.3.3 其他开发板22

2.4 小结22

第3章 构建嵌入式驱动程序开发环境23

3.1 虚拟机和Linux安装23

3.1.1 在Windows上安装虚拟机23

3.1.2 在虚拟机上安装Linux27

3.1.3 设置共享目录29

3.2 代码阅读工具Source Insight29

3.2.1 Source Insight简介30

3.2.2 阅读源代码30

3.3 小结33

第4章 构建嵌入式Linux操作系统34

4.1 Linux操作系统的介绍34

4.1.1 Linux操作系统34

4.1.2 Linux操作系统的优点35

4.2 Linux内核子系统36

4.2.1 进程管理36

4.2.2 内存管理37

4.2.3 文件系统37

4.2.4 设备管理38

4.2.5 网络功能38

4.3 Linux源代码结构分析38

4.3.1 arch目录38

4.3.2 drivers目录39

4.3.3 fs目录39

4.3.4 其他目录40

4.4 内核配置选项41

4.4.1 配置编译过程41

4.4.2 常规配置42

4.4.3 模块配置44

4.4.4 块设备层配置44

4.4.5 CPU类型和特性配置45

4.4.6 电源管理配置47

4.4.7 总线配置49

4.4.8 网络配置50

4.4.9 设备驱动配置53

4.4.10 文件系统配置60

4.5 嵌入式文件系统基础知识62

4.5.1 嵌入式文件系统62

4.5.2 嵌入式系统的存储介质63

4.5.3 JFFS文件系统64

4.5.4 YAFFS文件系统64

4.6 构建根文件系统64

4.6.1 根文件系统概述65

4.6.2 Linux根文件系统目录结构65

4.6.3 BusyBox构建根文件系统66

4.7 小结71

第5章 构建第一个驱动程序72

5.1 开发环境配置之内核升级72

5.1.1 为什么升级内核72

5.1.2 内核升级73

5.1.3 make menconfig的注意事项75

5.2 Hello World驱动程序77

5.2.1 驱动模块的组成77

5.2.2 Hello World模块78

5.2.3 编译Hello World模块79

5.2.4 模块的操作81

5.2.5 Hello World模块加载后文件系统的变化82

5.3 模块参数和模块之间通信82

5.3.1 模块参数83

5.3.2 模块的文件格式ELF83

5.3.3 模块之间的通信84

5.3.4 模块之间的通信实例84

5.4 将模块加入内核88

5.4.1 向内核添加模块88

5.4.2 Kconfig88

5.4.3 Kconfig的语法89

5.4.4 应用实例:在内核中新增加add_sub模块92

5.4.5 对add_sub模块进行配置93

5.5 小结95

第6章 简单的字符设备驱动程序96

6.1 字符设备驱动程序框架96

6.1.1 字符设备和块设备96

6.1.2 主设备号和次设备号97

6.1.3 申请和释放设备号98

6.2 初识cdev结构99

6.2.1 cdev结构体99

6.2.2 file_operations结构体101

6.2.3 cdev和file_operations结构体的关系102

6.2.4 inode结构体102

6.3 字符设备驱动的组成103

6.3.1 字符设备加载和卸载函数103

6.3.2 file_operations结构体和其成员函数104

6.3.3 驱动程序与应用程序的数据交换105

6.3.4 字符设备驱动程序组成小结106

6.4 VirtualDisk字符设备驱动106

6.4.1 VirtualDisk的头文件、宏和设备结构体106

6.4.2 加载和卸载驱动程序107

6.4.3 cdev的初始化和注册108

6.4.4 打开和释放函数109

6.4.5 读写函数110

6.4.6 seek()函数111

6.4.7 ioctl()函数112

6.5 小结113

第2篇 Linux驱动开发核心技术116

第7章 设备驱动中的并发控制116

7.1 并发与竞争116

7.2 原子变量操作116

7.2.1 原子变量操作116

7.2.2 原子整型操作117

7.2.3 原子位操作119

7.3 自旋锁120

7.3.1 自旋锁概述120

7.3.2 自旋锁的使用120

7.3.3 自旋锁的使用注意事项122

7.4 信号量122

7.4.1 信号量概述122

7.4.2 信号量的实现123

7.4.3 信号量的使用123

7.4.4 自旋锁与信号量的对比125

7.5 完成量126

7.5.1 完成量概述126

7.5.2 完成量的实现126

7.5.3 完成量的使用127

7.6 小结128

第8章 设备驱动中的阻塞和同步机制129

8.1 阻塞和非阻塞129

8.2 等待队列130

8.2.1 等待队列概述130

8.2.2 等待队列的实现130

8.2.3 等待队列的使用130

8.3 同步机制实验132

8.3.1 同步机制设计132

8.3.2 实验验证136

8.4 小结137

第9章 中断与时钟机制138

9.1 中断简述138

9.1.1 中断的概念138

9.1.2 中断的宏观分类139

9.1.3 中断产生的位置分类139

9.1.4 同步和异步中断140

9.1.5 中断小结140

9.2 中断的实现过程140

9.2.1 中断信号线(IRQ)140

9.2.2 中断控制器141

9.2.3 中断处理过程141

9.2.4 中断的安装与释放142

9.3 按键中断实例143

9.3.1 按键设备原理图143

9.3.2 有寄存器设备和无寄存器设备144

9.3.3 按键设备相关端口寄存器144

9.4 按键中断实例程序分析146

9.4.1 按键驱动程序组成147

9.4.2 初始化函数s3c2440_buttons_init()147

9.4.3 中断处理函数isr_button()148

9.4.4 退出函数s3c2440_buttons_exit()149

9.5 时钟机制149

9.5.1 时间度量149

9.5.2 时间延时150

9.6 小结151

第10章 内外存访问152

10.1 内存分配152

10.1.1 kmalloc()函数152

10.1.2 vmalloc()函数153

10.1.3 后备高速缓存155

10.2 页面分配156

10.2.1 内存分配156

10.2.2 物理地址和虚拟地址之间的转换159

10.3 设备I/O端口的访问160

10.3.1 Linux I/O端口读写函数160

10.3.2 I/O内存读写160

10.3.3 使用I/O端口164

10.4 小结166

第3篇 LinuX驱动开发实用实战168

第11章 设备驱动模型168

11.1 设备驱动模型概述168

11.1.1 设备驱动模型的功能168

11.1.2 sysfs文件系统169

11.1.3 sysfs文件系统的目录结构170

11.2 设备驱动模型的核心数据结构171

11.2.1 kobject结构体171

11.2.2 设备属性kobj_type175

11.3 注册kobject到sysfs中的实例179

11.3.1 设备驱动模型结构179

11.3.2 kset集合179

11.3.3 kset与kobject的关系181

11.3.4 kset相关的操作函数182

11.3.5 注册kobject到sysfs中的实例183

11.3.6 实例测试187

11.4 设备驱动模型的三大组件188

11.4.1 总线188

11.4.2 总线属性和总线方法191

11.4.3 设备193

11.4.4 驱动195

11.5 小结198

第12章 RTC实时时钟驱动199

12.1 RTC实时时钟硬件原理199

12.1.1 RTC实时时钟199

12.1.2 RTC实时时钟的功能199

12.1.2 RTC实时时钟的工作原理201

12.2 RTC实时时钟架构205

12.2.1 加载卸载函数205

12.2.2 RTC实时时钟的平台驱动206

12.2.3 RTC驱动探测函数207

12.2.4 RTC实时时钟的使能函数s3c_rtc_enable()210

12.2.5 RTC实时时钟设置频率函数s3c_rtc_setfreq()211

12.2.6 RTC设备注册函数rtc-device_register()212

12.3 RTC文件系统接口214

12.3.1 文件系统接口rtc_class_ops214

12.3.2 RTC实时时钟打开函数s3c_rtc_open()215

12.3.3 RTC实时时钟关闭函数s3c_rtc_release()216

12.3.4 RTC实时时钟获得时间函数s3c_rtc_gettime()216

12.3.5 RTC实时时钟设置时间函数s3c_rtc_settime()218

12.3.6 RTC驱动探测函数s3c_rtc_getalarm()219

12.3.7 RTC实时时钟设置报警时间函数s3c_rtc_setalarm()220

12.3.8 RTC设置脉冲中断使能函数s3c_rtc_setpie()221

12.3.9 RTC时钟脉冲中断判断函数s3c_rtc_proc()222

12.4 小结222

第13章 看门狗驱动程序223

13.1 看门狗硬件原理223

13.1.1 看门狗223

13.1.2 看门狗工作原理223

13.2 平台设备模型225

13.2.1 平台设备模型226

13.2.2 平台设备226

13.2.3 平台设备驱动228

13.2.4 平台设备驱动的注册和注销229

13.2.5 混杂设备230

13.2.6 混杂设备的注册和注销231

13.3 看门狗设备驱动程序分析231

13.3.1 看门狗驱动程序的一些变量定义231

13.3.2 看门狗模块的加载和卸载函数232

13.3.3 看门狗驱动程序探测函数233

13.3.4 设置看门狗复位时间函数s3c2410wdt_set_heartbeat()234

13.3.5 看门狗的开始函数s3c2410wdt_start()和停止函数s3c24_10wdt_stop()236

13.3.6 看门狗驱动程序移除函数s3c2410wdt_remove()237

13.3.7 平台设备驱动s3c2410wdt_driver中的其他重要函数237

13.3.8 混杂设备的file.operations中的函数238

13.3.9 看门狗中断处理函数s3c2410wdt_irq()241

13.4 小结242

第14章 IIC设备驱动程序243

14.1 IIC设备的总线及其协议243

14.1.1 IIC总线的特点243

14.1.2 IIC总线的信号类型244

14.1.3 IIC总线的数据传输244

14.2 IIC设备的硬件原理244

14.3 IIC设备驱动程序的层次结构246

14.3.1 IIC设备驱动的概述246

14.3.2 IIC设备层247

14.3.3 i2c_driver和i2c_client的关系249

14.3.4 IIC总线层249

14.3.5 IIC设备层和总线层的关系251

14.3.6 写IIC设备驱动的步骤251

14.4 IIC子系统的初始化252

14.4.1 IIC子系统初始化函数i2c_init()252

14.4.2 IIC子系统退出函数i2c_exit()253

14.5 适配器驱动程序253

14.5.1 s3c2440对应的适配器结构体253

14.5.2 IIC适配器加载函数i2c_add_adapter()255

14.5.3 IDR机制256

14.5.4 适配器卸载函数i2c_del_adapter()258

14.5.5 IIC总线通信方法s3c24xx_i2c_algorithm结构体258

14.5.6 适配器的传输函数s3c24xx_i2c_doxfer()260

14.5.7 适配器的中断处理函数s3c24xx_i2c_irq()263

14.5.8 字节传输函数i2s_s3c_irq_nextbyte()265

14.5.9 适配器传输停止函数s3c24xx_i2c_stop()267

14.5.10 中断处理函数的一些辅助函数268

14.6 IIC设备层驱动程序268

14.6.1 IIC设备驱动模块加载和卸载269

14.6.2 探测函数s3c24xx_i2c_probe()270

14.6.3 移除函数s3c24xx_i2c_remove()272

14.6.4 控制器初始化函数s3c24xx_i2c_init()273

14.6.5 设置控制器数据发送频率函数s3c24xx_i2c_clockrate()274

14.7 小结276

第15章 LCD设备驱动程序277

15.1 FrameBuffer概述277

15.1.1 FrameBuffer的概念277

15.1.2 FrameBuffer与应用程序的交互278

15.1.3 FrameBuffer显示原理278

15.1.4 LCD显示原理278

15.2 FrameBuffer的结构分析279

15.2.1 FrameBuffer架构和其关系279

15.2.2 FrameBuffer驱动程序的实现280

15.2.3 FrameBuffer架构及其关系281

15.3 LCD驱动程序分析286

15.3.1 LCD模块的加载和卸载函数286

15.3.2 LCD驱动程序的平台数据287

15.3.3 LCD模块的探测函数289

15.3.4 移除函数293

15.4 小结294

第16章 触摸屏设备驱动程序295

16.1 触摸屏设备工作原理295

16.1.1 触摸屏设备概述295

16.1.2 触摸屏设备的类型295

16.1.3 电阻式触摸屏296

16.2 触摸屏设备硬件结构296

16.2.1 s3c2440触摸屏接口概述296

16.2.2 s3c2440触摸屏接口的工作模式297

16.2.3 s3c2440触摸屏设备寄存器297

16.3 触摸屏设备驱动程序分析301

16.3.1 触摸屏设备驱动程序组成301

16.3.2 s3c2440触摸屏驱动模块的加载和卸载函数302

16.3.3 s3c2440触摸屏驱动模块的探测函数303

16.3.4 触摸屏设备配置305

16.3.5 触摸屏设备中断处理函数307

16.3.6 s3c2440触摸屏驱动模块的remove()函数311

16.4 测试触摸屏驱动程序312

16.5 小结313

第17章 输入子系统设计314

17.1 input子系统入门314

17.1.1 简单的实例314

17.1.2 注册函数input_register_device()316

17.1.3 向子系统报告事件319

17.2 handler注册分析324

17.2.1 输入子系统的组成325

17.2.2 input_handler结构体325

17.2.3 注册input_handler326

17.2.4 input_handle结构体327

17.2.5 注册input_handle328

17.3 input子系统329

17.3.1 子系统初始化函数input_init()329

17.3.2 文件打开函数input_open_file()330

17.4 evdev输入事件驱动分析331

17.4.1 evdev的初始化331

17.4.2 evdev设备的打开334

17.5 小结336

第18章 块设备驱动程序337

18.1 块设备简介337

18.1.1 块设备总体概述337

18.1.2 块设备的结构338

18.2 块设备驱动程序的架构340

18.2.1 块设备加载过程340

18.2.2 块设备卸载过程341

18.3 通用块层342

18.3.1 通用块层342

18.3.2 alloc_disk()函数对应的gendisk结构体342

18.3.3 块设备的注册和注销344

18.3.4 请求队列345

18.3.5 设置gendisk属性中的block_device_operations结构体346

18.4 不使用请求队列的块设备驱动347

18.4.1 不使用请求队列的块设备驱动程序的组成347

18.4.2 宏定义和全局变量348

18.4.3 加载函数349

18.4.4 卸载函数350

18.4.5 自定义请求处理函数351

18.4.6 驱动的测试352

18.5 I/O调度器355

18.5.1 数据从内存到磁盘的过程355

18.5.2 块I/O请求(bio)355

18.5.3 请求结构(request)358

18.5.4 请求队列(request_queue)360

18.5.5 请求队列、请求结构、bio等之间的关系361

18.5.6 四种调度算法361

18.6 自定义I/O调度器363

18.6.1 Virtual_blkdev块设备的缺陷363

18.6.2 指定noop调度器363

18.6.3 Virtual_blkdev的改进实例364

18.6.4 编译和测试365

18.7 脱离I/O调度器365

18.7.1 请求队列中的bio处理函数365

18.7.2 通用块层函数调用关系367

18.7.3 对Virtual_blkdev块设备的改进369

18.7.4 编译和测试371

18.8 块设备的物理结构372

18.8.1 为Virtual_blkdev块设备添加分区372

18.8.2 对新的Virtual_blkdev代码的分析373

18.8.3 编译和测试374

18.8.4 分区数的计算376

18.8.5 设置Virtual_blkdev的结构377

18.8.6 编译和测试379

18.9 小结383

第19章 USB设备驱动程序384

19.1 USB概述384

19.1.1 USB概念384

19.1.2 USB的特点385

19.1.3 USB总线拓扑结构386

19.1.4 USB驱动总体架构386

19.2 USB设备驱动模型389

19.2.1 USB驱动初探389

19.2.2 USB设备驱动模型392

19.2.3 USB驱动结构usb_driver394

19.3 USB设备驱动程序398

19.3.1 USB设备驱动加载和卸载函数398

19.3.2 探测函数probe()的参数usb_interface400

19.3.3 USB协议中的设备400

19.3.4 端点的传输方式406

19.3.5 设置408

19.3.6 探测函数storage_probe()410

19.4 获得USB设备信息412

19.4.1 设备关联函数associate_dev()412

19.4.2 获得设备信息函数get_device_info()413

19.4.3 得到传输协议get_transport()函数415

19.4.4 获得协议信息函数get_protocol()416

19.4.5 获得管道信息函数get_pipes()417

19.5 资源的初始化420

19.5.1 storage_probe()函数调用过程420

19.5.2 资源获取函数usb_stor_acquire_resources()420

19.5.3 USB请求块(urb)421

19.6 控制子线程425

19.6.1 控制线程425

19.6.2 扫描线程usb_stor_scan_thread()427

19.6.3 获得LUN函数usb_stor_Bulk_max_lun()428

19.7 小结435

热门推荐