1个不稳定版本
0.1.0 | 2023年8月6日 |
---|
#1798 in 硬件支持
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