guowenxue
2024-09-26 7c35a51bbd38a171ee63c79d3d70966181859021
commit | author | age
f1cee2 1
G 2
3 # 1. 编译系统介绍
4
5
6
7 嵌入式Linux系统BSP(Board Support Package)的整个编译过程非常繁琐且漫长,而我们在BSP开发过程中却经常需要编译这些源码,如果每次都是逐条命令输入执行,这个过程非常麻烦且容易出错。为此,凌云实验室郭工为 IMX 系列开发板编写了一套编译脚本,这样方便各个开发板的一键编译。当前该编译系统支持的开发板有:
8
9 * 凌云实验室 IGKBoard-IMX6ULL 开发板
10 * 凌云实验室 IGKBoard-IMX8MP 开发板
11 * 凌云实验室 GauGuin-imx8mp 开发板
12 * 正点原子 IMX6ULL 开发板
13
14
15
16 ## 1.1 编译系统下载
17
18
19
20 凌云实验室 IMX 系列开发板一键编译脚本托管在 [凌云实验室的 git 服务器上](http://main.iot-yun.club:8088/summary/build-imxboard.git), 我们可以从该站点上下载最新的编译系统。这里以 IGKBoard-IMX6ULL 开发板为例,使用 git 命令下载该项目源码并重命名为 igkboard-imx6ull(也可以命名为其它开发板的名字)。
21
22 ```bash
23 guowenxue@9d57f9229b66:~$ git clone http://iotcraft.cn:8088/r/build-imxboard.git ~/igkboard-imx6ull
24
25 guowenxue@9d57f9229b66:~$ cd ~/igkboard-imx6ull/
26
2b179f 27 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ ls bsp
f1cee2 28 bootloader  config.json  debian  drivers  images  kernel  tools  yocto
G 29 ```
30
31
32
2b179f 33 下面是BSP编译系统各文件的简单介绍。
f1cee2 34
G 35 | 文件/文件夹     | 描述                                       |
36 | --------------- | ------------------------------------------ |
37 | **config.json** | 编译系统的JSON格式配置文件                 |
38 | **tools**       | 编译系统所依赖系统命令和交叉编译器安装脚本 |
39 | **bootloader**  | Bootloader的编译脚本及补丁文件             |
40 | **kernel**      | Linux内核的编译脚本及补丁文件              |
41 | **drivers**     | 驱动学习示例源码及测试程序                 |
42 | **images**      | Linux系统烧录镜像一键制作脚本              |
43 | **debian**      | Debian根文件系统一键制作的脚本             |
44 | **yocto**       | Yocto系统源码编译脚本                      |
45
46
47
48 ## 1.2 编译系统配置
49
50
51
52 下面是顶层编译系统的配置文件,默认为 ***IGKBoard-IMX6ULL*** 开发板的配置。
53
54 ```json
2b179f 55 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ cat config.json
f1cee2 56 {
G 57     "bsp":
58     {
59         "board":"igkboard-imx6ull",
60         "version":"lf-6.1.36-2.1.0",
61         "giturl":"https://github.com/nxp-imx/",
62         "cortexAtool":"/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-",
63         "cortexMtool":"/opt/gcc-cortexM-10.3-2021.07/bin/arm-none-eabi-"
64     },
65     "system":
66     {
67         "distro":"yocto",
68         "version":"mickledore",
69         "imgsize":"3072",
70         "bootsize":"100"
71     }
72 }
73 ```
74
75
76
77 下面是该配置文件中各选项的配置说明:
78
79
80
81 * ***bsp.board***   该选项指定要编译的目标开发板,具体支持哪些可以查看 `kernel/patches/` 文件夹下有哪些开发板文件夹.
82
83 ```bash
2b179f 84 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ ls kernel/patches/
f1cee2 85 alientek-imx6ull-v20  alientek-imx6ull-v24  gauguin-imx8mp  gen_patch.sh  igkboard-imx6ull  igkboard-imx8mp
G 86 ```
87
88 > 如上面支持的开发板 ***igkboard-imx6ull、 igkboard-imx8mp、alientek-imx6ull-v20*** 等
89
90
91
92
93
94 * ***bsp.version***   该选项指定要编译的Linux BSP版本,具体支持哪些可以查看 `kernel/patches/` 相应开发板下支持哪些补丁.
95
96 ```bash
2b179f 97 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ ls kernel/patches/igkboard-imx6ull/
f1cee2 98 linux-imx-lf-6.1.36-2.1.0.patch
G 99 ```
100
101 > 如上面支持的 BSP 版本为 ***lf-6.1.36-2.1.0***
102
103
104
105 * ***bsp.giturl***   该选项指定Linux BSP源码的下载地址,默认从NXP 官方的 github 仓库下载;
106
107 * ***bsp.cortexAtool***  该选项用来指定 Cortex-A核 + Linux系统的交叉编译器;
108 * ***bsp.cortexMtool***  该选项用来指定 Cortex-M核 + FreeRTOS系统的交叉编译器;
109
110
111
112 * ***system.distro***   该选项指定要发型的Linux系统类型,当前支持 ***Yocto*** 和 ***Debian*** 系统;
113 * ***system.version***   该选项指定要发型的Linux系统类型相应版本;
114 * ***system.imgsize***   该选项指定要生成的Linux系统镜像的大小,通常需要根据根文件系统的大小来调整;
115 * ***system.bootsize***   该选项指定要生成的Linux系统镜像Boot分区(FAT文件系统)的大小;
116
117
118
119 # 2. Linux系统编译
120
121
122
123 一个完整的 Linux 系统镜像制作,需要经过以下几个步骤:
124
125 1.  Bootloader 源码编译;
126 2.  Linux内核 源码编译;
127 3.  根文件系统制作;
128 4.  Linux系统烧录镜像制作;
129
130
131
132 接下来,我们以 ***IGKBoard-IMX6ULL*** 为例,使用该编译系统从源码来编译制作一个可以烧录到 eMMC 或 TF 卡启动的系统镜像。
133
134
135
136 ## 2.1 编译系统配置
137
138
139
140 在开始编译之前,我们首先确定当前编译系统支持哪些BSP版本,这点可以通过查看相应开发板的补丁文件来获取。如下所示,当前 IGKBoard-IMX6ULL 只支持 lf-6.1.36-2.1.0 这个版本。
141
142 ```bash
2b179f 143 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ ls kernel/patches/igkboard-imx6ull/
f1cee2 144 linux-imx-lf-6.1.36-2.1.0.patch
G 145 ```
146
147
148
149 接下来我们需要修改顶层的配置文件 ***config.json*** 如下:
150
151 ```json
152 {
153     "bsp":
154     {
155         "board":"igkboard-imx6ull",
156         "version":"lf-6.1.36-2.1.0",
157         "giturl":"https://github.com/nxp-imx/",
158         "cortexAtool":"/opt/gcc-aarch32-10.3-2021.07/bin/arm-none-linux-gnueabihf-",
159     },
160     "system":
161     {
162         "distro":"yocto",
163         "version":"mickledore",
164         "imgsize":"3072",
165         "bootsize":"100"
166     }
167 }
168 ```
169
170
171
172 * 修改目标开发板 **board** 为 ***igkboard-imx6ull*** ;
173 * 修改交叉编译器 **cortexAtool** 为后面安装的交叉编译器;
174 * 如果想编译其它版本BSP,可以修改 **version** 为支持的目标 BSP 版本;
175 * 如果想编译 Yocto 系统,可以修改 **distro** 为 ***yocto***,其 **version** 也要改成当前支持的 ***kirkstone***、***mickledore***;
176 * 如果想编译 Debian 系统,可以修改 **distro** 为 ***debian***,其 **version** 也要改成当前支持的 ***bullseye***、***bookworm***;
177
178
179
180 在下面的所有源码编译过程中,需要从github的NXP官方站点上下载大量的源码,但由于众所周知的原因,国内经常不能正常访问 github 。如果您的Linux编译服务器不能正常访问 github,请先设置好代理服务然后再开始执行后续的 ***build.sh*** 脚本开始编译,否则编译时会下载源码失败。***如果是凌云实验室的学员,可以将  giturl 设置为实验室的文件服务器地址,这样避免从 github 下载源码。***
181
182 ```json
183      "bsp":
184      {
185 -        "giturl":"https://github.com/nxp-imx/",
186 +        "giturl":"http://studio.xxx.club:2211",
187      },
188 ```
189
190
191
192 > ***WARNNING: 上面的 `"http://studio.xxx.club:2211"` 请改成实验室文件服务器的正确域名。***
193
194
195
196 下面是我配置的代理命令 **proxy** 用来代理访问 github,设置好后可以使用 **curl** 命令访问 google.com 来测试代理是否生效。
197
198 ```bash
2b179f 199 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ proxy
f1cee2 200
2b179f 201 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ curl google.com
f1cee2 202 <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
G 203 <TITLE>301 Moved</TITLE></HEAD><BODY>
204 <H1>301 Moved</H1>
205 The document has moved
206 <A HREF="http://www.google.com/">here</A>.
207 </BODY></HTML>
208 ```
209
210
211
212 另外,也可以使用 **unproxy** 命令来取消命令行代理。
213
214 ```bash
2b179f 215 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ unproxy
f1cee2 216 ```
G 217
218
219
220 如果是基于 i.MX8 处理器的开发板,则可以参考修改交叉编译器如下。
221
222 ```json
223 {
224     "bsp":
225     {
226         "board":"igkboard-imx8mp",
227         "version":"lf-6.1.36-2.1.0",
228         "giturl":"https://github.com/nxp-imx/",
229         "cortexAtool":"/opt/gcc-aarch64-10.3-2021.07/bin/aarch64-none-linux-gnu-",
230         "cortexMtool":"/opt/gcc-cortexM-10.3-2021.07/bin/arm-none-eabi-"
231     },
232     "system":
233     {
234         "distro":"yocto",
235         "version":"mickledore",
236         "imgsize":"3072",
237         "bootsize":"100"
238     }
239 }
240 ```
241
242
243
244
245
246 ## 2.2 编译系统安装
247
248
249
250 在嵌入式BSP系统开发过程中,依赖很多的Linux系统命令及交叉编译器。在该编译系统的 ***tools*** 文件夹下,有一个 ***setup_tools.sh*** 脚本可以用来一键安装它们。
251
252 ```bash
2b179f 253 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ ls tools/
f1cee2 254 imgmnt  setup_tools.sh
G 255 ```
256
257
258
259 接下来以 root 权限执行 ***tools/setup_tools.sh*** 脚本,来安装BSP源码编译所依赖的系统工具和交叉编译器,如果之前已经安装过则会自动跳过。
260
261 ```bash
2b179f 262 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ cd tools/
f1cee2 263
2b179f 264 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/tools$ sudo ./setup_tools.sh
G 265  All system tools already installed, skip it
266  All development tools already installed, skip it
267  start download cross compiler from ARM Developer for Cortex-A core
f1cee2 268  ... ...
G 269  start decompress cross compiler for Cortex-A core
270  ... ...
2b179f 271   cross compiler for Cortex-A installed to "/opt/gcc-aarch32-10.3-2021.07" successfully
f1cee2 272 ```
G 273
274
275
276 至此,整个编译系统的配置和开发环境搭建已经完成。
277
278
279
280 ## 2.3 Bootloader编译
281
282
283
284 在做好前面的配置后,编译 bootloader 的工作就非常简单了,我们只需要切换到 ***bootloader*** 文件夹下,执行 `build.sh` 脚本即可。它将会自动从配置的源码服务器上下载源码,并打上相应的补丁文件,开始漫长的编译工作。
285
286 ``` bash
2b179f 287 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ cd bootloader/
f1cee2 288
2b179f 289 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/bootloader$ ls
f1cee2 290 build.sh  patches
G 291
2b179f 292 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/bootloader$ ./build.sh
G 293  start build bootloader for igkboard-imx6ull
294  start fetch uboot-imx source code
f1cee2 295  ... ...
2b179f 296  do patch for uboot-imx now...
f1cee2 297  ... ...
2b179f 298  start build uboot-imx
f1cee2 299  ... ...
G 300   MKIMAGE u-boot-dtb.imx
301   OFCHK   .config
2b179f 302 + cp u-boot-igkboard-imx6ull.imx /home/guowenxue/igkboard-imx6ull/bsp/bootloader/install
f1cee2 303 + set +x
G 304
2b179f 305  bootloader installed to '/home/guowenxue/igkboard-imx6ull/bsp/bootloader/install'
G 306 u-boot-igkboard-imx6ull.imx
f1cee2 307 ```
G 308
309
310
311 编译完成后,生成的 bootloader 文件将会存放到自动创建的 ***install*** 文件夹下。
312
313 ```bash
2b179f 314 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/bootloader$ ls install/
f1cee2 315 u-boot-igkboard-imx6ull.imx
G 316 ```
317
318
319
320 如果对 bootloader 源码有新的修改,我们可以使用 `./patches/gen_patch.sh` 脚本生成新的 patch 补丁文件。如果想保存该补丁文件,则可以替换 ***patches*** 文件夹下的相应文件。
321
322 ```bash
2b179f 323 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/bootloader$ ./patches/gen_patch.sh uboot-imx/
G 324  generate patch file
325
326 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/bootloader$ ls
f1cee2 327 build.sh  install  patches  tarballs  uboot-imx  uboot-imx-lf-6.1.36-2.1.0.patch
G 328
2b179f 329 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/bootloader$ mv uboot-imx-lf-6.1.36-2.1.0.patch patches/igkboard-imx6ull/
f1cee2 330 ```
G 331
332
333
334 另外使用  `build.sh -c` 命令可以一键清除所有编译产生的文件和源码。
335
336 ```bash
2b179f 337 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/bootloader$ ./build.sh -c
G 338  start clean bootloader
339
340 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/bootloader$ ls
f1cee2 341 build.sh  patches
G 342 ```
343
344
345
346 ## 2.4 Linux内核编译
347
348
349
350 同样地,编译 Linux内核源码的工作也非常简单,我们只需要切换到 ***kernel*** 文件夹下,执行 `build.sh` 脚本即可。它将会自动从配置的源码服务器上下载源码,并打上相应的补丁文件,开始漫长的编译工作。
351
352 ```bash
2b179f 353 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ cd kernel/
f1cee2 354
2b179f 355 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/kernel$ ls
f1cee2 356 build.sh  patches
G 357
2b179f 358 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/kernel$ ./build.sh
G 359  start build linux kernel for igkboard-imx6ull
360  start fetch linux kernel source code
f1cee2 361 ... ...
2b179f 362  do patch for linux-imx now...
f1cee2 363  ... ...
2b179f 364  start build linux-imx
f1cee2 365  ... ...
2b179f 366  linux kernel installed to '/home/guowenxue/igkboard-imx6ull/bsp/kernel/install'
f1cee2 367 igkboard-imx6ull.dtb  lib  overlays  zImage
G 368 ```
369
370
371
372 同样地,编译完成后生成的 linux内核文件将会存放到自动创建的 ***install*** 文件夹下。
373
374 ```bash
2b179f 375 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/kernel$ ls install/
f1cee2 376 igkboard-imx6ull.dtb  lib  overlays  zImage
G 377 ```
378
379
380
381 如果对 Linux内核源码有新的修改,我们可以使用 `./patches/gen_patch.sh` 脚本生成新的 patch 补丁文件。如果想保存该补丁文件,则可以替换 ***patches*** 文件夹下的相应文件。
382
383 ```bash
2b179f 384 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/kernel$ ./patches/gen_patch.sh linux-imx/
G 385  generate patch file
386
387 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/kernel$ ls
f1cee2 388 build.sh  install  linux-imx  linux-imx-lf-6.1.36-2.1.0.patch  patches  tarballs
G 389
2b179f 390 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/kernel$ mv linux-imx-lf-6.1.36-2.1.0.patch patches/igkboard-imx6ull/
f1cee2 391 ```
G 392
393
394
395 另外使用  `build.sh -c` 命令可以一键清除所有编译产生的文件和源码。
396
397 ```
2b179f 398 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/kernel$ ./build.sh -c
G 399  start clean linux kernel
400
401 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/kernel$ ls
f1cee2 402 build.sh  patches
G 403 ```
404
405
406
407 ## 2.5 系统镜像制作
408
409
410
411 系统镜像的制作依赖 Bootloader、Linux内核 和 根文件系统系统,前面的过程我们已经从源码编译了 Bootloader 和 Linux内核镜像文件,而根文件系统则需要从凌云实验室的文件服务器上下载。实验室的学员只需要在前面的配置中,将 **githurl** 配置成实验室的文件服务器即可。
412
413
414
415 因为 Linux 系统镜像需要使用 **sudo** 和 **loop** 设备,所以这个需要在自己的虚拟机或实验室的编译服务器具有相应权限的账号下工作。
416
417 ```bash
2b179f 418 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ cd images/
f1cee2 419
2b179f 420 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/images$ ls
f1cee2 421 build.sh
G 422
2b179f 423 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/images$ sudo ./build.sh
G 424  Build system image yocto-mickledore-lf-6.1.36-2.1.0.img
425  INFO: download rootfs-yocto-mickledore.tar.zst form http://studio.xxx.com:2211
f1cee2 426  ... ...
2b179f 427  start generate empty system image
f1cee2 428  ... ...
2b179f 429  start partition system image
G 430  losetup system image on loop4
f1cee2 431  ... ...
2b179f 432  start format system image
f1cee2 433  ... ...
2b179f 434  start install u-boot image
f1cee2 435  ... ...
2b179f 436  start install linux kernel images
G 437  update drivers in root filesystem
438  start install root filesystem
439  Build system image yocto-mickledore-lf-6.1.36-2.1.0.img done
440  Start bzip2 compress yocto-mickledore-lf-6.1.36-2.1.0.img
f1cee2 441  ... ...
G 442  Shell script exit now, do some clean work
2b179f 443
G 444  kpartx -dv /dev/loop4
f1cee2 445 del devmap : loop4p1
G 446 del devmap : loop4p2
2b179f 447  losetup -d /dev/loop4
f1cee2 448 ```
G 449
450
451
452 编译完成后,系统镜像和烧录所需要的文件将会存放到自动创建的 ***install*** 文件夹下。
453
454 ```bash
2b179f 455 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/images$ ls install/
f1cee2 456 u-boot-igkboard-imx6ull.imx  yocto-mickledore-lf-6.1.36-2.1.0.img.bz2
G 457 ```
458
459
460
461 接下来将上面两个文件下载到自己的 Windows 系统下,参考前面的文档就可以烧录启动了。
462
463
464
465 # 3. Yocto 系统源码编译
466
467
468
469 Yocto 系统的编译比较复杂,对软件的要求比较高。其至少要求:
470
471 * 至少8核+以上处理器和16GB+内存;
472 * 至少250GB以上硬盘空间,推荐SSD固态硬盘;
473 * 要求编译服务器能够翻墙正常访问 github ;
474
475
476
477 如果您的编译服务器满足上述软硬件要求,则可以尝试 Yocto 的源码编译。在该编译系统中,这个过程也非常简单,只需要执行 ***yocto*** 文件夹下的 `build.sh` 脚本即可。一次完整的编译在凌云实验室编译服务器上大概需要7~8个小时,该服务器的配置为:
478
479 * CPU: 48核Xeon(R) CPU E5-2678 v3 @ 2.50GHz 处理器
480 * 内存:128GB
481 * 硬盘: 1TB SDD
482
483
484
485 下面是 Yocto 源码编译的过程。
486
487 ```bash
2b179f 488 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp$ cd yocto/
f1cee2 489
2b179f 490 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/yocto$ ls
f1cee2 491 build.sh  meta-igkboard
G 492
2b179f 493 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/yocto$ ./build.sh
G 494  start build Yocto mickledore for igkboard-imx6ull
495  start download fetch Yocto mickledore source code
f1cee2 496  ... ...
G 497   Build directory is  igkboard-imx6ull
2b179f 498 /home/guowenxue/igkboard-imx6ull/bsp/yocto/mickledore-lf-6.1.36-2.1.0
f1cee2 499     Welcome LingYun IoT Gateway Kit Board Yocto BSP
G 500
501     The Yocto Project has extensive documentation about OE including a
502     reference manual which can be found at:
503         http://yoctoproject.org/documentation
504
505     You can now run 'bitbake <target>'
506
507     Common targets are:
508         yocto-image-full
509         core-image-minimal
510         imx-image-full
511  ... ...
2b179f 512
G 513   Yocto(mickledore) installed to '/home/guowenxue/igkboard-imx6ull/bsp/yocto/install'
514  Start bzip2 compress yocto-mickledore-lf-6.1.36-2.1.0.wic
f1cee2 515 rootfs-yocto-mickledore.tar.zst  u-boot-igkboard-imx6ull.imx  yocto-mickledore-lf-6.1.36-2.1.0.wic.bz2
G 516 ```
517
518
519
520 编译完成后,系统镜像和烧录所需要的文件将会存放到自动创建的 ***install*** 文件夹下。
521
522 ```bash
2b179f 523 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bsp/yocto$ ls install/
f1cee2 524 rootfs-yocto-mickledore.tar.zst  u-boot-igkboard-imx6ull.imx  yocto-mickledore-lf-6.1.36-2.1.0.wic.bz2
G 525 ```
526
527
528
529 接下来将上面两个文件下载到自己的 Windows 系统下,参考前面的文档就可以烧录启动了。
530