Linux驱动开发入门与实战


Linux驱动开发入门与实战

文章插图
Linux驱动开发入门与实战【Linux驱动开发入门与实战】《Linux驱动开发入门与实战》本书由浅入深,全面、系统地介绍了Linux驱动开发技术,提供了大量实例供读者实战演练 。另外,作者在实例讲解中详细分析了各种重要的理论知识,让读者能够举一反三 。
基本介绍书名:Linux驱动开发入门与实战
作者:郑强
ISBN:9787302239215
页数:441
出版社:清华大学出版社
出版时间:2011 年1月
开本:16
丛书名:Linux典藏大系
内容简介本书由浅入深,全面、系统地介绍了linux驱动开发技术,提供了大量实例供读者实战演练 。另外,作者在实例讲解中详细分析了各种重要的理论知识,让读者能够举一反三 。本书共分3篇 。第1篇介绍了linux驱动开发概述、嵌入式处理器和开发板、构建嵌入式驱动程式开发环境、构建嵌入式linux作业系统、第一个驱动程式、简单的字元设备驱动程式等内容;第2篇介绍了设备驱动中的并发控制、阻塞和同步机制、中断与时钟机制、记忆体访问等内容;第3篇介绍了设备驱动模型、rtc实时时钟驱动程式、看门狗驱动程式、iic设备驱动程式、lcd设备驱动程式、触控萤幕设备驱动程式、输入子系统驱动程式、块设备驱动程式、usb设备驱动程式等内容 。作者专门为本书重点内容录製了教学视频,以提高读者的学习效率 。另外,本书还赠送了大量的linux拓展学习视频 。这些视频和本书原始码需要读者自行下载,下载地址见封面提示 。本书重点突出,涉及面广,实用性强,从基本知识到核心原理,再到实例开发,几乎涉及linux驱动开发的所有重要知识 。本书适合所有想学习linux驱动开发的入门人员阅读,也适合作为驱动工程师的参考书,对于linux驱动开发的专业开发人员也有很高的参考价值 。目录第1篇 linux驱动开发基础第1章 linux驱动开发概述 21.1 linux设备驱动的基本概念 21.1.1 设备驱动程式概述 21.1.2 设备驱动程式的作用 21.1.3 设备驱动的分类 31.2 linux作业系统与驱动的关係 41.3 linux驱动程式开发 41.3.1 用户态和核心态 51.3.2 模组机制 51.3.3 编写设备驱动程式需要了解的知识 61.4 编写设备驱动程式的注意事项 61.4.1 应用程式开发与驱动程式开发的差异 61.4.2 gun c开发驱动程式 71.4.3 不能使用c库开发驱动程式 71.4.4 没有记忆体保护机制 71.4.5 小核心栈 81.4.6 重视可移植性 81.5 linux驱动的发展趋势 91.5.1 linux驱动的发展 9.1.5.2 驱动的套用 91.5.3 相关学习资源 91.6 小结 10第2章 嵌入式处理器和开发板简介 112.1 处理器的选择 112.1.1 处理器简述 112.1.2 处理器的种类 112.2 arm处理器 132.2.1 arm处理器简介 142.2.2 arm处理器系列 142.2.3 arm处理器的套用 162.2.4 arm处理器的选型 162.2.5 arm处理器选型举例 192.3 s3c2440开发板 202.3.1 s3c2440开发板简介 202.3.2 s3c2440开发板的特性 202.4 小结 22第3章 构建嵌入式驱动程式开发环境 233.1 虚拟机和linux安装 233.1.1 在windows上安装虚拟机 233.1.2 在虚拟机上安装linux 273.1.3 设定已分享资料夹 283.2 代码阅读工具source insight 293.2.1 source insight简介 303.2.2 阅读原始码 303.3 小结 33第4章 构建嵌入式linux作业系统 344.1 linux作业系统的介绍 344.1.1 linux作业系统 344.1.2 linux作业系统的优点 354.2 linux核心子系统 364.2.1 进程管理 364.2.2 记忆体管理 374.2.3 档案系统 374.2.4 设备管理 374.2.5 网路功能 384.3 linux原始码结构分析 384.3.1 arch目录 384.3.2 drivers目录 394.3.3 fs目录 394.3.4 其他目录 404.4 核心配置选项 414.4.1 配置编译过程 414.4.2 常规配置 424.4.3 模组配置 444.4.4 块设备层配置 444.4.5 cpu类型和特性配置 454.4.6 电源管理配置 474.4.7 汇流排配置 494.4.8 网路配置 504.4.9 设备驱动配置 534.4.10 档案系统配置 604.5 嵌入式档案系统基础知识 624.5.1 嵌入式档案系统 624.5.2 嵌入式系统的存储介质 634.5.3 jffs档案系统 644.5.4 yaffs档案系统 644.6 构建根档案系统 644.6.1 根档案系统概述 654.6.2 linux根档案系统目录结构 654.6.3 busybox构建根档案系统 664.7 小结 71第5章 构建第一个驱动程式 725.1 开发环境配置之核心升级 725.1.1 为什幺升级核心 725.1.2 核心升级 735.1.3 make menconfig的注意事项 755.2 hello world驱动程式 775.2.1 驱动模组的组成 775.2.2 hello world模组 785.2.3 编译hello world模组 795.2.4 模组的操作 815.2.5 hello world模组载入后档案系统的变化 82 5.3 模组参数和模组之间通信 835.3.1 模组参数 835.3.2 模组的档案格式elf 835.3.3 模组之间的通信 845.3.4 模组之间的通信实例 855.4 将模组加入核心 885.4.1 向核心添加模组 885.4.2 kconfig 885.4.3 kconfig的语法 895.4.4 套用实例:在核心中新增加add_sub模组 925.4.5 对add_sub模组进行配置 945.5 小结 95第6章 简单的字元设备驱动程式 966.1 字元设备驱动程式框架 966.1.1 字元设备和块设备 966.1.2 主设备号和次设备号 976.1.3 申请和释放设备号 986.2 初识cdev结构 996.2.1 cdev结构体 996.2.2 file_operations结构体 1016.2.3 cdev和file_operations结构体的关係 1026.2.4 inode结构体 1036.3 字元设备驱动的组成 1036.3.1 字元设备载入和卸载函式 1036.3.2 file_operations结构体和其成员函式 1046.3.3 驱动程式与应用程式的数据交换 1056.3.4 字元设备驱动程式组成小结 1066.4 virtualdisk字元设备驱动 1066.4.1 virtualdisk的头档案、宏和设备结构体 1066.4.2 载入和卸载驱动程式 1076.4.3 cdev的初始化和注册 1086.4.4 打开和释放函式 1096.4.5 读写函式 1106.4.6 seek()函式 1116.4.7 ioctl()函式 1136.5 小结 113第2篇 linux驱动开发核心技术第7章 设备驱动中的并发控制 1167.1 并发与竞争 1167.2 原子变数操作 1167.2.1 原子变数操作 1167.2.2 原子整型操作 1177.2.3 原子位操作 1197.3 自旋锁 1207.3.1 自旋锁概述 1207.3.2 自旋锁的使用 1207.3.3 自旋锁的使用注意事项 1227.4 信号量 1227.4.1 信号量概述 1227.4.2 信号量的实现 1237.4.3 信号量的使用 1237.4.4 自旋锁与信号量的对比 1257.5 完成量 1267.5.1 完成量概述 1267.5.2 完成量的实现 1267.5.3 完成量的使用 1277.6 小结 128第8章 设备驱动中的阻塞和同步机制 1298.1 阻塞和非阻塞 1298.2 等待伫列 1308.2.1 等待伫列概述 1308.2.3 等待伫列的实现 130 8.2.3 等待伫列的使用 1318.3 同步机制实验 1328.3.1 同步机制设计 1328.3.2 实验验证 1368.4 小结 137第9章 中断与时钟机制 1389.1 中断简述 1389.1.1 中断的概念 1389.1.2 中断的巨观分类 1399.1.3 中断产生的位置分类 1409.1.4 同步和异步中断 1409.1.5 中断小结 1409.2 中断的实现过程 1419.2.1 中断信号线(irq) 1419.2.2 中断控制器 1419.2.3 中断处理过程 1429.2.4 中断的安装与释放 1429.3 按键中断实例 1449.3.1 按键设备原理图 1449.3.2 有暂存器设备和无暂存器设备 1449.3.3 按键设备相关连线埠暂存器 1459.4 按键中断实例程式分析 1479.4.1 按键驱动程式组成 1479.4.2 初始化函式s3c2440_buttons_init() 1479.4.3 中断处理函式isr_button() 1489.4.4 退出函式s3c2440_buttons_exit() 1499.5 时钟机制 1509.5.1 时间度量 1509.5.2 时间延时 1509.6 小结 151第10章 内外存访问 15210.1 记忆体分配 15210.1.1 kmalloc()函式 15210.1.2 vmalloc()函式 15310.1.3 后备高速快取 15510.2 页面分配 15610.2.1 记忆体分配 15610.2.2 物理地址和虚拟地址之间的转换 15910.3 设备i/o连线埠的访问 16010.3.1 linux i/o连线埠读写函式 16010.3.2 i/o记忆体读写 16010.3.3 使用i/o连线埠 16410.4 小结 166第3篇 linux驱动开发实用实战第11章 设备驱动模型 16811.1 设备驱动模型概述 16811.1.1 设备驱动模型的功能 16811.1.2 sysfs档案系统 16911.1.3 sysfs档案系统的目录结构 17011.2 设备驱动模型的核心数据结构 17111.2.1 kobject结构体 17111.2.2 设备属性kobj_type 17511.3 注册kobject到sysfs中的实例 17911.3.1 设备驱动模型结构 17911.3.2 kset集合 18011.3.3 kset与kobject的关係 18111.3.4 kset相关的操作函式 182 11.3.5 注册kobject到sysfs中的实例 18311.3.6 实例测试 18711.4 设备驱动模型的三大组件 18811.4.1 汇流排 18811.4.2 汇流排属性和汇流排方法 19211.4.3 设备 19411.4.4 驱动 19611.5 小结 198第12章 rtc实时时钟驱动 19912.1 rtc实时时钟硬体原理 19912.1.1 rtc实时时钟 19912.1.2 rtc实时时钟的功能 19912.1.2 rtc实时时钟的工作原理 20112.2 rtc实时时钟架构 20512.2.1 载入卸载函式 20512.2.2 rtc实时时钟的平台驱动 20612.2.3 rtc驱动探测函式 20712.2.4 rtc实时时钟的使能函式s3c_rtc_enable() 21012.2.5 rtc实时时钟设定频率函式s3c_rtc_setfreq() 21112.2.6 rtc设备注册函式 rtc_device_register() 21212.3 rtc档案系统接口 21412.3.1 档案系统接口rtc_class_ops 21412.3.2 rtc实时时钟打开函式s3c_rtc_open() 21512.3.3 rtc实时时钟关闭函式s3c_rtc_release() 21612.3.4 rtc实时时钟获得时间函式s3c_rtc_gettime() 21612.3.5 rtc实时时钟设定时间函式s3c_rtc_settime() 21812.3.6 rtc驱动探测函式s3c_rtc_getalarm() 21912.3.7 rtc实时时钟设定报警时间函式s3c_rtc_setalarm() 22012.3.8 rtc设定脉冲中断使能函式s3c_rtc_setpie() 22212.3.9 rtc时钟脉冲中断判断函式s3c_rtc_proc() 22212.4 小结 223第13章 看门狗驱动程式 22413.1 看门狗硬体原理 22413.1.1 看门狗 22413.1.2 看门狗工作原理 22413.2 平台设备模型 22613.2.1 平台设备模型 22613.2.2 平台设备 22713.2.3 平台设备驱动 22913.2.4 平台设备驱动的注册和注销 23013.2.5 混杂设备 23113.2.6 混杂设备的注册和注销 23213.3 看门狗设备驱动程式分析 23213.3.1 看门狗驱动程式的一些变数定义 23213.3.2 看门狗模组的载入和卸载函式 233 13.3.3 看门狗驱动程式探测函式 23413.3.4 设定看门狗复位时间函式s3c2410wdt_set_heartbeat() 23513.3.5 看门狗的开始函式s3c2410wdt_start()和停止函式s3c2410wdt_ stop() 23713.3.6 看门狗驱动程式移除函式s3c2410wdt_remove() 23813.3.7 平台设备驱动s3c2410wdt_driver中的其他重要函式 23813.3.8 混杂设备的file_operations中的函式 23913.3.9 看门狗中断处理函式s3c2410wdt_irq() 24213.4 小结 243第14章 iic设备驱动程式 24414.1 iic设备的汇流排及其协定 24414.1.1 iic汇流排的特点 24414.1.2 iic汇流排的信号类型 24514.1.3 iic汇流排的数据传输 24514.2 iic设备的硬体原理 24614.3 iic设备驱动程式的层次结构 24714.3.1 iic设备驱动的概述 24814.3.2 iic设备层 24814.3.3 i2c_driver和i2c_client的关係 25114.3.4 iic汇流排层 25114.3.5 iic设备层和汇流排层的关係 25314.3.6 写iic设备驱动的步骤 25314.4 iic子系统的初始化 25414.4.1 iic子系统初始化函式i2c_init() 25414.4.2 iic子系统退出函式i2c_exit () 25414.5 适配器驱动程式 25514.5.1 s3c2440对应的适配器结构体 25514.5.2 iic适配器载入函式i2c_add_adapter() 25714.5.3 idr机制 25714.5.4 适配器卸载函式i2c_del_adapter() 26014.5.5 iic汇流排通信方法s3c24xx_i2c_algorithm结构体 26014.5.6 适配器的传输函式s3c24xx_i2c_doxfer() 26214.5.7 适配器的中断处理函式s3c24xx_i2c_irq() 26514.5.8 位元组传输函式i2s_s3c_irq_nextbyte() 26714.5.9 适配器传输停止函式s3c24xx_i2c_stop() 26914.5.10 中断处理函式的一些辅助函式 27014.6 iic设备层驱动程式 27014.6.1 iic设备驱动模组载入和卸载 271 14.6.2 探测函式s3c24xx_i2c_probe() 27214.6.3 移除函式s3c24xx_i2c_remove() 27414.6.4 控制器初始化函式s3c24xx_i2c_init() 27514.6.5 设定控制器数据传送频率函式s3c24xx_i2c_clockrate() 27614.7 小结 278第15章 lcd设备驱动程式 27915.1 framebuffer概述 27915.1.1 framebuffer的概念 27915.1.2 framebuffer与应用程式的互动 28015.1.3 framebuffer显示原理 28015.1.4 lcd显示原理 28115.2 framebuffer的结构分析 28115.2.1 framebuffer架构和其关係 28115.2.2 framebuffer驱动程式的实现 28215.2.3 framebuffer架构及其关係 28315.3 lcd驱动程式分析 28815.3.1 lcd模组的载入和卸载函式 28815.3.2 lcd驱动程式的平台数据 29015.3.3 lcd模组的探测函式 29115.3.4 移除函式 29515.4 小结 296第16章 触控萤幕设备驱动程式 29716.1 触控萤幕设备工作原理 29716.1.1 触控萤幕设备概述 29716.1.2 触控萤幕设备的类型 29716.1.3 电阻式触控萤幕 29816.2 触控萤幕设备硬体结构 29816.2.1 s3c2440触控萤幕接口概述 29816.2.2 s3c2440触控萤幕接口的工作模式 29916.2.3 s3c2440触控萤幕设备暂存器 30016.3 触控萤幕设备驱动程式分析 30316.3.1 触控萤幕设备驱动程式组成 30316.3.2 s3c2440触控萤幕驱动模组的载入和卸载函式 30416.3.3 s3c2440触控萤幕驱动模组的探测函式 30516.3.4 触控萤幕设备配置 30816.3.5 触控萤幕设备中断处理函式 30916.3.6 s3c2440触控萤幕驱动模组的remove()函式 31416.4 测试触控萤幕驱动程式 31416.5 小结 316第17章 输入子系统设计 31717.1 input子系统入门 31717.1.1 简单的实例 31717.1.2 注册函式input_register_device() 31917.1.3 向子系统报告事件 32317.2 handler注册分析 32817.2.1 输入子系统的组成 32817.2.2 input_handler结构体 328 17.2.3 注册input_handler 32917.2.4 input_handle结构体 33017.2.5 注册input_handle 33117.3 input子系统 33217.3.1 子系统初始化函式input_init() 33317.3.2 档案打开函式input_open_file() 33317.4 evdev输入事件驱动分析 33517.4.1 evdev的初始化 33517.4.2 evdev设备的打开 33717.5 小结 340第18章 块设备驱动程式 34118.1 块设备简介 34118.1.1 块设备总体概述 34118.1.2 块设备的结构 34218.2 块设备驱动程式的架构 34418.2.1 块设备载入过程 34418.2.2 块设备卸载过程 34518.3 通用块层 34618.3.1 通用块层 34618.3.2 alloc_disk()函式对应的gendisk结构体 34618.3.3 块设备的注册和注销 34918.3.4 请求伫列 34918.3.5 设定gendisk属性中的block_device_operations结构体 35018.4 不使用请求伫列的块设备驱动 35118.4.1 不使用请求伫列的块设备驱动程式的组成 35218.4.2 宏定义和全局变数 35218.4.3 载入函式 35318.4.4 卸载函式 35518.4.5 自定义请求处理函式 35518.4.6 驱动的测试 35618.5 i/o调度器 35918.5.1 数据从记忆体到磁碟的过程 35918.5.2 块i/o请求(bio) 36018.5.3 请求结构(request) 36318.5.4 请求伫列(request_queue) 36418.5.5 请求伫列、请求结构、bio等之间的关係 36518.5.6 四种调度算法 36518.6 自定义i/o调度器 36718.6.1 virtual_blkdev块设备的缺陷 36718.6.2 指定noop调度器 36818.6.3 virtual_blkdev的改进实例 36818.6.4 编译和测试 36918.7 脱离i/o调度器 37018.7.1 请求伫列中的bio处理函式 37018.7.2 通用块层函式调用关係 37118.7.3 对virtual_blkdev块设备的改进 37318.7.4 编译和测试 37618.8 块设备的物理结构 37718.8.1 为virtual_blkdev块设备添加分区 37718.8.2 对新的virtual_blkdev代码的分析 378 18.8.3 编译和测试 37918.8.4 分区数的计算 38118.8.5 设定virtual_blkdev的结构 38218.8.6 编译和测试 38418.9 小结 387第19章 usb设备驱动程式 38919.1 usb概述 38919.1.1 usb概念 38919.1.2 usb的特点 39019.1.3 usb汇流排拓扑结构 39119.1.4 usb驱动总体架构 39119.2 usb设备驱动模型 39519.2.1 usb驱动初探 39519.2.2 usb设备驱动模型 39719.2.3 usb驱动结构usb_driver 39919.3 usb设备驱动程式 40419.3.1 usb设备驱动载入和卸载函式 40419.3.2 探测函式probe()的参数usb_interface 40519.3.3 usb协定中的设备 40619.3.4 端点的传输方式 41219.3.5 设定 41319.3.6 探测函式storage_probe() 41519.4 获得usb设备信息 41819.4.1 设备关联函式associate_dev() 41819.4.2 获得设备信息函式get_device_info() 41919.4.3 得到传输协定get_transport()函式 42019.4.4 获得协定信息函式get_protocol() 42119.4.5 获得管道信息函式get_pipes() 42219.5 资源的初始化 42519.5.1 storage_probe()函式调用过程 42519.5.2 资源获取函式usb_stor_acquire_resources() 42619.5.3 usb请求块(urb) 42719.6 控制子执行绪 43019.6.1 控制执行绪 43119.6.2 扫描执行绪usb_stor_scan_thread() 43319.6.3 获得lun函式usb_stor_bulk_max_lun() 43419.7 小结 441