2010年(49)
分类: 嵌入式
2010-09-07 11:19:38
使用AMD的AM29LV320DB90EI 的NOR型FLASH。主要规格如下:
大小:
位宽:16bit
地址线:A0-A20 共21根
扇区:63*64K即 63个64kbytes大小的扇区,另有8个8k大小的扇区,该芯片是Bottom boot sector模式:8个8K扇区位于地址起始处。
TrueFFS由核心层(core layer)和三个功能层,翻译层(translation layer),MTD层(MTD layer),socket层(socket layer)组成。
核心层(Core layer):核心层主要起相互连接其他几层的功能。同时它也可以进行碎片回收、定时器和其他系统资源的维护。通常WindRiver公司将这部分内容以二进制文件提供。
翻译层主要实现TrueFFS和dosFs之间的高级交互功能。它也包含了控制flash映射到块、wear-leveling、碎片回收和数据完整性所需的智能化处理功能。目前有三种不同的翻译层模块可供选择。选择哪一种层要看你所用的flash介质是采用NOR-based, 还是NAND-based, 或者SSFDC-based技术而定。
MTD层(Memory Technology Drivers)功能主要是实现对具体的flash进行读、写、擦、ID识别等驱动,并设置与flash密切相关的一些参数。TrueFFS已经包含了支持Intel,AMD以及samsung部分flash芯片的MTD层驱动。新的芯片需要新的MTD支持,你可以使用一个标准的接口来加入这些驱动。
Socket层则是提供TrueFFS和板卡硬件(如flash卡)的接口服务。其名字来源于用户可以插入flash卡的物理插槽。用来向系统注册socket设备,检测设备拔插,硬件写保护等。
sysTffs.c、tffsConfig.c、FLASH芯片的MTD驱动文件cfiamd.c
在sysTffs.c中,有用于选择翻译层和MTD层的宏定义。其中翻译层根据不同的flash技术有三种翻译层供你选择,如下表所示:
翻译层宏定义符号 |
相应的flash技术 |
INCLUDE_TL_NFTL |
NAND-based flash |
INCLUDE_TL_FTL |
NOR-based flash |
INCLUDE_TL_SSFDC |
SSFDC flash |
我们用的是NOR FLASH,所以定义宏INCLUDE_TL_FTL,另外两个宏不需要可以#undef.
MTD驱动是根据厂商及其产品型号而定的。MTD层的确定同样是使用宏定义。比如我们定义了宏定义
#define INCLUDE_MTD_CFIAMD
然后在tffsConfig.c文件中的mtdTable[]数组中添加如下
#ifdef INCLUDE_MTD_CFIAMD
cfiAmdIdentify,
#endif
其中cfiAmdIdentify就是我们的MTD驱动程序的识别函数(在cfiamd.c中)。TFFS初始化时通过对mtdTable[]中定义的识别函数进行遍历执行就能正确的绑定MTD层驱动。
尽管在sysTffs.c文件中设置一些宏定义可以加入翻译层模块和MTD层模块以及其它的一些相关工具模块,但文件的大部分内容还是专注于socket组件驱动程序的定义。这些驱动程序是一个标准的API,作为连接设备硬件和vxworks的桥梁。它们在很大程度上由你使用的flash硬件来决定相应的功能定义。Tornado的TrueFFS支持三种通常种类的flash硬件:
PC flash卡(可移动的flash媒介)
DiskOnChip 2000 设备
板上固定的flash片组 (RFA)
我们使用的RFA类型,在sysTffs.c中的函数sysTffsInit
(void)尾部添加rfaregister()函数即可。
(1)在config.h文件中添加对tffs的支持
#define INCLUDE_TFFS
#ifdef INCLUDE_TFFS
#define INCLUDE_DOSFS /* dosFs
file system */
#define INCLUDE_SHOW_ROUTINES /*
show routines for system facilities*/
#endif /* INCLUDE_DOSFS */
(2)FLASH基址、大小及设备名
#define FLASH_BASE_ADRS CS1_FLASH_BASE
#define FLASH_SIZE
CS1_FLASH_SIZE
#define SYS_BASE_FS
"/TFFS0/"
tffsDrv( )为Tornado初始化TrueFFS,包括建立互斥信号量、全局变量和用来管理TrueFFS的数据结构。也包括为目标机上所有的flash设备注册 socket组件的驱动程序。
tffsDrv()发起的函数链如图2所示。其中sysTffsInit()函数定义在sysTffs.c文件中。该函数继续调用xxxRegister()函数。xxxRegister()负责从系统申请socket号,并初始化该socket,主要是针对FLSocket结构初始化。具体可以参看我们的rfaRgeister()。需要指出的是,此处完成了TFFS层次结构中的最底一层socket层。另外,根据板子的需要,有几个FLASH就需要执行其相应的注册程序,并且vxworks最多支持5个socket。
图2 tffsDrv()函数链
FLASH设备在第一次使用时需要格式化,类似于对硬盘进行FAT32文件系统进行格式化,而我们是对FLASH进行TFFS文件系统格式化。
格式化FLASH设备的函数为tffsDevFormat(),它只需要两个参数即socket号及格式化参数。格式化参数的载体是FormatParams结构,它定义在dosformt.h中。
另外,sysTffs.c文件中提供了一个格式化函数sysTffsFormat( )。它在内部其实还是调用了tffsDevFormat()函数。它没有入口参数,它使用自己的FormatParams参数来格式化flash。
如上所述,tffsDrv()函数链最后完成了socket层,那么tffsDevCreate()将会完成MTD层。其函数链如图3所示:
图3函数链
在flIdentifyFlash()中。flIdentifyFlash()通过查询tffsConfig.c文件中的数组mtdTable[]来逐个执行其中的xxxIdentify()。例如我们的cfiamdIdentify()函数位于cfiamd.c文件中。一旦找到合适的MTD,确认程序就会更新FLFlash结构体中的数据以及指向用于读、写、擦除、映射等操作的MTD程序指针。此外,确认过程还将完成在当前FLFlash结构体中涉及的FLSocket结构体的初始化。
注意,tffsDevCreate()返回一个BLK_DEV结构,根据vxworks的设备管理知识可知,BLK_DEV结构是一个块设备的设备描述符,由此可以说明此时在vxworks系统中已经生成了一个块设备。
当socket层、MTD层都完成后,此时生成了FLASH块设备。TFFS的翻译层和核心层都是已定的,所以此时只需要将该块设备挂到操作系统的DOS文件系统下,这样我们就可以像操作硬盘一样操作FLASH。当然前提是我们得正确的初始化DOS文件系统。
上述第三步和第四步在vxworks中被封装在一个函数中usrtffsconfig。该函数在D:\Tornado2.2\target\config\comps\src文件夹下usrtffs.c中。
查看usrconfig.c可以看到,一但我们在config.h中包含了INCLUDE_TFFS,那么将会运行tffsDrv(),不需要我们自己添加。
其次,格式化工作当然是必须自己运行的,不过只需要运行一次。
再次,如果格式化工作已经做过了,那么当系统启动后我们只需要运行如下语句即可:
usrTffsConfig(0,0,"/tffs0/")
该函数将向我们的系统添加一个设备“/tffs0/”。此时,我们能通过shell 执行devs命令查看到/tffs0/设备。
最后,我们一般得设定tffs文件系统为我们的操作系统的默认路径。比如当用户通过FTP登陆到系统时,用户进入的目录就是操作系统的default path。设置default path的函数为ioDefautPathSet("/tffs0/"),当然,我们也可以使用chdir("/tffs0/")暂时的改变当前的路径。ioDefautPathSet和chdir都在iolib中。
当产品开发完成时,引导rom不在提供,我们把引导程序bootrom.bin烧写在
以上所述需要四点来支持:首先在格式化
1 定义偏移量
在systffs.c中定义偏移量:
2 定义宏INCLUDE_TFFS_BOOT_IMAGE
在systffs.c定义了该宏后,在tffsConfig.c中会包含函数tffsBootImagePut(),该函数的功能即是把bootrom.bin烧写到FLASH设备。
3将vxworks镜像通过ftp上传到板子的flash中
4 修改bootline
#define DEFAULT_BOOT_LINE \
"tffs=0,0(0,0)host:/tffs0/VxWorks h=192.168.0.153 e=192.168.0.154 u=target pw=target"
Q: When my system boots from network the network link is opened , but when I use TFFS as a boot device the network is not opened.
A: Define the ethernet device in the "other" boot parameter, for example if thr original boot device is cpm(0,0) the other (o) parameter should be cpm. The bootline in this case could be if you want to boot from a flash disk:
$tffs=0,0(0,0)host:vxworks e= o=cpm
(Needed: Include Network components\basic network initialization components\bootline processing components\network device name selection)
If this does not help it probably means that the device you want to boot from is not defined in usrNetBoot.c In the function usrNetDevNameGet only the standard file devices (SCSI, IDE, ATA) are checked. If one of these is available the "other" boot parameter is checked, but if another device is used the parameter is not checked.
To fix this add the line with the '+' sign to the module target\config\comps\src\net\usrNetBoot.c (line 97):
if ( (strncmp (sysBootParams.bootDev, "scsi", 4) == 0) ||
+ (strncmp (sysBootParams.bootDev, "tffs", 4) == 0) ||
(strncmp (sysBootParams.bootDev, "ide" , 3) == 0) ||
(strncmp (sysBootParams.bootDev, "ata" , 3) == 0) ||
(strncmp (sysBootParams.bootDev, "fd" , 2) == 0))
When some other device is used replace tffs with the correct device name.