Skip to content

Commit 143aa3e

Browse files
committed
doc: add README about how to quick build and run linux on E603
Signed-off-by: qiujiandong <qiujiandong@nucleisys.com>
1 parent aae6e87 commit 143aa3e

1 file changed

Lines changed: 356 additions & 0 deletions

File tree

conf/evalsoc/README.md

Lines changed: 356 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,356 @@
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

Comments
 (0)