1 启动过程
在PC上的启动流程为:
BIOS–>windows系统–>C、D盘等–>应用程序。
在嵌入式linux中,与PC启动流程类似:
BootLoader–>Linux内核–>根文件系统–>应用程序。
对比如下图:
所以要在裸板上构建一个嵌入式linux系统,需要烧录bootloader、Linux内核和根文件系统。
所用开发环境:
开发板:mini2440
虚拟机:ubuntu14
本文记录编译烧写过程,这里使用已经移植好的文件。
2 uboot
1)解压文件
tar xvzf u-boot-2010.03-embedclub-201111.tar -C /(目录)
2)编译
make distclean #清除,第一次执行一次就可以
make smdk2440a_config #配置
make #编译
3)下载
使用JLink v8将u-boot.bin烧写到开发板中,参考《JLink烧写Nor Flash步骤》。
3 内核编译下载
1)解压
解压友善之臂光盘中文件linux-2.6.32.2-mini2440-20150709.tar。
2)配置
在linux内核目录下有许多config_mini2440_*(不同的地方就是屏幕型号,主要区别在LCD驱动的不同)。
复制对应的配置文件名字为.config,我用的LCD屏型号是P43,
cp config_mini2440_P43 .config
make menuconfig #暂时不修改
3)编译
make zImage
编译完成后,在arch/arm/boot中找到在zImage,此时uboot不能加载zImage,需打包一下。
编译好的u-boot-2010.03/tools目录下,将mkimage复制到/usr/local/bin目录下。拷贝mkz2uimage到linux-2.6.32.2/arch/arm/boot。
直接运行mkz2uimage,得到uImage。
./mkz2uimage
mkz2uimage内容:
mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -n "Linux kernel Image by embedclub" -d zImage uImage
4)下载
使用tftp下载,需要在虚拟机中安装TFTP工具,并在开发板中设置好TFTP server的ip。在uboot状态下,ip设置。
printenv
setenv ipaddr 192.168.1.226 // 开发板IP
setenv serverip 192.168.1.200 //Windows IP
setenv gatewayip 192.168.1.1 // 网关
saveenv
下载uImage,开发板设置从nor flash启动,进入uboot的状态,在串口终端中输入下面的命令。
SMDK2440A>tftp 0x30008000 uImage
#把uImage 写到内存的0x3000 8000开始的单元里 掉电后就没有的啦
SMDK2440A>nand erase 0x60000 0x500000
#擦除 nandflash中以0x6000单元开始的大小为0x50 0000(即5M存储空间 其实内核才2M多点)
SMDK2440A>nand write 0x30008000 0x60000 0x500000
#把内存中0x3000 8000单元开始的大小为0x50 0000内容写到 nandflash中以0x 6 0000单元开始的存储空间中 (掉电后,还是有的)
4 根文件系统
1)解压
解压文件root_qtopia.tar.gz。
2)编译
使用mkyaffs2image工具,将mkyaffs2image解压到根目录。
tar xvzf mkyaffs2image -C /
在解压后的根文件系统目录下,编译。
mkyaffs2image-128 rootfs_qtopia_qt4/ rootf_qtopia.img
3)下载
tftp 0x30008000 root_qtopia.img
nand erase 0x560000 $filesize
#首先擦除Nand Flash从0x560000 开始,大小为0x3dac00的空间,来存放root_qtopia.img
nand write.yaffs 0x30008000 0x560000 $filesize
#烧写root_qtopia.img至0x560000 开始的Nand Flash
boot #启动Linux系统
5 Helloworld
1)程序编译
在Ubuntu中编写hello.c文件。
#include<stdio.h>
int main()
{
printf("hello\r\n");
return 0;
}
编译。
arm-linux-gcc hello.c -o hello
2)下载执行
将编译好的hello拷贝到开发板中, 执行,看到串口终端上打印hello。