|
| 1 | +# Hummingbird E603 Evaluation SoC |
| 2 | + |
| 3 | +This guide provides instructions for building and running the **Nuclei Linux SDK** |
| 4 | +on the **Hummingbird E603 Evaluation SoC**. |
| 5 | + |
| 6 | +## Requirements |
| 7 | + |
| 8 | +First, clone the SDK repository and checkout to the `dev_nuclei_6.6_v3_e603` branch. |
| 9 | + |
| 10 | +```bash |
| 11 | +git clone -b dev_nuclei_6.6_v3_e603 https://github.com/Nuclei-Software/nuclei-linux-sdk |
| 12 | +``` |
| 13 | + |
| 14 | +> [!IMPORTANT] |
| 15 | +> Make sure to initialize and update all submodules. |
| 16 | +
|
| 17 | +```bash |
| 18 | +git submodule update --init --recursive |
| 19 | +``` |
| 20 | + |
| 21 | +## How to Build |
| 22 | + |
| 23 | +The CPU core used in the Hummingbird E603 SoC is `ux600fd`, based on the `rv64imafdc` |
| 24 | +instruction set. The corresponding Device Tree Source (DTS) file is `nuclei_rv64imafdc.dts`. |
| 25 | + |
| 26 | +The DTS file has been pre-configured to match the E603's hardware. You do **NOT** |
| 27 | +need to modify it. To build the required components, simply run: |
| 28 | + |
| 29 | +```bash |
| 30 | +cd /path/to/nuclei-linux-sdk |
| 31 | +make CORE=ux600fd freeloader bootimages |
| 32 | +``` |
| 33 | + |
| 34 | +After a successful build, the generated files will be located in the `work/evalsoc/` |
| 35 | +directory: |
| 36 | + |
| 37 | +```bash |
| 38 | +tree -L 1 work/evalsoc |
| 39 | +work/evalsoc |
| 40 | +├── boot |
| 41 | +├── boot.zip |
| 42 | +├── buildroot_initramfs |
| 43 | +├── buildroot_initramfs_sysroot |
| 44 | +├── freeloader |
| 45 | +├── initramfs.cpio.gz |
| 46 | +├── initramfs.cpio.gz.lz4 |
| 47 | +├── linux |
| 48 | +├── nuclei_rv64imafdc.dtb |
| 49 | +├── nuclei_rv64imafdc.dts.preprocessed |
| 50 | +├── opensbi |
| 51 | +├── README.txt |
| 52 | +├── run.log |
| 53 | +└── u-boot |
| 54 | +``` |
| 55 | + |
| 56 | +- Files in `work/evalsoc/boot` are the boot materials for **SDCard boot**. |
| 57 | +- `work/evalsoc/freeloader/freeloader.elf` is the **freeloader binary** to be loaded |
| 58 | +onto the FPGA board. |
| 59 | + |
| 60 | +## How to Run |
| 61 | + |
| 62 | +### Required Hardware and Tools |
| 63 | + |
| 64 | +- [Nuclei DDR200T Evaluation Board](https://www.nucleisys.com/developboard.php#ddr200t) |
| 65 | +- [A Hummingbird Debugger Kit](https://www.nucleisys.com/developboard.php#debuggerkit) |
| 66 | +- A microSD card with with sufficient capacity for boot files |
| 67 | +- [Nuclei OpenOCD](https://doc.nucleisys.com/nuclei_tools/openocd/index.html), available |
| 68 | +in your `PATH` |
| 69 | +- A serial terminal tool (e.g., [minicom](https://salsa.debian.org/minicom-team/minicom), |
| 70 | +[MobaXterm](https://mobaxterm.mobatek.net/), or similar) |
| 71 | + |
| 72 | +### Steps to Boot Linux |
| 73 | + |
| 74 | +1. Ensure the FPGA is properly programmed with the correct bitstream. |
| 75 | +2. Connect the Hummingbird Debugger Kit to the board. |
| 76 | +3. Open a UART terminal with the following settings: |
| 77 | + - Baud Rate: 115200 |
| 78 | + - Data Bits: 8 |
| 79 | + - Parity: None |
| 80 | + - Stop Bits: 1 |
| 81 | + - Flow Control: None |
| 82 | +4. Copy all files from `work/evalsoc/boot` to the microSD card. |
| 83 | +5. Insert the microSD card into the board’s SD slot (J57, next to the TFT LCD). |
| 84 | +6. Run `make upload_freeloader` to upload the freeloader into on-board Flash. |
| 85 | + |
| 86 | +Once all above is done, CPU will start run, freeloader will copy opensbi |
| 87 | +and u-boot from flash into DDR RAM, then opensbi will boot uboot, and uboot |
| 88 | +will automatically load linux image and initramfs from SDCard and boot linux |
| 89 | +if everything is prepared correctly. |
| 90 | + |
| 91 | +> [!NOTE] |
| 92 | +> Default login credentials: |
| 93 | +> **Username**: `root` |
| 94 | +> **Password**: `nuclei` |
| 95 | +
|
| 96 | +After booting, you’ll see the system log output in your serial terminal, |
| 97 | +indicating that Linux is up and running. |
| 98 | + |
| 99 | +```txt |
| 100 | +OpenSBI v1.3 |
| 101 | +Build time: 2025-08-01 10:58:05 +0800 |
| 102 | +Build compiler: gcc version 14.2.1 20240816 (g553a166de) |
| 103 | + ____ _____ ____ _____ |
| 104 | + / __ \ / ____| _ \_ _| |
| 105 | + | | | |_ __ ___ _ __ | (___ | |_) || | |
| 106 | + | | | | '_ \ / _ \ '_ \ \___ \| _ < | | |
| 107 | + | |__| | |_) | __/ | | |____) | |_) || |_ |
| 108 | + \____/| .__/ \___|_| |_|_____/|___/_____| |
| 109 | + | | |
| 110 | + |_| |
| 111 | +
|
| 112 | +Platform Name : nuclei,evalsoc |
| 113 | +Platform Features : medeleg |
| 114 | +Platform HART Count : 8 |
| 115 | +Platform IPI Device : aclint-mswi |
| 116 | +Platform Timer Device : aclint-mtimer @ 32768Hz |
| 117 | +Platform Console Device : nuclei_uart |
| 118 | +Platform HSM Device : --- |
| 119 | +Platform PMU Device : --- |
| 120 | +Platform Reboot Device : nuclei_reset |
| 121 | +Platform Shutdown Device : nuclei_reset |
| 122 | +Platform Suspend Device : --- |
| 123 | +Platform CPPC Device : --- |
| 124 | +Firmware Base : 0x80000000 |
| 125 | +Firmware Size : 392 KB |
| 126 | +Firmware RW Offset : 0x40000 |
| 127 | +Firmware RW Size : 136 KB |
| 128 | +Firmware Heap Offset : 0x56000 |
| 129 | +Firmware Heap Size : 48 KB (total), 3 KB (reserved), 9 KB (used), 35 KB (free) |
| 130 | +Firmware Scratch Size : 4096 B (total), 760 B (used), 3336 B (free) |
| 131 | +Runtime SBI Version : 1.0 |
| 132 | +
|
| 133 | +Domain0 Name : root |
| 134 | +Domain0 Boot HART : 0 |
| 135 | +Domain0 HARTs : 0*,1*,2*,3*,4*,5*,6*,7* |
| 136 | +Domain0 Region00 : 0x0000000018031000-0x0000000018031fff M: (I,R,W) S/U: () |
| 137 | +Domain0 Region01 : 0x000000001803c000-0x000000001803cfff M: (I,R,W) S/U: () |
| 138 | +Domain0 Region02 : 0x0000000018032000-0x0000000018033fff M: (I,R,W) S/U: () |
| 139 | +Domain0 Region03 : 0x0000000018034000-0x0000000018037fff M: (I,R,W) S/U: () |
| 140 | +Domain0 Region04 : 0x0000000018038000-0x000000001803bfff M: (I,R,W) S/U: () |
| 141 | +Domain0 Region05 : 0x0000000080000000-0x000000008003ffff M: (R,X) S/U: () |
| 142 | +Domain0 Region06 : 0x0000000080040000-0x000000008007ffff M: (R,W) S/U: () |
| 143 | +Domain0 Region07 : 0x0000000000000000-0xffffffffffffffff M: (R,W,X) S/U: (R,W,X) |
| 144 | +Domain0 Next Address : 0x0000000080200000 |
| 145 | +Domain0 Next Arg1 : 0x0000000088000000 |
| 146 | +Domain0 Next Mode : S-mode |
| 147 | +Domain0 SysReset : yes |
| 148 | +Domain0 SysSuspend : yes |
| 149 | +
|
| 150 | +Boot HART ID : 0 |
| 151 | +Boot HART Domain : root |
| 152 | +Boot HART Priv Version : v1.11 |
| 153 | +Boot HART Base ISA : rv64imafdc |
| 154 | +Boot HART ISA Extensions : time |
| 155 | +Boot HART PMP Count : 8 |
| 156 | +Boot HART PMP Granularity : 4096 |
| 157 | +Boot HART PMP Address Bits: 30 |
| 158 | +Boot HART MHPM Count : 4 |
| 159 | +Boot HART MIDELEG : 0x0000000000000222 |
| 160 | +Boot HART MEDELEG : 0x000000000000b109 |
| 161 | +
|
| 162 | +
|
| 163 | +U-Boot 2024.01-19281-gd1308a36c5 (Aug 01 2025 - 10:58:03 +0800) |
| 164 | +
|
| 165 | +CPU: rv64imafdc |
| 166 | +Model: nuclei,evalsoc |
| 167 | +DRAM: 2 GiB |
| 168 | +Board: Initialized |
| 169 | +Core: 25 devices, 13 uclasses, devicetree: board |
| 170 | +MMC: Nuclei SPI version 0xee010102 |
| 171 | +spi@10034000:mmc@0: 0 |
| 172 | +Loading Environment from nowhere... OK |
| 173 | +In: serial@10013000 |
| 174 | +Out: serial@10013000 |
| 175 | +Err: serial@10013000 |
| 176 | +Hit any key to stop autoboot: 0 |
| 177 | +switch to partitions #0, OK |
| 178 | +mmc0 is current device |
| 179 | +Scanning mmc 0:1... |
| 180 | +Found U-Boot script /boot.scr |
| 181 | +725 bytes read in 162 ms (3.9 KiB/s) |
| 182 | +## Executing script at 80200000 |
| 183 | +Boot images located in . |
| 184 | +Loading kernel: ./uImage.lz4 |
| 185 | +4164221 bytes read in 17709 ms (229.5 KiB/s) |
| 186 | +Loading ramdisk: ./uInitrd.lz4 |
| 187 | +7938099 bytes read in 33604 ms (230.5 KiB/s) |
| 188 | +./kernel.dtb not found, ignore it |
| 189 | +Starts booting from SD |
| 190 | +## Booting kernel from Legacy Image at 83000000 ... |
| 191 | + Image Name: Linux |
| 192 | + Image Type: RISC-V Linux Kernel Image (lz4 compressed) |
| 193 | + Data Size: 4164157 Bytes = 4 MiB |
| 194 | + Load Address: 80400000 |
| 195 | + Entry Point: 80400000 |
| 196 | + Verifying Checksum ... OK |
| 197 | +## Loading init Ramdisk from Legacy Image at 88300000 ... |
| 198 | + Image Name: Initrd |
| 199 | + Image Type: RISC-V Linux RAMDisk Image (lz4 compressed) |
| 200 | + Data Size: 7938035 Bytes = 7.6 MiB |
| 201 | + Load Address: 00000000 |
| 202 | + Entry Point: 00000000 |
| 203 | + Verifying Checksum ... OK |
| 204 | +## Flattened Device Tree blob at 88000000 |
| 205 | + Booting using the fdt blob at 0x88000000 |
| 206 | +Working FDT set to 88000000 |
| 207 | + Uncompressing Kernel Image |
| 208 | + Using Device Tree in place at 0000000088000000, end 0000000088004c97 |
| 209 | +Working FDT set to 88000000 |
| 210 | +
|
| 211 | +Starting kernel ... |
| 212 | +
|
| 213 | +[ 0.000000] Linux version 6.6.90+ (jdqiu@whss2.corp.nucleisys.com) (riscv64-unknown-linux-gnu-gcc (g553a166de) 14.2.1 20240816, GNU ld (GNU Binutils) 2.44) #1 SMP Fri Aug 1 10:49:24 CST 2025 |
| 214 | +[ 0.000000] Machine model: nuclei,evalsoc |
| 215 | +[ 0.000000] SBI specification v1.0 detected |
| 216 | +[ 0.000000] SBI implementation ID=0x1 Version=0x10003 |
| 217 | +[ 0.000000] SBI TIME extension detected |
| 218 | +[ 0.000000] SBI IPI extension detected |
| 219 | +[ 0.000000] SBI RFENCE extension detected |
| 220 | +[ 0.000000] SBI SRST extension detected |
| 221 | +[ 0.000000] earlycon: sbi0 at I/O port 0x0 (options '') |
| 222 | +[ 0.000000] printk: bootconsole [sbi0] enabled |
| 223 | +[ 0.000000] efi: UEFI not found. |
| 224 | +[ 0.000000] OF: reserved mem: 0x0000000080000000..0x000000008003ffff (256 KiB) nomap non-reusable mmode_resv0@80000000 |
| 225 | +[ 0.000000] OF: reserved mem: 0x0000000080040000..0x000000008007ffff (256 KiB) nomap non-reusable mmode_resv1@80040000 |
| 226 | +[ 0.000000] Zone ranges: |
| 227 | +[ 0.000000] DMA32 [mem 0x0000000080000000-0x00000000fdffffff] |
| 228 | +[ 0.000000] Normal empty |
| 229 | +[ 0.000000] Movable zone start for each node |
| 230 | +[ 0.000000] Early memory node ranges |
| 231 | +[ 0.000000] node 0: [mem 0x0000000080000000-0x000000008007ffff] |
| 232 | +[ 0.000000] node 0: [mem 0x0000000080080000-0x00000000fdffffff] |
| 233 | +[ 0.000000] Initmem setup node 0 [mem 0x0000000080000000-0x00000000fdffffff] |
| 234 | +[ 0.000000] SBI HSM extension detected |
| 235 | +[ 0.000000] Falling back to deprecated "riscv,isa" |
| 236 | +[ 0.000000] riscv: base ISA extensions acdfim |
| 237 | +[ 0.000000] riscv: ELF capabilities acdfim |
| 238 | +[ 0.000000] percpu: Embedded 15 pages/cpu s24488 r8192 d28760 u61440 |
| 239 | +[ 0.000000] Kernel command line: earlycon=sbi console=ttyNUC0 |
| 240 | +[ 0.000000] Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes, linear) |
| 241 | +[ 0.000000] Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes, linear) |
| 242 | +[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 509040 |
| 243 | +[ 0.000000] mem auto-init: stack:all(zero), heap alloc:off, heap free:off |
| 244 | +[ 0.000000] Memory: 2007888K/2064384K available (4827K kernel code, 4729K rwdata, 2048K rodata, 2133K init, 310K bss, 56496K reserved, 0K cma-reserved) |
| 245 | +[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1 |
| 246 | +[ 0.000000] rcu: Hierarchical RCU implementation. |
| 247 | +[ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=64 to nr_cpu_ids=8. |
| 248 | +[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies. |
| 249 | +[ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=8 |
| 250 | +[ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0 |
| 251 | +[ 0.000000] riscv-intc: 64 local interrupts mapped |
| 252 | +[ 0.000000] plic: interrupt-controller@1c000000: mapped 53 interrupts with 8 handlers for 16 contexts. |
| 253 | +[ 0.000000] riscv: providing IPIs using SBI IPI extension |
| 254 | +[ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention. |
| 255 | +[ 0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1ef4687b1, max_idle_ns: 112843571739654 ns |
| 256 | +[ 0.000030] sched_clock: 64 bits at 33kHz, resolution 30517ns, wraps every 70368744171142ns |
| 257 | +[ 0.011993] Calibrating delay loop (skipped), value calculated using timer frequency.. 0.06 BogoMIPS (lpj=327) |
| 258 | +[ 0.022735] pid_max: default: 32768 minimum: 301 |
| 259 | +[ 0.033447] Mount-cache hash table entries: 4096 (order: 3, 32768 bytes, linear) |
| 260 | +[ 0.042572] Mountpoint-cache hash table entries: 4096 (order: 3, 32768 bytes, linear) |
| 261 | +[ 0.136260] riscv: ELF compat mode unsupported |
| 262 | +[ 0.137237] ASID allocator using 16 bits (65536 entries) |
| 263 | +[ 0.153991] rcu: Hierarchical SRCU implementation. |
| 264 | +[ 0.158660] rcu: Max phase no-delay instances is 1000. |
| 265 | +[ 0.176910] EFI services will not be available. |
| 266 | +[ 0.211578] smp: Bringing up secondary CPUs ... |
| 267 | +[ 1.316558] CPU1: failed to come online |
| 268 | +[ 2.366516] CPU2: failed to come online |
| 269 | +[ 3.415954] CPU3: failed to come online |
| 270 | +[ 4.466003] CPU4: failed to come online |
| 271 | +[ 5.515991] CPU5: failed to come online |
| 272 | +[ 6.565704] CPU6: failed to come online |
| 273 | +[ 7.615447] CPU7: failed to come online |
| 274 | +[ 7.620635] smp: Brought up 1 node, 1 CPU |
| 275 | +[ 7.643371] devtmpfs: initialized |
| 276 | +[ 7.701385] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns |
| 277 | +[ 7.712066] futex hash table entries: 2048 (order: 5, 131072 bytes, linear) |
| 278 | +[ 7.728759] pinctrl core: initialized pinctrl subsystem |
| 279 | +[ 7.760955] NET: Registered PF_NETLINK/PF_ROUTE protocol family |
| 280 | +[ 7.776641] DMA: preallocated 256 KiB GFP_KERNEL pool for atomic allocations |
| 281 | +[ 7.785400] DMA: preallocated 256 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations |
| 282 | +[ 7.855499] cpu0: Ratio of byte access time to unaligned word access is 0.35, unaligned accesses are slow |
| 283 | +[ 7.973876] pps_core: LinuxPPS API ver. 1 registered |
| 284 | +[ 7.978729] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it> |
| 285 | +[ 7.989410] PTP clock support registered |
| 286 | +[ 8.017181] clocksource: Switched to clocksource riscv_clocksource |
| 287 | +[ 8.082122] NET: Registered PF_INET protocol family |
| 288 | +[ 8.106353] IP idents hash table entries: 32768 (order: 6, 262144 bytes, linear) |
| 289 | +[ 8.221832] tcp_listen_portaddr_hash hash table entries: 1024 (order: 2, 16384 bytes, linear) |
| 290 | +[ 8.232513] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear) |
| 291 | +[ 8.240905] TCP established hash table entries: 16384 (order: 5, 131072 bytes, linear) |
| 292 | +[ 8.260162] TCP bind hash table entries: 16384 (order: 7, 524288 bytes, linear) |
| 293 | +[ 8.301330] TCP: Hash tables configured (established 16384 bind 16384) |
| 294 | +[ 8.317840] UDP hash table entries: 1024 (order: 3, 32768 bytes, linear) |
| 295 | +[ 8.327819] UDP-Lite hash table entries: 1024 (order: 3, 32768 bytes, linear) |
| 296 | +[ 8.342407] NET: Registered PF_UNIX/PF_LOCAL protocol family |
| 297 | +[ 8.403106] Trying to unpack rootfs image as initramfs... |
| 298 | +[ 8.411437] workingset: timestamp_bits=62 max_order=19 bucket_order=0 |
| 299 | +[ 13.760803] NET: Registered PF_ALG protocol family |
| 300 | +[ 13.767272] io scheduler mq-deadline registered |
| 301 | +[ 13.771697] io scheduler kyber registered |
| 302 | +[ 13.777069] io scheduler bfq registered |
| 303 | +[ 21.492889] 10013000.serial: ttyNUC0 at MMIO 0x10013000 (irq = 12, base_baud = 3125000) is a Nuclei UART v0 |
| 304 | +[ 21.503662] printk: console [ttyNUC0] enabled |
| 305 | +[ 21.503662] printk: console [ttyNUC0] enabled |
| 306 | +[ 21.512145] printk: bootconsole [sbi0] disabled |
| 307 | +[ 21.512145] printk: bootconsole [sbi0] disabled |
| 308 | +[ 22.263610] brd: module loaded |
| 309 | +[ 22.635833] loop: module loaded |
| 310 | +[ 22.653076] nuclei_spi 10014000.spi: mapped; irq=13, cs=4 |
| 311 | +[ 22.745300] spi-nor spi0.0: gd25q32 (4096 Kbytes) |
| 312 | +[ 24.740417] Freeing initrd memory: 7748K |
| 313 | +[ 25.803131] ftl_cs: FTL header not found. |
| 314 | +[ 25.841888] nuclei_spi 10034000.spi: mapped; irq=14, cs=4 |
| 315 | +[ 25.928192] mmc_spi spi1.0: SD/MMC host mmc0, no WP, no poweroff, cd polling |
| 316 | +[ 25.977447] NET: Registered PF_INET6 protocol family |
| 317 | +[ 26.045074] Segment Routing with IPv6 |
| 318 | +[ 26.051300] In-situ OAM (IOAM) with IPv6 |
| 319 | +[ 26.057708] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver |
| 320 | +[ 26.083770] NET: Registered PF_PACKET protocol family |
| 321 | +[ 26.358764] mmc0: host does not support reading read-only switch, assuming write-enable |
| 322 | +[ 26.367553] mmc0: new SDHC card on SPI |
| 323 | +[ 26.405395] clk: Disabling unused clocks |
| 324 | +[ 26.420562] mmcblk0: mmc0:0000 SD32G 29.7 GiB |
| 325 | +[ 26.589263] Freeing unused kernel image (initmem) memory: 2132K |
| 326 | +[ 26.595733] Run /init as init process |
| 327 | +[ 26.639678] mmcblk0: p1 |
| 328 | +Saving 256 bits of non-creditable seed for next boot |
| 329 | +Starting syslogd: OK |
| 330 | +Starting klogd: OK |
| 331 | +Running sysctl: OK |
| 332 | +eth0 device not present, will not configure it! |
| 333 | +Starting mdev... OK |
| 334 | +modprobe: can't change directory to '/lib/modules': No such file or directory |
| 335 | +Starting haveged: haveged: command socket is listening at fd 3 |
| 336 | +OK |
| 337 | +Starting crond: OK |
| 338 | +
|
| 339 | +Welcome to Nuclei System Technology |
| 340 | +nucleisys login: [ 73.642608] random: crng init done |
| 341 | +
|
| 342 | +Welcome to Nuclei System Technology |
| 343 | +nucleisys login: root |
| 344 | +Password: |
| 345 | +# cat /proc/cpuinfo |
| 346 | +processor : 0 |
| 347 | +hart : 0 |
| 348 | +isa : rv64imafdc_zicntr_zicsr_zifencei_zihpm |
| 349 | +mmu : sv39 |
| 350 | +mvendorid : 0x2d33 |
| 351 | +marchid : 0xe603 |
| 352 | +mimpid : 0x20100 |
| 353 | +
|
| 354 | +# uname -a |
| 355 | +Linux nucleisys 6.6.90+ #1 SMP Fri Aug 1 10:49:24 CST 2025 riscv64 GNU/Linux |
| 356 | +``` |
0 commit comments