U boot移植
环境与源码¶
U-boot源码获取¶
https://github.com/nxp-imx
环境搭建¶
创建项目¶
在顶层Makefile中给 ARCH 和CORSS_COMPILE 赋值¶
ARCH := arm
CROSS_COMPILE := arm-linux-gnueabihf-
编译NXP¶
make distclean
make mx6ull_14x14_evk_emmc_defconfig
make -j12
make distclean
修改defconfig¶
cd configs
cp mx6ull_14x14_evk_emmc_defconfig mx6ull_acorn_emmc_defconfig
CONFIG_TARGET_MX6ULL_14X14_EVK=y
CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-evk-emmc"
CONFIG_TARGET_MX6ULL_ACORN_EMMC=y
CONFIG_DEFAULT_DEVICE_TREE="imx6ull-acorn-emmc"
修改.h文件¶
cd include/configs
cp mx6ullevk.h mx6ull_acorn_emmc.h
#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H
#ifndef _MX6ULL_ACRON_EMMC_H_
#define _MX6ULL_ACRON_EMMC_H_
修改板级文件¶
cd board/freescale
cp -r mx6ullevk mx6ull_acorn_emmc
cd mx6ull_acorn_emmc
mv mx6ullevk.c mx6ull_acorn_emmc.c
imximage.cfg¶
PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000
PLUGIN board/freescale/mx6ull_acorn_emmc/plugin.bin 0x00907000
Kconfig¶
if TARGET_MX6ULL_14X14_EVK || TARGET_MX6ULL_9X9_EVK
config SYS_BOARD
default "mx6ullevk"
config SYS_VENDOR
default "freescale"
config SYS_CONFIG_NAME
default "mx6ullevk"
config IMX_CONFIG
default "board/freescale/mx6ullevk/imximage.cfg"
config SYS_TEXT_BASE
default 0x87800000
endif
if TARGET_MX6ULL_ACORN_EMMC
config SYS_BOARD
default "mx6ull_acorn_emmc"
config SYS_VENDOR
default "freescale"
config SYS_CONFIG_NAME
default "mx6ull_acorn_emmc"
config IMX_CONFIG
default "board/freescale/mx6ull_acorn_emmc/imximage.cfg"
config SYS_TEXT_BASE
default 0x87800000
endif
MAINTAINERS¶
MX6ULLEVK BOARD
M: Peng Fan <peng.fan@nxp.com>
S: Maintained
F: board/freescale/mx6ullevk/
F: include/configs/mx6ullevk.h
F: configs/mx6ull_14x14_evk_defconfig
F: configs/mx6ull_14x14_evk_plugin_defconfig
F: configs/mx6ulz_14x14_evk_defconfig
MX6ULL_ACORN_EMMC BOARD
M: Jianwen Pan <pan@acorn.college>
S: Maintained
F: board/freescale/mx6ull_acorn_emmc/
F: include/configs/mx6ull_acorn_emmc.h
F: configs/mx6ull_acorn_emmc_defconfig
Makefile¶
obj-y := mx6ullevk.o
obj-y := mx6ull_acorn_emmc.o
mx6ull_acorn_emmc.c
修改Kconfig¶
cd arch/arm/mach-imx/mx6
config TARGET_MX6ULL_ACORN_EMMC
bool "Support mx6ull_acorn_emmc"
depends on MX6ULL
select BOARD_LATE_INIT
select DM
select DM_THERMAL
select IMX_MODULE_FUSE
select OF_SYSTEM_SETUP
imply CMD_DM
source "board/freescale/mx6ull_acorn_emmc/Kconfig"
设备树¶
创建空设备树imx6ull-acorn-emmc.dts¶
cd arch/arm/dts
touch imx6ull-acorn-emmc.dts
#include "imx6ull.dtsi"
修改Makefile¶
dtb-$(CONFIG_MX6ULL) += \
imx6ull-14x14-ddr3-val.dtb \
imx6ull-14x14-ddr3-val-epdc.dtb \
imx6ull-14x14-ddr3-val-emmc.dtb \
imx6ull-14x14-ddr3-val-gpmi-weim.dtb \
imx6ull-14x14-ddr3-val-tsc.dtb \
imx6ull-14x14-evk.dtb \
imx6ull-acorn-emmc.dtb \
imx6ull-14x14-evk-emmc.dtb \
imx6ull-14x14-evk-gpmi-weim.dtb \
imx6ull-9x9-evk.dtb \
imx6ull-colibri.dtb \
imx6ull-colibri-emmc.dtb \
imx6ull-myir-mys-6ulx-eval.dtb \
imx6ull-seeed-npi-imx6ull-dev-board.dtb \
imx6ull-phytec-segin-ff-rdk-emmc.dtb \
imx6ull-dart-6ul.dtb \
imx6ull-somlabs-visionsom.dtb \
imx6ulz-14x14-evk.dtb \
imx6ulz-14x14-evk-emmc.dtb \
imx6ulz-14x14-evk-gpmi-weim.dtb
编译¶
make distclean
make mx6ull_acorn_emmc_defconfig
make -j12
设备树¶
SD及emmc¶
LCD和启动logo¶
LCD的GPIO¶
static iomux_v3_cfg_t const lcd_pads[] = {
MX6_PAD_LCD_CLK__LCDIF_CLK | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_ENABLE__LCDIF_ENABLE | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_HSYNC__LCDIF_HSYNC | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_VSYNC__LCDIF_VSYNC | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA00__LCDIF_DATA00 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA01__LCDIF_DATA01 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA02__LCDIF_DATA02 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA03__LCDIF_DATA03 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA04__LCDIF_DATA04 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA05__LCDIF_DATA05 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA06__LCDIF_DATA06 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA07__LCDIF_DATA07 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA08__LCDIF_DATA08 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA09__LCDIF_DATA09 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA10__LCDIF_DATA10 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA11__LCDIF_DATA11 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA12__LCDIF_DATA12 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA13__LCDIF_DATA13 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA14__LCDIF_DATA14 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA15__LCDIF_DATA15 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA16__LCDIF_DATA16 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA17__LCDIF_DATA17 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA18__LCDIF_DATA18 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA19__LCDIF_DATA19 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA20__LCDIF_DATA20 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA21__LCDIF_DATA21 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA22__LCDIF_DATA22 | MUX_PAD_CTRL(LCD_PAD_CTRL),
MX6_PAD_LCD_DATA23__LCDIF_DATA23 | MUX_PAD_CTRL(LCD_PAD_CTRL),
/* Use GPIO for Brightness adjustment, duty cycle = period. */
MX6_PAD_GPIO1_IO08__GPIO1_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
};
void do_enable_parallel_lcd(struct display_info_t const *dev)
{
enable_lcdif_clock(dev->bus);
imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads));
/* Set Brightness to high */
gpio_direction_output(IMX_GPIO_NR(1, 8) , 1);
}
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
}
} };
"panel=TFT7016\0" \
sudo apt-get update
sudo apt-get install imagemagick
convert logo.bmp -depth 8 output_logo.bmp
cd tools
Makefile
cd drivers/video/
cfb_console
logo居中
if(video_logo_xpos && video_logo_ypos)
{
video_logo_xpos= (VIDEO_VISIBLE_COLS - BMP_LOGO_WIDTH)>>1;
video_logo_ypos= (VIDEO_VISIBLE_ROWS - BMP_LOGO_HEIGHT)>>1;
}
mx6ull_acorn_emmc_defconfig
CONFIG_VIDEO_LOGO=y
CONFIG_VIDEO_BMP_LOGO=y