# Linux RC - SG PCIe CARD 驱动与示例

本目录包含 用户空间库和示例程序。

## 📁 目录结构

```
linux-rc/
├── README.md              # 本文档
├── docs/                  # 文档目录（预留）
├── driver/                # 内核驱动程序
│   ├── kernel4.19/        # Linux Kernel 4.19 版本驱动
│   │   ├── Makefile       # 内核模块编译脚本
│   │   ├── rk_pcie_rc.c   # PCIe RC 主驱动源码
│   │   ├── rk_pcie_rc.h   # 驱动头文件
│   │   ├── rk_pcie_type.h # 类型定义
│   │   └── ...            # 其他相关文件
│   ├── kernel5.10/        # Linux Kernel 5.10 版本驱动
│   │   └── ...            # 同上
│   └── kernel6.1/         # Linux Kernel 6.1 版本驱动
│       └── ...            # 同上
├── include/               # 用户空间头文件
│   └── pcie_dev.h         # PCIe 设备 API 接口定义
├── lib/                   # 编译好的静态库
│   └── libpn.a            # PCIE_PN 静态库（包含所有依赖）
└── src/                   # 用户空间示例程序
    ├── Makefile           # 示例程序编译脚本
    ├── build/             # 编译输出目录
    │   └── pcie_demo      # 演示程序可执行文件
    └── pcie_demo.c        # 交互式演示程序源码
```

## 📂 详细说明

### **driver/** - 内核驱动程序

包含内核模块的源代码，支持多个 Linux 内核版本：

| 子目录 | 适用内核 | 说明 |
|--------|---------|------|
| `kernel4.19/` | Linux 4.19.x | 适用于旧版稳定内核 |
| `kernel5.10/` | Linux 5.10.x | 适用于 LTS 长期支持内核 |
| `kernel6.1/` | Linux 6.1.x | 适用于最新稳定内核 |


**编译内核模块：**
```bash
cd driver/kernel$(uname -r | cut -d'.' -f1-2)
make
sudo insmod pcie_rkep.ko
```
若没有insmod命令，请使用`sudo apt install kmod`

### **include/** - 用户空间头文件

提供用户空间程序访问 PCIe 设备所需的 API 接口定义。

**主要文件：**
- [`pcie_dev.h`](include/pcie_dev.h) - 核心 API 接口定义
  - 设备管理函数声明
  - 数据结构定义（DEVICE_NET_T, PNIO_SLAVE_INFO_T 等）
  - Master/Slave 模式接口

**使用示例：**
```c
#include "pcie_dev.h"

int main() {
    device_init();
    // ...
}
```

### **lib/** - 静态库

包含编译好的静态库文件，可直接链接到用户程序。

**库文件：**
- [`libpn.a`](lib/libpn.a) - PCIE_PN 静态库
  - 包含项目核心功能代码
  - 自包含所有依赖，无需额外链接

**库大小：** ~324 KB（包含所有依赖）


### **src/** - 用户空间示例程序

包含使用 PCIE_PN 库的示例应用程序。

**文件列表：**
- [`pcie_demo.c`](src/pcie_demo.c) - 交互式演示程序
  - 完整的菜单驱动界面
  - 演示所有 API 使用方法
  - 支持设备初始化、配置、数据读写等操作
  
- [`Makefile`](src/Makefile) - 示例程序编译脚本
  - 自动依赖 `../include` 和 `../lib`
  - 支持多文件自动编译
  - 提供 clean、run、help 等目标

**编译示例：**
```bash
cd src
make
sudo ./build/pcie_demo
```

### **docs/** - 文档目录（预留）

预留给额外的技术文档、应用笔记和使用指南。

## 🔧 快速开始

### **1. 编译内核驱动**

```bash
# 选择对应内核版本的驱动
cd driver/kernel5.10

# 编译
make

# 加载模块
sudo insmod rk_pcie_rc.ko

# 验证
lsmod | grep rk_pcie
dmesg | tail -20
```

### **2. 使用静态库**

方法一：直接使用 lib 目录的库
```bash
gcc -I../include -L../lib your_app.c -lpn -o your_app
```

方法二：从主项目重新编译
```bash
cd src/
make
```

### **3. 运行示例程序**

```bash
cd src
make
sudo make run
```

## 📋 依赖关系

```
用户应用程序 (pcie_demo.c)
    ↓ 包含 pcie_dev.h
    ↓ 链接 libpn.a
```

## 🎯 典型工作流程

1. **加载内核驱动**
   ```bash
   sudo insmod driver/kernel5.10/rk_pcie_rc.ko
   ```

2. **验证设备**
   ```bash
   lspci -d 1d87:356a
   ```

3. **编译应用程序**
   ```bash
   cd src
   make
   ```

4. **运行测试**
   ```bash
   sudo ./build/pcie_demo
   ```

## ⚠️ 注意事项

### **权限要求**
- 内核模块加载需要 root 权限
- PCIe 设备操作需要 root 权限
- 所有示例程序必须使用 `sudo` 运行

### **内核兼容性**
- 确保选择与当前运行内核匹配的驱动版本
- 检查内核版本：`uname -r`
- 不同内核版本的驱动可能不兼容

### **库版本**
- `libpn.a` 是从主项目 (`../`) 拷贝而来
- 更新主项目后需要重新拷贝：`make -C src clean && make -C src`


## 📞 故障排查

### **问题 1：找不到设备**
```bash
# 检查 PCIe 链路
lspci -vvv -d 1d87:356a

# 检查驱动是否加载
lsmod | grep rk_ep

# 查看内核日志
dmesg | tail -50
```




---

**最后更新**: 2026 年 04 月 03 日  

