我的板子是ATMEL的芯片,杭州一个小厂生产的,质量比较次,不支持从nandflash直接启动。所以需要自己编译Bootstrap放到dataflash里面用来引导u-boot。
u-boot在我们的板子上面可以烧写到dataflash也可以烧写到nandflash,所以下面分情况讨论。
1 编译Bootstrap
1.1 从dataflash启动uboot
(1)修改:board/at91sam9263ek/dataflash/at91sam9263ek.h文件,如下内容
//#define CRYSTAL_16_36766MHZ 1 //注释这一行
#define CRYSTAL_18_432MHZ 1 //添加这一行,因为我们at91sam9263ek这块板子的晶振是18.432M
(2)修改board/at91sam9263ek/dataflash/Makefile
CROSS_COMPILE=arm-elf-
(3) 然后运行:
cd board/at91sam9263ek/dataflash/
make clean && make
(4)将生成的dataflash_at91sam9263ek.bin烧录到dataflash的0X0地址。
1.2 从nandflash启动uboot
(1)修改:board/at91sam9263ek/nandflash/at91sam9263ek.h文件,如下内容
//#define CRYSTAL_16_36766MHZ 1
#define CRYSTAL_18_432MHZ 1
(2)修改board/at91sam9263ek/dataflash/Makefile
CROSS_COMPILE=arm-linux- //这个改为你机器的交叉编译工具的前缀
(3)修改include/nand_ids.h 文件
static struct SNandInitInfo NandFlash_InitInfo[] = {
{0xecda, 0x800, 0x20000, 0x800, 0x40, 0x0, "Samsung K9F2G08U0M 256Mb\0"},
{0x2cca, 0x800, 0x20000, 0x800, 0x40, 0x1, "Micron MT29F2G16AAB 256Mb\0"},
{0x2cda, 0x800, 0x20000, 0x800, 0x40, 0x0, "Micron MT29F2G08AAC 256Mb\0"},
{0xecf1, 0x400, 0x20000, 0x800, 0x40, 0x0, "Samsung K9F1G08U0M 128Mb\0"}, //增加这一行,支持板子上面的nandflash
{0x2cda, 0x800, 0x20000, 0x800, 0x40, 0x0, "Micron MT29F2G08AAC 256Mb\0"},
{0,}
};
(4) 然后运行:
cd board/at91sam9263ek/nandflash
make clean && make
(5)将生成的nandflash_at91sam9263ek.bin烧录到nandflash的0X20000地址。//这个地址在第一步中的头文件中定义
2 编译u-boot
2.1 从dataflash中启动uboot
(1)make at91sam9263ek_config
make
(2)最后将源文件主目录下生成的u-boot.bin烧录到dataflash的0X8400地址。//这个地址在bootstrap的相应的头文件board/at91sam9263ek/dataflash/at91sam9263ek.h定义
2.2 从nandflash启动uboot
(1)修改include/configs/at91sam9263ek.h
#undef CFG_USE_DATAFLASH
#define CFG_USE_NANDFLASH 1
(2)然后
make at91sam9263ek_config
make
(3)最后将源文件主目录下生成的u-boot.bin烧录到nandflash的0X20000地址。//这个地址在bootstrap的相应的头文件board/at91sam9263ek/nandflash/at91sam9263ek.h定义
3 编译内核
(1)修改arch/arm/mach-at91/board-sam9263ek.c
第57行:at91sam9263_initialize(18432000); //改一下时钟频率
找到类似如下的行,改成没有被注释的。 (这个与我的LCD屏幕有关)
//.left_margin = 1, .right_margin = 33,
.left_margin = 48, .right_margin = 16,
//.upper_margin = 1, .lower_margin = 0,
.upper_margin = 31, .lower_margin = 12,
//.hsync_len = 5, .vsync_len = 1,
.hsync_len = 96, .vsync_len = 2,
(2)配置编译
cp ./arch/arm/configs/at91sam9263ek_defconfig .config
make ARCH=arm oldconfig
make ARCH=arm menuconfig //在这里设置你需要的模块或者功能
make ARCH=arm CROSS_COMPILE=arm-linux- uImage
(在编译之前将u-boot下的tools/mkimage复制到/bin目录下,否则会报错找不到mkimage命令)
(3)烧录
将生成的uImage文件烧写到nandflash的0x20 0000。
4 上板子
板子上电运行
4.1 nandflash启动内核
(1)设置环境变量
setenv ipaddr 172.16.100.103 //板子的ip地址
setenv serverip 172.16.100.100 //服务器ip地址
setenv ethaddr a:a:a:f:d:1 //mac地址
(2)启动内核
nboot 0x22000000 0 0x200000
bootm 0x22000000
4.2 tftp加载,启动内核
(1)设置环境变量
setenv ipaddr 172.16.100.102 //板子的ip地址
setenv serverip 172.16.100.103 //服务器ip地址
setenv ethaddr a:a:a:f:d:1 //mac地址
setenv bootargs 'mem=64M console=ttyS0,115200 root=/dev/nfs rw nfsroot=172.16.100.103:/maxwit/rootfs ip=172.16.100.102:172.16.100.1:255.255.255.0'
saveenv(保存设置)
ping 172.16.100.103 //测试服务器是否连通,alive或者unreachable
注释:第四个环境变量用来加载nfs根文件系统的。
(2)加载内核
i. 设置主机的tftp服务
vi /etc/inetd.conf //将存放uImage的目录添加进来
/etc/init.d/openbsd-inetd restart //重启tftp服务
ii. 板子加载
tftp 0x22008000 uImage//或者tftpboot 0x22008000 uImage
bootm 0x22008000ls
5 自动加载内核
setenv bootcmd 'nboot 0x22000000 0 0x200000; saveenv; bootm 0x22000000'
自动加载文件系统
setenv bootargs 'mem=64M console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=jffs2'
reset之后就可以看到u-boot自动加载内核了
阅读(1357) | 评论(0) | 转发(0) |