readme.txt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. Sipeed MAIXDUINO Board
  2. ======================
  3. The Sipeed MAIXDUINO board is a dual-core RISC-V 64-bits board based on the
  4. Canaan Kendryte K210 SoC. This board has the same form factor as the Arduino
  5. UNO board.
  6. Prerequisite
  7. ------------
  8. In order to use the kflash utility to program this board, the user must have
  9. access to the board USB serial device file. The simplest way to do this is to
  10. add your user to the same group as this device file. Assume the device file is
  11. /dev/ttyUSB0, first identify the device group name. In most cases, it is
  12. either "dialout" or "uucp". Also verify that read-write access is enabled for
  13. the group:
  14. ```
  15. $ ls -l /dev/ttyUSB0
  16. crw-rw---- 1 root dialout 188, 0 May 26 13:48 /dev/ttyUSB0
  17. ```
  18. Then add yourself to that group (dialout in this example):
  19. ```
  20. $ sudo usermod -a -G dialout $(whoami)
  21. ```
  22. To enable the above, it is sometimes necessary to logout and login again.
  23. Buildroot Configuration
  24. -----------------------
  25. Two buildroot configurations are provided:
  26. (1) Direct Linux Kernel Boot
  27. This is defined by the sipeed_maixduino_defconfig configuration. This
  28. configuration allows building a bootable kernel image with a built-in initramfs
  29. root file system (the board SD card is not used). The built kernel image can be
  30. flashed directly to the board ROM for direct booting. No boot loader is
  31. required.
  32. (2) U-Boot SD-Card Boot
  33. The sipeed_maixduino_sdcard_defconfig configuration allows building a kernel
  34. image with the root file system on the board SD card. U-Boot is used as the
  35. boot loader.
  36. Note: U-Boot does not natively support the Sipeed MAIXDUINO board. However, the
  37. board and device tree differences with the Sipeed MAIX-bit board are small
  38. enough for U-Boot to work.
  39. Both configuration files will also compile and install the kflash and
  40. pyserial-miniterm host utilities to program bootable image files to the board
  41. and open a serial terminal console.
  42. Direct Linux Kernel Boot
  43. ------------------------
  44. Using the sipeed_maixduino_defconfig configuration, the bootable kernel binary
  45. image is built as follows.
  46. ```
  47. $ make sipeed_maixduino_defconfig
  48. $ make
  49. ```
  50. The bootable binary image is the output/images/loader.bin file. This image file
  51. can be written to the board boot flash using the kflash utility.
  52. ```
  53. $ output/host/bin/kflash -b 1500000 -p /dev/ttyUSB0 -t output/images/loader.bin
  54. ```
  55. Once the kernel image file is fully programmed, a terminal console is open and
  56. the board can be rebooted by pressing the reset button on the board (if it does
  57. not reboot automatically).
  58. The output will be similar to the following.
  59. ```
  60. [ 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
  61. [ 0.000000] Machine model: SiPeed MAIXDUINO
  62. [ 0.000000] earlycon: sifive0 at MMIO 0x0000000038000000 (options '115200n8')
  63. [ 0.000000] printk: bootconsole [sifive0] enabled
  64. [ 0.000000] Zone ranges:
  65. [ 0.000000] DMA32 [mem 0x0000000080000000-0x00000000807fffff]
  66. [ 0.000000] Normal empty
  67. [ 0.000000] Movable zone start for each node
  68. [ 0.000000] Early memory node ranges
  69. [ 0.000000] node 0: [mem 0x0000000080000000-0x00000000807fffff]
  70. [ 0.000000] Initmem setup node 0 [mem 0x0000000080000000-0x00000000807fffff]
  71. [ 0.000000] riscv: ISA extensions acdfim
  72. [ 0.000000] riscv: ELF capabilities acdfim
  73. [ 0.000000] percpu: max_distance=0x16000 too large for vmalloc space 0x0
  74. [ 0.000000] percpu: Embedded 11 pages/cpu s15264 r0 d29792 u45056
  75. [ 0.000000] percpu: wasting 10 pages per chunk
  76. [ 0.000000] Built 1 zonelists, mobility grouping off. Total pages: 2020
  77. [ 0.000000] Kernel command line: earlycon console=ttySIF0
  78. [ 0.000000] Dentry cache hash table entries: 1024 (order: 1, 8192 bytes, linear)
  79. [ 0.000000] Inode-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
  80. [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
  81. [ 0.000000] Memory: 6000K/8192K available (964K kernel code, 137K rwdata, 205K rodata, 530K init, 66K bss, 2192K reserved, 0K cma-reserved)
  82. [ 0.000000] rcu: Hierarchical RCU implementation.
  83. [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
  84. [ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
  85. [ 0.000000] riscv-intc: 64 local interrupts mapped
  86. [ 0.000000] plic: interrupt-controller@c000000: mapped 65 interrupts with 2 handlers for 4 contexts.
  87. [ 0.000000] k210-clk: clock-controller: CPU running at 390 MHz
  88. [ 0.000000] clint: timer@2000000: timer running at 7800000 Hz
  89. [ 0.000000] clocksource: clint_clocksource: mask: 0xffffffffffffffff max_cycles: 0x3990be68b, max_idle_ns: 881590404272 ns
  90. [ 0.000001] sched_clock: 64 bits at 7MHz, resolution 128ns, wraps every 4398046511054ns
  91. [ 0.008183] Calibrating delay loop (skipped), value calculated using timer frequency.. 15.60 BogoMIPS (lpj=31200)
  92. [ 0.018249] pid_max: default: 4096 minimum: 301
  93. [ 0.022860] Mount-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
  94. [ 0.029971] Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
  95. [ 0.040242] rcu: Hierarchical SRCU implementation.
  96. [ 0.045124] smp: Bringing up secondary CPUs ...
  97. [ 0.050217] smp: Brought up 1 node, 2 CPUs
  98. [ 0.054346] devtmpfs: initialized
  99. [ 0.070924] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
  100. [ 0.079996] pinctrl core: initialized pinctrl subsystem
  101. [ 0.119893] clocksource: Switched to clocksource clint_clocksource
  102. [ 0.131992] workingset: timestamp_bits=62 max_order=11 bucket_order=0
  103. [ 0.179099] k210-sysctl 50440000.syscon: K210 system controller
  104. [ 0.194904] k210-rst 50440000.syscon:reset-controller: K210 reset controller
  105. [ 0.203108] cacheinfo: Unable to detect cache hierarchy for CPU 0
  106. [ 0.213867] i2c_dev: i2c /dev entries driver
  107. [ 0.223397] k210-fpioa 502b0000.pinmux: K210 FPIOA pin controller
  108. [ 0.235632] 38000000.serial: ttySIF0 at MMIO 0x38000000 (irq = 1, base_baud = 115200) is a SiFive UART v0
  109. [ 0.244585] printk: console [ttySIF0] enabled
  110. [ 0.244585] printk: console [ttySIF0] enabled
  111. [ 0.253190] printk: bootconsole [sifive0] disabled
  112. [ 0.253190] printk: bootconsole [sifive0] disabled
  113. [ 0.264820] panel@0 enforce active low on chipselect handle
  114. [ 0.281482] Freeing unused kernel image (initmem) memory: 524K
  115. [ 0.286621] This architecture does not have kernel memory protection.
  116. [ 0.293047] Run /init as init process
  117. __ _
  118. / / (_) ____ _ _ __ __
  119. / / | || _ \ | | | |\ \/ /
  120. / /___| || | | || |_| | > <
  121. /_____/|_||_| |_| \____|/_/\_\
  122. 64-bits RISC-V Kendryte K210 NOMMU
  123. / #
  124. ```
  125. To open a terminal console without re-flashing the board, the pyserial-miniterm
  126. host tool can be used.
  127. ```
  128. $ output/host/bin/pyserial-miniterm --raw --eol=LF /dev/ttyUSB0 115200
  129. ```
  130. The options "--raw" and "--eol=LF" are added here to avoid a double carriage
  131. return each time a command is entered.
  132. U-Boot SD-Card Boot
  133. -------------------
  134. The build procedure is similar to the built-in initramfs case.
  135. ```
  136. $ make sipeed_maixduino_sdcard_defconfig
  137. $ make
  138. ```
  139. The build process will generate two files under the output/images directory.
  140. * sdcard.img: The image file for the SD card filesystem. This image has 2
  141. partitions. The first partition is a vfat partition containing the kernel
  142. uImage and the board device tree binary. The second partition is the root
  143. filesystem with busybox installed. The second partition is formatted using
  144. ext2 (rev1).
  145. * uboot.bin: U-Boot bootable binary to load and boot the kernel from the SD
  146. card.
  147. The SD card can be prepared by writing the sdcard.img file, as follows.
  148. ```
  149. $ sudo dd if=output/images/sdcard.img of=/dev/sdX bs=1M
  150. $ sync
  151. $ eject /dev/sdX
  152. ```
  153. Where /dev/sdX is the device file name of the SD card. Once completed, the SD
  154. card can be inserted into the board and the U-Boot binary image written to the
  155. board boot flash using the kflash utility.
  156. ```
  157. $ output/host/bin/kflash -b 1500000 -p /dev/ttyUSB0 -t output/images/u-boot.bin
  158. ```
  159. The above command will program U-Boot image to the board boot ROM and open a
  160. terminal console once the u-boot.bin file is fully programmed. Reboot into the
  161. newly programmed environment by pressing the board reset button.
  162. The output will be similar to the following.
  163. ```
  164. [ 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
  165. [ 0.000000] Machine model: SiPeed MAIXDUINO
  166. [ 0.000000] earlycon: sifive0 at MMIO 0x0000000038000000 (options '115200n8')
  167. [ 0.000000] printk: bootconsole [sifive0] enabled
  168. [ 0.000000] Zone ranges:
  169. [ 0.000000] DMA32 [mem 0x0000000080000000-0x00000000807fffff]
  170. [ 0.000000] Normal empty
  171. [ 0.000000] Movable zone start for each node
  172. [ 0.000000] Early memory node ranges
  173. [ 0.000000] node 0: [mem 0x0000000080000000-0x00000000807fffff]
  174. [ 0.000000] Initmem setup node 0 [mem 0x0000000080000000-0x00000000807fffff]
  175. [ 0.000000] riscv: ISA extensions acdfim
  176. [ 0.000000] riscv: ELF capabilities acdfim
  177. [ 0.000000] percpu: max_distance=0x16000 too large for vmalloc space 0x0
  178. [ 0.000000] percpu: Embedded 11 pages/cpu s15392 r0 d29664 u45056
  179. [ 0.000000] percpu: wasting 10 pages per chunk
  180. [ 0.000000] Built 1 zonelists, mobility grouping off. Total pages: 2020
  181. [ 0.000000] Kernel command line: earlycon console=ttySIF0 root=/dev/mmcblk0p2 rootwait ro
  182. [ 0.000000] Dentry cache hash table entries: 1024 (order: 1, 8192 bytes, linear)
  183. [ 0.000000] Inode-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
  184. [ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
  185. [ 0.000000] Memory: 6156K/8192K available (1180K kernel code, 151K rwdata, 239K rodata, 102K init, 69K bss, 2036K reserved, 0K cma-reserved)
  186. [ 0.000000] rcu: Hierarchical RCU implementation.
  187. [ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
  188. [ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
  189. [ 0.000000] riscv-intc: 64 local interrupts mapped
  190. [ 0.000000] plic: interrupt-controller@c000000: mapped 65 interrupts with 2 handlers for 4 contexts.
  191. [ 0.000000] k210-clk: clock-controller: CPU running at 390 MHz
  192. [ 0.000000] clint: timer@2000000: timer running at 7800000 Hz
  193. [ 0.000000] clocksource: clint_clocksource: mask: 0xffffffffffffffff max_cycles: 0x3990be68b, max_idle_ns: 881590404272 ns
  194. [ 0.000001] sched_clock: 64 bits at 7MHz, resolution 128ns, wraps every 4398046511054ns
  195. [ 0.008191] Calibrating delay loop (skipped), value calculated using timer frequency.. 15.60 BogoMIPS (lpj=31200)
  196. [ 0.018255] pid_max: default: 4096 minimum: 301
  197. [ 0.022876] Mount-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
  198. [ 0.029982] Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes, linear)
  199. [ 0.040417] rcu: Hierarchical SRCU implementation.
  200. [ 0.045397] smp: Bringing up secondary CPUs ...
  201. [ 0.050513] smp: Brought up 1 node, 2 CPUs
  202. [ 0.054680] devtmpfs: initialized
  203. [ 0.072127] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
  204. [ 0.081205] pinctrl core: initialized pinctrl subsystem
  205. [ 0.125074] clocksource: Switched to clocksource clint_clocksource
  206. [ 0.138311] workingset: timestamp_bits=62 max_order=11 bucket_order=0
  207. [ 0.183471] k210-sysctl 50440000.syscon: K210 system controller
  208. [ 0.199873] k210-rst 50440000.syscon:reset-controller: K210 reset controller
  209. [ 0.208858] cacheinfo: Unable to detect cache hierarchy for CPU 0
  210. [ 0.221586] i2c_dev: i2c /dev entries driver
  211. [ 0.232786] k210-fpioa 502b0000.pinmux: K210 FPIOA pin controller
  212. [ 0.246572] 38000000.serial: ttySIF0 at MMIO 0x38000000 (irq = 1, base_baud = 115200) is a SiFive UART v0
  213. [ 0.255508] printk: console [ttySIF0] enabled
  214. [ 0.255508] printk: console [ttySIF0] enabled
  215. [ 0.264137] printk: bootconsole [sifive0] disabled
  216. [ 0.264137] printk: bootconsole [sifive0] disabled
  217. [ 0.275560] panel@0 enforce active low on chipselect handle
  218. [ 0.313245] mmc_spi spi3.0: SD/MMC host mmc0, no WP, no poweroff, cd polling
  219. [ 0.322845] Waiting for root device /dev/mmcblk0p2...
  220. [ 0.345869] mmc0: host does not support reading read-only switch, assuming write-enable
  221. [ 0.353221] mmc0: new SDHC card on SPI
  222. [ 0.360233] mmcblk0: mmc0:0000 SA16G 14.5 GiB
  223. [ 0.368350] random: fast init done
  224. [ 0.372926] mmcblk0: p1 p2
  225. [ 0.391887] random: get_random_bytes called from 0x000000008009b7d2 with crng_init=1
  226. [ 0.400427] VFS: Mounted root (ext2 filesystem) readonly on device 179:2.
  227. [ 0.410128] devtmpfs: mounted
  228. [ 0.412628] Freeing unused kernel image (initmem) memory: 96K
  229. [ 0.418137] This architecture does not have kernel memory protection.
  230. [ 0.424530] Run /sbin/init as init process
  231. [ 0.563384] random: crng init done
  232. __ _
  233. / / (_) ____ _ _ __ __
  234. / / | || _ \ | | | |\ \/ /
  235. / /___| || | | || |_| | > <
  236. /_____/|_||_| |_| \____|/_/\_\
  237. 64-bits RISC-V Kendryte K210 NOMMU
  238. / #
  239. ```
  240. Of note is that the kernel mounts the SD card as read-only by default to avoid
  241. corruptions of the ext2 root file system when the board is powered down. This
  242. is recommended as this board does not support clean shutdown or halt.
  243. Similarly to the initramfs build case, a console can be open without
  244. re-flashing the board using the host tool pyserial-miniterm.
  245. ```
  246. $ output/host/bin/pyserial-miniterm --raw --eol=LF /dev/ttyUSB0 115200
  247. ```