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

基于泰晓RISC-V实验箱的Linux公开课
请稍侯

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

贾献华 创作于 2021/02/02

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

前言

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

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

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

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

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

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

2020 年 12 月 24 日:真板体验

用户与密码

# root
username: root
password: root

# normal
username: debian
password: temppwd

串口

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

SSH

$ ifconfig | grep 192
         inet 192.168.1.146  netmask 255.255.255.0  broadcast 192.168.1.255
         inet 192.168.7.2  netmask 255.255.255.252  broadcast 192.168.7.3
         TX packets 904  bytes 197373 (192.7 KiB)

// enable ssh
$ sudo fire-config

// npi hostname
$ sudo apt install avahi-daemon

登录客户端

Windows:

MobaXterm SSH

MobaXterm

Linux & MacOS:

// ip address
$ ssh debian@192.168.0.xxx

// npi hostname
$ ssh debian@npi

刷 “预览版” 镜像

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

请参考《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 文件,我们用它加载设备树。

相关效果图如下:

macOS U盘

macOS_boot

Windows 10 U盘

windows10_boot_1

windows10_boot_2

网卡禁用数字签名

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

网卡驱动:RNDIS.rar

多出一个 Linux USB Ethernet。

Windows10_ethernet

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

devmgmt.msc

devmgmt

烧录到 eMMC

$ sudo fire-config

选择 7 Advanced

7_Advanced

选择 A2 Flasher

A2_Flasher

同意 Enabled?

enable

同意后 Enabled!

enabled

重启 Reboot

reboot

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

LED

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

$ sudo -s

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

# echo 0 > /sys/class/leds/red/brightness
# echo 0 > /sys/class/leds/blue/brightness
# echo 0 > /sys/class/leds/green/brightness
# echo 255 > /sys/class/leds/red/brightness
# echo 255 > /sys/class/leds/blue/brightness
# echo 255 > /sys/class/leds/green/brightness

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

$ sudo apt update -y
$ sudo apt install -y peripheral
$ cd ~/peripheral
$ ./led.sh

gcc & hello world

撰写 hello.c

#include <stdio.h>

int main(int argc, char *argv[]) {
	printf("Hello World!\n");
	return 0;
}

通过 gcc/make 编译:

$ sudo apt install gcc make -y
$ make hello
$ ./hello
Hello World!

查看文件格式:

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

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

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

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

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

下载 Linux Lab

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

运行 LinuxLab

$ tools/docker/run linux-lab
$ tools/docker/bash

通过 Linux Lab 启动 arm/mcimx6ul-evk

$ make list | grep imx6ul
[ arm/mcimx6ul-evk ]:
$ make BOARD=mcimx6ul-evk
$ make boot

编译和并启动新内核

$ make kernel-download
$ make kernel-checkout
$ make kernel-patch
$ make kernel-defconfig
$ make kernel-menuconfig
$ make kernel
$ make boot

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

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

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

根据板子型号选择 dtb 配置

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

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

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

$ make BOARD=arm/ebf-imx6ull
$ make kernel
$ make kernel-save
$ make modules-install
$ ls boards/arm/ebf-imx6ull/bsp/kernel/v4.19.35/
  imx6ull-nand-npi.dtb  zImage
$ ls boards/arm/ebf-imx6ull/bsp/root/2020.02/rootfs/lib/modules/
  4.19.35+
$ rm boards/arm/ebf-imx6ull/bsp/root/2020.02/rootfs/lib/modules/4.19.35+/{source,build}

上传 zImage & dtb

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

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

最好备份一下。

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

PC

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

Board

$ sudo mkdir -p /boot/dtbs/4.19.35+
$ sudo mv ~/imx6ull-nand-npi.dtb /boot/dtbs/4.19.35+/
$ sudo mv ~/zImage /boot/vmlinuz-4.19.35+

$ sudo mv ~/4.19.35+ /lib/modules/
$ sudo update-initramfs -u -k 4.19.35+

Boot 新 Image

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

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

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 卡启动。

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

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

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

这里直接切换到 VirtualBox。

Windows 10 下使用 VirtualBox

virtualbox

自动上传 zImage,dtb,modules:

$ make kernel-upload
$ make dtb-upload
$ make modules-upload

使用新 Image 启动。

$ make boot

完美启动:

run

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

GUI

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

$ sudo apt install evtest
$ sudo evtest

好像没有反应。

evtest

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

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

lsmod

看下驱动 log:

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

Goodix

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

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

试试 macOS

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

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

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

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

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

login

小结

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

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

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

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

修改内核

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

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

kernel_init 添加一条打印:

$ git diff init/main.c
diff --git a/init/main.c b/init/main.c
index e083fac08aed..c8041fa17d6c 100644
--- a/init/main.c
+++ b/init/main.c
@@ -1078,6 +1078,8 @@ static int __ref kernel_init(void *unused)

 	rcu_end_inkernel_boot();

+	printk(KERN_DEBUG "Hello, IMX6ULL from Linux Lab.");
+
 	if (ramdisk_execute_command) {
 		ret = run_init_process(ramdisk_execute_command);
 		if (!ret)

编译

$ make kernel-build

上传

$ make kernel-upload

启动新 Image

$ make boot

查看启动日志

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

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

kernel

查看一下内核信息

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

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

调试 Linux 内核

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

$ make BOARD=arm/mcimx6ul-evk
$ make feature feature=debug
$ make kernel-olddefconfig
$ make kernel
$ make kernel-debug

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

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

$ cat ./gdb/kernel.default

自己随便玩。

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

真板调试功能还未支持

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

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

小结

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

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

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

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

拷贝一份新模块

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

hello_linux_lab_hello.c 源码:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

static int __init hello_linux_lab_imx6ull_init(void)
{
	pr_info("hello linux-lab imx6ull module init\n");

	return 0;
}

static void __exit hello_linux_lab_imx6ull_exit(void)
{
	pr_info("hello linux-lab imx6ull module exit\n");
}

module_init(hello_linux_lab_imx6ull_init);
module_exit(hello_linux_lab_imx6ull_exit);

MODULE_DESCRIPTION("hello linux-lab imx6ull - Linux Lab real board module example");
MODULE_AUTHOR("iOSDevLog <iosdevlog@iosdevlog.com>");
MODULE_LICENSE("GPL");

Makeifle 源码:

KERNEL_SRC ?= /lib/modules/`uname -r`/build

obj-m	+=   hello_linux_lab_imx6ull.o


modules:
	$(MAKE) -C $(KERNEL_SRC) M=$$PWD modules;

modules-install:
	$(MAKE) -C $(KERNEL_SRC) M=$$PWD modules-install;

clean:
	$(MAKE) -C $(KERNEL_SRC) M=$$PWD clean;
	rm -f *.ko;

编译模块并上传

$ make modules m=hello_linux_lab_imx6ull
$ make modules-install m=hello_linux_lab_imx6ull
$ make modules-upload

再次验证

$ make login

debian@npi:~$ ls /lib/modules/4.19.35+/extra/
hello.ko  hello_imx6ull.ko  hello_linux_lab_imx6ull.ko

debian@npi:~$ sudo apt install -y file
debian@npi:~$ file /lib/modules/4.19.35+/extra/*

hello.ko 一样。

$ /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
$ /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
$ /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 信息。

debian@npi:~$ sudo modprobe hello_linux_lab_imx6ull
[ 1177.900660] hello linux-lab imx6ull module init

debian@npi:~$ lsmod | grep hello_linux_lab_imx6ull
hello_linux_lab_imx6ull    16384  0

debian@npi:~$ dmesg | grep "hello linux"
[ 1177.900660] hello linux-lab imx6ull module init

debian@npi:~$ modinfo hello_linux_lab_imx6ull
filename:       /lib/modules/4.19.35+/extra/hello_linux_lab_imx6ull.ko
license:        GPL
author:         iOSDevLog <iosdevlog@iosdevlog.com>
description:    hello linux-lab imx6ull - Linux Lab real board module example
srcversion:     23F6F2563D3621635B131C2
depends:
name:           hello_linux_lab_imx6ull
vermagic:       4.19.35+ SMP preempt mod_unload modversions ARMv7 p2v8

hello_linux_lab_imx6ull

小结

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

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

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

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

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

总结

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

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

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



Read Album:

Read Related:

Read Latest: