Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
f3d80b8
util: add regcpy
cfrantz Mar 19, 2026
a6bc506
presubmit: fix the C/C++ include guard format
cfrantz Apr 22, 2026
a1177e4
util: add a simple `ufmt` based console
cfrantz Apr 22, 2026
48d6de8
hal: add usb hal and stack
cfrantz Mar 19, 2026
d49b42a
drivers: add the earlgrey usb driver
cfrantz Mar 19, 2026
2831062
tests: add a bare-bones usb test
cfrantz Mar 19, 2026
7ceb265
usb: WIP stack cleanups
cfrantz Apr 22, 2026
aa04229
doc: add rustdoc documentation to USB HAL and stack
cfrantz Mar 28, 2026
84ee0fd
feat: add support for unaligned USB data transfers
cfrantz Mar 28, 2026
f940c2f
doc: add safety comments for internal USB transfer methods
cfrantz Mar 28, 2026
81e0194
usb_driver
cfrantz Apr 22, 2026
ddc1773
feat: modularize USB stack and separate CDC-ACM logic
cfrantz Mar 28, 2026
d2051e6
feat: implement efficient single-threaded RingBuffer
cfrantz Mar 28, 2026
63f2a24
wip: usb-serial test
cfrantz Mar 27, 2026
3a15560
feat: modularize USB stack and separate CDC-ACM logic
cfrantz Mar 28, 2026
a26a878
refactor: apply UsbClassBuilder pattern for modular const descriptors
cfrantz Mar 28, 2026
f577a28
feat: add support for unaligned USB data transfers
cfrantz Mar 28, 2026
31b04f0
feat: integrate RingBuffer into CdcAcm and implement loopback test
cfrantz Mar 28, 2026
a19c025
feat: simplify USB descriptor initialization in test_usb
cfrantz Mar 31, 2026
b387d55
buildfixes
cfrantz Apr 22, 2026
994e80a
feat: implement USB DFU 1.1 protocol
cfrantz Apr 23, 2026
9f97663
feat: add USB DFU test/demo program for Earlgrey
cfrantz Apr 23, 2026
9d0d340
util: integrate hexdump into console
cfrantz Apr 23, 2026
110302f
util: precise errors infrastructure
cfrantz Apr 24, 2026
2205ad1
util: power-of-2, blocking types
cfrantz Apr 24, 2026
4b52735
util_ipc: ipc wrapper
cfrantz Apr 25, 2026
617b2fe
hal: add a hal for accessing flash memories
cfrantz Apr 25, 2026
8ba7697
services: flash client/server
cfrantz Apr 26, 2026
0667ebf
earlgrey: eflash driver
cfrantz Apr 26, 2026
5971a37
earlgrey: utililty functions
cfrantz Apr 26, 2026
e2e21ac
earlgrey: eflash test
cfrantz Apr 26, 2026
d790a4a
tooling: pass --test_arg to test runner
cfrantz Apr 26, 2026
22bf35a
earlgrey: make platform public
cfrantz Apr 26, 2026
8f29226
usb_driver
cfrantz Apr 26, 2026
0731632
tests: enhance usbdfu test
cfrantz Apr 26, 2026
92f5017
earlgrey: datatypes
cfrantz Apr 27, 2026
3d38535
util_types: fourcc
cfrantz Apr 27, 2026
f830f98
tests: retram test
cfrantz Apr 27, 2026
e95efb7
earlgrey: sysmgr
cfrantz Apr 28, 2026
2f5242d
earlgrey: update retram test to sysmgr test
cfrantz Apr 28, 2026
0f2ccb6
earlgrey: hardware enablement firmware
cfrantz Apr 28, 2026
bb12c9b
util_ipc fixups
cfrantz Apr 30, 2026
7541429
earlgrey: uart receiver driver
cfrantz Apr 30, 2026
52a50e7
sysmgr_server_multi_ipc
cfrantz Apr 30, 2026
d27c221
update retram test
cfrantz Apr 30, 2026
7e69587
earlgrey: add a platform task to hardware enablement
cfrantz Apr 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 52 additions & 4 deletions MODULE.bazel.lock

Large diffs are not rendered by default.

43 changes: 43 additions & 0 deletions hal/blocking/flash/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Licensed under the Apache-2.0 license
# SPDX-License-Identifier: Apache-2.0

load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")

rust_library(
name = "driver",
srcs = [
"driver.rs",
],
crate_name = "hal_flash_driver",
edition = "2024",
visibility = ["//visibility:public"],
deps = [
"//util/error",
"@rust_crates//:zerocopy",
],
)

rust_library(
name = "flash",
srcs = [
"flash.rs",
],
crate_name = "hal_flash",
edition = "2024",
visibility = ["//visibility:public"],
deps = [
":driver",
"//util/error",
"//util/io",
"//util/types",
],
)

rust_test(
name = "flash_test",
crate = ":hal_flash",
rustc_flags = [
"-C",
"debug-assertions",
],
)
125 changes: 125 additions & 0 deletions hal/blocking/flash/driver.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
#![no_std]

use core::num::NonZero;

use util_error::ErrorCode;
use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};

pub trait FlashDriver {
const PAGE_SIZE: usize;
const PROGRAM_WINDOW_SIZE: usize;
const MAX_READ_SIZE: usize;
const READ_ALIGNMENT: usize;
const PROGRAM_ALIGNMENT: usize;

fn size(&self) -> NonZero<usize>;
fn read(&mut self, start_addr: FlashAddress, buf: &mut [u8]) -> Result<(), ErrorCode>;
fn start_erase_page(&mut self, start_addr: FlashAddress) -> Result<(), ErrorCode>;
fn start_program(&mut self, start_address: FlashAddress, data: &[u8]) -> Result<(), ErrorCode>;
fn is_busy(&mut self) -> bool;
fn complete_op(&mut self) -> Result<(), ErrorCode>;
}

#[derive(Default, Clone, Copy, PartialEq, Eq, IntoBytes, Immutable, FromBytes, KnownLayout)]
pub struct FlashAddress {
address: u32,
}

impl FlashAddress {
/// Constructs a flash address for flash data pages.
pub fn data(address: u32) -> Self {
Self {
address: address & 0x7FFF_FFFF,
}
}

/// Constructs a flash address for flash info pages.
pub fn info(bank: u32, page: u32, offset: u32) -> Self {
Self {
address: 0x8000_0000 | (bank & 0x7f) << 24 | (page & 0xff) << 16 | (offset & 0xFFFF),
}
}

/// Returns whether the flash address is an info page address.
pub fn is_info(&self) -> bool {
self.address & 0x8000_0000 != 0
}

/// Returns the flash offset. For data pages, this is the flash address. For info pages, this
/// is the offset within the page.
pub fn offset(&self) -> u32 {
if self.is_info() {
self.address & 0xFFFF
} else {
self.address
}
}

/// Returns the bank of a flash info page (only valid when `is_info` returns true).
pub fn bank(&self) -> u32 {
(self.address >> 24) & 0x7f
}

/// Returns the page number of a flash info page (only valid when `is_info` returns true).
pub fn page(&self) -> u32 {
(self.address >> 16) & 0xff
}
}

impl core::ops::Add<usize> for FlashAddress {
type Output = Self;
fn add(self, other: usize) -> Self {
let other = other as u32;
if self.is_info() {
let offset = self.offset() + other;
FlashAddress {
address: (self.address & !0xFFFF) | (offset & 0xFFFF),
}
} else {
let offset = self.offset() + other;
FlashAddress::data(offset as u32)
}
}
}

impl core::ops::AddAssign<usize> for FlashAddress {
fn add_assign(&mut self, other: usize) {
let other = other as u32;
if self.is_info() {
let offset = self.offset() + other;
self.address = (self.address & !0xFFFF) | (offset & 0xFFFF);
} else {
let offset = self.offset() + other;
self.address = offset as u32;
}
}
}

impl core::ops::BitAnd<usize> for FlashAddress {
type Output = Self;
fn bitand(self, other: usize) -> Self {
let other = other as u32;
if self.is_info() {
let offset = self.offset() & other;
FlashAddress {
address: (self.address & !0xFFFF) | (offset & 0xFFFF),
}
} else {
let offset = self.offset() & other;
FlashAddress::data(offset as u32)
}
}
}

impl core::ops::BitAndAssign<usize> for FlashAddress {
fn bitand_assign(&mut self, other: usize) {
let other = other as u32;
if self.is_info() {
let offset = self.offset() & other;
self.address = (self.address & !0xFFFF) | (offset & 0xFFFF);
} else {
let offset = self.offset() & other;
self.address = offset as u32;
}
}
}
Loading