Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot

一、下载u-boot源码

git clone https://gitee.com/ZHJEE/u-boot.git
cd u-boot
git checkout v2021.01

二、参考配置文件

在u-boot的源码目录下有一个configs目录,里面保存的是每一块适配的开发板的配置文件,通过文件名就能够猜到用哪一个了,不过在board目录下有更为详细的介绍,这里我用的是百问网的157板子,以157为例

找到board/st/stm32mp1/README

需要到源码目录下的doc/board/st/stm32mp1.rst文件里看详情

找到这个文件,讲述的蛮详细的

  1. 添加交叉编译工具链路径到PATH环境变量,在上一篇有讲述过build一个交叉编译工具链,这里用为qemu生成的工具链试试看
PATH=~/x-tools/arm-unknown-linux-gnueabi/bin/:$PATH
  1. 设置交叉编译工具链CROSS_COMPILE,这里的值是arm-unknown-linux-gnueabi-
  2. 设置编译输出目录,这里是stm32mp15_basic
export KBUILD_OUTPUT=stm32mp15_basic

首先拷贝源文件备份

拷贝board配置文件

cp configs/stm32mp15_basic_defconfig configs/myboard_defconfig
cp arch/arm/dts/stm32mp15xx-dkx.dtsi arch/arm/dts/stm32mp15xx-myboard.dtsi
cp arch/arm/dts/stm32mp157c-dk2.dts arch/arm/dts/stm32mp157c-myboard.dts
cp arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi arch/arm/dts/stm32mp157c-myboard-u-boot.dtsi

编辑arch/arm/dts/Makefile
添加如下信息

这样,在编译的时候才会编译出我们的设备树

修改arch/arm/dts/stm32mp157c-myboard.dts如下

开始编译
编译成功之后会在源码目录下生成一个stm32mp15_basic目录,里面保存了我们编译生成的镜像文件,如下图所示

这里的u-boot-spl.stm32是我们的157在iROM加载到SDRAM上的文件,SPL的意思是First Stage Bootloader
u-boot-spl.stm32在SDRAM上运行之后,初始化好DDRAM,然后把u-boot.img也就是完成的u-boot加载到DDRAM中,然后跳转到DDRAM中运行

6. 格式化SD卡
一)
把SD卡通过读卡器接到ubuntu上,然后运行lsblk命令来查看我们的SD卡被挂载到哪里

我这里是被挂载到了sdb这里,然后执行ls /dev 命令输出/dev目录下的文件,可以看到有sdb和sdb1这两个节点

二)
执行下面的命令格式化SD卡
首先需要使用fdisk命令删除sdb的分区,进入这个工具有很多的提示,这里不再赘述

sudo fdisk /dev/sdb
sudo sgdisk --resize-table=128 -a 1 \-n 1:34:545      -c 1:fsbl1 \-n 2:546:1057    -c 2:fsbl2 \-n 3:1058:5153   -c 3:ssbl \-n 4:5154:136225 -c 4:bootfs \-n 5:136226:     -c 5:rootfs \-p /dev/sdb      -g

分区结果如下图所示

最后提示需要重启,这里把内存卡umount并且从虚拟机弹出,然后重新连接就好了,在/dev目录下面就可以看到新的分区了
7. 烧录镜像到SD卡
执行下面的命令进行烧录

烧录镜像

sudo dd if=u-boot-spl.stm32 of=/dev/sdb1 conv=fdatasync
sudo dd if=u-boot-spl.stm32 of=/dev/sdb2 conv=fdatasync
sudo dd if=u-boot.img of=/dev/sdb3 conv=fdatasync

这里的of=具体的设备分区

  1. 启动板子
    把SD卡弹出,板子调整到SD卡启动,并在电脑打开串口

发现串口没有任何的输出…这里有可能是设备树的串口没配置对

参考
添加新板子
串口无输出

查看所示用的设备树文件arch/arm/dts/stm32mp157c-dk2.dts

发现串口0是在uart4这个上面,根据设备树文件引用的dtsi文件,在stm32mp15-pinctrl.dtsi文件中找到了uart4的引脚配置,再查找百问网157底板原理图的引脚配置,发现uart4是用PA12PA11引脚引出的,我们需要修改对应的引脚

修改arch/arm/dts/stm32mp15-pinctrl.dtsi的uart4串口配置为PA12PA11如下图所示

这里注意备份下源文件

修改arch/arm/dts/stm32mp157c-myboard-u-boot.dtsi下的clk_hse节点,整个注释或者改成如下形式

编译命令

make myboard_defconfig
make DEVICE_TREE=stm32mp157c-myboard all -j64

重新编译烧录可以看到串口有输出了

但是还未能正常启动我们的u-boot程序,还需要继续深入

无法正常启动u-boot

修改arch/arm/dts/stm32mp15xx-myboard.dtsi
​ 把i2c4节点整个删除掉
​ 把cpu0和cpu1节点整个删除掉

修改arch/arm/dts/stm32mp157c-myboard-u-boot.dtsi
把pmic整个删除掉

修改arch/arm/dts/stm32mp15xx-myboard.dtsi
把usbotg_hs下的port删除掉
在根节点下添加电源配置

v3v3: regulator-3p3v {compatible = "regulator-fixed";regulator-name = "v3v3";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-always-on;regulator-boot-on;
};v1v8_audio: regulator-v1v8-audio {compatible = "regulator-fixed";regulator-name = "v1v8_audio";regulator-min-microvolt = <1800000>;regulator-max-microvolt = <1800000>;regulator-always-on;regulator-boot-on;
};v3v3_hdmi: regulator-v3v3-hdmi {compatible = "regulator-fixed";regulator-name = "v3v3_hdmi";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-always-on;regulator-boot-on;
};v1v2_hdmi: regulator-v1v2-hdmi {compatible = "regulator-fixed";regulator-name = "v1v2_hdmi";regulator-min-microvolt = <1200000>;regulator-max-microvolt = <1200000>;regulator-always-on;regulator-boot-on;
};vdd: regulator-vdd {compatible = "regulator-fixed";regulator-name = "vdd";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-always-on;regulator-boot-on;
};vdd: regulator-vdd {compatible = "regulator-fixed";regulator-name = "vdd";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-always-on;regulator-boot-on;
};vdd_usb: regulator-vdd-usb {compatible = "regulator-fixed";regulator-name = "vdd_usb";regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-always-on;regulator-boot-on;
};

进入图形化配置界面

make menuconfig

Device Drivers --> Power --> Enable support for STMicroelectronics STPMIC1 PMIC 禁用掉

重新编译烧录

运行结果如下,又报新的错误了

DDR大小不匹配问题

看意思是DDR的大小不匹配
arch/arm/dts/stm32mp157c-myboard-u-boot.dtsi里面包含了stm32mp15-ddr3-1x4Gb-1066-binG.dtsi这个文件和开发板的不匹配,在参考了100ask的uboot补丁之后,发现要修改成arch/arm/dts/stm32mp15-ddr3-dhsom-2x2Gb-1066-binG.dtsi(这里名字发生了改变,之前是stm32mp15-ddr3-2x2Gb-1066-binG.dtsi的)

重新编译烧录…
又报下面的错误了

无法从SD卡启动

这里报错的原因是因为SDMMCSD卡的配置引脚不对导致的,查看100ask的原理图发现与SD卡的CD引脚连接的是PA3
需要修改arch/arm/dts/stm32mp15xx-myboard.dtsi文件下的sdmmc1节点的cd-gpios属性,把引脚修改成我们的PA3就好了

重新编译烧录,启动时按住空格就可以进入到u-boot的界面了

adc报错

这里还报了adc的错误

在make menuconfig界面把相应的adc选项去掉就好了

​ Command line interface —>

​ Device access commands —>

​ adc - Access Analog to Digital Converters info and data 取消掉

​ Device Drivers —>

​ Enable ADC drivers using Driver Model 取消掉

重新编译烧录发现没有adc报错了

设置sdmmc2

原来的arch/arm/dts/stm32mp157c-myboard-u-boot.dtsi只有sdmmc1,我们我们需要做些调整

​在aliases下添加mmc1 = &sdmmc2

​在sdmmc1节点后添加sdmmc2的内容,和sdmmc1的内容一样

修改arch/arm/dts/stm32mp15xx-myboard.dtsi,添加sdmmc2的引脚信息,这里是参考的百问网的补丁文件

&sdmmc2 {pinctrl-names = "default", "opendrain", "sleep";pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>;pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>;non-removable;no-sd;no-sdio;st,dirpol;st,negedge; bus-width = <8>;vmmc-supply = <&v3v3>;/* 补丁文件这里电源配置有修改过,这里修改成我们当前使用的,竟然也可以工作 *///vqmmc-supply = <&vmmc>;status = "okay";
};

这里发现vmmc节点是这样的

还不太懂,暂时留个悬念吧

​重新编译烧录

设置网口的MAC地址

setenv ethaddr 1A:1F:DB:0E:69:FD
​saveenv

最后把配置文件拷贝回去

cp .config configs/myboard_defconfig

这样下次就能直接使用了

Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot相关推荐

  1. Mastering Embedded Linux Programming 学习 (五)在百问网157开发板上,解决网络配置问题

    Mastering Embedded Linux Programming 学习 (五)在百问网157开发板上,解决网络配置问题 思考.参考 搜索发现,需要配置设备树,参考这个链接 修改设备树 找到百问 ...

  2. Mastering Embedded Linux Programming 学习 (三)在百问网157开发板上,编译构建linux内核

    Mastering Embedded Linux Programming 学习 (三)在百问网157开发板上,编译构建linux内核 一.下载内核源码 wget http://ftp.sjtu.edu ...

  3. Mastering Embedded Linux Programming 学习 (一)嵌入式交叉编译工具链的构建,基于crosstool-NG

    Mastering Embedded Linux Programming 学习 (一) 一.ubuntu 软件包下载 sudo apt install autoconf automake bison ...

  4. 基于百问网IMX6ULL_PRO开发板的Uboot移植(Uboot-2017.03)

    文章目录 引言 Uboot下载 Uboot目录分析 目录分析 移植所需要关注的目录 首次编译下载Uboot 编译 下载 方法1 方法2 方法3 现象 移植Uboot 添加自己单板相关文件 添加修改单板 ...

  5. 基于百问网IMX6ULL_PRO开发板移植LCD多点触摸驱动(GT911)

    引言 笔者这里使用的Linux内核是自己移植的4.1.15版本 添加驱动代码 进入drivers/input/touchscreen目录查找是否拥有gt911驱动 cd drivers/input/t ...

  6. 关于百问网_STM32F103_MINI开发板的介绍

    STM32F103_MINI开发板的介绍 学习内容: 建立集成开发环境 调试或者下载 打印显示 1.如何建立集成开发环境: 主要通过步骤是编辑→编译→汇编→链接→调试和下载 2.调试和下载: 主机(电 ...

  7. 【百问网DongshanPI-D1S开发板体验】+ RT-Smart初体验

    前言 根据测评计划,本次在D1S开发板芯片上体验RT-Smart系统,在整个过程中也遇到了很多问题,熬了几个晚上,终于把坑铺平了,本篇文章记录整个过程,本篇文章是完成后才写的,中间可能有部分遗漏,遇到 ...

  8. qt 4.8.4 linux,Tslib和Qt 4.8.4与在开发板上的移植

    这篇博客算是接着Linux 下编译.安装.配置 QT这篇的,搞完PC平台的就来弄一下嵌入式平台的,Linux的东西搞起来麻烦的地方就在于太杂.太散,像QT,各版本之间都有很多差异,因此在网络上查找资料 ...

  9. IMX6ULL裸机学习----LED正点原子在韦东山开发板上实现

    前言 一.IMX6ULL 启动流程? 二.LED代码移植 1.硬件介绍 2.代码移植 总结 前言 最近在学习IMX6ULL这个开发板,手边有韦东山老师的imx6ull全功能板子,为了练习学习的初步效果 ...

最新文章

  1. 怎么把json数据转化为数组_RESTful API 返回统一JSON数据格式是怎么实现的?
  2. Docker 1.10版本发布
  3. Spark RDD解密
  4. android两个耳机能连两部手机吗,AirPods使用技巧:如何让耳机同时连接两台手机...
  5. quartus怎么仿真波形_单相半波可控整流电路电阻负载的Matlab Simulink仿真
  6. 『数据库』你以为删库跑路就能让你老板内(lei)牛(liu)满面--数据库的恢复技术
  7. 从0开始:500行代码实现 LSM 数据库
  8. mysql 函数怎样创建_mysql里怎样创建函数
  9. winform如何实现将数据库数据加载到树上
  10. win10计算机管理字体糊,完美解决win10系统字体模糊
  11. RTI_DDS自定义插件开发 4 接收方
  12. 【CSRF-01】跨站请求伪造漏洞基础原理及攻防
  13. Matter over Wi-Fi: Raspberry Pi 4开发环境设置
  14. php datedif,Excel Datedif函数全面解析及BUG分析
  15. 微习惯养成,互联网产品成败的关键因素
  16. 块存储、文件存储、对象存储三者的区别
  17. Jpeg文件格式转换成bmp文件格式
  18. android多屏幕多分辨率的一些概念
  19. 李峋同款爱心代码 python版
  20. nginx 检测脚本

热门文章

  1. 【云原生】Kubernetes 有状态应用程序控制器 Operator
  2. 会话层--协议寓意的理解和会话的建立与维护
  3. 【ArcSDE | 学习】ArcGIS中连接Oracle数据库
  4. QT飞机大战六(敌机血条的添加以及特殊子弹道具)
  5. 多线程-静态代理-Lambda表达式
  6. 案例分享 | 纽扣电池石墨片厚度及缺陷检测
  7. 数学分析教程史济怀练习10.6
  8. 起航新起点 共赴新征程——华夏食无忧与中民农业集团顺利签约战略合作
  9. android游戏教程:播放游戏声音
  10. 了解Linux实时内核