aboutsummaryrefslogtreecommitdiff
path: root/tests/stm32/src/bin/sdmmc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/stm32/src/bin/sdmmc.rs')
-rw-r--r--tests/stm32/src/bin/sdmmc.rs92
1 files changed, 65 insertions, 27 deletions
diff --git a/tests/stm32/src/bin/sdmmc.rs b/tests/stm32/src/bin/sdmmc.rs
index 9f9c526e1..07422c42e 100644
--- a/tests/stm32/src/bin/sdmmc.rs
+++ b/tests/stm32/src/bin/sdmmc.rs
@@ -7,7 +7,8 @@ mod common;
7use common::*; 7use common::*;
8use defmt::assert_eq; 8use defmt::assert_eq;
9use embassy_executor::Spawner; 9use embassy_executor::Spawner;
10use embassy_stm32::sdmmc::{DataBlock, Sdmmc}; 10use embassy_stm32::sdmmc::Sdmmc;
11use embassy_stm32::sdmmc::sd::{CmdBlock, DataBlock, StorageDevice};
11use embassy_stm32::time::mhz; 12use embassy_stm32::time::mhz;
12use embassy_stm32::{bind_interrupts, peripherals, sdmmc}; 13use embassy_stm32::{bind_interrupts, peripherals, sdmmc};
13use {defmt_rtt as _, panic_probe as _}; 14use {defmt_rtt as _, panic_probe as _};
@@ -28,16 +29,16 @@ async fn main(_spawner: Spawner) {
28 // Arbitrary block index 29 // Arbitrary block index
29 let block_idx = 16; 30 let block_idx = 16;
30 31
31 let mut pattern1 = DataBlock([0u8; 512]); 32 let mut pattern1 = DataBlock::new();
32 let mut pattern2 = DataBlock([0u8; 512]); 33 let mut pattern2 = DataBlock::new();
33 for i in 0..512 { 34 for i in 0..512 {
34 pattern1[i] = i as u8; 35 pattern1[i] = i as u8;
35 pattern2[i] = !i as u8; 36 pattern2[i] = !i as u8;
36 } 37 }
37 let patterns = [pattern1.clone(), pattern2.clone()]; 38 let patterns = [pattern1.clone(), pattern2.clone()];
38 39
39 let mut block = DataBlock([0u8; 512]); 40 let mut block = DataBlock::new();
40 let mut blocks = [DataBlock([0u8; 512]), DataBlock([0u8; 512])]; 41 let mut blocks = [DataBlock::new(), DataBlock::new()];
41 42
42 // ======== Try 4bit. ============== 43 // ======== Try 4bit. ==============
43 info!("initializing in 4-bit mode..."); 44 info!("initializing in 4-bit mode...");
@@ -54,43 +55,80 @@ async fn main(_spawner: Spawner) {
54 Default::default(), 55 Default::default(),
55 ); 56 );
56 57
57 let mut err = None; 58 let mut cmd_block = CmdBlock::new();
58 loop {
59 match s.init_sd_card(mhz(24)).await {
60 Ok(_) => break,
61 Err(e) => {
62 if err != Some(e) {
63 info!("waiting for card: {:?}", e);
64 err = Some(e);
65 }
66 }
67 }
68 }
69 59
70 let card = unwrap!(s.card()); 60 let mut storage = loop {
71 61 if let Ok(storage) = StorageDevice::new_sd_card(&mut s, &mut cmd_block, mhz(24)).await {
72 info!("Card: {:#?}", Debug2Format(card)); 62 break storage;
73 info!("Clock: {}", s.clock()); 63 }
64 };
65
66 let card = storage.card();
67
68 info!("Card: {:#?}", Debug2Format(&card));
69 info!("Clock: {}", storage.sdmmc.clock());
70
71 // card_type: HighCapacity,
72 // ocr: OCR: Operation Conditions Register {
73 // Voltage Window (mV): (2700, 3600),
74 // S18A (UHS-I only): true,
75 // Over 2TB flag (SDUC only): false,
76 // UHS-II Card: false,
77 // Card Capacity Status (CSS): \"SDHC/SDXC/SDUC\",
78 // Busy: false },
79 // rca: 43690,
80 // cid: CID: Card Identification { Manufacturer ID: 3,
81 // OEM ID: \"SD\",
82 // Product Name: \"SL08G\",
83 // Product Revision: 128,
84 // Product Serial Number: 701445767,
85 // Manufacturing Date: (9,
86 // 2015) },
87 // csd: CSD: Card Specific Data { Transfer Rate: 50,
88 // Block Count: 15523840,
89 // Card Size (bytes): 7948206080,
90 // Read I (@min VDD): 100 mA,
91 // Write I (@min VDD): 10 mA,
92 // Read I (@max VDD): 5 mA,
93 // Write I (@max VDD): 45 mA,
94 // Erase Size (Blocks): 1 },
95 // scr: SCR: SD CARD Configuration Register { Version: Unknown,
96 // 1-bit width: false,
97 // 4-bit width: true },
98 // status: SD Status { Bus Width: One,
99 // Secured Mode: false,
100 // SD Memory Card Type: 0,
101 // Protected Area Size (B): 0,
102 // Speed Class: 0,
103 // Video Speed Class: 0,
104 // Application Performance Class: 0,
105 // Move Performance (MB/s): 0,
106 // AU Size: 0,
107 // Erase Size (units of AU): 0,
108 // Erase Timeout (s): 0,
109 // Discard Support: false } }
110
111 defmt::assert!(card.scr.bus_width_four());
74 112
75 info!("writing pattern1..."); 113 info!("writing pattern1...");
76 s.write_block(block_idx, &pattern1).await.unwrap(); 114 storage.write_block(block_idx, &pattern1).await.unwrap();
77 115
78 info!("reading..."); 116 info!("reading...");
79 s.read_block(block_idx, &mut block).await.unwrap(); 117 storage.read_block(block_idx, &mut block).await.unwrap();
80 assert_eq!(block, pattern1); 118 assert_eq!(block, pattern1);
81 119
82 info!("writing pattern2..."); 120 info!("writing pattern2...");
83 s.write_block(block_idx, &pattern2).await.unwrap(); 121 storage.write_block(block_idx, &pattern2).await.unwrap();
84 122
85 info!("reading..."); 123 info!("reading...");
86 s.read_block(block_idx, &mut block).await.unwrap(); 124 storage.read_block(block_idx, &mut block).await.unwrap();
87 assert_eq!(block, pattern2); 125 assert_eq!(block, pattern2);
88 126
89 info!("writing blocks [pattern1, pattern2]..."); 127 info!("writing blocks [pattern1, pattern2]...");
90 s.write_blocks(block_idx, &patterns).await.unwrap(); 128 storage.write_blocks(block_idx, &patterns).await.unwrap();
91 129
92 info!("reading blocks..."); 130 info!("reading blocks...");
93 s.read_blocks(block_idx, &mut blocks).await.unwrap(); 131 storage.read_blocks(block_idx, &mut blocks).await.unwrap();
94 assert_eq!(&blocks, &patterns); 132 assert_eq!(&blocks, &patterns);
95 133
96 drop(s); 134 drop(s);