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