# RK3576 替换 Kernel 和 r8125 驱动测试 PTP 功能指南

## 1. 概述

本文档介绍如何在 RK3576 设备上替换 Kernel Image 和网卡驱动（使用 Realtek r8125 替代 r8169），并测试网口 PTP（Precision Time Protocol，精确时间协议）硬件时间戳功能。

### 测试环境

| 项目 | 说明 |
|------|------|
| 设备 | RK3588 开发板 (Mixtile) |
| 系统 | Ubuntu 24.04 (Noble) |
| 原始内核 | 6.1.0-1027-rockchip |
| 网络驱动 | r8125 v9.009.00-NAPI-PTP-RSS |
| 网络接口 | enP2p35s0, enP2p36s0 |

## 2. 文件准备

获取自定义 Kernel Image 和 r8125 驱动模块；

## 3. 推送文件到设备

确认 ADB 连接设备：

```bash
adb devices
# 应显示类似：
# 776f0b601dd5e158    device
```

推送文件：

```bash
# 推送 Kernel Image
adb push /tmp/ptp_test/Image /boot/vmlinuz-ptp-test

# 推送 r8125 驱动模块
adb push /tmp/ptp_test/r8125.ko /tmp/r8125.ko
```

将驱动模块安装到内核模块目录：

```bash
adb shell "
mkdir -p /lib/modules/6.1.0-1027-rockchip/extra &&
cp /tmp/r8125.ko /lib/modules/6.1.0-1027-rockchip/extra/ &&
depmod -a 6.1.0-1027-rockchip
"
```

## 4. 配置启动项

### 4.1 备份原启动配置

```bash
adb shell cp /boot/extlinux/extlinux.conf /boot/extlinux/extlinux.conf.bak
```

### 4.2 添加 PTP 测试启动项

编辑 `/boot/extlinux/extlinux.conf`，在文件末尾添加新的启动项：

```bash
adb shell "
cat >> /boot/extlinux/extlinux.conf << 'EOF'

label l1
	menu label Ubuntu 24.04 PTP Test (custom kernel + r8125)
	linux /boot/vmlinuz-ptp-test
	initrd /boot/initrd.img-6.1.0-1027-rockchip
	fdtdir /lib/firmware/6.1.0-1027-rockchip/device-tree/
	append root=UUID=360e85ea-2aed-43a5-9f22-ea5f8f292a3d rootwait rw console=ttyS2,1500000 console=tty1 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory quiet splash plymouth.ignore-serial-consoles
EOF
"
```

> **注意**: `append` 行中的 `root=UUID=` 值需要根据你设备的实际 root 分区 UUID 修改。可通过 `adb shell blkid` 查看。

### 4.3 设置默认启动项

```bash
# 设置默认从 l1 (PTP Test) 启动
adb shell sed -i 's/^default l0/default l1/' /boot/extlinux/extlinux.conf

# 如需恢复原始内核启动
adb shell sed -i 's/^default l1/default l0/' /boot/extlinux/extlinux.conf
```

### 4.4 禁用 r8169 驱动，启用 r8125

```bash
adb shell "
# 黑名单 r8169
echo 'blacklist r8169' > /etc/modprobe.d/blacklist-r8169.conf &&
echo 'install r8169 /bin/true' >> /etc/modprobe.d/blacklist-r8169.conf &&

# 设置 r8125 开机自动加载
echo 'r8125' > /etc/modules-load.d/r8125.conf
"
```

## 5. 重启设备并验证

```bash
# 重启
adb reboot

# 等待设备上线
adb wait-for-device
sleep 10

# 检查内核版本
adb shell uname -a

# 检查 r8125 驱动是否加载
adb shell lsmod | grep r8125

# 检查网卡驱动信息
adb shell ethtool -i enP2p36s0
```

期望输出：

```
driver: r8125
version: 9.009.00-NAPI-PTP-RSS
```

## 6. 测试 PTP 功能

### 6.1 安装 linuxptp 工具

```bash
adb shell apt-get update && apt-get install -y linuxptp
```

### 6.2 检查 PTP 硬件时钟设备

```bash
adb shell ls -la /dev/ptp*
```

期望输出：

```
crw------- 1 root root 246, 0 ... /dev/ptp0
crw------- 1 root root 246, 1 ... /dev/ptp1
```

### 6.3 使用 ethtool 检查 PTP 能力

```bash
# 检查主网口 enP2p36s0 的 PTP 能力
adb shell ethtool -T enP2p36s0
```

期望输出（关键字段）：

```
Time stamping parameters for enP2p36s0:
Capabilities:
    hardware-transmit     ← 支持硬件发送时间戳
    hardware-receive      ← 支持硬件接收时间戳
    hardware-raw-clock    ← 支持硬件原始时钟
PTP Hardware Clock: 1     ← 对应 /dev/ptp1
Hardware Transmit Timestamp Modes:
    off
    on
Hardware Receive Filter Modes:
    none
    ptpv2-l4-event
    ptpv2-l4-sync
    ptpv2-l4-delay-req
    ptpv2-event
    ptpv2-sync
    ptpv2-delay-req
```

### 6.4 读取 PTP 硬件时钟

```bash
# 读取 PTP 硬件时钟当前值
adb shell phc_ctl /dev/ptp1 get
```

### 6.5 运行 ptp4l 同步测试

```bash
# 以软件时间戳模式运行 ptp4l（用于验证功能）
adb shell ptp4l -i enP2p36s0 -S -m

# 以硬件时间戳模式运行 ptp4l（需要连接 PTP Grandmaster）
adb shell ptp4l -i enP2p36s0 -m
```

期望输出：

```
ptp4l[xxx]: port 1 (enP2p36s0): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[xxx]: port 0 (/var/run/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETE
```

## 7. 测试结果

| 测试项 | 网口 enP2p35s0 | 网口 enP2p36s0 |
|--------|---------------|---------------|
| 驱动 | r8125 | r8125 |
| PTP Hardware Clock | /dev/ptp0 | /dev/ptp1 |
| hardware-transmit | ✅ 支持 | ✅ 支持 |
| hardware-receive | ✅ 支持 | ✅ 支持 |
| hardware-raw-clock | ✅ 支持 | ✅ 支持 |
| ptp4l 初始化 | ✅ 正常 | ✅ 正常 |

## 8. 恢复原始配置

如需恢复到原始内核和驱动：

```bash
# 恢复默认启动项
adb shell sed -i 's/^default l1/default l0/' /boot/extlinux/extlinux.conf

# 删除 r8169 黑名单
adb shell rm /etc/modprobe.d/blacklist-r8169.conf

# 删除 r8125 自动加载
adb shell rm /etc/modules-load.d/r8125.conf

# 重启
adb reboot
```

## 9. 注意事项

1. **内核版本一致**: 自编译内核与原内核版本号相同（6.1.0-1027-rockchip），`uname -r` 不会变化，属正常现象。
2. **root UUID**: 替换内核时注意 `extlinux.conf` 中的 `root=UUID=` 要与设备实际根分区一致，否则无法启动。
3. **串口调试**: 如果设备无法启动，需要通过串口（1500000 波特率）进入 U-Boot 命令行，手动选择原始启动项。
4. **r8169 内建问题**: 如果 r8169 被编译为内建驱动（built-in），`blacklist` 不生效，需要确认它是模块形式（`lsmod | grep r8169`）。
5. **PTP 硬件时钟初始化**: PTP 硬件时钟初始值可能为 0（1970-01-01），需要通过 `phc_ctl` 或 `ptp4l` 与 NTP/PTP 服务器同步后才会更新为正确时间。
WIKI_EOF

echo "Wiki 文档已生成"