嵌入式驱动开发
版本：v0.2
Crifan Li
摘要
此文主要介绍的嵌入式驱动开发的概念，所包含的领域。
本文提供多种格式供：

HTML版本的在线地址为：
http://​www.crifan.com/​files/​doc/​docbook/​embedded_​drv_​dev/​release/​html/​embedded_​drv_​dev.html
有任何意见，建议，提交bug等，都欢迎去讨论组发帖讨论：
http://​www.crifan.com/​bbs/​categories/​embedded_​drv_​dev/
在线阅读	HTML  1	HTMLs  2	PDF  3	CHM  4	TXT  5	RTF  6	WEBHELP  7	
下载（7zip压缩包）	HTML  8	HTMLs  9	PDF  10	CHM  11	TXT  12	RTF  13	WEBHELP  14	
修订历史	
修订 0.2	2015-03-15	crl	
· 	增加嵌入式驱动开发的基本概念。
· 		
嵌入式驱动开发:
Crifan Li
版本：v0.2
出版日期 2015-03-15
版权 © 2015 Crifan, http://​crifan.com

本文章遵从：署名-非商业性使用 2.5 中国大陆(CC BY-NC 2.5)15

目录
正文之前  	 # 

1. 此文目的  	 # 
1. 嵌入式驱动开发之通用内容  	 # 

1.1. 驱动做了哪些事情  	 # 
1.2. 写驱动的基本逻辑和流程  	 # 
2. 嵌入式驱动开发之Linux  	 # 
3. 嵌入式驱动开发之WinCE  	 # 
参考书目  	 # 

正文之前

1. 此文目的
此文主要介绍的嵌入式驱动开发的基本概念和逻辑，以便于清楚想要嵌入式开发，需要涉及到哪些东西，如何入手去开发。

第 1 章 嵌入式驱动开发之通用内容
嵌入式驱动开发，不论是哪个平台，其基本上都有一些通用的知识和概念。此处总结一下：

1.1. 驱动做了哪些事情
其实要想去搞懂，嵌入式驱动开发，首先需要搞懂，对于驱动本身，做了哪些事情。
简单说就是：
初始化配置设备
写init方面的代码，负责将设备初始化好，便于后续的使用
其中包括去操作设备的寄存器，配置设备为对应的你所需要模式
实现设备的数据的接受和发送（或者叫读取和写入）
然后就是去负责实现设备的send/receive，或者叫read/write方面的函数了。
这样，当有数据被读取或写入时，有数据需要发送或接受时，就可以调用驱动底层的函数，负责数据的收发了。
如此，设备才可以正常的工作起来。
另外，针对驱动的概念的解释，也可以参考这个：虽然经常听说驱动，但是驱动具体是啥？ - 知乎1

1.2. 写驱动的基本逻辑和流程
想要去写嵌入式驱动时的基本的逻辑和过程是：
· 	知道设备本身的工作原理
· 	比如要给Nand Flash写驱动，那么要知道Nand Flash本身的工作原理
· 	包括但不限于：
· 	Nand Flash的物理内部存储结构
Nand Flash中的Chip，Plane，Block，Page，OOB等的概念
Nand Flash的数据是如何读取和写入的
如何基于Page去读取数据，基于Block去擦除数据
如何发送不同的命令，去实现数据的Page的读取，Block的擦除
假如是没有操作系统，没有驱动框架时，该设备的驱动如何一点点实现
· 	然后就是要去搞明白，如果是，在没有操作系统的情况下
· 	比如没有嵌入式Linux，没有WinCE等嵌入式系统的话
· 	此时的设备的驱动如何写
· 	比如对于Nand Flash来说，想要让里面写数据
· 	准备好要写的数据
比如把要写的数据，放在一个缓存buffer里
计算出要写入的目标地址
基于Nand Flash的Block，Page，OOB等特殊结构，计算出要写入的Block，Page，OOB的编号和具体的地址
看看是否要在写之前先擦除对应的Block
由于Nand Flash的特殊性，Block只能写一次。第二次如果再要往里面写入数据，则先要备份之前已写入的数据，重新擦除Block，组织要新的整个Block的数据，然后再写入
此处，就要去判断和管理，当该Block已经有了数据，则要先把之前的数据读出来，然后擦除，准备好新数据，再写入
然后再去发送对应的Write Block的命令
准备好要写的数据后，再去发送对应的命令，实现数据的写入
并且，在写一个完整的Nand Flash的驱动之前，还需要去实现，专门用于管理Nand Flash的Block的管理程序，包括坏块的管理，负载平衡的管理等等。
· 	具体细节，可参考：
· 	【详解】如何编写Linux下Nand Flash驱动2
· 	再去看看编写驱动所在的平台和框架，已经帮你实现了哪些部分了
· 	然后再去看看你所在的平台，比如嵌入式Linux，WinCE，其中针对该驱动，是属于什么（子驱动）框架
· 	比如嵌入式Linux中的，和Nand Flash相关的就是MTD驱动框架
· 	然后看看框架和平台已经帮你实现了哪些功能
· 	比如MTD框架中，已经帮你实现了通用的Nand Flash的各种命令，各种基于Page，Block，OOB等方面的操作
· 	然后再去实现平台框架没实现的，剩余的，和设备相关的部分的代码
· 	然后再去实现那些和设备相关的，框架和平台肯定也没法帮你实现的，那部分代码，
· 	而这些代码，往往就是：操作对应的硬件的寄存器，去实现设备的初始化和设置，配置
· 	比如针对你自己的Nand Flash的Controller，去设置对应的时钟clock，开启硬件ECC校验，等等。
· 	以及实现数据的读写接口
· 	比如Nand Flash中，实现你自己的Nand Flash Controller的对应的底层数据buffer的数据的读取和写入，期间往往又会涉及到，如何在读取和写入时利用自己的硬件的ECC校验算法，以保证数据的正确性。
· 	这些底层细节，和自己硬件设备相关的细节，都是需要你自己实现的。
· 	虽然上述的举例主要是举的嵌入式Linux中的例子，但是实际上对应的逻辑，也完全适用于WinCE
需要的读者，可以自己去研究，WinCE中，针对于Nand Flash，是属于什么子框架，以及该框架帮你实现了哪些功能，还剩什么方面的功能需要你自己实现，应该也是设备初始化相关和数据收发相关的部分。

第 2 章 嵌入式驱动开发之Linux
嵌入式Linux平台下面的驱动开发，详见另外一个教程：
嵌入式Linux驱动开发  1

第 3 章 嵌入式驱动开发之WinCE
嵌入式系统WinCE平台下面的驱动开发，有空再介绍。

参考书目
[1] 关于嵌入式驱动的学习？- 知乎1 
[2] 硬件行业知识体系概要-CSDN论坛-CSDN.NET2 
[3] 嵌入式开发之嵌入式背景知识3 
[4] 嵌入式开发之基本概念和开发逻辑4 
[5] 【问题解答】用一个嵌入式开发板去实现数据采集的基本思路和逻辑5 
[6] 【整理】嵌入式领域的名词概念解释6 
[7] 【整理】嵌入式开发经验和心得总结7 
[8] 【整理】类比解释：嵌入式开发需要掌握哪些知识8 
[9] 【整理】嵌入式软件知识体系概述9