你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】三、编译出厂内核设备树并且以nfs形式挂载根文件系统

[复制链接]
STMCU小助手 发布时间:2022-9-21 14:46
介绍
0 Q' L% i5 Z; R/ D' ~  _硬件:正点原子MP157开发板' G- E, t7 I% m

1 R7 i7 e4 v& n0 s1 p3 V" p烧录了出厂系统以后按照正点原子的文档测试一下基本的硬件功能是否正常以后就需要自己动手开发一些小东西,比如说添加其他硬件驱动、更换非正点原子的配件或者测试自己的QT小程序等等操作,而这些就需要修改到我们的代码部分了,常改的包括kernel内核 dts配置 或者QT根文件系统等等。因为正点原子出厂的系统相应的驱动支持还比较全面,所以本章节来编译正点原子提供的出厂uboot kernel代码,原子的出厂源码中给了linux5.4.31 uboot tfa三个部分的源码,但是tfa基本不会有修改,所以这个镜像直接使用出厂提供的镜像就好。然后烧录到开发板观察运行是否正常,同时用nfs来挂载根文件系统,为后续开发开一个头。# Z  S8 q$ a# `& t: @) P
9 [0 y+ M& K; B$ Q
编译uboot' I% n4 V* @4 _4 y, E: J- |
原子提供的uboot出厂源码路径为:STM32资料\【正点原子】STM32MP157开发板(A盘)-基础资料\01、程序源码\01、正点原子Linux出厂系统源码。将u-boot-stm32mp-2020.01-g00f14581-v1.4.tar.bz2 拷贝到Ubuntu虚拟机,然后解压文件:0 s( a$ g$ e4 a# U8 ]
tar -vxf u-boot-stm32mp-2020.01-gdb8d2374-v1.0.tar.bz2
4 d: T8 e5 D$ a3 V& P f227f3e7ad1d4b2c934539ad4100c989.png
0 C3 ~/ U- G# d/ H( ^. ?! B! r! O6 ^' q; D
解压后源码目录下有一个build.sh,直接执行即可编译,build.sh其实主要就是配置编译uboot,详细内容如下:- s; ~# R: B1 ^4 r) d9 f% d5 M
3 j! Y+ b( D% Z. r. Y1 r
5be8455eafe24ccf81004e129c799ebb.png
4 p) Z1 G( T6 b9 N9 t* o& r- v/ A, ?
. G- ?/ a1 A, Auboot编译成功以后在uboot代码目录下得到u-boot.stm32,可以使用这个文件替换出厂镜像刷机包里面的uboot镜像,测试能否正常启动。' m$ b# G" a0 X3 z3 P/ ~& u
% Z" t: N6 A  r0 h1 [
编译kernel dtb; y! X1 \. J" ^, ~% p/ U- K+ m3 C
原子提供的内核出厂源码路径为:STM32资料\【正点原子】STM32MP157开发板(A盘)-基础资料\01、程序源码\01、正点原子Linux出厂系统源码。将linux-5.4.31-g732ac575a-v1.6.tar.bz2 拷贝到Ubuntu虚拟机,然后解压文件:
5 Y6 R1 H0 f( ~: etar -vxjf linux-5.4.31-gb8d3ec3ac-v1.1.tar.bz2
9 f7 o  ]2 x1 w" G/ Z  D" ?4 k/ v$ D7 N8 }$ c( W& o6 |% G% @
e8e05dd4eddb43aa9dac352cae2601cd.png
8 p9 Z! N/ \' p! M' V" {
$ L' F1 u% |* x+ x) X7 [$ f2 |源码路径下也有一个build.sh,直接执行编译以后会报错导致编译中断,看build.sh使用的是Yocto SDK里的GCC 9.3.0交叉编译器,怀疑是交叉编译器版本不匹配,不清楚原子他们是怎么编过的,修改build.sh使用arm的交叉编译工具链,然后make后面都添加ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- ,测试能够正常编译并且在kernel根路径下生成tmp文件夹包含我们所需的镜像,下面是修改后的build.sh
- n/ s7 l" c( |8 `  }1 L 98fe4c30582e435080408fad610a1e63.png
( U+ N  h+ x) ?3 i$ f- R
/ g* ?; z  A) U% N8 v2 f生成的文件在tmp文件夹下:
  [7 w* T& D: T; B* ~# R
. _# l  Q" F; V0 \3 D. E5 e e05b1b59bcb7418db2d63eb20d83a710.png
7 m6 t6 I* f& C4 \4 ]
$ X" Z$ D; T; w8 bNFS挂载根文件系统) U2 B( n& k$ R3 u4 S' F
在正点原子的出厂镜像里面放置的有QT5.12.9的根文件系统,路径是:E:\STM32资料\【正点原子】STM32MP157开发板(A盘)-基础资料\08、系统镜像\02、出厂系统镜像\06、Qt5.12.9文件系统 ,把atk-image-qt5.12.9-rootfs.tar.bz2这个文件系统拷贝到Ubuntu的nfs挂载路径下,然后接压:
/ u5 O0 D- Y" ^- c5 y$ ttar -vxjf qt5.12.9-rootfs.tar.bz2
5 f, v0 E  [( i6 V! j( c$ E7 ^) P3 t6 ?. F0 Q+ Z7 w! m: R8 }- s
解压以后需要将上面内核编译出来的模块放到根文件系统的lib/modules路径下,这样开机的时候才会自动加载kenrel module。
/ ~2 ~1 M3 a9 o$ tcp modules.tar.bz2 ~/work/nfs/rootfs/lib/modules3 D3 F4 h" W% ~$ Z! x2 c" n1 c! y
tar -vxjf modules.tar.bz2: v6 @& Q. y5 Y7 L2 |+ y7 t
如下图:
2 N: a; ~2 x( r' c+ M: f: Y% O+ ~8 q0 N9 l1 W
cc76746d683f46569520ebaf65ca56be.png / m" G. ], T8 Z) c6 ?9 i8 \
! ?% r8 g( b1 Y* H: h# Y
这样uboot 内核 根文件系统都有了,下面先将我们的uboot烧进开发板,将我们编译的u-boot.stm32替换掉出厂镜像里面的u-boot.stm32,重新使用STM32CubeProgrammer来烧录固件。使用我的uboot能够成功启动内核,且串口输出的时间也为我编译的时间,2021.11.2晚上21.53。1 R( y3 G1 ^/ m! ~
6 _' g8 ~  |& ^, Z, s
c460fe8bc53d484fbfc858d81222d250.png
! z/ F2 y  a  e: b8 {& ?( ~. q4 N2 j% _9 E  e: n# a$ g6 h
下面就需要配置uboot的相关参数 为tftp 下载内核 dtb然后nfs挂载根文件系统。
0 s0 D5 ^  ~& ~9 Z主要配置如下:4 F( f1 W6 T: ]6 p5 G- ?/ N7 X
4 Y) b: `8 C) k* Z
  1. setenv ipaddr 192.168.31.112
    9 ]6 J# t+ q6 G: s2 F$ n
  2. setenv ethaddr 00:04:9f:04:d2:35; U0 |/ `& n( E0 o  U, P' |
  3. setenv gatewayip 192.168.31.1
    # u5 A$ q- q9 j% K5 y! U$ Q- [" e1 M
  4. setenv netmask 255.255.255.08 {- O! G+ x" ^; V: W) a! V
  5. setenv serverip 192.168.31.1712 z! X2 M. @! f- {* D7 o8 L
  6. setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.31.171:/home/tangtao/work/nfs/rootfs,proto=tcp rw ip=192.168.31.112:192.168.31.171:192.168.31.1:255.255.255.0::eth0:off'' G, i6 t$ ?/ |' E5 Q6 _0 r
  7. setenv bootcmd  'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
    . v) i: u: S& T* u$ v) {) {1 l& g
  8. saveenv
复制代码

7 M  {: E3 i- L7 |' c注意上述配置中的ip和路径都需要更改为自己的路径,不能直接复用的路径,不然肯定会启动失败。. G0 ~# q* |; R
如果想重新从emmc启动的话只需要修改bootargs 和bootcmd 的配置即可:& ]3 W. F2 E: m3 h2 \# U1 Y
- j9 D; u! \6 z3 T. q
  1. setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw'
    ! O) e1 U, l" h1 _  x
  2. setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
    0 R" Y$ L0 E. u" t6 t& _
  3. saveenv
复制代码

: \2 O. c+ Y& `) s$ ]0 y' V9 R: T3 @遗留问题:
4 E. C4 m; o! S2 S9 {* ~9 J( Y1 y1.为什么直接使用原子提供的根文件系统?
* O+ |7 e8 y/ g& d# M8 t/ e" c方便,有现成的就先用,等开发结束了以后可以使用buildroot来制作我们的根文件系统,而且原子的这个文件系统比较大,太占内存,很多模块我们开发产品过程中根本用不到,先用这个验证,最后再说。
0 U" ^) B4 s6 Z8 E2.我的uImage和dtb文件现在是用tftp下载来调试的,怎么刷到emmc中从开发板启动验证呢?
# C6 H& I7 L( f可以将uImage和dtb打包成ext4文件,原子出厂镜像中的atk-image-bootfs.ext4这个其实就是uImage和dtb打包制作完成的,大致步骤如下:
% N& c$ U! ^% {1 s& r& B
! z9 d+ @9 U1 p) j将stm32mp157d-atk.dtb和uimage放入bootfs文件夹并进入文件夹执行如下指令: J; f. F5 z$ P$ u) H7 M
  1. dd if=/dev/zero of=my-bootfs.ext4 bs=1M count=10& N* U: Z9 Q- s8 Y9 d
  2. mkfs.ext4 -L bootfs bootfs.ext4
    2 U0 N& c$ }! B4 i
  3. 9 D, l! b$ a+ o, x0 i. C3 R
  4. sudo mount my-bootfs.ext4 /mnt/bootfs/2 k3 n+ P8 T; ?2 J
  5. sudo cp uImage  stm32mp157d-atk.dtb /mnt/bootfs/: v8 H8 ~, M7 I5 J4 t$ q) U
  6. sudo umount /mnt/bootfs/
复制代码
7 Q" C, \4 _0 D' P0 J
即可得到my-bootfs.ext4,根文件系统同理,打包生成即可。
: y" z0 \  h6 a& e- T8 h  n% O8 |————————————————
" W& X! D3 q" B4 O9 Z% m6 M/ o版权声明:TNT_TT6 i; G/ Q$ B; n  \. `' v
/ O4 V! Z4 D1 H
* {' |4 F9 d* c0 r/ a
赞 收藏 评论0 发布时间:2022-9-21 14:46

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版