1个不稳定版本

0.1.0 2023年8月6日

#1798 in 硬件支持

MIT许可协议

110KB
2K SLoC

usbh

为嵌入式设备提供的实验性USB主机堆栈。

这个crate处于非常早期的阶段。参见rp-hal仓库中的这个PR,它的工作激发了我创建这个crate的灵感。


lib.rs:

为嵌入式设备提供的实验性USB主机堆栈。

usbh旨在抽象两个事物之间的差异

  • 一侧是嵌入式USB主机控制器
  • 另一侧是特定功能的USB驱动程序

目标是使驱动程序的开发可以独立于特定的主机控制器硬件,类似于usb-device crate,允许独立于USB设备控制器实现USB功能。

实现驱动程序

请查看driver模块的文档

添加对新硬件的支持

由于此项目处于早期阶段,这一领域大部分尚未探索。

bus模块包含一个HostBus特质,必须为目标硬件实现。

如果您计划实现对新硬件的支持,请打开一个issue,我们可以一起确定是否需要添加或修改HostBus接口以适应它。

用法

下面的代码块显示了一个简要示例,省略了任何硬件和驱动程序的特定细节。

有关完整示例,请查看rp-hal-usb-host-example,其中包含一个可运行的示例,针对基于RP2040的板。

use usbh::{
    UsbHost,
    PollResult,
};

fn main() {
    // must implement usbh::bus::HostBus
    let host_bus = hardware_specific_host_bus_initialization();

    let usb_host = UsbHost::new(host_bus);

    // these must implement usbh::driver::Driver;
    let mut driver1 = create_first_driver();
    let mut driver2 = create_second_driver();

    // (leaving out details on how to share `usb_host` and `driver*` with the interrupt routine)
}

#[...]
fn USB_IRQ() {
    match usb_host.poll(&mut [&mut driver1, &mut driver2]) {
        PollResult::BusError(error) => {
            // something went wrong
        }
        PollEvent::DiscoveryError(device_address) => {
            // device with specified address misbehaved during discovery (it will likely not be usable)
        }
        PollResult::NoDevice => {
            // no device is currently connected
        }
        Event::Busy => {
            // Host is currently busy with a transfer.
            // Trying to start a transfer now will return `WouldBlock`.
        }
        Event::Idle => {
            // Host is not currently handling any transfer.
            // A new transfer can be started, if desired.
        }
    }

    // After polling the USB host, the drivers may have new things to report:
    if let Some(event) = driver1.take_event() {
       // ...
    }
    if driver2.something_something() {
       // ...
    }
}

依赖关系

~3.5MB
~70K SLoC