[置顶] 泰晓 RISC-V 实验箱,配套 30+ 讲嵌入式 Linux 系统开发公开课
[置顶] Linux Lab v1.4 升级部分内核到 v6.10,新增泰晓 RISC-V 实验箱支持,新增最小化内核配置支持大幅提升内核编译速度,在单终端内新增多窗口调试功能等Linux Lab 发布 v1.4 正式版,升级部分内核到 v6.10,新增泰晓实验箱支持
[置顶] 泰晓社区近日发布了一款儿童益智版 Linux 系统盘,集成了数十个教育类与益智游戏类开源软件国内首个儿童 Linux 系统来了,既可打字编程学习数理化,还能下棋研究数独提升智力
Linux Lab 真板开发日志(1):50 天开发纪要与上手初体验
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 虚拟板子,后来邀请到该板子开发者 吴平 老师,在开发过程中会抽空指导帮助。
初步目标:
- 一键
make boot
真实板子(含其他功能兼容,debug
,test
,新增upload
) - 完善
README.md
,整理各种资料信息 - 撰写几篇相关文章(每个参与的同学至少一篇文章,不少于一个
PR merge
到项目,每人送一个板子)
初步约定 kalgan 来担任 PM。
Linux Lab 真板项目 50 天开发纪要
- 2020 年 11 月 14 日:确定真板:
imx6ull
。
这套板子相关的资料:https://ebf-products.readthedocs.io/zh_CN/latest/linux/ebf_i.mx6ull.html。
下图是我总结的相关思维导图:
- 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 日:收到开发板, 是大板子,还带了触摸屏。
- 2020 年 12 月 28 日:Linux Lab 作者发布第一款真板开发进展
Linux Lab 第一块真实硬件开发板的基础开发工作基本 Ready,争取这两天在 v0.6-rc2 发布,欢迎同学们关注。
开发过程记录请参考:https://gitee.com/tinylab/linux-lab/issues/I28KSD
大家有需要使用这块开发板的话,咱们可以组织一批团购,欢迎私信@晓泰 报名哈。
- 2021 年 1 月 4 日:Linux Lab 发布 v0.6-rc2,新增首块真实硬件开发板。
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:
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。
USB 口能虚拟 U盘、串口、网卡出来。
把 boot
分区做成 “U 盘” 更方便修改,特别是 uEnv.txt 文件,我们用它加载设备树。
相关效果图如下:
macOS U盘
Windows 10 U盘
网卡禁用数字签名
http://www.win10xiazai.com/win10/8148.html
网卡驱动:RNDIS.rar
多出一个 Linux USB Ethernet。
可通过 Window + R
启动 “运行” 窗口,然后输入如下命令打开设备管理器查看以上设备信息。
devmgmt.msc
烧录到 eMMC
$ sudo fire-config
选择 7 Advanced。
选择 A2 Flasher。
同意 Enabled?
同意后 Enabled!
重启 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
mmc
和 sd
都是用的 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
版本改成:4.19.35+
,时间改成 2020/12/26
,说明 Linux Lab 下是可以进行真板开发的。
dtoverlays
的路径要改一下,下周再试吧。
我的拔码开发 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
自动上传 zImage,dtb,modules:
$ make kernel-upload
$ make dtb-upload
$ make modules-upload
使用新 Image 启动。
$ make boot
完美启动:
不过目前还有一些小问题:
触摸屏也不能工作,使用 evtest
测试一下。
$ sudo apt install evtest
$ sudo 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
。
看下驱动 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
经过确认:新的 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
小结
一句话,为了少折腾,还是 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
里添加的打印已经生效了。
查看一下内核信息
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
小结
年前不知什么原因,导致 Exec format error
错误,这次用干净的环境重新执行一下又可以了。
确实要使用相同的环境(抽象出虚拟层)。
2021 年 01 月 06 日:U-Boot 开发
本节参考吴平老师的文档:手动运行 uboot-2020.10 + Linux5.10.0 方法及存在的问题 开展了实验,但是没有成功。
这部分等 Linux Lab 真板项目继续完善。
总结
Linux Lab 新增首块真实硬件开发板 arm/ebf-imx6ull
支持,该开发板功能正在火热迭代中,可参考 开发记录。
以上是本人参与该项目的详细开发和学习记录,抛砖引玉,欢迎拍砖。
目前还有一些功能等完善,期待更多的开发者前来体验。
猜你喜欢:
- 我要投稿:发表原创技术文章,收获福利、挚友与行业影响力
- 知识星球:独家 Linux 实战经验与技巧,订阅「Linux知识星球」
- 视频频道:泰晓学院,B 站,发布各类 Linux 视频课
- 开源小店:欢迎光临泰晓科技自营店,购物支持泰晓原创
- 技术交流:Linux 用户技术交流微信群,联系微信号:tinylab
支付宝打赏 ¥9.68元 | 微信打赏 ¥9.68元 | |
请作者喝杯咖啡吧 |
Read Album:
- Linux Lab 发布 v0.7 正式版,新增 Linux Lab 实验盘,一分钟内即可开展内核实验
- Linux Lab 真盘开发日志(6):体验内存编译的用法和好处
- Linux Lab 真盘开发日志(5):体验透明压缩带来的可用容量翻倍效果
- Linux Lab 真盘开发日志(4):在台式机、笔记本和 macBook 上即插即用
- Linux Lab 真盘开发日志(3):在 Linux 下直接启动 Linux Lab Disk,当双系统使用