linux_learn/docs/02-设备树与Linux系统构建.md

154 lines
7.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 02-设备树与Linux系统构建
> 资料源: [`TL3568-EVM\3-用户手册\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/3-%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/) + [`TL3568-EVM\4-软件资料\Linux\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Linux/) + [正点原子 B 盘](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/%E3%80%90%E6%AD%A3%E7%82%B9%E5%8E%9F%E5%AD%90%E3%80%91RK3568%E5%BC%80%E5%8F%91%E6%9D%BF%E8%B5%84%E6%96%99%EF%BC%88B%E7%9B%98%EF%BC%89-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E5%8F%8ASDK/)
---
## 一、可学习的内容
### 1.1 设备树Device Tree / DTS
设备树是 ARM Linux 的硬件描述语言。你在 DTS 里描述"CAN 控制器挂在哪条总线、用哪些 GPIO",内核启动时解析 DTS 并自动加载对应驱动。
**资料位置**
| 在哪里学 | 路径 |
|----------|------|
| 正点原子 DTS 源码 | [正点原子 B 盘 `02、ATK-DLRK3568开发板SDK\linux\`](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/%E3%80%90%E6%AD%A3%E7%82%B9%E5%8E%9F%E5%AD%90%E3%80%91RK3568%E5%BC%80%E5%8F%91%E6%9D%BF%E8%B5%84%E6%96%99%EF%BC%88B%E7%9B%98%EF%BC%89-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E5%8F%8ASDK/02%E3%80%81ATK-DLRK3568%E5%BC%80%E5%8F%91%E6%9D%BFSDK/linux/) SDK 中的 `arch/arm64/boot/dts/rockchip/rk3568-atk*.dts` |
| 创龙 DTS 源码 | [`TL3568-EVM\4-软件资料\Linux\Kernel\src\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Linux/Kernel/src/) 解压后找 `rk3568-tl3568*.dts` |
| 写入 DTS 后验证 | `cat /sys/kernel/debug/pinctrl/*/pinmux-pins \| grep can` 看引脚复用是否正确 |
**DTS 节点示例**RK3568 CAN
```dts
&can0 {
status = "okay";
assigned-clocks = <&cru CLK_CAN0>;
assigned-clock-rates = <200000000>;
pinctrl-names = "default";
pinctrl-0 = <&can0m1_pins>;
};
```
**关键概念**
- `&can0` → 引用 SoC 级预定义的节点
- `status = "okay"` → 启用此设备(默认 disabled
- `pinctrl-0` → 指定使用哪些 GPIO 引脚(`can0m1_pins` 在 `rk3568-pinctrl.dtsi` 中预定义)
- `assigned-clock-rates` → 设置 CAN 控制器时钟为 200MHz
---
### 1.2 Linux 系统构建Buildroot
创龙板用的是 Buildroot 2018.02,正点原子用的是 SDK 脚本编译。
| 内容 | 资料位置 |
|------|----------|
| 构建完整说明 | [`TL3568-EVM\3-用户手册\3-1-Linux系统使用手册.pdf`](../TL3568-EVM(Buildroot-2018.02)_V1.8/3-%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/3-1-Linux%E7%B3%BB%E7%BB%9F%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C.pdf) |
| SDK 包 | [`TL3568-EVM\4-软件资料\Linux\LinuxSDK\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Linux/LinuxSDK/) (3 个 .tar.gz) |
| 内核源码 | [`TL3568-EVM\4-软件资料\Linux\Kernel\src\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Linux/Kernel/src/) |
| U-Boot 源码 | [`TL3568-EVM\4-软件资料\Linux\U-Boot\src\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Linux/U-Boot/src/) |
| 文件系统 | [`TL3568-EVM\4-软件资料\Linux\Filesystem\buildroot-201802\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Linux/Filesystem/buildroot-201802/) |
| 系统镜像烧写 | [`TL3568-EVM\3-用户手册\3-2-Linux系统启动卡制作及系统固化.pdf`](../TL3568-EVM(Buildroot-2018.02)_V1.8/3-%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/3-2-Linux%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E5%8D%A1%E5%88%B6%E4%BD%9C%E5%8F%8A%E7%B3%BB%E7%BB%9F%E5%9B%BA%E5%8C%96.pdf) |
**完整构建流程**
```
1. 解压 LinuxSDK/*.tar.gz → 得到 SDK 根目录
2. 进入 kernel/ → make ARCH=arm64 tl3568_linux_defconfig
3. make ARCH=arm64 rk3568-evb.dtb → 编译设备树
4. 进入 buildroot-201802/ → make tl3568_defconfig && make
5. 输出: output/images/ → boot.img + rootfs.ext4
6. 制作 SD 启动卡 → rkdeveloptool / upgrade_tool 烧写
```
**关键命令**
```bash
# 查看当前 DTB 是否包含 CAN 节点
dtc -I dtb -O dts /boot/rk3568-tl3568.dtb | grep -A5 "can@"
# 查看内核 config 中 CAN 是否开启
zcat /proc/config.gz | grep CONFIG_CAN
# 看当前使用的 DTS 文件名
cat /proc/device-tree/model
```
---
### 1.3 正点原子 Ubuntu 开发环境
```
路径: [正点原子 B 盘 - 开发环境及SDK](../%E5%8F%B6%E9%B9%8F%E7%A8%8B/%E3%80%90%E6%AD%A3%E7%82%B9%E5%8E%9F%E5%AD%90%E3%80%91RK3568%E5%BC%80%E5%8F%91%E6%9D%BF%E8%B5%84%E6%96%99%EF%BC%88B%E7%9B%98%EF%BC%89-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E5%8F%8ASDK/)
├── 01、Ubuntu开发环境/
│ └── Ubuntu虚拟机镜像 (.vmdk) → 装好所有编译依赖,开箱即用
└── 02、ATK-DLRK3568开发板SDK/
├── linux/ → Linux SDK (kernel + uboot + buildroot)
├── android11/ → Android 11 SDK
├── android12/ → Android 12 SDK
└── openharmony/ → OpenHarmony SDK
```
虚拟机镜像已预装:
- GCC 交叉编译工具链 `aarch64-none-linux-gnu-`
- Buildroot 2018.02
- device-tree-compiler (dtc)
- rkdeveloptool (烧写工具)
**首次使用建议**
1. 先跑通创龙的 ["3-2-Linux系统启动卡制作及系统固化.pdf"](../TL3568-EVM(Buildroot-2018.02)_V1.8/3-%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/3-2-Linux%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E5%8D%A1%E5%88%B6%E4%BD%9C%E5%8F%8A%E7%B3%BB%E7%BB%9F%E5%9B%BA%E5%8C%96.pdf) 流程,确保能出镜像
2. 再单独改 DTS比如添加 CAN 节点),重编 dtb验证是否能加载
3. 最后再改内核驱动
---
### 1.4 systemd / init 启动流程
用户手册中覆盖了但不显眼的内容——**理解 Linux 启动顺序**对于嵌入式开发很重要:
```
上电 → BootROM → U-Boot (SPL → TPL → U-Boot Proper) → 加载 DTB
→ 加载 kernel Image → kernel 启动 → 挂载 rootfs
→ /sbin/init → systemd/rcS → 启动你的应用程序
```
**你的 CAN 协议栈应该在哪一步启动?**
- 如果作为系统服务:写 `.service` 文件放到 `/etc/systemd/system/`
- 如果临时调试:放在 `/etc/rc.local``profile.d`
- 生产环境:通过 Buildroot 的 `package/` 添加为开机自启动项
---
## 二、可直接使用的资料
### 内核镜像(预编译)
| 文件 | 路径 |
|------|------|
| 内核 Image | [`4-软件资料\Linux\Kernel\image\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Linux/Kernel/image/) |
| U-Boot | [`4-软件资料\Linux\U-Boot\image\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Linux/U-Boot/image/) |
### 系统镜像
| 文件 | 路径 |
|------|------|
| Buildroot rootfs | [`4-软件资料\Linux\Filesystem\buildroot-201802\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Linux/Filesystem/buildroot-201802/) |
| Docker 镜像 | [`4-软件资料\Linux\Filesystem\docker\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Linux/Filesystem/docker/) (4 个) |
| 麒麟 KylinOS | [`4-软件资料\KylinOS\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/KylinOS/) (4 个镜像) |
| SylixOS | [`4-软件资料\SylixOS\`](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/SylixOS/) (国产 RTOS) |
---
## 三、学习建议
| 阶段 | 内容 | 时间 |
|:---:|------|:---:|
| 第1周 | 看懂 DTS 中一个节点(如 led能改 `status = "okay"` 并验证 | 3天 |
| 第2周 | 用自己的 Ubuntu 虚拟机完整编译出一版 Buildroot 系统 | 5天 |
| 第3周 | 修改内核 config添加 CAN 支持,重编 kernel | 3天 |
| 第4周 | 修改 DTS 添加自定义外设的引脚配置,编译 dtb替换验证 | 3天 |
> **核心原则**:不要试图第一次就理解全部 DTS。先改 `status`、先加一个小 LED 节点,跑起来再去读规范。