分类: 嵌入式
2012-03-03 15:19:18
今日根据《Mini2440_Linux移植开发实战指南》一文进行nandflash驱动
的移植出现了不少问题。不知道是我操作失误还是该文编写出现错漏导致的。
首先按照步骤修改相关信息之后执行make zImage出现了不少错误:
其中有代表性的错误如下:
开始以为是输错代码,搞了一个上午都没有搞明白。
到了下午,通过查找网上的资料(还真难找),再对比原来2.6.32内核中外国爱好者编写的mach-mini2440.c
文件,隐约知道是头文件的问题。
于是在自己的mach-mini2440.c中加入
果然make过了,不过仍然有一行warning:
arch/arm/mach-s3c2440/mach-mini2440.c:233: warning: 'mini2440_nand_info' defined but not used
把生成的zImage下载到板子上运行,也没有出现该文中所描述的情形,初步估计还是移植失败
看来该文漏洞不少,这次不得不依靠网上的高手了。
昨天的问题
warning: 'mini2440_nand_info' defined but not used
今日终于还是解决了,原来除了昨天说
的之外还得添加别的东西,在这个函数:
static void __init mini2440_map_io(void)
{
}
中加入以下代码:
s3c_device_nand.dev.platform_data = &mini2440_nand_info;
再次make zImage,没有再出现warning,下载到板子,
成功出现了nand flash的分区信息。
当然网上还有所谓的“石器时代”的移植方法,迟下再
试,毕竟这里头很多内在原理还是没搞明白的。当下先对文
件系统的移植作个了解,过一阵子再回过头来详细分析。
我对这两天的移植有2个感受:一是“尽信书不如无书”,
二是不学一些原始的方法,单是站在巨人的肩上去开发是
学不透彻的,虽然移植成功但是还是糊里糊涂。。。。。。
**********************************************************************************************************************************************/
另:在我自己的移植过程中,又做了如下修改:
在/opt/FriendlyARM/mini2440/linux-2.6.32.2/arch/arm/mach-s3c2440/mini2440.c中,结构定义语句要放在函数之前,具体内容如下:
static struct mtd_partition mini2440_default_nand_part[] __initdata = {
[0] = {
//这里是bootloader所在的分区,可以放置u-boot,supervivi等内容,对应/dev/mtdblock0
.name = "supervivi",
.size = 0x00040000,
.offset = 0,
},
[1] = {
//这里是supervivi的参数区,其实也属于bootloader的一部分,如果u-boot比较大,
//可以把此区域覆盖掉,不会影响系统启动,对应/dev/mtdblock1
.name = "param",
.offset = 0x00040000,
.size = 0x00020000,
},
[2] = {
//内核所在的分区,大小为5M,足够放下大部分自己定制的举行内核了,比如内核使用了更大的
//Linux Logo图片等,对应/dev/mtdblock2
.name = "Kernel",
.offset = 0x00060000,
.size = 0x00500000,
},
[3] = {
//文件系统分区,友善之臂主要用来存放yaffs2文件系统内容,对应/dev/mtdblock3
.name = "root",
.offset= 0x00560000,
.size = 1024 * 1024 *1024,
},
[4] = {
//此区域代表了整片的nand flash,主要是预留使用,比如以后可以通过应用程序访问读取/dev/
//mtdblock4就能实现备份整片nand flash了。
.name = "nand",
.offset = 0x00000000,
.size = 1024 * 1024 * 1024,
},
};
//下面是开发板的nand flash设置表,因为板子上只有一片,因此也就只有一个表
static struct s3c2410_nand_set mini2440_nand_sets[] __initdata = {
[0] = {
.name = "NAND",
.nr_chips = 1,
.nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),
.partitions = mini2440_default_nand_part,
},
};
//下面是nand flash本身的一些特性,一般需要对照datasheet填写,大部分情况下按照以下参数填写即可
static struct s3c2410_platform_nand mini2440_nand_info __initdata = {
.tacls = 20,
.twrph0 = 60,
.twrph1 = 20,
.nr_sets = ARRAY_SIZE(mini2440_nand_sets),
.sets = mini2440_nand_sets,
.ignore_unset_ecc = 1,
};
//此外,还应把nand flash设备注册到系统中,此工作显示在第158行
static void __init mini2440_map_io(void)
{
s3c24xx_init_io(mini2440_iodesc, ARRAY_SIZE(mini2440_iodesc));
s3c24xx_init_clocks(12000000);
s3c24xx_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs));
s3c_device_nand.dev.platform_data = &mini2440_nand_info;
}
static void __init mini2440_machine_init(void)
{
s3c24xx_fb_set_platdata(&mini2440_fb_info);
s3c_i2c0_set_platdata(NULL);
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
//smdk_machine_init();
}
MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board")
/* Maintainer: Ben Dooks
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = mini2440_map_io,
.init_machine = mini2440_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END