在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在U-Boot中驅動LCD和網絡

CHANBAEK ? 來源:嵌入式攻城獅 ? 作者:安迪西 ? 2023-04-21 12:39 ? 次閱讀

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
    NXP
    +關注

    關注

    60

    文章

    1278

    瀏覽量

    184237
  • lcd
    lcd
    +關注

    關注

    34

    文章

    4426

    瀏覽量

    167509
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209524
  • u-boot
    +關注

    關注

    0

    文章

    121

    瀏覽量

    38228
  • 開發板
    +關注

    關注

    25

    文章

    5050

    瀏覽量

    97486
收藏 人收藏

    評論

    相關推薦

    U-boot的基本介紹

    從本文開始,將陸續推送“手把手教你移植U-boot”系列文章,目標是由淺入深地講解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默認硬件開發平臺為ARM,操作系統為Linux。
    發表于 07-14 16:52 ?2909次閱讀
    <b class='flag-5'>U-boot</b>的基本介紹

    U-Boot的啟動及移植分析

    bootloader 開發是嵌入式系統必不可少而且十分重要的部分,U-Boot 為功能強大的bootloader 開發軟件。本文詳細分析了U-Boot 的啟動流程,并結合其源碼,闡述了U-Boot
    發表于 09-01 16:34 ?27次下載

    Porting U-Boot to the Control

    In this paper, the way of porting U-Boot to Control Computer Based MPC8349 will beintroduced
    發表于 01-25 15:45 ?13次下載

    一種U-BOOT嵌入千兆網絡功能的方法

    一種U-BOOT嵌入千兆網絡功能的方法摘 要:U-BOOT是一種開放源碼的、用于多種嵌入式微處理器的引導加載程序,目前
    發表于 02-05 17:38 ?17次下載

    u-boot的Makefile分析

    u-boot的Makefile分析 U-BOOT是一個LINUX下的工程,在編譯之前必須已經安裝對應體系結構的交叉編譯環境,這里只針對ARM,編譯器系列軟件為arm-linux-*。 U-BOOT的下載
    發表于 05-17 09:16 ?2067次閱讀

    基于S3C2440的U-Boot開機logo的設計

    在對U-Boot進行深入分析的基礎上,同時對S3C2440的LCD控制器原理以及INNOLUX 7寸LCD的成像原理進行分析,最后結合系統軟硬件特性實現基于U-Boot的開機logo。
    發表于 12-06 15:14 ?96次下載
    基于S3C2440的<b class='flag-5'>U-Boot</b>開機logo的設計

    u-boot簡介

    演化而來。其源碼目錄、編譯形式與Linux內核很相似,事實上,不少U-Boot源碼就是根據相應的Linux內核源程序進行簡化而形成的,尤其是一些設備的驅動程序,這從U-Boot源碼的注釋
    發表于 10-14 11:17 ?3564次閱讀

    深度解析U-Boot網絡實現

    對于U-Boot而言,并沒有完整的實現上述模型,u-boot需要控制固件的尺寸,所以根據需要做了一些簡化,其拓撲框架如下圖所示:
    發表于 02-07 11:53 ?2次下載
    深度解析<b class='flag-5'>U-Boot</b><b class='flag-5'>網絡</b>實現

    U-Boot架構淺析

    導讀:嵌入式Linux系統搭建,bootloader是必不可少的一環,而U-Boot已成嵌入式Linux事實標準。所以較為深入的分析U-Boot的設計,對于更...
    發表于 02-07 11:56 ?7次下載
    <b class='flag-5'>U-Boot</b>架構淺析

    u-boot中使用ethernet的方法

    KV260 petalinux BSPu-boot device treedisable了GEM3,也就是說ethernetu-boot
    的頭像 發表于 07-21 10:25 ?3939次閱讀

    Vitis調試ARM可信固件和U-boot

    本篇博文中,我們將探討如何在 Vitis 調試 Zynq UltraScale 器件啟動鏡像。這些啟動鏡像包括 ARM 可信固件 (ATF) 和 U-boot。
    的頭像 發表于 08-02 10:14 ?3615次閱讀
    <b class='flag-5'>在</b>Vitis<b class='flag-5'>中</b>調試ARM可信固件和<b class='flag-5'>U-boot</b>

    U-boot的QSPI驅動移植方法及驗證方法

    本文主要講述了U-boot的QSPI驅動移植方法及驗證方法。在產品調試階段,U-boot的driver子系統包含了豐富的外設驅動,方便外設功能驗證與調試。
    的頭像 發表于 04-14 10:21 ?2992次閱讀
    <b class='flag-5'>U-boot</b>的QSPI<b class='flag-5'>驅動</b>移植方法及驗證方法

    U-boot的MMC DM框架驅動的移植方法

    本文主要講述了U-boot的MMC DM框架驅動的移植方法。DM是Driver Model的簡稱,是U-boot的基本驅動框架。常見的MMC設備包括SD卡、eMMC存儲器等。本文討論遵
    的頭像 發表于 04-14 10:22 ?3022次閱讀
    <b class='flag-5'>U-boot</b>的MMC DM框架<b class='flag-5'>驅動</b>的移植方法

    U-boot的DPU驅動移植方法

    本文以ARM Mali系列顯示處理器驅動為例,講述了U-boot的DPU驅動移植方法。
    的頭像 發表于 04-14 10:25 ?1375次閱讀
    <b class='flag-5'>U-boot</b>的DPU<b class='flag-5'>驅動</b>移植方法

    u-boot armv8鏈接腳本

    u-boot armv8鏈接腳本 進行源碼分析之前,首先看看u-boot的鏈接腳本,通過鏈接腳本可以從整體了解一個u-boot的組成,并且可以
    的頭像 發表于 12-07 11:19 ?686次閱讀
    主站蜘蛛池模板: 绝色村妇的泛滥春情| 天天综合射| 色狠狠成人综合网| 国产精品高清一区二区三区不卡 | 国模巴| 欧美一级视频在线高清观看 | 色婷婷基地| 成人在线免费网站| vip影院在线观看| 淫www| 国产一级aaa全黄毛片| 黄网在线免费观看| 宅男69免费永久网站| 黄网址免费| 国产小视频在线免费| 一级做a爰片久久毛片毛片| 黄网站免费大全| 成人午夜大片免费视频77777 | 四虎影视免费观看| 亚洲视频色| 日本丝瓜着色视频| 老逼影院| 国产成人一级片| 在线免费国产| 丁香在线| 欧美三级在线观看视频| 色极影院| 亚洲特级毛片| sesese在线观看| 亚洲国产女人aaa毛片在线| 免费看片aⅴ免费大片| 黄网在线看| 色综合综合色综合色综合| 天天干天天做天天射| 在线久综合色手机在线播放| 高清人妖shemale japan| h网站在线免费观看| 美女18黄| 1024手机在线看| 欧美午夜场| 操欧美女人|