Linux 2.6.32 在Arm9(s3c2440)平台的移植

板子用的友善的mini2440, 并且光盘提供了手册, 照猫画虎,,,,,,,,,但是遇到各种问题, 很多未解决.....原因是还没理解每层目录的Makefile和Kconfig的关系, 以及在Kernel Configure菜单树中对应的选项, so~

1

内核代码/uboot代码中中机器码的定义位置,在/root/linux-2.6.32/arch/arm/tools/mach-types 和 uboot/include/asm-arm/mach_type.h, 启动时bootloader向内核传递机器码. 如果bootloader传递给内核的机器码不匹配, 则,,,,,

2

(1)在/linux-2.6.32/arch/arm/mach-s3c2440/mach-smdk2440.c中的__init smdk2440_map_io函数中修改晶震频率:

s3c24xx_init_clocks(12000000);  
s3c24xx_init_clocks(12000000); 

(2)  MACHINE_STAR宏(修改机器码); ///重写_machine_init(),??

MACHINE_START(MINI2440, "Mini2440 Test")//第一个参数对应1中mach-types文件中的定义机器码? 
MACHINE_START(MINI2440, "Mini2440 Test")//第一个参数对应1中mach-types文件中的定义机器码?

(3)这个mach-smdk2440.c文件对应make menuconfig中的那个选项? 

找到该目录的Makefile: obj-$(CONFIG_ARCH_S3C2440) += mach-smdk2440.o 找到该目录的Kconfig: config ARCH_S3C2440 bool "SMDK2440" #这是在configure中显示的字符 select CPU_S3C2440 select S3C2440_XTAL_16934400 select MACH_SMDK select S3C_DEV_USB_HOST select S3C_DEV_NAND help

在Configure菜单中按/查找, mach-smdk2440.o的连接条件在 System Type ->S3C2440 Machines->SMDK2440, 如果想让刚才修改的mach-smdk2440.c部分代码被编译进image, 则必须选上这个选项, 

移植过程中的代码都是联动的, 改了某个.c文件的代码并想让这部分改动被编译进image, 则还要改动对应的makefile, 及kconfig文件, 最后还要在configure的菜单树中选择此选项.

3

配置选项: 执行make s3c2410_defconfig, 以及make menuconfig,

(1) make s3c2410_defconfig命令会在arch/%处理器平台%/configs/下找名为s3c2410_defconfig的文件 然后将其复制到顶层目录并改名为.config, make s3c2410_defconfig命令会遍历arch/下的所有子目录吗? 不会, 因为在顶层的makefile中,

ARCH  ?= arm                            #指定在arch下的子目录

CROSS_COMPILE ?= arm-linux- #指定调用的编译器

(2) 随后执行的 make menuconfig 会读取linux-2.6.32/.config的内容,并显示出来. 以下是更多编译命令的说明:

make mrproper --- 清理全部文件,包括.config和一些备份文件

make clean --- 清理生成文件,但会保留.config和一些模块文件

make config --- 基于文本的最为传统的配置界面,不推荐使用

make menuconfig --- 基于文本选单的配置界面,字符终端下推荐使用

make xconfig --- 基于图形窗口模式的配置界面,Xwindow下推荐使用

4

主要涉及以下几个结构体:

struct mtd_partition default_nand_part[]  单片flash对分区的定义

struct s3c2440_nand_set                       板子上所有flash的sets集

struct platform_set

struct platform_device                      


      struct s3c2410_platform_nand 


(1) 更改板载nand flash的分区, 涉及文件: arch/arm/plat-s3c24xx/common-smdk.c , 修改为如下:

static struct mtd_partition friendly_arm_default_nand_part[] = {  
        [0] = {  
                .name   = "supervivi",  
                .size   = 0x00040000,  
                .offset = 0,  
        },  
        [1] = {  
                .name   = "param",  
                .offset = 0x00040000,  
                .size   = 0x00020000,  
        },  
        [2] = {  
                .name   = "Kernel",  
                .offset = 0x00060000,  
                .size   = 0x00500000,  
        },  
        [3] = {  
                .name   = "root",  
                .offset = 0x00560000,  
                .size   = 1024 * 1024 * 1024, //  
        },  
        [4] = {  
                .name   = "nand",  
                .offset = 0x00000000,  
                .size   = 1024 * 1024 * 1024, //  
        }  
}; 
static struct mtd_partition friendly_arm_default_nand_part[] = {
        [0] = {
                .name   = "supervivi",
                .size   = 0x00040000,
                .offset = 0,
        },
        [1] = {
                .name   = "param",
                .offset = 0x00040000,
                .size   = 0x00020000,
        },
        [2] = {
                .name   = "Kernel",
                .offset = 0x00060000,
                .size   = 0x00500000,
        },
        [3] = {
                .name   = "root",
                .offset = 0x00560000,
                .size   = 1024 * 1024 * 1024, //
        },
        [4] = {
                .name   = "nand",
                .offset = 0x00000000,
                .size   = 1024 * 1024 * 1024, //
        }
};

再找到static struct s3c2410_platform_nand smdk_nand_info 的定义处,修改S3C2440时间参数TACLS=0,TWRPH0=3,TWRPH=0:

static struct s3c2410_platform_nand smdk_nand_info = {  
        .tacls          = 20,  
        .twrph0         = 60,  
        .twrph1         = 20,  
        .nr_sets        = ARRAY_SIZE(smdk_nand_sets),  
        .sets           = smdk_nand_sets,  
}; 
static struct s3c2410_platform_nand smdk_nand_info = {
        .tacls          = 20,
        .twrph0         = 60,
        .twrph1         = 20,
        .nr_sets        = ARRAY_SIZE(smdk_nand_sets),
        .sets           = smdk_nand_sets,
};
 

(2)关闭ECC校验,文件:drivers/mtd/nand/s3c2410.c, 找到函数s3c2410_nand_init_chip

/*chip->ecc.mode        = NAND_ECC_SOFT; */ 
chip->ecc.mode    = NAND_ECC_NONE; 
/*chip->ecc.mode        = NAND_ECC_SOFT; */
chip->ecc.mode    = NAND_ECC_NONE;

(3)  指定启动时初始化, 找到这一段代码:
        static struct platform_device __initdata *smdk_devs[] = {  
    &s3c_device_nand,  
    &smdk_led4,  
    &smdk_led5,  
    &smdk_led6,  
    &smdk_led7,  
}; 
static struct platform_device __initdata *smdk_devs[] = {
    &s3c_device_nand,
    &smdk_led4,
    &smdk_led5,
    &smdk_led6,
    &smdk_led7,
};
这段代码指定了内核启动时初始化的设备,其中s3c_device_nand是必须有的,因为我们需要NAND Flash驱动来挂载根文件系统,其余的根据需可自行添加,这里我们使用默认设置,不做修改。

(4) 这里是开发板的nand flash 设置表,因为板子上只有一片,因此也就只有一个表, 这里完全相同, 不改

static struct s3c2410_nand_set smdk_nand_sets[] = {  
        [0] = {  
                .name           = "NAND",  
                .nr_chips       = 1,  
                .nr_partitions  = ARRAY_SIZE(smdk_default_nand_part),  
                .partitions     = smdk_default_nand_part,  
        },  
}; 
static struct s3c2410_nand_set smdk_nand_sets[] = {
        [0] = {
                .name           = "NAND",
                .nr_chips       = 1,
                .nr_partitions  = ARRAY_SIZE(smdk_default_nand_part),
                .partitions     = smdk_default_nand_part,
        },
};
 

5  
修改drivers/mtd/nand/s3c2410.c,

禁止flash ECC校验(友善的手册没有此项), 注意, 这个去掉ECC校验的问题,在内核中明确说明是不建议这样做的,因为这样就等于忽略了对NAND FLASH坏块的检测. But~ 据说vivi或uboot通过软件算法产生的ecc校验码于S3C2410 NAND Flash 控制器产生的ecc校验码不一致,所以在这里选择禁止内核ECC校验.
找到s3c2410_nand_init_chip()函数,在该函数体最后加上:
     chip->ecc.mode = NAND_ECC_NONE;  
chip->ecc.mode = NAND_ECC_NONE; 

6(暂不做)

为2.6.32打上yaffs2补丁,

早先的yaffs 仅支持小页(512byte/page)的nand flash,现在的开发板大都配备了更大容量的nand flash,它们一般是大页模式(2K/page),使用 yaffs2 就可以支持大页的 nand flash. 步骤如下,

(1)获取yaffs2代码

mkdir yaffs2-src

cd yaffs2-src

git  clone git://www.aleph1.co.uk/yaffs2

(2)下载yaffs2的最新源码.并打补丁:

./patch-ker.sh c /root/linux-2.6.32

此时已经成功更新2.6.32代码中的yaffs2部分,linux-2.6.32.2/fs下增加一个yaffs2目录

回到/root/linux2.6.32, 执行make menuconfig, File systems->Miscellaneous->选中yaffs2支持.

7(暂不做)

为2.6内核增加devfs,linux2.6已经去掉devfs,为了内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统(yaffs文件系统是不是需要devfs支持?)
vi fs/Kconfig,找到menu "Pseudo filesystems"处增加如下:
config DEVFS_FS   #config的标识
     bool "/dev file system support (OBSOLETE)"
     depends on EXPERIMENTAL
     help

config DEVFS_MOUNT
     bool "Automatically mount at boot"
     depends on DEVFS_FS #依赖上面的DEVFS_FS
     help

config DEVFS_DEBUG
     bool "Debug devfs"
     depends on DEVFS_FS #依赖上面的DEVFS_FS
     help
 

重新make menuconfig 在File systems->Pseudo filesystems目录里面可以后到devfs的配置选项如下:

[*] /proc file system support                                           

[*] /dev file system support (OBSOLETE)                                 

[*]     Automatically mount at boot                                       

[*]     Debug devfs                                                       

[*] Virtual memory file system support (former shm fs)                 

[  ] Relayfs file system support
 

8

修改内核启动选项, make menuconfig,
这里绝大部分选项都先采用默认设置,待移植成功后我们再进一步裁减, 以上(3)中修改了common-smdk.c, 为了让修改生效, 必须选上

还有启动参数 Boot Options ---> Default kernel command string:  (注意, )

noinitrd root=/dev/mtdblock4 console=ttySAC0,115200
解释, 也就是mtdblock3是存放cramfs根文件系统的分区,故设置 root=/dev/mtdblock3. console=ttySAC0指kernel启动期间的信息都输出到串口1上.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpyzw.html