diff --git a/hal/blocking/src/i3c_hardware.rs b/hal/blocking/src/i3c_hardware.rs
new file mode 100644
index 000000000..0b8ce3148
--- /dev/null
+++ b/hal/blocking/src/i3c_hardware.rs
@@ -0,0 +1,130 @@
+// Licensed under the Apache-2.0 license
+// SPDX-License-Identifier: Apache-2.0
+
+//! # I3C Hardware Abstraction Traits
+//!
+//! Platform-agnostic traits for I3C hardware controllers. These are the seams
+//! that services and backends code against; no silicon type names appear here.
+//!
+//! ## Trait hierarchy
+//!
+//! ```text
+//! I3cErrorType — shared associated Error type
+//! ├── I3cBusRecovery — unstick a locked bus
+//! ├── I3cController — primary controller: DAA, private transfers, IBI, DAT
+//! └── I3cTarget — secondary target: hot-join, dynamic address query
+//! ```
+//!
+//! All three traits are implemented on the platform's controller shell
+//! (e.g. `I3cController<'c, H, Ready>` in `target/ast10x0`) rather than on
+//! the raw hardware driver, so `I3cConfig` and other chip-specific state
+//! remain internal.
+//!
+//! ## What does NOT belong here
+//!
+//! - Clock/timing configuration (`init_clock`, `calc_i2c_clk`) — chip-specific
+//! - FIFO mechanics (`wr_tx_fifo`, `rd_rx_fifo`) — internal driver plumbing
+//! - ISR handlers (`i3c_aspeed_isr`, `end_xfer`) — internal driver mechanics
+//! - Queue/halt control (`start_xfer`, `enter_halt`, `reset_ctrl`) — internal
+//! - Hardware init (`HardwareCore::init`, `init_pid`) — chip-specific bringup
+
+/// Shared associated error type for all I3C HAL traits.
+pub trait I3cErrorType {
+ /// The error type returned by I3C hardware operations.
+ type Error: core::fmt::Debug;
+}
+
+/// Target receive/transmit data-path operations.
+pub trait I3cTargetRxTx: I3cErrorType {
+ /// Returns true if at least one inbound write frame is queued.
+ fn target_rx_pending(&self) -> bool;
+
+ /// Drain one inbound write frame into `out`.
+ ///
+ /// Returns the number of bytes copied into `out`, or `None` if no frame
+ /// is pending.
+ fn target_rx_read(&mut self, out: &mut [u8]) -> Result