first SDIO test
Some checks failed
ci / Check build (pull_request) Has been cancelled
ci / Check formatting (pull_request) Has been cancelled
ci / Check Documentation Build (pull_request) Has been cancelled
ci / Clippy (pull_request) Has been cancelled
ci / Check build (push) Has been cancelled
ci / Check formatting (push) Has been cancelled
ci / Check Documentation Build (push) Has been cancelled
ci / Clippy (push) Has been cancelled
Some checks failed
ci / Check build (pull_request) Has been cancelled
ci / Check formatting (pull_request) Has been cancelled
ci / Check Documentation Build (pull_request) Has been cancelled
ci / Clippy (pull_request) Has been cancelled
ci / Check build (push) Has been cancelled
ci / Check formatting (push) Has been cancelled
ci / Check Documentation Build (push) Has been cancelled
ci / Clippy (push) Has been cancelled
This commit is contained in:
@@ -13,13 +13,13 @@ use zynq7000_hal::gpio::Input;
|
|||||||
use zynq7000_hal::prelude::*;
|
use zynq7000_hal::prelude::*;
|
||||||
use zynq7000_hal::{
|
use zynq7000_hal::{
|
||||||
BootMode, clocks, gic, gpio, gtc,
|
BootMode, clocks, gic, gpio, gtc,
|
||||||
sdio::{Sdio, SdioClockConfig, SdioLowLevel},
|
sdio::{Sdio, SdioClockConfig},
|
||||||
uart,
|
uart,
|
||||||
};
|
};
|
||||||
|
|
||||||
use zynq7000_rt as _;
|
use zynq7000_rt as _;
|
||||||
|
|
||||||
const INIT_STRING: &str = "-- Zynq 7000 Zedboard GPIO blinky example --\n\r";
|
const INIT_STRING: &str = "-- Zynq 7000 Zedboard SDIO example --\n\r";
|
||||||
|
|
||||||
/// Entry point (not called like a normal main function)
|
/// Entry point (not called like a normal main function)
|
||||||
#[unsafe(no_mangle)]
|
#[unsafe(no_mangle)]
|
||||||
@@ -42,7 +42,7 @@ async fn main(_spawner: Spawner) -> ! {
|
|||||||
// Clock was already initialized by PS7 Init TCL script or FSBL, we just read it.
|
// Clock was already initialized by PS7 Init TCL script or FSBL, we just read it.
|
||||||
let clocks = clocks::Clocks::new_from_regs(PS_CLOCK_FREQUENCY).unwrap();
|
let clocks = clocks::Clocks::new_from_regs(PS_CLOCK_FREQUENCY).unwrap();
|
||||||
|
|
||||||
let mut gpio_pins = gpio::GpioPins::new(periphs.gpio);
|
let gpio_pins = gpio::GpioPins::new(periphs.gpio);
|
||||||
|
|
||||||
// Set up global timer counter and embassy time driver.
|
// Set up global timer counter and embassy time driver.
|
||||||
let gtc = gtc::GlobalTimerCounter::new(periphs.gtc, clocks.arm_clocks());
|
let gtc = gtc::GlobalTimerCounter::new(periphs.gtc, clocks.arm_clocks());
|
||||||
@@ -69,7 +69,7 @@ async fn main(_spawner: Spawner) -> ! {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let sdio_clock_config =
|
let sdio_clock_config =
|
||||||
SdioClockConfig::calculate_for_io_clock(clocks.io_clocks(), 100.MHz(), 10.MHz());
|
SdioClockConfig::calculate_for_io_clock(clocks.io_clocks(), 100.MHz(), 10.MHz()).unwrap();
|
||||||
let sdio = Sdio::new_for_sdio_0(
|
let sdio = Sdio::new_for_sdio_0(
|
||||||
periphs.sdio_0,
|
periphs.sdio_0,
|
||||||
sdio_clock_config,
|
sdio_clock_config,
|
||||||
@@ -85,7 +85,10 @@ async fn main(_spawner: Spawner) -> ! {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
let card_detect = Input::new_for_mio(gpio_pins.mio.mio47).unwrap();
|
let card_detect = Input::new_for_mio(gpio_pins.mio.mio47).unwrap();
|
||||||
let write_protect = Input::new_for_mio(gpio_pins.mio.mio46).unwrap();
|
let write_protect = Input::new_for_mio(gpio_pins.mio.mio46).unwrap();
|
||||||
info!("Card detect state: {:?}", card_detect.is_high());
|
// The card detect being active low makes sense according to the Zedboard docs. Not sure
|
||||||
|
// about write-protect though.. It seems that write protect on means that the
|
||||||
|
// the pin is pulled high.
|
||||||
|
info!("Card detect state: {:?}", card_detect.is_low());
|
||||||
info!("Write protect state: {:?}", write_protect.is_high());
|
info!("Write protect state: {:?}", write_protect.is_high());
|
||||||
|
|
||||||
let capabilities = sdio.ll().capabilities();
|
let capabilities = sdio.ll().capabilities();
|
||||||
|
|||||||
@@ -470,7 +470,7 @@ impl Ethernet {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
ll.configure_peripheral_clock(config.clk_config_1000_mbps, true);
|
ll.configure_clock(config.clk_config_1000_mbps, true);
|
||||||
let mut mdio = mdio::Mdio::new(&ll, true);
|
let mut mdio = mdio::Mdio::new(&ll, true);
|
||||||
mdio.configure_clock_div(config.mdc_clk_div);
|
mdio.configure_clock_div(config.mdc_clk_div);
|
||||||
ll.regs.modify_net_ctrl(|mut val| {
|
ll.regs.modify_net_ctrl(|mut val| {
|
||||||
@@ -491,7 +491,7 @@ impl Ethernet {
|
|||||||
|
|
||||||
pub fn new(mut ll: EthernetLowLevel, config: EthernetConfig) -> Self {
|
pub fn new(mut ll: EthernetLowLevel, config: EthernetConfig) -> Self {
|
||||||
Self::common_init(&mut ll, config.mac_address);
|
Self::common_init(&mut ll, config.mac_address);
|
||||||
ll.configure_peripheral_clock(config.clk_config_1000_mbps, true);
|
ll.configure_clock(config.clk_config_1000_mbps, true);
|
||||||
let mut mdio = mdio::Mdio::new(&ll, true);
|
let mut mdio = mdio::Mdio::new(&ll, true);
|
||||||
mdio.configure_clock_div(config.mdc_clk_div);
|
mdio.configure_clock_div(config.mdc_clk_div);
|
||||||
Ethernet {
|
Ethernet {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ use crate::gpio::mio::{
|
|||||||
Mio41, Mio42, Mio43, Mio44, Mio45, Mio46, Mio47, Mio50, Mio51,
|
Mio41, Mio42, Mio43, Mio44, Mio45, Mio46, Mio47, Mio50, Mio51,
|
||||||
};
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
clocks::{Clocks, IoClocks},
|
clocks::IoClocks,
|
||||||
gpio::{
|
gpio::{
|
||||||
IoPeriphPin,
|
IoPeriphPin,
|
||||||
mio::{
|
mio::{
|
||||||
@@ -22,6 +22,10 @@ use crate::{
|
|||||||
time::Hertz,
|
time::Hertz,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[derive(Debug, thiserror::Error)]
|
||||||
|
#[error("invalid peripheral instance")]
|
||||||
|
pub struct InvalidPeripheralError;
|
||||||
|
|
||||||
pub const MUX_CONF: MuxConfig = MuxConfig::new_with_l3(u3::new(0b100));
|
pub const MUX_CONF: MuxConfig = MuxConfig::new_with_l3(u3::new(0b100));
|
||||||
|
|
||||||
pub trait Sdio0ClockPin: MioPin {}
|
pub trait Sdio0ClockPin: MioPin {}
|
||||||
@@ -354,12 +358,12 @@ impl Sdio {
|
|||||||
clock_pin: Sdio0Clock,
|
clock_pin: Sdio0Clock,
|
||||||
command_pin: Sdio0Command,
|
command_pin: Sdio0Command,
|
||||||
data_pins: (Sdio0Data0, Sdio0Data1, Sdio0Data2, Sdio0Data3),
|
data_pins: (Sdio0Data0, Sdio0Data1, Sdio0Data2, Sdio0Data3),
|
||||||
) -> Option<Self> {
|
) -> Result<Self, InvalidPeripheralError> {
|
||||||
let id = regs.id()?;
|
let id = regs.id().ok_or(InvalidPeripheralError)?;
|
||||||
if id != SdioId::Sdio1 {
|
if id != SdioId::Sdio0 {
|
||||||
return None;
|
return Err(InvalidPeripheralError);
|
||||||
}
|
}
|
||||||
Some(Self::new(
|
Ok(Self::new(
|
||||||
regs,
|
regs,
|
||||||
clock_config,
|
clock_config,
|
||||||
clock_pin,
|
clock_pin,
|
||||||
@@ -381,12 +385,12 @@ impl Sdio {
|
|||||||
clock_pin: Sdio1Clock,
|
clock_pin: Sdio1Clock,
|
||||||
command_pin: Sdio1Command,
|
command_pin: Sdio1Command,
|
||||||
data_pins: (Sdio1Data0, Sdio1Data1, Sdio1Data2, Sdio1Data3),
|
data_pins: (Sdio1Data0, Sdio1Data1, Sdio1Data2, Sdio1Data3),
|
||||||
) -> Option<Self> {
|
) -> Result<Self, InvalidPeripheralError> {
|
||||||
let id = regs.id()?;
|
let id = regs.id().ok_or(InvalidPeripheralError)?;
|
||||||
if id != SdioId::Sdio1 {
|
if id != SdioId::Sdio1 {
|
||||||
return None;
|
return Err(InvalidPeripheralError);
|
||||||
}
|
}
|
||||||
Some(Self::new(
|
Ok(Self::new(
|
||||||
regs,
|
regs,
|
||||||
clock_config,
|
clock_config,
|
||||||
clock_pin,
|
clock_pin,
|
||||||
|
|||||||
Reference in New Issue
Block a user