guowenxue
2024-05-06 f1cee2c6ed29108e34f766700c14111702a22ea0
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
27 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ ls
28 bootloader  config.json  debian  drivers  images  kernel  tools  yocto
29 ```
30
31
32
33 下面是编译系统各文件的简单介绍。
34
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
55 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cat config.json 
56 {
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
84 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ ls kernel/patches/
85 alientek-imx6ull-v20  alientek-imx6ull-v24  gauguin-imx8mp  gen_patch.sh  igkboard-imx6ull  igkboard-imx8mp
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
97 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ ls kernel/patches/igkboard-imx6ull/
98 linux-imx-lf-6.1.36-2.1.0.patch
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
143 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ ls kernel/patches/igkboard-imx6ull/
144 linux-imx-lf-6.1.36-2.1.0.patch
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
199 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ proxy
200
201 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ curl google.com
202 <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
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
215 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ unproxy 
216 ```
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
253 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ ls tools/
254 imgmnt  setup_tools.sh
255 ```
256
257
258
259 接下来以 root 权限执行 ***tools/setup_tools.sh*** 脚本,来安装BSP源码编译所依赖的系统工具和交叉编译器,如果之前已经安装过则会自动跳过。
260
261 ```bash
262 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cd tools/
263
264 guowenxue@9d57f9229b66:~/igkboard-imx6ull/tools$ sudo ./setup_tools.sh 
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 
268  ... ...
269  start decompress cross compiler for Cortex-A core
270  ... ...
271   cross compiler for Cortex-A installed to "/opt/gcc-aarch32-10.3-2021.07" successfully 
272 ```
273
274
275
276 至此,整个编译系统的配置和开发环境搭建已经完成。
277
278
279
280 ## 2.3 Bootloader编译
281
282
283
284 在做好前面的配置后,编译 bootloader 的工作就非常简单了,我们只需要切换到 ***bootloader*** 文件夹下,执行 `build.sh` 脚本即可。它将会自动从配置的源码服务器上下载源码,并打上相应的补丁文件,开始漫长的编译工作。
285
286 ``` bash
287 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cd bootloader/
288
289 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ls
290 build.sh  patches
291
292 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ./build.sh 
293  start build bootloader for igkboard-imx6ull 
294  start fetch uboot-imx source code 
295  ... ...
296  do patch for uboot-imx now... 
297  ... ...
298  start build uboot-imx 
299  ... ...
300   MKIMAGE u-boot-dtb.imx
301   OFCHK   .config
302 + cp u-boot-igkboard-imx6ull.imx /home/guowenxue/igkboard-imx6ull/bootloader/install
303 + set +x
304
305  bootloader installed to '/home/guowenxue/igkboard-imx6ull/bootloader/install' 
306 u-boot-igkboard-imx6ull.imx 
307 ```
308
309
310
311 编译完成后,生成的 bootloader 文件将会存放到自动创建的 ***install*** 文件夹下。
312
313 ```bash
314 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ls install/
315 u-boot-igkboard-imx6ull.imx
316 ```
317
318
319
320 如果对 bootloader 源码有新的修改,我们可以使用 `./patches/gen_patch.sh` 脚本生成新的 patch 补丁文件。如果想保存该补丁文件,则可以替换 ***patches*** 文件夹下的相应文件。
321
322 ```bash
323 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ./patches/gen_patch.sh uboot-imx/
324  generate patch file 
325  
326 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ls 
327 build.sh  install  patches  tarballs  uboot-imx  uboot-imx-lf-6.1.36-2.1.0.patch
328
329 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ mv uboot-imx-lf-6.1.36-2.1.0.patch patches/igkboard-imx6ull/
330 ```
331
332
333
334 另外使用  `build.sh -c` 命令可以一键清除所有编译产生的文件和源码。
335
336 ```bash
337 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ./build.sh -c
338  start clean bootloader 
339  
340 guowenxue@9d57f9229b66:~/igkboard-imx6ull/bootloader$ ls
341 build.sh  patches
342 ```
343
344
345
346 ## 2.4 Linux内核编译
347
348
349
350 同样地,编译 Linux内核源码的工作也非常简单,我们只需要切换到 ***kernel*** 文件夹下,执行 `build.sh` 脚本即可。它将会自动从配置的源码服务器上下载源码,并打上相应的补丁文件,开始漫长的编译工作。
351
352 ```bash
353 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cd kernel/
354
355 guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ls
356 build.sh  patches
357
358 guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ./build.sh 
359  start build linux kernel for igkboard-imx6ull 
360  start fetch linux kernel source code 
361 ... ...
362  do patch for linux-imx now... 
363  ... ...
364  start build linux-imx 
365  ... ...
366  linux kernel installed to '/home/guowenxue/igkboard-imx6ull/kernel/install' 
367 igkboard-imx6ull.dtb  lib  overlays  zImage
368 ```
369
370
371
372 同样地,编译完成后生成的 linux内核文件将会存放到自动创建的 ***install*** 文件夹下。
373
374 ```bash
375 guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ls install/
376 igkboard-imx6ull.dtb  lib  overlays  zImage
377 ```
378
379
380
381 如果对 Linux内核源码有新的修改,我们可以使用 `./patches/gen_patch.sh` 脚本生成新的 patch 补丁文件。如果想保存该补丁文件,则可以替换 ***patches*** 文件夹下的相应文件。
382
383 ```bash
384 guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ./patches/gen_patch.sh linux-imx/
385  generate patch file 
386  
387 guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ls
388 build.sh  install  linux-imx  linux-imx-lf-6.1.36-2.1.0.patch  patches  tarballs
389
390 guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ mv linux-imx-lf-6.1.36-2.1.0.patch patches/igkboard-imx6ull/
391 ```
392
393
394
395 另外使用  `build.sh -c` 命令可以一键清除所有编译产生的文件和源码。
396
397 ```
398 guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ./build.sh -c
399  start clean linux kernel 
400  
401 guowenxue@9d57f9229b66:~/igkboard-imx6ull/kernel$ ls
402 build.sh  patches
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
418 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cd images/
419
420 guowenxue@9d57f9229b66:~/igkboard-imx6ull/images$ ls
421 build.sh
422
423 guowenxue@9d57f9229b66:~/igkboard-imx6ull/images$ sudo ./build.sh 
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 
426  ... ...
427  start generate empty system image 
428  ... ...
429  start partition system image 
430  losetup system image on loop4 
431  ... ...
432  start format system image 
433  ... ...
434  start install u-boot image  
435  ... ...
436  start install linux kernel images 
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  
441  ... ...
442  Shell script exit now, do some clean work
443  
444  kpartx -dv /dev/loop4 
445 del devmap : loop4p1
446 del devmap : loop4p2
447  losetup -d /dev/loop4  
448 ```
449
450
451
452 编译完成后,系统镜像和烧录所需要的文件将会存放到自动创建的 ***install*** 文件夹下。
453
454 ```bash
455 guowenxue@9d57f9229b66:~/igkboard-imx6ull/images$ ls install/
456 u-boot-igkboard-imx6ull.imx  yocto-mickledore-lf-6.1.36-2.1.0.img.bz2
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
488 guowenxue@9d57f9229b66:~/igkboard-imx6ull$ cd yocto/
489
490 guowenxue@9d57f9229b66:~/igkboard-imx6ull/yocto$ ls
491 build.sh  meta-igkboard
492
493 guowenxue@9d57f9229b66:~/igkboard-imx6ull/yocto$ ./build.sh 
494  start build Yocto mickledore for igkboard-imx6ull 
495  start download fetch Yocto mickledore source code 
496  ... ...
497   Build directory is  igkboard-imx6ull
498 /home/guowenxue/igkboard-imx6ull/yocto/mickledore-lf-6.1.36-2.1.0
499     Welcome LingYun IoT Gateway Kit Board Yocto BSP
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  ... ...
512  
513   Yocto(mickledore) installed to '/home/guowenxue/igkboard-imx6ull/yocto/install' 
514  Start bzip2 compress yocto-mickledore-lf-6.1.36-2.1.0.wic 
515 rootfs-yocto-mickledore.tar.zst  u-boot-igkboard-imx6ull.imx  yocto-mickledore-lf-6.1.36-2.1.0.wic.bz2
516 ```
517
518
519
520 编译完成后,系统镜像和烧录所需要的文件将会存放到自动创建的 ***install*** 文件夹下。
521
522 ```bash
523 guowenxue@9d57f9229b66:~/igkboard-imx6ull/yocto$ ls install/
524 rootfs-yocto-mickledore.tar.zst  u-boot-igkboard-imx6ull.imx  yocto-mickledore-lf-6.1.36-2.1.0.wic.bz2
525 ```
526
527
528
529 接下来将上面两个文件下载到自己的 Windows 系统下,参考前面的文档就可以烧录启动了。
530