请教大侠,sysTffs.c中的FLASH_BASE_ADRS具体是怎么设置的?此地址是Flash的映射到板子上的绝对地址,还是建立TFFS文件系统的偏移地址?比如,就一块Flash,2M Bytes,Flash映射到板子的零地址处,建立文件系统时让低512k存放BootRom,高512k建立文件系统,那FLASH_BASE_ADRS应该是多少?多谢!
[align=right][color=#000066][此贴子已经被作者于2006-12-15 16:23:07编辑过][/color][/align][原创]在同一片nor flash上创建两个磁盘,能够实现非2的n次幂大小的文件系统
今天为了解决系统升级问题而考虑在同一片FLASH上创建两个独立的磁盘C和D。先打电话问了下技术支
持,说理论上可以。于是就在坛子里搜相关的文章,参考了amine的[原创]将boot flash的空闲部分作为文
件系统。
先介绍下硬件情况,程序空间256K,内存1M,文件系统FLASH16M。打算采用bootrom_res加载vxworks
映像方式启动,将vxworks映像存放在文件系统中。系统升级只需升级vxworks文件即可。原只将FLASH创建
为C盘,且向用户开放格式化磁盘操作,所以vxworks存放在C盘内有可能被用户格式化掉,不安全!由此考
虑同一片FLASH上创建两个独立的C盘和D盘,C盘为系统盘,存放vxworks映像文件,不对用户开放;D盘为
用户盘。
下面介绍具体怎么做。我将C盘大小定为1M,D盘大小定为15M。
1. sysTffs.c文件的修改。
(1)
#define FLASH_IMAGE_ADRS 0x62000000 /* 关键:为此FLASH真实基地址 */
#define FLASH_IMAGE_SIZE 0x00100000 /* 关键:为C盘大小 */
#define FLASH_BASE_ADRS 0x62100000 /* 关键:为D盘偏移地址 */
#define FLASH_SIZE 0x01000000 /* 关键:为此FLASH真实大小 */
(2)
LOCAL void sysTffsInit (void)
{
**Register ();
**Register (); /* 注册第二个设备 */
}
(3) **Register (void)中
tffsSocket[noOfDrives] = "RFA";
if (noOfDrives == 0)
{
vol.serialNo = 0;
vol.window.baseAddress = FLASH_BASE_ADRS >> 12;
}
else if (noOfDrives == 1)
{
vol.serialNo = 1;
vol.window.baseAddress = FLASH_IMAGE_ADRS >> 12;
}
noOfDrives++;
(4)
static void **SetWindow
(
FLSocket vol /* pointer identifying drive */
)
{
/* Physical base as a 4K page */
if (vol.serialNo == 0)
{
vol.window.baseAddress = FLASH_BASE_ADRS >> 12;
flSetWindowSize (&vol, FLASH_SIZE >> 12);
}
else if(vol.serialNo == 1)
{
vol.window.baseAddress = FLASH_IMAGE_ADRS >> 12;
flSetWindowSize (&vol, FLASH_IMAGE_SIZE >> 12);
}
}
(5)增加一个格式化函数
STATUS sysTffsFormatD (void) /* D盘格式化函数*/
{
STATUS status;
tffsDevFormatParams params =
{
#undef HALF_FORMAT /* lower 1M for bootimage, upper for TFFS */
#ifdef HALF_FORMAT
{0x00100000l, 99, 1, 0x10000l, NULL, {0,0,0,0}, NULL, 2, 0, NULL}, /* 关键:空出前1M空间 */
#else
{0x00000000l, 99, 1, 0x10000l, NULL, {0,0,0,0}, NULL, 2, 0, NULL},
#endif /* HALF_FORMAT */
FTL_FORMAT_IF_NEEDED
};
status = tffsDevFormat (0, (int)¶ms); /* 设备0 */
return (status);
}
STATUS sysTffsFormatC (void) /* C盘格式化函数*/
{
STATUS status;
tffsDevFormatParams params =
{
#undef HALF_FORMAT /* lower 512KB for bootimage, upper for TFFS */
#ifdef HALF_FORMAT
{0x00080000l, 99, 1, 0x10000l, NULL, {0,0,0,0}, NULL, 2, 0, NULL},
#else
{0x00000000l, 99, 1, 0x10000l, NULL, {0,0,0,0}, NULL, 2, 0, NULL},
#endif /* HALF_FORMAT */
FTL_FORMAT_IF_NEEDED
};
status = tffsDevFormat (1, (int)¶ms); /* 设备1 */
return (status);
}
2. mtd文件的修改。
if (vol.socket->serialNo == 0) /* 设备0 */
vol.chipSize = 0xF00000l; /* D盘大小 */
else if (vol.socket->serialNo == 1) /* 设备1 */
vol.chipSize = 0x100000l; /* C盘大小 */
经过上述修改,启动系统,打开shell,执行
sysTffsFormatSystem ();
usrTffsConfig(1,0,"C/");
sysTffsFormat();
usrTffsConfig(0,0,"D/");
至此成功的在同一FLASH上建立C盘和D盘。
需要特别注意,经过以下试验:
1.将FLASH_SIZE的值设置成与vol.chipSize值(0xF00000)一样,但发现格式化D盘总返回-1。不成功!论
坛中有关于只能建立2的n次幂M大小的文件系统的问题,如1M,2M,4M,8M,16M。这种情况应该符合此
问题的描述。
2.将vol.chipSize值设置成与FLASH_SIZE值(0x1000000)一样,格式化D盘时会写到FLASH_BASE_ADRS +
FLASH_SIZE (即0x63000000~0x630FFFFF地址),超出了FLASH地址空间(0x62000000~
0x62FFFFFF)。在我的系统中0x63000000~0x630FFFFF地址与0x62000000~0x620FFFFF地址为同一
FLASH空间,因此格式化D盘时就会破坏C盘的空间。同样格式化C盘也会破坏D盘空间。因此也不成功。
3.将vol.chipSize设成真实值,即0xF00000, FLASH_SIZE设成芯片大小值,即0x1000000,成功且稳定!
maomaotr你好!
请教:现在正在参考您的帖子走你的路,但是我发现我在你说的步骤指导下调试不成功啊,具体问题如下:
BSP中SST39VF160的驱动识别函数、FLASH设备的识别等不成功,正在通过打印函数的跟踪调试中……
打印信息如下:(为了能跟踪文件设备的挂接,我让系统从FLASH自启动)
VxWorks System Boot
address = 0x61b04, flashPtr = 0x6161b08000,
Copyright 1984-2002 Wind River Systems, Inc.
address = 0x6b600, flashPtr = 0x
CPU: wrSbcArm7 - ARM7TDMI (ARM)D
Version: VxWorks5.5
addr
boot device : tffs=0,0= 0x6b800, flashPtr = 0x616b800
unit number : 0
processor number : 0
add
address
host name : hgchenkv= 0x6260168lashPtr
file name : /tffs0/vxWorks
address = 0x4d2
inet on ethernet (e) : 192.168.0.145 0x61601b8r = 0x629018061
/*在***Register添加的打印跟踪信息*/
Entry of rfaRegister....
Entry of if_struct when 0....
noOfDrives = 1
Entry of rfaRegister....
Entry of if_struct when 1....
noOfDrives = 2
/*应该是调用SST的识别函数*/
Attaching to TFFS... Debug: entering SST MTD identification routine.
unlockAddr1 = 0x6120aaaa, unlockAddr1 = 0x61205554
flashPtr = 0x61200000
offSet = 0x61200002
vol.type = 0xe59f
Debug: did not identify SST39VF160 media.
tffsDevCreate failed.
usrTffsConfig failed.
Error loading file: errno = 0x0.
Can't load boot file!!
?
今天刚接触这个,正在学习和进一步的调试中,请求有经验的高手们指导,谢谢!
FLASH_BASE_ADRS是建立tffs的基址。
您好!谢谢您的指导,我比较菜,您是说
#define FLASH_IMAGE_ADRS 0x62000000 /* 关键:为此FLASH真实基地址 */
#define FLASH_BASE_ADRS 0x62100000 /* 关键:为D盘偏移地址 */
将这两句互换,改为:
#define FLASH_BASE_ADRS 0x62000000 /* 关键:为此FLASH真实基地址 */
#define FLASH_IMAGE_ADRS 0x62100000 /* 关键:为D盘偏移地址 */
谢谢您的指导,那我想请教关于建立TFFS基址的说明和应用在哪个包含文件里?谢谢!
各位好!这几个到底什么意思啊,不管怎么琢磨就是不太能理解
#define FLASH_IMAGE_ADRS 0x62000000 /* 关键:为此FLASH真实基地址 */
#define FLASH_IMAGE_SIZE 0x00100000 /* 关键:为C盘大小 */
#define FLASH_BASE_ADRS 0x62100000 /* 关键:为D盘偏移地址 */
#define FLASH_SIZE 0x01000000 /* 关键:为此FLASH真实大小 */
具体每个的意思和意义,请求各位指导!谢谢!
另求助:驱动函数中vol.type是怎么设置和运用的,请指导谢谢!
各位高手们好!我把 SST39VF160 作上文件系统分为两个磁盘用,一个用于放VxWorks映像,另一个作为FTP服务器当作DATA盘用,但是当sst39vf160mtd.c和sysTffs.c改好后,又出现了以下问题:第一个磁盘没有问题,读写擦除等操作都可用,但第二个磁盘有时不稳定有时就是错的,老是说vol.type不对,我试着改成打印信息输出的但重启后又出现了新的不同的vol.type,这种情况最容易在格式化的时候出现,调试信息如下:
-> tffsShowAll
TFFS Version 2.2
0: socket=RFA: type=0x2782, unitSize=0x1000, mediaSize=0x200000
1: socket=RFA: type=0xe1c3, unitSize=0x1000, mediaSize=0xe00000
value = 49 = 0x31 = '1'
-> sysTffsFormatC
Debug: entering SST MTD identification routine.
unlockAddr1 = 0x610aaaa, unlockAddr1 = 0x6105554
flashPtr = 0x6100000
offSet = 0x6100002
vol.type = 0x2782
Debug: begin operation function.
Debug: Identified sst39vf160 media.
Debug: entering SST MTD identification routine.
unlockAddr1 = 0x610aaaa, unlockAddr1 = 0x6105554
flashPtr = 0x6100000
offSet = 0x6100002
vol.type = 0x2782
Debug: begin operation function.
Debug: Identified sst39vf160 media.
value = 0 = 0x0
-> sysTffsFormatD
Debug: entering SST MTD identification routine.
unlockAddr1 = 0x630aaaa, unlockAddr1 = 0x6305554
flashPtr = 0x6300000
offSet = 0x6300002
vol.type = 0xe1c3
Debug: begin operation function.
Debug: Identified sst39vf160 media.
Debug: entering SST MTD identification routine.
unlockAddr1 = 0x630aaaa, unlockAddr1 = 0x6305554
flashPtr = 0x6300000
offSet = 0x6300002
vol.type = 0x630
Debug: did not identify SST39VF160-1 media.
value = -1 = 0xffffffff
->
请求各位高手帮忙指点下,谢谢!
FLASH 地址设置如下:
#define FLASH_BASE_ADRS 0x06100000 /* FLASH_BASE_ADRS 为FLASH真实基地址 */
#define FLASH_SIZE 0x01000000 /*FLASH_SIZE 为此FLASH真实大小16M */
#define FLASH_DATA_ADRS 0x06300000 /*FLASH_DATA_ADRS为D盘偏移地址偏2M */
#define FLASH_DATA_SIZE 0x00E00000 /* FLASH_DATA_SIZE 为D盘大小14M */
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 |