mkyaffs2image工具:不仅与flash容量大小有关(64M/128M/512M),还与不同的flash型号有关要匹配。
1.用tx2416的内核启动webee的rootfs失败,但经2416提供的makeyaffs工具重新压缩后即可启动成功(说明webee的mkyaffs2image工具有问题)。
2.给tx2416内核打上webee提供的yaffs2源码补丁,内核能成功启动(说明webee的yaffs2源码补丁无问题)。
3.用tx2416第一版本的UBOOT烧写第二版本的内核和yaffs文件系统后成功启动(说明第一版本的uboot无问题)
Nand驱动:
plat-s3c24xx/common-smdk.c:
1.每片flash的分区信息表struct mtd_partition smdk_default_nand_part[]
2.所有flash的分区信息表struct s3c2410_nand_set smdk_nand_sets[]
3.所有flash的分区表及时序信息struct s3c2410_platform_nand smdk_nand_info
4.flash设备硬件信息
static struct platform_device __initdata *smdk_devs[] = {
&s3c_device_nand,
&smdk_led4,
&smdk_led5,
&smdk_led6,
&smdk_led7,
};
------>smdk_devs--->s3c_device_nand(注意该结构体.name= "s3c2410-nand",用该名称来查找drivers/mnt/nand/s3c_nand.c中对应flash型号驱动,驱动中也有对应的.name字段)
----->s3c_nand_resource---->S3C_PA_NAND为flash寄存器的首地址。
#ifdef CONFIG_S3C_DEV_NAND-------Device Driver配置选项中打开。
static struct resource s3c_nand_resource[] = {
[0] = DEFINE_RES_MEM(S3C_PA_NAND, SZ_1M),
};
struct platform_device s3c_device_nand = {
.name = "s3c2410-nand",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_nand_resource),
.resource = s3c_nand_resource,
};
#endif
------->最后将设备硬件信息smdk_devs及所有flash分区表时序信息smdk_nand_info注册到内核。
s3c_nand_set_platdata(&smdk_nand_info);
platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs));
注:由于添加新型号flash驱动S3c_nand.c,故还需修改arch/arm/plat-samsung/plat/regs_nand.h(该头文件定义flash各寄存器的偏移量,会且仅会被S3c_nand.c调用;
而S3C_PA_NAND定义flash寄存器的首地址基地址)。
另外.name也可以s3c_nand_setname重新定义(一般s3c2443_init-->s3c_nand_setname).
另drivers/mnt/nand目录下S3c2410.c与S3c_nand.c均是三星的flash驱动,前者是老型号后者是一些新型号flash驱动?
menuconfig配置
machine type:只选择S3c2416
kernel features:选中use the arm EABI和ABI.
Device drivers-->MTD-->Nand Device support:
选中MTD_NAND_S3C(对应drivers/mnt/nand/S3c_nand.c),去掉MTD_NAND_S3C2410(对应drivers/mnt/nand/S3c2410.c)。
MTD_NAND_S3C下只选S3C nand hardware ECC(多选可能造成kernel panic:failed to excute init)。
file systems:选中yaffs2 support。
linux3.3.8不更换S3c_nand.c驱动也能挂载文件系统?
------->使用S3c2412_nand的驱动,虽能正确解析flash分区信息表并挂载文件系统,但读取flash分区内容时会失败(
plat-samsung/plat/reg_nand.h中不通型号flash的寄存器偏移量不同)。
S3c_nand.c与内核兼容性错误解决:资料已打包,详见S3c2416单板。
drivers/mtd/nand/s3c_nand.c:905: error: implicit declaration of function 'add_mtd_partitions'
在include/linux/mtd/partions.h文件中添加int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
即可(该函数入参为3个)。
int mtd_add_partition(struct mtd_info *master, char *name,long long offset, long long length);(该函数入参为4个)
阅读(1281) | 评论(0) | 转发(0) |