cadmus_core/device/usb/kobo/mod.rs
1//! USB mass storage gadget management for Kobo devices.
2//!
3//! This module provides native USB lifecycle management, replacing the previous
4//! shell script-based implementation. It supports two backends:
5//!
6//! - **MTK (MediaTek)**: Uses ConfigFS for newer devices (platform `mt8113t-ntx`).
7//! - **Legacy**: Uses kernel module loading via `insmod`/`rmmod` for older devices.
8//!
9//! # Example
10//!
11//! ```ignore
12//! use cadmus_core::device::{CURRENT_DEVICE, DeviceMetadata};
13//!
14//! # fn example() -> Result<(), cadmus_core::device::usb::UsbError> {
15//! let usb_manager = CURRENT_DEVICE.usb_manager()?;
16//! usb_manager.enable()?;
17//! // ... USB sharing active ...
18//! usb_manager.disable()?;
19//! # Ok(())
20//! # }
21//! ```
22
23use crate::device::metadata::{detect_platform, DeviceMetadata, Platform};
24use crate::device::usb::error::UsbError;
25use crate::device::usb::manager::UsbManager;
26
27mod operations;
28
29mod legacy;
30mod mtk;
31
32use legacy::LegacyUsbManager;
33use mtk::MtkUsbManager;
34
35/// Creates a USB manager appropriate for the current platform.
36///
37/// Detects the platform from the `PLATFORM` environment variable and returns
38/// the appropriate implementation:
39///
40/// - `mt8113t-ntx` → MTK ConfigFS-based manager
41/// - All others → Legacy kernel module-based manager
42///
43/// # Errors
44///
45/// Returns [`UsbError`] if:
46/// - the `PLATFORM` environment variable is not set, or
47/// - the MTK UDC cannot be discovered.
48///
49/// # Example
50///
51/// ```ignore
52/// use cadmus_core::device::{CURRENT_DEVICE, DeviceMetadata};
53///
54/// # fn example() -> Result<(), cadmus_core::device::usb::UsbError> {
55/// let usb_manager = CURRENT_DEVICE.usb_manager()?;
56/// # Ok(())
57/// # }
58/// ```
59#[cfg_attr(feature = "otel", tracing::instrument(skip(metadata)))]
60pub fn create_usb_manager(metadata: DeviceMetadata) -> Result<Box<dyn UsbManager>, UsbError> {
61 let platform = detect_platform().map_err(|e| UsbError::DeviceInfo(e.to_string()))?;
62
63 match platform {
64 Platform::MT8113TNTX => Ok(Box::new(MtkUsbManager::new(metadata)?)),
65 _ => Ok(Box::new(LegacyUsbManager::new(metadata, platform))),
66 }
67}