泰晓科技 -- 聚焦 Linux - 追本溯源,见微知著!
网站地址:https://tinylab.org

泰晓Linux知识星球:1300+知识点,520+用户
请稍侯

Linux Lab 真板开发日志(1):50 天开发纪要与上手初体验

贾献华 创作于 2021/02/02

By 贾献华 of TinyLab.org Jan 12, 2021

1 前言

本文详细记录了 “Linux Lab 真板” 项目的实施过程,并分享了本人的学习和开发日志,敬请查阅。

如需了解该项目更多信息,请查看 Linux Lab 正在新增对真实开发板的支持

本文所采用的 i.MX6ULL Pro 开发板可以直接从 泰晓科技自营店 选购。

2 2020 年 11 月 11 日:项目开始

2020 年 11 月 11 日 中午 Linux Lab 作者Linux Lab 用户交流群 发布:

大家好,v0.6 计划开始支持真实的硬件开发板,可能会从这块板子开始,已经联系到知名板子设计厂商赞助开发板,欢迎感兴趣的同学报名。

于是我就兴冲冲的报名了,当天作者就拉了一个 Linux Lab v0.6+ 真板群

自己要先熟悉一下 Linux Lab 已经支持 arm/mcimx6ul-evk 虚拟板子,后来邀请到该板子开发者 吴平 老师,在开发过程中会抽空指导帮助。

初步目标:

  1. 一键 make boot 真实板子(含其他功能兼容,debugtest,新增 upload
  2. 完善 README.md,整理各种资料信息
  3. 撰写几篇相关文章(每个参与的同学至少一篇文章,不少于一个 PR merge 到项目,每人送一个板子)

初步约定 kalgan 来担任 PM

3 Linux Lab 真板项目 50 天开发纪要

  • 2020 年 11 月 14 日:确定真板:imx6ull

imx6ull

这套板子相关的资料:https://ebf-products.readthedocs.io/zh_CN/latest/linux/ebf_i.mx6ull.html

下图是我总结的相关思维导图:

linux

  • 2020 年 12 月 8 日:邀请板子的赞助商野火电子的杨总及几位野火电子的同学们

Linux Lab 的目标是 one command for everything ;-)

创建了 Linux Lab 真板项目开发页面:https://gitee.com/tinylab/linux-lab/issues/I28KSD

  • 2020 年 12 月 17 日:确定真板数量:5 个大板子和 1 个小板子。

  • 2020 年 12 月 19 日:周六,协调开发计划的会议临时取消。

  • 2020 年 12 月 23 日:收到开发板, 是大板子,还带了触摸屏。

imx6ull pro

  • 2020 年 12 月 28 日:Linux Lab 作者发布第一款真板开发进展

Linux Lab 第一块真实硬件开发板的基础开发工作基本 Ready,争取这两天在 v0.6-rc2 发布,欢迎同学们关注。

开发过程记录请参考:https://gitee.com/tinylab/linux-lab/issues/I28KSD

大家有需要使用这块开发板的话,咱们可以组织一批团购,欢迎私信@晓泰 报名哈。

4 2020 年 12 月 24 日:真板体验

4.1 用户与密码

  1. # root
  2. username: root
  3. password: root
  4. # normal
  5. username: debian
  6. password: temppwd

4.2 串口

串口部分用法请参考《i.MX Linux 开发实战指南》的第2节:2. 运行开发板与串口终端登录

4.3 SSH

  1. $ ifconfig | grep 192
  2. inet 192.168.1.146 netmask 255.255.255.0 broadcast 192.168.1.255
  3. inet 192.168.7.2 netmask 255.255.255.252 broadcast 192.168.7.3
  4. TX packets 904 bytes 197373 (192.7 KiB)
  5. // enable ssh
  6. $ sudo fire-config
  7. // npi hostname
  8. $ sudo apt install avahi-daemon

4.4 登录客户端

Windows:

MobaXterm SSH

MobaXterm

Linux & MacOS:

  1. // ip address
  2. $ ssh debian@192.168.0.xxx
  3. // npi hostname
  4. $ ssh debian@npi

4.5 刷 “预览版” 镜像

接下来介绍如何烧录新镜像,确保更多功能能顺利使用。

请参考《i.MX Linux 开发实战指南》第 9 节: 烧录 Debian 镜像至 SD 卡

USB 虚拟串口、网络及 U 盘需要预览版镜像才支持。

请从百度云盘选择 “预览版” 下载:

云盘:imx6ul Debian 镜像百度云链接 链接:https://pan.baidu.com/s/1pqVHVIdY97VApz-rVVa8pQ 提取码:uge1

SD 卡启动后有一个 Linux Logo。

preview

USB 口能虚拟 U盘、串口、网卡出来。

usb

boot 分区做成 “U 盘” 更方便修改,特别是 uEnv.txt 文件,我们用它加载设备树。

相关效果图如下:

4.5.1 macOS U盘

macOS_boot

4.5.2 Windows 10 U盘

windows10_boot_1

windows10_boot_2

4.5.3 网卡禁用数字签名

http://www.win10xiazai.com/win10/8148.html

网卡驱动:RNDIS.rar

多出一个 Linux USB Ethernet。

Windows10_ethernet

可通过 Window + R 启动 “运行” 窗口,然后输入如下命令打开设备管理器查看以上设备信息。

  1. devmgmt.msc

devmgmt

4.6 烧录到 eMMC

  1. $ sudo fire-config

选择 7 Advanced

7_Advanced

选择 A2 Flasher

A2_Flasher

同意 Enabled?

enable

同意后 Enabled!

enabled

重启 Reboot

reboot

5 2021 年 12 月 24 日:熟悉 EBF_6ULL 开发板

5.1 LED

为方便使用 echo 命令修改系统文件,提升至 root 权限进行操作,执行该命令后,再执行 exit 可退回普通用户:

  1. $ sudo -s

在 root 权限下进行下列操作,LED 灯默认可能处于亮的状态,我们先把它们全部关闭再一盏盏点亮:

  1. # echo 0 > /sys/class/leds/red/brightness
  2. # echo 0 > /sys/class/leds/blue/brightness
  3. # echo 0 > /sys/class/leds/green/brightness
  4. # echo 255 > /sys/class/leds/red/brightness
  5. # echo 255 > /sys/class/leds/blue/brightness
  6. # echo 255 > /sys/class/leds/green/brightness

在板子上,通过脚本测试硬件:

  1. $ sudo apt update -y
  2. $ sudo apt install -y peripheral
  3. $ cd ~/peripheral
  4. $ ./led.sh

5.2 gcc & hello world

撰写 hello.c

  1. #include <stdio.h>
  2. int main(int argc, char *argv[]) {
  3. printf("Hello World!\n");
  4. return 0;
  5. }

通过 gcc/make 编译:

  1. $ sudo apt install gcc make -y
  2. $ make hello
  3. $ ./hello
  4. Hello World!

查看文件格式:

  1. $ readelf -h hello
  2. ELF Header:
  3. Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  4. Class: ELF32
  5. Data: 2's complement, little endian
  6. Version: 1 (current)
  7. OS/ABI: UNIX - System V
  8. ABI Version: 0
  9. Type: DYN (Shared object file)
  10. Machine: ARM
  11. Version: 0x1
  12. Entry point address: 0x3fd
  13. Start of program headers: 52 (bytes into file)
  14. Start of section headers: 6976 (bytes into file)
  15. Flags: 0x5000400, Version5 EABI, hard-float ABI
  16. Size of this header: 52 (bytes)
  17. Size of program headers: 32 (bytes)
  18. Number of program headers: 9
  19. Size of section headers: 40 (bytes)
  20. Number of section headers: 29
  21. Section header string table index: 28

6 2021 年 12 月 25 日:使用虚拟开发板 arm/mcimx6ul-evk

arm/mcimx6ul-evk 是 Linux Lab 已经支持好的一块虚拟开发板,跟我们将要开发的真板很接近,这里先体验一下。

6.1 通过脚本启动提前编译好的 arm/mcimx6ul-evk 镜像文件

  1. $ git clone https://gitee.com/tinylab/qemu-arm-mcimx6ul-evk
  2. $ cd qemu-arm-mcimx6ul-evk/
  3. $ ./boot.sh
  4. ...
  5. linux-lab login: root
  6. [ 36.390412] usb_otg1_vbus: disabling
  7. # uname -a
  8. Linux linux-lab 5.4.0-dirty #1 SMP Wed Apr 8 23:55:27 CST 2020 armv7l GNU/Linux
  9. # poweroff

6.2 下载 Linux Lab

  1. $ git clone https://gitee.com/tinylab/cloud-lab.git
  2. $ cd cloud-lab/ && tools/docker/choose linux-lab

6.3 运行 LinuxLab

  1. $ tools/docker/run linux-lab
  2. $ tools/docker/bash

6.4 通过 Linux Lab 启动 arm/mcimx6ul-evk

  1. $ make list | grep imx6ul
  2. [ arm/mcimx6ul-evk ]:
  3. $ make BOARD=mcimx6ul-evk
  4. $ make boot

6.5 编译和并启动新内核

  1. $ make kernel-download
  2. $ make kernel-checkout
  3. $ make kernel-patch
  4. $ make kernel-defconfig
  5. $ make kernel-menuconfig
  6. $ make kernel
  7. $ make boot

7 2020 年 12 月 26 日:使用真板 arm/ebf-imx6ull

目前是开发的初始阶段,文档也时刻在变,这里只记录部分开发测试过程,请以最新文档主准。

Linux Lab 安装和启动过程同上,这里不做介绍,接下来参考 泰晓科技/Linux Lab EmbedFire i.MX6UL/ULL-EVK-PRO Board 来使用真板。

7.1 根据板子型号选择 dtb 配置

本人拿到的是 eMMC 的硬件版本,所以切换为 mmc:

  1. $ sed -i -e "s/imx6ul-nand-npi.dtb/imx6ul-mmc-npi.dtb/g" boards/arm/ebf-imx6ull/Makefile

7.2 选择板子并编译内核、安装模块

  1. $ make BOARD=arm/ebf-imx6ull
  2. $ make kernel
  3. $ make kernel-save
  4. $ make modules-install
  5. $ ls boards/arm/ebf-imx6ull/bsp/kernel/v4.19.35/
  6. imx6ull-nand-npi.dtb zImage
  7. $ ls boards/arm/ebf-imx6ull/bsp/root/2020.02/rootfs/lib/modules/
  8. 4.19.35+
  9. $ rm boards/arm/ebf-imx6ull/bsp/root/2020.02/rootfs/lib/modules/4.19.35+/{source,build}

7.3 上传 zImage & dtb

我是在远程编译的,要先 scp 到本地,再从本地 scp开发板

如果使用 MobaXterm 是可以直接拖放的。

最好备份一下。

下面介绍手动上传并使用新镜像:

7.4 PC

  1. $ scp boards/arm/ebf-imx6ull/bsp/kernel/v4.19.35/zImage debian@192.168.1.128:~/
  2. $ scp boards/arm/ebf-imx6ull/bsp/kernel/v4.19.35/imx6ull-mmc-npi.dtb debian@192.168.1.128:~/
  3. $ scp -r boards/arm/ebf-imx6ull/bsp/root/2020.02/rootfs/lib/modules/4.19.35+ debian@192.168.1.128:~/

7.5 Board

  1. $ sudo mkdir -p /boot/dtbs/4.19.35+
  2. $ sudo mv ~/imx6ull-nand-npi.dtb /boot/dtbs/4.19.35+/
  3. $ sudo mv ~/zImage /boot/vmlinuz-4.19.35+
  4. $ sudo mv ~/4.19.35+ /lib/modules/
  5. $ sudo update-initramfs -u -k 4.19.35+

7.6 Boot 新 Image

mmcsd 都是用的 imx6ull-mmc-npi.dtb

  1. $ sudo sed -i -e "s/uname_r=.*/uname_r=4.19.35+/g" /boot/uEnv.txt
  2. $ sudo sed -i -e "s/dtb=.*/dtb=imx6ull-mmc-npi.dtb/g" /boot/uEnv.txt
  3. $ sudo reboot

7.7 Boot 拨码开关

  • mmc: 2-4-5-7
  • sd: 2-5-8

macOS

版本改成:4.19.35+,时间改成 2020/12/26,说明 Linux Lab 下是可以进行真板开发的。

sd_error

dtoverlays 的路径要改一下,下周再试吧。

sd

我的拔码开发 8 坏了,eMMC 启动的状态下,如果有 sd 卡,还是会从 sd 卡启动。

后续可以自动更新到 开发板 上,不需要现在这样麻烦,期待中…

8 2020 年 12 月 30 日:使用真板 arm/ebf-imx6ull,自动上传

目前 Linux Lab 默认配置的串口是 /dev/ttyUSB0,需要根据开发系统的不同来配置 .labinit 中的 BOARD_SERIAL,Windows 10 串口 应该是 COM[0-9*],MacOS 下可能是 /dev/tty.usbserial-144410

这里直接切换到 VirtualBox。

8.1 Windows 10 下使用 VirtualBox

virtualbox

自动上传 zImage,dtb,modules:

  1. $ make kernel-upload
  2. $ make dtb-upload
  3. $ make modules-upload

使用新 Image 启动。

  1. $ make boot

完美启动:

run

不过目前还有一些小问题:

GUI

触摸屏也不能工作,使用 evtest 测试一下。

  1. $ sudo apt install evtest
  2. $ sudo evtest

好像没有反应。

evtest

  1. No device specified, trying to scan all of /dev/input/event*
  2. Available devices:
  3. /dev/input/event0: 20cc000.snvs:snvs-powerkey
  4. /dev/input/event1: gpio-keys
  5. Select the device event number [0-1]:

看下触摸屏内核模块有没有自动加载 lsmod

lsmod

看下驱动 log:

  1. debian@npi:~$ dmesg|grep Goodix
  2. [ 19.968983] Goodix-TS 0-005d: i2c test failed attempt 1: -6
  3. [ 20.066545] Goodix-TS 0-005d: i2c test failed attempt 2: -6
  4. [ 20.159219] Goodix-TS 0-005d: I2C communication failure: -6

Goodix

经过确认:新的 Qt app 还在处理一些 bug,到时直接装就行了。

最新版已经可以使用 evtest 测试触摸屏了。

8.2 试试 macOS

需要注意的是在 macOS 下 Docker 目前无法直接访问串口,需要使用虚拟串口,请看后续相关文章。这里使用 ssh。

连接 iPhone 热点后就可以用 ssh 了。

make boot 成功过一次,board 重新启动后就卡住不动了。

后来就一直连接不上,可能还是网络 IP 地址变了。

  1. ubuntu@linux-lab:/labs/linux-lab$ make boot
  2. LOG: Configure new kernel and dtbs images
  3. LOG: Rebooting via ssh
  4. Connection to 192.168.1.132 closed by remote host.
  5. LOG: Login via ssh protocol
  6. make: *** [Makefile:3678: _boot] Error 255

login

8.3 小结

一句话,为了少折腾,还是 Windows -> VirtualBox -> Ubuntu -> Linux Lab

9 2020 年 12 月 30 日:内核开发与构建

9.1 切换到 ebf-imx6ull 使用命令补全功能

  1. $ make BOARD=arm/ebf-imx6ull
  2. $ . tools/helper/complete.sh
  3. $ make [TAB]

9.2 修改内核

进入内核源码目录,做一些修改。

  1. $ vi src/linux-stable/init/main.c

kernel_init 添加一条打印:

  1. $ git diff init/main.c
  2. diff --git a/init/main.c b/init/main.c
  3. index e083fac08aed..c8041fa17d6c 100644
  4. --- a/init/main.c
  5. +++ b/init/main.c
  6. @@ -1078,6 +1078,8 @@ static int __ref kernel_init(void *unused)
  7. rcu_end_inkernel_boot();
  8. + printk(KERN_DEBUG "Hello, IMX6ULL from Linux Lab.");
  9. +
  10. if (ramdisk_execute_command) {
  11. ret = run_init_process(ramdisk_execute_command);
  12. if (!ret)

9.3 编译

  1. $ make kernel-build

9.4 上传

  1. $ make kernel-upload

9.5 启动新 Image

  1. $ make boot

9.6 查看启动日志

  1. debian@npi:~$ dmesg | grep from
  2. [ 0.000000] random: get_random_bytes called from start_kernel+0xa0/0x434 wi0
  3. [ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=1.
  4. [ 1.543896] sii902x bound to mxs-lcdif from 21c8000.lcdif
  5. [ 1.646126] Console IMX rounded baud rate from 114943 to 114900
  6. [ 7.438844] Hello, IMX6ULL from Linux Lab.
  7. [ 9.745109] fec 20b4000.ethernet eth2: renamed from eth0
  8. [ 15.209116] systemd-journald[206]: Received request to flush runtime journa1

可以看到我们在 init/main.c 里添加的打印已经生效了。

kernel

9.7 查看一下内核信息

  1. debian@npi:~$ uname -a
  2. Linux npi 4.19.35+ #2 SMP PREEMPT Wed Dec 30 17:33:39 CST 2020 armv7l GNU/Linux

是刚才编译的,说明我们修改的内核确实起作用了。

9.8 调试 Linux 内核

9.8.1 虚拟开发板内核自动化调试

  1. $ make BOARD=arm/mcimx6ul-evk
  2. $ make feature feature=debug
  3. $ make kernel-olddefconfig
  4. $ make kernel
  5. $ make kernel-debug

使用 WebVNC,会自动打开两个窗口,一个显示原有内核,如果使用 bash,需要打开 2 个终端,一个做服务端,一个为客户端,详情请查阅文档。

默认设置了一些断点,可以通过以下命令查看:

  1. $ cat ./gdb/kernel.default

自己随便玩。

  • r: run 运行到断点
  • n: next 到下一条语句
  • s: step 单步执行
  • b: breakpoint 下断点
  • l: list 查看源码

9.8.2 真板调试功能还未支持

  1. $ make BOARD=arm/ebf-imx6ull
  2. $ make kernel-debug
  3. LOG: This feature is not implemented for real boards.

真板还没加,这个不太好弄,可以试试 kgdb over serial

9.9 小结

我还是先熟悉虚拟开发板的内核调试吧。

10 2020 年 12 月 31 日:开发内核模块

请参考书籍:《Linux 设备驱动程序》

预览版 从 TF 卡 fire-config 刷机 到 eMMC。

10.0.1 拷贝一份新模块

  1. $ mkdir -p src/modules/hello_linux_lab_hello
  2. $ cd src/modules/hello_linux_lab_hello
  3. $ vim hello_linux_lab_hello.c

hello_linux_lab_hello.c 源码:

  1. #include <linux/kernel.h>
  2. #include <linux/module.h>
  3. #include <linux/init.h>
  4. static int __init hello_linux_lab_imx6ull_init(void)
  5. {
  6. pr_info("hello linux-lab imx6ull module init\n");
  7. return 0;
  8. }
  9. static void __exit hello_linux_lab_imx6ull_exit(void)
  10. {
  11. pr_info("hello linux-lab imx6ull module exit\n");
  12. }
  13. module_init(hello_linux_lab_imx6ull_init);
  14. module_exit(hello_linux_lab_imx6ull_exit);
  15. MODULE_DESCRIPTION("hello linux-lab imx6ull - Linux Lab real board module example");
  16. MODULE_AUTHOR("iOSDevLog <iosdevlog@iosdevlog.com>");
  17. MODULE_LICENSE("GPL");

Makeifle 源码:

  1. KERNEL_SRC ?= /lib/modules/`uname -r`/build
  2. obj-m += hello_linux_lab_imx6ull.o
  3. modules:
  4. $(MAKE) -C $(KERNEL_SRC) M=$$PWD modules;
  5. modules-install:
  6. $(MAKE) -C $(KERNEL_SRC) M=$$PWD modules-install;
  7. clean:
  8. $(MAKE) -C $(KERNEL_SRC) M=$$PWD clean;
  9. rm -f *.ko;

10.0.2 编译模块并上传

  1. $ make modules m=hello_linux_lab_imx6ull
  2. $ make modules-install m=hello_linux_lab_imx6ull
  3. $ make modules-upload

10.0.3 再次验证

  1. $ make login
  2. debian@npi:~$ ls /lib/modules/4.19.35+/extra/
  3. hello.ko hello_imx6ull.ko hello_linux_lab_imx6ull.ko
  4. debian@npi:~$ sudo apt install -y file
  5. debian@npi:~$ file /lib/modules/4.19.35+/extra/*

hello.ko 一样。

  1. $ /lib/modules/4.19.35+/extra/hello.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=c669968dec7cfd12ff354756b21f4cb6653fc74b, with debug_info, not stripped
  2. $ /lib/modules/4.19.35+/extra/hello_imx6ull.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=70f2771a81593d78ef1aea082b7bbf1ab54d6e11, with debug_info, not stripped
  3. $ /lib/modules/4.19.35+/extra/hello_linux_lab_imx6ull.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=a72a2e20aa70392320fdcef88bb7844ae38a7c2c, with debug_info, not stripped

查看 hello_linux_lab_imx6ull 信息。

  1. debian@npi:~$ sudo modprobe hello_linux_lab_imx6ull
  2. [ 1177.900660] hello linux-lab imx6ull module init
  3. debian@npi:~$ lsmod | grep hello_linux_lab_imx6ull
  4. hello_linux_lab_imx6ull 16384 0
  5. debian@npi:~$ dmesg | grep "hello linux"
  6. [ 1177.900660] hello linux-lab imx6ull module init
  7. debian@npi:~$ modinfo hello_linux_lab_imx6ull
  8. filename: /lib/modules/4.19.35+/extra/hello_linux_lab_imx6ull.ko
  9. license: GPL
  10. author: iOSDevLog <iosdevlog@iosdevlog.com>
  11. description: hello linux-lab imx6ull - Linux Lab real board module example
  12. srcversion: 23F6F2563D3621635B131C2
  13. depends:
  14. name: hello_linux_lab_imx6ull
  15. vermagic: 4.19.35+ SMP preempt mod_unload modversions ARMv7 p2v8

hello_linux_lab_imx6ull

10.1 小结

年前不知什么原因,导致 Exec format error 错误,这次用干净的环境重新执行一下又可以了。

确实要使用相同的环境(抽象出虚拟层)。

11 2021 年 01 月 06 日:U-Boot 开发

本节参考吴平老师的文档:手动运行 uboot-2020.10 + Linux5.10.0 方法及存在的问题 开展了实验,但是没有成功。

这部分等 Linux Lab 真板项目继续完善。

12 总结

Linux Lab 新增首块真实硬件开发板 arm/ebf-imx6ull 支持,该开发板功能正在火热迭代中,可参考 开发记录

以上是本人参与该项目的详细开发和学习记录,抛砖引玉,欢迎拍砖。

目前还有一些功能等完善,期待更多的开发者前来体验。



Read Album:

Read Related:

Read Latest: