# SD/MMC Driver Library ๐ฆ
[](LICENSE)
[](https://www.rust-lang.org/)
[](#)
## ๐ Table of Contents
- [Project Overview](#project-overview)
- [Features](#features)
- [Quick Start](#quick-start)
- [Requirements](#requirements)
- [Installation](#installation)
- [Basic Usage](#basic-usage)
- [Project Structure](#project-structure)
- [API Documentation](#api-documentation)
- [Core Structures](#core-structures)
- [Main Interfaces](#main-interfaces)
- [Supported Transfer Modes](#supported-transfer-modes)
- [Usage Examples](#usage-examples)
- [Test Results](#test-results)
- [Running Tests](#running-tests)
- [Test Functionality Description](#test-functionality-description)
- [Board Support](#board-support)
- [Troubleshooting](#troubleshooting)
- [Common Issues](#common-issues)
- [Debugging Tips](#debugging-tips)
- [License](#license)
## ๐ Project Overview
The SD/MMC Driver Library is a Rust SD/MMC controller driver library designed specifically for ARM64 platforms, supporting eMMC, SD, and SDIO devices. This library provides comprehensive storage controller functionality, including command sending, clock configuration, and block read/write operations.
This project uses a `no_std` design, making it fully suitable for bare-metal and embedded environments, with specific optimizations for the U-Boot bootloader environment. Through type-safe register access, it ensures the reliability and safety of hardware operations.
## โจ Features
- ๐ง **Complete MMC/eMMC Support**: Supports eMMC 4.x/5.x standards, including high-speed mode, DDR mode, HS200, and HS400 modes
- ๐ณ **SD/SDIO Support**: Supports SD 1.0/2.0 standards and SDIO devices
- ๐ **Multiple Data Transfer Modes**: Supports both PIO and DMA data transfer modes
- ๐ **Rockchip Platform Optimization**: Specifically optimized for the RK3568 platform, supporting DWCMSHC controller
- ๐ **Type-Safe Register Access**: Provides type-safe hardware register operations based on direct memory access
- ๐ฆ **no_std Compatible**: Completely independent of the standard library, suitable for bare-metal and embedded environments
- โก **ARM64 Architecture Optimization**: Specifically optimized for ARM64 platforms
- ๐ฅ **U-Boot Environment Support**: Provides stable and reliable storage access functionality in the U-Boot bootloader environment
## ๐ Quick Start
### ๐ Requirements
- Rust 2024 Edition
- ARM64 development environment
- Rockchip RK3568 hardware platform with U-Boot support
- ostool tool (for testing)
### ๐ฆ Installation
1. Install the `ostool` dependency:
```bash
cargo install ostool
```
2. Add the project to `Cargo.toml`:
```toml
[dependencies]
sdmmc = "0.1.0"
```
### ๐ Basic Usage
```rust
use sdmmc::emmc::EMmcHost;
use core::ptr::NonNull;
// Create EMMC controller instance
let emmc_addr = 0xfe2e0000; // RK3568 EMMC controller base address
let mut emmc = EMmcHost::new(emmc_addr);
// Initialize controller and storage card
match emmc.init() {
Ok(_) => {
println!("EMMC initialized successfully");
// Read storage card information
match emmc.get_card_info() {
Ok(card_info) => {
println!("Card type: {:?}", card_info.card_type);
println!("Capacity: {} MB", card_info.capacity_bytes / (1024 * 1024));
}
Err(e) => println!("Failed to get card info: {:?}", e),
}
// Read data block
let mut buffer: [u8; 512] = [0; 512];
match emmc.read_blocks(0, 1, &mut buffer) {
Ok(_) => println!("Read data block successfully"),
Err(e) => println!("Failed to read data block: {:?}", e),
}
}
Err(e) => println!("EMMC initialization failed: {:?}", e),
}
```
## ๐ Project Structure
```
src/
โโโ lib.rs # Main entry and core functionality
โโโ err.rs # Error type definitions
โโโ emmc/
โโโ mod.rs # EMMC module main file
โโโ cmd.rs # Command sending and response handling
โโโ block.rs # Block read/write operations
โโโ regs.rs # Register access interface
โโโ constant.rs # Hardware constant definitions
โโโ clock.rs # Clock control interface
โโโ rockchip.rs # Rockchip platform-specific implementation
โโโ config.rs # Platform configuration
โโโ aux.rs # Auxiliary functions
โโโ info.rs # Card information handling
tests/
โโโ test.rs # Integration tests, including EMMC functionality tests
```
## ๐ API Documentation
### ๐งฑ Core Structures
| Structure | Description |
|-----------|-------------|
| **`EMmcHost`** | Main EMMC controller interface structure, providing all storage control functionality |
| **`EMmcCard`** | Storage card information structure, containing detailed card information |
### ๐ง Main Interfaces
#### ๐ EMMC Controller Management
| Method | Description |
|--------|-------------|
| `EMmcHost::new(addr)` | Create new EMMC controller instance |
| `EMmcHost::init()` | Initialize EMMC controller and storage card |
| `EMmcHost::get_card_info()` | Get storage card information |
| `EMmcHost::get_status()` | Get controller status |
#### ๐พ Data Read/Write Operations
| Method | Description |
|--------|-------------|
| `EMmcHost::read_blocks(block_id, blocks, buffer)` | Read data blocks |
| `EMmcHost::write_blocks(block_id, blocks, buffer)` | Write data blocks |
#### โฑ Clock and Bus Control
| Method | Description |
|--------|-------------|
| `EMmcHost::mmc_set_clock(freq)` | Set clock frequency |
| `EMmcHost::mmc_set_bus_width(width)` | Set bus width |
| `EMmcHost::mmc_set_timing(timing)` | Set timing mode |
### ๐ Supported Transfer Modes
| Mode | Description |
|------|-------------|
| **PIO Mode** | Enabled by default, suitable for small data transfers |
| **DMA Mode** | Enabled via `dma` feature, suitable for large data transfers |
## ๐ก Usage Examples
### ๐ง EMMC Initialization Example
```rust
use sdmmc::emmc::EMmcHost;
use core::ptr::NonNull;
fn init_emmc_controller(emmc_addr: usize) -> Result<(), &'static str> {
// Create EMMC controller instance
let mut emmc = EMmcHost::new(emmc_addr);
// Initialize controller
match emmc.init() {
Ok(_) => {
println!("EMMC controller initialized successfully");
// Get card information
match emmc.get_card_info() {
Ok(card_info) => {
println!("Card type: {:?}", card_info.card_type);
println!("Manufacturer ID: 0x{:02X}", card_info.manufacturer_id);
println!("Capacity: {} MB", card_info.capacity_bytes / (1024 * 1024));
println!("Block size: {} bytes", card_info.block_size);
}
Err(e) => {
println!("Failed to get card information: {:?}", e);
return Err("Failed to get card information");
}
}
Ok(())
}
Err(e) => {
println!("EMMC controller initialization failed: {:?}", e);
Err("Controller initialization failed")
}
}
}
```
### ๐พ Data Read/Write Example
```rust
use sdmmc::emmc::EMmcHost;
fn read_write_test(emmc: &mut EMmcHost) -> Result<(), &'static str> {
// Read first data block
let mut read_buffer: [u8; 512] = [0; 512];
match emmc.read_blocks(0, 1, &mut read_buffer) {
Ok(_) => {
println!("Read data block successfully");
println!("First 16 bytes: {:02X?}", &read_buffer[0..16]);
}
Err(e) => {
println!("Failed to read data block: {:?}", e);
return Err("Read failed");
}
}
// Write test data to third data block
let mut write_buffer: [u8; 512] = [0; 512];
// Fill test data
for i in 0..512 {
write_buffer[i] = (i % 256) as u8;
}
match emmc.write_blocks(2, 1, &write_buffer) {
Ok(_) => println!("Write data block successfully"),
Err(e) => {
println!("Failed to write data block: {:?}", e);
return Err("Write failed");
}
}
// Read back for verification
let mut verify_buffer: [u8; 512] = [0; 512];
match emmc.read_blocks(2, 1, &mut verify_buffer) {
Ok(_) => {
// Verify data consistency
let mut data_match = true;
for i in 0..512 {
if write_buffer[i] != verify_buffer[i] {
data_match = false;
break;
}
}
if data_match {
println!("Data verification successful");
} else {
println!("Data verification failed");
return Err("Data verification failed");
}
}
Err(e) => {
println!("Verification read failed: {:?}", e);
return Err("Verification failed");
}
}
Ok(())
}
```
### ๐ฏ Complete Usage Example
```rust
use sdmmc::emmc::EMmcHost;
use core::ptr::NonNull;
fn main() -> Result<(), &'static str> {
// EMMC controller base address (RK3568)
let emmc_addr = 0xfe2e0000;
// Create controller instance
let mut emmc = EMmcHost::new(emmc_addr);
// Initialize controller
println!("Initializing EMMC controller...");
if let Err(e) = emmc.init() {
println!("EMMC controller initialization failed: {:?}", e);
return Err("Initialization failed");
}
// Get card information
println!("Getting storage card information...");
match emmc.get_card_info() {
Ok(card_info) => {
println!("Card type: {:?}", card_info.card_type);
println!("Manufacturer ID: 0x{:02X}", card_info.manufacturer_id);
println!("Capacity: {} MB", card_info.capacity_bytes / (1024 * 1024));
println!("Block size: {} bytes", card_info.block_size);
}
Err(e) => {
println!("Failed to get card information: {:?}", e);
return Err("Failed to get card information");
}
}
// Execute read/write test
println!("Executing read/write test...");
if let Err(e) = read_write_test(&mut emmc) {
println!("Read/write test failed: {}", e);
return Err(e);
}
println!("All tests completed");
Ok(())
}
fn read_write_test(emmc: &mut EMmcHost) -> Result<(), &'static str> {
// Read first data block
let mut read_buffer: [u8; 512] = [0; 512];
match emmc.read_blocks(0, 1, &mut read_buffer) {
Ok(_) => {
println!("Read data block successfully");
println!("First 16 bytes: {:02X?}", &read_buffer[0..16]);
}
Err(e) => {
println!("Failed to read data block: {:?}", e);
return Err("Read failed");
}
}
// Write test data to third data block
let mut write_buffer: [u8; 512] = [0; 512];
// Fill test data
for i in 0..512 {
write_buffer[i] = (i % 256) as u8;
}
match emmc.write_blocks(2, 1, &write_buffer) {
Ok(_) => println!("Write data block successfully"),
Err(e) => {
println!("Failed to write data block: {:?}", e);
return Err("Write failed");
}
}
// Read back for verification
let mut verify_buffer: [u8; 512] = [0; 512];
match emmc.read_blocks(2, 1, &mut verify_buffer) {
Ok(_) => {
// Verify data consistency
let mut data_match = true;
for i in 0..512 {
if write_buffer[i] != verify_buffer[i] {
data_match = false;
break;
}
}
if data_match {
println!("Data verification successful");
} else {
println!("Data verification failed");
return Err("Data verification failed");
}
}
Err(e) => {
println!("Verification read failed: {:?}", e);
return Err("Verification failed");
}
}
Ok(())
}
```
## ๐งช Test Results
### โถ๏ธ Running Tests
#### ๐ Hardware Testing with U-Boot Environment
```bash
# Board testing with u-boot
make uboot
```
### Test Output Example
<details>
<summary>Click to view test results</summary>
```
_____ __
/ ___/ ____ ____ _ _____ _____ ___ ____ _ / /
\__ \ / __ \ / __ `// ___// ___// _ \ / __ `// /
___/ // /_/ // /_/ // / / / / __// /_/ // /
/____// .___/ \__,_//_/ /_/ \___/ \__,_//_/
/_/
Version : 0.12.2
Platfrom : RK3588 OPi 5 Plus
Start CPU : 0x0
FDT : 0xffff900000f29000
๐ 0.000ns [sparreal_kernel::driver:16] add registers
๐ 0.000ns [rdrive::probe::fdt:168] Probe [interrupt-controller@fe600000]->[GICv3]
๐ 0.000ns [somehal::arch::mem::mmu:181] Map `iomap `: RW- | [0xffff9000fe600000, 0xffff9000fe610000) -> [0xfe600000, 0xfe610000)
๐ 0.000ns [somehal::arch::mem::mmu:181] Map `iomap `: RW- | [0xffff9000fe680000, 0xffff9000fe780000) -> [0xfe680000, 0xfe780000)
๐ 0.000ns [rdrive::probe::fdt:168] Probe [timer]->[ARMv8 Timer]
๐ 0.000ns [sparreal_rt::arch::timer:78] ARMv8 Timer IRQ: IrqConfig { irq: 0x1e, trigger: LevelHigh, is_private: true }
๐ 0.000ns [rdrive::probe::fdt:168] Probe [psci]->[ARM PSCI]
๐ 0.000ns [spar:power:76] PCSI [Smc]
๐ 0.000ns [sparreal_kernel::irq:39] [GICv3](405) open
๐ 0.000ns [arm_gic_driver::version::v3:342] Initializing GICv3 Distributor@0xffff9000fe600000, security state: NonSecure...
๐ 0.000ns [arm_gic_driver::version::v3:356] GICv3 Distributor disabled
๐ 0.000ns [arm_gic_driver::version::v3:865] CPU interface initialization for CPU: 0x0
๐ 0.000ns [arm_gic_driver::version::v3:921] CPU interface initialized successfully
๐ 0.000ns [sparreal_kernel::irq:64] [GICv3](405) init cpu: CPUHardId(0)
๐ 0.000ns [sparreal_rt::arch::timer:30] ARMv8 Timer: Enabled
๐ 17.681s [sparreal_kernel::irq:136] Enable irq 0x1e on chip 405
๐ 17.681s [sparreal_kernel::hal_al::run:33] Driver initialized
๐ 18.304s [rdrive:132] probe pci devices
begin test
Run test: test_platform
๐ก 18.358s [test::tests:243] Found node: mmc@fe2e0000
๐ก 18.359s [test::tests:248๐ก 18.390s [test::tests:243] Found node: clock-controller@fd7c0000
๐ก 18.390s [teests:48] clk ptr: 0xffff9000fd7c0000
๐ก 18.395s [test::tests:53] emmc addr: 0xffff9000fe2e0000
๐ก 18.396s [test::tests:54] clk addr: 0xffff9000fd7c0000
๐ก 18.397s [sdmmc::emmc:74] EMMC Controller created: EMMC Controller { base_addr: 0xffff9000fe2e0000, card: None, caps: 0x226dc881, clock_base: 200000000 }
๐ก 18.398s [sdmmc::emmc:91] Init EMMC Controller
๐ 18.399s [sdmmc::emmc:100] Card inserted: true
๐ก 18.399s [sdmmc::emmc:105] EMMC Version: 0x5
๐ก 18.400s [sdmmc::emmc:108] EMMC Capabilities 1: 0b100010011011011100100010000001
๐ก 18.401s [sdmmc::emmc:114] EMMC Capabilities 2: 0b1000000000000000000000000111
๐ก 18.402s [sdmmc::emmc:162] voltage range: 0x60000, 0x12
๐ก 18.402s [sdmmc::emmc::rockchip:145] EMMC Power Control: 0xd
๐ 18.413s [sdmmc::emmc:974] Bus width set to 1
๐ 18.414s [sdmmc::emmc::rockchip:318] card_clock: 0, bus_width: 1, timing: 0
๐ก 18.415s [sdmmc::emmc::rockchip:163] EMMC Clock Control: 0x0
๐ 18.415s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x7
๐ก 18.416s [sdmmc::emmc::rockchip:275] Clock 0x7
๐ 18.417s [sdmmc::emmc::rockchip:353] EMMC Host Control 1: 0x0
๐ 18.417s [sdmmc::emmc::rockchip:307] EMMC Host Control 2: 0x0
๐ 18.418s [sdmmc::emmc::rockchip:318] card_clock: 400000, bus_width: 1, timing: 0
๐ 18.419s [rk3588_clk:111] Setting clk_id 314 to rate 400000
๐ 18.420s [rk3588_clk:152] CCLK_EMMC: src_clk 2, div 60, new_value 0xbb00, final_value 0xff00bb00
๐ 18.421s [rk3588_clk:73] Getting clk_id 314
๐ก 18.421s [sdmmc::emmc::rockchip:32] input_clk: 400000
๐ก 18.422s [sdmmc::emmc::rockchip:42] EMMC Clock Mul: 0
๐ก 18.423s [sdmmc::emmc::rockchip:78] EMMC Clock Divisor: 0x0
๐ 18.423s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x7
๐ก 18.424s [sdmmc::emmc::rockchip:163] EMMC Clock Control: 0x2
๐ 18.425s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x7
๐ก 18.426s [sdmmc::emmc::rockchip:275] Clock 0x7
๐ 18.426s [sdmmc::emmc::rockchip:353] EMMC Host Control 1: 0x0
๐ 18.427s [sdmmc::emmc::rockchip:307] EMMC Host Control 2: 0x0
๐ 18.428s [sdmmc::emmc::rockchip:318] card_clock: 400000, bus_width: 1, timing: 0
๐ 18.428s [rk3588_clk:111] Setting clk_id 314 to rate 400000
๐ 18.429s [rk3588_clk:152] CCLK_EMMC: src_clk 2, div 60, new_value 0xbb00, final_value 0xff00bb00
๐ 18.430s [rk3588_clk:73] Getting clk_id 314
๐ก 18.431s [sdmmc::emmc::rockchip:32] input_clk: 400000
๐ก 18.431s [sdmmc::emmc::rockchip:42] EMMC Clock Mul: 0
๐ก 18.432s [sdmmc::emmc::rockchip:78] EMMC Clock Divisor: 0x0
๐ 18.433s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x7
๐ก 18.434s [sdmmc::emmc::rockchip:163] EMMC Clock Control: 0x2
๐ 18.434s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x7
๐ก 18.435s [sdmmc::emmc::rockchip:275] Clock 0x7
๐ 18.436s [sdmmc::emmc::rockchip:353] EMMC Host Control 1: 0x0
๐ 18.436s [sdmmc::emmc::rockchip:307] EMMC Host Control 2: 0x0
๐ก 18.437s [sdmmc::emmc:226] eMMC initialization started
๐ 18.438s [sdmmc::emmc::cmd:244] Sending command: opcode=0x0, arg=0x0, resp_type=0x0, command=0x0
๐ 18.439s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.440s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.440s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ก 18.453s [sdmmc::emmc::cmd:416] eMMC reset complete
๐ 18.454s [sdmmc::emmc::cmd:244] Sending command: opcode=0x1, arg=0x0, resp_type=0x1, command=0x102
๐ 18.455s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.455s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.456s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ก 18.469s [sdmmc::emmc::cmd:431] eMMC first CMD1 response (no args): 0xff8080
๐ 18.470s [sdmmc::emmc::cmd:244] Sending command: opcode=0x1, arg=0x40060000, resp_type=0x1, command=0x102
๐ 18.471s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.472s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.472s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ก 18.475s [sdmmc::emmc::cmd:453] CMD1 response raw: 0xff8080
๐ก 18.476s [sdmmc::emmc::cmd:454] eMMC CMD1 response: 0xff8080
๐ 18.477s [sdmmc::emmc::cmd:244] Sending command: opcode=0x1, arg=0x40060000, resp_type=0x1, command=0x102
๐ 18.479s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.479s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.480s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ก 18.483s [sdmmc::emmc::cmd:453] CMD1 response raw: 0xff8080
๐ก 18.484s [sdmmc::emmc::cmd:454] eMMC CMD1 response: 0xff8080
๐ 18.485s [sdmmc::emmc::cmd:244] Sending command: opcode=0x1, arg=0x40060000, resp_type=0x1, command=0x102
๐ 18.486s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.487s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.488s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ก 18.491s [sdmmc::emmc::cmd:453] CMD1 response raw: 0xff8080
๐ก 18.491s [sdmmc::emmc::cmd:454] eMMC CMD1 response: 0xff8080
๐ 18.493s [sdmmc::emmc::cmd:244] Sending command: opcode=0x1, arg=0x40060000, resp_type=0x1, command=0x102
๐ 18.494s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.495s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.496s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ก 18.498s [sdmmc::emmc::cmd:453] CMD1 response raw: 0xff8080
๐ก 18.499s [sdmmc::emmc::cmd:454] eMMC CMD1 response: 0xff8080
๐ 18.501s [sdmmc::emmc::cmd:244] Sending command: opcode=0x1, arg=0x40060000, resp_type=0x1, command=0x102
๐ 18.502s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.503s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.503s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ก 18.506s [sdmmc::emmc::cmd:453] CMD1 response raw: 0xff8080
๐ก 18.507s [sdmmc::emmc::cmd:454] eMMC CMD1 response: 0xff8080
๐ 18.508s [sdmmc::emmc::cmd:244] Sending command: opcode=0x1, arg=0x40060000, resp_type=0x1, command=0x102
๐ 18.510s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.510s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.511s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ก 18.514s [sdmmc::emmc::cmd:453] CMD1 response raw: 0xc0ff8080
๐ก 18.514s [sdmmc::emmc::cmd:454] eMMC CMD1 response: 0xc0ff8080
๐ก 18.515s [sdmmc::emmc::cmd:478] eMMC initialization status: true
๐ 18.517s [sdmmc::emmc::cmd:486] Clock control before CMD2: 0x7, stable: true
๐ 18.518s [sdmmc::emmc::cmd:244] Sending command: opcode=0x2, arg=0x0, resp_type=0x7, command=0x209
๐ 18.519s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.520s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.520s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ก 18.523s [sdmmc::emmc::cmd:69] eMMC response: 0x45010044 0x56343033 0x3201bb29 0x7a017c00
๐ 18.524s [sdmmc::emmc::cmd:244] Sending command: opcode=0x3, arg=0x10000, resp_type=0x15, command=0x31a
๐ 18.525s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.526s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.527s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ 18.529s [sdmmc::emmc::cmd:244] Sending command: opcode=0x9, arg=0x10000, resp_type=0x7, command=0x909
๐ 18.530s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.531s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.532s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ก 18.535s [sdmmc::emmc::cmd:69] eMMC response: 0xd00f0032 0x8f5903ff 0xffffffef 0x8a404000
๐ 18.536s [sdmmc::emmc:256] eMMC CSD version: 4
๐ 18.536s [sdmmc::emmc::cmd:244] Sending command: opcode=0x7, arg=0x10000, resp_type=0x15, command=0x71a
๐ 18.537s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.538s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.539s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ 18.541s [sdmmc::emmc:327] cmd7: 0x700
๐ 18.542s [sdmmc::emmc::cmd:244] Sending command: opcode=0x6, arg=0x3b90100, resp_type=0x1d, command=0x61b
๐ 18.543s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.544s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.545s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ 18.547s [sdmmc::emmc:1010] cmd6 0x800
๐ 18.548s [sdmmc::emmc::cmd:244] Sending command: opcode=0xd, arg=0x10000, resp_type=0x15, command=0xd1a
๐ 18.549s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.550s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.550s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ 18.553s [sdmmc::emmc::cmd:583] cmd_d 0x900
๐ 18.554s [sdmmc::emmc::rockchip:318] card_clock: 400000, bus_width: 1, timing: 1
๐ 18.555s [rk3588_clk:111] Setting clk_id 314 to rate 400000
๐ 18.555s [rk3588_clk:152] CCLK_EMMC: src_clk 2, div 60, new_value 0xbb00, final_value 0xff00bb00
๐ 18.556s [rk3588_clk:73] Getting clk_id 314
๐ก 18.557s [sdmmc::emmc::rockchip:32] input_clk: 400000
๐ก 18.558s [sdmmc::emmc::rockchip:42] EMMC Clock Mul: 0
๐ก 18.558s [sdmmc::emmc::rockchip:78] EMMC Clock Divisor: 0x0
๐ 18.559s [sdmmc::emmc::rockchip:106] EMMC Clocckchip:106] EMMC Clock Control: 0x7
๐ก 18.561s [sdmmc::emmc::rockchip:275] Clock 0x7
๐ 18.562s [sdmmc::emmc::rockchip:353] EMMC Host Control 1: 0x4
๐ 18.563s [sdmmc::emmc::rockchip:307] EMMC Host Control 2: 0x2
๐ 18.563s [sdmmc::emmc::rockchip:318] card_clock: 52000000, bus_width: 1, timing: 1
๐ 18.564s [rk3588_clk:111] Setting clk_id 314 to rate 52000000
๐ 18.565s [rk3588_clk:152] CCLK_EMMC: src_clk 1, div 23, new_value 0x5600, final_value 0xff005600
๐ 18.566s [rk3588_clk:73] Getting clk_id 314
๐ก 18.567s [sdmmc::emmc::rockchip:32] input_clk: 65217391
๐ก 18.567s [sdmmc::emmc::rockchip:42] EMMC Clock Mul: 0
๐ก 18.568s [sdmmc::emmc::rockchip:78] EMMC Clock Divisor: 0x1
๐ 18.569s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x107
๐ก 18.569s [sdmmc::emmc::rockchip:163] EMMC Clock Control: 0x2
๐ 18.570s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x7
๐ก 18.571s [sdmmc::emmc::rockchip:275] Clock 0x7
๐ 18.571s [sdmmc::emmc::rockchip:353] EMMC Host Control 1: 0x4
๐ 18.572s [sdmmc::emmc::rockchip:307] EMMC Host Control 2: 0x2
๐ 18.573s [sdmmc::emmc::cmd:244] Sending command: opcode=0x8, arg=0x0, resp_type=0x15, command=0x83a
๐ 18.574s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.575s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.575s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ 18.576s [sdmmc::emmc::cmd:339] Data transfer: cmd.data_present=true
๐ 18.577s [sdmmc::emmc:354] EXT_CSD: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 3, 0, 144, 23, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 4, 0, 7, 0, 0, 2, 0, 0, 21, 31, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 13, 0, 0, 0, 0, 8, 0, 2, 0, 87, 31, 10, 3, 221, 221, 0, 0, 0, 10, 10, 10, 10, 10, 10, 1, 0, 224, 163, 3, 23, 19, 23, 7, 7, 16, 1, 3, 1, 8, 32, 0, 7, 166, 166, 85, 3, 0, 0, 0, 0, 221, 221, 0, 1, 255, 0, 0, 0, 0, 1, 25, 25, 0, 16, 0, 0, 221, 82, 67, 51, 48, 66, 48, 48, 55, 81, 80, 8, 8, 8, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 16, 0, 3, 3, 0, 5, 3, 3, 1, 63, 63, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
๐ 18.591s [sdmmc::emmc:412] Boot partition size: 0x400000
๐ 18.591s [sdmmc::emmc:413] RPMB partition size: 0x1000000
๐ 18.592s [sdmmc::emmc:434] GP partition sizes: [0, 0, 0, 0]
๐ 18.593s [sdmmc::emmc::cmd:244] Sending command: opcode=0x8, arg=0x0, resp_type=0x15, command=0x83a
๐ 18.594s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.595s [sdmmc::emmc::cmd:263] Response Status: 0b100001
๐ 18.595s [sdmmc::emmc::cmd:288] Command completed: status=0b100001
๐ 18.596s [sdmmc::emmc::cmd:339] Data transfer: cmd.data_present=true
๐ 18.597s [sdmmc::emmc::cmd:244] Sending command: opcode=0x8, arg=0x0, resp_type=0x15, command=0x83a
๐ 18.598s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.599s [sdmmc::emmc::cmd:263] Response Status: 0b100001
๐ 18.599s [sdmmc::emmc::cmd:288] Command completed: status=0b100001
๐ 18.600s [sdmmc::emmc::cmd:339] Data transfer: cmd.data_present=true
๐ 18.601s [sdmmc::emmc::cmd:244] Sending command: opcode=0x6, arg=0x3b70200, resp_type=0x1d, command=0x61b
๐ 18.602s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.603s [sdmmc::emmc::cmd:263] Response Status: 0b11
๐ 18.604s [sdmmc::emmc::cmd:288] Command completed: status=0b11
๐ 18.604s [sdmmc::emmc:1010] cmd6 0x800
๐ 18.605s [sdmmc::emmc::cmd:244] Sending command: opcode=0xd, arg=0x10000, resp_type=0x15, command=0xd1a
๐ 18.606s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.607s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.608s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ 18.608s [sdmmc::emmc::cmd:583] cmd_d 0x900
๐ 18.609s [sdmmc::emmc:974] Bus width set to 8
๐ 18.609s [sdmmc::emmc::rockchip:318] card_clock: 52000000, bus_width: 8, timing: 1
๐ 18.610s [rk3588_clk:111] Setting clk_id 314 to rate 52000000
๐ 18.611s [rk3588_clk:152] CCLK_EMMC: src_clk 1, div 23, new_value 0x5600, final_value 0xff005600
๐ 18.612s [rk3588_clk:73] Getting clk_id 314
๐ก 18.613s [sdmmc::emmc::rockchip:32] input_clk: 65217391
๐ก 18.613s [sdmmc::emmc::rockchip:42] EMMC Clock Mul: 0
๐ก 18.614s [sdmmc::emmc::rockchip:78] EMMC Clock Divisor: 0x1
๐ 18.615s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x107
๐ก 18.616s [sdmmc::emmc::rockchip:163] EMMC Clock Control: 0x2
๐ 18.616s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x7
๐ก 18.617s [sdmmc::emmc::rockchip:275] Clock 0x7
๐ 18.618s [sdmmc::emmc::rockchip:353] EMMC Host Control 1: 0x24
๐ 18.618s [sdmmc::emmc::rockchip:307] EMMC Host Control 2: 0x2
๐ 18.619s [sdmmc::emmc::cmd:244] Sending command: opcode=0x8, arg=0x0, resp_type=0x15, command=0x83a
๐ 18.620s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.621s [sdmmc::emmc::cmd:263] Response Status: 0b1
๐ 18.622s [sdmmc::emmc::cmd:288] Command completed: status=0b1
๐ 18.622s [sdmmc::emmc::cmd:339] Data transfer: cmd.data_present=true
๐ 18.623s [sdmmc::emmc::cmd:244] Sending command: opcode=0x6, arg=0x3b90200, resp_type=0x1d, command=0x61b
๐ 18.624s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.625s [sdmmc::emmc::cmd:263] Response Status: 0b11
๐ 18.626s [sdmmc::emmc::cmd:288] Command completed: status=0b11
๐ 18.626s [sdmmc::emmc:1010] cmd6 0x800
๐ 18.628s [sdmmc::emmc::rockchip:318] card_clock: 52000000, bus_width: 8, timing: 9
๐ 18.629s [rk3588_clk:111] Setting clk_id 314 to rate 52000000
๐ 18.630s [rk3588_clk:152] CCLK_EMMC: src_clk 1, div 23, new_value 0x5600, final_value 0xff005600
๐ 18.631s [rk3588_clk:73] Getting clk_id 314
๐ก 18.631s [sdmmc::emmc::rockchip:32] input_clk: 65217391
๐ก 18.632s [sdmmc::emmc::rockchip:42] EMMC Clock Mul: 0
๐ก 18.633s [sdmmc::emmc::rockchip:78] EMMC Clock Divisor: 0x1
๐ 18.633s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x107
๐ก 18.634s [sdmmc::emmc::rockchip:163] EMMC Clock Control: 0x2
๐ 18.635s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x7
๐ก 18.636s [sdmmc::emmc::rockchip:275] Clock 0x7
๐ 18.636s [sdmmc::emmc::rockchip:353] EMMC Host Control 1: 0x24
๐ก 18.637s [sdmmc::emmc::rockchip:145] EMMC Power Control: 0xb
๐ 18.648s [sdmmc::emmc::rockchip:307] EMMC Host Control 2: 0x1b
๐ 18.648s [sdmmc::emmc::rockchip:318] card_clock: 200000000, bus_width: 8, timing: 9
๐ 18.649s [rk3588_clk:111] Setting clk_id 314 to rate 200000000
๐ 18.650s [rk3588_clk:152] CCLK_EMMC: src_clk 1, div 6, new_value 0x4500, final_value 0xff004500
๐ 18.651s [rk3588_clk:73] Getting clk_id 314
๐ก 18.652s [sdmmc::emmc::rockchip:32] input_clk: 250000000
๐ก 18.652s [sdmmc::emmc::rockchip:42] EMMC Clock Mul: 0
๐ก 18.653s [sdmmc::emmc::rockchip:78] EMMC Clock Divisor: 0x1
๐ 18.654s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x107
๐ก 18.654s [sdmmc::emmc::rockchip:163] EMMC Clock Control: 0x2
๐ 18.657s [sdmmc::emmc::rockchip:106] EMMC Clock Control: 0x7
๐ก 18.658s [sdmmc::emmc::rockchip:275] Clock 0x7
๐ 18.658s [sdmmc::emmc::rockchip:353] EMMC Host Control 1: 0x24
๐ก 18.659s [sdmmc::emmc::rockchip:145] EMMC Power Control: 0xb
๐ 18.670s [sdmmc::emmc::rockchip:307] EMMC Host Control 2: 0x1b
๐ 18.671s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.672s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.673s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.673s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.674s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.675s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.676s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.677s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.677s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.678s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.679s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.680s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.681s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.681s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.683s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.683s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.684s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.685s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.686s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.687s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.687s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.688s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.689s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.690s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.691s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.692s [sdmmc::emmc::cmd:24resp_type=0x15, command=0x153a
๐ 18.693s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.693s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.694s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.695s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.696s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.697s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.697s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.698s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.699s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.700s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.701s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.702s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.703s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.703s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.704s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.705s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.706s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.707s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.707s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.708s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.709s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.710s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.711s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.712s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.713s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.713s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.714s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.715s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.716s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.717s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.717s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.718s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.719s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.720s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.721s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.722s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.723s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.723s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.724s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 1 [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.726s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.727s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.727s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.728s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.729s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.730s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.731s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.732s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.733s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.733s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.734s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.735s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.736s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.737s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.738s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.738s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.739s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.740s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.741s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.742s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.743s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.743s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.744s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.745s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.746s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.747s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.748s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.748s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.749s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.750s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.751s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.752s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.753s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.754s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.754s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.755s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.756s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.757s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.758s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.758s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.759s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.760s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.761s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.762s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.763s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.764s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.764s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.765s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.766s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.767s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.768s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.768s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.769s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.770s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.771s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
๐ 18.772s [sdmmc::emmc::cmd:244] Sending command: opcode=0x15, arg=0x0, resp_type=0x15, command=0x153a
๐ 18.773s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.774s [sdmmc::emmc::cmd:263] Response Status: 0b100000
๐ 18.774s [sdmmc::emmc::cmd:nse Status: 0b100000
๐ 18.778s [sdmmc::emmc::cmd:288] Command completed: status=0b100000
ully
SD card initialization successful!
Card type: MmcHc
Manufacturer ID: 0x45
Capacity: 0 MB
Block size: 512 bytes
Attempting to read first block...
๐ 18.780s [sdmmc::emmc::block:365] pio read_blocks: block_id = 5034498, blocks = 1
๐ 18.781s [sdmmc::emmc::block:383] Reading 1 blocks starting at address: 0x4cd202
๐ 18.782s [sdmmc::emmc::cmd:244] Sending command: opcode=0x11, arg=0x4cd202, resp_type=0x15, command=0x113a
๐ 18.783s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.784s [sdmmc::emmc::cmd:263] Response Status: 0b100001
๐ 18.785s [sdmmc::emmc::cmd:288] Command completed: status=0b100001
๐ 18.786s [sdmmc::emmc::cmd:339] Data transfer: cmd.data_present=true
Successfully read first block!
First 16 bytes of first block: [40, E2, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 8F, D2, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 40, DB, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 80, E0, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, C0, EC, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 40, E9, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 80, EE, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, E4, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, C0, DE, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 40, F0, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, DD, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 80, E7, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 40, A9, D5, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 40, 5B, D7, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 80, 50, D6, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 40, 4E, D6, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 60, 4F, D6, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 80, CE, CD, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 40, 48, DF, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 8E, D2, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 60, D6, CD, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 90, D2, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, A0, 09, DD, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 80, B9, E1, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, EB, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 60, DD, E0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 20, D1, CD, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, E0, 7E, E2, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 20, A8, D5, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 40, D7, CD, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 91, D2, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, C0, E5, D0, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]
Testing write and read back...
๐ 18.804s [sdmmc::emmc::block:417] pio write_blocks: block_id = 3, blocks = 1
๐ 18.805s [sdmmc::emmc::block:439] Writing 1 blocks starting at address: 0x3
๐ 18.806s [sdmmc::emmc::cmd:244] Sending command: opcode=0x18, arg=0x3, resp_type=0x15, command=0x183a
๐ 18.807s [sdmmc::emmc::cmd:263] Response Status: 0b10000
๐ 18.808s [sdmmc::emmc::cmd:263] Response Status: 0b10001
๐ 18.808s [sdmmc::emmc::cmd:288] Command completed: status=0b10001
๐ 18.809s [sdmmc::emmc::cmd:339] Data transfer: cmd.data_present=true
Successfully wrote to block 3!
๐ 18.811s [sdmmc::emmc::block:365] pio read_blocks: block_id = 3, blocks = 1
๐ 18.812s [sdmmc::emmc::block:383] Reading 1 blocks starting at address: 0x3
๐ 18.813s [sdmmc::emmc::cmd:244] Sending command: opcode=0x11, arg=0x3, resp_type=0x15, command=0x113a
๐ 18.814s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.815s [sdmmc::emmc::cmd:263] Response Status: 0b100001
๐ 18.816s [sdmmc::emmc::cmd:288] Command completed: status=0b100001
๐ 18.816s [sdmmc::emmc::cmd:339] Data transfer: cmd.data_present=true
Successfully read back block 3!
First 16 bytes of read block: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Data verification successful: written and read data match perfectly!
Testing multi-block read...
๐ 18.831s [sdmmc::emmc::block:365] pio read_blocks: block_id = 200, blocks = 4
๐ 18.832s [sdmmc::emmc::block:383] Reading 4 blocks starting at address: 0xc8
๐ 18.833s [sdmmc::emmc::cmd:244] Sending command: opcode=0x12, arg=0xc8, resp_type=0x15, command=0x123a
๐ 18.834s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.835s [sdmmc::emmc::cmd:263] Response Status: 0b100001
๐ 18.835s [sdmmc::emmc::cmd:288] Command completed: status=0b100001
๐ 18.836s [sdmmc::emmc::cmd:339] Data transfer: cmd.data_present=true
๐ 18.837s [sdmmc::emmc::cmd:244] Sending command: opcode=0xc, arg=0x0, resp_type=0x1d, command=0xc1b
๐ 18.838s [sdmmc::emmc::cmd:263] Response Status: 0b0
๐ 18.839s [sdmmc::emmc::cmd:263] Response Status: 0b11
๐ 18.840s [sdmmc::emmc::cmd:288] Command completed: status=0b11
Successfully read 4 blocks starting at block address 200!
First 16 bytes of first block: [A0, 2F, 00, B9, A1, 8B, 0D, A9, A0, 07, 42, A9, A0, 07, 04, A9]
First 16 bytes of last block: [B5, 01, BD, 01, C6, 01, CE, 01, D6, 01, DE, 01, E7, 01, EF, 01]
SD card test complete
๐ก 18.843s [test::tests:58] test uboot
test test_platform passed
All tests passed
```
</details>
### ๐ Test Functionality Description
The test program performs the following operations:
1. **Device Tree Parsing**: Find EMMC controller hardware node addresses from the device tree
2. **EMMC Controller Initialization**: Initialize the DWCMSHC EMMC controller
3. **Storage Card Detection**: Detect and initialize the connected eMMC storage card
4. **Basic Read/Write Tests**:
- Read storage card information
- Read data blocks
- Write data blocks and verify
- Multi-block read tests
5. **Data Consistency Verification**: Verify that written and read data match
**Note**: Full testing requires ARM hardware platform support and U-Boot environment
## ๐ License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details