forked from M-Labs/zynq-rs
Compare commits
10 Commits
42cc256812
...
0106430805
Author | SHA1 | Date | |
---|---|---|---|
0106430805 | |||
|
c15b54f92b | ||
de42a5d1b2 | |||
ff03bf92a3 | |||
f20c008264 | |||
67dbb5932f | |||
dab5c6f070 | |||
0a3a777652 | |||
92b3f3e1dd | |||
f586ba5a13 |
@ -183,6 +183,20 @@ pub fn main_core0() {
|
|||||||
println!("");
|
println!("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
{
|
||||||
|
let mut err_cdwn = timer.countdown();
|
||||||
|
let mut err_state = true;
|
||||||
|
let mut led = zynq::error_led::ErrorLED::error_led();
|
||||||
|
task::spawn( async move {
|
||||||
|
loop {
|
||||||
|
led.toggle(err_state);
|
||||||
|
err_state = !err_state;
|
||||||
|
delay(&mut err_cdwn, Milliseconds(1000)).await;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
let eth = zynq::eth::Eth::eth0(HWADDR.clone());
|
let eth = zynq::eth::Eth::eth0(HWADDR.clone());
|
||||||
println!("Eth on");
|
println!("Eth on");
|
||||||
|
|
||||||
|
14
flake.lock
generated
14
flake.lock
generated
@ -3,11 +3,11 @@
|
|||||||
"mozilla-overlay": {
|
"mozilla-overlay": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1650459918,
|
"lastModified": 1690536331,
|
||||||
"narHash": "sha256-sroCK+QJTmoXtcRkwZyKOP9iAYOPID2Bwdxn4GkG16w=",
|
"narHash": "sha256-aRIf2FB2GTdfF7gl13WyETmiV/J7EhBGkSWXfZvlxcA=",
|
||||||
"owner": "mozilla",
|
"owner": "mozilla",
|
||||||
"repo": "nixpkgs-mozilla",
|
"repo": "nixpkgs-mozilla",
|
||||||
"rev": "e1f7540fc0a8b989fb8cf701dc4fd7fc76bcf168",
|
"rev": "db89c8707edcffefcd8e738459d511543a339ff5",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -18,16 +18,16 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1653920503,
|
"lastModified": 1691328192,
|
||||||
"narHash": "sha256-BBeCZwZImtjP3oYy4WogkQYy5OxNyfNciVSc1AfZgLQ=",
|
"narHash": "sha256-w59N1zyDQ7SupfMJLFvtms/SIVbdryqlw5AS4+DiH+Y=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "a634c8f6c1fbf9b9730e01764999666f3436f10a",
|
"rev": "61676e4dcfeeb058f255294bcb08ea7f3bc3ce56",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"ref": "nixos-22.05",
|
"ref": "nixos-23.05",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
|
19
flake.nix
19
flake.nix
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
description = "Bare-metal Rust on Zynq-7000";
|
description = "Bare-metal Rust on Zynq-7000";
|
||||||
|
|
||||||
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-22.05;
|
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-23.05;
|
||||||
inputs.mozilla-overlay = { url = github:mozilla/nixpkgs-mozilla; flake = false; };
|
inputs.mozilla-overlay = { url = github:mozilla/nixpkgs-mozilla; flake = false; };
|
||||||
|
|
||||||
outputs = { self, nixpkgs, mozilla-overlay }:
|
outputs = { self, nixpkgs, mozilla-overlay }:
|
||||||
@ -161,13 +161,13 @@
|
|||||||
|
|
||||||
mkbootimage = pkgs.stdenv.mkDerivation {
|
mkbootimage = pkgs.stdenv.mkDerivation {
|
||||||
pname = "mkbootimage";
|
pname = "mkbootimage";
|
||||||
version = "2.2";
|
version = "2.3dev";
|
||||||
|
|
||||||
src = pkgs.fetchFromGitHub {
|
src = pkgs.fetchFromGitHub {
|
||||||
owner = "antmicro";
|
owner = "antmicro";
|
||||||
repo = "zynq-mkbootimage";
|
repo = "zynq-mkbootimage";
|
||||||
rev = "4ee42d782a9ba65725ed165a4916853224a8edf7";
|
rev = "872363ce32c249f8278cf107bc6d3bdeb38d849f";
|
||||||
sha256 = "1k1mbsngqadqihzjgvwvsrkvryxy5ladpxd9yh9iqn2s7fxqwqa9";
|
sha256 = "sha256-5FPyAhUWZDwHbqmp9J2ZXTmjaXPz+dzrJMolaNwADHs=";
|
||||||
};
|
};
|
||||||
|
|
||||||
propagatedBuildInputs = [ pkgs.libelf pkgs.pcre ];
|
propagatedBuildInputs = [ pkgs.libelf pkgs.pcre ];
|
||||||
@ -221,9 +221,9 @@
|
|||||||
) ./.;
|
) ./.;
|
||||||
cargoLock = { lockFile = ./Cargo.lock; };
|
cargoLock = { lockFile = ./Cargo.lock; };
|
||||||
|
|
||||||
nativeBuildInputs = [ cargo-xbuild pkgs.llvmPackages_9.clang-unwrapped ];
|
nativeBuildInputs = [ cargo-xbuild pkgs.llvmPackages_14.clang-unwrapped ];
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
export XARGO_RUST_SRC="${rustPlatform.rust.rustc}/lib/rustlib/src/rust/library"
|
export XARGO_RUST_SRC="${rust}/lib/rustlib/src/rust/library"
|
||||||
export CARGO_HOME=$(mktemp -d cargo-home.XXX)
|
export CARGO_HOME=$(mktemp -d cargo-home.XXX)
|
||||||
pushd ${crate}
|
pushd ${crate}
|
||||||
cargo xbuild --release --frozen \
|
cargo xbuild --release --frozen \
|
||||||
@ -265,19 +265,18 @@
|
|||||||
|
|
||||||
hydraJobs = packages.x86_64-linux;
|
hydraJobs = packages.x86_64-linux;
|
||||||
|
|
||||||
inherit rustPlatform;
|
inherit rust rustPlatform;
|
||||||
|
|
||||||
devShell.x86_64-linux = pkgs.mkShell {
|
devShell.x86_64-linux = pkgs.mkShell {
|
||||||
name = "zynq-rs-dev-shell";
|
name = "zynq-rs-dev-shell";
|
||||||
buildInputs = with pkgs; [
|
buildInputs = with pkgs; [
|
||||||
rustPlatform.rust.rustc
|
rust
|
||||||
rustPlatform.rust.cargo
|
|
||||||
cacert
|
cacert
|
||||||
cargo-xbuild
|
cargo-xbuild
|
||||||
|
|
||||||
openocd gdb
|
openocd gdb
|
||||||
openssh rsync
|
openssh rsync
|
||||||
llvmPackages_9.clang-unwrapped
|
llvmPackages_14.clang-unwrapped
|
||||||
(python3.withPackages(ps: [ ps.pyftdi ]))
|
(python3.withPackages(ps: [ ps.pyftdi ]))
|
||||||
mkbootimage ];
|
mkbootimage ];
|
||||||
};
|
};
|
||||||
|
@ -18,8 +18,6 @@ impl ErrorLED {
|
|||||||
.pullup(true)
|
.pullup(true)
|
||||||
.disable_rcvr(true)
|
.disable_rcvr(true)
|
||||||
);
|
);
|
||||||
// reset
|
|
||||||
slcr.gpio_rst_ctrl.reset_gpio();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Self::error_led_common(0xFFFF - 0x0080)
|
Self::error_led_common(0xFFFF - 0x0080)
|
||||||
|
@ -13,6 +13,9 @@ mod regs;
|
|||||||
pub mod rx;
|
pub mod rx;
|
||||||
pub mod tx;
|
pub mod tx;
|
||||||
|
|
||||||
|
use super::time::Milliseconds;
|
||||||
|
use embedded_hal::timer::CountDown;
|
||||||
|
|
||||||
/// Size of all the buffers
|
/// Size of all the buffers
|
||||||
pub const MTU: usize = 1536;
|
pub const MTU: usize = 1536;
|
||||||
/// Maximum MDC clock
|
/// Maximum MDC clock
|
||||||
@ -300,11 +303,18 @@ impl<GEM: Gem> Eth<GEM, (), ()> {
|
|||||||
fn gem_common(macaddr: [u8; 6]) -> Self {
|
fn gem_common(macaddr: [u8; 6]) -> Self {
|
||||||
GEM::setup_clock(TX_1000);
|
GEM::setup_clock(TX_1000);
|
||||||
|
|
||||||
|
#[cfg(feature="target_kasli_soc")]
|
||||||
|
{
|
||||||
|
let mut eth_reset_pin = PhyRst::rst_pin();
|
||||||
|
eth_reset_pin.reset();
|
||||||
|
}
|
||||||
|
|
||||||
let mut inner = EthInner {
|
let mut inner = EthInner {
|
||||||
gem: PhantomData,
|
gem: PhantomData,
|
||||||
link: None,
|
link: None,
|
||||||
};
|
};
|
||||||
inner.init();
|
inner.init();
|
||||||
|
|
||||||
inner.configure(macaddr);
|
inner.configure(macaddr);
|
||||||
|
|
||||||
let phy = Phy::find(&mut inner).expect("phy");
|
let phy = Phy::find(&mut inner).expect("phy");
|
||||||
@ -482,6 +492,69 @@ impl<'a, GEM: Gem> smoltcp::phy::Device<'a> for &mut Eth<GEM, rx::DescList, tx::
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct PhyRst {
|
||||||
|
regs: regs::GpioRegisterBlock,
|
||||||
|
count_down: super::timer::global::CountDown<Milliseconds>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PhyRst {
|
||||||
|
pub fn rst_pin() -> Self {
|
||||||
|
slcr::RegisterBlock::unlocked(|slcr| {
|
||||||
|
// Hardware Reset for PHY
|
||||||
|
slcr.mio_pin_47.write(
|
||||||
|
slcr::MioPin47::zeroed()
|
||||||
|
.l3_sel(0b000)
|
||||||
|
.io_type(slcr::IoBufferType::Lvcmos18)
|
||||||
|
.pullup(true)
|
||||||
|
.disable_rcvr(true)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
Self::eth_reset_common(0xFFFF - 0x8000)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn delay_ms(&mut self, ms: u64) {
|
||||||
|
self.count_down.start(Milliseconds(ms));
|
||||||
|
nb::block!(self.count_down.wait()).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn eth_reset_common(gpio_output_mask: u16) -> Self {
|
||||||
|
let self_ = Self {
|
||||||
|
regs: regs::GpioRegisterBlock::regs(),
|
||||||
|
count_down: unsafe { super::timer::GlobalTimer::get() }.countdown(),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Setup GPIO output mask
|
||||||
|
self_.regs.gpio_output_mask.modify(|_, w| {
|
||||||
|
w.mask(gpio_output_mask)
|
||||||
|
});
|
||||||
|
|
||||||
|
self_.regs.gpio_direction.modify(|_, w| {
|
||||||
|
w.phy_rst(true)
|
||||||
|
});
|
||||||
|
|
||||||
|
self_
|
||||||
|
}
|
||||||
|
|
||||||
|
fn oe(&mut self, oe: bool) {
|
||||||
|
self.regs.gpio_output_enable.modify(|_, w| {
|
||||||
|
w.phy_rst(oe)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn toggle(&mut self, o: bool) {
|
||||||
|
self.regs.gpio_output_mask.modify(|_, w| {
|
||||||
|
w.phy_rst(o)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reset(&mut self) {
|
||||||
|
self.toggle(false); // drive phy_rst (active LOW) pin low
|
||||||
|
self.oe(true); // enable pin's output
|
||||||
|
self.delay_ms(10);
|
||||||
|
self.toggle(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct EthInner<GEM: Gem> {
|
struct EthInner<GEM: Gem> {
|
||||||
gem: PhantomData<GEM>,
|
gem: PhantomData<GEM>,
|
||||||
|
@ -110,6 +110,49 @@ pub struct RegisterBlock {
|
|||||||
pub design_cfg5: RO<u32>,
|
pub design_cfg5: RO<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct GpioRegisterBlock {
|
||||||
|
pub gpio_output_mask: &'static mut OutputMask,
|
||||||
|
pub gpio_direction: &'static mut Direction,
|
||||||
|
pub gpio_output_enable: &'static mut OutputEnable,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GpioRegisterBlock {
|
||||||
|
pub fn regs() -> Self {
|
||||||
|
Self {
|
||||||
|
gpio_output_mask: OutputMask::new(),
|
||||||
|
gpio_direction: Direction::new(),
|
||||||
|
gpio_output_enable: OutputEnable::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
register!(gpio_output_mask,
|
||||||
|
/// MASK_DATA_1_SW:
|
||||||
|
/// Maskable output data for MIO[47:32]
|
||||||
|
OutputMask, RW, u32);
|
||||||
|
register_at!(OutputMask, 0xE000A008, new);
|
||||||
|
register_bit!(gpio_output_mask,
|
||||||
|
/// Output for PHY_RST (MIO[47])
|
||||||
|
phy_rst, 15);
|
||||||
|
register_bits!(gpio_output_mask,
|
||||||
|
mask, u16, 16, 31);
|
||||||
|
register!(gpio_direction,
|
||||||
|
/// DIRM_1:
|
||||||
|
/// Direction mode for MIO[53:32]; 0/1 = in/out
|
||||||
|
Direction, RW, u32);
|
||||||
|
register_at!(Direction, 0xE000A244, new);
|
||||||
|
register_bit!(gpio_direction,
|
||||||
|
/// Direction for PHY_RST
|
||||||
|
phy_rst, 15);
|
||||||
|
register!(gpio_output_enable,
|
||||||
|
/// OEN_1:
|
||||||
|
/// Output enable for MIO[53:32]
|
||||||
|
OutputEnable, RW, u32);
|
||||||
|
register_at!(OutputEnable, 0xE000A248, new);
|
||||||
|
register_bit!(gpio_output_enable,
|
||||||
|
/// Output enable for PHY_RST
|
||||||
|
phy_rst, 15);
|
||||||
|
|
||||||
register_at!(RegisterBlock, 0xE000B000, gem0);
|
register_at!(RegisterBlock, 0xE000B000, gem0);
|
||||||
register_at!(RegisterBlock, 0xE000C000, gem1);
|
register_at!(RegisterBlock, 0xE000C000, gem1);
|
||||||
|
|
||||||
|
@ -53,8 +53,6 @@ impl I2c {
|
|||||||
.pullup(false)
|
.pullup(false)
|
||||||
.disable_rcvr(true)
|
.disable_rcvr(true)
|
||||||
);
|
);
|
||||||
// Reset
|
|
||||||
slcr.gpio_rst_ctrl.reset_gpio();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Self::i2c_common(0xFFFF - 0x000C, 0xFFFF - 0x0002)
|
Self::i2c_common(0xFFFF - 0x000C, 0xFFFF - 0x0002)
|
||||||
|
@ -587,6 +587,17 @@ register_bit!(a9_cpu_rst_ctrl, a9_clkstop0, 4);
|
|||||||
register_bit!(a9_cpu_rst_ctrl, a9_rst1, 1);
|
register_bit!(a9_cpu_rst_ctrl, a9_rst1, 1);
|
||||||
register_bit!(a9_cpu_rst_ctrl, a9_rst0, 0);
|
register_bit!(a9_cpu_rst_ctrl, a9_rst0, 0);
|
||||||
|
|
||||||
|
pub fn reboot() {
|
||||||
|
RegisterBlock::unlocked(|slcr| {
|
||||||
|
unsafe {
|
||||||
|
let reboot = slcr.reboot_status.read();
|
||||||
|
slcr.reboot_status.write(reboot & 0xF0FFFFFF);
|
||||||
|
slcr.pss_rst_ctrl.modify(|_, w| w.soft_rst(true));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
pub enum BootModePins {
|
pub enum BootModePins {
|
||||||
@ -605,7 +616,7 @@ register_bit!(boot_mode, jtag_routing, 3);
|
|||||||
register_bits_typed!(boot_mode, boot_mode_pins, u8, BootModePins, 0, 2);
|
register_bits_typed!(boot_mode, boot_mode_pins, u8, BootModePins, 0, 2);
|
||||||
|
|
||||||
register!(pss_rst_ctrl, PssRstCtrl, RW, u32);
|
register!(pss_rst_ctrl, PssRstCtrl, RW, u32);
|
||||||
register_bit!(pss_rst_ctrl, soft_rst, 1);
|
register_bit!(pss_rst_ctrl, soft_rst, 0);
|
||||||
|
|
||||||
/// Used for MioPin*.io_type
|
/// Used for MioPin*.io_type
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
use libboard_zynq::{print, println};
|
use libboard_zynq::{print, println};
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
use libboard_zynq::error_led::ErrorLED;
|
||||||
|
|
||||||
#[panic_handler]
|
#[panic_handler]
|
||||||
fn panic(info: &core::panic::PanicInfo) -> ! {
|
fn panic(info: &core::panic::PanicInfo) -> ! {
|
||||||
@ -13,6 +15,10 @@ fn panic(info: &core::panic::PanicInfo) -> ! {
|
|||||||
} else {
|
} else {
|
||||||
println!("");
|
println!("");
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "target_kasli_soc")]
|
||||||
|
{
|
||||||
|
let mut err_led = ErrorLED::error_led();
|
||||||
|
err_led.toggle(true);
|
||||||
|
}
|
||||||
loop {}
|
loop {}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user