找回密码
 注册
关于网站域名变更的通知
查看: 183|回复: 1
打印 上一主题 下一主题

极度详细之Linux官方最新版本5.4移植教程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-6-29 11:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
我们在学习Linux内核开发的时候,拿到的Linux内核源码都是开发板厂家移植修改过的。我们按照厂家的使用手册,编译并生成最终的镜像文件,然后烧写到开发板,就可以直接运行。
有很多用户会好奇开发板厂家提供的Linux内核都做了哪些修改,如果换做是我自己移植Linux内核,需要怎样的移植步骤呢?
目前市面上还没有针对i.MX6ULL开发板Linux移植教程,虽然网络上有很多Linux内核移植的文档,但并不是针对某一个特定的硬件平台,讲解的也都是概括性的内容,对于这些枯燥的理论知识,使得对Linux内核移植原本就困惑的用户更加不知所措了。迅为工程师针对这一情况,编写了这个教程供大家使用。
为了使用户能够更加清晰的掌握Linux的内核移植流程,从原厂或原生代码开始,然后一步步针对板子本身的外设进行代码的修改和适配的完整过程,最终实现适配到i.MX6ULL开发板上。我们特意下载了目前官方最新的Linux内核(5.4.3版本),并基于该内核配合i.MX6ULL终结者开发板,通过具体的实践,手把手,一步步详细的讲解下Linux内核移植的具体步骤。
通过本教程的学习,我们可以彻底揭开Linux内核移植的神秘面纱,充分掌握Linux内核的具体移植步骤,并且可以把本章节学到的Linux内核移植流程应用到以后我们工作的项目中。
平台:迅为i.MX6ULL开发板

* O. \; D" e& v5 g
获取Linux内核源码
NXP官方提供了I.MX6ULL的Linux内核源码,我们可以使用git来获取Linux 5.4.3的内核源码(为了大家学习方便我们给大家提供了下载好的内核源码,后续会保存在光盘资料的“i.MX6UL终结者光盘资料\05_uboot linux源码”目录下“i.MX6ULL_Kernel_5.4.3.tar.bz2”)。
       下面我们通过git下载5.4.3内核源码。输入以下命令获取源码:

  A( l# o( z. ^. q9 _. D) P3 c, P. Z% B" \
下载完成会在当前目录下生成“linux-imx”文件,如下图所示:

0 m8 a- A' x% h+ E- Y1 u7 l! b+ b' I! ~" `4 L
6 C+ H4 H7 U; T7 V- u" a
" G4 w( S! w6 I! b( G
% N9 Z  }# m! @9 r  e
然后我们使用“cd linux-imx”命令进入到下载的内核目录下,我们可以打开当前目录下的“Makefile“文件,查看下现在的内核版本,运行结果如下图所示:
; B6 k" l& t8 V1 l" Q: Z8 R# _
3 K) {- R" L2 q8 Y( H* f2 L

9 p' i3 g0 V' B- s+ _
从上图我们可以看到下载的内核版本并不是5.4.3,那么我们是不是下载错了呢?答案是:我们没有下载错的。因为我们下载的NXP提供的这套Linux源码,里面包含了所有版本的分支,我们需要使用命令检索出对应的版本。下面我们开始讲解如何检索出我们想要的版本。首先我们可以使用git命令查看都有哪些分支,我们可以输入“git branch -a”查看所有的分支。
     我们需要检索出“5.4.3”版本的内核源码,我们可以输入命令“git checkout origin/imx_5.4.3_2.0.0”(其中的origin/imx_5.4.3_2.0.0是我们要检索出的分支,大家如果想要检索出其它分支,只需要把这个名字改成对应的分支名字就可以),运行结果如下图所示:

! w, a. `/ E- [. S* k5 Q. ?
, c( O1 H) l; ^$ {) p1 d8 f

2 G- a; d- r$ V" H  R% Z. D
- e8 k- x  O; t& z% @9 v* D
从上图我们可以看到已经检索出了“5.4.3”的分支,我们再次打开内核源码目录下的“Makefile”文件,如下图所示:

2 w. @) f$ b) a" @4 Y# @6 L% L) ]9 k5 |% S+ S

( q: _) d, X9 N7 L4 H$ u* C+ H- j# r$ `7 ?# d! j: x+ K! T
从上图我们可以看到当前的内核版本是“5.4.3”了。
搭建编译环境

& D& w. E/ `4 b* Q
Linux 5.4.3的编译环境和默认4.1.15用的交叉编译器一样,也是“gcc-linaro-4.9.4-2017.01-x86_64_ARM-linux-gnueabihf.tar.xz”,关于交叉编译器的搭建,可以参考“i.mx6ull终结者开发板使用手册”的4.3章节“搭建交叉编译环境”和29.1章节 安装第三方库。
1 j* n9 t' R* T" T( L5 Z- ?: b
编译内核
为了编译方便,我们可以创建一个脚本,我们在命令行输入“vi create.sh”,并输入以下内容:
4 A, o4 I0 F0 r) W" W2 }$ K: }$ j

9 Z- P2 [, A# ?4 r4 [& c
给脚本一个执行权限,然后我们运行“./create.sh”脚本,开始编译Linux内核,如下图所示:

. w9 |, B" g' \8 Y& j* U' G2 D3 S: ~* f% V, \# f

! f0 k: h5 I' ?5 w0 B
编译完成,会在“arch/arm/boot”目录下生成“zImage”镜像文件,如下图所示:
7 p: _# J: H. q1 y: X
6 T: F7 ?' ~; y' a, T
编译生成了镜像文件以后,接下来我们需要编译设备树文件。首先我们进到“arch/arm/boot/dts”目录,这里面保存着imx6ull的默认设备树配置文件。然后我们输入“ls imx6ull*”命令,查看与i.MX6ULL处理器相关的设备树文件,运行结果如下图所示

/ @4 z3 b4 L1 `+ ]" M; \: J/ U/ A" @, u
+ Z9 b# a8 L. _$ I* [# A  A
在上图中列出的所有与i.MX6ULL处理器相关的设备树文件,我们只需要关注其中的四个,分别是:
“imx6ull.dtsi”,
“imx6ul-14x14-evk.dtsi”,
“imx6ull-14x14-evk.dts”,
“imx6ull-14x14-evk-emmc.dts”
“imx6ull-14x14-evk-gpmi-weim.dts”。
其中的“imx6ull.dtsi”文件是i.MX6ULL处理器的核心配置文件,里面定义了i.MX6ULL处理器所有的内部资源。
文件“imx6ul-14x14-evk.dtsi”里面定义了一些与外设相关的驱动。
文件“imx6ull-14x14-evk.dts”会包含“imx6ull.dtsi”和“imx6ul-14x14-evk.dtsi”这两个文件。
文件“imx6ull-14x14-evk-emmc.dts”会包含“imx6ull-14x14-evk.dts”,该文件是针对EMMC存储的。
文件“imx6ull-14x14-evk-gpmi-weim.dts”会包含“imx6ull-14x14-evk.dts”,该文件是针对NAND FLASH存储的。
通过上面的分析,实际我们最终需要编译的就两个文件“imx6ull-14x14-evk-emmc.dts”(EMMC存储)和“imx6ull-14x14-evk-gpmi-weim.dts”(NAND FLASH存储)。
使用过迅为电子提供的4.1.15内核的朋友可能会注意到我们的烧写工具在烧写镜象的时候设备树文件会有好几个(针对不同屏幕的)。如果这些文件缺少任意一个,烧写工具打开就会失败。同时这几个文件的名字在uboot里面也会用到(uboot里面这几个文件的名字也是固定的),所以为了能够继续使用4.1.15的烧写工具,我们需要在5.4.3内核里面创建对应的这几个设备树名字:

- l) [: \  _3 e6 p) }5 X" Z, F; }$ w1 I+ q8 e9 E5 v3 q$ Y

& N* B5 b- i% d1 V/ ^# Z7 `
5 ^) U" t; \% Q$ x* q
在上面的这些设备树文件中,以“topeet_emmc”开头的是支持商业级核心板 (EMMC存储)的,以“topeet_nand”开头的是支持工业级核心板(NAND FLASH存储)的。
       我先们创建商业级核心板(EMMC存储)的这几个设备述文件,上面我们讲到了默认设备树文件里面的“imx6ull-14x14-evk-emmc.dts”是针对EMMC存储的配置文件,我们以该文件为模板,创建商业级核心板(EMMC存储)对应的几个设备树文件,使用下面的命令:
7 b6 y0 B- y/ g, j" x

5 e! V( @/ [" M! X" M( j/ Z1 W& C) G. b

# y  P! L9 [/ z8 n7 s0 I+ D1 j# D6 p! Y4 o: r
然后我们继续创建工业级核心板(NAND FLASH存储)相关的几个设备树文件,上面我们讲到了默认设备树文件里面的“imx6ull-14x14-evk-gpmi-weim.dts”是针对NAND FLASH存储的配置文件,我们以该文件为模板,创建工业级核心板(NAND FLASH存储)对应的几个设备树文件,使用下面的命令:

' L3 M) L+ D6 D1 f5 X
: l4 C7 x. c: z4 y

+ s$ t6 {7 T% y. ?: m- ~
7 j8 s" K4 p; b  [: b, \; r
3 `" ~" S. D" k! K
至此,关于设备树的文件我们都创建完成了,由于NAND FLASH和EMMC的 核心板,Uboot在获取设备数文件的时候不一样(EMMC是按照分区的方式访问,NAND FLASH是按照偏移地址读取数据),所以在NAND FLASH的核心板,我们需要把对应的几个设备树文件拼接成一个文件(按照固定的偏移大小拼接),我们在4.1.15的内核里面提供了这个拼接程序,卫浴内核源码的“arch/arm/boot/dts”目录下,文件名字是“create_dtb”,如下图所示:
, u2 o  y5 d# P+ Z8 r2 w! j

6 @% x* r" Q& B8 g9 n3 n1 v6 d) F: f6 ]
     我们拷贝该文件到5.4.3内核的“arch/arm/boot/dts”目录下面,如下图所示:
, r/ a  q- u) e/ x

; Z$ e3 C* f, c7 x. `  p  ]
% Y3 F) U7 ~8 Q( g6 U; ?$ q* X/ `
  I* f# T* g  d' H- D8 \& S

. @/ N, k; o' P4 d
然后我们使用“chmod 777 create_dtb”命令,给文件“create_dtb”可执行权限,运行结果如下图所示:

4 k; `% P( r% U$ [- O1 u
5 A. N8 h8 Y! Z, c! |; k

, h5 ~5 c' j5 H7 q
然后我们回到5.4.3内核源码的根目录下,如下图所示:
- P; j. Q! ~: _  @& n
5 U- ~6 K; T/ ]& K- H( J
) K6 r4 Y+ a* f0 x

% C, |. h; p( Z2 O. S3 l3 n$ a' ~1 A4 u
然后我们修改内核编译脚本(在里面添加设备树文件的编译),我们添加下面的脚本到“create.sh”脚本里面:
1 z- w1 y  @  {3 L
5 y0 r! w+ y* r$ r' p1 E7 M  f

" `: V* ?- J. u) v, o1 u2 E' `/ d0 V; @% G4 j( j
上面的脚本主要是使用make命令编译出对应的设备树文件(比如我们要编译“topeet_emmc_4_3.dts”这个设备树文件,那我们直接输入“make topeet_emmc_4_3.dtb”命令即可,其它设备树文件的编译与此类似,这里不再一一描述)。编译出所有的设备树文件(EMMC存储和NAND FLASH存储)以后,我们使用“./create_dtb imx6ul_topeet_nand.dtb topeet_nand_4_3.dtb topeet_nand_7_0.dtb topeet_nand_10_1.dtb topeet_nand_1024x600.dtb topeet_nand_5_0.dtb topeet_nand_9_7.dtb topeet_nand_hdmi.dtb”命令把NAND FLASH的设备树文件拼接成一个文件,即“topeet_nand_hdmi.dtb”文件(也就是上面添加的脚本的最后一条)。添加完以后的脚本如下图所示:
* `: v3 |; a- ^* R
) R/ y% J1 b" [# k2 I

  A, X8 I7 j8 i  E" T/ P' X# T2 ?( N

) G8 V4 d0 E' S! s& q0 a
4 J! E8 N. }( M$ g& p9 Z
添加完成设备树的编译脚本以后,我们直接运行内核编译脚本“./create.sh”开始编译内核和设备树,如下图所示:

& h3 m0 k; g6 G* P: D
& R# g! j7 J/ {1 c# g) k+ @4 m

; Y. N( G/ b% u& m8 n" O# R/ W; S" W# L6 p8 {
编译过程如下图所示:

/ |. q% g& R1 y2 U( L- E5 w- g
* q. x/ a5 J6 @8 D3 u4 J1 m

( v+ C* ~# i% N+ c. v
$ i) M9 E* P8 I# }; ^' [7 }7 r6 ?. q7 B  W+ Z7 H
我们可以看到在“arch/arm/boot”目录下生成了“zImage”内核镜像,在“arch/arm/boot/dts”目录下生成了设备树文件:如下图所示:
8 b: I8 t- n7 z+ g6 {8 B" a$ i

& N; \) p- f6 k4 m- n! ?0 n4 ^" d( j5 x; w8 s9 w2 S  G

# B  _, O1 Z1 b4 Y: q, `
接下来我们开始烧写编译生成的镜像到i.MX6ULL终结者开发板。Uboot我们依然使用开发板光盘资料里面的“i.MX6UL终结者光盘资料\08_开发板系统镜像\01_Uboot”目录下的对应镜像,文件系统我们使用“i.MX6UL终结者光盘资料\08_开发板系统镜像\03_文件系统镜像\03_Yocto文件系统”目录下的对应文件系统镜像。内核和设备树我们根据自己使用的核心板类型(工业级或商业级),选择5.4.3内核编译生成的对应镜像和设备树文件(关于i.MX6ULL终结者开发板镜像的烧写,大家可以参考开发板使用手册的:第六章I.MX6ULL镜像烧写)。这里我们不在详细介绍。
使用MFG烧写完成以后,如果我们有4.3寸屏,可以连接好4.3寸屏幕(内核默认的设备树配置支持4.3寸屏显示),然后开发板正常启动,我们可以看到串口的打印的内核启动信息,如下图所示:
/ v. N: H/ |  t# L1 Z4 @) K
9 H0 _1 }( _: p$ }( Y  Q
从上图我们可以看到内核的版本是5.4.3。文件系统起来以后,我们也可以在调试串口输入“uname -a”命令,查看系统版本的信息,运行结果如下图所示:

4 \7 j% L; _) u7 t  v
, @# Q% d' L3 ~; g
从上图我们同样也可以看到内核的版本是5.4.3。同时我们可以看到4.3寸屏幕也会有QT综合例程在运行,由于默认的内核没有配置触摸驱动,我们可以使用鼠标来操作。在后续的章节我们将会逐步完善开发板上的外设驱动。
至此基于官方5.4.3的内核经过我们的修改,编译,已经可以在迅为电子的iMX6ULL终结者开发板上运行起来了。
' d) ?2 E$ A5 H* p% S6 d: V

该用户从未签到

2#
发表于 2020-6-29 14:16 | 只看该作者
太详细了,就是图一个都加载不出来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 18:59 , Processed in 0.203125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表