-
Linux设备驱动开发详解
本书是一本介绍Linux设备驱动开发理论、框架与实例的书,本书以Linux 2.6版本内核为蓝本,详细介绍自旋锁、信号量、完成量、中断顶/底半部、定时器、内存和I/O映射以及异步通知、阻塞I/O、非阻塞I/O等Linux 设备驱动理论;字符设备、块设备、TTY设备、IC设备、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 USB 2.3.4 以太网接口 2.3.5 ISA总线 2.3.6 PCI和cPCI 2.4 CPLD和FPGA 2.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和Makefile 3.4.3 Linux内核的引导 3.5 Linux下的C编程 3.5.1 Linux程序命名习惯 3.5.2 GNUC与ANSIC 3.5.3 do{}while(0) 3.5.4 goto 3.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 模块与GPL 4.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 创建和配置udev 5.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/O 8.1 阻塞与非阻塞I/O 8.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/O 9.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/O 9.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/O 11.1.1 内存空间与I/O空间 11.1.2 内存管理单元MMU 11.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 DMA 11.6.1 DMA与Cache一致性 11.6.2 Linux下的DMA编程 11.7 总结 第12章 Linux字符设备驱动综合实例 第3篇 Linux设备驱动实例 第13章 Linux块设备驱动 第14章 Linux终端设备驱动 …… -
Linux Device Drivers
Device drivers literally drive everything you're interested in--disks, monitors, keyboards, modems--everything outside the computer chip and memory. And writing device drivers is one of the few areas of programming for the Linux operating system that calls for unique, Linux-specific knowledge. For years now, programmers have relied on the classic Linux Device Drivers from O'Reilly to master this critical subject. Now in its third edition, this bestselling guide provides all the information you'll need to write drivers for a wide range of devices. Over the years the book has helped countless programmers learn: * how to support computer peripherals under the Linux operating system * how to develop and write software for new hardware under Linux * the basics of Linux operation even if they are not expecting to write a driver The new edition of Linux Device Drivers is better than ever. The book covers all the significant changes to Version 2.6 of the Linux kernel, which simplifies many activities, and contains subtle new features that can make a driver both more efficient and more flexible. Readers will find new chapters on important types of drivers not covered previously, such as consoles, USB drivers, and more. Best of all, you don't have to be a kernel hacker to understand and enjoy this book. All you need is an understanding of the C programming language and some background in Unix system calls. And for maximum ease-of-use, the book uses full-featured examples that you can compile and run without special hardware. Today Linux holds fast as the most rapidly growing segment of the computer market and continues to win over enthusiastic adherents in many application areas. With this increasing support, Linux is now absolutely mainstream, and viewed as a solid platform for embedded systems. If you're writing device drivers, you'll want this book. In fact, you'll wonder how drivers are ever written without it. -
LINUX设备驱动程序
本书揭示了如何给大多数的设备编写驱动程序的信息,这些信息迄今仅通过口头或者隐晦的源代码注释被共享。你不必是一个内核高手就可以理解并享受本书,所需要的只是C以及Unix系统调用方面的背景知识。在不需要特殊的硬件设备就能编译和运行的详细示例的指引下,你将学会如何给字符设备、块设备和网络接口编写驱动程序。PCI、USB和tty(终端)子系统都单列一章。本书为那些对操作系统的工作机制好奇的人提供了地址空间、异步事件和I/O等方面的阐述。 -
Linux设备驱动程序
本书是经典著作《Linux设备驱动程序》的第三版。如果您希望在Linux操作系统上支持计算机外部设备,或者在Linux上运行新的硬件,或者只是希望一般性地了解Linux内核的编程,就一定要阅读本书。本书描述了如何针对各种设备编写驱动程序,而在过去,这些内容仅仅以口头形式交流,或者零星出现在神秘的代码注释中。 本书的作者均是Linux社区的领导者。Jonathan Corbet虽不是专职的内核代码贡献者,但他是备受关注的LWN.net新闻及信息网站的执行编辑。Alessandro Rubini是一名Linux代码贡献者,也是活跃的意大利Linux社区的灵魂人物。Greg Kroah-Hartman是目前内核中USB、PCI和驱动程序核心子系统(本书均有讲述)的维护者。 本书的这个版本已针对Linux内核的2.6.10版本彻底更新过了。内核的这个版本针对常见任务完成了合理化设计及相应的简化,如即插即用、利用sysfs文件系统和用户空间交互,以及标准总线上的多设备管理等等。 要阅读并理解本书,您不必首先成为内核黑客;只要您理解C语言并具有Unix系统调用的一些背景知识即可。您将学到如何为字符设备、块设备和网络接口编写驱动程序。为此,本书提供了完整的示例程序,您不需要特殊的硬件即可编译和运行这些示例程序。本书还在单独的章节中讲述了PCI、USB和tty(终端)子系统。对期望了解操作系统内部工作原理的读者来讲,本书也深入阐述了地址空间、异步事件以及I/O等方面的内容。