全部博文(153)
分类:
2009-06-22 12:58:49
Yaffs_startup函数是启动yaffs文件系统的第一个函数,主要起到了初始化设备的作用,就代码而言就是将我们在yaffs基础第一篇——yaffs中的核心数据结构中提到的yaffs_devicestruct结构体进行最简单的也是最重要部分的初始化。代码位置在/yaffs/direct/yaffscfg.c。核心部分如下:
static yaffsfs_DeviceConfiguration yaffsfs_config[] = {
{ "/flash", &flashDev},
{(void *)0,(void *)0}
};
int yaffs_StartUp(void)
{
// Stuff to configure YAFFS
// Stuff to initialise anything special (eg lock semaphore).
yaffsfs_LocalInitialisation();
// Set up devices
// /flash
flashDev.nBytesPerChunk = YAFFS_BYTES_PER_CHUNK;
flashDev.nChunksPerBlock = YAFFS_CHUNKS_PER_BLOCK;
flashDev.nReservedBlocks = 5;
flashDev.startBlock = 0; // First block after 2MB
flashDev.endBlock = 127; // Last block in 16MB
flashDev.useNANDECC = 0; // use YAFFS's ECC
flashDev.nShortOpCaches = 10; // Use caches
flashDev.genericDevice = (void *) 2; // Used to identify the device in fstat.
flashDev.writeChunkToNAND = yflash_WriteChunkToNAND;
flashDev.readChunkFromNAND = yflash_ReadChunkFromNAND;
flashDev.eraseBlockInNAND = yflash_EraseBlockInNAND;
flashDev.initialiseNAND = yflash_InitialiseNAND;
yaffs_initialise(yaffsfs_config);
return 0;
}
yaffsfs_DeviceConfiguration 结构体的定义如下:
typedef struct {
const char *prefix;
struct yaffs_DeviceStruct *dev;
} yaffsfs_DeviceConfiguration;
从上面的代码很好理解,其实就是为一个具体的设备定义了一个设备结构体,我们这里是flashDev。并且为这个设备定义了一个盘符名字,这里叫 /flash,这和/c /d本质都是一样的,首先通过startup当中的一串对成员变量的赋值进行对这个全局的设备结构体的初始化:
//定义了nandflash每页的字节数
flashDev.nBytesPerChunk = YAFFS_BYTES_PER_CHUNK;
//定义了nandflash每块的页数
flashDev.nChunksPerBlock = YAFFS_CHUNKS_PER_BLOCK;
//定义了yaffs默认的保留页,少于这个页yaffs会进行垃圾回收处理
flashDev.nReservedBlocks = 5;
//定义了nandflash的起始页和结束页,这也意味着一块nandflash可以分成若干个逻辑区
flashDev.startBlock = 0; // First block after 2MB
flashDev.endBlock = 127; // Last block in 16MB
//是否使用nandflash的硬件ecc
flashDev.useNANDECC = 0; // not use YAFFS's ECC
//nandflash的缓冲数
flashDev.nShortOpCaches = 10; // Use caches
flashDev.genericDevice = (void *) 2; // Used to identify the device in fstat.
//nandflash的读写函数,这个需要根据不同的cpu写,也是yaffs中和硬件相关的地方
flashDev.writeChunkToNAND = yflash_WriteChunkToNAND;
flashDev.readChunkFromNAND = yflash_ReadChunkFromNAND;
flashDev.eraseBlockInNAND = yflash_EraseBlockInNAND;
flashDev.initialiseNAND = yflash_InitialiseNAND;
当然设备结构体的成员远远不止这么一些,但是在这里完成了和硬件相关的最重要的部分,其他的部分会在挂载的时候继续进行填充,(也就是在yaffs_mount函数中)。
完成了初始化,调用yaffs_initialise(yaffsfs_config);将这个结构体注册到yaffs中。这样就完成了对第一个函数yaffs_startup的解释,很简单吧,呵呵,千里之行始于足下,我们一步步来。
备注:值得注意的是,如果是用在有操作系统中,如ucos等,可以将系统的一些信号量,锁的概念用到yaffs中,来保证不会引起不可重入的问题,在我们这里也就是填充yaffsfs_LocalInitialisation();有兴趣可以看一下。