From af3cf344367113c5e94fdad4fe4a02ee0ab03737 Mon Sep 17 00:00:00 2001
From: CsUxYq <greydevilxyq@163.com>
Date: Fri, 3 Jun 2022 18:15:00 +0800
Subject: [PATCH] =?UTF-8?q?bug:=20sdcard=E5=88=9D=E5=A7=8B=E5=8C=96?=
 =?UTF-8?q?=E5=A4=B1=E8=B4=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Makefile                             |  2 +-
 os/src/paging.rs                     |  4 ++--
 user/drivers/k210/src/fpioa.rs       |  2 --
 user/drivers/k210/src/fpioa/fpioa.rs | 34 ++--------------------------
 user/drivers/k210/src/spi.rs         | 30 ++++--------------------
 user/drivers/k210/src/spi/spi.rs     |  4 ++--
 user/drivers/k210/src/sysctl.rs      |  1 +
 user/drivers/sdcard/src/main.rs      |  2 ++
 user/drivers/sdcard/src/sdcard.rs    | 16 ++++++-------
 9 files changed, 22 insertions(+), 73 deletions(-)

diff --git a/Makefile b/Makefile
index 5703505..dc22974 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ export CPU_NUMS = 2
 export LOG = ERROR
 USER_PATH := ./user/target/$(TARGET)/$(MODE)/
 FS_IMG := ./fs.img
-SDCARD := /dev/disk1s2s1
+SDCARD := /dev/disk2s1
 
 # board and bootloader
 BOARD ?= qemu
diff --git a/os/src/paging.rs b/os/src/paging.rs
index cd746fe..4332d0a 100644
--- a/os/src/paging.rs
+++ b/os/src/paging.rs
@@ -149,7 +149,7 @@ pub extern "C" fn enable_paging(hart_id: usize, device_tree: usize) {
             root_table
                 .map_with_offset(
                     SPI0_ADDRESS,
-                    SPI0_ADDRESS + 0x10000,
+                    SPI0_ADDRESS + FRAME_SIZE,
                     RAM_MAPPING_OFFSET,
                     PTEFlags::V | PTEFlags::R | PTEFlags::W,
                 )
@@ -158,7 +158,7 @@ pub extern "C" fn enable_paging(hart_id: usize, device_tree: usize) {
             root_table
                 .map_with_offset(
                     DMAC_ADDRESS,
-                    DMAC_ADDRESS + 0x10000,
+                    DMAC_ADDRESS + FRAME_SIZE,
                     RAM_MAPPING_OFFSET,
                     PTEFlags::V | PTEFlags::R | PTEFlags::W,
                 )
diff --git a/user/drivers/k210/src/fpioa.rs b/user/drivers/k210/src/fpioa.rs
index 2661b61..fcea624 100644
--- a/user/drivers/k210/src/fpioa.rs
+++ b/user/drivers/k210/src/fpioa.rs
@@ -362,8 +362,6 @@ static FUNCTION_DEFAULTS: &[u32] = &[
 pub fn set_function<N: Into<usize>>(number: N, function: function) {
     // TODO: check for overlapping assignments and assign to RESV0 as the Kendryte SDK does?
     unsafe {
-        // let fpioa = FPIOA::new().fpioa;
-        // let io = fpioa.io;
         FPIOA::new().fpioa.io[number.into()].write(FUNCTION_DEFAULTS[function as usize]);
         // (*ptr).io[number.into()].write(|w| w.bits(FUNCTION_DEFAULTS[function as usize]));
     }
diff --git a/user/drivers/k210/src/fpioa/fpioa.rs b/user/drivers/k210/src/fpioa/fpioa.rs
index ea99d48..143508a 100644
--- a/user/drivers/k210/src/fpioa/fpioa.rs
+++ b/user/drivers/k210/src/fpioa/fpioa.rs
@@ -45,40 +45,10 @@ pub mod fpioa {
         const REG: usize = 0x00;
         const ADDRESS: usize = FPIOA_ADDRESS + REG;
         #[derive(Clone, Copy)]
-        pub struct IO {
-            ch_sel: u8,
-            ds: u8,
-            oe_en: bool,
-            oe_inv: bool,
-            do_sel: bool,
-            do_inv: bool,
-            pu: bool,
-            pd: bool,
-            sl: bool,
-            ie_en: bool,
-            ie_inv: bool,
-            di_inv: bool,
-            st: bool,
-            pad_di: bool,
-        }
+        pub struct IO {}
         impl IO {
             pub fn new() -> Self {
-                Self {
-                    ch_sel: 0,
-                    ds: 0,
-                    oe_en: false,
-                    oe_inv: false,
-                    do_sel: false,
-                    do_inv: false,
-                    pu: false,
-                    pd: false,
-                    sl: false,
-                    ie_en: false,
-                    ie_inv: false,
-                    di_inv: false,
-                    st: false,
-                    pad_di: false,
-                }
+                Self {}
             }
             fn read(&self) -> u32 {
                 dev_read_u32(ADDRESS).unwrap() as u32
diff --git a/user/drivers/k210/src/spi.rs b/user/drivers/k210/src/spi.rs
index d92f973..8931f66 100644
--- a/user/drivers/k210/src/spi.rs
+++ b/user/drivers/k210/src/spi.rs
@@ -86,40 +86,22 @@ impl SPI {
         self.spi.dmardlr.write(0x00);
         self.spi.ser.write(0x00);
         self.spi.ssienr.write(0x00);
+
         self.spi
             .ctrlr0
             .write_work_mode(work_mode)
             .write_tmod(tmod)
             .write_frame_format(frame_format)
             .write_data_length(data_bit_length - 1);
-        // self.spi.ctrlr0.write(|w| {
-        //     w.work_mode()
-        //         .variant(work_mode)
-        //         .tmod()
-        //         .variant(tmod)
-        //         .frame_format()
-        //         .variant(frame_format)
-        //         .data_length()
-        //         .bits(data_bit_length - 1)
-        // });
+
         self.spi
             .spi_ctrlr0
             .write_aitm(instruction_address_trans_mode)
             .write_addr_length(addr_l)
             .write_inst_length(inst_l)
             .write_wait_cycle(wait_cycles);
-        // self.spi.spi_ctrlr0.write(|w| {
-        //     w.aitm()
-        //         .variant(instruction_address_trans_mode)
-        //         .addr_length()
-        //         .bits(addr_l)
-        //         .inst_length()
-        //         .bits(inst_l)
-        //         .wait_cycles()
-        //         .bits(wait_cycles)
-        // });
+
         self.spi.endian.write(endian);
-        // self.spi.endian.write(|w| w.bits(endian));
     }
 
     /// Set SPI clock rate
@@ -143,19 +125,15 @@ impl SPI {
         if rx.len() == 0 {
             return;
         }
-        // self.spi
-        //     .ctrlr1
-        //     .write(|w| w.bits((rx.len() - 1).try_into().unwrap()));
+
         self.spi.ctrlr1.write((rx.len() - 1).try_into().unwrap());
         self.spi.ssienr.write(0x01);
-        // self.spi.dr[0].write(|w| w.bits(0xffffffff));
         self.spi.dr[0].write(0xffffffff);
         self.spi.ser.write(1 << chip_select);
 
         let mut fifo_len = 0;
         for val in rx.iter_mut() {
             while fifo_len == 0 {
-                // fifo_len = self.spi.rxflr.read().bits();
                 fifo_len = self.spi.rxflr.read();
             }
             *val = X::trunc(self.spi.dr[0].read());
diff --git a/user/drivers/k210/src/spi/spi.rs b/user/drivers/k210/src/spi/spi.rs
index 5f73d8f..05b123f 100644
--- a/user/drivers/k210/src/spi/spi.rs
+++ b/user/drivers/k210/src/spi/spi.rs
@@ -18,7 +18,7 @@ pub struct SPI0 {
     pub ser: SER,
     #[doc = "0x14 - Baud Rate Select"]
     pub baudr: BAUDR,
-    #[doc = "0x18 - Transmit FIFO Threshold Level"]
+    #[doc = "0x20 - Transmit FIFO Level Register"]
     pub txflr: TXFLR,
     #[doc = "0x24 - Receive FIFO Level Register"]
     pub rxflr: RXFLR,
@@ -258,7 +258,7 @@ pub mod txflr {
         pub fn read(&self) -> u32 {
             dev_read_u32(ADDRESS).unwrap() as u32
         }
-        pub fn write(&self, value: u32) -> &Self {
+        fn write(&self, value: u32) -> &Self {
             dev_write_u32(ADDRESS, value).unwrap();
             &self
         }
diff --git a/user/drivers/k210/src/sysctl.rs b/user/drivers/k210/src/sysctl.rs
index ce39cf7..3c36cf6 100644
--- a/user/drivers/k210/src/sysctl.rs
+++ b/user/drivers/k210/src/sysctl.rs
@@ -891,6 +891,7 @@ fn pll_source_set_freq(pll: pll, source: clock_source, freq: u32) -> Result<u32,
                     // });
                 }
                 PLL2 => {
+                    sysctl::pll2::write_ckin_sel(pll2_source_to_cksel(source));
                     sysctl::pll2::write_clkr(found.clkr);
                     sysctl::pll2::write_clkf(found.clkf);
                     sysctl::pll2::write_clkod(found.clkod);
diff --git a/user/drivers/sdcard/src/main.rs b/user/drivers/sdcard/src/main.rs
index 64d3c13..2d64448 100644
--- a/user/drivers/sdcard/src/main.rs
+++ b/user/drivers/sdcard/src/main.rs
@@ -12,6 +12,8 @@ mod sdcard;
 #[no_mangle]
 fn main() {
     let sdcard = SDCardWrapper::new();
+    println!("init sdcard");
+    block_device_test();
 }
 
 #[allow(unused)]
diff --git a/user/drivers/sdcard/src/sdcard.rs b/user/drivers/sdcard/src/sdcard.rs
index da33f54..0ff1627 100644
--- a/user/drivers/sdcard/src/sdcard.rs
+++ b/user/drivers/sdcard/src/sdcard.rs
@@ -492,8 +492,9 @@ impl SDCard {
         self.send_cmd(CMD::CMD0, 0, 0x95);
         let result = self.get_response();
         self.end_cmd();
+
         if result != 0x01 {
-            return Err(InitError::CMDFailed(CMD::CMD0, result));
+            return Err(InitError::CMDFailed(CMD::CMD0, 0));
         }
 
         /* Check voltage range */
@@ -673,7 +674,7 @@ const SD_CS_GPIONUM: u8 = 7;
 const SD_CS: u32 = 3;
 
 /** Connect pins to internal functions */
-fn io_init() {
+pub fn io_init() {
     fpioa::set_function(fpioa::io::SPI0_SCLK, fpioa::function::SPI0_SCLK);
     fpioa::set_function(fpioa::io::SPI0_MOSI, fpioa::function::SPI0_D0);
     fpioa::set_function(fpioa::io::SPI0_MISO, fpioa::function::SPI0_D1);
@@ -687,28 +688,27 @@ fn io_init() {
 
 fn init_sdcard() -> SDCard {
     // wait previous output
-    // usleep(100000);
-    // let peripherals = unsafe { Peripherals::steal() };
-    sysctl::pll_set_freq(sysctl::pll::PLL0, 800_000_000).unwrap();
+    usleep(10000);
+
+    // sysctl::pll_set_freq(sysctl::pll::PLL0, 800_000_000).unwrap();
     sysctl::pll_set_freq(sysctl::pll::PLL1, 300_000_000).unwrap();
     sysctl::pll_set_freq(sysctl::pll::PLL2, 45_158_400).unwrap();
     let clocks = clock::Clocks::new();
 
-    // peripherals.UARTHS.configure(115_200.bps(), &clocks);
     // UART_mod::configure(115_200.bps(), &clocks);
     uarth::configure(Bps::new(115_200), &clocks);
 
     io_init();
 
     // let spi = SPI0::new().constrain();
-    // let spi = SPI0::new();
+
     let spi = SPI::new();
     let sd = SDCard::new(spi, SD_CS, SD_CS_GPIONUM);
     let info = sd.init().unwrap();
+
     let num_sectors = info.CardCapacity / 512;
     assert!(num_sectors > 0);
 
-    println!("init sdcard!");
     sd
 }
 
-- 
GitLab