基于VxWorks的NAND FLASH驱动程序设计
4.2 Socket层的实现
如果VxWorks中包含TFFS,在系统启动后,先完成内核的初始化,之后开始进行I/O的初始化操作。系统调用UsrRoot()函数,该函数再调用 tffsDrv()函数,这样就产生如图3所示的调用流程。调用这些函数的目的之一就是注册socket驱动函数。最后的注册操作都是由 xxxRegister()函数完成(这个函数和sysTff-sInit()函数的定义都在sysTffs.c中)的。该函数是通过更新 FLSocket结构体来完成注册操作的。该结构体的定义以及相关细节可以通过阅读VxWorks的帮助文件获得,在此不详述。
sysTffs.C文件的编写,可以参考其他的BSP来完成。config目录下的任何一个BSP都有该文件,设计人员可以复制其中一个到自己的BSP目录下。例如:复制wrPpmc440gp目录下的sysTffs.c文件,再根据自己的硬件电路修改FLASH BASE ADRS以及FLASHSIZE的宏定义,同时添加宏定义:#define INCLUDE_MTD_NAND。其他地方一般不需要改动。
4.3 MTD层驱动程序的实现
要创建一个TFFS块设备,首先应该调用函数tffsDevCreate(),这样就产生了如图4所示的一系列的调用函数。系统通过这一系列的调用函数来确认具体的MTD层程序。确认过程在flIdentifyFlash()函数中完成。flIdentifyFlash()通过逐个执行 xxxIdentify()表中的程序来确定合适的MTD。如果系统只有一种FLASH,则只需写一个Identify()函数可。与Socket层类似,MTD层的核心工作也是针对一个数据结构(FLFLASH)而进行的初始化操作。通过初始化操作来注册FLASH芯片的处理函数,具体的实现是在函数 xxxldentify()中完成的。