Raspberry Pi-like single board computer based on the Rockchip RV1106G3.
Raven1106 is a custom open-hardware SBC. This repository contains everything related to the project including: the board schematics and the PCB design, build scripts, configurations, device trees and file system overlays for the operating system images and all the patches needed to get everything working.
- CPU: Single-core Cortex-A7 @ 1.6 GHz
- RAM: 256MB DDR3L @ 924MHz
- Storage: SD card
- Ethernet: Full-size 100 MBit/s Ethernet port
- USB: Four USB-A ports routed through CH334F or one OTG USB-C port
- WiFi: ESP32C6 with ESP-Hosted firmware (currently not functional)
- Kernel: Linux 5.10 (Rockchip BSP)
- U-Boot: 2017.09 (Rockchip BSP)
- OS images: Debian 12 (bookworm, armhf)
TLDR: It's a learning project
The main goal of this project was to be a learning experience for designing complex high-speed digital PCBs. Creating an SBC that is almost capable enough to do basic tasks like hosting simple servers or running AI harnesses is a nice bonus. RV1106 was chosen specifically for its simplicity, integrated RAM meant no DDR routing and QFN package meant I could solder the board manually relatively easily.
What this chip lacked in the hardware it made up for in the software side of things -- BSP is absolutely terrible, outdated, barely documented (though with a lot of spelling mistakes). Programming it wasn't much better either with only a few barely working flashing tools and a USB controller that might not actually be compliant with the USB spec, as most machines can't even enumerate it. It might have been genuinely easier to make this project around a more complex BGA part than this SoC.
The board is designed in KiCad (4-layer). pcb/ contains two revisions:
pcb/v1.0— first revisionpcb/v1.1— revision with component value fixes (no PCB layout changes)
| Layer 1 - Signal | Layer 2 - Ground Plane | Layer 3 - Power Planes | Layer 4 - Signal |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
USB Impedance Miscalculation - Turns out that FSUSB42MUX doesn't act as a retransmitter but like a normal switch which adds ~10 ohm impedance to the line. Fix: Swap RN301 with 0-ohm and change R301 and R302 from 22 ohm to 10 ohm. This results the line impedance that is well in spec.
No pullups on FSPI Flash - Speaks for itself, thankfully the RV1106 has internal pull-ups that enable the chip and disable the write protection. And we don't even use it so it's a non-issue. Cannot fix this without board changes.
LED resistors too small - The LEDs shine too brightly with 1k resistors. Fix: Change R3, R4 and R5 from 1k to 10k resistors.
USB Hub crystal load too large - The CH334F is designed to work with a crystal with no load caps, adding them causes the oscillation to die down. Fix: Change R309 from 1k to 10 ohm, remove C302 and C303.
Boot button pull-up too strong - With 1k the button does not affect the chip's boot at all. Fix: Change R6 from 1k to 10k.
Wrong ESP_BOOT pin exposed - It should be pin 9, not pin 8. Fix: No way to fix it without modifying the board unfortunately, just flash the bootloader before soldering the ESP.
Reference clock not connected to the camera - Turns out not all camera modules have their own crystal oscillators. SC3336 requires a reference clock; RV1106 has two reference clock outputs, one of them is connected to the camera's reset and the other one to the IMU interrupt pin. Fix: Add a jumper from R508 to R515.
Most of these problems could have been prevented with "RTFM" (Reading The F***ing Manual).
| Path | Contents |
|---|---|
configs/ |
Defconfigs (kernel, U-Boot, crosstool-ng), device tree source, SD image layout, U-Boot env, user table |
kernel/ |
Linux 5.10 Rockchip BSP kernel |
uboot/ |
U-Boot 2017.09 Rockchip BSP |
debian/, overlayfs/ |
Debian rootfs staging area and overlay |
crosstool-ng/, legacy-toolchain/ |
Legacy uClibc toolchain (kernel/U-Boot builds) |
esp-hosted/ |
ESP32-C6 host driver source (esp_hosted_ng) |
rkbin/ |
Rockchip binary blobs (DDR init, trust) |
scripts/build.sh |
Image assembly, Debian rootfs, Docker environment |
images/ |
Build artifacts and final sdcard.img |
pcb/ |
KiCad hardware design |
docs/ |
RV1106 datasheet / reference manuals |
All builds run inside a Docker container. The first invocation builds the
rv1106-build image, then drops you into a shell with the repository
mounted at /work:
make dockerBefore building any image build the legacy toolchain for the Kernel and U-Boot.
make toolchainmake # default target: debian-image
# or explicitly:
make debian-imageKnown issue: If build fails on stage 2 debootstrap because of "Invalid format", just delete the
debian/directory, restart the container and try to build again. It does that sometimes...
This builds the kernel, device tree, and U-Boot, then creates a Debian 12
(bookworm, armhf) rootfs with debootstrap (using qemu-user-static/binfmt for
the second stage) and assembles images/sdcard.img.
Notes:
- Default login: user
debian, passwordraven(sudo user, SSH enabled). Override with theBOARD_USERandDEBIAN_PASSWORDenvironment variables. - Included packages: systemd, ifupdown, openssh-server, sudo, dhcp client,
busybox, vim-tiny, ca-certificates (see
DEBIAN_PACKAGESinscripts/build.sh). - Rootfs image size: 1 GB (
DEBIAN_ROOTFS_SIZE). - For now there's no autoresize, run
sudo resize2fs /dev/mmcblk1p5after the first boot.
| Target | Description |
|---|---|
make kernel |
Build the kernel using the legacy toolchain |
make dtb |
Preprocess and compile configs/device-tree.dts into images/ |
make uboot |
Build U-Boot (SPL + idblock + uboot.img) |
make espdriver |
Build the ESP32-C6 host driver against the kernel |
make toolchain |
Build the crosstool-ng uClibc toolchain |
make docker |
Build/enter the Docker build environment |
make *-clean |
Clean kernel / U-Boot build trees |
Each of these copies the stored defconfig from configs/, opens
menuconfig, and saves the result back to configs/:
make kernel-config
make uboot-config
make toolchain-configAll artifacts land in images/:
| File | Description |
|---|---|
sdcard.img |
Final flashable SD card image |
download.bin, idblock.img, uboot.img |
Bootloader stages |
Image, zImage, device-tree.dtb |
Kernel and device tree |
env.img |
U-Boot environment (from configs/image-env.txt) |
boot.vfat |
FAT32 boot partition (kernel + dtb) |
rootfs.ext4, rootfs.tar |
Root filesystem |
The image has no MBR/GPT; partitions are defined by the kernel command line
(blkdevparts, see configs/sdcard-image.cfg and configs/image-env.txt):
| Partition | Offset | Size | Contents |
|---|---|---|---|
| env | 0x0 | 32 KiB | U-Boot environment |
| idblock | 0x8000 | 512 KiB | Rockchip ID block (SPL) |
| uboot | 0x88000 | 256 KiB | U-Boot |
| boot | 4 MiB | 64 MiB | FAT32: kernel image + device tree |
| rootfs | 68 MiB | remainder | ext4 root filesystem |
sudo dd if=images/sdcard.img of=/dev/sdX bs=4M status=progress conv=fsyncSerial console: ttyFIQ0 at 115200 baud.




