加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Vxworks下flash驱动编写流程

发布时间:2020-12-15 17:50:23 所属栏目:百科 来源:网络整理
导读:? Vxworks下flash系统结构图: 作为BSP开发人员,我们要实现的是MTD和socket两块,其它的是由文件系统自己守成的。 ? MTD层 该层提供Flash 设备识别,读写,擦除,地址映射函数的具体实现。该层实现由 Flash 驱动 开发人员完成。该层将实现在BSP 下tffsConfi

?

Vxworks下flash系统结构图:



作为BSP开发人员,我们要实现的是MTD和socket两块,其它的是由文件系统自己守成的。

? MTD层

该层提供Flash 设备识别,读写,擦除,地址映射函数的具体实现。该层实现由 Flash 驱动

开发人员完成。该层将实现在BSP 下tffsConfig.c 以及 tffsXXX.c 文件中。其中tffsConfig.c

定义有MTD 层一个重要的数组mtdTable,该数组中保存了 MTD 层实现的所有Flash 设备

的识别函数,这些识别函数将完成MTD层实现向上层的注册。

Socket 层

该层提供底层块设备硬件的控制函数实现,这些函数包括电源管理函数,Flash设备探测函数,Flash设备容量(又称窗口)设置函数,以及Socket层注册函数。Socket注册函数将以上定义的这些设备控制函数注册给TrueFFS 其他子层次使用。该层实现由 Flash 驱动开发人员完成。该层将实现在BSP 目录下sysTffs.c 文件中。注意此处的 sysTffs.c 文件名以及以上的usrConfig.c 文件名都是系统要求的,必不可随意更改,而 MTD 层具体实现文件tffsXXX.c的文件名则可自定义,如定义为 tffsMtd.c。

?

在TrueFFS 中间层的内部四个层次中,核心层和映射层由 Vxworks 操作系统实现,而MTD 层和Socket 层则由 Flash 驱动开发人员实现。当然Vxworks 操作系统本身在 MTD层也提供了一些典型Flash设备的读写和擦除函数实现,但是一般很少有机会使用这些现成的代码,而需要针对嵌入式平台下使用的特定Flash设备完成对应的读写以及擦除函数实现,即实现TrueFFS中的MTD子层。TrueFFS中间层中的Socket 子层次实现起来相对比较简单,实际上,从下文中的分析来看,直接使用 BSP 提供的模板实现(当然需要修改其中的一些参数)即可。Socket子层次只在一些非常特殊的情况下才需要关注,如功耗要求非常严格的场合。

?

Tffs文件系统初始化加载流程:

1、Usrconfig.c

usrroot()

{

…….

#ifdef??? INCLUDE_TFFS

??? tffsDrv();????????????????? /* it should be afterpcmciaInit() */

#endif?????????????????????????/* INCLUDE_TFFS */

?

……

}

tffsDrv 函数初始化 TrueFFS相关结构,Vxworks系统最多支持5 个Flash 驱动,即同时可以

向TrueFFS中间层注册5个MTD层和Socket层的实现。Vxworks维护一个内核数组对Flash

驱动进行管理,这个数组将在tffsDrv 中进行初始化。tffsDrv 完成自身初始化后,最后将调

用tffsConfig.c 文件中实现的 flRegisterComponents 函数进行 MTD层和Socket 层的初始化-

即完成MTD层和Socket层驱动向 TrueFFS中其他层(核心层)的注册。

2、MTD层和Socket层初始化

在完成上面的函数后会,会触发tffsconfig.c/flRegisterComponents()函数,在这里面会再调用sysTffs.c/sysTffsInit(),来完成Socket层的初始化工作:

向 TrueFFS 核心层注册Socket 层驱动。 sysTffsInit函数完成所有Socket 层驱动实现的注册工作,Vxworks最多支持 5个驱动实现。sysTffsInit对各Socket层驱动初始化函数的调用顺序将决定各驱动对应的驱动号,第一个被初始化的Socket 层驱动对应的驱动号为 0,依次加 1,直到 4.这个驱动号非常重要,将在MTD层初始化过程中完成Socket 层和 MTD层驱动的衔接,Socket层和MTD 层共同构成Flash 设备驱动,所以必须在驱动工作之前完成二者之间的联系。

MTD层的初始化是在flash设备创建函数tffsDevCreate()来完成的:

MTD 层的初始化(注册)总结:MTD 层注册工作在MTD 层实现的Flash 设备识别函数中

完成。当TrueFFS 中间层初次访问一个 Flash 设备时(调用tffsDevCreate 创建 Flash 设备之

时),其将遍历mtdTable 数组中每个元素指向的 Flash 设备识别函数对底层Flash 硬件设备进行识别,直到一个函数返回 OK,才停止对数组中余下函数的调用,所以识别函数在

mtdTable 数组中是位置敏感的。Flash 识别函数通过Flash 标准接口(如 NorFlash 的 CFI 接

口)读取Flash 信息,查看 Flash 设备类型,从而决定底层Flash 驱动是否针对该设备,如果可以识别(即 MTD层驱动可用) ,则将 MTD层实现的设备读写,擦除,地址映射函数注册到TrueFFS 中间层中,供上层之后使用对底层 Flash 设备进行操作。

在这个函数的最后,将会通过flIdetifyFlash()调用具体的Identify()函数来完成MTD驱动的注册。

对我们BSP工程师来说,我们只要抓住两条主线就可以了:

Socket层注册:

sysTffs.c/sysTffsInit()

MTD层注册:

tffsDevCreate()……->flIdetifyFlash()->dddIdetify()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读