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

 

posted @ 2017-02-04 12:51  wade_linux  阅读(520)  评论(0编辑  收藏  举报