色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

U-boot如何添加board

CHANBAEK ? 來源:人人極客社區(qū) ? 作者: 努力哥 ? 2023-01-19 16:14 ? 次閱讀

U-boot代碼層次

uboot需要支持眾多的硬件,并且具有良好的可擴(kuò)展性、可移植性和可維護(hù)性,因此必須要有一個設(shè)計良好的代碼架構(gòu)。代碼架構(gòu)的設(shè)計總是與軟硬件架構(gòu)密不可分的,在硬件層面嵌入式系統(tǒng)的核心一般包括以下層次:

(1)目標(biāo)板:它包含了系統(tǒng)運行所需的所有組件,如SOC芯片DDR、flash/emmc存儲器、各種外設(shè)以及時鐘源、電源管理芯片等

(2)SOC:它包含了cpu、總線控制器、集成在片內(nèi)的rom、sram、dma控制器、硬件加速器、異構(gòu)核,以及片內(nèi)時鐘、電源控制模塊等

(3)處理器架構(gòu):它一般指處理器體系結(jié)構(gòu)的大版本,不同的體系結(jié)構(gòu)之間可能存在不同的指令集、異常模型以及內(nèi)存模型等。例如對于arm系列架構(gòu),armv8和armv7就屬于不同的處理器架構(gòu)

(4)cpu型號:它是指處理器的具體型號,如cortex-a53或cortex-a72等

一般cpu型號和處理器架構(gòu)數(shù)量相對較少,如對于arm架構(gòu)來說一般就是arm官方發(fā)布的這些型號。而soc型號就要多一些,它主要是各芯片公司基于特定cpu架構(gòu)以及其它ip模塊,設(shè)計的專用或通用芯片,如高通海思設(shè)計的手機(jī)芯片。最后就是以soc芯片為核心設(shè)計的目標(biāo)板了,在目標(biāo)板上基本上集成了一款產(chǎn)品所需的所有組件,如一款手機(jī)的電路板。它們之間的簡單關(guān)系如下圖:

Dingtalk_20221206154648.jpg

Uboot的代碼設(shè)計也遵循以上層次,arch目錄包含了處理器架構(gòu)相關(guān)代碼,arch/cpu目錄包含了特定cpu代碼,而board目錄則包含了特定目標(biāo)板的代碼。因此當(dāng)我們新增加一款目標(biāo)板時,主要的工作就可以集中在board相關(guān)的代碼,只要不是太新的cpu型號,arch和cpu相關(guān)代碼在uboot官方版本中都已經(jīng)被支持。因此可以直接復(fù)用這部分實現(xiàn),我們唯一要做的就是選擇正確的配置選項。

如何添加board

添加board的基本步驟

當(dāng)我們開始一個全新的項目時,總是希望能先讓系統(tǒng)能運行起來,然后再在此基礎(chǔ)上為其添加更多的feature,這個只包含能讓系統(tǒng)運行所需模塊的系統(tǒng),叫做最小系統(tǒng)。cpu能正常運行包含以下幾個條件:

(1)具有合適的電源和時鐘

(2)程序代碼被加載到合適的位置,cpu能夠正常獲取指令

(3)具有cpu用于數(shù)據(jù)操作的可讀寫內(nèi)存

(4)cpu被release reset 當(dāng)然對于需要支持中斷的系統(tǒng),則還需要包含中斷控制器,而對于像操作系統(tǒng)這種需要通過定時器驅(qū)動進(jìn)程切換的系統(tǒng),則顯然還需要timer定時器。為了達(dá)到以上目的,我們添加board的基本步驟大概如下: (1)在board目錄下為新board添加一個目錄,用于存放board特定的代碼

(2)為新目錄添加Kconfig配置選項和Makefile編譯選項,將其添加到編譯系統(tǒng)中

(3)在Kconfig中為該board定義一個配置項,并為該配置項添加其所支持的特性,如cpu架構(gòu)、cpu型號等

(4)為新board增加一個配置相關(guān)的頭文件和編譯所需的defconfig文件,用于該board相關(guān)的選項配置

(5)在board目錄下添加適當(dāng)?shù)奈募崿F(xiàn)必要的接口

test board添加示例

添加target配置選項

  1. 在arch/arm/Kconfig的board select菜單下新增如下的TARGET_TESTBOARD配置選項:
config TARGET_TESTBOARD
        bool "Qemu test board"
        select ARM64
        select DM
        select DM_SERIAL
        select PL01X_SERIAL
        select SUPPORT_SPL
        select SPL if SUPPORT_SPL
        select SPL_FRAMEWORK_BOARD_INIT_F if SPL
        select SPL_SERIAL_SUPPORT
        select PL011_SERIAL if SPL
        select SPL_LIBGENERIC_SUPPORT if SPL
        select SPL_LIBCOMMON_SUPPORT if SPL

它將在后面的configs/testboard_defconfig中通過CONFIG_ TARGET_TESTBOARD =y選擇

  1. 在arch/arm/Kconfig文件中添加以下內(nèi)容,以包含board的Kconfig文件
source "board/mars/test/Kconfig"

添加config頭文件

在include/configs目錄下添加config頭文件testboard.h,并添加以下內(nèi)容:

#ifndef __CONFIG_H
#define __CONFIG_H
#include 

#define CONFIG_SYS_SDRAM_BASE           0x40000000

/* The DTB generated by QEMU is placed at start of RAM, stay away from there */
#define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SYS_SDRAM_BASE + SZ_2M)
#define CONFIG_SYS_LOAD_ADDR            (CONFIG_SYS_SDRAM_BASE + SZ_2M)
#define CONFIG_SYS_MALLOC_LEN           SZ_16M

#define CONFIG_SYS_BOOTM_LEN            SZ_64M

#define CONFIG_SYS_HZ                       1000

#define CONFIG_PL01x_PORTS              {(void *)(0x9000000)}
#define CONFIG_PL011_CLOCK      1


#define CONFIG_SYS_UBOOT_START 0x40300000
#define BOOT_TARGET_DEVICES(func) \\
        func(VIRTIO, virtio, 0)

#define CONFIG_EXTRA_ENV_SETTINGS \\
        "fdt_addr=0x43000000\\0" \\
        "kernel_addr_r=0x40000000\\0" \\
        "bootargs=earlycon root=/dev/vda\\0" \\
        "bootcmd=smhload /home/lgj/work/linux/arch/arm64/boot/Image ${kernel_addr_r};" \\
        "smhload /home/lgj/work/linux/arch/arm64/boot/dts/qemu/test-board-smc.dtb ${fdt_addr};" \\
        "booti ${kernel_addr_r} - ${fdt_addr}\\0"

#define CONFIG_SYS_CBSIZE 512
#define CONFIG_SYS_MONITOR_BASE         CONFIG_SYS_TEXT_BASE
#define CONFIG_SYS_MAX_FLASH_BANKS_DETECT       2
#define CONFIG_SYS_MAX_FLASH_SECT       256 /* Sector: 256K, Bank: 64M */
#define CONFIG_CFI_FLASH_USE_WEAK_ACCESSORS

#define CONFIG_SPL_MAX_SIZE 0x25000
#define CONFIG_SPL_STACK (CONFIG_SYS_SDRAM_BASE + SZ_1M)
#define CONFIG_SPL_BSS_START_ADDR (CONFIG_SYS_SDRAM_BASE + SZ_1M)

#define CONFIG_SPL_BSS_MAX_SIZE 0x1000
#endif

添加dtb文件

使用qemu模擬器啟動uboot時,模擬器會提供一個默認(rèn)的dtb文件,但是我們也可以使用自己自定義的dtb文件,以下是自定義dtb文件的方法:

  1. 在arch/arm/dts/目錄下添加dts文件test-board-minimal.dts,并在目錄的Makefile中添加以下編譯選項
dtb-$(CONFIG_TARGET_TESTBOARD) += test-board-minimal.dtb
  1. 在配置文件configs/testboard_defconfig中指定該dtb為默認(rèn)dtb文件,并使能uboot的設(shè)備樹支持
CONFIG_DEFAULT_DEVICE_TREE="test-board-minimal"
CONFIG_OF_CONTROL=y
CONFIG_OF_SEPARATE=y

添加board文件

  1. 在board目錄下創(chuàng)建mars/test目錄
  2. 在board/mars/test目錄下創(chuàng)建Kconfig文件,并添加如下內(nèi)容
if TARGET_TESTBOARD
config SYS_VENDOR
        default "mars"

config SYS_BOARD
        default "test"

config SYS_CONFIG_NAME
        default "testboard"
endif

其中:

SYS_VENDOR:用于指定該board的vendor名,它與SYS_BOARD一起確定會被編譯的board代碼路徑。即board/< SYS_VENDOR >/common和board/< SYS_VENDOR >/< SYS_BOARD >的路徑下的Makefile會被執(zhí)行,在我們的例子中該目錄為board/mars/common/和board/mars/test/SYS_BOARD:用于指定在board/< SYS_VENDOR >下需要編譯的board路徑,如當(dāng)前配置下該目錄為board/mars/test/

SYS_CONFIG_NAME用于指定include/configs目錄下的頭文件名,如當(dāng)前配置該文件即為include/configs/testboard.h

  1. 在board/mars/test目錄下創(chuàng)建MAINTAINERS文件,并添加如下內(nèi)容
QEMU QEMU TEST BOARD
M:      xxx@yyy.com
S:      Maintained
F:      board/mars/test
F:      include/configs/testboard.h
F:      configs/testboard.h
  1. 在board/mars/test目錄下創(chuàng)建Makefile文件,并添加如下內(nèi)容
obj-y   += testboard.o
  1. 創(chuàng)建board/mars/test目錄下創(chuàng)建testboard.c文件,并添加如下內(nèi)容
include 
#include 
#include 
#include 
#include 

#ifdef CONFIG_ARM64
#include 
static struct mm_region testboard_mem_map[] = {
        {
                /* Flash */
                .virt = 0x00000000UL,
                .phys = 0x00000000UL,
                .size = 0x08000000UL,
                .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
                         PTE_BLOCK_INNER_SHARE
        }, {
                /* Lowmem peripherals */
                .virt = 0x08000000UL,
                .phys = 0x08000000UL,
                .size = 0x38000000,
                .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
                         PTE_BLOCK_NON_SHARE |
                         PTE_BLOCK_PXN | PTE_BLOCK_UXN
        }, {
                /* RAM */
                .virt = 0x40000000UL,
                .phys = 0x40000000UL,
                .size = 255UL * SZ_1G,
                .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
                         PTE_BLOCK_INNER_SHARE
        }, {
                /* Highmem PCI-E ECAM memory area */
                .virt = 0x4010000000ULL,
                .phys = 0x4010000000ULL,
                .size = 0x10000000,
                .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
                         PTE_BLOCK_NON_SHARE |
                         PTE_BLOCK_PXN | PTE_BLOCK_UXN
        }, {
                /* Highmem PCI-E MMIO memory area */
                .virt = 0x8000000000ULL,
                .phys = 0x8000000000ULL,
                .size = 0x8000000000ULL,
                .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
                         PTE_BLOCK_NON_SHARE |
                         PTE_BLOCK_PXN | PTE_BLOCK_UXN
        }, {
                /* List terminator */
                0,
        }
};

struct mm_region *mem_map = testboard_mem_map;
#endif

int board_init(void)
{
        return 0;
}

int dram_init(void)
{
        if (fdtdec_setup_mem_size_base() != 0)
                return -EINVAL;

        return 0;
}

int dram_init_banksize(void)
{
        fdtdec_setup_memory_banksize();

        return 0;
}

void *board_fdt_blob_setup(void)
{
        /* QEMU loads a generated DTB for us at the start of RAM. */
        return (void *)CONFIG_SYS_SDRAM_BASE;
}

void enable_caches(void)
{
         icache_enable();
         dcache_enable();
}

#ifdef CONFIG_SPL
u32 spl_boot_device(void)
{
        return BOOT_DEVICE_SEMIHOSTING;
}
#endif

創(chuàng)建defconfig配置文件

在configs目錄下為testboard創(chuàng)建配置文件testboard_defconfig,并添加如下內(nèi)容

CONFIG_ARM=y
CONFIG_TARGET_TESTBOARD=y
CONFIG_POSITION_INDEPENDENT=y
CONFIG_NR_DRAM_BANKS=1
CONFIG_ENV_SIZE=0x40000
CONFIG_ENV_SECT_SIZE=0x40000
CONFIG_DEFAULT_DEVICE_TREE="test-board-minimal"
CONFIG_ENV_ADDR=0x4000000

CONFIG_OF_CONTROL=y
CONFIG_OF_SEPARATE=y

CONFIG_DM_SERIAL=y
CONFIG_DM_ETH=y
CONFIG_SYSRESET=y
CONFIG_SEMIHOSTING=y

# add boot stage info to fdt
CONFIG_OF_FDT=y

CONFIG_SPL_SYS_MALLOC_F_LEN=0x1000
CONFIG_SPL_TEXT_BASE=0x40000000
CONFIG_CONS_INDEX=0
CONFIG_SYS_TEXT_BASE=0x40300000
# CONFIG_DISPLAY_CPUINFO is not set

spl支持semihost啟動

  1. 將arch/arm/lib/semihosting.c中smh_load_file導(dǎo)出,即去掉下面定義中的static
static int smh_load_file(const char * const name, ulong load_addr,  ulong *end_addr)
{
        …
}
  1. 將arch/arm/lib/semihosting.c中的do_smhload文件修改為只有uboot編譯,即將其修改為:
#ifndef CONFIG_SPL_BUILD
static int do_smhload(struct cmd_tbl *cmdtp, int flag, int argc,
                      char *const argv[]) {
}
#endif
  1. 在arch/arm/include/asm/spl.h的BOOT DEVICE枚舉中添加對semihosting的支持
enum {
        …
        BOOT_DEVICE_SEMIHOSTING,
        BOOT_DEVICE_NONE
};
  1. 在common/spl/目錄下添加文件spl_semihosting.c,并添加以下內(nèi)容:
#include 
#include 
extern int smh_load_file(const char * const name, ulong load_addr,
                         ulong *end_addr);

static int spl_sh_load_image(struct spl_image_info *spl_image,
                              struct spl_boot_device *bootdev)
{
        int rc;
        ulong uboot_load_addr = 0x40300000, uboot_end_addr;

        rc = smh_load_file("u-boot.bin", uboot_load_addr,
                         &uboot_end_addr);
        if (rc < 0) {
                if (CONFIG_IS_ENABLED(SHOW_ERRORS) &&
                    CONFIG_IS_ENABLED(LIBCOMMON_SUPPORT))
                        printf(SPL_TPL_PROMPT "load file u-boot.bin failed (err=%d)\\n",
                               rc);
                else
                        puts(SPL_TPL_PROMPT "load file u-boot.bin failed\\n");
 
                return -1;
        }
 
        spl_image->load_addr = uboot_load_addr;
        spl_image->entry_point = uboot_load_addr;
        spl_image->os = IH_OS_U_BOOT;

        return 0;
}
SPL_LOAD_IMAGE_METHOD("SEMIHOSTING", 0, BOOT_DEVICE_SEMIHOSTING, spl_sh_load_image);
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • soc
    soc
    +關(guān)注

    關(guān)注

    38

    文章

    4161

    瀏覽量

    218164
  • u-boot
    +關(guān)注

    關(guān)注

    0

    文章

    121

    瀏覽量

    38222
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68522
  • board
    +關(guān)注

    關(guān)注

    0

    文章

    37

    瀏覽量

    19731
收藏 人收藏

    評論

    相關(guān)推薦

    U-boot的基本介紹

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

    U-boot的執(zhí)行流程

    本文主要講述了U-boot的執(zhí)行流程。
    發(fā)表于 07-14 16:58 ?697次閱讀
    <b class='flag-5'>U-boot</b>的執(zhí)行流程

    U-Boot的啟動及移植分析

    bootloader 開發(fā)是嵌入式系統(tǒng)必不可少而且十分重要的部分,U-Boot 為功能強大的bootloader 開發(fā)軟件。本文詳細(xì)分析了U-Boot 的啟動流程,并結(jié)合其源碼,闡述了U-Boot 在S3C2410 目標(biāo)板上的
    發(fā)表于 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
    發(fā)表于 01-25 15:45 ?13次下載

    u-boot的Makefile分析

    u-boot的Makefile分析 U-BOOT是一個LINUX下的工程,在編譯之前必須已經(jīng)安裝對應(yīng)體系結(jié)構(gòu)的交叉編譯環(huán)境,這里只針對ARM,編譯器系列軟件為arm-linux-*。 U-BOOT的下載
    發(fā)表于 05-17 09:16 ?2064次閱讀

    u-boot簡介

    U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目。U-Boot的作用是系統(tǒng)引導(dǎo)。U-Boot從FADSROM、8xxROM、PPCBOOT
    發(fā)表于 10-14 11:17 ?3560次閱讀

    fireflyAIO-3399C主板U-Boot介紹

    RK U-Boot 基于開源的 U-Boot 進(jìn)行開發(fā),工作模式有啟動加載模式和下載模式。
    的頭像 發(fā)表于 12-04 10:31 ?1434次閱讀

    fireflyAIO-3288J主板U-Boot使用簡介

    RK U-Boot 基于開源的 U-Boot 進(jìn)行開發(fā),工作模式有啟動加載模式和下載模式。
    的頭像 發(fā)表于 12-20 10:06 ?1560次閱讀
    fireflyAIO-3288J主板<b class='flag-5'>U-Boot</b>使用簡介

    fireflyAIO-3399J主板U-Boot使用介紹

    RK U-Boot 基于開源的 U-Boot 進(jìn)行開發(fā),工作模式有啟動加載模式和下載模式。
    的頭像 發(fā)表于 12-24 10:00 ?1642次閱讀
    fireflyAIO-3399J主板<b class='flag-5'>U-Boot</b>使用介紹

    U-Boot架構(gòu)淺析

    導(dǎo)讀:嵌入式Linux系統(tǒng)搭建,bootloader是必不可少的一環(huán),而U-Boot已成嵌入式Linux事實標(biāo)準(zhǔn)。所以較為深入的分析U-Boot的設(shè)計,對于更...
    發(fā)表于 02-07 11:56 ?7次下載
    <b class='flag-5'>U-Boot</b>架構(gòu)淺析

    u-boot常用的命令合集

    u-boot常用的命令合集
    發(fā)表于 02-11 09:50 ?2次下載

    u-boot中使用ethernet的方法

    KV260 petalinux BSP在u-boot device tree中disable了GEM3,也就是說ethernet在u-boot中不建議使用ethernet。
    的頭像 發(fā)表于 07-21 10:25 ?3911次閱讀

    創(chuàng)建自定義的u-boot命令

    為什么會有這篇文章,因為小生被u-boot源碼的設(shè)計所吸引了(源碼對命令的處理過程)。自定義u-boot命令屬于u-boot源碼的開發(fā)技術(shù)啦,可能u-boot官方開發(fā)人員、芯片原廠或者
    的頭像 發(fā)表于 08-08 14:46 ?1100次閱讀

    Linux U-Boot開發(fā)指南

    介紹 U-Boot 的編譯打包、基本配置、常用命令的使用、基本調(diào)試方法等, 為 U-BOOT 的移植及應(yīng)用開發(fā)提供了基礎(chǔ)。
    的頭像 發(fā)表于 03-06 10:28 ?1311次閱讀
    Linux <b class='flag-5'>U-Boot</b>開發(fā)指南

    u-boot armv8鏈接腳本

    /u-boot-spl.lds進(jìn)行鏈接,因為每個board的情況可能不同,所以u-boot可以通過Kconfig來自定義u-boot-spl.lds和
    的頭像 發(fā)表于 12-07 11:19 ?662次閱讀
    主站蜘蛛池模板: 同桌别揉我奶了嗯啊| 99热国产这里只有精品6| 俄罗斯美女z0z0z0在线| 九九热在线视频| 天龙八部慕容属性加点| 99久久精品6在线播放| 花蝴蝶在线观看免费中文版高清 | 色多多污污版免费下载安装| 暖暖 免费 高清 日本 在线| 亚洲黄色在线观看| 国产 高清 无码 在线播放| 美女禁处受辱漫画| 亚洲婷婷天堂综合国产剧情| 国产成人啪精品视频免费网| 欧美一第一页草草影院| 最新快播网站| 久久福利影院| 亚洲AV福利天堂一区二区三| 丰满少妇69激懒啪啪无码| 欧美猛男gaygayxxgv| 中文字幕免费在线视频| 护士美女照片| 玄幻全黄h全肉后宫| 国产成人精品自线拍| 日韩亚洲国产中文字幕欧美| a级全黄试频试看30分钟| 国产乱码精品AAAAAAAA| 青娱乐极品视觉盛宴av| 99精彩视频在线观看| 看电影就来5566先锋av| 野花日本手机观看大全免费3 | 暖暖高清视频免费| 中文字幕日本久久2019| 久久re热在线视频精99| 亚洲午夜久久久无码精品网红A片| 国产婷婷一区二区在线观看| 翁公与小莹在客厅激情| 2021全国精品卡一卡二| 久久久国产精品免费A片蜜芽广| 亚洲色在线| 久草免费视频在线观看|