移植Linux-3.4.2到开发板gq2440

时间:2022-04-22 19:46:05

移植 linux-3.4.2 笔记

1. tar -xjf linux-3.4.2.tar.bz2
   cd linux-3.4.2
   修改Makefile 
   find -name "*defconfig"
   列出所有默认的开发板的配置
   make s3c2410_defconfig
   在顶层目录生成.config
   make menuconfig
   make uImage

   设置uboot启动参数
   set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
   tftp 31000000 uImage_new
   使用MINI2440的机器码
   set machid 16a //mach-smdk2440.c smdk2440 出现串口乱码
   原因是:查看mach-smdk2440.c源码中
      MACHINE_START(S3C2440, "SMDK2440")
    /* Maintainer: Ben Dooks <ben-linux@fluff.org> */
    .atag_offset = 0x100,
   
    .init_irq = s3c24xx_init_irq,
    .map_io  = smdk2440_map_io,
    .init_machine = smdk2440_machine_init,
    .timer  = &s3c24xx_timer,
    .restart = s3c244x_restart,
    MACHINE_END
   smdk2440_map_io函数中调用的s3c24xx_init_clocks(16934400) 参数传递值与板子的不同
   板子的时钟频率为12M,参数修改为12000000,s3c24xx_init_clocks(12000000)
   使用MINI2440的机器码
   set machid 7cf //mach-mini2440.c mini2440 正常
2 挂载根文件系统
   修改分区
   a.   查看系统的启动信息
   0x000000000000-0x000000004000 : "Boot Agent" 这一条
   查找 Boot Agent :grep "\"Boot\ Agent\"" * -nR
   在common-smdk.c (linux-3.4.2\arch\arm\mach-s3c24xx)中
   修改成如下:
   /* NAND parititon from 2.4.18-swl5 */
   static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
     .name = "bootloader",
     .offset = 0,
     .size = SZ_256K,
    },
    [1] = {
     .name = "params",
     .offset = MTDPART_OFS_APPEND,
     .size = SZ_128K,
    },
    [2] = {
     .name = "kernel",
     .offset = MTDPART_OFS_APPEND,
     .size = SZ_2M,
    },
    [3] = {
     .name = "rootfs",
     .offset = MTDPART_OFS_APPEND ,
     .size = MTDPART_SIZ_FULL,
    }
   };
   make uImage;cp arch/arm/boot/uImage /home/tftpboot/uImage_new -rf
   
   而使用MINI2440的机器ID时,
    0x000000000000-0x000000040000 : "u-boot"
    0x000000040000-0x000000060000 : "u-boot-env"
    0x000000060000-0x000000560000 : "kernel"
    0x000000560000-0x000008000000 : "root"
   现把mini2440的值修改和SMDK2440的一致
   这样就能使板子支持MINI2440与smdk2440啦
  b.  制作根文件系统
     先下载busybox,http://www.busybox.net/,下载最新的稳定1.20.2
     tar -xjvf ---
     make menuconfig
     busybox setting---->
           built option---->
               选择static built
               cross compile 项
               加上arm-linux- 的前缀
     make
     1 交叉编译busybox
       make install CONFIG_PREFIX=/common/wds_rootfs 安装路径可以在这里指定
       也可以在make menuconfig后,Installation Options--> BusyBox installation prefix
       来指定绝对路径,最后make install
       mkdir /common/wds_rootfs
     安装glibc库
     cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* /common/wds_rootfs/lib/ -d
     -d 原来是链接文件复制时 还是复制成链接文件
     mkdir /common/wds_rootfs/usr/lib -p
     cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* /common/wds_rootfs/usr/lib/ -d
     把制作好的根文件系统生成jffs2文件格式
     ./mkfs.jffs2 -n -s 2048 -e 128KiB -d wds_rootfs -o wds_rootfs.jffs2
    
     重新设置uboot环境变量:
     set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
     下载文件系统到nand flash:
     tftp 30000000 wds_rootfs.jffs2
     nand erase.part rootfs
     nand write.jffs2 30000000 260000 $filesize       filesize表示传递到内存中的数据量,在1.1.6中要用括号括住
     下载内核
     tftp 31000000 uImage_new;bootm 31000000;
     到此根文件系统制作完毕。jffs2文件系统在启动时也挂载上了。
     但是系统启动出现Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
     #define SIGILL 4  由于产生了这个信号导致上面错误的产生。

     重新配置内核,选中 make menuconfig --> Kernel Features --> Use the ARM EABI to compile the kernel
     make uImage
   b.  修改分区
3 移植YAFFS文件手册
    1 下载yaffs
    2 打补丁
      运行:./patch-ker.sh c m linux-tree 比如:./patch-ker.sh c m /home/zz/z_linux-3.4.2
      make menuconfig
    3 配置内核支持yaffs
    4 编译 make uImage
    5 逐个修改编译出现的错误
      linux 源码中结构体 mtd_info 的成员和 yaffs中使用的成员 指针函数名字不同,对yaffs中的函数都加上“_”
      fs/yaffs2/yaffs_vfs.c:2967: error: implicit declaration of function 'd_alloc_root'
      解决方法:使用 d_make_root 代替d_alloc_root
      google一下:
     introduced d_make_root() as a replacement for d_alloc_root(). Further
     commits appear to have removed d_alloc_root() from the Linux source
     tree. This causes the following failure:
     
     error: implicit declaration of function 'd_alloc_root'
  6 制作、烧写yaffs
      ./mkyaffs2image-128M  wds_rootfs rootfs.yaffs
   tftp 30000000 rootfs.yaffs
   nand erase.part rootfs
   nand write.yaffs 30000000 260000 $filesize
  7 此处还发现一个uboot的bug。drivers/mtd/nand/
     //ops.mode = MTD_OOB_AUTO;/*此处修改为MTD_OOB_RAW*/
     ops.mode = MTD_OOB_RAW;
     ops.ooboffs = 0;
  
     pages = write_size / pagesize_oob;
     for (page = 0; page < pages; page++) {
      WATCHDOG_RESET();
      ops.datbuf = p_buffer;
      ops.oobbuf = ops.datbuf + pagesize;
  
      rval = nand->write_oob(nand, offset, &ops);
     // if (!rval) /*此处写错了,根据韦东山视频修改*/
      if (rval)
       break;
     修改uboot的启动参数bootargs :set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
     去掉了 rootfstype=jffs2
  8 裁剪内核
     make menuconfig
    1 减少支持的单板 
      搜索/MINI2440 ,去掉一些board支持
    2 文件系统
      去掉对ext2 ext3 ext4的支持
      mousedev: PS/2 mouse device common for all mice
      去掉对PS2鼠标 键盘的支持
    3 vi .config 检查配置的所有选项
  9 制作内核3.4.2 补丁
    diff -urN linux-3.4.2 z_linux-3.4.2 > linux-3.4.2_zhaigch.patch
    打补丁:
    cd linux-3.4.2
    patch -p1 ../linux-3.4.2_zhaigch.patch
    使用:
    cp config_ok .config
    make uImage
  10 下载映像文件到开发板
   
    使用h-jtag把 uboot_bug_ok.bin 烧写到 nand flash 或 nor flash
    tftp 31000000 uImage
    nand erase.part kernel
    nand write 31000000 kernel
    tftp 30000000 rootfs.yaffs 或 tftp 30000000 wds_rootfs.jffs2
    nand erase.part rootfs
    nand write.yaffs 30000000 rootfs $filesize 或 nand write.jffs2 30000000 260000 $filesize
   
    设置环境变量
    set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
      或 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
    set bootcmd nand read 31000000 kernel \;bootm 31000000
    set bootdelay 2
    save