Kendryte K210 / MaixGo stuff
Go to file
Wladimir J. van der Laan a5d1f5c9ae rust: Make SPI send/recv loops nicer
Use iterators to make the loops simpler.
2019-08-11 18:16:53 +00:00
doc doc: Clean up lcd controller line in onboard.md 2019-08-01 23:26:35 +02:00
r2 doc: OTP fuses A/B 2019-05-07 19:35:16 +02:00
rust rust: Make SPI send/recv loops nicer 2019-08-11 18:16:53 +00:00
src src: Add secp256k1 tests and sign/verify benchmarks 2019-05-12 23:54:47 +00:00
util/esp8266at esp8266at: Add 'dyn' for traits as requested by compiler 2019-07-26 11:15:39 +00:00
CODE_OF_CONDUCT.md Unify license and CoC 2019-05-20 15:59:28 +02:00
COPYING Unify license and CoC 2019-05-20 15:59:28 +02:00
README.md rust: Basic sdcard test 2019-08-11 09:56:54 +00:00

Maix Go / K210 stuff

Building the C projects

First, get the Kendryte C toolchain and copy or symlink the contents of the src/ folder to a checkout of https://github.com/sipeed/LicheeDan_K210_examples.git.

Then to build a certain project do:

mkdir build && cd build
cmake .. -DPROJ=<ProjectName> -DTOOLCHAIN=/opt/riscv-toolchain/bin && make

You will get 2 files, build/<ProjectName> and build/<ProjectName>.bin. The former is an ELF executable, the latter a raw binary that can be flashed or written to address 0x80000000 in SRAM and directly executed.

Building the Rust projects

Note: it's possible that these projects require Rust nightly to build. I don't intentially use nightly features, however, I always test only using the latest one so it's likely that something will sneak in

Make sure the appropriate target has been added to the toolchain that you wish to use:

rustup target add riscv64gc-unknown-none-elf

Target configuration is set up in .cargo/config, so building is a matter of:

cd rust/<name_of_project>
cargo build --release

This will produce an ELF executable in the workspace's target directory named rust/target/riscv64gc-unknown-none-elf/release/<name_of_project>.

If you have openocd working for the board, the below should work:

cargo run

Otherwise, see next section.

Running ELF

There is no need anymore to convert to raw binary, as ELF executables can be executed directly on the device (no flashing) using a recent checkout of kflash

kflash.py -t -s -p /dev/ttyUSB1 -B goE "${ELF_NAME}"

This works for both the C and Rust-produced executables. It is also possible to upload and run code on the device through JTAG and OpenOCD, but I have never got this to work myself (openocd cannot find the device).

Currently, rust generates ELF executables based at address 0xffffffff80000000 instead of the expected 0x80000000, to work around lack of medany memory model support in LLVM. To make this work with kflash I had to patch the following:

diff --git a/kflash.py b/kflash.py
index c092d08..b3bc457 100755
--- a/kflash.py
+++ b/kflash.py
@@ -976,7 +976,7 @@ class KFlash:
                     if segment['p_type']!='PT_LOAD' or segment['p_filesz']==0 or segment['p_vaddr']==0:
                         print("Skipped")
                         continue
-                    self.flash_dataframe(segment.data(), segment['p_vaddr'])
+                    self.flash_dataframe(segment.data(), segment['p_vaddr'] & 0xffffffff)

             def flash_firmware(self, firmware_bin, aes_key = None, address_offset = 0, sha256Prefix = True):
                 # type: (bytes, bytes, int, bool) -> None

Documentation

Additional register documentation that is not in the datasheet can be found here:

External:

  • k210.svd - Peripheral description for rust K210 BSP (k210-pac project)

Projects

This is a general random sandbox with silly projects for me to play around with the Maix Go, some are in C and some are in Rust. It turns out that this cheap board is great for playing around with Rust embedded in an environment that has a fair amount of memory and number of peripherals available by default!

glyph_mapping

Variation of the DVP sample that processes the camera input through a simple DOS 8×8 font glyph-mapping algorithm and shows it on the display.

README

dump_otp

Dumps the contents of the OTP (One-Time Programmable memory) of the K210 CPU to serial output in Intel HEX format.

README

secp256k1_{tests,bench}

Run tests and benchmarks for the secp256k1 elliptic curve cryptographic library on this RISC-V CPU.

rust/accelerometer

Read measurements from MSA300 accelerometer. Display a dot on the screen to visualize the current orientation and magnitude.

README

rust/k210-console

Console emulator written in Rust for the Maix Go.

Barely functional at the moment. This is really a test for some functionality like SPI and driving the display from Rust, and for playing with Rust RISC-V 64 in general.

README

rust/mandelbrot

Mandelbrot fractal zoom.

README

rust/game-of-life

"Game of life" cellular automata simulation. The state can be manipulated through the touch screen. The amount of pressure applied determines the radius of the state change.

README

rust/uart-passthrough

Pass through UART from host to the ESP8285 WIFI chip.

README

rust/rgbcontrol

Control the color of the RGB LED from the touch screen.

README

rust/esp8266at

A crate for communicating with WiFi using the ESP8266 using AT commands. TODO: move this to its own repository.

README

rust/weather

Uses the ESP8285 WiFi chip of the Maix Go to fetch weather data from wttr.in and print it to the display using k210-console.

README

rust/dvp-ov

A straightforward passthrough test for video handling, based on dvp_ov in the SDK: read frames from the OV2640 image sensor and display them on the LCD.

README

rust/glyph-mapping

Rust port of the glyph mapping demo.

README

rust/term-server

Uses the ESP8285 WiFi chip of the Maix Go to listen for incoming connections, displaying the data on the terminal.

README

rust/secp256k1-test

Test for using the elliptic curve cryptography library secp256k1, written in C, from rust on a RISC-V device.

README

rust/sdtest

Read and write to a SD card using SPI.

README

ROM re'ing

Annotated radare2 config files for the Boot ROM and OTP can be found under r2.

Other projects

Some interesting K210-based projects and demos by other people: