移植 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