123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- Sipeed MAIXDUINO Board
- ======================
- The Sipeed MAIXDUINO board is a dual-core RISC-V 64-bits board based on the
- Canaan Kendryte K210 SoC. This board has the same form factor as the Arduino
- UNO board.
- Prerequisite
- ------------
- In order to use the kflash utility to program this board, the user must have
- access to the board USB serial device file. The simplest way to do this is to
- add your user to the same group as this device file. Assume the device file is
- /dev/ttyUSB0, first identify the device group name. In most cases, it is
- either "dialout" or "uucp". Also verify that read-write access is enabled for
- the group:
- ```
- $ ls -l /dev/ttyUSB0
- crw-rw---- 1 root dialout 188, 0 May 26 13:48 /dev/ttyUSB0
- ```
- Then add yourself to that group (dialout in this example):
- ```
- $ sudo usermod -a -G dialout $(whoami)
- ```
- To enable the above, it is sometimes necessary to logout and login again.
- Buildroot Configuration
- -----------------------
- Two buildroot configurations are provided:
- (1) Direct Linux Kernel Boot
- This is defined by the sipeed_maixduino_defconfig configuration. This
- configuration allows building a bootable kernel image with a built-in initramfs
- root file system (the board SD card is not used). The built kernel image can be
- flashed directly to the board ROM for direct booting. No boot loader is
- required.
- (2) U-Boot SD-Card Boot
- The sipeed_maixduino_sdcard_defconfig configuration allows building a kernel
- image with the root file system on the board SD card. U-Boot is used as the
- boot loader.
- Note: U-Boot does not natively support the Sipeed MAIXDUINO board. However, the
- board and device tree differences with the Sipeed MAIX-bit board are small
- enough for U-Boot to work.
- Both configuration files will also compile and install the kflash and
- pyserial-miniterm host utilities to program bootable image files to the board
- and open a serial terminal console.
- Direct Linux Kernel Boot
- ------------------------
- Using the sipeed_maixduino_defconfig configuration, the bootable kernel binary
- image is built as follows.
- ```
- $ make sipeed_maixduino_defconfig
- $ make
- ```
- The bootable binary image is the output/images/loader.bin file. This image file
- can be written to the board boot flash using the kflash utility.
- ```
- $ output/host/bin/kflash -b 1500000 -p /dev/ttyUSB0 -t output/images/loader.bin
- ```
- Once the kernel image file is fully programmed, a terminal console is open and
- the board can be rebooted by pressing the reset button on the board (if it does
- not reboot automatically).
- The output will be similar to the following.
- ```
- [ 0.000000] Linux version 5.18.0 (foo@bar.com) (riscv64-buildroot-linux-uclibc-gcc.br_real (Buildroot 2022.02-560-g6a2b542a09-dirty) 10.3.0, GNU ld (GNU Binutils) 2.32) #2 SMP Thu Apr 21 15:16:00 JST 2022
- [ 0.000000] Machine model: SiPeed MAIXDUINO
- [ 0.000000] earlycon: sifive0 at MMIO 0x0000000038000000 (options '115200n8')
- [ 0.000000] printk: bootconsole [sifive0] enabled
- [ 0.000000] Zone ranges:
- [ 0.000000] DMA32 [mem 0x0000000080000000-0x00000000807fffff]
- [ 0.000000] Normal empty
- [ 0.000000] Movable zone start for each node
- [ 0.000000] Early memory node ranges
- [ 0.000000] node 0: [mem 0x0000000080000000-0x00000000807fffff]
- [ 0.000000] Initmem setup node 0 [mem 0x0000000080000000-0x00000000807fffff]
- [ 0.000000] riscv: ISA extensions acdfim
- [ 0.000000] riscv: ELF capabilities acdfim
- [ 0.000000] percpu: max_distance=0x16000 too large for vmalloc space 0x0
- [ 0.000000] percpu: Embedded 11 pages/cpu s15264 r0 d29792 u45056
- [ 0.000000] percpu: wasting 10 pages per chunk
- [ 0.000000] Built 1 zonelists, mobility grouping off. Total pages: 2020
- [ 0.000000] Kernel command line: earlycon console=ttySIF0
- [ 0.000000] Dentry cache hash table entries: 1024 (order: 1, 8192 bytes, linear)
- [ 0.000000] Inode-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
- [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
- [ 0.000000] Memory: 6000K/8192K available (964K kernel code, 137K rwdata, 205K rodata, 530K init, 66K bss, 2192K reserved, 0K cma-reserved)
- [ 0.000000] rcu: Hierarchical RCU implementation.
- [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
- [ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
- [ 0.000000] riscv-intc: 64 local interrupts mapped
- [ 0.000000] plic: interrupt-controller@c000000: mapped 65 interrupts with 2 handlers for 4 contexts.
- [ 0.000000] k210-clk: clock-controller: CPU running at 390 MHz
- [ 0.000000] clint: timer@2000000: timer running at 7800000 Hz
- [ 0.000000] clocksource: clint_clocksource: mask: 0xffffffffffffffff max_cycles: 0x3990be68b, max_idle_ns: 881590404272 ns
- [ 0.000001] sched_clock: 64 bits at 7MHz, resolution 128ns, wraps every 4398046511054ns
- [ 0.008183] Calibrating delay loop (skipped), value calculated using timer frequency.. 15.60 BogoMIPS (lpj=31200)
- [ 0.018249] pid_max: default: 4096 minimum: 301
- [ 0.022860] Mount-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
- [ 0.029971] Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
- [ 0.040242] rcu: Hierarchical SRCU implementation.
- [ 0.045124] smp: Bringing up secondary CPUs ...
- [ 0.050217] smp: Brought up 1 node, 2 CPUs
- [ 0.054346] devtmpfs: initialized
- [ 0.070924] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
- [ 0.079996] pinctrl core: initialized pinctrl subsystem
- [ 0.119893] clocksource: Switched to clocksource clint_clocksource
- [ 0.131992] workingset: timestamp_bits=62 max_order=11 bucket_order=0
- [ 0.179099] k210-sysctl 50440000.syscon: K210 system controller
- [ 0.194904] k210-rst 50440000.syscon:reset-controller: K210 reset controller
- [ 0.203108] cacheinfo: Unable to detect cache hierarchy for CPU 0
- [ 0.213867] i2c_dev: i2c /dev entries driver
- [ 0.223397] k210-fpioa 502b0000.pinmux: K210 FPIOA pin controller
- [ 0.235632] 38000000.serial: ttySIF0 at MMIO 0x38000000 (irq = 1, base_baud = 115200) is a SiFive UART v0
- [ 0.244585] printk: console [ttySIF0] enabled
- [ 0.244585] printk: console [ttySIF0] enabled
- [ 0.253190] printk: bootconsole [sifive0] disabled
- [ 0.253190] printk: bootconsole [sifive0] disabled
- [ 0.264820] panel@0 enforce active low on chipselect handle
- [ 0.281482] Freeing unused kernel image (initmem) memory: 524K
- [ 0.286621] This architecture does not have kernel memory protection.
- [ 0.293047] Run /init as init process
- __ _
- / / (_) ____ _ _ __ __
- / / | || _ \ | | | |\ \/ /
- / /___| || | | || |_| | > <
- /_____/|_||_| |_| \____|/_/\_\
- 64-bits RISC-V Kendryte K210 NOMMU
- / #
- ```
- To open a terminal console without re-flashing the board, the pyserial-miniterm
- host tool can be used.
- ```
- $ output/host/bin/pyserial-miniterm --raw --eol=LF /dev/ttyUSB0 115200
- ```
- The options "--raw" and "--eol=LF" are added here to avoid a double carriage
- return each time a command is entered.
- U-Boot SD-Card Boot
- -------------------
- The build procedure is similar to the built-in initramfs case.
- ```
- $ make sipeed_maixduino_sdcard_defconfig
- $ make
- ```
- The build process will generate two files under the output/images directory.
- * sdcard.img: The image file for the SD card filesystem. This image has 2
- partitions. The first partition is a vfat partition containing the kernel
- uImage and the board device tree binary. The second partition is the root
- filesystem with busybox installed. The second partition is formatted using
- ext2 (rev1).
- * uboot.bin: U-Boot bootable binary to load and boot the kernel from the SD
- card.
- The SD card can be prepared by writing the sdcard.img file, as follows.
- ```
- $ sudo dd if=output/images/sdcard.img of=/dev/sdX bs=1M
- $ sync
- $ eject /dev/sdX
- ```
- Where /dev/sdX is the device file name of the SD card. Once completed, the SD
- card can be inserted into the board and the U-Boot binary image written to the
- board boot flash using the kflash utility.
- ```
- $ output/host/bin/kflash -b 1500000 -p /dev/ttyUSB0 -t output/images/u-boot.bin
- ```
- The above command will program U-Boot image to the board boot ROM and open a
- terminal console once the u-boot.bin file is fully programmed. Reboot into the
- newly programmed environment by pressing the board reset button.
- The output will be similar to the following.
- ```
- [ 0.000000] Linux version 5.18.0 (foo@bar.com) (riscv64-buildroot-linux-uclibc-gcc.br_real (Buildroot 2022.02-560-g6a2b542a09-dirty) 10.3.0, GNU ld (GNU Binutils) 2.32) #1 SMP Thu Apr 21 15:30:18 JST 2022
- [ 0.000000] Machine model: SiPeed MAIXDUINO
- [ 0.000000] earlycon: sifive0 at MMIO 0x0000000038000000 (options '115200n8')
- [ 0.000000] printk: bootconsole [sifive0] enabled
- [ 0.000000] Zone ranges:
- [ 0.000000] DMA32 [mem 0x0000000080000000-0x00000000807fffff]
- [ 0.000000] Normal empty
- [ 0.000000] Movable zone start for each node
- [ 0.000000] Early memory node ranges
- [ 0.000000] node 0: [mem 0x0000000080000000-0x00000000807fffff]
- [ 0.000000] Initmem setup node 0 [mem 0x0000000080000000-0x00000000807fffff]
- [ 0.000000] riscv: ISA extensions acdfim
- [ 0.000000] riscv: ELF capabilities acdfim
- [ 0.000000] percpu: max_distance=0x16000 too large for vmalloc space 0x0
- [ 0.000000] percpu: Embedded 11 pages/cpu s15392 r0 d29664 u45056
- [ 0.000000] percpu: wasting 10 pages per chunk
- [ 0.000000] Built 1 zonelists, mobility grouping off. Total pages: 2020
- [ 0.000000] Kernel command line: earlycon console=ttySIF0 root=/dev/mmcblk0p2 rootwait ro
- [ 0.000000] Dentry cache hash table entries: 1024 (order: 1, 8192 bytes, linear)
- [ 0.000000] Inode-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
- [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
- [ 0.000000] Memory: 6156K/8192K available (1180K kernel code, 151K rwdata, 239K rodata, 102K init, 69K bss, 2036K reserved, 0K cma-reserved)
- [ 0.000000] rcu: Hierarchical RCU implementation.
- [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
- [ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
- [ 0.000000] riscv-intc: 64 local interrupts mapped
- [ 0.000000] plic: interrupt-controller@c000000: mapped 65 interrupts with 2 handlers for 4 contexts.
- [ 0.000000] k210-clk: clock-controller: CPU running at 390 MHz
- [ 0.000000] clint: timer@2000000: timer running at 7800000 Hz
- [ 0.000000] clocksource: clint_clocksource: mask: 0xffffffffffffffff max_cycles: 0x3990be68b, max_idle_ns: 881590404272 ns
- [ 0.000001] sched_clock: 64 bits at 7MHz, resolution 128ns, wraps every 4398046511054ns
- [ 0.008191] Calibrating delay loop (skipped), value calculated using timer frequency.. 15.60 BogoMIPS (lpj=31200)
- [ 0.018255] pid_max: default: 4096 minimum: 301
- [ 0.022876] Mount-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
- [ 0.029982] Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
- [ 0.040417] rcu: Hierarchical SRCU implementation.
- [ 0.045397] smp: Bringing up secondary CPUs ...
- [ 0.050513] smp: Brought up 1 node, 2 CPUs
- [ 0.054680] devtmpfs: initialized
- [ 0.072127] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
- [ 0.081205] pinctrl core: initialized pinctrl subsystem
- [ 0.125074] clocksource: Switched to clocksource clint_clocksource
- [ 0.138311] workingset: timestamp_bits=62 max_order=11 bucket_order=0
- [ 0.183471] k210-sysctl 50440000.syscon: K210 system controller
- [ 0.199873] k210-rst 50440000.syscon:reset-controller: K210 reset controller
- [ 0.208858] cacheinfo: Unable to detect cache hierarchy for CPU 0
- [ 0.221586] i2c_dev: i2c /dev entries driver
- [ 0.232786] k210-fpioa 502b0000.pinmux: K210 FPIOA pin controller
- [ 0.246572] 38000000.serial: ttySIF0 at MMIO 0x38000000 (irq = 1, base_baud = 115200) is a SiFive UART v0
- [ 0.255508] printk: console [ttySIF0] enabled
- [ 0.255508] printk: console [ttySIF0] enabled
- [ 0.264137] printk: bootconsole [sifive0] disabled
- [ 0.264137] printk: bootconsole [sifive0] disabled
- [ 0.275560] panel@0 enforce active low on chipselect handle
- [ 0.313245] mmc_spi spi3.0: SD/MMC host mmc0, no WP, no poweroff, cd polling
- [ 0.322845] Waiting for root device /dev/mmcblk0p2...
- [ 0.345869] mmc0: host does not support reading read-only switch, assuming write-enable
- [ 0.353221] mmc0: new SDHC card on SPI
- [ 0.360233] mmcblk0: mmc0:0000 SA16G 14.5 GiB
- [ 0.368350] random: fast init done
- [ 0.372926] mmcblk0: p1 p2
- [ 0.391887] random: get_random_bytes called from 0x000000008009b7d2 with crng_init=1
- [ 0.400427] VFS: Mounted root (ext2 filesystem) readonly on device 179:2.
- [ 0.410128] devtmpfs: mounted
- [ 0.412628] Freeing unused kernel image (initmem) memory: 96K
- [ 0.418137] This architecture does not have kernel memory protection.
- [ 0.424530] Run /sbin/init as init process
- [ 0.563384] random: crng init done
- __ _
- / / (_) ____ _ _ __ __
- / / | || _ \ | | | |\ \/ /
- / /___| || | | || |_| | > <
- /_____/|_||_| |_| \____|/_/\_\
- 64-bits RISC-V Kendryte K210 NOMMU
- / #
- ```
- Of note is that the kernel mounts the SD card as read-only by default to avoid
- corruptions of the ext2 root file system when the board is powered down. This
- is recommended as this board does not support clean shutdown or halt.
- Similarly to the initramfs build case, a console can be open without
- re-flashing the board using the host tool pyserial-miniterm.
- ```
- $ output/host/bin/pyserial-miniterm --raw --eol=LF /dev/ttyUSB0 115200
- ```
|