移植Linux3.4.2版本内核到mini2440
2019-07-13 03:19 发布
生成海报
该移植工作主要参考了韦东山的《嵌入式Linux应用开发完全手册》,第二期毕业班视频教程和友善之臂mini2440光盘提供的《Mini2440 Linux移植开发实战指南.pdf》,使用的bootloader是我根据韦东山老师制作的2012.04.01版本u-boot,具体制作方法可参考我的另一篇博客《u-boot-2012.04.01修改移植和制作补丁文件 》,交叉编译器使用的是arm-linux-gcc
: v4.3.2。 一.
内核启动流程,据此配置内核(机器ID) 1. 获取内核源码 www.kernel.org https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.2.tar.bz2 2. 解压内核 # tar xjvf linux-3.4.2.tar.bz2 3. 修改顶层Makefile,指定交叉编译器 ARCH
?= arm CROSS_COMPILE
?= arm-linux- 4. 使用默认配置编译内核,可使用如下命令查看内核有哪些默认配置 # find -name "*defconfig" 使用缺省内核配置文件,s3c2410_defconfig 是SMDK2410 的缺省配置文件 # make s3c2410_defconfig 编译、测试 # make uImage 拷贝uImage到tftpboot目录 # cp arch/arm/boot/uImage /work/tftpboot/uImage_3.4.2 下载、启动内核 # tftp 32000000 uImage_3.4.2 # bootm 32000000 结果, 启动后会产生乱码,原因是bootargs参数并未指定串口波特率,修改bootargs如下即可正常启动看到输出 # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 5. 修改晶振频率 # vim arch/arm/mach-s3c24xx/mach-smdk2440.c --s3c24xx_init_clocks(16934400); ++s3c24xx_init_clocks(12000000); 编译、测试 # make s3c2410_defconfig //支持内核较多 # make uImage
# set machid 16a //SMDK2440的机器ID # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 # tftp 32000000 uImage_3.4.2 # bootm 32000000 可正常输出内核启动信息,说明串口工作正常 二. 修改分区, 制作新的文件系统 2.1 修改分区,和我修改后的u-boot-2012.04.01一致,参考友善之臂文档 《Mini2440
Linux移植开发实战指南.pdf》 0x00000000-0x00060000 : "bootloader" 0x00060000-0x00080000 : "params" 0x00050000-0x00580000 : "kernel" 0x00580000- : "root" # vim arch/arm/mach-s3c24xx/common-smdk.c
点击(
此处 )折叠或打开
static struct mtd_partition smdk_default_nand_part[ ] = {
[ 0] = {
. name = "bootloader" ,
. size = SZ_256K + SZ_128K,
. offset = 0,
} ,
[ 1] = {
. name = "params" ,
. offset = SZ_256K + SZ_128K,
. size = SZ_128K,
} ,
[ 2] = {
. name = "kernel" ,
. offset = SZ_512K,
. size = 0x00500000,
} ,
[ 3] = {
. name = "root" ,
. offset = SZ_512K + 0x00500000,
. size = MTDPART_SIZ_FULL,
} ,
} ;
编译、测试 # make uImage # cp arch/arm/boot/uImage /work/tftpboot/uImage_3.4.2 # setenv bootcmd 'tftp 32000000 uImage_3.4.2;bootm 32000000' # boot 可看到打印出如下分区信息
点击(
此处 )折叠或打开
List of all partitions:
1f00 384 mtdblock0 ( driver? )
1f01 128 mtdblock1 ( driver? )
1f02 5120 mtdblock2 ( driver? )
1f03 1042944 mtdblock3 ( driver? )
烧写文件系统、测试fs_mini_mdev.yaffs2<该文件系统来自韦东山老师的教程> # tftp 32000000 fs_mini_mdev.yaffs2 # nand erase.part root # nand write.yaffs 32000000 0x580000 $filesize
测试 # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 # setenv bootcmd 'tftp 32000000 uImage_3.4.2;bootm 32000000' # boot 结果: No filesystem could mount root, tried: ext3 ext2 cramfs vfat msdos iso9660 romfs 测试jffs2 # tftp 32000000 fs_mini_mdev.jffs2 # nand erase.part root # nand write.jffs2 32000000 580000 $filesize # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 # boot 不能使用 2.2 制作根文件系统 ① 编译安装busybox 编译 busybox-1.20.0.tar.bz2 # tar xjvf busybox-1.20.0.tar.bz2 # cd busybox-1.20.0 # make menuconfig Busybox Settings ---> Build Options ---> () Cross Compiler prefix 填入arm-linux- 保存、退出,执行make # make 创建文件系统目录 # cd /work/nfsroot # mkdir fs_mini_mdev_new 安装 # make install CONFIG_PREFIX=/work/nfsroot/fs_mini_mdev_new ② 安装libc库,使用arm-linux-gcc 4.3.2 中的库文件 # cd /work/nfsroot/fs_mini_mdev_new # mkdir lib # cd lib # cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* ./ -d # cd ../ # mkdir usr/lib -p # cd usr/lib # cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* ./ -d ③ 构建etc目录 # cp -rf ../fs_mini_mdev/etc ./ 修改inttab # vim inittab 将s3c2410_serial0改为console ④ 构建dev目录 # mkdir dev # cd dev # mknod console c 5 1 # mknod null c 1 3 ⑤ 创建其他目录 # mkdir proc tmp mnt sys root ⑥ 制作jffs2根文件系统,参考《嵌入式Linux应用开发完全手册》 # mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2 ⑦ 烧写测试 # cp fs_mini_mdev_new.jffs2 /work/tftpboot # tftp 32000000 fs_mini_mdev_new.jffs2 # nand erase.part root # nand write.jffs2 32000000 580000 $filesize # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 # boot ⑧ 结果 Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004 出错、退出 解决方法 配置内核 # make menuconfig Kernel Features ---> [*] Use the ARM EABI to compile the kernel //选中该项 # make uImage # cp arch/arm/boot/uImage /work/tftpboot/uImage_3.4.2_eabi 测试 # tftp 32000000 uImage_3.4.2_eabi # bootm 32000000 可正常启动 Please press Enter to activate this console. / # 三. 移植YAFFS文件系统 获取yaffs2源码 # git clone git://www.aleph1.co.uk/yaffs2 给内核打yaffs2补丁,参考readme # cd yaffs2 # ./patch-ker.sh c m /work/kernel/linux-3.4.2 配置内核使其支持yaffs2文件系统 # make menuconfig File systems ---> [*]Miscellaneous filesystems ---> <*> yaffs2 file system support # make uImage 制作yaffs2根文件系统 # mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2 # mv fs_mini_mdev_new.yaffs2 /work/tftpboot/ # cp arch/arm/boot/uImage /work/tftpboot/uImage_3.4.2_yaffs2 烧写Yaffs2文件系统 # tftp 32000000 fs_mini_mdev_new.yaffs2 # nand erase.part root //擦除root分区 # nand write.yaffs 32000000 580000 $filesize //亲测用nand write.jffs2会出错,找不到init进程 启动内核 # tftp 32000000 uImage_3.4.2_yaffs2 # set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 # bootm 32000000 可修改bootcmd参数便捷启动 # setenv bootcmd 'tftp 32000000 uImage_3.4.2_yaffs2;bootm 32000000' 四. 裁剪内核 查看现在内核大小 # ls arch/arm/boot/uImage -l -rw-r--r-- 1 root root 2486104 Dec 30 22:41 arch/arm/boot/uImage # make menuconfig //去掉不需要的项 a. 去掉不需要支持的单板 System Type ---> SAMSUNG S3C24XX SoCs Support ---> *** S3C24XX SoCs *** [ ] SAMSUNG S3C2410 [ ] SAMSUNG S3C2412 [ ] SAMSUNG S3C2416/S3C2450 [*] SAMSUNG S3C2440 [ ] SAMSUNG S3C2442 [ ] SAMSUNG S3C2443 *** S3C2440 Boards *** [ ] Simtec Electronics ANUBIS [ ] Avantech AT2440EVB development board [*] MINI2440 development board [ ] NexVision NEXCODER 2440 Light Board [ ] Simtec IM2440D20 (OSIRIS) module [ ] HP iPAQ rx3715 [*] SMDK2440 [*] SMDK2440 with S3C2440 CPU module b. 裁剪对文件系统的支持 File systems ---> < > Second extended fs support //去掉对ext2的支持 < > Ext3 journalling file system support //去掉对ext3的支持 DOS/FAT/NT Filesystems ---> //不作修改,对U盘的支持需要 c .
裁剪对驱动的支持 Device Drivers ---> Input device support ---> [ ] Provide legacy /dev/psaux device //delete [ ] Mice ---> //delete [ ] Keyboards ---> //delete d.继续裁剪 File systems ---> CD-ROM/DVD Filesystems ---> < > ISO 9660 CDROM file system support //去掉对光盘的支持 [*] Miscellaneous filesystems ---> < > Compressed ROM file system support (cramfs) //delete [ ] Include support for ZLIB compressed file systems //delete < > ROM file system support //delete Device Drivers ---> Input device support ---> [*] Touchscreens ---> <*> Samsung S3C2410/generic touchscreen input driver //配置上该项 < > USB Touchscreen Driver //delete Device Drivers --->
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮