Skip to content

Commit

Permalink
Add USB FS support
Browse files Browse the repository at this point in the history
The implementation derived from https://github.com/Disasm/usb-otg-workspace
Fork of synopsys-usb-otg from github temporary used.
  • Loading branch information
katyo committed Feb 4, 2023
1 parent 90257a7 commit e62980c
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 0 deletions.
9 changes: 9 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,12 @@ features = ["unproven"]
git = "https://github.com/katyo/gd32vf103-pac"
branch = "upcoming"

[dependencies.synopsys-usb-otg]
git = "https://github.com/katyo/synopsys-usb-otg"
branch = "gd32v-ng-cs"
features = ["fs"]
optional = true

[features]
default = []
usb_fs = ["synopsys-usb-otg"]
3 changes: 3 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,6 @@ pub mod spi;
pub mod time;
pub mod timer;
pub mod watchdog;

#[cfg(feature = "usb_fs")]
pub mod otg_fs;
53 changes: 53 additions & 0 deletions src/otg_fs.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//! USB OTG full-speed peripheral
//!
//! Requires the usb_fs feature.

use crate::{
gpio::{
gpioa::{PA11, PA12},
Floating, Input,
},
pac,
time::Hertz,
};
pub use synopsys_usb_otg::UsbBus;
use synopsys_usb_otg::UsbPeripheral;

pub type UsbBusType = UsbBus<USB>;

#[allow(dead_code)]
pub struct USB {
pub usb_global: pac::USBFS_GLOBAL,
pub usb_device: pac::USBFS_DEVICE,
pub usb_pwrclk: pac::USBFS_PWRCLK,
pub pin_dm: PA11<Input<Floating>>,
pub pin_dp: PA12<Input<Floating>>,
pub hclk: Hertz,
}

unsafe impl Sync for USB {}

unsafe impl UsbPeripheral for USB {
const REGISTERS: *const () = pac::USBFS_GLOBAL::ptr() as *const ();

const HIGH_SPEED: bool = false;
const FIFO_DEPTH_WORDS: usize = 320;
const ENDPOINT_COUNT: usize = 4;

fn enable() {
let rcu = unsafe { &*pac::RCU::ptr() };

riscv::interrupt::free(|| {
// Enable USB peripheral
rcu.ahben.modify(|_, w| w.usbfsen().set_bit());

// Reset USB peripheral
rcu.ahbrst.modify(|_, w| w.usbfsrst().set_bit());
rcu.ahbrst.modify(|_, w| w.usbfsrst().clear_bit());
});
}

fn ahb_frequency_hz(&self) -> u32 {
self.hclk.0
}
}

0 comments on commit e62980c

Please sign in to comment.