电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
i.MX6ULL嵌入式Linux开发1-uboot移植初探
分 享
扫描二维码分享
i.MX6ULL嵌入式Linux开发1-uboot移植初探
i.MX6ULL
uboot
嵌入式Linux
码农爱学习
关注
发布时间: 2021-07-14
丨
阅读: 1577
本系列教程以**i.MX6ULL**处理器的ARM开发板为实验基础,学习记录嵌入式Linux开发的各种知识与经验,主要内容包括嵌入式Linux移植,嵌入式Linux驱动开发,嵌入式Linux应用开发等。 本系列教程将以野火的i.MX6ULL eMMC开发板为硬件基础,以[野火EBF6ULL Pro开发板教程](https://doc.embedfire.com/linux/imx6/linux_base/zh/latest/index.html)和[正点原子i.MX6ULL阿尔法开发板教程](http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html)为参考,进行学习实践。 # 1 嵌入式Linux移植概述 Linux 的移植主要包括3部分: - 移植**bootloader 代码**, Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader程序。 这段bootloader程序会先初始化DDR等外设, 然后将Linux内核从flash(NAND,NOR FLASH,SD,MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。 bootloader 有很多,常用的就是 U-Boot。 bootloader 和 Linux 内核的关系就跟 PC 上的 BIOS 和 Windows 的关系一样,bootloader 就相当于 BIOS。 - 移植**Linux 内核**,Linux内核由一系列程序组成,包括负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理地址空间的内存管理程序、网络、进程间通信的系统服务程序等。内核负责管理系统的硬件设备。 - 移植**根文件系统(rootfs)**,Linux 中的根文件系统更像是一个文件夹或者叫做目录,在这个目录里面会有很多的子目录。根目录下和子目录中会有很多的文件,这些文件是 Linux 运行所必须的,比如库、常用的软件和命令、设备文件、配置文件等等。根文件系统里面包含了一些最常用的命令和文件。 **U-Boot、Linux kernel 和 rootfs**这三者一起构成了一个完整的 Linux 系统,一个可以正常使用、功能完善的 Linux 系统。 # 2 实验开发板简介 本测试使用的开发板为野火的i.MX6ULL eMMC开发板。 ![](https://cf04.ickimg.com/bbsimages/202107/e2041c048870cf680e0c4929dee164a1.png) # 3 U-Boot简介 uboot 的全称是**Universal Boot Loader**,遵循 GPL 协议的开源软件。 uboot 是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。uboot 官网为 https://www.denx.de/wiki/U-Boot/ ![](https://cf04.ickimg.com/bbsimages/202107/530f5447e5b33e042ee8a118592a321a.png) 可以在uboot官网下载uboot源码,点击左侧 Topics 中的“`Source Code`”,然后点击的“`FTP Server`” ,进入其 FTP 服务器即可看到 uboot 源码。 但我们移植uboot时一般不会直接用 uboot 官方的源码的,官方的源码是给半导体厂商准备的,半导 体厂商会根据自家的芯片,维护自己芯片对应的uboot。 NXP(freescale)维护的的uboot地址:
![](https://cf04.ickimg.com/bbsimages/202107/98bb04a9ada830ba65b39f2d6d97b150.png) # 4 NXP uboot测试 uboot移植并不需要从零开始将 uboot 移植到我们现在所使用的开发板上。因为半导体厂商通常都会自己做一个开发板(**原厂开发板**), 将uboot移植到他们自己的原厂开发板上,再将这个uboot(原厂BSP 包)发布出去。 市面上的开发板,通常会参考原厂的开发板做硬件,然后在原厂提供的 BSP 包上做修改,如正点原子和野火的 I.MX6ULL 开发板参考的就是[NXP官方的 I.MX6ULL EVK 开发板](https://www.nxp.com.cn/design/development-boards/i-mx-evaluation-and-development-boards/evaluation-kit-for-the-i-mx-6ull-and-6ulz-applications-processor:MCIMX6ULL-EVK)做的硬件: ![](https://cf04.ickimg.com/bbsimages/202107/9ac73b10505794048c5fcab003d70a41.png) ## 4.1 编译环境搭建 ### 4.1.1 交叉编译器下载 嵌入式Linux开发,程序编译通常在电脑端的Linux(如虚拟机中的Ubuntu)下进行编译,Ubuntu 自带gcc 编译器,但该编译器是针对 X86 架构的!而嵌入式Linux是ARM架构的, 所以需要一个在 X86 架构上可以编译 ARM 架构代码的 gcc编译器,即**交叉编译器**。 交叉编译器有很多,本实验使用 Linaro 出品的交叉编译器,下载地址:
![](https://cf04.ickimg.com/bbsimages/202107/e60aae76168bb53d132a0ebae1814b81.png) ### 4.1.2 交叉编译器安装 在Ubuntu中创建目录:/usr/local/arm,并将下载的`gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz`复制到此文件中,然后**解压**,解压命令如下: ```sh sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz ``` 解压完成以后会生成一个名为“gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf”的文件夹,这个文件夹里面就是我们的交叉编译工具链。 然后,需要将该目录**添加到环境变量**中。打开/etc/profile 以后,在最后面输入如下所示内容: ```sh export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin ``` ![](https://cf04.ickimg.com/bbsimages/202107/539fa53b8dd889df005090141e1400fa.png) 使用交叉编译器之前还需要**安装其它的库**,命令如下: ```sh sudo apt-get install lsb-core lib32stdc++6 ``` 安装完之后,可以**查看交叉编译工具的版本号**,输入如下命令: ```sh arm-linux-gnueabihf-gcc -v ``` 可以看到类似如下打印 ![](https://cf04.ickimg.com/bbsimages/202107/ed2dcdbacc4af441eeabe4e84a310ebf.png) 以看出当前交叉编译器的版本号为 4.9.4,说明交叉编译工具链安装成功。 ## 4.2 编译原厂uboot 编译前还要在Ubuntu 中**安装ncurses 库**,安装命令如下: ```sh sudo apt-get install libncurses5-dev ``` 在Ubuntu中创建存放uboot的目录,如我的目录是:`/home/xxpcb/myTest/imx6ull/uboot/nxp_uboot` 然后,将**NXP(freescale)的uboot源码**复制进来,这里使用的是**正点原子**提供的NXP官方原版Uboot源码包( uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2) 然后进行解压: ```sh tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 ``` 解压后的源码文件如下: ![](https://cf04.ickimg.com/bbsimages/202107/f121a923c92e8c5cd24efb8077bf73b6.png) 首先看下**uboot的配置**,configs 目录下有很多跟 I.MX6UL/6ULL 有关的配置,找到与mx6ull相同的,如下图。 因为我这个开发板是emmc版本的,所有就使用这个`mx6ull_14x14_evk_emmc_defconfig`。 ![](https://cf04.ickimg.com/bbsimages/202107/fda0c7fb199170a85f15b796010ced8b.png) 编译uboot使用下面3条指令: ```sh make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 ``` 这3条命令中 : - `ARCH=arm` 设置目标为 arm 架构 - `CROSS_COMPILE` 指定所使用的交叉编译器。 - 第1条命令相当于`make distclean`,目的是清除工程,一般在第一次编译的时候最好清理一下工程。 - 第2条指令相当于`make mx6ull_14x14_evk_emmc_defconfig` ,用于配置 uboot,配置文件为 mx6ull_14x14_evk_emmc_defconfig。 - 第3条指令相当于`make -j8`,也就是使用8核来编译uboot。 为了方便的执行着3条指令,可以**将这些指令写成shell脚本**,比如在uboot源码目录下新建一个build.sh文件,写入如下内容: ```shll #!/bin/bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 ``` 然后进行编译: ```sh ./build.sh ``` ![](https://cf04.ickimg.com/bbsimages/202107/f99056f0d8c65c9cd9d30d91623a0dbc.png) 编译完成以后uboot 源码多了一些文件,其中`u-boot.bin`就是编译出来的 uboot二进制文件。 uboot是个裸机程序, 因此需要在其前面 加上头部(IVT、 DCD等数据)才能在I.MX6U上执行,`u-boot.imx `文件就是添加头部以后的 u-boot.bin。 u-boot.imx 就是我们最终要烧写到开发板中的 uboot 镜像文件。 ![](https://cf04.ickimg.com/bbsimages/202107/b98b808927136d6c108b98ed2c1acf9a.png) ## 4.3 烧录开发板 这是的烧录开发板,实际是要**烧录到SD卡中**,然后将SD卡插入开发板,让开发板从SD卡启动(需要在开发板上设置拨码开关来选择启动方式)。 ### 4.3.1 烧录到SD卡 **正点原子**专门编写了一个小软件用来将编译出来的.bin 文件烧写到 SD 卡中,这个软件叫做“`imxdownload`” 将imxdownload 复制到 Ubuntu 中的uboot源码文件夹,再使用如下指令,给予 imxdownload 可执行权限: ```shell chmod 777 imxdownload ``` 然后**电脑USB中插入SD卡(读卡器)**,并在虚拟机中设置usb加载(VMware或VirtualBox虚拟机需要先安装**增强功能**才能使用) ![](https://cf04.ickimg.com/bbsimages/202107/9ea58fb4c47574f2d32187124dc2442b.png) 然后可以使用如下指令来查看SD卡的挂载标识符: ```sh ls /dev/sd* ``` 查看输出结果: ![](https://cf04.ickimg.com/bbsimages/202107/8c37a5d4ef546f2aed1b3651075c6572.png) 这里的`/dev/sdb`就是我的SD卡。 > 注:我第一次使用SD卡烧录时,只多出了/dev/sdb,但不知什么情况,用了几次后,再插入SD卡,就会同时多出来/dev/sdb和/dev/sdb1,但实际测试,仍然把程序烧录到/dev/sdb也能用)。 imxdownload向SD卡烧写led.bin文件,命令格式如下: ```sh ./imxdownload u-boot.bin /dev/sdb ``` > 注意不能烧写到`/dev/sda`或`sda1`设备里面!那是系统磁盘。 烧写过程会输入如下信息: ![](https://cf04.ickimg.com/bbsimages/202107/98c2b3dbf4bf6aa0b573d08e67662c67.png) 烧写的最后一行会显示烧写大小、用时和速度,比如`u-boot.bin`烧写到SD卡中的大小是 423KB,用时 1.7s,烧写速度是 236KB/s。 > 注意这个烧写速度,如果这个烧写速度在几百KB/s 以下那么就是正常烧写。 如果这个烧写速度大于几十MB/s、甚至几百MB/s那么肯定是烧写失败了! 重新插拔/格式化SD卡或重启ubuntu再试。 烧写完成以后会在当前工程目录下生成一个`load.imx`的文件,这个文件就是软件 imxdownload 根据 NXP 官方启动方式介绍的内容, 在 bin 文件前面添加了一些数据头以后生成的。最终烧写到 SD卡里面的就是这个imx文件。 ### 4.3.2 启动开发板 烧录完之后,将**SD卡插入开发板启动**,使用**串口连接电脑**,查看uboot启动信息。 设置好串口参数(波特率115200)并打开,按键**复位开发板**。 当串口打印上出现“`Hit any key to stop autoboot `”倒计时的时候**按下键盘上的回车键**,默认是 3 秒倒计时,在 3 秒倒计时结束以后如果没有按下回车键的话 uboot 就会使用默认参数来启动 Linux 内核了。 如果在 3 秒倒计时结束之前按下回车键,那么就会进入 uboot 的命令行模式: ![](https://cf04.ickimg.com/bbsimages/202107/2cbe569b1bd41355474db4920bbf4c88.png) 解读一下这些信息的含义: - 第1行是 uboot **版本号和编译时间**:当前的 uboot 版本号是 2016.03,编译时间是 2021/7 /11/15:22:25 - 第3、4 行是 **CPU 信息**:当前使用的 CPU 是飞思卡尔(属于NXP)的 I.MX6ULL (频率为 792MHz),此时运行在 396MHz。这颗芯片是工业级的,结温为-40°C~105°C - 第 5 行是**复位原因**:I.MX6ULL 芯片上有个 POR_B 引脚,将这个引脚拉低即可复位 I.MX6ULL。 - 第 6 行是**板子名字**,“MX6ULL 14x14 EVK”即NXP原厂开发板的名字 。 - 第 7 行提示 **I2C 准备就绪**。 - 第 8 行提示当前板子的**DRAM(内存) ** 为 512MB - 第 9 行提示当前有**两个MMC/SD 卡控制器**:FSL_SDHC(0)和 FSL_SDHC(1)。I.MX6ULL支持两个 MMC/SD,正点原子的 I.MX6ULL EMMC 核心板上 FSL_SDHC(0)接的 SD(TF)卡,FSL_SDHC(1)接的 EMMC。 - 第10行是一条警告信息,先忽略。 - 第 12、13 行是 **LCD 型号**,原厂默认的是TFT43AB (480x272)。 - 第 14~16 是**标准输入、标准输出和标准错误**所使用的终端,这里都使用串口(serial)作为终端。 - 第 17 、18行是**切换到emmc的第0个分区上**,因为当前的 uboot 是 emmc 版本的,也就是从 emmc 启动的。我们只是为了方便将其烧写到了 SD 卡上,但是它的“内心”还是 EMMC的。所以 uboot 启动以后会将 emmc 作为默认存储器 。 - 第 19行是**网口信息**,提示我们当前使用的 FEC1 这个网口,I.MX6ULL 支持两个网口。 - 第 20行提示 **FEC1 网卡地址没有设置**(后面我们会讲解如何在uboot 里面设置网卡地址)。 - 第 22行提示**正常启动**, 也就是说 uboot要从emmc里面读取环境变量和参数信息启动 Linux内核了。 - 第23行是**倒计时提示**,默认倒计时 3 秒,倒计时结束之前按下回车键就会进入 Linux 命令行模式。如果在倒计时结束以后没有按下回车键,那么 Linux 内核就会启动,Linux 内核一旦启动,uboot 就运行结束了。 - 第23行是在倒计时 3 秒内按了回车键,符号`=>`表示可以继续与uboot进行**命令交互**。 看过了串口的uboot信息,再来看一下板子是实际运行情况: ![](https://cf04.ickimg.com/bbsimages/202107/1691a446a26b696b4dc447562f98e0eb.png) 由于原厂的uboot驱动的屏幕是TFT43AB (480x272),与我这里屏幕不一样,所以**屏幕没有正常显示**(现在的屏幕看起来有许多彩色的小点点),接下来,就是对uboot进行屏幕驱动的修改。 在本篇结束之前,再来研究一下uboot的串口指令。 ## 4.4 uboot命令初探 上面说道,在uboot启动的3 秒倒计时内,串口界面如果按下了回车键,uboot就会输出符号`=>`,则**可以继续与uboot进行命令交互**。那可以输入哪些命令呢? ### 4.4.1 help命令查看所有指令 输入`help`或者`?` ,然后按下回车即可查看当前 uboot 所支持的命令: ```sh => help ? - alias for 'help' base - print or set address offset bdinfo - print Board Info structure bmode - sd1|sd2|qspi1|normal|usb|sata|ecspi1:0|ecspi1:1|ecspi1:2|ecspi1:3|esdhc1|esdhc2|esdhc3|esdhc4 [noreset] bmp - manipulate BMP image data boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootelf - Boot from an ELF image in memory bootm - boot application image from memory bootp - boot image via network using BOOTP/TFTP protocol bootvx - Boot vxWorks from an ELF image bootz - boot Linux zImage image from memory clocks - display clocks clrlogo - fill the boot logo area with black cmp - memory compare coninfo - print console devices and information cp - memory copy crc32 - checksum calculation dcache - enable or disable data cache dhcp - boot image via network using DHCP/TFTP protocol dm - Driver model low level access echo - echo args to console editenv - edit environment variable env - environment handling commands erase - erase FLASH memory exit - exit script ext2load- load binary file from a Ext2 filesystem ext2ls - list files in a directory (default /) ext4load- load binary file from a Ext4 filesystem ext4ls - list files in a directory (default /) ext4size- determine a file's size ext4write- create a file in the root directory false - do nothing, unsuccessfully fatinfo - print information about filesystem fatload - load binary file from a dos filesystem fatls - list files in a directory (default /) fatsize - determine a file's size fdt - flattened device tree utility commands flinfo - print FLASH memory information fstype - Look up a filesystem type fuse - Fuse sub-system go - start application at address 'addr' gpio - query and control gpio pins help - print command description/usage i2c - I2C sub-system icache - enable or disable instruction cache iminfo - print header information for application image imxtract- extract a part of a multi-image itest - return true/false on integer compare load - load binary file from a filesystem loadb - load binary file over serial line (kermit mode) loads - load S-Record file over serial line loadx - load binary file over serial line (xmodem mode) loady - load binary file over serial line (ymodem mode) loop - infinite loop on address range ls - list files in a directory (default /) md - memory display mdio - MDIO utility commands mii - MII utility commands mm - memory modify (auto-incrementing address) mmc - MMC sub system mmcinfo - display MMC info mtest - simple RAM read/write test mw - memory write (fill) nfs - boot image via network using NFS protocol nm - memory modify (constant address) ping - send ICMP ECHO_REQUEST to network host pmic - PMIC printenv- print environment variables protect - enable or disable FLASH write protection reset - Perform RESET of the CPU run - run commands in an environment variable save - save file to a filesystem saveenv - save environment variables to persistent storage setenv - set environment variables setexpr - set environment variable as the result of eval expression sf - SPI flash sub-system showvar - print local hushshell variables size - determine a file's size sleep - delay execution for some time source - run script from memory test - minimal test like /bin/sh tftpboot- boot image via network using TFTP protocol true - do nothing, successfully usb - USB sub-system usbboot - boot from USB device version - print monitor, compiler and linker version => ``` ### 4.4.2 查看指令的使用说明 命令的具体使用方法,可以输入`help 命令名`或`? 命令名`查看,以“bootz”这个命令为例: ```sh => help bootz bootz - boot Linux zImage image from memory Usage: bootz [addr [initrd[:size]] [fdt]] - boot Linux zImage stored in memory The argument 'initrd' is optional and specifies the address of the initrd in memory. The optional argument ':size' allows specifying the size of RAW initrd. When booting a Linux kernel which requires a flat device-tree a third argument is required which is the address of the device-tree blob. To boot that kernel without an initrd image, use a '-' for the second argument. If you do not pass a third a bd_info struct will be passed instead => ``` ### 4.4.3 信息查询命令 常用的和信息查询有关的命令有 3 个:`bdinfo`、`printenv `和 `version`。 - bdinfo 板子信息 ```sh => bdinfo arch_number = 0x00000000 boot_params = 0x80000100 DRAM bank = 0x00000000 -> start = 0x80000000 -> size = 0x20000000 eth0name = FEC1 ethaddr = (not set) current eth = FEC1 ip_addr =
baudrate = 115200 bps TLB addr = 0x9FFF0000 relocaddr = 0x9FF47000 reloc off = 0x18747000 irq_sp = 0x9EF44EA0 sp start = 0x9EF44E90 FB base = 0x00000000 => ``` 从打印信息可以得出 DRAM 的**起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指针)起始地址**等信息. - printenv 打印环境变量 ```sh => printenv baudrate=115200 board_name=EVK board_rev=14X14 boot_fdt=try bootcmd=run findfdt;mmc dev ${mmcdev};mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; thn run mmcboot; else run netboot; fi; fi; else run netboot; fi bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr}; bootdelay=3 bootscript=echo Running bootscript from mmc ...; source console=ttymxc0 ethact=FEC1 ethprime=FEC fdt_addr=0x83000000 fdt_file=undefined fdt_high=0xffffffff 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 tst $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; image=zImage initrd_addr=0x83800000 initrd_high=0xffffffff ip_dyn=yes loadaddr=0x80800000 loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script}; loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file} loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image} mfgtool_args=setenv bootargs console=${console},${baudrate} rdinit=/linuxrc g_mass_storage.stall=0 g_mass_storage.removable=1 g_mass_storage.file=fat g_mass_storage.ro=1 g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF g_mass_storage.iSerialNumber="" clk_ignore_unused mmcargs=setenv bootargs console=${console},${baudrate} root=${mmcroot} mmcautodetect=yes mmcboot=echo Booting from mmc ...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then bootz ${loadaddr} -${fdt_addr}; else if test ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi; mmcdev=0 mmcpart=1 mmcroot=/dev/mmcblk0p2 rootwait rw netargs=setenv bootargs console=${console},${baudrate} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp netboot=echo Booting from net ...; run netargs; if test ${ip_dyn} = yes; then setenv get_cmd dhcp; else setenv get_cmd tftp; fi; ${get_cmd} ${imag}; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if ${get_cmd} ${fdt_addr} ${fdt_file}; then bootz ${loadaddr} - ${fdt_addr}; else if est ${boot_fdt} = try; then bootz; else echo WARN: Cannot load the DT; fi; fi; else bootz; fi; panel=TFT43AB script=boot.scr Environment size: 2431/8188 bytes => ``` 这里有很多的环境变量, 比如**baudrate、 board_name、 board_rec、 boot_fdt、 bootcmd**等。比如 bootdelay 这个环境变量就表示 uboot 启动延时时间,默认 bootdelay=3,也就默认延时 3秒。前面说的 3 秒倒计时就是由 bootdelay 定义的。另外uboot 中的环境变量都是字符串。 - version 版本信息 ```sh => version U-Boot 2016.03 (Jul 11 2021 - 15:22:25 +0800) arm-linux-gnueabihf-gcc (Linaro GCC 4.9-2017.01) 4.9.4 GNU ld (Linaro_Binutils-2017.01) 2.24.0.20141017 Linaro 2014_11-3-git => ``` 当前uboot 版本号为 2016.03,编译日期2021/7/11,编译器为arm-linux-gnueabihf-gcc。 本篇uboot移植初探(原厂uboot烧录测试)就到这里,**下一篇进行实际的uboot移植,使得uboot与所用的开发板匹配**。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
1
)
码农爱学习
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交