OMAP5912开发板的linux2.6内核移植
作者:毛勇
一:搭建交叉编译环境
由于搭建交叉编译环境比较繁琐,建议大家用已经搭建好的交叉编译环境3.3.2的。 (本实验用的就是3.3.2的arm平台的交叉编译环境)。
一 步骤:
1. 解压文件 命令:
tar jxvf obsolete-gcc-3.3.2.tar.bz2
(obsolete-gcc-3.3.2.tar.bz2下载地址: )
2. 把解压的文件夹中的 “3.3.2”文件夹拷贝到 /usr/local/arm目录下(如果没有arm目录就
新建arm目录,但是一定要是拷贝到这个目录,不然不能运行)。
3. export PATH=/usr/local/arm/3.3.2/bin:$PATH
------------------------------ 补 充 -------------------------------------------------
为了不用每次用交叉编译环境时都输入:export PATH=/usr/local/arm/3.3.2/bin:$PATH 可以在 /目录建立个env.sh文件。(偶是懒人,呵呵懒人总的找个偷懒的方法)
env.sh内容如下:
################ env.sh 文件内容 ############################################
!/bin/sh
export PATH=/usr/local/arm/3.3.2/bin:$PATH
################env.sh 文件内容 ############################################
以后要用到交叉编译环境的时候只要在你的shell中输入:
source /env.sh 或 sh /env.sh
------------------------------ 补充 结束 ------------
4. 如果输入 arm- 然后按下tab键能自动补全命令 arm-linux- 说明搭建成功
二:编译uboot
一 编译uboot1.1.1
1. export PATH=/usr/local/arm/3.3.2/bin:$PATH
2. make omap5912osk_config
3. make CROSS_COMPILE=arm-linux-
会出现错误:(如下)
---------------------------------- 显示出错 ----------------------------------------
No rule to make target `hello_world.srec', needed by `all'. Stop.
------------------------------------ 出错显示结束 ----------------------------------
===================== 解决方法 ==================================================== 解决方法:把example文件夹下的Makefile中的
第114行
%.srec: % 改成: %.srec: %.o
第117行的 %.bin: % 改成
%.bin: %.o
===================== 解决方法 结束 ===============================================
4. make CROSS_COMPILE=arm-linux- 如果不出错的话可以生成需要u-boot.bin
三 下载 bootloader到开发板
以上介绍了u-boot 的编译,以及可能出现的错误。这一小结介绍怎样把编译好的bootloader下载到我们的开发板(型号TMDSOSK5912)。bootloader烧写工具Flash Recovery Utility只能烧写 rev C版的。rev D版的不能烧。
方法1:用ccs下载 用ccs下载(略:由于本人没有实验用这种方法)。
---------------------------------- 注意事项 ----------------------------------------
用ccs下载,要开发板上有bootloader,裸机连不上ccs。合众达仿真器的一个bug。
------------------------------------ 注意事项结束 -----------------------------------
方法2:用u-boot下载 步骤:
1. 先要搭建tftp服务器 (linux下tftp搭建方法不在本文之内,请参考别的说明书)
---------------------------------- windows 下搭建TFTP的方法 -------------------------
1. 下载TFTP Server
2. 进入TFTP Server 目录 eg: D:\Tools\TFTP Server
3. 双击TFTPSRV.EXE 如果有Windows防火墙的话,跳出防火墙请点解除阻止。
4. 把要下载的文件拷贝到TFTP Server所在目录(就这么简单)
-------------------------------- windows 下搭建TFTP的方法 结束 ----------------------
2. setenv ipaddr 192.168.0.2 (开发板上,也就是在minicom 或模拟终端环境中输入)
3. setenv serverip 192.168.0.1 (开发板上,也就是在minicom 或模拟终端环境中输入)
4. Setenv netmask 255.255.255.0 (开发板上,也就是在minicom 或模拟终端环境中输入)
5. setenv ethaddr 00:0E:99:04:09:03 (开发板上,也就是在minicom 或模拟终端环境中输入)
6. Saveenv (保存刚才的改变)
===================================================================================
---------------------------------- 显示 -------------------------------------------
Saving Environment to Flash... . done Un-Protected 1 sectors Erasing Flash... . done Erased 1 sectors Writing to Flash... done . done /tmp/ccHjo33o.s: Assembler messages: /tmp/ccHjo33o.s:3167: Error: .err encountered make[1]: *** [mm/page_alloc.o] Error 1
make: *** [mm] Error 2 Protected 1 sectors
------------------------------------ 显示 结束 -------------------------------------
错误原因: u-boot写保护。 解决方法: protect off 1:0 (见步骤9)
7. ifconfig eth0 192.168.0.1 up
(linux主机上,即在电脑上设置,如果是Windows的TFTP请到本地连接修改ip地址)
8. tftpboot 0x10000000 u-boot.bin
(把bootloader下载到内存中,注意看下载文件的大小 xxxx,xxxx是16进制的) 当下载完成,将会显示下载文件的大小(16进制,在本实验中大小是192c0) 注意这个数字,下面将会用到。
------------------------------------ 显示 -----------------------------------------
Using MAC Address 00:01:08:07:00:00 TFTP from server 192.168.0.1; our IP address is 192.168.0.2 Filename 'u-boot.bin'. Load address: 0x10000000 Loading: ##################### done Bytes transferred = 103104 (192c0 hex)
------------------------------------ 显示 结束 -------------------------------------
9. protect off 1:0 (取消保护0块保护,为了下面擦写0块) 10. erase 1:0 11. cp.b 0x10000000 0x0 xxxx (xxxx为刚才7。提到的文件大小(16进制)本实验中是192c0,此数将会根据不同的编译大小不一样) eg: cp.b 0x10000000 0x0 192c0 用minicom 或在windows 用模拟终端连上开发板,按住键盘空格键,后重启开发板,你会进入uboot
------------------------------------ 显示 -----------------------------------------
U-Boot 1.1.1 (May 15 2007 - 15:08:58) CPU: OMAP162123 at 96.0 MHz (DPLL1=96.0 MHz) Board: OSK5912 DRAM: 32 MB Flash: 32 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
OMAP5912 OSK #
------------------------------------ 显示 结束 -------------------------------------
方法三:linux下用omapfl工具下载
1. ./omapfl 2nd.bin osk-u-boot.bin (linux环境)
------------------------------------ 显示 -----------------------------------------
OMAP found, trying to configure it OMAP error, retrying OMAP found, trying to configure it OMAP 1st boot contacted, sending 2nd boot Sent 4180 bytes to OMAP Flash found: Intel 28F128J3 Program stored in flash: 103104 bytes
------------------------------------ 显示 结束 -------------------------------------
===================================================================================
注意: 1. 要把jp3 的靠电源的两个引脚,连接使1,2相连(否则下载不了),连接完记得把把那个把插销插回原来的位置使2,3相连。 2. 连接上后按下reset(开发板上)按钮,开始下载,到完成 完成后,就可以用minicom或其他模拟终端连接上你的开发板
==================================================================================
三:编译linux内核
======================================================================================= 内核下载地址:
补丁下载地址:
注意:此处用到的编译器版本为 4.2.0 下载地址:
选 ARM EABI 和 IA32 GNU/linux
===================================================================================
1. cd /usr/src/
2. tar -xjvf ${DOWLOADDIR}/linux-${VERSION}.tar.bz2
3. cp ${DOWLOADDIR}/patch-${VERSION}-omap1.bz2
4. bunzip2 patch-${VERSION}-omap1.bz2
5. cd linux-${VERSION}/
6. cat ../patch-${VERSION}-omap1 | patch -p1
7. make omap_osk_5912_defconfig
8. make xconfig
9. make CROSS_COMPILE=arm-none-eabi-
10. 运行:
arm-none-eabi-objcopy -O binary -R .note -R .comment -S \ arch/arm/boot/compressed/vmlinux linux.bin
后可以生成:linux.bin文件
===================================================================================
注意:是arch/arm/boot/compressed/vmlinux目录下的vmlinux ===================================================================================
11. gzip -9 linux.bin
-----------------------------------------------------------------------------------
${U-BOOTDIR}/tools/mkimage -A arm -O linux -T kernel -C gzip -a 0x10c08000 -e 0x10c08000 -n 'Linux Kernel Image' -d linux.bin.gz uImage.cc (注意:这个命令不能没有换行)
也可把 mkimage拷贝到 /usr/bin目录 以后就用下面命令就可以了。
mkimage -A arm -O linux -T kernel -C gzip -a 0x10c08000 -e 0x10c08000 -n 'Linux Kernel Image' -d linux.bin.gz uImage.cc
-----------------------------------------------------------------------------------
===================================================================================
注意: ${U-BOOTDIR} 表示 刚才编译uboot的目录。Eg:u-boot1.1.1目录 ===================================================================================
13. 创建可以uboot可以下载的内核 ./mkimage -A arm -O linux -T kernel -C gzip -a 0x10c08000 -e 0x10c08000 -n "Linux Kernel Image" -d linux.bin.gz uImage.cc 会生成 uImage.cc文件 ===================================================================================
如果用命令 : file uImage.cc 看到如下结果说明成功: uImage.cc: PPCBoot image ===================================================================================
四:文件系统制作
一个基本的文件系统应该包括: busybox (提供 shell 命令集)、配置文件(用来初始化和布局你的文件系统)、设备文件(如果是用 devfs 的话这个就免了,现在内核中都不支持devfs了,用udev代替)、必要的库文件系统(如果 busybox 是静态编译的话,那根本不用为 busybox 用到的库文件而烦。Busybox 之所以比较难编译,主要是 busybox 和交叉编译工具的版本搭配问题, 在这里我推荐一个搭配:
busybox-1.1.3+arm-linux-gcc-3.3.2 busybox的制作,建议用交叉编译环境 3.3.2,和 busybox1.1.3 。本人编译了1.5.1的 和1.6的,用静态编译没问题1.4.2的要用动态编译拷贝了库还是不能用很郁闷的事。3.4.1的编译器,如果不行的话换高版本的。
另外就是 busybox一定要改Makefile文件,改是不难的,是人都会吧,那就不说了。如果不会网上找下。
或看我在北软的博客上的文章上面有详细的说明。
1. 生成文件系统
./mkfs.jffs2 -p -l -e 0x20000 -n -v -r /data/rootfs2.6/ -o filesys.jffs2
==================================================================================
五:烧写
一 UBOOT 的烧写:
1. 先要搭建tftp服务器
2. setenv ipaddr 192.168.0.2
3. setenv serverip 192.168.0.1
4. Setenv netmask 255.255.255.0
5. setenv ethaddr 00:0E:99:04:09:03
6. Saveenv
7. ifconfig eth0 192.168.0.1 up
(linux主机上,即在电脑上设置,如果是Windows的TFTP请到本地连接修改ip地址)
8. tftpboot 0x10000000 u-boot.bin
9. protect off 1:0 (取消保护0块保护,为了下面擦写0块)
10. erase 1:0
11. cp.b 0x10000000 0x0 xxxx (xxxx为刚才7。提到的文件大小(括号里的16进制) setenv bootargs console=ttyS0,115200n8 noinitrd root=/dev/mtdblock3 rootfstype=jffs2,nolock mem=32M
二内核的烧写:
1. tftpboot 0x10000000 uImage.cc 2. erase 1:2-17 或 erase 0x00040000 0x0023ffff
----------------------------------注意---------------------------------------------
此处1:2-17 擦除大小不能随便,18扇区开始是文件系统分区
-----------------------------------------------------------------------------------
2. cp.b 0x10000000 0x40000 xxxxx
-----------------------------------------------------------------------------------
从0x40000开始写内核,最大2M内核0x40000到0x240000两M内核空间。记得把u-boot的bootcmd改成 从0x40000开始。用命令: set bootcmd bootm 0x40000 你在u-boot中可以输入bootm 0x40000启动linux内核。
-----------------------------------------------------------------------------------
三 文件系统的烧写:
1. tftpboot 0x10000000 filesys.jffs2 (把filesys.jffs2拷贝到/tftpboot目录,开tftp服务)
2. erase 0x00240000 0x02000000 3. cp.b 0x10000000 0x240000 xxxx 4. bootm 0x40000
-------------------------------显示------------------------------------------------
U-Boot 1.1.1 (Aug 4 2005 - 10:41:25)
U-Boot code: 11080000 -> 11095DD4 BSS: -> 1109A5A4
RAM Configuration:
Bank #0: 10000000 32 MB
Micron StrataFlash MT28F128J3 device initialized
Flash: 32 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
## Booting image at 00040000 ... Image Name: Linux Kernel Image Image Type: ARM Linux Kernel Image (gzip compressed) Data Size: 1469437 Bytes = 1.4 MB Load Address: 10c08000 Entry Point: 10c08000 Verifying Checksum ... OK Uncompressing Kernel Image ... OK
................................