这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 请教如何在vxworks上构建文件系统

共4条 1/1 1 跳转至

请教如何在vxworks上构建文件系统

菜鸟
2006-08-08 19:56:54     打赏

我们的硬件使用的是 m5272c3

软件环境是tornado 2.2(vxworks 5.5)

不知道这样的环境,可以使用什么文件系统?

我在网上看到一份dosfs2 for tornado 2.0的,不知道是否可以用。

不知道我是否描述清楚了,小弟初学,很多名词可能外行,见笑。

希望高人进来给指点一下。




关键词: 请教     何在     vxworks     构建     文件     系统    

菜鸟
2006-08-09 01:17:00     打赏
2楼
Tornado之TrueFFS编程者指南(一)
seasoblue
按:这篇文章主要根据tornado2.0 for Arm的在线帮助写成,前面大部分是翻译过来的,后面将详细介绍
MTD驱动的编写,并会给出实际的例子。TrueFFS对于作嵌入式系统来说非常有用,我希望这儿的每一个开
发者都能掌握它。我对TrueFFS的研究还很浅薄,所以如果有信口开河的地方还请大方之家斧正。如果能对
大家有所帮助,也就无枉此笔了。
一. 概述
1.简介
Tornado的TrueFFS是和vxworks兼容的一种M-Systems Flite实现方式,版本为2.0。它为种类繁多的flash存储
设备提供了统一的块设备接口,并且具有可重入、线程安全的特点,支持大多数流行的CPU构架。
有了Tornado的TrueFFS,应用程序对flash存储设备的读写就好象它们对拥有MS-DOS文件系统的磁碟设备的
操作一样。这样TrueFFS就屏蔽了下层存储介质的差异,为开发者提供了统一的接口方式。然而,当你设计
一个嵌入式系统的时候,了解flash存储器和磁碟设备的不同之处还是很重要的。尽管flash存储器不可能适用
于所有的嵌入式系统,但由于flash存储器具有体积小,耗电省,非易失存储的特性,在许多的环境下尤其在
移动设备和手持设备领域里它成为了理想的选择。
Flash存储器在拥有众多优点的同时也有一些自身的缺点。首先,它在写之前必须要进行擦除操作,而且不能
一个字节一个字节的擦,它只能以一个扇区、一个块或者整片的方式进行擦操作。它的写和擦操作都需要较
复杂的步骤才能完成,这就降低了它的易使用性。另外,Flash存储器最大的一个缺点就是寿命有限,可擦除
的次数因不同厂商而有所不同,一般都在1万到10万次左右。
一个运行在flash存储器上性能良好的块设备应该能针对可移动的媒体(如flash卡)处理各种复杂的情况。比
如,完全有这样的可能:当驱动程序正在进行写操作时用户却把flash卡抽出来了。这有时会造成灾难性的后
果。幸运的是,TrueFFS在设计时已经仔细考虑了flash存储器的各种特性,以及掉电和用户由于不耐烦或好
奇的原因而猛地拔出flash卡想看看发生了什么事的情况。
2.TrueFFS和块数据
Flash存储器不能无限次重复使用。它的每个扇区的擦除次数虽然很大,但却有限。因此,随着使用次数的加
长,它最终会变成只读状态。所以我们应该尽最大可能延长它的寿命。行之有效的方*就是平衡使用所有的
存储单元,而不让某一单元过度使用。这种技术被称之为wear leveling。TrueFFS使用一种基于一张动态维护
表的block-to-flash(块对应于flash)传输系统来实现wear leveling技术。当块数据被修改、移动,或碎片回收
后,这张维护表会自动调整。
就象块设备驱动需要的那样,TrueFFS把flash存储空间映射到一个特殊的连续存储块队列中,以便文件系统
可以对它进行数据的读写。这些块被从0开始连续编号。
从一个数据块中读取数据的操作非常直接。文件系统请求指定块的内容,TrueFFS响应后将块号传送到flash
存储匹配器(flash memory coordinates)中,找到之上的数据,然后把数据返回给文件系统。向块写数据也
一样的直接,只要这个块还没有被写过。TrueFFS要作的就是传送块号到flash存储匹配器(flash memory
coordinates)中,并写数据到所指定的地址。
但如果写请求试图修改一个已经写过了的块设备内容,情况就复杂了。TrueFFS先是找到flash空间中一个已
经可写的区域,然后把修改后的块数据写到那里。当数据安全地写完后,TrueFFS更新它的block-to-flash映
射结构,以使块现在映射的区域为放置修改后数据的区域。这就保证了一定程度上的wear leveling。然而,
如果存储在flash上的一些数据本质上是静态的,只有在修改时wear leveling才会产生一种被称为静态文件锁
定的问题。
存储这些静态数据的区域根本不会被*循使用,这将降低flash期望的生命值。TrueFFS通过强制转移静态区域
的方*成功克服了静态文件锁定的问题。因为block-to-flash映射表是动态的,TrueFFS能够以对文件系统不可
http://bbs.eepw.com.cn/dispbbs.asp?BoardID=3&ID=2661&replyID=&skin=1
(第 1/2 页)2006-6-3 17:45:36
电子产品世界-嵌入式系统设计-[原创]Tornado之TrueFFS编程者指南(一)
见的方式管理这些wear-leveling转移。由于绝对强制wear-leveling方式会对性能产生一些负面的影响,所以
TrueFFS采取了一种非绝对wear-leveling的算*。它保证了所有空间的使用近似平等。
最后,TrueFFS的wear-leveling算*更增强了突破被称为死锁这种模式的性能。
所谓死锁就是一些简单的wear-leveling算*只是两个或多个单元长时间循环而忽略了其余的单元的现象。
3.碎片回收
块数据的修改使得flash的一些块区域不再包含合*的数据,并且这些区域在擦除之前变得不可写。如果没有
机制来回收这些区域,flash很快就会变成只读的状态了。不幸的是由于这些块不可以单独擦除,回收这些块
就有些复杂了。单次擦除被限制在一个叫作擦除单元(erase unit)的较大范围内。如对于Intel的flash器件
来说是64k字节。
TrueFFS使用一种被称为碎片回收(garbage collection)的机制来回收那些不再包含有效数据的块。该机制
从一个预擦除单元(source erase unit)内拷贝所有的有效数据块到另一个新的被称为转移单元(transfer
unit)的擦除单元。TrueFFS然后更新block-to-flash映射表再擦除这个废旧的预擦除单元。
这样,原来的块出现在外界时仍然包含了原来的数据,虽然这些数据现在已经存放在flash存储器的其它空
间。
怎样触发碎片回收功能呢?如果太频繁,则会降低wear-leveling的效果,并影响整个flash的性能。因此在
TrueFFS内部,碎片回收只是在块分配算*需要的时候才会触发。块分配算*尽量保持在同一个擦除单元
(erase unit)内有一段连续的自块池。如果块池变得太小,块分配算*就会马上采用碎片回收算*进行碎片
回收。然后碎片回收算*就会找到并回收和下面标准最吻合的擦除单元(erase unit):
l 废块最多
l 擦除周期数据最少
l 最静态的区域
另外,碎片回收算*也会采用随机选择的处理方*。这样可以保证回收处理能够均匀地覆盖整修存储空间,而
不会由于应用程序使用数据的方式而偏差。
http://bbs.eepw.com.cn/dispbbs.asp?BoardID=3&ID=2661&replyID=&skin=1
(第 2/2 页)2006-6-3 17:45:36

菜鸟
2006-08-09 01:19:00     打赏
3楼

COLDFIRE MCF5272是可以用TFFS的!但是你的TORNADO2。2必须包含TFFS组件!即在HARDWARE----TRUEFFS是有的!

看看一个老大的作品:

电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
MFC5272_BOOTROM开发笔记
/*------------------------------------------------------------------------
Module: MFC5272_BOOTROM开发笔记.txt
Author: amine@263.net
Project:
State:
Creation Date: 2003-01-09
Description: 从各角度描述开发过程, 可能有重复
关键步骤专题描述, 小修改在相关文件描述
[!!!!!]本文档可能微小处与代码不同,如#,@命令, cache enable等
------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
Purpose: 硬件环境
------------------------------------------------------------------------*/
ColdFire5272[66M]
CS0-Am29lv160DB[2M] [0xFFC00000-0xFFE00000]
CS1-Am29lv160DB[2M] [0xFFE00000-0xFFFFFFFF]
CS7-SDRAM[16M] [0x00000000-0xFFFFFFFF]
/*------------------------------------------------------------------------
Purpose: 设计目标
------------------------------------------------------------------------*/
启动TFFS文件系统
启动ftp服务器, 通过它可操作TFFS文件系统, 如应用程序&参数文件
简化应用程序工作, 辅助配置系统组件, 简化初始化过程,
缩小程序大小, 尽量复用bootRom代码
可选程序加载方式: TFFS|网络, 方便调试和程序发布
bootrom程序代码可用于Probe仿真和Flash写入
bootRom加载到RAM中运行, 加载地址0x200000, SP在0x1000
应用程序加载到RAM中运行, 加载地址0x1000, SP[?]
第1片flash写入bootrom, 大概使用400K
第2片flash建立TFFS文件系统, 应用程序文件和参数文件放在文件系统中,
应用程序未加入自己代码时约为1140K
/*------------------------------------------------------------------------
Purpose: bootrom编译环境配置
------------------------------------------------------------------------*/
进入Dos shell
运行torvars.bat配置Dos shell的环境变量
进入相应的BSP目录
make bootrom_uncmp [用于仿真调试, #define RAM_SIM]
make bootrom_unmcp.hex [用于Flash写入,#undef RAM_SIM]
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 1/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
/*------------------------------------------------------------------------
Purpose: 与应用程序的配合
------------------------------------------------------------------------*/
在config.h中为应用程序添加必要的组件, 删除冗余组件[!!!!!已去除cache enable]
!有些组件不能通过这种方式删除, 应用工程会自动添加
!虽#undef USER_D_CACHE_ENABLE, 应用工程其值为TRUE,
5272没有data cache, 影响网络, 需手动修改
应用工程会自动添加bootRom中源代码文件
!ftpdlib.c未自动加入, 需手动
进入应用程序后, TFFS加载点消失, 需在usrAppInit后重用usrTffsConfig()挂入
ftp和telnet服务器会由系统启动
/*------------------------------------------------------------------------
Purpose: 应用程序开发环境配置
------------------------------------------------------------------------*/
1. 安装tornado for cf 2.1
2. 利用/mfc5272 bootrom/目录, 将些文件复制到新安装的tornado目录下
bootrom.bin为bootrom执行影像, 用于Flash写入
将allxxxx/和bspxxxx/目录复制到\target\config\下
将tffsConfig.c复制到\target\src\drv\tffs\下
3. 修改库target\lib\libMCF5200gnuvx.a,删除ftpdlib.o
需要使用torvars配置arcf的路径
arcf -d libMCF5200gnuvx.a ftpdLib.o
注意目标模块名区分大小写
4. 从bspxxxx上创建应用程序工程
需手动加入target\config\bspxxxx\ftpdlib.c到工程中
5. application init组件
程序调试时去除
程序发布时加入
6. 在vxworks的编译规则中加入应用代码的头文件目录
如: -Ie:/dsxxxx/include
7. 主机IP设置和bootline一致
若通过网络加载调试, 可在主机启动tornado自带ftp server
在user/rights窗口添加用户, 用户名和密码应和bootline一致
设置home目录, 为安装tornado的盘符, 如D:\
工程名/目录名一致, 设为wpjcf与bootline一致
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 2/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
8. targetserver配置
选择wdbrpc
backend: 填入target的ip地址, 与bootline一致
core file: 指向工程目录下/default/vxworks
9. 调试时, 建议都使用网络加载
需要删除tffs下vxworks执行程序, 否则会加载tffs上的程序运行
删除后, 系统会加载tffs程序失败后, 自动从主机上网络加载
另外也可以进入boot, 强制用"#"命令从网络加载
参考相关描述
/*------------------------------------------------------------------------
Purpose: Vision Click环境配置&使用[7.10A]
------------------------------------------------------------------------*/
1. 关闭Welcome to visionClick对话框, 不习惯快速方式
用open project file[F12]激活project/load对话框,
在load option tab设置AB, BDX文件的路径, 如:
D:\TornadoCF\target\config\bspxxxx\vxworks.ab
D:\TornadoCF\target\config\bspxxxx\vxworks.bdx
在project config tab, 选择类似的工程进行修改
填写ab, bdx文件的路径, 以及bootrom源代码的搜索路径
reset symbol = romInit
microproccecer = MFC5272
target control = visionProbe
RTOS = vxworks
MHZ = 66MHZ
sim register file = 设置CPU寄存器的初始值文件, 需要手动编辑
start stack = 0x200000
end stack = 0
配置完成后点击OK进入调试模式
2. convert使用
生成仿真调试用的ab, bdx文件
input module = D:\TornadoCF\target\config\bspxxxx\bootrom_uncmp
symbol file = D:\TornadoCF\target\config\bspxxxx\vxworks.ab
obj module = D:\TornadoCF\target\config\bspxxxx\vxworks.bdx
生成Flash写入的bin文件
input module = D:\TornadoCF\target\config\bspxxxx\bootrom_uncmp.hex
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 3/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
bin file = D:\TornadoCF\target\config\bspxxxx\bootrom.bin
from = 0xFFC00000 [CS0-Flash的基地址]
to = 0xFFFFFFFF [足够大就行]
3. 下载程序调试
用reset, load target&symbol, set pc[F11]
visionClick会安装配置下载程序, 进入调试
4. Flash写入
open Flash programming windows
Flash file name = D:\TornadoCF\target\config\bspxxxx\bootrom.bin
Programming alogrithm = AMD 29F160xB ( 1024 x 16 ) 1 Device
Flash的算*在Probe上, 需要连接probe才能看见Flash列表
base addr = 0xFFC00000, erase all checked
ram space: start=0, size=9820 [?有个缺省大小, ram位置?]
/*------------------------------------------------------------------------
Purpose: Probe仿真和写Flash程序的差别
------------------------------------------------------------------------*/
config.h的159行
添加宏定义RAM_SIM以区分仿真和flash程序
#define RAM_SIM /*用于Probe仿真调试*/
#undef RAM_SIM /*用于flash写入*/
rominit.s的284行
仿真直接使用romStart的RAM地址跳转,而不用ROM_TEXT_ADRS偏移
movel #_romStart,a0
#ifndef RAM_SIM
subl #_romInit,a0
addl #ROM_TEXT_ADRS,a0
#endif
movel d7,a7@- /* push start type */
jsr a0@
bootinit.c的252行
仿真时跳过从ROM复制代码到RAM的步骤.
#ifndef RAM_SIM
((FUNCPTR)ROM_OFFSET(copyLongs)) (ROM_TEXT_ADRS, (UINT)romInit,
ROM_COPY_SIZE / sizeof (long));
#endif
bootInit.c
为了在visionClick看见源代码
产生复制文件bootInit_uncmp.c
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 4/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
Makefile:
为了在visionClick看见源代码
ADDED_CFLAGS = -g
/*------------------------------------------------------------------------
Purpose: TFFS驱动
------------------------------------------------------------------------*/
bootconfig.c:bootCmdLoop:开始
将下面这段代码从tffsLoad()移到bootCmdLoop()的起始处
以保证在各种bootline设置下,都会加载TFFS
if (tffsDrv () != OK)
printf ("tffsDrv fail!.\n");
printf ("Attaching to TFFS... ");
dosFsInit (NUM_DOSFS_FILES); /* initialize DOS-FS */
if (usrTffsConfig (0, 0, "/DSxxxx/vxworks") == ERROR)
printf ("usrTffsConfig failed.\n");
printErr ("done.\n");
bootconfig.c:bootCmdLooptch [!!!!!#命令改为网络加载, 与x86体系兼容]
添加tffs格式化和tffs加载命令
case ''''z'''': /* tffs format */
if( tffsDevFormat(0,0) != OK )
printErr ("tffsDevFormat fail!.\n");
break;
case ''''#'''': /* tffs boot */
if (tffsLoad (0, 0, "/DSxxxx/vxworks", &entry) == OK)
{
go (entry);
}
else
{
taskDelay (sysClkRateGet ()); /* pause a second */
reboot (BOOT_NO_AUTOBOOT); /* something is awry */
}
break;
bootconfig.c:autoboot()
先从TFFS加载应用程序, 不成功再从网络加载
if (tffsLoad (0, 0, "/DSxxxx/vxworks", &entry) == OK)
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 5/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
go (entry); /* ... and never return */
else
{
printf ("Can''''t load boot file from TFFS!!\n");
printErr ("\nError loading file: errno = 0x%x.\n", errno);
taskDelay (sysClkRateGet ()); /* pause a second */
}
config.h
引入TFFS相关的各种组件
参考相关描述
sysTffs.c
引入自定义MTD函数, 定义Flash地址和容量
参考相关描述
lv160Mtd.c
配置FLFlash参数, 填写erase, write, map回调函数
参考相关描述
ftpdlib.c
配置登录路径, 以操作TFFS文件系统
参考相关描述
tffsConfig.c
在原目录下, 修改添加自定义MTD到mtdTable[]
FLStatus lv160MTDIdentify(FLFlash vol);
MTDidentifyRoutine mtdTable[] = /* MTD tables */
{
#ifdef INCLUDE_MTD_LV160
lv160MTDIdentify,
#endif
/*------------------------------------------------------------------------
Purpose: 网络初始化分离
------------------------------------------------------------------------*/
从bootLoad()分离出网络初始化
添加int netInit(char * bootString)函数
将bootLoad中相关变量定义,网络初始化移入netInit()中,保留网络加载代码
不用作大修改, 只需在起始处加入定义
BOOT_PARAMS params;
并加入bootline解析代码
/* interpret boot command */
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 6/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
if (usrBootLineCrack (bootString, ¶ms) != OK)
return (ERROR);
netInit中会使用bootline中的网络设备名和号
bootconfig.c:bootCmdLoop:开始
加入网络初始化调用netInit, 需放在usrBootLineInit之后
if( netInit(BOOT_LINE_ADRS) == ERROR )
printf ("netInit failed.\n");
config.h:bootline:
主机IP地址[h],登录主机ftp服务器的用户名[u],密码[pw]
参考相关描述
/*------------------------------------------------------------------------
Purpose: 目标机FTP服务启动
------------------------------------------------------------------------*/
目标机FTP服务用来下载应用程序到TFFS
bootconfig.c:bootCmdLoop:netInit后
用缺省端口号启动ftp服务
在ftpdlib.c指定缺省目录,应用程序中也可用
缺省为匿名登录, 没有密码
#ifdef INCLUDE_FTP_SERVER
if( ftpdInit(0,0) == ERROR)
printf ("ftpdInit failed.\n");
#endif
ftpdlib.c
参考\TornadoCF\target\unsupported\src\netwrs\ftpdlib.c
987: /*ioDefPathGet (pSlot->curDirName);*/
988: strcpy(pSlot->curDirName,"/DSxxxx/");
设置ftp的登录目录, 以操作TFFS文件系统
不使用ioDefPathSet, 应用程序也可使用
必须为/DSxxxx/, 不能为/DSxxxx
库操作:
需要删除库自带的ftpdlib.o, 以引入ftpdlib.c
arcf -d libMCF5200gnuvx.a ftpdLib.o
注意模块名区分大小写
/*------------------------------------------------------------------------
Purpose: Watchdog&运行灯驱动
------------------------------------------------------------------------*/
清看门狗使用pa14, 运行灯使用pa8
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 7/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
bootconfig.c的1153行
将Watchdog&运行灯的周期触发放在tRoot任务中
缺省时,tRoot任务启动tBoot任务后退出
while(1){
taskDelay (sysClkRateGet()/4); /*延时0.25s*/
*M5272_GPIO_PADAT(SIM_BASE) = (1<<14)+(1<<8);
taskDelay (sysClkRateGet()/4);
*M5272_GPIO_PADAT(SIM_BASE) = 0;
}
syslib.c的380行
*M5272_GPIO_PADDR(SIM_BASE) = (1<<14)+(1<<8);
端口A的初始化放在sysBusInit()中, 参考硬件配置描述
/*------------------------------------------------------------------------
Purpose: BOOTLINE修改&启动应用程序方式
------------------------------------------------------------------------*/
网络加载:
#define DEFAULT_BOOT_LINE \
"motfec(0,0)host:/tornadocf/target/proj/wpjcf/default/vxWorks " \
"h=192.166.0.3 e=192.166.0.2 u=dsxxxx pw=dsxxxx tn=vxtarget"
TFFS加载
#define DEFAULT_BOOT_LINE \
"tffs=0,0(0,0)host:/DSxxxx/vxworks " \
"h=192.166.0.3 e=192.166.0.2 u=dsxxxx pw=dsxxxx tn=vxtarget"
使用网络DEFAULT_BOOT_LINE, 简化网络初始化代码修改, 应用程序也使用
自动启动先从TFFS加载, 失败后正常按bootline网络加载
#命令强制从TFFS加载, 不理会bootline设置
/*------------------------------------------------------------------------
Purpose: 串口2加载TTY
------------------------------------------------------------------------*/
sysLib.c:sysBusInit()
将端口D的相关管脚初始化串口2使用
*M5272_GPIO_PDCNT(SIM_BASE) = 0x000002AA;
config.h
重定义CONSOLE_TTY, CONSOLE_TTY在configAll.h中定义为0
#undef CONSOLE_TTY
#define CONSOLE_TTY 1 /* console channel */
/*------------------------------------------------------------------------
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 8/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
Purpose: ALL目录下的修改
------------------------------------------------------------------------*/
bootConfig.c
作了大量修改, 细节参考各专题和文件修改描述
主要是加载TFFS文件系统, 开关狗&运行灯,
分离网络初始化和网络加载, 启动ftp服务
分离TFFS初始化和TFFS加载
添加TFFS格式命令和网络启动命令, 修改@命令为固定TFFS启动
修改自动加载启动,先TFFS启动, 若失败则网络启动
bootInit.c
仿真时跳过从ROM复制代码到RAM的步骤.
参考仿真程序设置
usrConfig.c的306行[?是否有必要]
修改系统时钟的频率, 由60ticks/sec改为100ticks/sec
sysClkRateSet (100);
/*------------------------------------------------------------------------
Purpose: ALL目录下bootconfig.c的修改
------------------------------------------------------------------------*/
240: #define TIMEOUT 3 /* number of seconds before auto-boot */
将自启动等待时间由7秒改为3秒
1007: usrRoot()[tRoot]:
sysClkRateSet (100); /* set system clock rate */
修改系统时钟的频率, 由60ticks/sec改为100ticks/sec
1153: usrRoot()[tRoot]:
/*清看门狗[pa14]&运行灯[pa8]*/
参考相关描述
1213: bootCmdLoop()[tBoot]:
/*初始化加载TFFS*/
参考相关描述
1227: bootCmdLoop()[tBoot]:
/*初始化加载网络和FTP服务器*/
参考相关描述
1330: bootCmdLoop()[tBoot]:
case ''''z'''': /* tffs format */
添加tffs格式化命令, 调用tffsDevFormat(0,0)
参考相关描述
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 9/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
1335: bootCmdLoop()[tBoot]:
case ''''#'''': /* tffs boot */
添加tffs加载命令, 固定从tffs加载应用程序, 不管bootline设置
参考相关描述
1541: autoboot()
先从TFFS加载应用程序, 不成功再从网络加载
参考相关描述
1597: "#", "- tffs boot",
1598: "z", "- tffs format",
bootHelp()中填写添加命令的帮助描述
1695-1716:
1944-2349:
从bootLoad()分离出网络初始化
参考相关描述
3041: tffsLoad()
tffsLoad()不初始化TFFS, 分离到bootCmdLoop()中, 直接加载应用程序
参考相关描述
/*------------------------------------------------------------------------
Purpose: BSP目录下的修改
------------------------------------------------------------------------*/
Makefile:
修改TARGET_DIR,VENDOR,BOARD定义
修改CONFIG_ALL指向ALL目录
添加调试编译选项-g
添加附加目标文件
根据启动ROM地址修改ROM_TEXT_ADRS,set-start
config.h
修改DEFAULT_BOOT_LINE
根据SDRAM容量设置LOCAL_MEM_SIZE
设置ROM基地址和容量
设置CPU片上RAM基址, 防止与SDRAM地址范围重叠
将console定位到串口2
包括TFFS文件系统组件, 网络组件
为应用程序定义组件, 根据BSP创建的工程不用进行组件配置
RomInit.s
添加CS1-FLASH2的片选配置
扩展RAM片选容量, 由缺省的4M改为16M
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 10/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
仿真直接使用romStart的RAM地址跳转
sysLib.c
端口A初始化, 看门狗&运行灯输出
串口2管脚初始化
ftpdlib.c
启动目标机bootrom的ftp服务
添加\TornadoCF\target\unsupported\src\netwrs\ftpdlib.c到BSP目录
参考相关描述
sysTffs.c
参考\TornadoCF\target\src\drv\tffs\sockets\mv177-sysTffs.c
更名为sysTffs.c添加到Bsp目录, 少量修改
参考相关描述
lv160Mtd.c
参考\TornadoCF\target\src\drv\tffs\amdmtd.c
更名为lv160Mtd.c添加到Bsp目录, 较多修改
参考相关描述
/*------------------------------------------------------------------------
Purpose: BSP目录下Makefile的修改
------------------------------------------------------------------------*/
27: TARGET_DIR = dsxxxx
28: VENDOR = !!!
29: BOARD = dsxxxx
31: CONFIG_ALL = ..\allxxxx
将缺省all的文件复制到allxxxx目录, 在allxxxx目录下作自己的修改
修改CONFIG_ALL定义, 指向自己的ALL目录
32: ADDED_CFLAGS = -g
为了在visionClick中看见源代码, 添加调试编译选项-g
33: MACH_EXTRA = sysTffs.o lv160mtd.o ftpdlib.o
将新加入BSP目录下的源文件, 编译入bootrom影像
加入相应的目标文件名, make会自动识别依赖关系,并编译入程序
根据该BSP创建工程时, 这几个附加模块会自动加入
41: ROM_TEXT_ADRS = ffc00008 # ROM entry address
根据ROM地址设置入口地址, 为ROM地址加8
前8字节由SP, PC两指针占据
61: NO_VMA_FLAGS = --ignore-vma --set-start=0xffc00000 \
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 11/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
64: VMA_FLAGS = --ignore-vma --set-start=0xffc00000
根据ROM地址设置set-start, 以生成绝对地址影像
/*------------------------------------------------------------------------
Purpose: BSP目录下config.h的修改
------------------------------------------------------------------------*/
#define DEFAULT_BOOT_LINE \
"motfec(0,0)host:/tornadocf/target/proj/wpjcf/default/vxWorks " \
"h=192.166.0.3 e=192.166.0.2 u=dsxxxx pw=dsxxxx tn=vxtarget"
主机IP地址[h],登录主机ftp服务器的用户名[u],密码[pw]
DEFAULT_BOOT_LINE使用网络加载, 可以简化网络初始化
而TFFS初始化相对简单, 少量代码就可以配置启动, 参考相关代码
64: #define LOCAL_MEM_SIZE 0x01000000 /* amine:16M, 4Meg memory is default */
根据SDRAM容量设置LOCAL_MEM_SIZE
73: #define ROM_BASE_ADRS 0xffc00000 /* amine:ffe, base address of ROM */
根据片选参数设置ROM基地址
77: #define ROM_SIZE 0x00200000 /* amine:2M, 1Meg ROM space */
根据Flash存储器大小配置ROM容量, 只是bootrom程序调入RAM用
应用程序从文件系统加载elf文件, 在RAM中重定位
84: #define INTERNAL_SRAM_BASE 0x20000000 /*amine:0x400000, base of internal SRAM */
设置CPU片上RAM基址, 防止与SDRAM地址范围重叠
117: #undef CONSOLE_TTY
118: #define CONSOLE_TTY 1 /* console channel */
缺省console定位在串口1上, 重定位到串口2上
159: #undef RAM_SIM /*用于Probe仿真调试*/
定义区分Probe仿真和Flash写入
162:
#define INCLUDE_TFFS
#define INCLUDE_MTD_LV160
#define INCLUDE_SHOW_ROUTINES /* optional */
#define INCLUDE_DOSFS /*DOS filesystem backward-compatibility*/
#define INCLUDE_CBIO /*CBIO (Cached Block I/O) Support, cbioLib*/
#define INCLUDE_DOSFS_CHKDSK /*DOS File System Consistency Checker*/
#define INCLUDE_DOSFS_FAT /*DOS File System FAT12/16/32 Handler*/
#define INCLUDE_DOSFS_FMT /*DOS File System Volume Formatter*/
#define INCLUDE_DOSFS_MAIN /*DOSFS2 File System Primary Module*/
#define INCLUDE_DISK_CACHE /*Disk Cache Handler*/
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 12/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
#define SELECT_DOSFS_DIR /*DOS File System Directory Handlers*/
#define INCLUDE_DOSFS_DIR_FIXED /*DOS File System Old Directory Format Handler*/
#define INCLUDE_DOSFS_DIR_VFAT /*DOS File System VFAT Directory Handler*/
#define INCLUDE_POSIX_CLOCKS /*POSIX clocks*/
为加载TFFS, 包括相关的系统组件
INCLUDE_MTD_LV160为自定义, 包括lv160Mtd.c中回调函数
依赖组件可以从工程组件配置时得到, 有些可能不是必须
179: #define INCLUDE_FTP_SERVER
加载ftp服务器的组件
183:
#define INCLUDE_DEBUG
#define INCLUDE_SHELL
#define INCLUDE_CPLUS_DEMANGLER
#define INCLUDE_LOADER
#define INCLUDE_HW_FP_SHOW
#define INCLUDE_TASK_SHOW
为应用程序加载target debugging, 使target shell具备部分调试功能
191:
#define INCLUDE_STANDALONE_SYM_TBL
#define INCLUDE_SYM_TBL_INIT
#define SELECT_SYM_TBL_INIT
为应用程序加载built-in符号表, 方便target shell调试
会增加应用程序的大小, 可只在开发中使用, 发布程序时可去掉
195: #define INCLUDE_TELNET
使应用程序可以加载telnet服务器
196:
#undef WDB_COMM_TYPE
#define WDB_COMM_TYPE WDB_COMM_END /* default path is the network */
#define INCLUDE_WDB_SYS /*WDB_COMM_NETWORK不支持系统调试*/
更改WDB的接口, 以支持应用程序的system调试
200:
#undef INCLUDE_BOOTP /* bootp */
#undef INCLUDE_PROXY_CLIENT /* proxy arp client (Sl**e Board) */
#undef INCLUDE_TFTP_CLIENT /* tftp client */
#undef INCLUDE_NET_HOST_SETUP
#undef INCLUDE_NET_REM_IO
#undef INCLUDE_ARP_API
#undef INCLUDE_HOST_TBL
去掉应用程序一些无用组件, 以减少程序大小[是否无用尚待确认:)]
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 13/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
有些组件不能去除, 创建工程时会自动添加
/*------------------------------------------------------------------------
Purpose: BSP目录下RomInit.s的修改
------------------------------------------------------------------------*/
174行:
添加CS1-FLASH2的片选配置, 参照CS0的配置,
只需修改变换寄存器名称, 和Flash2的起始地址就行
/* program /CS1 */
movel #(ROM_BASE_ADRS + 0x200000 + \
M5272_CS_CSBR_EBI_1632 + \
M5272_CS_CSBR_BW_WORD + \
M5272_CS_CSBR_ENABLE),d0
movel d0,M5272_CS_CSBR1(SIM_BASE)
movel #(M5272_CS_CSOR_BAM_2M + \
M5272_CS_CSOR_WS(5)),d0
movel d0,M5272_CS_CSOR1(SIM_BASE)
215行:
扩展RAM片选容量, 由缺省的4M改为16M
movel #(M5272_CS_CSOR_BAM_16M + \
M5272_CS_CSOR_WS(0x1f)),d0
movel d0,M5272_CS_CSOR7(SIM_BASE)
284行
仿真直接使用romStart的RAM地址跳转,而不用ROM_TEXT_ADRS偏移
参考仿真程序设置
/*------------------------------------------------------------------------
Purpose: BSP目录下sysLib.c的修改
------------------------------------------------------------------------*/
sysBusInit()
381: /*清看门狗[pa14]&运行灯[pa8]定义为输出*/
382: *M5272_GPIO_PADDR(SIM_BASE) = (1<<14)+(1<<8);
sysBusInit()
串口2管脚初始化, 用串口2为console
401: *M5272_GPIO_PDCNT(SIM_BASE) = 0x000002AA;
/*------------------------------------------------------------------------
Purpose: BSP目录下sysTffs.c的修改
------------------------------------------------------------------------*/
参考\TornadoCF\target\src\drv\tffs\sockets\mv177-sysTffs.c
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 14/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
110: #define INCLUDE_MTD_LV160
包括自己的MTD代码, undef其他类型MTD
121: #undef INCLUDE_TFFS_BOOT_IMAGE /* include tffsBootImagePut() */
boot image与TFFS使用不同Flash芯片, 此功能不需要
122: #define FLASH_BASE_ADRS (0xFFE10000)
123: #define FLASH_SIZE (0x001F0000)
根据Flash地址和容量设置, flash地址为0xFFE00000,
跳过前面64K不规则扇区, 简化mtd代码编写
**WriteProtect(), **WriteEnable()
屏蔽这两函数的操作代码, 使其为空函数
/*------------------------------------------------------------------------
Purpose: BSP目录下ftpdlib.c的修改
------------------------------------------------------------------------*/
参考\TornadoCF\target\unsupported\src\netwrs\ftpdlib.c
987: /*ioDefPathGet (pSlot->curDirName);*/
988: strcpy(pSlot->curDirName,"/DSxxxx/");
设置ftp的登录目录, 以操作TFFS文件系统
不使用ioDefPathSet, 应用程序也可使用
必须为/DSxxxx/, 不能为/DSxxxx
/*------------------------------------------------------------------------
Purpose: BSP目录下lv160Mtd.c的修改
------------------------------------------------------------------------*/
参考\TornadoCF\target\src\drv\tffs\amdmtd.c
参考Flash手册的命令码, 进行修改,
16位端口的命令地址应该按手册命令地址*2
该文件修改较多, 已改得面目全非, 而且与Flash芯片型号相关,
与参考文件无*对照[不太满意, 有功夫重写:(]
下面就作原则性描述:
static void FAR0 * lv160MTDMap(FLFlash *vol, CardAddress addr, int inter)
{
UINT32 ret;
ret = 0xFFE10000 + addr;
return (void FAR0 *)ret;
}
重写map函数, 将指针传回回调结构
系统缺省的map函数, 返回地址会跳跃出错
对直接映射在CPU地址空间的Flash存储器, 这个函数很简单.
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 15/18 页)2006-6-3 9:17:49
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
static FLStatus lv160MTDWrite(FLFlash vol, CardAddress address,
const void FAR1 *buffer, int length, FLBoolean overwrite)
填写write函数,与Flash芯片相关, 没什么好说
static FLStatus lv160MTDErase(FLFlash vol, int firstErasableBlock, int numOfErasableBlocks)
填写erase函数,与Flash芯片相关, 需赋值erasableBlockSize设置块大小
TFFS缺省虚拟块大小为64K, 小扇区Flash会连续擦除多个块
FLStatus lv160MTDIdentify(FLFlash vol)
vol.interle**ing = 1;
flSetWindowBdth(vol.socket,16);/* use 16-bits */
flSetWindowSpeed(vol.socket,120); /* 120 nsec. */
flSetWindowSize(vol.socket,(0x200000-0x10000) >> 12);
跳过扇区不规则的前64K空间
vol.chipSize = (0x200000-0x10000); /* 2M*/
vol.noOfChips =0x1; /*one chip.*/
vol.erasableBlockSize = 0x10000; /* 64k bytes.*/
vol.flags |= SUSPEND_FOR_WRITE;
vol.write = lv160MTDWrite;
vol.erase = lv160MTDErase;
vol.map = lv160MTDMap;
/*------------------------------------------------------------------------
Purpose: 未尽事宜
------------------------------------------------------------------------*/
TOD 修改ftpdlib.c代码, 以添加用户和密码
TOD 应用程序网络会死, 可能与USER_D_CACHE_ENABLE有关
TOD 添加TFFS低级格式化命令,tffsDevFormat不象想像的彻底
/*------------------------------------------------------------------------
Purpose: 疑难杂症
------------------------------------------------------------------------*/
SDRAM容量设为16M时, romStart中清零4M-16M时出现系统崩溃
fillLongs ((UINT *)((UINT)romInit + ROM_COPY_SIZE),
((UINT)SYS_MEM_TOP - ((UINT)romInit + ROM_COPY_SIZE))
/ sizeof(long), 0);
现暂时设LOCAL_MEM_SIZE为8M
visionClick中不能看见romInit.s文件的源代码
visionClick中不能看全c文件的源代码,只能看见前面部分
Makefile中TARGET_DIR作用?
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 16/18 页)2006-6-3 9:17:50
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
根据BSP创建的工程, 未包括ftpdlib.c, 需要手动加入?
在config.h中已#undef USER_D_CACHE_ENABLE,
但是创建工程中值为TRUE, 导致应用程序网络死?
有些组件不能在config.h中undef掉, 创建工程后又自动添加?
每次写Flash需要重新上电Probe和目标机?
系统自带的MTD的map函数返回Flash地址不正确, 会间隔跳过一些地址?
VisionClick启动时和MS office冲突?
应用程序网络死, 可能与cache有关, 去掉USER_D_CACHE_ENABLE也不行?
/*------------------------------------------------------------------------
Purpose: 经验教训
------------------------------------------------------------------------*/
当TFFS调试遇问题时, 可以sysTffs.c的回调函数中打印输出信息, 帮助调试.
在已有TFFS的Flash上使用tffsDevFormat, 并不会擦除所有扇区建立TFFS.
删除TFFS文件时, 会调用MTD的Erase函数.
即使不使用12V擦除Flash, 也不能#undef SOCKET_12_VOLTS[flcustom.h]
否则连tffsDrv()调用会失败, 因为VppOn, VppOff回调指针未填写
[这个问题折腾了我一天:(]
tffsDevFormat格式化Flash时, 会回调MTD的erase, write, read, map
有函数错误就会失败
tffsDrv()和tffsDevFormat()失败后, errno为0, 不能帮助辨识错误
定位错误需要在各回调函数输出信息
tffsDevCreate必须在tffsDevFormat()格式化后的Flash创建
tffsDrv()成功后, 就可以调用tffsDevFormat(), 而不用创建块设备和加载Dos文件系统
系统自带的MTD的map函数返回Flash地址不正确, 会间隔跳过一些地址
需要重写回调函数, 其实很简单, 返回Flash地址加偏移就行
不能使用window.baseaddr, 而需要使用与sysTffs.c中一致的FLASH_BASE_ADRS
因为map调用可能window.baseaddr未初始化, 会引起系统崩溃
[这个问题折腾了我三天, 郁闷死拉:(]
库中所带的ftpdlib.o, 为老式ftp服务器,
用ftp工具连接后, 不能看见文件列表, 但是可上传文件
用dos shell登录后, 能看见文件列表
需要使用\TornadoCF\target\unsupported\src\netwrs\ftpdlib.c, 参考相关描述
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 17/18 页)2006-6-3 9:17:50
电子产品世界-嵌入式系统设计-[原创]MFC5272_BOOTROM开发笔记
应用程序调试时, 不能直接运行usrAppInit(),
调试器连接后, 可由target shell或调试器运行
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=4733&page=1
(第 18/18 页)2006-6-3 9:17:50

[align=right][color=#000066][此贴子已经被作者于2006-8-8 17:22:07编辑过][/color][/align]

菜鸟
2006-08-09 01:24:00     打赏
4楼
ECNChina
嵌入式操作系统VxWorks中TFFS文件系统的构建
[ 作者:佚名 | 转贴自:本站原创 | 点击数:637 | 更新时间:2006-1-13 | 文章录入:zhouchang ]
摘要:目前的嵌入式系统多使用FLASH作为主存,因此,如何有效管理FLASH上的数据非常重要。文章以MX29LV160BT芯
片为例,讨论了在VxWorks操作系统下Nor Flash上建立TFFS文件系统的一般步骤,从而为FLASH上的数据管理提供了理想
的选择方式,同时也为开发者和用户升级程序提供了方便。
关键词:VxWorks Flash MTD TFFS 文件系统
嵌入式系统正随着Internet的发展而在各个领域得到广泛的应用,作为一个优秀的操作系统,VxWorks实现了比其他实时操
作系统更好的有效性、商用性、可裁减性以及互操作性,广泛应用在通信、军事、航空、航天等高精尖技术及实时性要求
极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。
如今越来越多的嵌入式操作系统中,通常都使用FLASH作为主存介质。许多开发者和用户为了方便以后升级用户程序,通
常在FLASH上建立TFFS文件系统,建立文件系统后,我们就可以象在windows操作系统下对硬盘操作一样,进行数据的拷
贝、删除以及文件的建立等操作。
NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先有
EPROM和EEPROM一统天下的局面。NOR的特点是芯片内执行XIP execute In Place,这样应用程序可以直接在flash闪存内运
行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,因此在嵌入式系
统得到广泛的应用。
一、 TFFS文件系统结构简介
Tornado的TrueFFS是和VxWorks兼容的一种M-Systems Flite实现方式,版本为2.0。它为种类繁多的flash存储设备提供了统一
的块设备接口,并且具有可重入、线程安全的特点,支持大多数流行的CPU构架。有了Tornado的TrueFFS,应用程序对
flash存储设备的读写就好象它们对拥有MS-DOS文件系统的磁碟设备的操作一样。
如图1所示,TrueFFS由核心层(core layer)和三个功能层,翻译层(translation layer),MTD层(MTD layer),socket层
(socket layer)组成。
核心层(Core layer):核心层主要起相互连接其他几层的功能。同时它也可以进行碎片回收、定时器和其他系统资源的维
护。通常WindRiver公司将这部分内容以二进制文件提供。
翻译层主要实现TrueFFS和dosFs之间的高级交互功能。它也包含了控制flash映射到块、wear-leveling、碎片回收和数据完整
性所需的智能化处理功能。目前有三种不同的翻译层模块可供选择。选择哪一种层要看你所用的flash介质是采用NORbased,
还是NAND-based, 或者SSFDC-based技术而定。
  Socket层则是提供TrueFFS和板卡硬件(如flash卡)的接口服务。其名字来源于用户可以插入flash卡的物理插槽。用来
向系统注册socket设备,检测设备拔插,硬件写保护等。后面将详细讲解它的功能。
  MTD层(Memory Technology Drivers)功能主要是实现对具体的flash进行读、写、擦、ID识别等驱动,并设置与flash密
http://www.ecnchina.com/Article_Show.asp?ArticleID=3782
(第 1/5 页)2006-6-5 10:34:15
ECNChina
切相关的一些参数。TrueFFS已经包含了支持Intel,AMD以及samsung部分flash芯片的MTD层驱动。新的芯片需要新的MTD支
持,你可以使用一个标准的接口来加入这些驱动。
  以上四部分,我们通常要的工作就是后两层。
  当在VxWorks下配置TrueFFS时,你必须为每一层至少包含一个软件模块。后面我们将详细讨论。
二、 MX29LV160BT芯片上建立TrueFFS文件系统
1、配置相关文件
在此,我以Nor Flash MX29LV160BT为例,开发工具为Tornado2.2 for PPC。要在VxWorks映像中包含TrueFFS文件系统,首
先必须在config.h文件中定义INCLUDE_TFFS。这使得VxWorks的初始化代码调用tffsDrv()来创建管理TrueFFS所需的结构和
全局变量,并为所有挂接了的flash设备注册socket组件驱动。在链接的时候,通过解析与tffsDrv()相关联的符号(symbols)
可以将TrueFFS所必需的软件模块链接到VxWorks映象中。
为了支持TrueFFS,每一个BSP目录下都必须包含一个sysTffs.c文件。它将TrueFFS所有的层(翻译层,socket层和MTD层)链
接到一起并和VxWorks绑定。因此,我必须编辑这个文件并决定哪一种MTD和翻译层模块应该包含到TrueFFS中。即:
#define INCLUDE_MTD_MX29LV /* MX29LV160BT MTD driver */
#define INCLUDE_TL_FTL /* FTL translation layer */
#define FLASH_BASE_ADRS 0x2a10000 /* Flash memory base address */
#undef FLASH_SIZE
#define FLASH_SIZE 0x001f0000 /*Flash memory size,2M(parameter block) */
其他无关的MTD driver包含头都#undef掉,同时定义Flash在系统中的基地址和大小。另外,还必须编辑sysLib.c中的
sysPhysMemDesc[ ]数组,将Flash基地址和大小加入到MMU中,以供将来访问Flash,否则访问Flash会失败。如果BSP目录下
没有sysTffs.c文件,那么我们可以从其他BSP目录下拷贝一个即可,然后做上述修改,其他的内容基本可以不用修改。
接下来需要修改tffsConfig.c文件,为了方便管理,通常我们将src/drv/tffs/目录下该文件拷贝到我们BSP目录下,然后再做出
修改。在MTDidentifyRoutine mtdTable[]表中加入如下语句:
#ifdef INCLUDE_MTD_MX29LV
mx29lvMTDIdentify,
#endif /* INCLUDE_MTD_MX29LV */
并在该文件开头声明。
#ifdef INCLUDE_MTD_MX29LV
FLStatus mx29lvMTDIdentify (FLFlash vol);
#endif /* INCLUDE_MTD_MX29LV */
最后就是将我们的flash相关MTD驱动加入到makefile中。即:
MACH_EXTRA = mx29lvMtd.o
为了方便我们调试MTD驱动,应该在重新编译VxWorks映象前将诸如格式化flash、创建TrueFFS块设备、绑定此块设备到
dosFs所必要的功能包含到VxWorks映像中。比如如下定义:
#define INCLUDE_TFFS
#ifdef INCLUDE_TFFS
#define INCLUDE_TFFS_DOSFS
#define INCLUDE_TFFS_SHOW
#define INCLUDE_DOSFS /* dosFs file system */
#define INCLUDE_SHOW_ROUTINES /* show routines for system facilities*/
#define INCLUDE_TL_FTL
#define INCLUDE_IO_SYSTEM
#define INCLUDE_DISK_UTIL
#endif /* INCLUDE_DOSFS */
2、MTD驱动简介
http://www.ecnchina.com/Article_Show.asp?ArticleID=3782
(第 2/5 页)2006-6-5 10:34:15
ECNChina
做了上述配置后,进入VxWorks操作系统后,我们在shell上利用tffsShow工具来显示flash的信息。TffsShow函数最终会调用
MTD驱动中的mx29lvMtdIdentiy( )函数,在mx29lvMtdIdentiy ( )函数主要是通过读取MX29LV160BT芯片的设备和厂商ID来识
别它,然后对FLFlash结构成员进行初始化,最主要的几个参数是:
type
Flash内存的JEDEC ID号。
erasableBlockSize
Flash内存的擦除块大小(字节)。设置这个值时应考虑到interleaving。因此,通常通过如下方法来设置它的大小。
Vol.erasableBlockSize = MX29LV_MTD_SECTOR_SIZE * vol.interleaving;
对于MX29LV160BT,MX29LV_MTD_SECTOR_SIZE为64K字节。
chipSize
使用来构建TrueFFS文件系统的flash实际大小(字节)。
noOfChips
使用来构建TrueFFS文件系统的flash实际片数。
interleaving
Flash内存交叉因子(interleaving factor)。即扩展数据总线的设备数。比如,一个32位数据总线上,我们可以使用4片8位
或2片16位的设备。
map
指向flash内存映射(map)函数。该函数将flash映射到内存区。
read
指向flash内存的读函数。在MTD驱动识别函数中,这个成员函数已经被初始化为缺省的读函数。通常情况下,我们不需
要再初始化它,否则还需要修改很多相关的函数。
write
指向flash内存的写函数。这个成员必须初始化,这是我们要做的一个重要工作。
erase
指向flash内存的擦除函数。这个成员必须初始化,这也是我们要做的一个重要工作。
针对FLFlash结构成员,我们所关心的两个函数就是写和擦除函数。在mx29lvMtdIdentiy()函数中必须有如下定义:
vol.write = mx29lvWrite;
vol.erase = mx29lvErase;
在mx29lvWrite()函数中主要是实现将数据写到flash中。首先需要对扇区进行解锁,然后写入写命令,之后才能进行数据的
写入。最后需要判断数据是否写完。为了确保操作成功,我们应该在写完每个数据后进行数据的比较,比较正确后方能进
行下一个数据的操作。
在mx29lvErase ()函数中主要是实现flash扇区的擦除。如今的flash一般都是按照扇区进行擦除操作的。在擦除操作之前也应该
首先对扇区进行解锁,然后写擦除建立和扇区擦除命令。擦除成功后,flash中的内容应该是0xffff。所以为了确保成功,我
们还是应该在擦除后进行比较,比较正确后方能进入下一个扇区的擦除操作,否则返回擦除错误标志。
所以,对于MTD驱动的调试,基本上就是调试写和擦除两个函数。在调试过程中,我们可以在这两个函数相应位置加入打
印语句来调试。为了能调试这两个函数,我们通过在shell上输入命令tffsDevFormat来格式化flash,tffsDevFormat最终会调用
mx29lvErase和mx29lvWrite函数,如果成功就会返回0,否则返回-1。当然也可以调用tffsDevCreate函数来验证我们的写和擦
除函数的正确性。图2说明了tffsDevCreate调用过程。
http://www.ecnchina.com/Article_Show.asp?ArticleID=3782
(第 3/5 页)2006-6-5 10:34:15
ECNChina
在shell上利用tffsShow来验证mx29lvMtdIdentiy。
è tffsShow
0: socket=RFA: type=0x2249, unitSize=0x10000, mediaSize=0x1f0000
value = 49 = 0x31 = "1"
说明已正确识别到MX29LV160BT设备,设备号为0x2249。
三、 建立TFFS设备
1、挂接设备名
MTD驱动调试成功后,我们就可以给flash设备挂接上dos设备名,如下操作:
格式化:
è tffsDevFormat
value = 1
è usrTffsConfig 0,0,”/tffs0”
value = 0
然后通过devs来查看挂接的设备名。
è devs
drv name
0 /null
1 /tyCo/0
1 /tyCo/1
5 host:
6 /pty/rlogin.S
7 /pty/rlogin.M
3 /tffs0/
8 /vio
value = 25 = 0x19
看到/tffs0/说明挂接设备已经成功,接下来就可以利用dosFs文件系统相关命令来操作flash了。如,ls、copy等。
2、从Flash中启动并下载VxWorks映像
要从flash中下载VxWorks映像,首先需要把VxWorks映像拷贝到flash中,在shell中的操作命令为copy “VxWorks”,”/tffs0/
VxWorks”,然后修改config.h文件中引导行,如下:
#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 o=cpm"
修改完后,重新编译生成bootrom_uncmp.bin,并把它烧写到flash中(注意:该flash与上面建立TFFS文件系统的flash不一
样,它并没有建立文件系统)。然后重新启动,即可看到如下启动画面:
http://www.ecnchina.com/Article_Show.asp?ArticleID=3782
(第 4/5 页)2006-6-5 10:34:15
ECNChina
boot device : tffs=0,0
unit number : 0
processor number : 0
host name : host
file name : /tffs0/VxWorks
inet on ethernet (e) : 192.168.0.154
host inet (h) : 192.168.0.153
user (u) : target
ftp password (pw) : target
flags (f) : 0x0
other (o) : cpm
Attaching to TFFS... done.
Loading /tffs0/VxWorks...894304
Starting at 0x10000...
Development System
VxWorks version 5.5.1
KERNEL: WIND version 2.6
Copyright Wind River Systems, Inc., 1984-2003
CPU: Motorola ADS - PowerPC 860. Processor #0.
Memory Size: 0x1000000. BSP version 1.2/5.
WDB Comm Type: WDB_COMM_END
WDB: Ready.
到此,说明引导成功。flash整个TFFS文件系统就已经建立成功。
四、 结论
VxWorks操作系统中支持TFFS文件系统,我们将VxWorks映像作为文件放到flash上,这就有利于开发者和用户更新应用程
序而不需要影响bootrom,直接更新VxWorks映像或者将应用程序直接copy到flash中,然后装载到RAM中运行。
http://www.ecnchina.com/Article_Show.asp?ArticleID=3782
(第 5/5 页)2006-6-5 10:34:15

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]