嵌入式Linux驱动模板精讲与项目实践
本书从实用的角度对嵌入式Linux驱动设计开发从理论到实践做了比较深入的介绍,以Mini2440开发板为基础,对各种常见驱动开发进行模板化设计训练,各种模板可以直接应用到实际项目开发中,其中的一线研发技巧和案例分析可以供专业特训和广大嵌入式Linux开发者实战使用。 本书共分为13章,书中介绍的各种开发技巧对实际应用有很大的借鉴意义,在各个知识点介绍中穿插实际项目的经验分享,包括实际研发的管理经验介绍,对驱动开发初学者和实际设计开发人员有很大益处,也可作为一线研发公司的岗前培训教程。 本书重点在于内核驱动的讲解,以及模板式开发的训练,力求完全揭晓各种Linux开发中的技巧和模糊点,是一本比较实用的驱动开发训练教程。
基本信息
- 书名
嵌入式Linux驱动模板精讲与项目实践
- 作者
林锡龙
- 出版社
电子工业出版社
- 出版日期
2014年5月1日
- 页数
306页
基本介绍
内容简介
《嵌入式Linux驱动模板精讲与项目实践》编辑推荐:一线研发实战经验积累,所有技巧及讲解使用的工具都可以直接应用到实际开发工作中。采用模板的方式对分散的各种驱动知识点进行讲解,所有模板都可以直接引用。对每个知识点都提供实际案例,从模块的原理介绍,到系统层次的分析,图文并茂,分析透彻。提供大量的驱动例程,读者可以直接运行调试,快速应用于实际开发中。《嵌入式Linux驱动模板精讲与项目实践》共分为13章,书中介绍的各种开发技巧对实际应用有很大的借鉴意义,在各个知识点介绍中穿插实际项目的经验分享,包括实际研发的管理经验介绍,对驱动开发初学者和实际设计开发人员有很大益处,也可作为一线研发公司的岗前培训教程。
作者简介
林锡龙,8年嵌入式软件一线研发经验,曾在华为等通信公司从事底层软件研发、Linux驱动开发工作。多次担任专业培训机构高级培训师,主讲嵌入式Linux驱动开发。
图书目录
第1章驱动总论(1) 1.1总论(1) 1.1.1驱动在内核中的比例(1) 1.1.2驱动开发需要具备的能力(1) 1.1.3驱动开发重点关注的内容(2) 1.2驱动理论与思想(3) 1.2.1分类思想(4) 1.2.2分层思想(4) 1.2.3分离思想(10) 1.2.4总线思想(11) 本章小结(11) 第2章内核编程及基础知识点(12) 2.1内核线程(12) 2.2内核定时器(16) 2.3链表(18) 2.4内存操作(18) 2.5I/O端口(20) 2.6内核相关宏(21) 2.7内核态文件操作(22) 2.8内核通知链(25) 本章小结(30) 第3章模块与常用字符设备方法(31) 3.1Linux驱动(31) 3.2内核驱动模块剖析(32) 3.2.1内核模块(34) 3.2.2模块工具集(34) 3.2.3模块文件结构分析(36) 3.2.4内核管理(37) 3.2.5Modutils工具包及Module—init—tools移植(37) 3.2.6符号(37) 3.2.7驱动模块之间的依赖(38) 3.2.8模块编译流程细节(38) 3.2.9模块编写(39) 3.3宏观分析Linux驱动(39) 3.4设备文件(41) 3.5设备管理系统(46) 3.5.1自动创建和管理设备文件揭秘(46) 3.5.2devfs、mdev和udev(46) 3.5.3udev基本原理与流程(47) 3.5.4热插拔与冷插拔(48) 3.5.5class(48) 3.6字符设备驱动(50) 3.6.1原始方式(51) 3.6.2静态设定设备号方式(51) 3.6.3使用udev工具自动生成设备文件方式(52) 3.6.4简洁型字符设备驱动——misc字符设备驱动方式(53) 3.7设备操作方法file_operations(55) 3.7.1ioctl和unlocked_ioctl操作(57) 3.7.2read/write设备方法(65) 3.7.3llseek设备方法(70) 3.7.4mmap设备方法(70) 3.7.5利用mmap在应用层实现硬件操作(75) 本章小结(76) 第4章同步和互斥(77) 4.1概述(77) 4.2基本概念(77) 4.3互斥和同步机制(79) 4.4互斥(79) 4.4.1屏蔽中断(79) 4.4.2原子操作(80) 4.4.3自旋锁(81) 4.4.4信号量(82) 4.4.5自旋锁与信号量(83) 4.4.6互斥体:专用于互斥(84) 4.5同步(84) 本章小结(86) 第5章中断系统(87) 5.1中断概述(87) 5.2基本概念(87) 5.3中断原理及使用注意事项(89) 5.4中断接口函数(89) 5.4.1中断申请和释放(89) 5.4.2中断共享(90) 5.4.3中断例程之一:按键中断(92) 5.4.4中断例程之二:A/D转换驱动(96) 5.5底半部:tasklet、工作队列(104) 5.6时间管理(106) 本章小结(107) 第6章设备高级特性(108) 6.1字符设备file_operations的高级特性(108) 6.2Linux设备驱动的I/O模型(109) 6.2.1同步阻塞I/O(109) 6.2.2同步非阻塞I/O(109) 6.2.3异步阻塞I/O(110) 6.2.4异步非阻塞I/O(110) 6.2.5异步通知(110) 6.2.6同步阻塞型I/O的实现:建立在等待队列的基础上(117) 6.2.7异步阻塞型I/O的实现:基于poll系统调用操作接口函数(121) 6.3设备复用(126) 本章小结(128) 第7章高级类型驱动(129) 7.1misc类型驱动(129) 7.1.1概述(129) 7.1.2结构与流程分析(129) 7.1.3关于设备节点的创建(130) 7.2input类型驱动(130) 7.2.1input驱动概述(130) 7.2.2三个主要结构体(133) 7.2.3Input驱动步骤(136) 7.3触摸屏驱动(144) 7.4I2C驱动(150) 7.4.1I2C总线接口(150) 7.4.2I2C内核驱动层及相关文件分析(151) 7.4.3重要的数据结构及相关联系(153) 7.4.4流程分析(157) 7.4.5i2c—tools(165) 7.5块设备驱动(169) 7.5.1块设备驱动分析(169) 7.5.2制作一个块设备例子:RamDisk驱动(174) 本章小结(177) 第8章虚拟文件系统(178) 8.1内核在线窗口——虚拟文件系统(178) 8.2proc文件系统(179) 8.2.1目录介绍(179) 8.2.2创建目录与文件(184) 8.2.3相关应用(185) 8.3sys文件系统(186) 8.3.1sys文件系统概述(186) 8.3.2sys文件目录(187) 8.3.3sys文件系统接口函数与创建文件夹模板(189) 本章小结(192) 第9章设备驱动模型(193) 9.1设备驱动模型概述(193) 9.2sys文件系统与设备驱动模型(194) 9.3认识设备驱动模型(195) 9.4两大基石kobject和kset(197) 9.4.1内核对象kobject(197) 9.4.2另外一个基石kset(199) 9.5subsystem(203) 9.6三角关系核心——总线、设备、驱动(204) 9.6.1总线(204) 9.6.2设备(207) 9.6.3驱动(209) 9.7platform总线(211) 9.8serio总线(220) 9.8.1serio子系统介绍(220) 9.8.2serio子系统框架(220) 9.8.3主要数据结构(223) 本章小结(229) 第10章嵌入式Linux文件系统(230) 10.1文件系统介绍(230) 10.2创建最简单的根文件系统(233) 10.3YAFFS文件系统移植(241) 10.4JFFS2文件系统制作(250) 10.5ramdisk文件系统制作(250) 10.6cramfs文件系统制作(252) 本章小结(253) 第11章开发与调试技巧(254) 11.1vim使用(254) 11.2工具使用(254) 11.3printk使用技巧(259) 11.4使用proc在线打开打印开关(260) 11.5异常崩溃oops处理(261) 11.6动态修改模块参数(269) 11.7使用devmem2操作物理地址(269) 11.8时间测量(270) 11.9善于使用开源项目(270) 本章小结(271) 第12章底层驱动规划与管理探索(272) 12.1底层驱动规划探索(272) 12.1.1设计理念概述(272) 12.1.2底层平台软件设计(273) 12.1.3底层平台软件管理规则(276) 12.1.4独立驱动模块的版本管理(276) 12.1.5提供最基本的系统(278) 12.1.6驱动开发注意事项(278) 12.1.7版本库(279) 12.1.8平台版本构建发布(282) 12.2研发管理(283) 12.2.1嵌入式软件研发管理畅想(284) 12.2.2嵌入式软件V字形开发模式(285) 12.3软件开发文档(286) 12.3.1可行性分析报告(286) 12.3.2嵌入式软件系统设计方案文档(289) 12.3.3嵌入式软件概要设计(290) 12.3.4嵌入式软件详细设计(293) 12.3.5案例分析(294) 本章小结(295) 第13章Linux设备驱动编程规范(296) 13.1基本原则(296) 13.2布局(297) 13.3基本格式(299) 13.4对齐(300) 13.5空行空格(301) 13.6注释(301) 13.7命名(302) 13.8函数(302) 13.9可靠性(303) 13.10其他(303) 本章小结(305) 参考文献(306)
序言
前言 一、行业背景 嵌入式Linux驱动开发涉及的知识点比较多,要求开发者掌握的技能也比较多,且内核知识点比较分散,对于初学者来说门槛比较高,而嵌入式Linux在各行各业中已被广泛应用,在物联网、通信行业、航空航天、消费电子、汽车电子等行业中急需掌握嵌入式Linux软件开发的研发人员。近年来,随着嵌入式应用越来越广泛,嵌入式Linux开发变得更加复杂,嵌入式Linux驱动开发已经成为嵌入式应用领域的一个重大课题。 二、关于本书 本书大部分内容基于专业培训机构特训的讲稿。在专业培训提倡的嵌入式Linux驱动的模板式教学中取得了很好的效果,在此之上结合一线研发经验对驱动开发进行战略性指导,其中很多关键点是作者花了很长时间实实在在整理出来的,旨在揭晓嵌入式Linux驱动中的各种机制,达到知其然且知其所以然的目的。 本书各章内容说明如下。 第1章为驱动总论,是驱动开发在高层次上的介绍。 第2章介绍的内核编程及基础知识点是驱动开发的基础,对驱动开发涉及的Linux内核中的各个知识点进行介绍,旨在扫清对Linux内核阅读的障碍。 第3章介绍驱动模块开发,涉及各种模块移植中常见的设备方法,其中各个模板可以直接应用到实际研发中。 第4章结合Linux操作系统讲解互斥机制在各种情况下的使用,重点分析各种机制的使用注意事项。 第5章重点介绍Linux中断的上下部机制及Linux提供的各种接口,强调中断程序设计的基本理念及设计手段。 第6章介绍Linux驱动中字符设备驱动的高级设备方法。 第7章在Linux子系统的层面上介绍各种高级设备驱动。 第8章重点介绍如何使用虚拟文件系统,这些实用技巧是一线研发的经验总结。 第9章对设备驱动模型各个元素进行讲解,并介绍如何一步步手动建立设备驱动模型模板。 第10章手把手带领读者建立最基本的文件系统,并制作各种常见的文件系统,其中穿插介绍各种实用技巧及实际研发工具。 第11章介绍一线研发人员使用的开发调试技巧,重点强调实用。 第12章结合V字形开发模型在嵌入式Linux驱动开发中的具体实施进行总结。 第13章介绍嵌入式Linux设备驱动编程规范。 本书附带光盘一张,包含书中例程的源代码、目标文件,以及各种相关的工具,光盘按照书中各个知识点建立相应文件夹存放。其中各个知识点配套的例程可以直接在Mini2440开发板上运行。驱动相应例程含有相应的例程配套使用。各个例程也作为相应Linux驱动开发的模版,可以直接修改并应用到具体项目开发中。 三、本书特色 一线研发实战经验积累,所有技巧及讲解使用的工具都可以直接应用到实际开发工作中。 采用模板的方式对分散的各种驱动知识点进行讲解,所有模板都可以直接引用。 对每个知识点都提供实际案例,从模块的原理介绍,到系统层次的分析,图文并茂,力求分析透彻。 提供了大量的驱动例程,这些例程可以快速应用在实际开发中,读者可以直接运行调试。 结合实际研发工作对开发过程中的思考进行总结,重在实用。 四、作者介绍 本书由林锡龙编著,编著者在写作过程中查阅了大量开源工具及互联网上的资料,对各种资料的作者不能一一列举,在此表示谢意。 由于时间仓促,书中程序和图表较多,错误之处在所难免,请广大读者批评指正。 编著者