分类: LINUX
2010-11-30 19:24:43
11.30 第一天
(这两种对比着学)
嵌入式linux软件系统由bootloader、kernel、root filesystem构成,如下:
Bootloader(一次固化)+内核(多次更新)+根文件系统制作
将linux_platform.tar.gz文件拷到/home目录下,并解压
(这个压缩包中事先已经集成了下面工作所要求的所有编译器,内核和bootloader)
# cd /home/linux_platform/host
安装以下交叉编译工具:
2.95.3: 用于编译vivi
4.3.2: 用于编译u-boot、内核、根文件系统、应用程序
#mkdir –p /usr/local/arm
#tar zxvf arm-linux-gcc-2.95.3.tar.gz –C /usr/local/arm
#tar zxvf arm-linux-gcc-4.3.2.tar.gz –C /usr/local/arm
(解压后出现host、image、target)
其中4.3.2需要假加入环境变量(此项工作前面应该已经做过)
#vi ~/.bashrc
#export PATH=/usr/local/arm/4.3.2/bin:$PATH
(相应的交叉编译器 用来编译相应的文件)
(涉及到芯片的时候需要用到修改编译器)
(旧版本的编译兼容新版本的)
(比如 2.95.3 用来编译vivi,因为vivi本身比较老)
(用新版本的编译器编译vivi就会出错(详细做笔记))
(通常用4.3.2,因为4.3.2这个编译器比较完整,比较经典)
(哪个编译器起作用呢?其实在vivi的makefile中已经写到了,所以不需要去修改环境变量了)
(vivi中的makefile中直接写的就是环境变量的绝对路径)
(比如u-boot和mplayer等中就没有写上,需要修改换将变量)
(在target中有vivi)
#cd /home/linux_platform/target/bootloader
#tar zxvf vivi_unsp.tar.gz (放的vivi的源码)
#cd vivi-unsp
#make distclean
#cp sapp-unsp40.config .config (2440的一个配置文件)
#make menuconfig
(这个里面改放的基本上都是条件编译的宏)
由于采用的是配置好的脚本,因此不用做任何修改,直接保存退出即可
(如果是自己重新做,需要 配置)
#make
在当前路径下会生成 vivi 的二进制文件。
#cp vivi /home/linux_platform/image/my_vivi
将生成的vivi镜像拷贝到image目录下,并改名为my_vivi
#cd /home/linux_platform/target/bootloader/
#tar zxvf u-boot_unsp.tar.gz
#cd u-boot_unsp
#make distclean (彻底的清除)
#make unsp2440_config
#make
(因为和vivi的机制不一样,所以不需要去make menuconfig(作用是生成宏))
在当前目录下会生成一个u-boot.bin的文件
将生成的u-boot镜像拷贝到image目录下,并改名为my_u-boot.bin
将tools目录下生成的mkimage文件拷贝到/bin目录中,后面用于制作u-boot所需格式的内核 (需要用这个工具区处理一下内核,这样才能启动内核)
#cp u-boot/tools/mkimage /bin
#cd /home/linux_platform/target/kernel
#tar zxvf linux-2.6.34.tar.bz2
#cd linux-2.6.34
#make distclean
#cp sapp-unsp40.config .config
#make menuconfig
跟vivi类似,由于采用的是配置好的脚本,因此不用做任何修改,直接保存退出即可。
#make zImage
在/arch/arm/boot下会生成zImage文件
在此目录下执行以下命令:
#mkimage -n 'linux-2.6.34' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage uImage.img (uimage是在zimage的基础上加了一个头,并没有改变内核的东西,只是能够在启动的时候显示出内核的版本信息)
会在当前路径下生成uImage.img这个文件
#cp /arch/arm/boot/zImage /home/linux_platform/image/my_zImage
#cp /arch/arm/boot/uImage.img /home/linux_platform/image/my_uImage.img
将生成的zImage镜像拷贝到image下,并改名为my_zImage (vivi启动所需的内核)
将生成的uImage镜像拷贝到image下,并改名为my_uImage.img (u-boot启动所需的内核)
(以上就得到了两个内核)
(zImage会直接被vivi来启动)
(也可以直接生成uimage ,怎么生成?)
(现在做的uimage是基于zimang做好来做的)
1) cramfs格式的文件(压缩比二比1,只读的,做成产品)
cramfs格式的根文件系统为只读文件系统,大小压缩了一倍。cramfs是可逆的文件系统,即我们可以将其压成镜像,也可以将其从镜像中解压出来。
(其实可以多分一些区,把某些特殊的文件夹做成yaffs的来方便用户去读写)
#tar zxvf cramfs-1.1.tar.gz //编译cramfs根文件系统制作工具
#cd cramfs-1.1
#make
会在当前路径下编译得到两个工具:mkcramfs cramfsck (一个是压缩成镜像,一个是解压缩镜像的)
#cp mkcramfs cramfsck /bin //将两个工具拷贝到根目录的/bin下
其中mkcramfs用来生成cramfs格式的根文件系统
cramfsck用来将已生成的根文件系统释放为文件夹
2)yaffs格式的文件(可读写,但是比较大,压缩比太小)
yaffs格式的根文件系统是可读可写的文件系统,没有经过压缩,是不可逆的。
#tar zxvf yaffs2.tar.gz
#cd yaffs2/utils
#make //会产生mkyaffsimage(生成yaffs镜像的)
#cp mkyaffsimage /bin //将生成的工具拷贝到bin目录下
#cd /home/linux_platform/target/root_26
#tar zxvf rootfs_noGUI.tar.gz //解压不带QT库的根文件系统
# mkcramfs rootfs_noGUI/ rootfs_noGUI.cramfs
//将刚才解压出来的根文件系统制作成cramfs格式的镜像
#mkyaffsimage rootfs_noGUI/ rootfs_noGUI.yaffs
#cp rootfs_noGUI.cramfs /home/linux_platform/image/
(以上得到两个不带gui的,是两种格式)
#tar zxvf rootfs_GUI.tar.gz
# mkcramfs rootfs_GUI/ rootfs_GUI.cramfs
//制作带GUI界面的根文件系统
#mkyaffsimage rootfs_GUI/ rootfs_GUI.yaffs
#cp rootfs_GUI.cramfs /home/linux_platform/image/
(也是两个不同格式带gui的)
前面已经生成了构建嵌入式开发平台所需的所有文件,下面讲解将其更新到开发板中。
1) FLASH中没有任何信息(即开发板为裸板)时:
如果开发板中已经烧有vivi,则直接跳过此步,直接进行第2步:
使用LSJF24X0、H-JTAG烧写工具烧写vivi:
2) 板子中已经正确烧有vivi:
在超级终端中:使用
load flash vivi x(下载image下my_vivi)
load flash kernel x(下载image下my_zImage)
load flash root x(下载cramfs格式的文件系统)
/load yaffs root x(下载yaffs格式的文件系统)
分别将前面编译得出的镜像烧入开发板中,以启动我们的开发板。
3)根文件系统中已经做好了boa服务器、telnet服务器、QT图形库(带GUI含有)
可以设置开发板的IP地址,在PC机上通过虚拟机访问开发板,观察boa服务器的现象。
在dos下通过telnet客户端连接开发板管观察现象。
如果烧写的是带QT的图形库,我们可以启动2440 /home下的QT测试程序
前面已经生成了构建嵌入式开发平台所需的所有文件,下面讲解将其更新到开发板中。
(可以写个脚本集成到uboot中,uboot本身也支持自己添加一些命令)
1) FLASH中没有任何信息(即开发板为裸板)时:
如果开发板中已经烧有vivi或u-boot,则直接跳过此步,直接进行第2步:
使用LSJF24X0、H-JTAG烧写工具烧写u-boot:
烧写我们前面编译好的 my_u-boot.img
2) 假设开发板中已经有了vivi
使用vivi更新u-boot
#load flash vivi x
注意,这里跟前面不一样,传送文件的时候选择my_u-boot.bi文件进行传送
至此开发板中已经烧入了我们编译出的u-boot,重启开发板,显示界面变成了u-boot的启动界面:
3) 下面我们学习使用u-boot更新系统
(两种:网络和u口)
u-boot提供了通过网络下载的功能:
网络命令(需用交叉线连接电脑与开发板)
#ping 192.168.220.x(电脑主机IP)
//测试是否联通PC机上启动TFTP服务器
//如果可以连通启动TFTP+DHCP_Server/下的tftpd32.exe
将我们前面编译出的imag文件夹中的文件拷到TFTP+DHCP_Server/目录下
//下面的名字需换成我们编译的名字
更新内核:
1.#tftp 0x30000000 172.20.223.63:uImage.img (这里需要u-boot中有ip,用printenv查看ip,setenv ipaddr 来修改自己的ip,ipaddr )
(1.先下到内存中0x300000000,(因为是64m,从30000000-???),2.从内存再到flash )
2.#nand erase 0x50000 0x300000
(这里都是flash的地址,人们都约定好的,从5000开始)(nand需要先擦出, 才能再写,所以先擦出,擦了大概3-4m)
3.#nand write 0x30000000 0x50000 xxxx(此大小填入文件系统的实际大小,tftp下载完成后,会给出其大小)(需要0x300000 因为擦除了这么大,所以烧写这么大)
(3是从内存0x30000000,再到flash0x50000)
更新cramfs根文件系统
#tftp 0x30000000 172.20.223.63:rootfs.cramfs
#nand erase 0x350000 0x3cac000
#nand write 0x30000000 0x350000 xxxx(此大小填入文件系统的实际大小,tftp下载完成后,会给出其大小)
更新yaffs根文件系统
#tftp 0x30000000 172.20.223.63:rootfs.yaffs
#nand erase 0x350000 0x3cac000
#nand write.yaffs2 0x30000000 0x350000 xxxx(此大小填入文件系统的实际大小,tftp下载完成后,会给出其大小)
(此数字必须是528的整数倍)
重启
#boot //是否能引导操作系统起来
u-boot还提供了通过USB主的功能,可以把镜像文件拷入U盘中,然后烧写镜像:
(usb的主和从,默认只支持主,不支持从,经过移植可以实现从)
1. 插入U盘(经测试<=4G的U盘可以正常识别,8G以上U盘暂时无法识别)
2. 在U-boot目录下敲入以下命令
#usb start
(只有fat格式的才能支持)
unsp2440 # usb start
(Re)start USB...
USB: scanning bus for devices... 4 USB Device(s) found
scanning bus for storage devices... 1 Storage Device(s) found
#usb tree (插多个u盘的时候可以查看)
Device Tree:
1 Hub (12 Mb/s, 0mA)
| OHCI Root Hub
|
+-2 Hub (12 Mb/s, 64mA)
| | Standard USB Hub
| |
| +-3 Mass Storage (12 Mb/s, 100mA)
| SanDisk Cruzer Slice 0878101D5F51B353
|
+-0 See Interface (12 Mb/s, 0mA)
#fatinfo usb 0:1 (这里的1表示有一个优盘)
Interface: USB
Device 0: Vendor: SanDisk Rev: 8.02 Prod: Cruzer Slice
Type: Removable Hard Disk
Capacity: 3813.7 MB = 3.7 GB (7810559 x 512)
Partition 1: Filesystem: FAT32 "NO NAME "
#fatls usb 0:1 //可以显示当前U盘所有目录及文件信息
unsp2440 # fatls usb 0:1
mds/
recycler/
qt_test/
u-boot.bin
#fatload usb 0:1 0x30000000 u-boot.bin