Uboot移植
一、添加新开发板配置
1、在configs
中添加默认配置文件(拷贝mx6ull_14x14_evk_emmc_defconfig到mx6ull_14x14_my_emmc_defconfig)
2、在include/configs
添加开发板对应的头文件(拷贝mx6ullevk.h到mx6ull_my_emmc.h)
3、在board/freescale
添加开发板对应的板级文件夹(拷贝文件夹mx6ullevk到mx6ull_my_emmc),重命名mv mx6ullevk.c mx6ull_my_emmc.c
①修改makefile中的.o文件
②修改imximage.cfg
③修改Kconfig
④修改MAINTAINERS
4、修改uboot图形界面配置文件,arch/arm/cpu/armv7/mx6/Kconfig
二、修改LCD驱动
1、修改LCD驱动文件mx6ull_my_emmc.c
struct display_info_t const displays[] = {{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "TFT7016",
.xres = 1024,
.yres = 600,
.pixclock = 19531,
.left_margin = 140,
.right_margin = 160,
.upper_margin = 20,
.lower_margin = 12,
.hsync_len = 20,
.vsync_len = 3,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
} } };
其中
p
i
x
c
l
o
c
k
=
1
/
(
p
i
x
H
z
)
∗
1
0
12
pixclock = 1/(pixHz)* 10 ^ {12}
pixclock=1/(pixHz)∗1012
2、修改mx6ull_my_emmc.h
中所有的panel=TFT43AB
,改为panel=TFT7016
,与name一致
3、编译uboot,若LCD仍异常,则确认printenv中panel变量是否修改。
三、网络驱动修改
1、确定需要修改的内容:
①PHY芯片复位引脚;
②PHY器件地址;
③对应PHY芯片型号的驱动
2、修改PHY地址和
打开mx6ull_my_emmc.h
#if (CONFIG_FEC_ENET_DEV == 0) //选择PHY芯片
#define CONFIG_FEC_MXC_PHYADDR 0x2 //PHY芯片地址
#define CONFIG_PHY_MICREL //PHY驱动,这里MICREL为micrel公司的PHY驱动,所以要改为CONFIG_PHY_REALTEK(SR8201F)
3、删除NXP官方开放板关于74LV595的配置(NXP通过该芯片来控制网络复位引脚)
①打开mx6ull_my_emmc.c
修改下面宏定义
#define IOX_SDI IMX_GPIO_NR(5, 10)
#define IOX_STCP IMX_GPIO_NR(5, 7)
#define IOX_SHCP IMX_GPIO_NR(5, 11)
#define IOX_OE IMX_GPIO_NR(5, 8)
为
#define ENET1_RESET IMX_GPIO_NR(5, 7) //GPIO5 IO7
#define ENET2_RESET IMX_GPIO_NR(5, 8)
②找到NXP EVK板74LV595的配置,将其删除
iomux_v3_cfg_t const iox_pads[]; //74LV595的IO配置参数结构体
void iox74lv_init(void); //初始化函数,在int board_init(void)中调用
void iox74lv_set(int index) //IO输出电平控制
同时删除int board_init(void)中的调用
int board_init(void)
{
......
imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));
iox74lv_init();
......
return 0;
}
③添加SR8201F复位引脚驱动
找到fecx_pads结构体进行引脚修改
static iomux_v3_cfg_t const fec1_pads[] = {
...
MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL), //添加
...
};
static iomux_v3_cfg_t const fec2_pads[] = {
...
MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
...
};
修改网络IO配置函数setup_iomux_fec
为如下:
static void setup_iomux_fec(int fec_id)
{
if (fec_id == 0)
{
imx_iomux_v3_setup_multiple_pads(fec1_pads,
ARRAY_SIZE(fec1_pads));
gpio_direction_output(ENET1_RESET, 1);
gpio_set_value(ENET1_RESET, 0);
mdelay(20);
gpio_set_value(ENET1_RESET, 1);
}
else
{
imx_iomux_v3_setup_multiple_pads(fec2_pads,
ARRAY_SIZE(fec2_pads));
gpio_direction_output(ENET2_RESET, 1);
gpio_set_value(ENET2_RESET, 0);
mdelay(20);
gpio_set_value(ENET2_RESET, 1);
}
mdelay(150); /* 复位结束后至少延时 150ms 才能正常使用*/
}
4、编译并启动u-boot
可以通过启动信息,查看当前网卡。环境变量 CONFIG_FEC_ENET_DEV
可以选择网卡
Net:FEC1
四、其他修改
int checkboard(void) //可修改borad名
五、配置bootcmd
和bootargs
环境变量
由mx6ull_my_emmc.h
中的CONFIG_EXTRA_ENV_SETTINGS
定义了默认设置
1、bootcmd(u-boot倒计时后运行,一般用于启动内核)
在` include/env_default.h`中定义了uboot所有的环境变量默认值,均引用`mx6ull_my_emmc.h`中的定义
#define CONFIG_BOOTCOMMAND
"run findfdt;" \ //运行findfdt环境变量(NXP定制的环境变量,用于查找开发板对应的设备树.dtb)
"mmc dev ${mmcdev};" \ //切换到mmcdev设备
"mmc dev ${mmcdev}; if mmc rescan; then " \ //查找其他mmc设备
"if run loadbootscript; then " \ //如果没有找到boot.scr则运行loadimage
"run bootscript; " \
"else " \
"if run loadimage; then " \ //加载zImage成功则运行mmcboot
"run mmcboot; " \
"else run netboot; " \
"fi; " \
"fi; " \
"else run netboot; fi" //运行netboot环境变量(从网络启动内核)
findfdt
"findfdt="\
"if test $fdt_file = undefined; then " \
"if test $board_name = EVK && test $board_rev = 9X9; then " \
"setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \
"if test $board_name = EVK && test $board_rev = 14X14; then " \
"setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \
"if test $fdt_file = undefined; then " \
"echo WARNING: Could not determine dtb to use; fi; " \
"fi;\0" \
loadbootscript,其中,mmcdev=1, mmcpart=1, loadaddr=0x80800000, script= boot.scr,将boot.scr文件加载到DDR指定地址处
loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};
loadimage, 其中 mmcdev=1, mmcpart=1, loadaddr=0x80800000, image = zImage
loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}
mmcboot
154 "mmcboot=echo Booting from mmc ...; " \
155 "run mmcargs; " \
156 "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
157 "if run loadfdt; then " \
158 "bootz ${loadaddr} - ${fdt_addr}; " \
159 "else " \
160 "if test ${boot_fdt} = try; then " \
161 "bootz; " \
162 "else " \
163 "echo WARN: Cannot load the DT; " \
164 "fi; " \
165 "fi; " \
166 "else " \
167 "bootz; " \
168 "fi;\0" \
loadfdt=fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb
loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}
bootcmd可以总结为
mmc dev 1 //切换到 EMMC
fatload mmc 1:1 0x80800000 zImage //读取 zImage 到 0x80800000 处
fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb //读取设备树到 0x83000000 处
bootz 0x80800000 - 0x83000000 //启动 Linux
所以CONFIG_BOOTCOMMAND可以直接改为
#define CONFIG_BOOTCOMMAND \
"mmc dev 1;" \
"fatload mmc 1:1 0x80800000 zImage;" \
"fatload mmc 1:1 0x83000000 imx6ull-alientek-emmc.dtb;" \
"bootz 0x80800000 - 0x83000000;"
2、bootargs(用来传递内核参数)
bootargs 环境变量是由 mmcargs 设置的,其中 console=ttymxc0, baudrate=115200, mmcroot=/dev/mmcblk1p2 rootwait rw
mmcargs=setenv bootargs console=${console},${baudrate} root=${mmcroot}
console:设置控制中断
root:设置根文件系统位置
rootfstype:设置文件系统格式
六、从uboot启动linux
1、从EMMC启动Linux
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000
imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;'
saveenv
boot或run bootcmd
2、从网络启动Linux
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz
80800000 - 83000000'
saveenv