004-BSP学习笔记-Uboot移植(附uboot启动linux内核)

一、添加新开发板配置

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名

五、配置bootcmdbootargs 环境变量

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值