rdrive 0.19.0

A dyn driver manager.
Documentation

rdrive

Crates.io License

rdrive 是一个用于裸机操作系统(Bare-metal OS)的动态驱动管理框架,提供设备探测、驱动注册、设备管理等核心功能。

功能特性

  • 设备树(FDT)支持:自动从 Flattened Device Tree 解析设备信息并匹配驱动
  • PCIe 设备支持:支持 PCI Express 设备的探测和管理
  • 动态驱动注册:支持编译时和运行时驱动注册
  • 多级探测机制:支持内核前(Pre-kernel)和内核后(Post-kernel)两阶段设备探测
  • 优先级管理:驱动按优先级排序,确保依赖设备先初始化
  • 线程安全:使用自旋锁保证多核环境下的安全访问
  • no_std 兼容:适用于裸机环境,不依赖标准库

架构概述

┌─────────────────────────────────────────────────────────┐
│                    应用层 (Applications)                  │
├─────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────┐  │
│  │   Manager   │  │   Probe     │  │    Register     │  │
│  │  (设备管理器) │  │  (设备探测)  │  │   (驱动注册)    │  │
│  └─────────────┘  └─────────────┘  └─────────────────┘  │
├─────────────────────────────────────────────────────────┤
│                    平台抽象层 (Platform)                  │
│         ┌──────────┐          ┌──────────┐             │
│         │   FDT    │          │   PCI    │             │
│         └──────────┘          └──────────┘             │
├─────────────────────────────────────────────────────────┤
│                    驱动接口层 (rdif-*)                    │
│    rdif-base │ rdif-intc │ rdif-clk │ rdif-pcie ...     │
└─────────────────────────────────────────────────────────┘

快速开始

1. 添加依赖

Cargo.toml 中添加:

[dependencies]
rdrive = "0.18"

2. 初始化 rdrive

use core::ptr::NonNull;
use rdrive::{init, Platform};

// 从 FDT 地址初始化
let fdt_addr: NonNull<u8> = /* 设备树地址 */;
init(Platform::Fdt { addr: fdt_addr }).expect("rdrive init failed");

3. 注册驱动

use rdrive::{register_add, ProbeKind, ProbeLevel, ProbePriority};

// 定义 FDT 驱动注册信息
static MY_DRIVER_REGISTER: DriverRegister = DriverRegister {
    name: "my-driver",
    level: ProbeLevel::PreKernel,
    priority: ProbePriority::DEFAULT,
    probe_kinds: &[ProbeKind::Fdt {
        compatibles: &["vendor,my-device"],
        on_probe: my_probe_function,
    }],
};

// 注册驱动
register_add(MY_DRIVER_REGISTER);

4. 执行设备探测

use rdrive::probe_pre_kernel;

// 在内核初始化前探测设备
probe_pre_kernel().expect("probe failed");

5. 获取设备实例

use rdrive::get_device;
use rdif_intc::Intc;

// 获取中断控制器设备
let intc: Device<Intc> = get_device(irq_id).expect("device not found");

核心模块

Manager(设备管理器)

Manager 是 rdrive 的核心,负责:

  • 管理所有注册的驱动
  • 存储已探测到的设备实例
  • 提供设备查找接口

Probe(设备探测)

支持多种设备探测方式:

  • FDT 探测:根据设备树 compatible 字符串匹配驱动
  • PCI 探测:扫描 PCI 总线发现设备

探测级别:

  • PreKernel:内核初始化前探测(如中断控制器、时钟)
  • PostKernel:内核初始化后探测(如存储、网络设备)

Register(驱动注册)

驱动注册支持:

  • 编译时静态注册(通过链接器脚本)
  • 运行时动态注册
  • 优先级排序(数值越小优先级越高)

预定义优先级

pub const CLK: ProbePriority = ProbePriority(6);    // 时钟
pub const INTC: ProbePriority = ProbePriority(10);  // 中断控制器
pub const DEFAULT: ProbePriority = ProbePriority(256); // 默认

驱动接口(rdif)

rdrive 通过 rdif-* 系列 crate 定义标准驱动接口:

接口 描述
rdif-base 基础驱动接口和错误类型
rdif-intc 中断控制器接口
rdif-clk 时钟驱动接口
rdif-pcie PCIe 接口
rdif-serial 串口驱动接口
rdif-block 块设备接口
rdif-timer 定时器接口

平台支持

  • 架构:AArch64、LoongArch64、RISC-V、x86_64
  • 引导方式:FDT (Flattened Device Tree)
  • 总线:PCI Express

许可证

本项目采用 MIT 许可证,详见 LICENSE 文件。

相关项目

  • sparreal-os - 基于 rdrive 的 Rust 实时操作系统
  • rdif - 驱动接口定义

贡献

欢迎提交 Issue 和 PR!请确保代码通过 cargo checkcargo clippy 检查。


周睿 创建并维护