首先感谢tekkamanninja分享的源码:https://github.com/tekkamanninja/u-boot-2010.03-tekkaman,也可以参考友善之臂的移植手册。
由于本学期主要学习exyson 4412,对mini2440了解比较少,通过查看数据手册,移植手册,并分析源码,学习了uboot的工作原理,启动过程。
下面就说一下我遇到的问题,及其解决方法。
移植uboot必要准备,开发板为友善之臂的MINI2440,内核为友善之臂提供的linux-2.6.32.2,根文件系统为友善之臂提供的rootfs_qtopia_qt4.img。
1.安装linux系统,可以选择虚拟机,或在物理机上直接安装,我使用的是直接在物理机上安装的 ubuntu 16.04。
2.搭建交叉编译平台,操作需要root权限,ubuntu 64位的系统需要安装32位运行库,我使用的是4.3.2版本的arm-linux-gcc。
(1)下载4.3.2的编译器,可以去友善之臂官网下载http://arm9download.cncncn.com/mini2440/linux/arm-linux-gcc-4.3.2.tgz
(2)解压 sudo tar -xzvf arm-linux-gcc.tar.gz
(3)使用sudo cp -r ./ /usr/local/arm 把解压包拷贝到 /usr/local/arm。
(4)打开配置文件 sudo gedit /etc/bash.bashrc
添加环境变量 export PATH=/usr/local/arm/4.3.2/bin$PATH
保存并退出。
(5)使新配置的环境变量生效
source /etc/bash.bashrc
(6)查看环境变量是否配置成功
echo $PATH
如果出现刚才配置的路径则成功。
(7)查看是否安装成功
arm-gcc-linux -v
如果成功将打印版本信息。
3.安装串口工具kermit
(1)安装kermit
sudo apt-get install ckermit
(2)配置kermit
suso gedit /etc/kermit/kermrc
在文件的最后添加配置信息
4.安装NFS
(1)获取NFS
sudo apt-get install nfs-kernel-server
(2)配置NFS
sudo gedit /etc/exports
在最后输入 /home/chy/NFS 172.20.27.66/24(rw,nohide,insecure,no_wdelay,no_root_squash,no_subtree_check,sync)
/home/chy/NFS NFS共享目录
172.20.27.66/24 可以链接的IP地址范围
5.安装TFTP
(1)获取TFTP
sudo apt-get install tftpd-hpa
(2)配置TFTP
sudo gedit /etc/default/tftpd-hpa
将原来的内容改为:
TFTP_USERNAME="tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_DIRECTORY="tftp根目录" #服务器目录,需要设置权限为777,chomd 777
TFTP_OPTIONS="-l -c -s"
3.重新启动TFTP服务
sudo service tftpd-hpa restart
6.安装DNW
(1) make clean
(2) sudo make install
下载地址:http://download.csdn.net/detail/c1194758555/9595894
遇到的问题和解决方法:
1. make时出现不能找到 arm-tekkaman-linux-gnueabi-
更改Makefile 中的 CROSS_COMPILE 为 CROSS_COMPILE = arm-linux-
2.内核无法启动,更改uboot编号或内核编号使其保持一致
内核编号由 arch/arm/mach-s3c2440/mach-mini2440.c的MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board")的MINI2440决定。
打开/include/asm-arm/mach-types.h搜索MINI2440可以看到 #define MACH_TYPE_MINI2440 1999 所以编号为1999
uboot编号由board/esuoyanyu/mini2440/mini2440.c 中 gd->bd->bi_arch_number = MACH_TYPE_MINI2440 ; 决定。
打开include/asm-arm/mach-types.h搜索MACH_TYPE_MINI2440 发现其对应为 1999。
如果不一样可以更改uboot或内核编号使其一致。
3.uboot文件超过定义的uboot分区大小。
(1) 在NAND FLASH 中对系统组件的安排:
uboot: 系统引导程序区。
params: 参数传递区,由引导程序向内核传递参数。
kernel: 系统内核存放区。
root: 根文件系统。
(2)更改uboot分区信息:
uboot 分区信息在/include/config/mini2440.h中定义,可以修改为适合自己需要大小。
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:384k(bootloader)," \
"128k(params)," \
"5m(kernel)," \
"-(root)"
uboot 0x0 0x60000 384KB
params 0x60000 0x80000 128KB
kernel 0x80000 0x580000 5MB
root 0x580000 ----- 剩余大小
(3)修改系统内核的分区信息,与uboot的分区信息保持一直。
内核分区信息在linux-2.6.32.2/arch/arm/mach-s3c2440/mach-mini2440.c
static struct mtd_partition friendly_arm_default_nand_part[] = {
[0] = {
.name = "supervivi", //存放的为系统引导程序,起始地址为0x00 大小为 256K,对应dev/mtdblock0
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "param", //参数传递区,起始地址为0x40000 大小为 128K,对应dev/mtdblock1
.offset = 0x00040000,
.size = 0x00020000,
},
[2] = {
.name = "Kernel", //系统内核区,起始地址为0x60000,大小5MB,对应dev/mtdblock2
.offset = 0x00060000,
.size = 0x00500000,
},
[3] = {
.name = "root",
.offset = 0x00560000,
.size = 1024 * 1024 * 1024, //根文件系统区,起始地址为0x560000,大小为剩余大小,对应dev/mtdblock3
},
[4] = {
.name = "nand",
.offset = 0x00000000,
.size = 1024 * 1024 * 1024,
}
};
以上参数可以更改为适合自己程序大小,并与uboot的信息保持一致。
4.启动参数的配置
(1) bootcmd uboot自动启动默认参数。
NAND FLASH 启动可以配置为: nand read 0x80000 0x500000,bootm 0x30008000
0x80000 为系统内核存放起始地址,0x500000 为存放系统内核所占的内存大小,0x30008000 为读取到SDARM执行的起始地址。
NFS 方式加载内核可以配置为 nfs 0x30008000 172.20.27.66:/home/chy/NFS/zImage.img\;bootm 0x30008000
172.20.27.66为本机IP地址,/home/chy/NFS 为NFS共享文件的路径。
(2)bootargs参数的设置
root 为根文件系统所在的位置
console 串口,及波特率。
init 内核程序初始化,通常为执行的第一个脚本。
根文件在NAND FLASH
root=/dev/mtdblock3
根文件通过NFS加载
root=/dev/nfs rw nfsroot=172.20.27.66:/home/chy/NFS/rootfs
(3)启动参数的配置方式
通过更改/include/config/mini2440.h中的宏
CONFIG_BOOTARGS和CONFIG_BOOTCOMMAND
或通过uboot的命令行,setenv命令修改。
5.网卡的驱动的bug
(1)修改/home/chy/mini2440/uboot_1/drivers/net/dm9000x.c
屏蔽掉static void dm9000_halt(struct eth_device *netdev)函数里面的全部内容。
在ping时,该函数在较短时间关闭网卡造成网卡没有来得及收到主机回复是已经关闭,从而造成ping不通的情况。
(2)static u16 phy_read(int reg)的延时参数由100修改未1000。
解决延时较短,不能显示网卡信息。
6.内核编译
(1)ubuntu系统,在编译生成zImage时需要手动安装ncurses
下载链接:http://ftp.gnu.org/gnu/ncurses/
(2)ncurses6.0安装出错
我使用的是ncurses6.0,找到curses.tail文件
extern NCURSES_EXPORT(bool) mouse_trafo (int*, int*, bool); /*generated*/
删除注释,重新编译安装。
7.根文件系统超过内存大小
开发板SDARM为64MB,NAND FLASH为256MB,文件系统为95.7 MB。如果烧写到NAND FLASH 需要先读到SDARM上再写入NAND FLASH。
(1)通过split命令分割文件,分别烧入。
(2)通过NFS挂载根文件系统。
8.开机logo的修改
(1)制作自己喜欢的开机logo
通过GIMP打开一张图片,在 图像 >> 模式 >> 索引 >> 最大颜色数量,把值改为224。
通过 图像 >> 放缩图像,调整图片大小,统宝3.5寸屏240*320,所以图片像素不能超过这个范围。
最后 文件 >> 导出为,选择把图片保存为ppm格式。
(2)打开inux-2.6.32.2/drivers/video 把 logo_linux_clut224.ppm替换为自己刚制作的图片即可。
(3)重新编译内核,制作内核镜像,烧入即可。
(4)效果,没有全屏,下半部分打印启动信息。