先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题
本系列文章还是为了记录在学习韦东山老师的嵌入式开发教程中的课程笔记,并整理一个比较详细的课堂笔记,方便一起学习的同学们参考。
今天的linux kernel移植系列的第一篇文章,主要目的是实现正确移植、kenerl正确启动,并输出正确打印信息,ok,闲话少说,我们开始今天的第一步
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
需要注意的是,上面两个语句后面千万不能有空格,否则后面会出现编译失败的情况
2. 选择默认配置 make s3c2410_defconfig
3. 编译make uImage
a. 第一次编译可能会出现错误
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373
我们需要修改kernel/timeconst.pl源代码,请百度之自行解决
b. 编译完成之后,将uImage拷贝到nfs目录下,并烧写到开发板,使用nfs命令
cp arch/arm/boot/uImage /work/nfs_root/uImage_new //拷贝
nfs 32000000 192.168.0.106:/work/nfs_root/uImage_new //烧写
在烧写过程中可能会烧写失败,这是因为我们开发板的serverip设置不对,我们修改开发板的serverip地址为虚拟机的ip地址 192.168.0.106,因为我们板子的serverip在之前的学习过程中设置的是pc的地址192.168.0.108
c. 启动内核bootm,发现打印乱码,怀疑在uboot设置的machid不正确
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; // uboot代码 193
如果 s = getenv(“machid”);成功,则使用它;否则使用默认的
d. 怎么找到对应的机器呢,机器码在哪里呢
cd arch/arm
find -name "mach*" // find -name "mach*.o"
e. 设置machid,在uboot里面设置
set machid 16a //smdk2440 mach-smdk2440.c
f. 重新烧写uImage,并启动
nfs 32000000 192.168.0.106:/work/nfs_root/uImage_new
bootm 32000000
g. 发现这个时候还是乱码,我们可以继续尝试别的机器id来试验,经过试验发现不是机器id问题,设置波特率测试一下
set machid 7cf //mini2440 mach-mini2440.c
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
h. 发现当机器 = 7cf时,打印正常;机器id = 16a的时候,打印不正常;对比文件mach-smdk2440.c 和 mach-mini2440.c,修改mach-smdk2440.c下面的函数smdk2440_map_io
s3c24xx_init_clocks(12000000);
i. 重新编译,设置machid,并烧写内核
make uImage
cp arch/arm/boot/uImage /work/nfs_root/uImage_new
nfs 32000000 192.168.0.106:/work/nfs_root/uImage_new