U-Boot:修订间差异

来自资料库(何亚红)
跳转到导航 跳转到搜索
第22行: 第22行:


对于本人而言,除了开发板厂商提供的方式,本人还可使用[[Buildroot]]产生镜像。
对于本人而言,除了开发板厂商提供的方式,本人还可使用[[Buildroot]]产生镜像。
===== 分区 =====
分区采用MBR磁盘分区或者GPT磁盘分区,编辑同pc机一样,有广泛的工具可供使用。
由于磁盘镜像一般都是尽量做小,故烧录后的rootfs可能不是很大,则对于大容量SD卡/TF卡则需要调整rootfs分区。
对于采用ext2/ext3/ext4的rootfs分区而言,可采用以下步骤调整分区:
* 调整分区表:采用各种通用工具调整rootfs的分区表(Linux下可采用fdisk),扩大分区大小。调整完成后最好进行一次重启。
* 调整文件系统:当分区表调整完成后只是分区大小发生改变,文件系统中的信息并未发生改变,故应当使用resize2fs命令将文件系统调整为分区大小。


===== 移植提示 =====
===== 移植提示 =====

2023年8月5日 (六) 09:20的版本

源代码

主要

https://source.denx.de/u-boot/u-boot

备用

https://github.com/u-boot/u-boot.git

说明

通用引导加载器。通常用于加载Linux

启动介质

注意:若未特殊说明,此说明仅适用于截至编辑时的u-boot,不包括旧版u-boot。

SD卡/TF卡

采用MMC接口,常见于各种开发板。

通常会有一个完整的镜像,采用MBR磁盘分区或者GPT磁盘分区,包含一个FAT分区及若干个其他分区,U-boot的启动脚本与Linux内核放在FAT分区。可使用以下方式烧录:

  • dd:在Linux或其他(类)unix中可使用dd命令直接将镜像写入SD卡/TF卡。
  • win32diskimager:在windows下可使用此工具写入镜像文件。

对于本人而言,除了开发板厂商提供的方式,本人还可使用Buildroot产生镜像。

分区

分区采用MBR磁盘分区或者GPT磁盘分区,编辑同pc机一样,有广泛的工具可供使用。

由于磁盘镜像一般都是尽量做小,故烧录后的rootfs可能不是很大,则对于大容量SD卡/TF卡则需要调整rootfs分区。

对于采用ext2/ext3/ext4的rootfs分区而言,可采用以下步骤调整分区:

  • 调整分区表:采用各种通用工具调整rootfs的分区表(Linux下可采用fdisk),扩大分区大小。调整完成后最好进行一次重启。
  • 调整文件系统:当分区表调整完成后只是分区大小发生改变,文件系统中的信息并未发生改变,故应当使用resize2fs命令将文件系统调整为分区大小。
移植提示

如需操作mmc设备,需要在 > Command line interface > Device access commands使能 CONFIG_CMD_MMC以启用mmc命令。

SPI Nor Flash

采用SPI接口。若未说明,本人一般使用容量大于等于16MBytes的Nor Flash。

Nor Flash的烧录方式根据SOC的不同而不同,具体如下:

  • 对于全志SOC而言,可进入FEL模式采用Xfel烧录。

由于Nor Flash容量较小,一般分区使用固定分区,即没有任何分区表与磁盘信息存储在介质上,直接在代码或配置(如设备树dts)中写死分区信息数据。

分区

MTD设备的分区使用环境变量决定,具体如下:

环境变量名称 u-boot中的注释 说明
partition 'partition' - keeps current partition identifier

*

* partition  := <part-id>

* <part-id>  := <dev-id>,part_num

相当于其它分区表的激活分区。

dev-id同mtdids中的dev-id。

mtdids 'mtdids' - linux kernel mtd device id <-> u-boot device id mapping

*

* mtdids=<idmap>[,<idmap>,...]

*

* <idmap>    := <dev-id>=<mtd-id>

* <dev-id>   := 'nand'|'nor'|'onenand'|'spi-nand'<dev-num>

* <dev-num>  := mtd device number, 0...

* <mtd-id>   := unique device tag used by linux kernel to find mtd device (mtd->name)

mtd设备id列表。

dev-id的格式是固定(如第一个nor flash的dev-id为nor0)。

此环境变量相当于将mtd设备与linux中的标签对应,使得mtdparts可以直接传给Linux内核。

mtdparts 'mtdparts' - partition list

*

* mtdparts=[mtdparts=]<mtd-def>[;<mtd-def>...]

*

* <mtd-def>  := <mtd-id>:<part-def>[,<part-def>...]

* <mtd-id>   := unique device tag used by linux kernel to find mtd device (mtd->name)

* <part-def> := <size>[@<offset>][<name>][<ro-flag>]

* <size>     := standard linux memsize OR '-' to denote all remaining space

* <offset>   := partition start offset within the device

* <name>     := '(' NAME ')'

* <ro-flag>  := when set to 'ro' makes partition read-only (not used, passed to kernel)

mtd设备分区表。

u-boot的mtd分区信息可以通过内核命令行传给启用了命令行传MTD分区参数的Linux内核,但更加常见的是使用设备树dts传MTD分区参数给Linux内核。

u-boot中mtd分区的例子如下:

/*
 * Examples:
 *
 * 1 NOR Flash, with 1 single writable partition:
 * mtdids=nor0=edb7312-nor
 * mtdparts=[mtdparts=]edb7312-nor:-
 *
 * 1 NOR Flash with 2 partitions, 1 NAND with one
 * mtdids=nor0=edb7312-nor,nand0=edb7312-nand
 * mtdparts=[mtdparts=]edb7312-nor:256k(ARMboot)ro,-(root);edb7312-nand:-(home)
 *
 */

默认分区信息的Kconfig在启用mtdparts命令时可填写,如下:

Kconfig项 环境变量项
CONFIG_MTDIDS_DEFAULT mtdids
CONFIG_MTDPARTS_DEFAULT mtdparts
全志SOC

默认情况下(u-boot在全志SOC默认设置),采用以下分区:

起始地址 大小(字节) 名称 说明
0 0xF0000(960KBytes) u-boot u-boot二进制代码所在位置
0xF0000 0x10000(64KBytes) u-boot-env u-boot的env数据,可保存一些u-boot使用的环境变量,可保存修改后的启动行为。
0x100000 - - 剩余位置,可继续划分分区。

移植提示

SPI Nor Flash使用条件:

  • SOC支持从SPI Nor Flash启动。
  • u-boot已经移植有对应SOC的spi驱动。

配置SPI Nor Flash的支持如下:

  • 配置Kconfig
    启用属于MTD设备的SPI Nor Flash
        Kconfig路径: > Device Drivers > MTD Support > SPI Flash Support 
        选中CONFIG_SPI_FLASH并CONFIG_BOOTDEV_SPI_FLASH且选中需要支持的Nor Flash。
    
    启用SPI驱动设备(只需要选中对应SOC的驱动)
        Kconfig路径:> Device Drivers > SPI Support
    
  • 配置设备树(同Linux一样)。
    /*以下代码主要用于启用spi0上的flash*/
    &spi0 {
            flash@0 {
                    compatible = "jedec,spi-nor";
                    reg = <0>;
                    spi-max-frequency = <40000000>;
            };
    };
    

若u-boot需要使用spl则需要在spl中启用spi nor flash支持,具体配置如下:

  • 配置Kconfig
    启用属于MTD设备的SPI Nor Flash的SPL支持
        Kconfig路径: > Device Drivers > MTD Support > SPI Flash Support 
        选中CONFIG_SPL_SPI_FLASH_MTD。
    
    在SPL中选中MTD支持
        Kconfig路径: > SPL configuration options
        选中SPL_MTD_SUPPORT。
    

有些spi nor flash的jedec id可能不在u-boot的支持列表中,可能需要手动向drivers/mtd/spi/spi-nor-ids.c中添加需要支持的id。

如需操作mtd设备,需要在 > Command line interface > Device access commands使能CONFIG_CMD_MTD以启用mtd命令。

如需使用mtd分区,需要在> Command line interface > Filesystem commands使能CONFIG_CMD_MTDPARTS 以启用mtdparts命令。

Env

注意:若未特殊说明,此说明仅适用于截至编辑时的u-boot,不包括旧版u-boot。

Env表示环境变量,很多u-boot的操作及脚本都靠环境变量调控。

默认环境变量主要有以下方式生成:

  • Kconfig配置生成。
  • 直接文件生成。

默认情况下使用Kconfig配置生成默认Env,默认环境变量具体定义的头文件/目录/机制如下:

  • include/env_default.h文件:定义默认的环境变量与Kconfig配置的关系。
  • include/configs目录:各个SOC厂商的配置头文件,一般使用CFG_EXTRA_ENV_SETTINGS宏定义在厂商头文件定义厂商自己的环境变量。

直接使用文件生成默认Env的机制如下:

  • 厂商的配置文件:默认目录为board/<vendor>/<board>/,文件名可以由CONFIG_ENV_SOURCE_FILESYS_BOARD指定,后缀名为.env。
  • 外部的配置文件:使用CONFIG_USE_DEFAULT_ENV_FILE使能,使用CONFIG_DEFAULT_ENV_FILE指定位置。

官方资料

网站:https://www.denx.de/project/u-boot/