154 lines
7.7 KiB
Markdown
154 lines
7.7 KiB
Markdown
# 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 节点,跑起来再去读规范。
|