05.移植内核3.4.2
1 uboot的启动流程
由uboot的启动流程可知,最后阶段将会传来两个关键的参数。一个是机器id,另一个是tag参数地址。而内核的任务是根据机器id选择/判断是否支持该机器,如果支持,则调用机器相关的初始化函数->解析TAG参数->装载驱动程序->挂接根文件系统->启动应用程序
2 移植kernel的过程
1 一. 内核启动流程,据此配置内核(机器ID) 2 1.1 修改Makefile 3 1.2 选择默认配置 : make s3c2410_defconfig 4 1.3 make uImage 5 6 步骤1: 7 在UBOOT里: 8 set machid 16a // smdk2440 mach-smdk2440.c 9 或 10 set machid 7CF // mini2440 mach-mini2440.c 11 12 步骤2: 13 arch\arm\mach-s3c24xx\mach-smdk2440.c 14 s3c24xx_init_clocks(16934400); 15 改为 16 s3c24xx_init_clocks(12000000); 17 18 步骤3: 19 配置/编译: make s3c2410_defconfig 或 make mini2440_defconfig 20 make uImage 21 22 步骤4: 23 在uboot里:set bootargs console=ttySAC0,115200 ..... 24 25 26 27 28 uboot的默认MACH ID: 29 gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; // 193 30 如果s = getenv("machid");成功,则使用它 31 否则使用默认的 32 33 set machid 16a // smdk2440 mach-smdk2440.c 34 set machid 7CF // mini2440 mach-mini2440.c 35 36 nfs 32000000 192.168.1.123:/work/nfs_root/uImage_new 37 bootm 32000000 38 39 二. 修改分区, 制作新的文件系统 40 41 42 nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev.yaffs2 43 nand erase.part rootfs 44 nand write.yaffs 30000000 260000 889bc0 45 46 nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev.jffs2 47 nand erase.part rootfs 48 nand write.jffs2 30000000 260000 $filesize 49 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 50 51 52 制作文件系统 53 1. 交叉编译busybox 54 安装:make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new 55 56 2. 安装库 57 mkdir /work/nfs_root/fs_mini_mdev_new/lib 58 mkdir /work/nfs_root/fs_mini_mdev_new/usr/lib -p 59 60 cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib -d 61 cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* /work/nfs_root/fs_mini_mdev_new/usr/lib -d 62 63 3. 构建etc目录 64 4. 构建dev目录 65 5. 其他空目录 66 67 mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2 68 69 烧写: 70 nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev_new.jffs2 71 nand erase.part rootfs 72 nand write.jffs2 30000000 260000 $filesize 73 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 74 nfs 32000000 192.168.1.123:/work/nfs_root/uImage_new 75 bootm 32000000 76 77 SIGILL illegal instruction 78 6. 重新配置内核支持EABI 79 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 80 nfs 32000000 192.168.1.123:/work/nfs_root/uImage_eabi 81 bootm 32000000 82 83 三. 移植YAFFS文件系统 84 1. 获得源码 85 git clone git://www.aleph1.co.uk/yaffs2 86 87 2. 打补丁 88 89 cd yaffs-dir 90 ./patch-ker.sh c m linux-tree 比如 ./patch-ker.sh c m /work/system/linux-3.4.2 91 92 3. 配置内核支持YAFFS 93 94 4. 编译、使用uImage 95 96 5. 制作、烧写yaffs映象 97 mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2 98 uboot: 99 nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev_new.yaffs2 100 nand erase.part rootfs 101 nand write.yaffs 30000000 260000 $filesize 102 103 6. 启动 104 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 105 nfs 32000000 192.168.1.123:/work/nfs_root/uImage_yaffs 106 bootm 32000000 107 108 7. 没成功,用替代法查找问题 109 7.1 UBOOT可能有问题:换上1.1.6的UBOOT 110 tftp 30000000 u-boot.bin 111 nand erase.part u-boot 112 nand write 30000000 u-boot 113 reset 114 nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev_new.yaffs2 115 nand erase rootfs 116 nand write.yaffs 30000000 260000 $(filesize) 117 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 118 nfs 32000000 192.168.1.123:/work/nfs_root/uImage_yaffs 119 bootm 32000000 120 121 发现1.1.6的UBOOT没问题,所以就是我们移植的新UBOOT有BUG: 122 drivers\mtd\nand\Nand_util.c 123 124 if (!need_skip && !(flags & WITH_DROP_FFS)) { 125 改为 126 if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB)) { 127 128 129 7.2 YAFFS映象可能有问题 130 131 132 制作了u-boot_new.bin, uImage_new, fs_mini_mdev_new.yaffs 133 重烧整个系统: 134 使用jtag工具烧u-boot_new.bin 135 或使用uboot来更新自己: tftp 30000000 u-boot_new.bin; nand erase.part u-boot; nand write 30000000 u-boot 136 启动uboot,用它来烧写内核、FS 137 tftp 30000000 uImage_new; nand erase.part kernel; nand write 30000000 kernel 138 tftp 30000000 fs_mini_mdev_new.yaffs2; nand erase.part rootfs; nand write.yaffs 30000000 260000 $filesize 139 140 设置参数 141 set 'nand read 30000000 kernel;bootm 30000000' 142 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 143 set machid 16a 144 save 145 146 147 使用内核补丁: 148 patch -p1 < ../linux-3.4.2_100ask.patch 149 cp config_ok .config 150 make uImage