Chinaunix首页 | 论坛 | 博客
  • 博客访问: 225223
  • 博文数量: 49
  • 博客积分: 2101
  • 博客等级: 大尉
  • 技术积分: 525
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-07 10:38
文章分类

全部博文(49)

文章存档

2010年(49)

我的朋友

分类: 嵌入式

2010-09-07 11:19:38

1 FLASH类型

使用AMDAM29LV320DB90EI NORFLASH。主要规格如下:

大小:4M = 63*64k + 8*8k (根据扇区计算)

位宽:16bit

地址线:A0-A20 21

扇区:63*64K 6364kbytes大小的扇区,另有88k大小的扇区,该芯片是Bottom boot sector模式:88K扇区位于地址起始处。

 

2 TFFS文件系统层次

TrueFFS由核心层(core layer)和三个功能层,翻译层(translation layer),MTD层(MTD layer),socket层(socket layer)组成。

核心层(Core layer):核心层主要起相互连接其他几层的功能。同时它也可以进行碎片回收、定时器和其他系统资源的维护。通常WindRiver公司将这部分内容以二进制文件提供。

翻译层主要实现TrueFFSdosFs之间的高级交互功能。它也包含了控制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设备,检测设备拔插,硬件写保护等。

 

3 TFFS文件系统构建

3.1 添加相关文件

sysTffs.ctffsConfig.cFLASH芯片的MTD驱动文件cfiamd.c

3.2 配置三个层次

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硬件来决定相应的功能定义。TornadoTrueFFS支持三种通常种类的flash硬件:

PC flash卡(可移动的flash媒介)

DiskOnChip 2000 设备

板上固定的flash片组 (RFA

我们使用的RFA类型,在sysTffs.c中的函数sysTffsInit (void)尾部添加rfaregister()函数即可。

3.3配置其它需要的宏

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 */

2FLASH基址、大小及设备名

#define FLASH_BASE_ADRS CS1_FLASH_BASE

#define FLASH_SIZE        CS1_FLASH_SIZE

#define SYS_BASE_FS  "/TFFS0/"

4 创建TFFS设备步骤

1tffsDrv()

tffsDrv( )Tornado初始化TrueFFS,包括建立互斥信号量、全局变量和用来管理TrueFFS的数据结构。也包括为目标机上所有的flash设备注册 socket组件的驱动程序。

tffsDrv()发起的函数链如图2所示。其中sysTffsInit()函数定义在sysTffs.c文件中。该函数继续调用xxxRegister()函数。xxxRegister()负责从系统申请socket号,并初始化该socket,主要是针对FLSocket结构初始化。具体可以参看我们的rfaRgeister()。需要指出的是,此处完成了TFFS层次结构中的最底一层socket层。另外,根据板子的需要,有几个FLASH就需要执行其相应的注册程序,并且vxworks最多支持5socket

2 tffsDrv()函数链

2)格式化FLASH设备

FLASH设备在第一次使用时需要格式化,类似于对硬盘进行FAT32文件系统进行格式化,而我们是对FLASH进行TFFS文件系统格式化。

格式化FLASH设备的函数为tffsDevFormat(),它只需要两个参数即socket号及格式化参数。格式化参数的载体是FormatParams结构,它定义在dosformt.h中。

另外,sysTffs.c文件中提供了一个格式化函数sysTffsFormat( )。它在内部其实还是调用了tffsDevFormat()函数。它没有入口参数,它使用自己的FormatParams参数来格式化flash

 

3tffsDevCreate()

如上所述,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系统中已经生成了一个块设备。

 

4dosFsDevCreate()

socket层、MTD层都完成后,此时生成了FLASH块设备。TFFS的翻译层和核心层都是已定的,所以此时只需要将该块设备挂到操作系统的DOS文件系统下,这样我们就可以像操作硬盘一样操作FLASH。当然前提是我们得正确的初始化DOS文件系统。

5usrTffsConfig()

上述第三步和第四步在vxworks中被封装在一个函数中usrtffsconfig。该函数在D:\Tornado2.2\target\config\comps\src文件夹下usrtffs.c中。

6)在程序中我们需要做的

查看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/")暂时的改变当前的路径。ioDefautPathSetchdir都在iolib中。

 

附录

1 为成品最准备

当产品开发完成时,引导rom不在提供,我们把引导程序bootrom.bin烧写在4M flash中,并使系统从该flash启动。启动后,通过TFFS文件系统从FLASH中下载vxworks镜像到内存中。

以上所述需要四点来支持:首先在格式化4m flash的时候需要做一定的偏移。由于我们的bootrom512k,所以我们把偏移量设备为512k。其次,我们需要把bootrom.bin烧写到4m flash的起始处。再次,我们需要在FLASHTFFS文件系统中预先存储vxworks镜像。最后,在config.h文件中把default_boot_line修改成从TFFS设备启动。

1 定义偏移量

systffs.c中定义偏移量:

2 定义宏INCLUDE_TFFS_BOOT_IMAGE

systffs.c定义了该宏后,在tffsConfig.c中会包含函数tffsBootImagePut(),该函数的功能即是把bootrom.bin烧写到FLASH设备。

3vxworks镜像通过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"

 

2 当从TFFS启动时遇到的问题及解决办法

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.

阅读(3046) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~