nuttx-ox64/README.md

658 lines
20 KiB
Markdown
Raw Normal View History

2023-10-28 16:53:13 +08:00
# Apache NuttX RTOS for Pine64 Ox64 64-bit RISC-V SBC (BouffaloLab BL808)
2023-10-29 12:57:46 +08:00
_What's this BL808?_ [(Datasheet)](https://github.com/bouffalolab/bl_docs/blob/main/BL808_DS/en/BL808_DS_1.2_en.pdf) [(Reference Manual)](https://github.com/bouffalolab/bl_docs/blob/main/BL808_RM/en/BL808_RM_en_1.3.pdf)
BL808 is a complex creature with 3 (Asymmetric) RISC-V Cores (linked via IPC)...
2023-10-29 13:10:56 +08:00
1. D0 Core: [T-Head C906 64-bit RV64IMAFCV](https://www.t-head.cn/product/c906?lang=en) (480 MHz)
2023-10-29 12:57:46 +08:00
(Multimedia Core with MIPI CSI / DSI, Neural Proc Unit)
(Memory Mgmt Unit is Sv39, 128/256/512 TLB table entry. Same as Star64?)
2023-10-29 13:10:56 +08:00
1. M0 Core: [T-Head E907 32-bit RV32IMAFCP](https://www.t-head.cn/product/e907?lang=en) (320 MHz)
2023-10-29 12:57:46 +08:00
(Wireless + Peripherals Core with WiFi, BLE, BT, Zigbee, Audio)
2023-10-29 13:10:56 +08:00
1. LP Core: [T-Head E902 32-bit RV32E[M]C](https://www.t-head.cn/product/e902?lang=en) (150 MHz)
2023-10-29 12:57:46 +08:00
(Low Power Core)
[Pine64 Ox64](https://wiki.pine64.org/wiki/Ox64) is the dev board for BL808C.
(BL808C supports MIPI CSI Cameras but not MIPI DSI Displays. Maybe someday we'll see BL808D for MIPI DSI Displays)
_Is Ox64 BL808 an SBC? Or an MCU Board?_
Technically Ox64 BL808 boots 64-bit RISC-V Linux (via MicroSD), so it feels like an SBC...
- ["Booting Linux on the Pine64 Ox64 SBC"](https://adventurist.me/posts/00317)
- [OpenBouffalo Wiki](https://openbouffalo.org/index.php/Main_Page)
- [Linux Image + OpenSBI + U-Boot for BL808](https://github.com/openbouffalo/buildroot_bouffalo)
[(Newer version?)](https://github.com/bouffalolab/buildroot_bouffalo)
2023-10-30 11:11:05 +08:00
- USB-C Port for Camera Module (Dual-Lane MIPI CSI)
(USB-C is not for Flashing!)
- USB 2.0 Port for USB OTG
(On-The-Go = USB Host + USB Device)
(Nope not for Flashing either)
2023-10-29 12:57:46 +08:00
But Ox64 BL808 also feels like an MCU Board...
- Form Factor is similar to MCU Board
- Limited Memory: 64 MB of RAM, [128 Megabits](https://pine64.com/product/128mb-ox64-sbc-available-on-december-2-2022/) (16 MB) of Flash Memory
- UART Pins need a USB Serial Adapter for Flashing and Console I/O
- M0 Wireless Core is 32-bit RISC-V MCU
2023-10-30 11:11:05 +08:00
_Ox64 BL808 sounds a little tiny for 64-bit Linux?_
2023-10-29 12:57:46 +08:00
2023-10-30 11:11:05 +08:00
Yeah 64-bit Linux runs with Limited RAM on the D0 Multimedia Core. But most Peripherals are hosted on the M0 Wireless Core: WiFi, BLE, BT, Zigbee, Audio, ...
2023-10-29 12:57:46 +08:00
So we flash M0 with a simple 32-bit RISC-V Firmware, to forward the Peripheral Interrupts from M0 to D0 Linux.
2023-10-30 12:27:04 +08:00
Here are the binaries loaded into D0 Multimedia Core and M0 Wireless Core, from [buildroot_bouffalo](https://github.com/openbouffalo/buildroot_bouffalo)...
2023-10-29 12:57:46 +08:00
2023-10-30 12:27:04 +08:00
* __d0_lowload_bl808_d0.bin__: This is a very basic bootloader that loads opensbi, the kernel and dts files into ram
2023-10-29 12:57:46 +08:00
2023-10-30 12:27:04 +08:00
* __m0_lowload_bl808_m0.bin__: This firmware runs on M0 and forwards interupts to the D0 for several peripherals
2023-10-29 12:57:46 +08:00
2023-10-30 12:27:04 +08:00
* __bl808-firmware.bin__: A image containing OpenSBI, Uboot and uboot dtb files.
2023-10-29 12:57:46 +08:00
2023-10-30 12:27:04 +08:00
* __sdcard-*.tar.xz__: A tarball containing the rootfs for the image to be flashed to the SD card
2023-10-29 12:57:46 +08:00
Perhaps Ox64 BL808 might run more efficiently with a tiny 64-bit RTOS.
_Why Apache NuttX RTOS?_
It might be interesting to run Apache NuttX RTOS on both the D0 Multimedia Core and the M0 Wireless Core. Then D0 and M0 can talk over OpenAMP (Asymmetric Multi-Processing).
Let's explore...
2023-10-30 10:57:57 +08:00
# Flash OpenSBI and U-Boot Bootloader to Ox64 BL808
2023-10-30 12:27:04 +08:00
Before booting Linux on Ox64, we flash OpenSBI + U-Boot Bootloader to D0 Multimedia Core, and the Peripheral Interrupt Firmware to M0 Wireless Core. From [buildroot_bouffalo](https://github.com/openbouffalo/buildroot_bouffalo):
2023-10-30 10:57:57 +08:00
2023-10-30 12:27:04 +08:00
* __d0_lowload_bl808_d0.bin__: This is a very basic bootloader that loads opensbi, the kernel and dts files into ram
* __m0_lowload_bl808_m0.bin__: This firmware runs on M0 and forwards interupts to the D0 for several peripherals
* __bl808-firmware.bin__: A image containing OpenSBI, Uboot and uboot dtb files.
Here are the steps, based on the [Official Flashing Instructions](https://github.com/openbouffalo/buildroot_bouffalo#flashing-instructions)...
2023-10-30 19:21:47 +08:00
1. We tested with [Pine64 Woodpecker CH340G USB Serial Adapter](https://pine64.com/product/serial-console-woodpecker-edition/) on macOS x64.
Warning: Some USB Serial Adapters [WON'T WORK!](https://wiki.pine64.org/wiki/Ox64#Compatible_UARTs_when_in_bootloader_mode)
Probably because we are connecting at 2 Mbps, which might be too fast for some USB Serial Adapters.
[(Like this CP2102, which shows garbled text at 2 Mbps)](https://www.lazada.sg/products/i2037772272-s11135131253.html)
2023-10-30 19:23:33 +08:00
1. Connect a USB Serial Adapter to __Ox64 Flashing UART__:
2023-10-30 15:32:18 +08:00
+ Flashing UART TX is physical pin 1 / GPIO 14
+ Flashing UART RX is physical pin 2 / GPIO 15
2023-10-30 18:22:44 +08:00
+ Remember to connect GND
2023-10-30 19:23:33 +08:00
+ Baud 2,000,000 (2 Mbps)
2023-10-30 15:32:18 +08:00
2023-10-30 20:25:31 +08:00
Start the USB Serial Terminal (Flashing UART).
2023-10-30 19:21:47 +08:00
Power up Ox64 via the Micro USB Port. Ox64 Green LED should light up.
2023-10-30 15:32:18 +08:00
2023-10-30 20:25:31 +08:00
In the USB Serial Terminal (Flashing UART), we should see the Ox64 Factory Test Firmware...
2023-10-30 19:21:47 +08:00
```text
2023-10-30 20:29:06 +08:00
Build:19:50:39,Nov 20 2022
Copyright (c) 2022 Bouffalolab team
dynamic memory init success,heap size = 93 Kbyte
sig1:ffff32ff
sig2:0000ffff
Pong!
Ping!
```
[(Source)](https://adventurist.me/posts/00317)
2023-10-30 22:00:55 +08:00
If the text appears garbled: Try a different USB Serial Adapter. (See above)
2023-10-30 22:07:32 +08:00
My prototype version shows this instead...
2023-10-30 20:29:06 +08:00
```text
2023-10-30 19:21:47 +08:00
Init CLI with event Driven
start aos loop...
CLI RAW Data, c906
/romfs/c906.bin not found!
```
[(Source)](https://gist.github.com/lupyuen/43676407bbced733e65566879e18732b)
1. Initial Check: Set BL808 board to programming mode
2023-10-30 21:20:22 +08:00
+ Remove the microSD Card
2023-10-30 15:32:18 +08:00
+ Press and Hold BOOT Button
2023-10-30 18:22:44 +08:00
+ Unplug and replug the Micro USB Port
2023-10-30 15:32:18 +08:00
+ Release BOOT button
2023-10-30 21:20:22 +08:00
+ Ox64 Green LED should turn on
2023-10-30 15:32:18 +08:00
2023-10-30 20:25:31 +08:00
In the USB Serial Terminal (Flashing UART), we should see this...
2023-10-30 19:21:47 +08:00
```text
.
```
Yep Ox64 is ready for flashing!
1. Now we prepare to flash:
Disconnect the USB Serial Terminal (to release the Flashing UART)
Set BL808 board to programming mode
2023-10-30 21:20:22 +08:00
+ Remove the microSD Card
2023-10-30 19:21:47 +08:00
+ Press and Hold BOOT Button
+ Unplug and replug the Micro USB Port
+ Release BOOT button
2023-10-30 21:20:22 +08:00
+ Ox64 Green LED should turn on
2023-10-30 15:32:18 +08:00
2023-10-30 19:54:18 +08:00
1. We download the Ox64 Binaries...
- [bl808-linux-pine64_ox64_full_defconfig.tar.gz](https://github.com/openbouffalo/buildroot_bouffalo/releases/download/v1.0.1/bl808-linux-pine64_ox64_full_defconfig.tar.gz)
From the latest Ox64 Linux Release...
- [openbouffalo/buildroot_bouffalo (Release v1.0.1)](https://github.com/openbouffalo/buildroot_bouffalo/releases/tag/v1.0.1)
Unzip the download and we should see this...
```bash
→ ls -l firmware
7340032 bl808-firmware.bin
31360 d0_lowload_bl808_d0.bin
65760 m0_lowload_bl808_m0.bin
43859444 sdcard-pine64_ox64_full_defconfig.img.xz
```
2023-10-30 12:27:04 +08:00
1. We'll run BouffaloLab DevCube for Flashing BL808.
Only Ubuntu x64, macOS and Windows are supported.
2023-10-30 22:00:55 +08:00
TODO: How to flash BL808 on Arm64 SBCs and Pinebook Pro? Sigh. See [bflb-iot-tool / bflb-mcu-tool](https://wiki.pine64.org/wiki/Ox64#Alternative:_Open-Source_Flashing)
2023-10-30 10:57:57 +08:00
2023-10-30 21:20:22 +08:00
1. Download Bouffalo Lab DevCube 1.8.3 from...
2023-10-30 10:57:57 +08:00
2023-10-30 21:20:22 +08:00
[openbouffalo.org/static-assets/bldevcube/BouffaloLabDevCube-v1.8.3.zip](https://openbouffalo.org/static-assets/bldevcube/BouffaloLabDevCube-v1.8.3.zip)
[(1.8.4 and later won't work)](https://github.com/openbouffalo/buildroot_bouffalo/issues/60)
2023-10-30 10:57:57 +08:00
2023-10-30 20:25:31 +08:00
May need to Grant Execute Permission...
2023-10-30 10:57:57 +08:00
2023-10-30 20:25:31 +08:00
```bash
2023-10-30 21:20:22 +08:00
cd BouffaloLabDevCube-v1.8.3
chmod +x BLDevCube-macos-x86_64
./BLDevCube-macos-x86_64
2023-10-30 20:25:31 +08:00
```
2023-10-30 10:57:57 +08:00
1. Run DevCube, select [BL808], and switch to [MCU] page
2023-10-30 20:25:31 +08:00
1. M0 Group[Group0]
Image Addr [0x58000000]
[PATH to m0_lowload_bl808_m0.bin]
2023-10-30 10:57:57 +08:00
2023-10-30 20:25:31 +08:00
1. D0 Group[Group0]
Image Addr [0x58100000]
[PATH to d0_lowload_bl808_d0.bin]
2023-10-30 10:57:57 +08:00
2023-10-30 21:53:19 +08:00
1. Set UART Rate to 230400
Don't set to 2000000, it will fail on macOS!
[(Same problem when flashing BL602)](https://lupyuen.github.io/articles/flash)
2023-10-30 10:57:57 +08:00
1. Click 'Create & Download' and wait until it's done
2023-10-30 22:00:55 +08:00
[(See the log)](https://gist.github.com/lupyuen/125e15be5ed1e034bed33d16ed496d87)
2023-10-30 20:25:31 +08:00
2023-10-30 10:57:57 +08:00
1. Switch to [IOT] page
2023-10-30 20:25:31 +08:00
1. Enable 'Single Download'
Set Address to 0x800000
Choose [bl808-firmware.bin]
2023-10-30 10:57:57 +08:00
2023-10-30 21:53:19 +08:00
1. Set UART Rate to 230400
Don't set to 2000000, it will fail on macOS!
[(Same problem when flashing BL602)](https://lupyuen.github.io/articles/flash)
2023-10-30 10:57:57 +08:00
1. Click 'Create & Download' again and wait until it's done
2023-10-30 22:00:55 +08:00
[(See the log)](https://gist.github.com/lupyuen/e8c0aca0ebd0f1eae034b0996a5b3ec3)
2023-10-30 20:25:31 +08:00
1. Connect a USB Serial Adapter to __Ox64 Flashing UART__:
+ Flashing UART TX is physical pin 1 / GPIO 14
+ Flashing UART RX is physical pin 2 / GPIO 15
+ Remember to connect GND
+ Baud 2,000,000 (2 Mbps)
Start the USB Serial Terminal (Flashing UART).
Unplug and replug the Micro USB Port.
(Don't press the Boot Button!)
1. On the USB Serial Terminal (Flashing UART) we should see...
```text
[I][] Powered by BouffaloLab
[I][] Build:11:52:22,Mar 6 2023
[I][] Copyright (c) 2023 OpenBouffalo team
[I][] Copyright (c) 2022 Bouffalolab team
[I][] =========== flash cfg ==============
[I][] jedec id 0xEF6018
[I][] mid 0xEF
[I][] iomode 0x04
[I][] clk delay 0x01
[I][] clk invert 0x01
[I][] read reg cmd0 0x05
[I][] read reg cmd1 0x35
[I][] write reg cmd0 0x01
[I][] write reg cmd1 0x31
[I][] qe write len 0x01
[I][] cread support 0x00
[I][] cread code 0xFF
[I][] burst wrap cmd 0x77
[I][] sector size: 0x04
[I][] =====================================
[I][] dynamic memory init success,heap size = 156 Kbyte
[I][MAIN] Starting Mailbox Handlers
[I][MBOX] Forwarding Interupt SDH (33) to D0 (0x58008bbc)
[I][MBOX] Forwarding Interupt GPIO (60) to D0 (0x58008d0e)
[I][MAIN] Running...
[I][MBOX] Mailbox IRQ Stats:
[I][MBOX] .Peripheral SDH (33): 0
[I][MBOX] .Peripheral GPIO (60): 0
[I][MBOX] Unhandled Interupts: 0 Unhandled Signals 0
```
[(Source)](https://gist.github.com/lupyuen/52ccdf076ae294db26e837e6ffc4bafb)
Yep we have flashed the OpenBouffalo Firmware successfully!
1. Connect a USB Serial Adapter to __Ox64 Serial Console__:
+ Serial Console TX is physical pin 32 / GPIO 16
+ Serial Console RX is physical pin 31 / GPIO 17
+ Remember to connect GND
+ Baud 2,000,000 (2 Mbps)
Start the USB Serial Terminal (Serial Console).
Unplug and replug the Micro USB Port.
(Don't press the Boot Button!)
2023-10-30 22:08:58 +08:00
Let's boot Linux...
2023-10-30 12:27:04 +08:00
2023-10-30 10:57:57 +08:00
# Boot Linux on Ox64 BL808
2023-10-30 12:27:04 +08:00
Now that D0 Multimedia Core is flashed with OpenSBI and U-Boot Bootloader, we're ready to boot Linux on microSD!
2023-10-30 10:57:57 +08:00
Based on the [Official Flashing Instructions](https://github.com/openbouffalo/buildroot_bouffalo#flashing-instructions)...
2023-10-30 21:20:22 +08:00
1. Look for the microSD Image that we downloaded earlier...
```text
sdcard-pine64_ox64_full_defconfig.img.xz
```
Uncompress the file to get...
```text
sdcard-pine64_ox64_full_defconfig.img
```
1. Flash the uncompressed image to your microSD card.
2023-10-30 10:57:57 +08:00
2023-10-30 21:20:22 +08:00
You can use [Balena Etcher](https://github.com/balena-io/etcher), GNOME Disks or `dd`.
2023-10-30 10:57:57 +08:00
2023-10-30 18:22:44 +08:00
1. Insert the microSD Card into Ox64.
2023-10-30 10:57:57 +08:00
2023-10-30 21:20:22 +08:00
1. Connect a USB Serial Adapter to __Ox64 Flashing UART__:
+ Flashing UART TX is physical pin 1 / GPIO 14
+ Flashing UART RX is physical pin 2 / GPIO 15
+ Remember to connect GND
+ Baud 2,000,000 (2 Mbps)
Start the USB Serial Terminal (Flashing UART).
2023-10-30 18:22:44 +08:00
Unplug and replug the Micro USB Port.
2023-10-30 21:20:22 +08:00
(Don't press the Boot Button!)
2023-10-30 22:00:55 +08:00
1. On the USB Serial Terminal (Flashing UART) we should see the same thing as earlier...
2023-10-30 21:20:22 +08:00
```text
2023-10-30 22:00:55 +08:00
[I][MAIN] Starting Mailbox Handlers
[I][MBOX] Forwarding Interupt SDH (33) to D0 (0x58008bbc)
[I][MBOX] Forwarding Interupt GPIO (60) to D0 (0x58008d0e)
[I][MAIN] Running...
[I][MBOX] Mailbox IRQ Stats:
[I][MBOX] .Peripheral SDH (33): 0
[I][MBOX] .Peripheral GPIO (60): 0
[I][MBOX] Unhandled Interupts: 0 Unhandled Signals 0
2023-10-30 21:20:22 +08:00
```
2023-10-30 22:00:55 +08:00
[(Source)](https://gist.github.com/lupyuen/52ccdf076ae294db26e837e6ffc4bafb)
2023-10-30 21:20:22 +08:00
1. Connect a USB Serial Adapter to __Ox64 Serial Console__:
2023-10-30 18:22:44 +08:00
+ Serial Console TX is physical pin 32 / GPIO 16
+ Serial Console RX is physical pin 31 / GPIO 17
+ Remember to connect GND
2023-10-30 19:23:33 +08:00
+ Baud 2,000,000 (2 Mbps)
2023-10-30 18:22:44 +08:00
2023-10-30 21:20:22 +08:00
Start the USB Serial Terminal (Serial Console).
Unplug and replug the Micro USB Port.
(Don't press the Boot Button!)
1. On the USB Serial Terminal (Serial Console) we should see...
2023-10-30 18:22:44 +08:00
2023-10-30 21:20:22 +08:00
```text
2023-10-30 22:00:55 +08:00
[I][] Powered by BouffaloLab
[I][] Build:11:52:04,Mar 6 2023
[I][] Copyright (c) 2023 OpenBouffalo team
[I][] Copyright (c) 2022 Bouffalolab team
[I][] dynamic memory init success,heap s[I][LowLoad] D0 start...
[I][LowLoad] low_load start...
[I][LowLoad] Header at 0x5d5ff000
[I][LowLoad] Section dtb(1) - Start 0x5d5ff100, Size 14314
[I][LowLoad] Copying DTB to 0x51ff8000...0x51ffb7ea
[I][LowLoad] Done!
[I][LowLoad] Section OpenSBI(2) - Start 0x5d60f100, Size 109864
[I][LowLoad] Copying OpenSBI to 0x3ef80000...0x3ef9ad28
[I][LowLoad] Done!
[I][LowLoad] Section Kernel(3) - Start 0x5d62f100, Size 315597
[I][LowLoad] Uncompressing Kernel to 0x50000000...
[I][LowLoad] Done!
[I][LowLoad] CRC: 00000000
[I][LowLoad] load time: 61306 us
[I][LowLoad] ing PMP
[I][LowLoad] Booting OpenSBI at 0x000000003ef80000 with DTB at 0x51ff8000
...
OpenSBI v1.2
Platform Name : Pine64 Ox64 (D0)
Platform Features medeleg
Platform HART Count : 1
Platform IPI Device : aclint-mswi
Platform Timer Device : aclint-mtimer @ 1000000Hz
Platform Console Device : bflb_uart
Platform HSM Device : ---
Platform PMU Device : ---
Platform Reboot Device : ---
Platform Shutdown Device : ---
Firmware Base : 0x3ef80000
Firmware Size : 200 KB
Runtime SBI Version : 1.0
...
U-Boot 2023.04-rc2 (Mar 06 2023 - 11:48:40 +0000)
DRAM: 64 MiB
Core: 36 devices, 17 uclasses, devicetree: board
MMC: mmc@20060000: 0
Loading Environment from FAT... Unable to read "uboot.env" from mmc0:2...
...
Starting kernel ...
Linux version 6.2.0 (runner@fv-az587-938) (riscv64-unknown-linux-gnu-gcc (Xuantie-900 linux-5.10.4 glibc gcc Toolchain V2.6.1 B-20220906) 10.2.0, GNU ld (GNU Binutils) 2.35) #1 Mon Mar 6 11:17:27 UTC 2023
...
Welcome to Buildroot
ox64 login:
2023-10-30 21:20:22 +08:00
```
2023-10-30 12:27:04 +08:00
2023-10-30 21:53:19 +08:00
[(Source)](https://gist.github.com/lupyuen/3035a70d52d2d1d529e96f5292f54210)
2023-10-30 22:00:55 +08:00
Yep Linux is running on Ox64 yay!
2023-10-29 12:57:46 +08:00
# Inspect the Linux Image for Ox64 BL808
2023-10-28 17:36:02 +08:00
_Will Apache NuttX RTOS boot on Ox64 BL808?_
2023-10-28 16:53:13 +08:00
2023-10-29 12:57:46 +08:00
Let's examine the Linux Kernel Image for Ox64, and we replicate the same format for NuttX. (Which is how we ported NuttX to 64-bit RISC-V Star64 JH7110 SBC)
2023-10-28 17:36:02 +08:00
2023-10-28 20:55:27 +08:00
We download the Ox64 Binaries...
2023-10-28 17:36:02 +08:00
2023-10-28 17:37:04 +08:00
- [bl808-linux-pine64_ox64_full_defconfig.tar.gz](https://github.com/openbouffalo/buildroot_bouffalo/releases/download/v1.0.1/bl808-linux-pine64_ox64_full_defconfig.tar.gz)
2023-10-28 17:36:02 +08:00
2023-10-28 20:55:27 +08:00
From the latest Ox64 Linux Release...
2023-10-28 17:37:04 +08:00
2023-10-28 20:55:27 +08:00
- [openbouffalo/buildroot_bouffalo (Release v1.0.1)](https://github.com/openbouffalo/buildroot_bouffalo/releases/tag/v1.0.1)
2023-10-28 16:53:13 +08:00
2023-10-28 20:52:53 +08:00
Unzip it and mount the SD Card Image...
2023-10-28 16:53:13 +08:00
```bash
2023-10-28 20:34:43 +08:00
→ ls -l sdcard-pine64_ox64_full_defconfig
- 13,154,816 Image
- 4,012 bl808-pine64-ox64.dtb
- 4,106 bl808-sipeed-m1s.dtb
- 350 boot-m1s.scr
- 352 boot-pine64.scr
- 352 boot.scr
d 96 extlinux
2023-10-28 16:53:13 +08:00
```
2023-10-28 17:36:02 +08:00
Dump the `Image` as hex...
2023-10-28 16:53:13 +08:00
```bash
2023-10-28 20:34:43 +08:00
→ hexdump sdcard-pine64_ox64_full_defconfig/Image
2023-10-28 16:53:13 +08:00
0000000 4d 5a 6f 10 20 08 01 00 00 00 20 00 00 00 00 00
0000010 00 80 cd 00 00 00 00 00 00 00 00 00 00 00 00 00
0000020 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000030 52 49 53 43 56 00 00 00 52 53 43 05 40 00 00 00
```
2023-10-28 21:14:24 +08:00
The Linux Kernel Image begins with this __RISC-V Linux Image Header__...
2023-10-28 16:53:13 +08:00
- [__"Boot Image Header in RISC-V Linux"__](https://www.kernel.org/doc/html/latest/riscv/boot-image-header.html)
Here are the decoded bytes...
1. __code0__: Executable code
(4 bytes, offset `0x00`)
```text
4d 5a 6f 10
```
1. __code1__: Executable code
(4 bytes, offset `0x04`)
```text
20 08 01 00
```
1. __text_offset__: Image load offset, little endian
(8 bytes, offset `0x08`)
```text
00 00 20 00 00 00 00 00
```
1. __image_size__: Effective Image size, little endian
(8 bytes, offset `0x10`)
```text
00 80 cd 00 00 00 00 00
```
1. __flags__: Kernel flags, little endian
(8 bytes, offset `0x18`)
```text
00 00 00 00 00 00 00 00
```
1. __version__: Version of this header (_MinL_ _MinM_ `.` _MajL_ _MajM_)
(4 bytes, offset `0x20`)
```text
02 00 00 00
```
1. __res1__: Reserved
(4 bytes, offset `0x24`)
```text
00 00 00 00
```
1. __res2__: Reserved
(8 bytes, offset `0x28`)
```text
00 00 00 00 00 00 00 00
```
1. __magic__: Magic number, little endian, "RISCV\x00\x00\x00"
(8 bytes, offset `0x30`)
```text
52 49 53 43 56 00 00 00
```
1. __magic2__: Magic number 2, little endian, "RSC\x05"
(4 bytes, offset `0x38`)
```text
52 53 43 05
```
1. __res3__: Reserved for PE COFF offset
(4 bytes, offset `0x3C`)
```text
40 00 00 00
```
Our NuttX Kernel shall __recreate this RISC-V Linux Image Header__. (Total `0x40` bytes)
(Or U-Boot Bootloader might refuse to boot NuttX)
2023-10-28 17:38:38 +08:00
Header Values are exactly the same as Star64. (Except the Image Size and Executable Code, since the Jump Address is different)
2023-10-28 17:36:02 +08:00
2023-10-28 17:40:12 +08:00
Thus we simply reuse the code from NuttX Star64!
2023-10-29 12:57:46 +08:00
# Linux Device Tree for Ox64 BL808
2023-10-28 18:59:48 +08:00
TODO: Dump the Device Tree
2023-10-28 21:00:49 +08:00
```text
dtc \
-o bl808-pine64-ox64.dts \
-O dts \
-I dtb \
bl808-pine64-ox64.dtb
```
Here's the Decompiled Device Tree: [bl808-pine64-ox64.dts](bl808-pine64-ox64.dts)
2023-10-28 21:05:46 +08:00
TODO: Transmit to UART3 at 0x30002000. Reuse the BL602 UART Driver for NuttX.
```text
serial@30002000 {
compatible = "bflb,bl808-uart";
reg = <0x30002000 0x1000>;
interrupts = <0x14 0x04>;
clocks = <0x04>;
status = "okay";
phandle = <0x0a>;
};
```
[(Source)](https://github.com/lupyuen/nuttx-ox64/blob/main/bl808-pine64-ox64.dts#L89-L96)
2023-10-28 19:30:05 +08:00
2023-10-28 21:14:24 +08:00
TODO: Forward the Interrupts from M0 Wireless Core to D0 Multimedia Core via Mailbox / IPC (Where are the addresses documented?)
```text
mailbox@30005000 {
compatible = "bflb,bl808-ipc";
reg = <
0x30005000 0x20
0x30005020 0x20
0x2000a800 0x20
0x2000a820 0x20
>;
interrupts = <0x36 0x04>;
interrupt-controller;
#interrupt-cells = <0x03>;
#mbox-cells = <0x02>;
status = "okay";
phandle = <0x03>;
};
```
[(Source)](https://github.com/lupyuen/nuttx-ox64/blob/main/bl808-pine64-ox64.dts#L118-L127)
2023-10-28 20:32:05 +08:00
TODO: Print Debug Logs with OpenSBI
2023-10-29 12:57:46 +08:00
# Documentation for Ox64 BL808
2023-10-28 21:23:50 +08:00
2023-10-28 20:32:05 +08:00
- ["Booting Linux on the Pine64 Ox64 SBC"](https://adventurist.me/posts/00317)
2023-10-29 12:57:46 +08:00
- [Pine64 Ox64 Wiki](https://wiki.pine64.org/wiki/Ox64)
2023-10-30 10:57:57 +08:00
- [Pine64 Ox64 Schematic](https://files.pine64.org/doc/ox64/PINE64_Ox64-Schematic-202221018.pdf)
2023-10-28 20:32:05 +08:00
- [OpenBouffalo Wiki](https://openbouffalo.org/index.php/Main_Page)
2023-10-29 12:57:46 +08:00
- [Linux Image + OpenSBI + U-Boot for BL808](https://github.com/openbouffalo/buildroot_bouffalo)
2023-10-28 20:32:05 +08:00
[(Newer version?)](https://github.com/bouffalolab/buildroot_bouffalo)
- [BL808 Datasheet](https://github.com/bouffalolab/bl_docs/blob/main/BL808_DS/en/BL808_DS_1.2_en.pdf)
- [BL808 Reference Manual](https://github.com/bouffalolab/bl_docs/blob/main/BL808_RM/en/BL808_RM_en_1.3.pdf)
- [BL808 D0 Core: T-Head C906 480MHz 64-bit RISC-V CPU](https://www.t-head.cn/product/c906?lang=en)
2023-10-28 21:23:24 +08:00
(Multimedia Core: MIPI CSI / DSI, Neural Proc Unit)
Memory Mgmt Unit is Sv39, 128/256/512 TLB table entry. (Same as Star64?)
2023-10-28 20:32:05 +08:00
- [BL808 M0 Core: T-Head E907 320MHz 32-bit RISC-V CPU](https://www.t-head.cn/product/e907?lang=en)
2023-10-28 21:23:24 +08:00
(Wireless + Peripherals Core: WiFi, BLE, BT, Zigbee, Audio)
2023-10-28 20:32:05 +08:00
- [BL808 LP Core: T-Head E902 150MHz 32-bit RISC-V CPU](https://www.t-head.cn/product/e902?lang=en)
(Low Power Core)
2023-10-28 20:52:53 +08:00
From [buildroot_bouffalo](https://github.com/openbouffalo/buildroot_bouffalo):
* m0_lowload_bl808_m0.bin - This firmware runs on M0 and forwards interupts to the D0 for several peripherals
* d0_lowload_bl808_d0.bin - This is a very basic bootloader that loads opensbi, the kernel and dts files into ram
* bl808-firmware.bin - A image containing OpenSBI, Uboot and uboot dtb files.
* sdcard-*.tar.xz - A tarball containing the rootfs for the image to be flashed to the SD card