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目錄裏。