Bare-metal Rust on Zynq-7000
Go to file
harry c69cd9951e Update README and (#59)
update to use rpi-4 directly; fix README

README: update build instruction fix missing package argument

Co-authored-by: Harry Ho <>
2020-08-11 11:24:21 +08:00
.cargo update rust + smoltcp 2019-11-11 00:28:46 +01:00
experiments i2c: disable its usage on Cora Z7-10 2020-08-10 14:24:13 +08:00
libasync libasync: assert that callback consumes data in smoltcp recv 2020-07-19 16:14:29 +08:00
libboard_zynq i2c: disable its usage on Cora Z7-10 2020-08-10 14:24:13 +08:00
libcortex_a9 libcortex_a9/mmu: share ocm3. 2020-08-07 15:10:38 +08:00
libregister finished register definitions 2020-05-01 15:38:07 +08:00
libsupport_zynq Changes usage of sev/wfe to spinlock functions. 2020-08-04 13:54:19 +08:00
openocd openocd: fix cora z7-10 PL_TAPID 2020-05-16 01:34:09 +02:00
.gitignore remove zc706.elf from gitignore 2020-01-16 02:13:11 +08:00
Cargo.lock linked_list_allocator: upgraded to 0.8.4 2020-08-03 14:48:17 +08:00
Cargo.toml Cargo.toml: flip LTO back on to fit OCM 2020-04-10 20:41:16 +02:00 Update README and (#59) 2020-08-11 11:24:21 +08:00
armv7-none-eabihf.json define custom target, use with cargo-xbuild 2019-08-06 22:03:04 +02:00 Update README and (#59) 2020-08-11 11:24:21 +08:00
channel-rust-nightly.toml Cargo.lock: fix 2020-04-25 02:03:57 +02:00
default.nix updated cargoSha256 2020-08-03 14:59:49 +08:00
qemu.gdb PoC: boot, uart output in qemu 2019-05-05 14:56:23 +02:00 add remote run script 2020-06-04 19:57:52 +08:00 PoC: boot, uart output in qemu 2019-05-05 14:56:23 +02:00
shell.nix Updated build instruction. 2020-08-05 17:08:24 +08:00 add support for cora z7 in tmux script 2020-01-24 07:51:29 +08:00


nix-shell --command "cargo xbuild --release -p experiments"

Currently the ELF output is placed at target/armv7-none-eabihf/release/experiments


Using the Xilinx toolchain

Tested with the ZC706 board.

Run the Xilinx Microprocessor Debugger:


Connect to target (given it is connected and you have permissions):

connect arm hw

Leave xmd running.

Start the Xilinx version of the GNU debugger with your latest build:

/opt/Xilinx/14.7/ISE_DS/EDK/gnu/arm/lin/bin/arm-xilinx-linux-gnueabi-gdb zc706

Connect the debugger to xmd over TCP on localhost:

target remote :1234

Proceed using gdb with load, c

Using OpenOCD

Running on the ZC706

nix-shell --command "cargo xbuild --release -p experiments"
cd openocd
openocd -f zc706.cfg

Running on the Cora Z7-10

nix-shell --command "cd experiments && cargo xbuild --release --no-default-features --features=target_cora_z7_10"
cd openocd
openocd -f cora-z7-10.cfg

Loading a bitstream into volatile memory

openocd -f zc706.cfg -c "pld load 0 blinker_migen.bit; exit"

Development Process

Clone this repo onto your development/build machine and the raspberry pi that controls the Xilinx 7000 board

On the dev machine, the below script builds zc706 and secure copies it to the target pi (in your pi $HOME directory):

cd ~/zynq-rs
./ $your_user_or_ssh_id

On the pi, we need an information rich environment that includes a relatively reliable gdb experience (that includes ctrl-p and ctrl-n command history that persists across cgdb executions), run:

ssh pi4
cd zynq-rs
# For ZC706, run:
./ 0
# For Cora Z7, run:

Time to run your code with:


or, for a more succinct experience, (identical to above)


After every build on your dev machine, simply run:


Sometimes you might need to type load after dr.