• linux 2.6.32 在arm9(s3c2440)平台的移植 标题要长(1)


    板子用的友善的mini2440, 起初按照光盘提供的手册, 照猫画虎,,,,,,,,,但是遇到各种问题, 很多未解决.....原因是还没理解每层目录的Makefile和Kconfig的关系, 以及在Kernel Configure菜单树中对应的选项, 以及对nand_flash设备的结构体的意义没搞清楚,~ so~

    http://www.kernel.org/ 下载2.6.32的源代码. 编译器用的arm-linux-gcc 4.1.2 .

    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函数中修改晶震频率:

    1. static void __init smdk2440_map_io(void)  
    2. {  
    3.         s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));  
    4.         s3c24xx_init_clocks(12000000);  
    5.         s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));  
    6. }  

    (2)  找到MACHINE_STAR宏定义, 修改机器码; (未修改)

    1. MACHINE_START(S3C2440, "SMDK2440"//改为"MINI2440"  
    2.         /* Maintainer: Ben Dooks <ben@fluff.org> */  
    3.         .phys_io        = S3C2410_PA_UART,  
    4.         .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,  
    5.         .boot_params    = S3C2410_SDRAM_PA + 0x100,  
    6.         .init_irq       = s3c24xx_init_irq,  
    7.         .map_io         = smdk2440_map_io,  
    8.         .init_machine   = smdk2440_machine_init,  
    9.         .timer          = &s3c24xx_timer,  
    10. MACHINE_END  

    (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

    主要涉及以下几个结构体, 其实这些代码在总体内核中的作用也不甚明白, 基本都是照搬, 所以才会有之后的映像错误, 比如那个结构体数组的作用

    static struct platform_device __initdata *smdk_devs[] = ,

    为什么要在里面注册&s3c_device_nand, ? 这些都不清楚, 也是之后犯错的原因


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

             

    1. static struct mtd_partition smdk_default_nand_part[] = {  
    2.         [0] = {  
    3.                 .name   = "supervivi",  
    4.                 .size   = 0x00040000,  
    5.                 .offset = 0,  
    6.         },  
    7.         [1] = {  
    8.                 .name   = "param",  
    9.                 .offset = 0x00040000,  
    10.                 .size   = 0x00020000,  
    11.         },  
    12.         [2] = {  
    13.                 .name   = "Kernel",  
    14.                 .offset = 0x00060000,  
    15.                 .size   = 0x00500000,  
    16.         },  
    17.         [3] = {  
    18.                 .name   = "root",  
    19.                 .offset = 0x00560000,  
    20.                 .size   = 1024 * 1024 * 1024, //  
    21.         },  
    22.         [4] = {  
    23.                 .name   = "nand",  
    24.                 .offset = 0x00000000,  
    25.                 .size   = 1024 * 1024 * 1024, //  
    26.         }  
    27. };  


    (2) 把s3c_device_nand注册进平台, 这里本来一致, 不用修改该
           

           

    1. static struct platform_device __initdata *smdk_devs[] = {  
    2.         &s3c_device_nand, //  
    3.         &smdk_led4,  
    4.         &smdk_led5,  
    5.         &smdk_led6,  
    6.         &smdk_led7,  
    7. };//not changed  

    总结nand flash涉及到的结构体如下: 

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

         static struct s3c2410_nand_set            smdk_nand_sets[]       板子上所有flash的sets集

         static struct s3c2410_platform_nand     smdk_nand_info 

         static struct platform_device __initdata  *smdk_devs[]

     

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

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

    1. 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上.

    转自:http://blog.csdn.net/dos5gw/archive/2010/08/11/5804587.aspx

  • 相关阅读:
    磁盘挂载自动分区脚本
    docker的私有仓库的搭建
    centos6上安装docker
    docker的本地仓库换成阿里云的镜像仓库
    python中的coding的格式书写形式
    mysql5.6的二进制包安装
    mysql忘记root密码
    Verilog利用$fdisplay命令往文件中写入数据
    Quartus和ISE调用Synplify进行综合的问题
    TMS320C6455 SRIO 实现方案
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2052979.html
Copyright © 2020-2023  润新知