您的位置:首页 > 百科 > 正文

Linux驱动开发入门与实战

《Li来自nux驱动开发入门与实战》本书由浅入深,全面、系统地介绍360百科了Linux失新别驱动开发技术,提供了大量的实例供读者实战演练。另外,作者在实例讲解中详细分析了各种重要的理论知识,让读者能够举一反三。

  • 书名 Linux驱动开发入门与实战
  • 作者 郑强
  • 出版社 清华大学出版社
  • 出版时间 2011 年1月
  • 页数 441 页

内容介绍

  来自本书由浅入深,全面、360百科系统地介绍了linux驱动开发技术,提供了大量实例供读者实战演练。另外,作者在实例讲解中详细分析了各种重要的理论知识,让读者能够举一反三。

  本书共分3篇。第1篇介绍了linux驱动开发概述、嵌入式处理器和开发板、构建嵌入式驱动程序开发环境、构建嵌入式linux操作系统、第普仍句注湖一个驱动程序、简单的字符设备驱动程序等内容;第2篇介绍了设振控备驱动中的并发控制、阻塞和同步机制、中断与时钟机制、内存访问等内容;第3篇介绍了设备驱动模型、rtc实时时钟驱动程序、刻结新么都个院自滑苗看门狗驱动程序、iic设备驱动程序、lcd设备驱动程序、触摸屏设备驱动程序、输入子系统驱动程序、块设备驱动程序、usb设备驱动程序等内容。

  作者专门为本书重点内容录制了教学视频,以提高读者的学习效率。另外,本书还赠送了大量的linux拓展学习视频。这些视频和本书源代码需要读者自行下载,下载地址见封面提示。

  本书重点突出,涉及面广,实用性强,从基本知识到核心原理,再到实例开发,几乎涉及linu消静细审x驱动开发的所有重要知识。本书适合所有想学习linux驱动开发的入门人员阅读,也适合作为驱动工程师的参考书,对于linux驱动开发的专业开发人员也有很高的参考价值。

目录

  第1篇 lin位局化ux驱动开发基础

  第1章 linux驱动帮获足白训单开发概述 2

  1.1 lin肥保候电而讲句袁记ux设备驱动的基本概念 2

  1.1.1 设备驱动程序概述 2

  1.1.2 设备驱动程序的作用 2

  1.1.3 设备驱动的分类 3

  1.2 lin最微视排印ux操作系统与驱动的关系 4

  1.3 linux驱动程序开发 4

  1.3.1 用户态和内核态 5

  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 没有内存保纸坏护机制 7

  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.4 小结 22

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

  3.1 虚拟机和linux安装 23

  3.1.1 在windows上安装虚拟机 23

  3.1.2 在虚拟机上安装linux 27

  3.1.3 设置共享目录 28

  3.2 代码阅读工具source insight 29

  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 设备管理 37

  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 模块参数和模块之间通信 83

  5.3.1 模块参数 83

  5.3.2 模块的文件格式elf 83

  5.3.3 模块之间的通信 84

  5.3.4 模块之间的通信实例 85

  5.4 将模块加入内核 88

  5.4.1 向内核添加模块 88

  5.4.2 kconfig 88

  5.4.3 kconfig的语法 89

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

  5.4.5 对add_sub模块进行配置 94

  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结构体 103

  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()函数 113

  6.5 小结 113

  第2篇 linux驱动开发核心技术

  第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.3 等待队列的实现 130

  8.2.3 等待队列的使用 131

  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 中断产生的位置分类 140

  9.1.4 同步和异步中断 140

  9.1.5 中断小结 140

  9.2 中断的实现过程 141

  9.2.1 中断信号线(irq) 141

  9.2.2 中断控制器 141

  9.2.3 中断处理过程 142

  9.2.4 中断的安装与释放 142

  9.3 按键中断实例 144

  9.3.1 按键设备原理图 144

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

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

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

  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 时钟机制 150

  9.5.1 时间度量 150

  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驱动开发实用实战

  第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_type 175

  11.3 注册kobject到sysfs中的实例 179

  11.3.1 设备驱动模型结构 179

  11.3.2 kset集合 180

  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 总线属性和总线方法 192

  11.4.3 设备 194

  11.4.4 驱动 196

  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_ops 214

  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() 222

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

  12.4 小结 223

  第13章 看门狗驱动程序 224

  13.1 看门狗硬件原理 224

  13.1.1 看门狗 224

  13.1.2 看门狗工作原理 224

  13.2 平台设备模型 226

  13.2.1 平台设备模型 226

  13.2.2 平台设备 227

  13.2.3 平台设备驱动 229

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

  13.2.5 混杂设备 231

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

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

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

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

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

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

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

  s3c2410wdt_ stop() 237

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

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

  13.3.8 混杂设备的file_operations中的函数 239

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

  13.4 小结 243

  第14章 iic设备驱动程序 244

  14.1 iic设备的总线及其协议 244

  14.1.1 iic总线的特点 244

  14.1.2 iic总线的信号类型 245

  14.1.3 iic总线的数据传输 245

  14.2 iic设备的硬件原理 246

  14.3 iic设备驱动程序的层次结构 247

  14.3.1 iic设备驱动的概述 248

  14.3.2 iic设备层 248

  14.3.3 i2c_driver和i2c_client的关系 251

  14.3.4 iic总线层 251

  14.3.5 iic设备层和总线层的关系 253

  14.3.6 写iic设备驱动的步骤 253

  14.4 iic子系统的初始化 254

  14.4.1 iic子系统初始化函数i2c_init() 254

  14.4.2 iic子系统退出函数i2c_exit () 254

  14.5 适配器驱动程序 255

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

  14.5.2 iic适配器加载函数i2c_add_adapter() 257

  14.5.3 idr机制 257

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

  14.5.5 iic总线通信方法s3c24xx_i2c_algorithm结构体 260

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

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

  14.5.8 字节传输函数i2s_s3c_irq_nextbyte() 267

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

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

  14.6 iic设备层驱动程序 270

  14.6.1 iic设备驱动模块加载和卸载 271

  14.6.2 探测函数s3c24xx_i2c_probe() 272

  14.6.3 移除函数s3c24xx_i2c_remove() 274

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

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

  14.7 小结 278

  第15章 lcd设备驱动程序 279

  15.1 framebuffer概述 279

  15.1.1 framebuffer的概念 279

  15.1.2 framebuffer与应用程序的交互 280

  15.1.3 framebuffer显示原理 280

  15.1.4 lcd显示原理 281

  15.2 framebuffer的结构分析 281

  15.2.1 framebuffer架构和其关系 281

  15.2.2 framebuffer驱动程序的实现 282

  15.2.3 framebuffer架构及其关系 283

  15.3 lcd驱动程序分析 288

  15.3.1 lcd模块的加载和卸载函数 288

  15.3.2 lcd驱动程序的平台数据 290

  15.3.3 lcd模块的探测函数 291

  15.3.4 移除函数 295

  15.4 小结 296

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

  16.1 触摸屏设备工作原理 297

  16.1.1 触摸屏设备概述 297

  16.1.2 触摸屏设备的类型 297

  16.1.3 电阻式触摸屏 298

  16.2 触摸屏设备硬件结构 298

  16.2.1 s3c2440触摸屏接口概述 298

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

  16.2.3 s3c2440触摸屏设备寄存器 300

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

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

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

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

  16.3.4 触摸屏设备配置 308

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

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

  16.4 测试触摸屏驱动程序 314

  16.5 小结 316

  第17章 输入子系统设计 317

  17.1 input子系统入门 317

  17.1.1 简单的实例 317

  17.1.2 注册函数input_register_device() 319

  17.1.3 向子系统报告事件 323

  17.2 handler注册分析 328

  17.2.1 输入子系统的组成 328

  17.2.2 input_handler结构体 328

  17.2.3 注册input_handler 329

  17.2.4 input_handle结构体 330

  17.2.5 注册input_handle 331

  17.3 input子系统 332

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

  17.3.2 文件打开函数input_open_file() 333

  17.4 evdev输入事件驱动分析 335

  17.4.1 evdev的初始化 335

  17.4.2 evdev设备的打开 337

  17.5 小结 340

  第18章 块设备驱动程序 341

  18.1 块设备简介 341

  18.1.1 块设备总体概述 341

  18.1.2 块设备的结构 342

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

  18.2.1 块设备加载过程 344

  18.2.2 块设备卸载过程 345

  18.3 通用块层 346

  18.3.1 通用块层 346

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

  18.3.3 块设备的注册和注销 349

  18.3.4 请求队列 349

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

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

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

  18.4.2 宏定义和全局变量 352

  18.4.3 加载函数 353

  18.4.4 卸载函数 355

  18.4.5 自定义请求处理函数 355

  18.4.6 驱动的测试 356

  18.5 i/o调度器 359

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

  18.5.2 块i/o请求(bio) 360

  18.5.3 请求结构(request) 363

  18.5.4 请求队列(request_queue) 364

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

  18.5.6 四种调度算法 365

  18.6 自定义i/o调度器 367

  18.6.1 virtual_blkdev块设备的缺陷 367

  18.6.2 指定noop调度器 368

  18.6.3 virtual_blkdev的改进实例 368

  18.6.4 编译和测试 369

  18.7 脱离i/o调度器 370

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

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

  18.7.3 对virtual_blkdev块设备的改进 373

  18.7.4 编译和测试 376

  18.8 块设备的物理结构 377

  18.8.1 为virtual_blkdev块设备添加分区 377

  18.8.2 对新的virtual_blkdev代码的分析 378

  18.8.3 编译和测试 379

  18.8.4 分区数的计算 381

  18.8.5 设置virtual_blkdev的结构 382

  18.8.6 编译和测试 384

  18.9 小结 387

  第19章 usb设备驱动程序 389

  19.1 usb概述 389

  19.1.1 usb概念 389

  19.1.2 usb的特点 390

  19.1.3 usb总线拓扑结构 391

  19.1.4 usb驱动总体架构 391

  19.2 usb设备驱动模型 395

  19.2.1 usb驱动初探 395

  19.2.2 usb设备驱动模型 397

  19.2.3 usb驱动结构usb_driver 399

  19.3 usb设备驱动程序 404

  19.3.1 usb设备驱动加载和卸载函数 404

  19.3.2 探测函数probe()的参数usb_interface 405

  19.3.3 usb协议中的设备 406

  19.3.4 端点的传输方式 412

  19.3.5 设置 413

  19.3.6 探测函数storage_probe() 415

  19.4 获得usb设备信息 418

  19.4.1 设备关联函数associate_dev() 418

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

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

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

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

  19.5 资源的初始化 425

  19.5.1 storage_probe()函数调用过程 425

  19.5.2 资源获取函数usb_stor_acquire_resources() 426

  19.5.3 usb请求块(urb) 427

  19.6 控制子线程 430

  19.6.1 控制线程 431

  19.6.2 扫描线程usb_stor_scan_thread() 433

  19.6.3 获得lun函数usb_stor_bulk_max_lun() 434

  19.7 小结 441

发表评论

评论列表