1.在U-Boot中驅動LCD和網絡
在U-Boot 移植初探一文中介紹了如何修改 NXP官方uboot,使得 uboot能匹配我們自己的開發板,但是匹配完成后 LCD驅動和網絡驅動還是不正常的,所以下面將介紹如何修改 LCD驅動和網絡驅動等
1.1 LCD驅動修改
uboot 中修改驅動都是在對應板子的 .c文件和 .h文件中進行,即下面兩個文件中:mx6ull_andyxi_emmc.c 和 mx6ull_andyxi_emmc.h
修改 LCD驅動重點注意以下幾點:
- LCD的 IO配置是否正確
- LCD背光引腳 GPIO的配置
- LCD配置參數是否正確
我們使用的 I.MX6ULL開發板的 LCD原理圖和 NXP官方的開發板一致,也就是LCD的IO和背光IO都是一樣的, 所以IO部分就不用修改了,只需修改 LCD配置參數即可
mx6ull_andyxi_emmc.c 文件中修改下面內容:
/*######### 原始內容 ###############################*/
/*該代碼定義了一個變量displays,類型為display_info_t,這個結構體
是LCD信息結構體,其中包括了LCD的分辨率,像素格式,LCD的各個參數等*/
struct display_info_t const displays[] = {{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "TFT43AB",
.xres = 480,
.yres = 272,
.pixclock = 108695,
.left_margin = 8,
.right_margin = 4,
.upper_margin = 2,
.lower_margin = 4,
.hsync_len = 41,
.vsync_len = 10,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
} } };
/*######### 修改后的內容 ###########################*/
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, //HBPD
.right_margin = 160, //HFPD
.upper_margin = 20, //VBPD
.lower_margin = 12, //VFPD
.hsync_len = 20, //HSPW
.vsync_len = 3, //VSPW
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
} } };
mx6ull_andyxi_emmc.h 文件中修改 panel值
panel=TFT7016 #根據具體使用型號修改
重新編譯 uboot并燒寫到 SD中啟動后,若 LCD仍不能顯示,則需要在uboot命令模式下,檢查環境變量 panel的值,確保與 LCD參數里的 name一致
panel=TFT7016 #與mx6ull_andyxi_emmc.c中修改的名稱保持一致
1.2 網絡驅動修改
I.MX6UL/ULL 內部有個以太網 MAC外設,需要外接一個 PHY芯片來實現網絡通信功能。 我們使用的 I.MX6U 開發板提供了這兩個網絡接口,都使用 LAN8720A 作為 PHY 芯片。 NXP 官方的I.MX6ULL EVK 開發板使用 KSZ8081 的 PHY 芯片。 下面將介紹更換了PHY 芯片以后如何調整網絡驅動,使網絡工作正常。
開發板 ENET1/ENET2的原理圖如下示:
網絡 PHY芯片LAN8720A,通過 RMII接口與 I.MX6ULL相連,引腳與 NXP官方的 I.MX6ULL EVK 開發板基本一樣,只是復位引腳不同。 從上圖可以看出,復位引腳ENET1_RST 接到了 I.M6ULL 的 SNVS_TAMPER7 引腳上,復位引腳 ENET2_RST 接到了 SNVS_TAMPER8 引腳上
修改網絡驅動重點注意以下幾點:
- LAN8720A復位引腳初始化
- LAN8720A的器件ID
- LAN8720A驅動
在 mx6ull_andyxi_emmc.c中添加復位引腳驅動
/* 結構體數組fec1_pads和fec2_pads是ENET1和ENET2這兩個網口的IO
* 配置參數,在這兩個數組中添加兩個網口的復位 IO 配置參數 */
/*######### 原始內容 ###############################*/
staticiomux_v3_cfg_tconst fec1_pads[]={
MX6_PAD_GPIO1_IO06__ENET1_MDIO |MUX_PAD_CTRL(MDIO_PAD_CTRL),
MX6_PAD_GPIO1_IO07__ENET1_MDC |MUX_PAD_CTRL(ENET_PAD_CTRL),
......
MX6_PAD_ENET1_RX_ER__ENET1_RX_ER |MUX_PAD_CTRL(ENET_PAD_CTRL),
MX6_PAD_ENET1_RX_EN__ENET1_RX_EN |MUX_PAD_CTRL(ENET_PAD_CTRL),
};
staticiomux_v3_cfg_tconst fec2_pads[]={
MX6_PAD_GPIO1_IO06__ENET2_MDIO |MUX_PAD_CTRL(MDIO_PAD_CTRL),
MX6_PAD_GPIO1_IO07__ENET2_MDC |MUX_PAD_CTRL(ENET_PAD_CTRL),
......
MX6_PAD_ENET2_RX_EN__ENET2_RX_EN |MUX_PAD_CTRL(ENET_PAD_CTRL),
MX6_PAD_ENET2_RX_ER__ENET2_RX_ER |MUX_PAD_CTRL(ENET_PAD_CTRL),
};
/*######### 修改后的內容 ###########################*/
staticiomux_v3_cfg_tconst fec1_pads[]={
MX6_PAD_GPIO1_IO06__ENET1_MDIO |MUX_PAD_CTRL(MDIO_PAD_CTRL),
MX6_PAD_GPIO1_IO07__ENET1_MDC |MUX_PAD_CTRL(ENET_PAD_CTRL),
......
MX6_PAD_ENET1_RX_ER__ENET1_RX_ER |MUX_PAD_CTRL(ENET_PAD_CTRL),
MX6_PAD_ENET1_RX_EN__ENET1_RX_EN |MUX_PAD_CTRL(ENET_PAD_CTRL),
MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 |MUX_PAD_CTRL(NO_PAD_CTRL),//添加此行
};
staticiomux_v3_cfg_tconst fec2_pads[]={
MX6_PAD_GPIO1_IO06__ENET2_MDIO |MUX_PAD_CTRL(MDIO_PAD_CTRL),
MX6_PAD_GPIO1_IO07__ENET2_MDC |MUX_PAD_CTRL(ENET_PAD_CTRL),
......
MX6_PAD_ENET2_RX_EN__ENET2_RX_EN |MUX_PAD_CTRL(ENET_PAD_CTRL),
MX6_PAD_ENET2_RX_ER__ENET2_RX_ER |MUX_PAD_CTRL(ENET_PAD_CTRL),
MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 |MUX_PAD_CTRL(NO_PAD_CTRL),//添加此行
};
/* 函數 setup_iomux_fec 就是根據 fec1_pads 和 fec2_pads 這兩個網絡IO配置
數組來初始化I.MX6ULL的網絡IO,此處需要在其中添加網絡復位IO的初始化代碼,
并且復位一下 PHY 芯片
*/
/*######### 原始內容 ###############################*/
staticvoidsetup_iomux_fec(int fec_id)
{
if(fec_id ==0)
imx_iomux_v3_setup_multiple_pads(fec1_pads,ARRAY_SIZE(fec1_pads));
else
imx_iomux_v3_setup_multiple_pads(fec2_pads, ARRAY_SIZE(fec2_pads));
}
/*######### 修改后的內容 ###########################*/
staticvoidsetup_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);
}
}
在 mx6ull_andyxi_emmc.h中修改 PHY器件地址及驅動
/*######### 原始內容 ###############################*/
#ifdef CONFIG_CMD_NET
#define CONFIG_CMD_PING
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_MII
#define CONFIG_FEC_MXC
#define CONFIG_MII
#define CONFIG_FEC_ENET_DEV 1 //用于選擇使用哪個網卡,默認為1(ENET2)
#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE ENET_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR 0x2 //ENET1的PHY地址,默認為0x2
#define CONFIG_FEC_XCV_TYPE RMII
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE ENET2_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR 0x1 //ENET2的PHY地址,默認為0x1
#define CONFIG_FEC_XCV_TYPE RMII
#endif
#define CONFIG_ETHPRIME "FEC"
#define CONFIG_PHYLIB
#define CONFIG_PHY_MICREL //用于使能Micrel公司的PHY驅動(KSZ8081芯片)
#endif
/*######### 修改后的內容 ###########################*/
#ifdef CONFIG_CMD_NET
#define CONFIG_CMD_PING
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_MII
#define CONFIG_FEC_MXC
#define CONFIG_MII
#define CONFIG_FEC_ENET_DEV 1
#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE ENET_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR 0x0 //修改ENET1的PHY地址為0x0
#define CONFIG_FEC_XCV_TYPE RMII
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE ENET2_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR 0x1 //修改ENET2的PHY地址為為0x1
#define CONFIG_FEC_XCV_TYPE RMII
#endif
#define CONFIG_ETHPRIME "FEC"
#define CONFIG_PHYLIB
#define CONFIG_PHY_SMSC //使能SMSC公司的PHY驅動(LAN8720A是SMSC生產的)
#endif
在 mx6ull_andyxi_emmc.c中刪除 74LV595的驅動代碼
/* NXP 官方I.MX6ULL EVK 開發板使用74LV595來擴展 IO,兩個網絡的復位引腳
* 就是由74LV595來控制的,I.MX6U-ALPHA開發板并沒有使用74LV595,因此刪除掉
*/
/*######### 原始內容 ###############################*/
#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)
/*##### 修改后的內容:以上四行替換為以下兩行 #######*/
/* ENET1 的復位引腳連接到 SNVS_TAMPER7 上,對應 GPIO5_IO07
* ENET2 的復位引腳連接到 SNVS_TAMPER8 上,對應 GPIO5_IO08
*/
#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)
//刪除74LV595的IO配置參數結構體
/*######### 刪除以下內容 ###############################*/
staticiomux_v3_cfg_tconst iox_pads[]={
/* IOX_SDI */
MX6_PAD_BOOT_MODE0__GPIO5_IO10 |MUX_PAD_CTRL(NO_PAD_CTRL),
/* IOX_SHCP */
MX6_PAD_BOOT_MODE1__GPIO5_IO11 |MUX_PAD_CTRL(NO_PAD_CTRL),
/* IOX_STCP */
MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 |MUX_PAD_CTRL(NO_PAD_CTRL),
/* IOX_nOE */
MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 |MUX_PAD_CTRL(NO_PAD_CTRL),
};
//刪除74LV595的初始化函數
/*######### 刪除以下內容 ###############################*/
staticvoidiox74lv_init(void)
{
int i;
gpio_direction_output(IOX_OE,0);
for(i =7; i >=0; i--){
gpio_direction_output(IOX_SHCP,0);
gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
udelay(500);
gpio_direction_output(IOX_SHCP,1);
udelay(500);
}
......
/*
* shift register will be output to pins
*/
gpio_direction_output(IOX_STCP,1);
};
//刪除iox74lv_set函數(用于控制74LV595的IO輸出電平)
/*######### 刪除以下內容 ###############################*/
voidiox74lv_set(int index)
{
int i;
for(i =7; i >=0; i--){
gpio_direction_output(IOX_SHCP,0);
if(i == index)
gpio_direction_output(IOX_SDI, seq[qn_output[i]][0]);
else
gpio_direction_output(IOX_SDI, seq[qn_output[i]][1]);
udelay(500);
gpio_direction_output(IOX_SHCP,1);
udelay(500);
}
......
/*
* shift register will be output to pins
*/
gpio_direction_output(IOX_STCP,1);
};
/* 刪除板子初始化函數 board_init 中的74lv595 的GPIO初始化代碼 */
/*######### 刪除部分代碼 ###############################*/
intboard_init(void)
{
......
imx_iomux_v3_setup_multiple_pads(iox_pads,ARRAY_SIZE(iox_pads));//刪除此行
iox74lv_init(); //刪除此行
......
return0;
}
在drivers/net/phy/phy.c 中的 genphy_update_link函數里,添加 SMSC的 PHY芯片條件編譯代碼段
/*######### 修改后的內容 ###########################*/
intgenphy_update_link(structphy_device*phydev){
unsignedint mii_reg;
//以下為添加的SMSC的PHY芯片條件編譯代碼段,只有使用SMSC的PHY才會執行
#ifdef CONFIG_PHY_SMSC
staticint lan8720_flag =0;
int bmcr_reg =0;
if(lan8720_flag ==0){
bmcr_reg =phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);
while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR)&0X8000){
udelay(100);
}
phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg);
lan8720_flag =1;
}
#endif
mii_reg =phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
......
return0;
}
至此網絡的復位引腳驅動修改完成,重新編譯 uboot,然后將 u-boot.bin 燒寫到 SD 卡中并啟動,uboot 啟動信息如下圖所示:
由上圖可見當前使用FEC1這個網口(ENET2),但此時網絡地址還沒有設置。 在uboot使用網絡之前還要先設置以下幾個網絡環境變量
setenv ipaddr 192.168.10.50 //開發板 IP 地址
setenv ethaddr b8:ae:1d:01:00:00 //開發板網卡 MAC 地址
setenv gatewayip 192.168.10.1 //開發板默認網關
setenv netmask 255.255.255.0 //開發板子網掩碼
setenv serverip 192.168.10.100 //服務器地址,也就是 Ubuntu 地址
saveenv //保存環境變量
設置好環境變量以后就可以在 uboot 中使用網絡了,用網線將開發板上的 ENET2與電腦連接起來,保證開發板和電腦在同一個網段內,通過 ping 命令來測試網絡連接,命令如下:
ping 192.168.1.100
結果如下圖示,說明ping 主機成功,至此說明ENET2網絡工作正常
將 mx6ull_andyxi_emmc.h中的CONFIG_FEC_ENET_DEV參數改為 0,然后重新編譯 uboot 并燒寫到 SD 卡中重啟,按以上步驟可以測試 ENET1 的網絡是否正常工作
1.3 其他修改
在 uboot啟動信息中會有“Board: MX6ULL 14x14 EVK”這一句,即板子名字為“ MX6ULL 14x14 EVK”,可將其改為我們自已的名字“ MX6ULL ANDYXI EMMC”
在mx6ull_andyxi_emmc.c中的checkboard函數里,做如下修改
/*######### 修改后的內容 ###########################*/
intcheckboard(void)
{
if(is_mx6ull_9x9_evk())
puts("Board: MX6ULL 9x9 EVK\\n");
else
puts("Board: MX6ULL ANDYXI EMMC\\n");
return0;
}
修改完成以后重新編譯 uboot 并燒寫到 SD 卡中驗證,uboot 啟動信息如下圖,可見名字已經修改過來了
2.bootcmd和bootargs環境變量
uboot 中有兩個非常重要的環境變量 bootcmd 和 bootargs,是采用類似 shell 腳本語言編寫的,里面有很多 NXP自己定義的的環境變量引用
文件 mx6ull_andyxi_emmc.h中的
宏CONFIG_EXTRA_ENV_SETTINGS 保存著這些環境變量的默認值,其內容如下:
#if defined(CONFIG_SYS_BOOT_NAND)
#defineCONFIG_EXTRA_ENV_SETTINGS\\
CONFIG_MFG_ENV_SETTINGS \\
"panel=TFT43AB\\0"\\
"fdt_addr=0x83000000\\0"\\
"fdt_high=0xffffffff\\0"\\
......
"bootz ${loadaddr} - ${fdt_addr}\\0"
#else
#defineCONFIG_EXTRA_ENV_SETTINGS\\
CONFIG_MFG_ENV_SETTINGS \\
"script=boot.scr\\0"\\
"image=zImage\\0"\\
"console=ttymxc0\\0"\\
"fdt_high=0xffffffff\\0"\\
"initrd_high=0xffffffff\\0"\\
"fdt_file=undefined\\0"\\
......
"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" \\
2.1 bootcmd環境變量
bootcmd 保存著 uboot 默認命令, uboot 倒計時結束后就會執行其中的命令。 一般是用來啟動內核的,比如讀取 EMMC或 NAND Flash中的內核鏡像文件和設備樹文件到 DRAM中,然后啟動內核
可在 uboot啟動后進入命令行設置 bootcmd環境變量的值。 如果 EMMC或者 NAND中沒有保存 bootcmd的值,那么 uboot就會使用默認值,板子第一次運行 uboot 時都會使用默認值來設置 bootcmd 環境變量
打開文件 include/env_default.h,在此文件中有如下所示內容:
......
#ifdef CONFIG_BOOTARGS
"bootargs=" CONFIG_BOOTARGS "\\0"
#endif
#ifdef CONFIG_BOOTCOMMAND
"bootcmd=" CONFIG_BOOTCOMMAND "\\0"
#endif
......
env_default.h中指定了很多環境變量的默認值,比如 bootcmd 的默認值是CONFIG_BOOTCOMMAND,bootargs的是 CONFIG_BOOTARGS。 我們可在mx6ull_andyxi_emmc.h 文件中通過設置宏 CONFIG_BOOTCOMMAND來設置 bootcmd 的默認值, NXP官方設置的 CONFIG_BOOTCOMMAND 值如下:
#defineCONFIG_BOOTCOMMAND\\
"run findfdt;"\\
"mmc dev ${mmcdev};"\\
"mmc dev ${mmcdev}; if mmc rescan; then "\\
"if run loadbootscript; then "\\
"run bootscript; "\\
"else "\\
"if run loadimage; then "\\
"run mmcboot; "\\
"else run netboot; "\\
"fi; "\\
"fi; "\\
"else run netboot; fi"
2.2 bootargs環境變量
bootargs 保存著 uboot 傳遞給 Linux 內核的參數,以下面命令為例
setenv bootargs console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw
bootargs 中常用的參數有:
- console:用來設置 linux終端,即通過什么設備來和 Linux進行交互,是串口還是 LC 屏幕,一般設置串口作為 Linux終端,這樣就可以在電腦上通過串口助手來和 linux進行交互了
console= ttymxc0, 115200
//console 為 ttymxc0,因為 linux啟動以后I.MX6ULL的串口1
//在linux下的設備文件就是/dev/ttymxc0
//ttymxc0 后面的“115200”,是設置串口的波特率
- root:用來設置根文件系統的位置
root= /dev/mmcblk1p2 rootwait rw
// /dev/mmcblk1p2用于指明根文件系統存放在mmcblk1設備的分區2中
// /dev/mmcblkxpy(x=0~ n,y=1~ n)表示mmc設備x的分區y
// rootwait表示等待mmc設備初始化完成以后再掛載,否則的話會出錯
// rw 表示根文件系統是可以讀寫的,不加rw的話可能只能讀而無法進行寫操作
- rootfstype:一般與root一起使用, 用于指定根文件系統類型,如果根文件系統為ext 格式的話此選項無所謂。 如果根文件系統是 yaffs、 jffs 或 ubifs 的話就需要設置此選項,指定根文件系統的類型
3.U-Boot啟動Linux測試
uboot 已經移植好后,就要測試一下 uboot 能不能完成它的工作:啟動 Linux 內核。 這里測試兩種啟動 Linux 內核的方法,一種是直接從 EMMC 啟動,一種是從網絡啟動
3.1 從EMMC啟動Linux
從 EMMC 啟動也就是將編譯出來的 Linux 鏡像文件 zImage 和設備樹文件保存在 EMMC中, uboot 從 EMMC 中讀取這兩個文件并啟動,這個是產品最終的啟動方式。 此處默認已經將 zImage 文件和設備樹文件燒寫到了 EMMC 中,可以直接讀取來進行測試
使用命令“ls mmc 1:1”檢查 EMMC 的分區 1 中是否已有相關文件,下圖結果表示已有相關文件
設置 bootargs 和 bootcmd 這兩個環境變量
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-andyxi-emmc.dtb; bootz 80800000 - 83000000;'
saveenv
輸入“boot”命令,啟動內核即可
3.2 從網絡啟動Linux
從網絡啟動 linux系統的唯一目的就是為了調試! 不管是為了調試 linux系統還是 linux下的驅動,每次修改 linux系統文件或者 linux下的某個驅動后都要將其燒寫到 EMMC 中去測試,這樣太麻煩了。 可以設置從網絡啟動,將 linux鏡像文件和根文件系統都放到 Ubuntu下指定的文件夾中,這樣每次重新編譯 linux內核或者 linux驅動后只需要將其拷貝到這個指定的文件夾中即可,這樣就無需頻繁的燒寫 EMMC
可以通過 nfs或者 tftp從 Ubuntu中下載 zImage和設備樹文件,本文使用 tftp從 Ubuntu中下載 zImage和設備樹文件,默認已經將 zImage和設備樹文件放到 Ubuntu下的 tftp目錄中
設置 bootargs 和 bootcmd 這兩個環境變量
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-andyxi-emmc.dtb; bootz
80800000 - 83000000'
saveenv
輸入“boot”命令,啟動內核,下圖結果表示內核啟動成功
4.U-Boot移植總結
uboot 移植到此結束,簡單總結一下 uboot 移植的過程:
- 不管是購買的還是自己做的開發板,基本都是參考半導體廠商的 dmeo板,半導體廠商會在他們的開發板上移植好 uboot、kernel和 rootfs等,最終制作好 BSP包提供給用戶。 我們可在官方提供的 BSP包的基礎上添加自已的板子,即俗稱的移植
- 購買的或者自己做的開發板一般不會原封不動的照抄半導體廠商的 demo板,都會根據實際情況來做修改,有修改就會涉及到 uboot下驅動的移植
- 一般 uboot中需要解決串口、NAND、EMMC或 SD卡、網絡和 LCD動,因為 uboot的主要目的是啟動 Linux內核,所以不用考慮太多的外設驅動
- 在 uboot中添加自己的開發板信息,并根據實際情況來修改 uboot中的驅動
-
NXP
+關注
關注
60文章
1278瀏覽量
184237 -
lcd
+關注
關注
34文章
4426瀏覽量
167509 -
Linux
+關注
關注
87文章
11304瀏覽量
209524 -
u-boot
+關注
關注
0文章
121瀏覽量
38228 -
開發板
+關注
關注
25文章
5050瀏覽量
97486
發布評論請先 登錄
相關推薦
評論