u-boot的基础知识前面已经分析完,接下来针对我们自己的板子进行详细的移植。
修改代码
eeprom
由于板子中没有eeprom,所以下面这个函数需要修改。
board/ti/am335x/board.c
static inline int __maybe_unused read_eeprom(void)
{
//return ti_i2c_eeprom_am_get(-1, CONFIG_SYS_I2C_EEPROM_ADDR);
return 0;
}
网卡设置
int board_eth_init(bd_t *bis)
{
... ...
if (1 || board_is_bone() || board_is_bone_lt() ||
board_is_idk()) {
writel(MII_MODE_ENABLE, &cdev->miisel);
cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
PHY_INTERFACE_MODE_MII;
}
... ...
}
管脚
管脚设置,使能Nand管脚
board/ti/am335x/mux.c
void enable_board_pin_mux(void)
{
/* Do board-specific muxes. */
if (1 || board_is_bone()) {
/* Beaglebone pinmux */
configure_module_pin_mux(mii1_pin_mux);
configure_module_pin_mux(mmc0_pin_mux);
#if defined(CONFIG_NAND)
configure_module_pin_mux(nand_pin_mux);
#elif defined(CONFIG_NOR)
configure_module_pin_mux(bone_norcape_pin_mux);
#else
configure_module_pin_mux(mmc1_pin_mux);
#endif
}
... ...
}
代码修改如上,就可以支持我们的板子。
配置
下面裁剪u-boot,去除不需要的功能,如MMC等。有些功能是通过menuconfig来配置,有些则需要在am335x_evm.h等头文件中设置。有几个特别注意的配置:
设置启动参数
"nandargs=setenv bootargs console=${console} " \
"${optargs} " \
"root=${nandroot} noinitrd " \
"rootfstype=${nandrootfstype}\0" \
"nandroot=ubi0:rootfs rw ubi.mtd=7,2048\0" \
"nandrootfstype=ubifs ubi.fm_autoconvert=1\0" \
"console=ttyO0,115200n8\0" \
"nandboot=echo Booting from nand ...; " \
"run nandargs; " \
"nand read ${fdtaddr} NAND.SPL.backup2; " \
"nand read ${loadaddr} NAND.kernel; " \
"bootm ${loadaddr} - ${fdtaddr}\0"
#define BOOT_TARGET_DEVICES(func) \
func(NAND, nand, 0) \
#define CONFIG_BOOTCOMMAND \
"run nandboot"
设置Nand分区
#define MTDPARTS_DEFAULT "mtdparts=nand.0:" \
"128k(NAND.SPL)," \
"128k(NAND.SPL.backup1)," \
"128k(NAND.SPL.backup2)," \
"128k(NAND.SPL.backup3)," \
"1920k(NAND.u-boot)," \
"128k(NAND.u-boot-env)," \
"5m(NAND.kernel)," \
"-(NAND.file-system)"
#define CONFIG_SYS_NAND_U_BOOT_OFFS 0x00080000
#define CONFIG_CMD_SPL_NAND_OFS 0x00060000 /* os parameters */
#define CONFIG_SYS_NAND_SPL_KERNEL_OFFS 0x00280000 /* kernel offset */
#define CONFIG_CMD_SPL_WRITE_SIZE 0x20000
环境变量
把环境变量放到Nand中
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET 0x00260000
网卡地址
定义CONFIG_ETHADDR
#define CONFIG_ETHADDR 38:d2:69:77:b4:94
否则会报警告:
Net: <ethaddr> not set. Validating first E-fuse MAC
另外还需要在include/env_default.h的default_environment数组中添加
#ifdef CONFIG_ETHADDR
"ethaddr=" __stringify(CONFIG_ETHADDR) "\0"
#endif
falcon模式
启动源如果是Nand,则默认会开启falcon模式,如果不需要,则应该关闭
include/configs/ti_armv7_common.h
#if 0
#define CONFIG_SPL_OS_BOOT
#endif
找到CONFIG_SPL_OS_BOOT,注释掉就好了。
Makefile
最后一点,在修改顶层Makefile
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
+ARCH = arm
+CROSS_COMPILE = arm-linux-
编译
make am335x_boneblack_defconfig
make menuconfig
Boot images --->
(NAND) Extra Options (DEPRECATED)
启动介质修改为NAND。
然后结合之前的配置信息,裁剪不需要的功能。
make
最终会在当前目录下生成MLO,u-boot.img,这两个文件是我们需要使用的。
烧写
设置好网络环境,上电,进入u-boot交互界面
setenv serverip 192.168.1.2
setenv ipaddr 192.168.1.110
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
tftp 0x82000000 MLO
nand erase 0x0 0x20000
nand write.i 0x82000000 0x0 ${filesize}
tftp 0x82000000 u-boot.img
nand erase 0x80000 0x1e0000
nand write.i 0x82000000 0x80000 ${filesize}
上面的命令适用于新版本u-boot,譬如我目前用的版本,老版本如2011.09则不适用。
如果当前u-boot是老版本的,在烧写新版本时需要加上nandecc hw 2;
否则,会出现一个奇怪的现象:设备上电后,一直打印CCC,这儿说的一直是一直动态的打印。
串口烧写
当Nand里面没有u-boot,或u-boot不可用时,如何烧写?可以采用sd卡烧写,我们采用的是串口烧写。
串口烧写的方式如下,串口工具是secureCRT。
上电,从串口中打印CCCCC字符,打开文件传输协议Transfer –> Send Xmodem(1K mode),
选择 u-boot-spl.bin文件进行传输。传输成功后,AM335x内部的ROM会引导启动。当这个启动完成之后会再一次出现CCCCC字符,这时打开文件传输协议Transfer –> Send Ymodem(1K mode),传输文件u-boot.img.传输完成后,SPL会引导启动这个在RAM里面的u-boot。
此处用到的u-boot-spl.bin,是在成功编译u-boot后生成的,位于顶层目录下的spl目录里。