嵌入式驱动开发 版本:v0.2 Crifan Li 摘要 此文主要介绍的嵌入式驱动开发的概念,所包含的领域。 [提 本文提供多种格式供: 示] 在线阅读 HTML HTMLs PDF CHM TXT RTF WEBHELP 下载(7zip压缩包) HTML HTMLs PDF CHM TXT RTF WEBHELP 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/ 2015-03-15 ┌─────────────────────────────────────────────────────────────────────────────┐ │修订历史 │ ├─────────────────────────────┬────────────────────────────────────┬──────────┤ │修订 0.2 │2015-03-15 │crl │ ├─────────────────────────────┴────────────────────────────────────┴──────────┤ │ 1. 增加嵌入式驱动开发的基本概念。 │ └─────────────────────────────────────────────────────────────────────────────┘ 版权 © 2015 Crifan, http://crifan.com 本文章遵从:署名-非商业性使用 2.5 中国大陆(CC BY-NC 2.5) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 目录 正文之前 1. 此文目的 1. 嵌入式驱动开发之通用内容 1.1. 驱动做了哪些事情 1.2. 写驱动的基本逻辑和流程 2. 嵌入式驱动开发之Linux 3. 嵌入式驱动开发之WinCE 参考书目 正文之前 目录 1. 此文目的 1. 此文目的 此文主要介绍的嵌入式驱动开发的基本概念和逻辑,以便于清楚想要嵌入式开发,需要涉 及到哪些东西,如何入手去开发。 第 1 章 嵌入式驱动开发之通用内容 目录 1.1. 驱动做了哪些事情 1.2. 写驱动的基本逻辑和流程 摘要 嵌入式驱动开发,不论是哪个平台,其基本上都有一些通用的知识和概念。此处总结一下 : 1.1. 驱动做了哪些事情 其实要想去搞懂,嵌入式驱动开发,首先需要搞懂,对于驱动本身,做了哪些事情。 简单说就是: • 初始化配置设备 写init方面的代码,负责将设备初始化好,便于后续的使用 其中包括去操作设备的寄存器,配置设备为对应的你所需要模式 • 实现设备的数据的接受和发送(或者叫读取和写入) 然后就是去负责实现设备的send/receive,或者叫read/write方面的函数了。 这样,当有数据被读取或写入时,有数据需要发送或接受时,就可以调用驱动底层的 函数,负责数据的收发了。 如此,设备才可以正常的工作起来。 另外,针对驱动的概念的解释,也可以参考这个:虽然经常听说驱动,但是驱动具体是啥 ? - 知乎 1.2. 写驱动的基本逻辑和流程 想要去写嵌入式驱动时的基本的逻辑和过程是: 1. 知道设备本身的工作原理 比如要给Nand Flash写驱动,那么要知道Nand Flash本身的工作原理 包括但不限于: □ Nand Flash的物理内部存储结构 Nand Flash中的Chip,Plane,Block,Page,OOB等的概念 □ Nand Flash的数据是如何读取和写入的 如何基于Page去读取数据,基于Block去擦除数据 如何发送不同的命令,去实现数据的Page的读取,Block的擦除 2. 假如是没有操作系统,没有驱动框架时,该设备的驱动如何一点点实现 然后就是要去搞明白,如果是,在没有操作系统的情况下 比如没有嵌入式Linux,没有WinCE等嵌入式系统的话 此时的设备的驱动如何写 比如对于Nand Flash来说,想要让里面写数据 a. 准备好要写的数据 比如把要写的数据,放在一个缓存buffer里 b. 计算出要写入的目标地址 基于Nand Flash的Block,Page,OOB等特殊结构,计算出要写入的Block,Page, OOB的编号和具体的地址 c. 看看是否要在写之前先擦除对应的Block 由于Nand Flash的特殊性,Block只能写一次。第二次如果再要往里面写入数据, 则先要备份之前已写入的数据,重新擦除Block,组织要新的整个Block的数据, 然后再写入 此处,就要去判断和管理,当该Block已经有了数据,则要先把之前的数据读出来 ,然后擦除,准备好新数据,再写入 d. 然后再去发送对应的Write Block的命令 准备好要写的数据后,再去发送对应的命令,实现数据的写入 并且,在写一个完整的Nand Flash的驱动之前,还需要去实现,专门用于管理Nand Flash的Block的管理程序,包括坏块的管理,负载平衡的管理等等。 具体细节,可参考: 【详解】如何编写Linux下Nand Flash驱动 3. 再去看看编写驱动所在的平台和框架,已经帮你实现了哪些部分了 然后再去看看你所在的平台,比如嵌入式Linux,WinCE,其中针对该驱动,是属于什 么(子驱动)框架 比如嵌入式Linux中的,和Nand Flash相关的就是MTD驱动框架 然后看看框架和平台已经帮你实现了哪些功能 比如MTD框架中,已经帮你实现了通用的Nand Flash的各种命令,各种基于Page, Block,OOB等方面的操作 4. 然后再去实现平台框架没实现的,剩余的,和设备相关的部分的代码 然后再去实现那些和设备相关的,框架和平台肯定也没法帮你实现的,那部分代码, 而这些代码,往往就是:操作对应的硬件的寄存器,去实现设备的初始化和设置,配 置 比如针对你自己的Nand Flash的Controller,去设置对应的时钟clock,开启硬件ECC 校验,等等。 以及实现数据的读写接口 比如Nand Flash中,实现你自己的Nand Flash Controller的对应的底层数据buffer的 数据的读取和写入,期间往往又会涉及到,如何在读取和写入时利用自己的硬件的ECC 校验算法,以保证数据的正确性。 这些底层细节,和自己硬件设备相关的细节,都是需要你自己实现的。 虽然上述的举例主要是举的嵌入式Linux中的例子,但是实际上对应的逻辑,也完全适用于 WinCE 需要的读者,可以自己去研究,WinCE中,针对于Nand Flash,是属于什么子框架,以及该 框架帮你实现了哪些功能,还剩什么方面的功能需要你自己实现,应该也是设备初始化相 关和数据收发相关的部分。 第 2 章 嵌入式驱动开发之Linux 摘要 嵌入式Linux平台下面的驱动开发,详见另外一个教程: 嵌入式Linux驱动开发 第 3 章 嵌入式驱动开发之WinCE 摘要 嵌入式系统WinCE平台下面的驱动开发,有空再介绍。 参考书目 [1] 关于嵌入式驱动的学习?- 知乎 [2] 硬件行业知识体系概要-CSDN论坛-CSDN.NET [3] 嵌入式开发之嵌入式背景知识 [4] 嵌入式开发之基本概念和开发逻辑 [5] 【问题解答】用一个嵌入式开发板去实现数据采集的基本思路和逻辑 [6] 【整理】嵌入式领域的名词概念解释 [7] 【整理】嵌入式开发经验和心得总结 [8] 【整理】类比解释:嵌入式开发需要掌握哪些知识 [9] 【整理】嵌入式软件知识体系概述