环境:Tornado2.2.1 MPC8247+SST39VF6401+K9F2G08U0A
SST39VF6401用来存放vxWorks和数据,K9F2G08U0A创建文件系统,存放系统记录。
按照论坛上的文章,配置了sysTffs.c、tffsConfig.c和config.h,编写了mtd驱动,
编译没问题,可是系统启动时,却打印:“tffsDevCreate failed.”,通过shell
打印发现,系统根本没有进入自己写的“k9f2g08u0aMTDIdentify”,但是查看mtdTable中已有。请问为什么?
再一个,sysTffs.c中FLASH_BASE_ADRS怎么定义?曾看到一篇文章中提到,NandFlash
中创建文件系统要定义为0x00000000,而大多数的NorFlash文件系统的sysTffs.c中
都定义为FLASH的地址。由于本人对BSP和硬件不是很熟,烦请大家多多解惑。
共3条
1/1 1 跳转至页
2楼
我一开始也遇到了这个问题,在tffsconfig.c文件中
声明自己的k9f2g08u0aMTDIdentify时
/*externs */
FLStatus lk9f2g08u0aMTDIdentify(FLFlash vol);
后面加上
include 自己的mtd.c文件
后来就会跑到自己的函数里去,,你试试看?
看看这文章:
电子产品世界-嵌入式系统设计-[原创]在同一片nor flash上创建两个磁盘,能够实现非...
[原创]在同一片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;
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=67482&page=1
(第 1/4 页)2006-6-3 9:16:08
电子产品世界-嵌入式系统设计-[原创]在同一片nor flash上创建两个磁盘,能够实现非...
}
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
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=67482&page=1
(第 2/4 页)2006-6-3 9:16:08
电子产品世界-嵌入式系统设计-[原创]在同一片nor flash上创建两个磁盘,能够实现非...
{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();
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=67482&page=1
(第 3/4 页)2006-6-3 9:16:08
电子产品世界-嵌入式系统设计-[原创]在同一片nor flash上创建两个磁盘,能够实现非...
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,成功且稳定!
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=67482&page=1
(第 4/4 页)2006-6-3 9:16:08
电子产品世界-嵌入式系统设计-[原创]在同一片nor flash上创建两个磁盘,能够实现非...
[原创]在同一片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;
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=67482&page=1
(第 1/4 页)2006-6-3 9:16:08
电子产品世界-嵌入式系统设计-[原创]在同一片nor flash上创建两个磁盘,能够实现非...
}
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
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=67482&page=1
(第 2/4 页)2006-6-3 9:16:08
电子产品世界-嵌入式系统设计-[原创]在同一片nor flash上创建两个磁盘,能够实现非...
{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();
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=67482&page=1
(第 3/4 页)2006-6-3 9:16:08
电子产品世界-嵌入式系统设计-[原创]在同一片nor flash上创建两个磁盘,能够实现非...
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,成功且稳定!
http://bbs.eepw.com.cn/dispbbs.asp?boardID=3&ID=67482&page=1
(第 4/4 页)2006-6-3 9:16:08
共3条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】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分 |