Compare commits
4 commits
0971484be4
...
43bec436eb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43bec436eb | ||
|
|
eb4921afce | ||
|
|
8dd4913dba | ||
|
|
b9a37ff54d |
3 changed files with 36 additions and 48 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,3 +1,2 @@
|
||||||
/target
|
/target
|
||||||
/.direnv
|
/.direnv
|
||||||
/src/serial_number.rs
|
|
||||||
|
|
|
||||||
82
src/main.rs
82
src/main.rs
|
|
@ -16,7 +16,6 @@ use usbd_storage::subclass::Command;
|
||||||
use usbd_storage::transport::bbb::{BulkOnly, BulkOnlyError};
|
use usbd_storage::transport::bbb::{BulkOnly, BulkOnlyError};
|
||||||
use usbd_storage::transport::TransportError;
|
use usbd_storage::transport::TransportError;
|
||||||
|
|
||||||
mod serial_number;
|
|
||||||
|
|
||||||
#[link_section = ".start_block"]
|
#[link_section = ".start_block"]
|
||||||
#[used]
|
#[used]
|
||||||
|
|
@ -97,20 +96,7 @@ fn main() -> ! {
|
||||||
&mut pac.RESETS,
|
&mut pac.RESETS,
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut led_pin = pins.gpio25.into_push_pull_output();
|
let mut led_pin = pins.gpio12.into_push_pull_output();
|
||||||
|
|
||||||
let mut start_time: u64 = 0;
|
|
||||||
let mut count: u64 = 0;
|
|
||||||
loop {
|
|
||||||
if timer.get_counter().ticks() - start_time > 25_000 {
|
|
||||||
count += 1;
|
|
||||||
let _ = led_pin.toggle();
|
|
||||||
start_time = timer.get_counter().ticks();
|
|
||||||
if count == 125 {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let usb_bus = UsbBusAllocator::new(hal::usb::UsbBus::new(
|
let usb_bus = UsbBusAllocator::new(hal::usb::UsbBus::new(
|
||||||
pac.USB,
|
pac.USB,
|
||||||
|
|
@ -126,15 +112,12 @@ fn main() -> ! {
|
||||||
let mut usb_device = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0xcafe, 0x4002))
|
let mut usb_device = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0xcafe, 0x4002))
|
||||||
.strings(&[StringDescriptors::new(LangID::EN)
|
.strings(&[StringDescriptors::new(LangID::EN)
|
||||||
.manufacturer("jalr")
|
.manufacturer("jalr")
|
||||||
.product("RAM Mass Storage")
|
.product("RAM Mass Storage")])
|
||||||
.serial_number(serial_number::SERIAL)])
|
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.device_class(0x08)
|
.device_class(0x08)
|
||||||
.self_powered(false)
|
.self_powered(false)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
let mut start_time: u64 = 0;
|
|
||||||
|
|
||||||
let mut storage: [u8; (DISK_BLOCK_SIZE * DISK_BLOCK_NUM) as usize] = [0u8; (DISK_BLOCK_SIZE * DISK_BLOCK_NUM) as usize];
|
let mut storage: [u8; (DISK_BLOCK_SIZE * DISK_BLOCK_NUM) as usize] = [0u8; (DISK_BLOCK_SIZE * DISK_BLOCK_NUM) as usize];
|
||||||
|
|
||||||
const LBA: u32 = DISK_BLOCK_NUM - 1;
|
const LBA: u32 = DISK_BLOCK_NUM - 1;
|
||||||
|
|
@ -150,10 +133,10 @@ fn main() -> ! {
|
||||||
|
|
||||||
const OEM: [u8; 8] = *b"mkfs.fat";
|
const OEM: [u8; 8] = *b"mkfs.fat";
|
||||||
const FILESYSTEM_ID: [u8; 4] = [0xDE, 0xAD, 0xBE, 0xEF];
|
const FILESYSTEM_ID: [u8; 4] = [0xDE, 0xAD, 0xBE, 0xEF];
|
||||||
const FILESYSTEM_NAME: [u8; 11] = *b"RAM_USB\0\0\0\0";
|
const FILESYSTEM_LABEL: [u8; 11] = *b"RAM_USB ";
|
||||||
|
|
||||||
storage[0x1B8..0x1BC].copy_from_slice(&[0xEF, 0xBE, 0xAD, 0xDE]);
|
storage[0x1B9] = 0x10;
|
||||||
storage[0x1BE..0x1C3].copy_from_slice(&[0x00, 0x00, 0x02, 0x00, 0x01]);
|
storage[0x1BE..0x1C3].copy_from_slice(&[0x00, 0x00, 0x02, 0x00, 0x0c]);
|
||||||
storage[0x1C3] = last_head as u8;
|
storage[0x1C3] = last_head as u8;
|
||||||
storage[0x1C4] = ((last_cyl >> 8) & 0xc0) as u8 | ((last_sect as u8) & 0x3f);
|
storage[0x1C4] = ((last_cyl >> 8) & 0xc0) as u8 | ((last_sect as u8) & 0x3f);
|
||||||
storage[0x1C5] = last_cyl as u8;
|
storage[0x1C5] = last_cyl as u8;
|
||||||
|
|
@ -167,22 +150,23 @@ fn main() -> ! {
|
||||||
// FAT12 Partition
|
// FAT12 Partition
|
||||||
storage[0x200..0x203].copy_from_slice(&[0xEB, 0x3C, 0x90]);
|
storage[0x200..0x203].copy_from_slice(&[0xEB, 0x3C, 0x90]);
|
||||||
storage[0x203..0x20B].copy_from_slice(&OEM);
|
storage[0x203..0x20B].copy_from_slice(&OEM);
|
||||||
storage[0x20B..0x227].copy_from_slice(&[0x00, 0x02, 0x04, 0x01, 0x00,
|
storage[0x20B..0x21d].copy_from_slice(&[0x00, 0x02, 0x04, 0x01, 0x00,
|
||||||
0x02, 0x00, 0x02, (DISK_BLOCK_NUM & 0xff) as u8,
|
0x02, 0x00, 0x02, (LBA & 0xff) as u8,
|
||||||
(DISK_BLOCK_NUM >> 8) as u8,
|
(LBA >> 8) as u8,
|
||||||
0xF8, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0xF8, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01]);
|
||||||
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29]);
|
storage[0x224..0x227].copy_from_slice(&[0x80, 0x00, 0x29]);
|
||||||
storage[0x227..0x22B].copy_from_slice(&FILESYSTEM_ID);
|
storage[0x227..0x22B].copy_from_slice(&FILESYSTEM_ID);
|
||||||
storage[0x22B..0x236].copy_from_slice(&FILESYSTEM_NAME);
|
storage[0x22B..0x236].copy_from_slice(&FILESYSTEM_LABEL);
|
||||||
storage[0x236..0x23E].copy_from_slice(b"FAT12 ");
|
storage[0x236..0x23E].copy_from_slice(b"FAT12 ");
|
||||||
storage[0x3FE..0x400].copy_from_slice(&[0x55, 0xAA]);
|
storage[0x3FE..0x400].copy_from_slice(&[0x55, 0xAA]);
|
||||||
|
|
||||||
storage[0x400..0x403].copy_from_slice(&[0xF8, 0xFF, 0xFF]);
|
storage[0x400..0x403].copy_from_slice(&[0xF8, 0xFF, 0xFF]);
|
||||||
storage[0x600..0x603].copy_from_slice(&[0xF8, 0xFF, 0xFF]);
|
storage[0x600..0x603].copy_from_slice(&[0xF8, 0xFF, 0xFF]);
|
||||||
storage[0x800..0x80B].copy_from_slice(&FILESYSTEM_NAME);
|
storage[0x800..0x80B].copy_from_slice(&FILESYSTEM_LABEL);
|
||||||
storage[0x80B..0x81A].copy_from_slice(&[0x08, 0x00, 0x00, 0xF9, 0x98,
|
storage[0x80B] = 0x08; // file attribute 0x08 = volume label
|
||||||
0x3A, 0x58, 0x3A, 0x58, 0x00, 0x00, 0xF9, 0x98, 0x3A, 0x58
|
|
||||||
]);
|
// https://de.wikipedia.org/wiki/File_Allocation_Table
|
||||||
|
// Remove bootloader code: dd if=/dev/zero conv=notrunc of=foo bs=1 count=420 seek=602
|
||||||
|
|
||||||
let mut state: State = State {
|
let mut state: State = State {
|
||||||
storage_offset: 0,
|
storage_offset: 0,
|
||||||
|
|
@ -193,20 +177,26 @@ fn main() -> ! {
|
||||||
|
|
||||||
defmt::info!("entering main loop");
|
defmt::info!("entering main loop");
|
||||||
|
|
||||||
|
let mut start_time: u64 = 0;
|
||||||
loop {
|
loop {
|
||||||
let interval = match (usb_device.state(), led_pin.is_set_high().unwrap_or_else(|_| false)) {
|
let interval = if timer.get_counter().ticks() < 2_000_000 {
|
||||||
// The USB device has just been created or reset.
|
25_000
|
||||||
(UsbDeviceState::Default, true) => 100_000,
|
}
|
||||||
(UsbDeviceState::Default, false) => 100_000,
|
else {
|
||||||
// The USB device has received an address from the host.
|
match (usb_device.state(), led_pin.is_set_high().unwrap_or_else(|_| false)) {
|
||||||
(UsbDeviceState::Addressed, true) => 250_000,
|
// The USB device has just been created or reset.
|
||||||
(UsbDeviceState::Addressed, false) => 250_000,
|
(UsbDeviceState::Default, true) => 100_000,
|
||||||
// The USB device has been configured and is fully functional.
|
(UsbDeviceState::Default, false) => 100_000,
|
||||||
(UsbDeviceState::Configured, true) => 1_000_000,
|
// The USB device has received an address from the host.
|
||||||
(UsbDeviceState::Configured, false) => 0,
|
(UsbDeviceState::Addressed, true) => 250_000,
|
||||||
// The USB device has been suspended by the host or it has been unplugged from the USB bus.
|
(UsbDeviceState::Addressed, false) => 250_000,
|
||||||
(UsbDeviceState::Suspend, true) => 25_000,
|
// The USB device has been configured and is fully functional.
|
||||||
(UsbDeviceState::Suspend, false) => 2_000_000,
|
(UsbDeviceState::Configured, true) => 8,
|
||||||
|
(UsbDeviceState::Configured, false) => 16,
|
||||||
|
// The USB device has been suspended by the host or it has been unplugged from the USB bus.
|
||||||
|
(UsbDeviceState::Suspend, true) => 10_000,
|
||||||
|
(UsbDeviceState::Suspend, false) => 2_000_000,
|
||||||
|
}
|
||||||
};
|
};
|
||||||
if timer.get_counter().ticks() - start_time > interval {
|
if timer.get_counter().ticks() - start_time > interval {
|
||||||
let _ = led_pin.toggle();
|
let _ = led_pin.toggle();
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
pub const SERIAL: &str = "example-4711";
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue