Linux设备驱动开发详解

出版时间:2008-2  出版社:人民邮电  作者:宋宝华  页数:686  
Tag标签:无  

内容概要

  本书是一本介绍Linux设备驱动开发理论、框架与实例的书,本书以Linux 2.6版本内核为蓝本,详细介绍自旋锁、信号量、完成量、中断顶/底半部、定时器、内存和I/O映射以及异步通知、阻塞I/O、非阻塞I/O等Linux设备驱动理论;字符设备、块设备、TTY设备、I2C设备、LCD设备、音频设备、USB设备、网络设备、PCI设备等Linux设备驱动的架构和框架中各个复杂数据架构和函数的关系,并讲解了大量Linux驱动开发的大量实例,使读者能够独立开发各类Linux设备驱动。  本书内容全面,实例丰富,操作性强,语言通俗易懂,适合广大Linux开发人员、嵌入式工程师参考使用。

书籍目录

第1篇 Linux设备驱动入门第1章 设备驱动概述1.1 设备驱动的作用1.2 无操作系统时的设备驱动1.3 有操作系统时的设备驱动1.4 Linux设备驱动1.4.1 设备的分类及特点1.4.2 Linux设备驱动与整个软硬件系统的关系1.4.3 编写Linux设备驱动的技术基础1.4.4 Linux设备驱动的学习方法1.5 设备驱动的HelloWorld:LED驱动1.5.1 无操作系统时的LED驱动1.5.2 Linux系统下的LED驱动第2章 驱动设计的硬件基础2.1 处理器2.1.1 通用处理器2.1.2 数字信号处理器2.2 存储器2.3 接口与总线2.3.1 串口2.3.2 I2C总线2.3.3 USB2.3.4 以太网接口2.3.5 ISA总线2.3.6 PCI和cPCI2.4 CPLD和FPGA2.5 原理图分析2.5.1 原理图分析的内容2.5.2 原理图的分析方法2.6 硬件时序分析2.6.1 时序分析的概念2.6.2 典型硬件时序2.7 仪器仪表使用2.7.1 万用表2.7.2 示波器2.7.3 逻辑分析仪2.8 总结第3章 Linux内核及内核编程3.1 Linux内核的发展与演变3.2 Linux2.6内核的特点3.3 Linux内核的组成3.3.1 Linux内核源代码目录结构3.3.2 Linux内核的组成部分3.3.3 Linux内核空间与用户空间3.4 Linux内核的编译及加载3.4.1 Linux内核的编译3.4.2 Kconfig和Makefile3.4.3 Linux内核的引导3.5 Linux下的C编程3.5.1 Linux程序命名习惯3.5.2 GNUC与ANSIC3.5.3 do{}while(0)3.5.4 goto3.6 总结第2篇 Linux设备驱动核心理论第4章 Linux内核模块4.1 Linux内核模块简介4.2 Linux内核模块的程序结构4.3 模块加载函数4.4 模块卸载函数4.5 模块参数4.6 导出符号4.7 模块声明与描述4.8 模块的使用计数4.9 模块的编译4.10 模块与GPL4.11 总结第5章 Linux文件系统与设备文件系统5.1 Linux文件操作5.1.1 文件操作的相关系统调用5.1.2 C库函数的文件操作5.2 Linux文件系统5.2.1 Linux文件系统目录结构5.2.2 Linux文件系统与设备驱动5.3 devfs设备文件系统5.4 udev设备文件系统5.4.1 udev与devfs的区别5.4.2 sysfs文件系统与Linux设备模型5.4.3 udev的组成5.4.4 udev规则文件5.4.5 创建和配置udev5.5 总结第6章 字符设备驱动6.1 Linux字符设备驱动结构6.1.1 cdev结构体6.1.2 分配和释放设备号6.1.3 file_operations结构体6.1.4 Linux字符设备驱动的组成6.2 globalmem虚拟设备实例描述6.3 globalmem设备驱动6.3.1 头文件、宏及设备结构体6.3.2 加载与卸载设备驱动6.3.3 读写函数6.3.4 seek()函数6.3.5 ioctl()函数6.3.6 使用文件私有数据6.4 globalmem驱动在用户空间的验证6.5 总结第7章 Linux设备驱动中的并发控制7.1 并发与竞态7.2 中断屏蔽7.3 原子操作7.3.1 整型原子操作7.3.2 位原子操作7.4 自旋锁7.4.1 自旋锁的使用7.4.2 读写自旋锁7.4.3 顺序锁7.4.4 读-拷贝-更新7.5 信号量7.5.1 信号量的使用7.5.2 信号量用于同步7.5.3 完成量用于同步7.5.4 自旋锁vs信号量7.5.5 读写信号量7.6 互斥体7.7 增加并发控制后的globalmem驱动7.8 总结第8章 Linux设备驱动中的阻塞与非阻塞I/O8.1 阻塞与非阻塞I/O8.1.1 等待队列8.1.2 支持阻塞操作的globalfifo设备驱动8.1.3 在用户空间验证globalfifo的读写8.2 轮询操作8.2.1 轮询的概念与作用8.2.2 应用程序中的轮询编程8.2.3 设备驱动中的轮询编程8.3 支持轮询操作的globalfifo驱动8.3.1 在globalfifo驱动中增加轮询操作8.3.2 在用户空间验证globalfifo设备的轮询8.4 总结第9章 Linux设备驱动中的异步通知与异步I/O9.1 异步通知的概念与作用9.2 Linux异步通知编程9.2.1 Linux信号9.2.2 信号的接收9.2.3 信号的释放9.3 支持异步通知的globalfifo驱动9.3.1 在globalfifo驱动中增加异步通知9.3.2 在用户空间验证globalfifo的异步通知9.4 Linux2.6异步I/O9.4.1 AIO概念与GNUC库函数9.4.2 使用信号作为AIO的通知9.4.3 使用回调函数作为AIO的通知9.4.4 AIO与设备驱动9.5 总结第10章 中断与时钟10.1 中断与定时器10.2 Linux中断处理程序架构10.3 Linux中断编程10.3.1 申请和释放中断10.3.2 使能和屏蔽中断10.3.3 底半部机制10.3.4 实例:S3C2410实时钟中断10.4 中断共享10.5 内核定时器10.5.1 内核定时器编程10.5.2 实例:秒字符设备10.6 内核延时10.6.1 短延迟10.6.2 长延迟10.6.3 睡着延迟10.7 总结第11章 内存与I/O访问11.1 CPU与内存和I/O11.1.1 内存空间与I/O空间11.1.2 内存管理单元MMU11.2 Linux内存管理11.3 内存存取11.3.1 用户空间内存动态申请11.3.2 内核空间内存动态申请11.3.3 虚拟地址与物理地址关系11.4 设备I/O端口和I/O内存的访问11.4.1 LinuxI/O端口和I/O内存访问接口11.4.2 申请与释放设备I/O端口和I/O内存11.4.3 设备I/O端口和I/O内存访问流程11.4.4 将设备地址映射到用户空间11.5 I/O内存静态映射11.6 DMA11.6.1 DMA与Cache一致性11.6.2 Linux下的DMA编程11.7 总结第12章 Linux字符设备驱动综合实例12.1 按键的设备驱动12.1.1 按键的硬件原理12.1.2 按键驱动中的数据结构12.1.3 按键驱动的模块加载和卸载函数12.1.4 按键设备驱动中断、定时器处理程序12.1.5 按键设备驱动的打开、释放函数12.1.6 按键设备驱动读函数12.2 触摸屏的设备驱动12.2.1 触摸屏的硬件原理12.2.2 触摸屏设备驱动中数据结构12.2.3 触摸屏驱动中的硬件控制12.2.4 触摸屏驱动模块加载和卸载函数12.2.5 触摸屏驱动中断、定时器处理程序12.2.6 触摸屏设备驱动的打开、释放函数12.2.7 触摸屏设备驱动的读函数12.2.8 触摸屏设备驱动的轮询与异步通知12.2.9 Linux输入子系统12.3 DSPHPI的设备驱动12.3.1 HPI接口的硬件原理12.3.2 HPI接口设备驱动中数据结构12.3.3 HPI接口设备驱动的读写函数12.4 NVRAM设备驱动12.4.1 NVRAM设备驱动的数据结构12.4.2 NVRAM设备驱动的模块加载与卸载函数12.4.3 NVRAM设备驱动读写函数12.4.4 NVRAM设备驱动的seek函数12.5 看门狗设备驱动12.5.1 看门狗硬件原理12.5.2 看门狗驱动中的数据结构12.5.3 看门狗驱动模块的加载和卸载函数12.5.4 看门狗驱动探测和移除函数12.5.5 看门狗驱动的挂起和恢复函数12.5.6 看门狗驱动的打开和释放函数12.5.7 看门狗驱动写函数12.6 总结第3篇 Linux设备驱动实例第13章 Linux块设备驱动13.1 块设备的I/O操作特点13.2 Linux块设备驱动结构13.2.1 block_device_operations结构体13.2.2 gendisk结构体13.2.3 request与bio结构体13.2.4 块设备驱动注册与注销13.3 Linux块设备驱动的模块加载与卸载13.4 块设备的打开与释放13.5 块设备驱动的ioctl函数13.6 块设备驱动的I/O请求处理13.6.1 使用请求队列13.6.2 不使用请求队列13.7 实例1:RamDisk驱动13.7.1 RamDisk的硬件原理13.7.2 RamDisk驱动模块的加载与卸载13.7.3 RamDisk设备驱动block_device_operations及成员函数13.7.4 RamDiskI/O请求处理13.8 实例2:IDE硬盘设备驱动13.8.1 IDE硬盘设备原理13.8.2 IDE硬盘设备驱动的block_device_operations及成员函数13.8.3 IDE硬盘设备驱动的I/O请求处理13.8.4 在内核中增加对新系统IDE设备的支持13.9 总结第14章 Linux终端设备驱动14.1 终端设备14.2 终端设备驱动结构14.3 终端设备驱动的初始化与释放14.3.1 模块加载与卸载函数14.3.2 打开与关闭函数14.4 数据发送和接收14.5 tty线路设置14.5.1 线路设置用户空间接口14.5.2 tty驱动的set_termios函数14.5.3 tty驱动的tiocmget和tiocmset函数14.5.4 tty驱动的ioctl函数14.6 UART设备驱动14.7 S3C2410UART的驱动实例14.7.1 S3C2410串口硬件描述14.7.2 S3C2410串口驱动的数据结构14.7.3 S3C2410串口驱动的初始化与释放14.7.4 S3C2410串口数据收发14.7.5 S3C2410串口线路设置14.8 总结第15章 Linux的I2C核心、总线与设备驱动15.1 Linux的I2C体系结构15.2 LinuxI2C核心15.3 LinuxI2C总线驱动15.3.1 I2C适配器驱动加载与卸载15.3.2 I2C总线通信方法15.4 LinuxI2C设备驱动15.4.1 LinuxI2C设备驱动的模块加载与卸载15.4.2 LinuxI2C设备驱动的i2c_driver成员函数15.4.3 LinuxI2C设备驱动的文件操作接口15.4.4 Linux的i2c-dev.c文件分析15.5 S3C2410I2C总线驱动实例15.5.1 S3C2410I2C控制器硬件描述15.5.2 S3C2410I2C总线驱动总体分析15.5.3 S3C2410I2C适配器驱动的模块加载与卸载15.5.4 S3C2410I2C总线通信方法15.6 SAA7113H视频AD芯片的I2C设备驱动实例15.6.1 SAA7113H视频AD芯片硬件描述15.6.2 SAA7113H视频AD芯片驱动的模块加载与卸载15.6.3 SAA7113H设备驱动的i2c_driver成员函数15.7 总结第16章 Linux网络设备驱动16.1 Linux网络设备驱动的结构16.1.1 网络协议接口层16.1.2 网络设备接口层16.1.3 设备驱动功能层16.1.4 网络设备与媒介层16.2 网络设备驱动的注册与注销16.3 网络设备的初始化16.4 网络设备的打开与释放16.5 数据发送流程16.6 数据接收流程16.7 网络连接状态16.8 参数设置和统计数据16.9 CS8900网卡设备驱动实例16.9.1 CS8900网卡硬件描述16.9.2 CS8900网卡驱动设计分析16.9.3 CS8900网卡注册、初始化与注销16.9.4 CS8900网卡发送数据流程16.9.5 CS8900网卡接收数据流程16.10 总结第17章 Linux音频设备驱动17.1 数字音频设备17.2 音频设备硬件接口17.2.1 PCM接口17.2.2 IIS接口17.2.3 AC97接口17.3 LinuxOSS音频设备驱动17.3.1 OSS驱动的组成17.3.2 mixer接口17.3.3 dsp接口17.3.4 OSS用户空间编程17.4 LinuxALSA音频设备驱动17.4.1 ALSA的组成17.4.2 card和组件管理17.4.3 PCM设备17.4.4 控制接口17.4.5 AC97API接口17.4.6 ALSA用户空间编程17.5 S3C2410+UDA1341OSS驱动实例17.5.1 S3C2410与UDA1341接口硬件描述17.5.2 注册dsp和mixer接口17.5.3 mixer接口的I/O控制函数17.5.4 dsp接口音频数据传输17.6 SA1100+UDA1341ALSA驱动实例17.6.1 card注册与注销17.6.2 PCM设备的实现17.6.3 控制接口的实现17.7 PXA255+AC97ALSA驱动实例17.8 总结第18章 LCD设备驱动18.1 LCD硬件原理18.2 帧缓冲18.2.1 帧缓冲的概念18.2.2 显示缓冲区与显示点18.2.3 Linux帧缓冲相关数据结构与函数18.3 Linux帧缓冲设备驱动结构18.4 帧缓冲设备驱动的模块加载与卸载函数18.5 帧缓冲设备显示缓冲区的申请与释放18.6 帧缓冲设备的参数设置18.6.1 定时参数18.6.2 像素时钟18.6.3 颜色位域18.6.4 固定参数18.7 帧缓冲设备驱动的fb_ops成员函数18.8 LCD设备驱动的读写、mmap和ioctl函数18.9 帧缓冲设备的用户空间访问18.10 Linux图形用户界面18.10.1 Qt-X11/QtEmbedded/Qtopia18.10.2 Microwindows/Nano-X18.10.3 MiniGUI18.11 实例:S3C2410LCD设备驱动18.11.1 S3C2410LCD控制器硬件描述18.11.2 S3C2410LCD驱动的模块加载与卸载函数18.11.3 S3C2410LCD驱动的探测与移除函数18.11.4 S3C2410LCD驱动挂起与恢复函数18.11.5 S3C2410LCD驱动的fb_ops成员函数18.12 总结第19章 Flash设备驱动19.1 LinuxFlash驱动结构19.1.1 LinuxMTD系统层次19.1.2 LinuxMTD系统接口19.1.3 MTD用户空间编程19.2 NORFlash驱动19.3 NANDFlash驱动19.4 NORFlash驱动实例:S3C2410外围的NORFlash驱动19.5 NANDFlash驱动实例:S3C2410外围的NANDFlash驱动19.5.1 S3C2410NAND控制器硬件描述19.5.2 nand_chip初始化和成员函数19.5.3 NAND设备驱动初始化与释放19.6 Flash文件系统的建立19.6.1 Flash转换层19.6.2 CramFS19.6.3 JFFS/JFFS219.6.4 YAFFS/YAFFS219.7 总结第20章 USB主机与设备驱动20.1 LinuxUSB驱动层次20.1.1 主机侧与设备侧USB驱动20.1.2 设备、配置、接口、端点20.2 USB主机驱动20.2.1 USB主机驱动的整体结构20.2.2 实例:S3C2410USB主机驱动20.3 USB设备驱动20.3.1 USB设备驱动整体结构20.3.2 USB请求块(URB)20.3.3 探测和断开函数20.3.4 USB骨架程序20.4 USB设备驱动实例20.4.1 USB串口驱动20.4.2 USB键盘驱动20.5 总结第21章 PCI设备驱动21.1 PCI总线与配置空间21.1.1 PCI总线的Linux描述21.1.2 PCI设备的Linux描述21.1.3 PCI配置空间访问21.2 PCI设备驱动结构21.2.1 pci_driver结构体21.2.2 PCI设备驱动的组成21.2.3 旧版内核的PCI设备探测21.3 实例:Intel810主板声卡驱动21.4 总结第4篇 Linux设备驱动测试、移植第22章 Linux设备驱动的调试22.1 Linux开发环境建设22.1.1 实验室建设22.1.2 工具链22.1.3 串口工具22.2 GDB调试器用法22.2.1 GDB基本用法22.2.2 DDD图形界面调试工具22.3 Linux内核调试22.4 内核打印信息-printk()22.5 使用/proc22.6 Oops22.7 监视工具22.8 内核调试器22.8.1 kcore22.8.2 KDB22.8.3 KGDB22.9 使用仿真器调试内核22.10 应用程序调试22.11 总结第23章 Linux设备驱动的移植23.1 编写可移植的设备驱动23.1.1 可移植的数据类型23.1.2 结构体对界23.1.3 LittleEndian与BigEndian23.1.4 内存页面大小23.2 巧用同类设备驱动23.2.1 巧用demo板驱动23.2.2 巧用类似芯片的驱动程序23.2.3 借用芯片厂商的范例程序23.3 从Linux2.4移植设备驱动到Linux2.623.4 Linux与其他操作系统之间的驱动移植23.5 总结参考文献

编辑推荐

  业界权威机构和专家强力推荐,多年培训、研发经验的总结。  设备驱动程序是嵌入式操作系统的重要模块,也是难点之一,Linux设备驱动程序更以复杂和繁多而著名,本书的作者集多年授课和开发的经验,以简洁的语言和丰富的实例讲述了这一技术,深入浅出,值得一读。  北京麦克泰软件技术有限公司(BMR)董事长/电子产品世界杂志编委 何小庆  本书有个非常突出的特点——实用,全书以大量实例来引导读者编写以及移植Linux设备驱动,这些实例是作者多年Linux设备驱动开发从业经验的总结,读者一定会从中受益。  中国软件行业协会嵌入式系统分会秘书长郭淳学  在Linux系统广泛应用、嵌入式系统飞速发展的今天,Linux没备驱动正在、发挥着越来越大的作用,这本书是学习Linux设备驱动很好的选择。  信息产业部软件与集成电路促进中心(CSIP)教育培训部主任杜广斌

图书封面

图书标签Tags

评论、评分、阅读与下载


    Linux设备驱动开发详解 PDF格式下载


用户评论 (总计0条)

 
 

 

250万本中文图书简介、评论、评分,PDF格式免费下载。 第一图书网 手机版

京ICP备13047387号-7