Sipeed M0S Dock

Model: Sipeed M0S Dock

SoC: Bouffalo Lab BL616

  • RISC-V RV32GCP @ 320MHz
  • 480 KB SRAM
  • 4 MB Flash
  • Wireless - Support Wi-Fi6
  • Wireless - Support Bluetooth 5.2 Dual-mode(BT+BLE)
  • Wireless - Support Zigbee
  • USB 2.0 HS OTG

on the M0S dock

  • button - 1 "boot"
  • LED - 1 power, 2 user
  • usb: 1 x TYPE C
  • IO header - 10 pins (8 x GPIO)

back to microcontrollers page.

Links

Sipeed wiki M0S module,

Sipeed github M0S_BL616_example,

Bouffalo Lab github bl_docs,

OpenBouffalo BL616, Awesome bouffalo,

CNX Software Bouffalo Lab BL616/BL618 RISC-V MCU,

Exploring embedded programming with Sipeed m0s (BL616), Opensource toolchain for series RISC-V based MCU from Bouffalo Lab, blflashcommand,

Rust BL602 Rust Guide, Sipeed M0 Sense (BL702 chip), oreboot, bl_boot,

local links

c2,

History

2025-04-05: c2 - blflash - try to dump the rom

tingo@kg-core2:~/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/blflash $ target/debug/blflash dump -p /dev/cuaU0 ../bl616.bin
[INFO  blflash::flasher] Start connection...
[TRACE blflash::flasher] 5ms send count 55
[TRACE blflash::flasher] handshake sent elapsed 52.254175ms
[INFO  blflash::flasher] Connection Succeed
[INFO  blflash] Bootrom version: 102105089
[TRACE blflash] Boot info: BootInfo { len: 18, bootrom_version: 6160001, otp_info: [0, 0, 1, 0, 27, 92, 80, 1, db, f1, 49, e0, c2, b4, 18, 0] }
Error: ROM error Other(513)

2025-04-05: c2 - try blflash

tingo@kg-core2:~/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/blflash $ target/debug/blflash --help
blflash 0.3.5

USAGE:
    blflash <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    check    Check if the device's flash matches the image
    dump     Dump the whole flash to a file
    flash    Flash image to serial
    help     Prints this message or the help of the given subcommand(s)

commands - check

tingo@kg-core2:~/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/blflash $ target/debug/blflash check --help
blflash-check 0.3.5
Check if the device's flash matches the image

USAGE:
    blflash check [FLAGS] [OPTIONS] <image> --port <port>

FLAGS:
    -h, --help             Prints help information
    -V, --version          Prints version information
    -w, --without-boot2    Without boot2

OPTIONS:
    -b, --baud-rate <baud-rate>                    Flash baud rate [default: 1000000]
        --boot-header-cfg <boot-header-cfg>        Path to efuse_bootheader_cfg.conf
        --dtb <dtb>                                Path to ro_params.dtb
        --initial-baud-rate <initial-baud-rate>    Initial baud rate [default: 115200]
        --partition-cfg <partition-cfg>
            Path to partition_cfg.toml, default to be partition/partition_cfg_2M.toml

    -p, --port <port>                              Serial port

ARGS:
    <image>    Bin file

commands - dump

tingo@kg-core2:~/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/blflash $ target/debug/blflash dump --help
blflash-dump 0.3.5
Dump the whole flash to a file

USAGE:
    blflash dump [OPTIONS] <output> --port <port> [ARGS]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -b, --baud-rate <baud-rate>                    Flash baud rate [default: 1000000]
        --initial-baud-rate <initial-baud-rate>    Initial baud rate [default: 115200]
    -p, --port <port>                              Serial port

ARGS:
    <output>    Output file
    <start>     start address [default: 0]
    <end>       end address [default: 0x100000]

commands - flash

tingo@kg-core2:~/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/blflash $ target/debug/blflash flash --help
blflash-flash 0.3.5
Flash image to serial

USAGE:
    blflash flash [FLAGS] [OPTIONS] <image> --port <port>

FLAGS:
    -f, --force            Don't skip if hash matches
    -h, --help             Prints help information
    -V, --version          Prints version information
    -w, --without-boot2    Without boot2

OPTIONS:
    -b, --baud-rate <baud-rate>                    Flash baud rate [default: 1000000]
        --boot-header-cfg <boot-header-cfg>        Path to efuse_bootheader_cfg.conf
        --dtb <dtb>                                Path to ro_params.dtb
        --initial-baud-rate <initial-baud-rate>    Initial baud rate [default: 115200]
        --partition-cfg <partition-cfg>
            Path to partition_cfg.toml, default to be partition/partition_cfg_2M.toml

    -p, --port <port>                              Serial port

ARGS:
    <image>    Bin file

2025-04-05: c2 - build blflash

tingo@kg-core2:~/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/blflash $ cargo build
    Updating crates.io index
  Downloaded fnv v1.0.7
  Downloaded bitflags v1.3.2
  Downloaded funty v2.0.0
  Downloaded byteorder v1.4.3
  Downloaded autocfg v1.1.0
  Downloaded termcolor v1.1.3
  Downloaded aho-corasick v0.7.20
  Downloaded unicode-width v0.1.10
  Downloaded radium v0.7.0
  Downloaded quote v1.0.23
  Downloaded wyz v0.5.1
  Downloaded proc-macro-crate v1.2.1
  Downloaded thiserror-impl v1.0.38
  Downloaded unicode-ident v1.0.6
  Downloaded typenum v1.16.0
  Downloaded serde_derive v1.0.152
  Downloaded syn v1.0.107
  Downloaded version_check v0.9.4
  Downloaded regex-syntax v0.6.28
  Downloaded libc v0.2.139
  Downloaded serde v1.0.152
  Downloaded memchr v2.5.0
  Downloaded bitvec v1.0.1
  Downloaded structopt v0.3.26
  Downloaded num-traits v0.2.15
  Downloaded heck v0.3.3
  Downloaded structopt-derive v0.4.18
  Downloaded parse_int v0.6.0
  Downloaded humantime v2.1.0
  Downloaded strsim v0.10.0
  Downloaded log v0.4.17
  Downloaded ident_case v1.0.1
  Downloaded hex v0.4.3
  Downloaded crypto-common v0.1.6
  Downloaded clap v2.34.0
  Downloaded toml v0.5.10
  Downloaded thiserror v1.0.38
  Downloaded tap v1.0.1
  Downloaded number_prefix v0.4.0
  Downloaded indicatif v0.16.2
  Downloaded errno v0.2.8
  Downloaded ansi_term v0.12.1
  Downloaded cpufeatures v0.2.5
  Downloaded is-terminal v0.4.2
  Downloaded sha2 v0.10.6
  Downloaded crc v1.8.1
  Downloaded termios v0.2.2
  Downloaded once_cell v1.17.0
  Downloaded serial-unix v0.4.0
  Downloaded digest v0.10.6
  Downloaded zero v0.1.3
  Downloaded io-lifetimes v1.0.4
  Downloaded serial-core v0.4.0
  Downloaded regex v1.7.1
  Downloaded paw-raw v1.0.0
  Downloaded paw-attributes v1.0.2
  Downloaded paw v1.0.0
  Downloaded serial v0.4.0
  Downloaded main_error v0.1.2
  Downloaded ioctl-rs v0.1.6
  Downloaded block-buffer v0.10.3
  Downloaded xmas-elf v0.9.0
  Downloaded build_const v0.2.2
  Downloaded deku_derive v0.15.1
  Downloaded generic-array v0.14.6
  Downloaded darling_macro v0.14.2
  Downloaded deku v0.15.1
  Downloaded env_logger v0.10.0
  Downloaded proc-macro2 v1.0.49
  Downloaded darling v0.14.2
  Downloaded console v0.15.4
  Downloaded darling_core v0.14.2
  Downloaded unicode-segmentation v1.10.0
  Downloaded rustix v0.36.6
  Downloaded 74 crates (3.7 MB) in 1.29s
   Compiling proc-macro2 v1.0.49
   Compiling quote v1.0.23
   Compiling unicode-ident v1.0.6
   Compiling syn v1.0.107
   Compiling libc v0.2.139
   Compiling version_check v0.9.4
   Compiling serde_derive v1.0.152
   Compiling typenum v1.16.0
   Compiling serde v1.0.152
   Compiling memchr v2.5.0
   Compiling strsim v0.10.0
   Compiling io-lifetimes v1.0.4
   Compiling thiserror v1.0.38
   Compiling fnv v1.0.7
   Compiling bitflags v1.3.2
   Compiling ident_case v1.0.1
   Compiling rustix v0.36.6
   Compiling radium v0.7.0
   Compiling autocfg v1.1.0
   Compiling generic-array v0.14.6
   Compiling proc-macro-error-attr v1.0.4
   Compiling proc-macro-error v1.0.4
   Compiling tap v1.0.1
   Compiling unicode-segmentation v1.10.0
   Compiling regex-syntax v0.6.28
   Compiling cfg-if v1.0.0
   Compiling unicode-width v0.1.10
   Compiling build_const v0.2.2
   Compiling lazy_static v1.4.0
   Compiling once_cell v1.17.0
   Compiling log v0.4.17
   Compiling textwrap v0.11.0
   Compiling num-traits v0.2.15
   Compiling crc v1.8.1
   Compiling aho-corasick v0.7.20
   Compiling wyz v0.5.1
   Compiling heck v0.3.3
   Compiling strsim v0.8.0
   Compiling funty v2.0.0
   Compiling ansi_term v0.12.1
   Compiling paw-raw v1.0.0
   Compiling vec_map v0.8.2
   Compiling zero v0.1.3
   Compiling number_prefix v0.4.0
   Compiling cpufeatures v0.2.5
   Compiling termcolor v1.1.3
   Compiling humantime v2.1.0
   Compiling xmas-elf v0.9.0
   Compiling byteorder v1.4.3
   Compiling hex v0.4.3
   Compiling bitvec v1.0.1
   Compiling errno v0.2.8
   Compiling ioctl-rs v0.1.6
   Compiling regex v1.7.1
   Compiling termios v0.2.2
   Compiling serial-core v0.4.0
   Compiling atty v0.2.14
   Compiling console v0.15.4
   Compiling crypto-common v0.1.6
   Compiling block-buffer v0.10.3
   Compiling clap v2.34.0
   Compiling serial-unix v0.4.0
   Compiling main_error v0.1.2
   Compiling digest v0.10.6
   Compiling serial v0.4.0
   Compiling parse_int v0.6.0
   Compiling sha2 v0.10.6
   Compiling is-terminal v0.4.2
   Compiling env_logger v0.10.0
   Compiling indicatif v0.16.2
   Compiling darling_core v0.14.2
   Compiling thiserror-impl v1.0.38
   Compiling paw-attributes v1.0.2
   Compiling structopt-derive v0.4.18
   Compiling paw v1.0.0
   Compiling structopt v0.3.26
   Compiling darling_macro v0.14.2
   Compiling darling v0.14.2
   Compiling toml v0.5.10
   Compiling proc-macro-crate v1.2.1
   Compiling deku_derive v0.15.1
   Compiling deku v0.15.1
   Compiling blflash v0.3.5 (/zs/tingo/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/blflash/blflash)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 16.37s

2025-04-05: c2 - try the bouffalo-cli now

tingo@kg-core2:~/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/bouffalo-cli $ target/debug/bouffalo-cli -b 115200 -p /dev/cuaU0 info
Using serial device "/dev/cuaU0"
BootROM version: 102105089
OTP flags:
  00000000 00000000 00000001 00000000
  00100111 10010010 10000000 00000001
  11011011 11110001 01001001 11100000
  11000010 10110100 00011000 00000000

and

tingo@kg-core2:~/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/bouffalo-cli $ target/debug/bouffalo-cli -p /dev/cuaU0 info
Using serial device "/dev/cuaU0"
BootROM version: 102105089
OTP flags:
  00000000 00000000 00000001 00000000
  00100111 10010010 10000000 00000001
  11011011 11110001 01001001 11100000
  11000010 10110100 00011000 00000000

so that part works.

2025-02-05: c2 - hold the boot button, then plug in the M0S Dock. It now shows up in /var/log/messages as

Apr  5 17:49:49 kg-core2 kernel: ugen1.5: <Bouffalo Bouffalo CDC DEMO> at usbus1
Apr  5 17:49:49 kg-core2 kernel: umodem0 on uhub3
Apr  5 17:49:49 kg-core2 kernel: umodem0: <Bouffalo CDC DEMO> on usbus1
Apr  5 17:49:49 kg-core2 kernel: umodem0: data interface 1, has no CM over data, has no break

usbconfig

root@kg-core2:~ # usbconfig -d ugen1.5
ugen1.5: <Bouffalo Bouffalo CDC DEMO> at usbus1, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (100mA)

still tty U0

root@kg-core2:~ # sysctl dev.umodem.0.ttyname
dev.umodem.0.ttyname: U0

2025-04-05: c2 - try the target

tingo@kg-core2:~/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/bouffalo-cli $ target/debug/bouffalo-cli --help
bouffalo-cli 0.0.1

USAGE:
    bouffalo-cli [OPTIONS] <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -b, --baud-rate <baud-rate>
            The serial baud rate to use when communicating with the Boot ROM [env: BAUD_RATE=]  [default: 500000]

        --programming-baud-rate <programming-baud-rate>     [default: 500000]
    -p, --port <serial-port>
            The serial device to connect to [env: SERIAL_PORT=]  [default: /dev/ttyUSB0]


SUBCOMMANDS:
    elf2image    Convert an elf image to a firmware image
    flash        Operate on the external flash
    help         Prints this message or the help of the given subcommand(s)
    info         Get and print the bootrom info

2025-04-05: c2 - build bouffalo-cli

tingo@kg-core2:~/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/bouffalo-cli $ cargo build
    Updating crates.io index
  Downloaded lazy_static v1.4.0
  Downloaded opaque-debug v0.3.0
  Downloaded void v1.0.2
  Downloaded proc-macro-error v1.0.4
  Downloaded strsim v0.8.0
  Downloaded cfg-if v0.1.10
  Downloaded memchr v2.3.4
  Downloaded vec_map v0.8.2
  Downloaded quick-error v1.2.3
  Downloaded unicode-xid v0.2.1
  Downloaded textwrap v0.11.0
  Downloaded serde v1.0.118
  Downloaded clap v2.33.3
  Downloaded generic-array v0.14.4
  Downloaded proc-macro2 v1.0.24
  Downloaded proc-macro-error-attr v1.0.4
  Downloaded block-buffer v0.9.0
  Downloaded cfg-if v1.0.0
  Downloaded atty v0.2.14
  Downloaded byteorder v1.3.4
  Downloaded env_logger v0.7.1
  Downloaded digest v0.9.0
  Downloaded humantime v1.3.0
  Downloaded proc-macro-crate v0.1.5
  Downloaded ansi_term v0.11.0
  Downloaded bitflags v1.2.1
  Downloaded thread_local v1.0.1
  Downloaded serialport v3.3.0
  Downloaded aho-corasick v0.7.15
  Downloaded termcolor v1.1.2
  Downloaded num_enum v0.5.1
  Downloaded cpuid-bool v0.1.2
  Downloaded unicode-width v0.1.8
  Downloaded pretty_env_logger v0.4.0
  Downloaded version_check v0.9.2
  Downloaded thiserror v1.0.22
  Downloaded thiserror-impl v1.0.22
  Downloaded nix v0.14.1
  Downloaded num_enum_derive v0.5.1
  Downloaded typenum v1.12.0
  Downloaded quote v1.0.7
  Downloaded structopt v0.3.21
  Downloaded toml v0.5.7
  Downloaded structopt-derive v0.4.14
  Downloaded heck v0.3.1
  Downloaded derivative v2.1.1
  Downloaded log v0.4.11
  Downloaded anyhow v1.0.35
  Downloaded sha2 v0.9.2
  Downloaded unicode-segmentation v1.7.1
  Downloaded regex v1.4.2
  Downloaded syn v1.0.54
  Downloaded libc v0.2.81
  Downloaded regex-syntax v0.6.21
  Downloaded 54 crates (2.8 MB) in 1.46s
   Compiling version_check v0.9.2
   Compiling proc-macro2 v1.0.24
   Compiling unicode-xid v0.2.1
   Compiling syn v1.0.54
   Compiling libc v0.2.81
   Compiling serde v1.0.118
   Compiling typenum v1.12.0
   Compiling memchr v2.3.4
   Compiling bitflags v1.2.1
   Compiling lazy_static v1.4.0
   Compiling cfg-if v0.1.10
   Compiling log v0.4.11
   Compiling thread_local v1.0.1
   Compiling quick-error v1.2.3
   Compiling unicode-segmentation v1.7.1
   Compiling nix v0.14.1
   Compiling generic-array v0.14.4
   Compiling proc-macro-error-attr v1.0.4
   Compiling proc-macro-error v1.0.4
   Compiling unicode-width v0.1.8
   Compiling regex-syntax v0.6.21
   Compiling heck v0.3.1
   Compiling humantime v1.3.0
   Compiling textwrap v0.11.0
   Compiling strsim v0.8.0
   Compiling ansi_term v0.11.0
   Compiling vec_map v0.8.2
   Compiling aho-corasick v0.7.15
   Compiling termcolor v1.1.2
   Compiling byteorder v1.3.4
   Compiling anyhow v1.0.35
   Compiling void v1.0.2
   Compiling cfg-if v1.0.0
   Compiling cpuid-bool v0.1.2
   Compiling opaque-debug v0.3.0
   Compiling atty v0.2.14
   Compiling clap v2.33.3
   Compiling quote v1.0.7
   Compiling block-buffer v0.9.0
   Compiling digest v0.9.0
   Compiling sha2 v0.9.2
   Compiling regex v1.4.2
   Compiling serialport v3.3.0
   Compiling env_logger v0.7.1
   Compiling toml v0.5.7
   Compiling pretty_env_logger v0.4.0
   Compiling proc-macro-crate v0.1.5
   Compiling thiserror-impl v1.0.22
   Compiling derivative v2.1.1
   Compiling structopt-derive v0.4.14
   Compiling num_enum_derive v0.5.1
   Compiling thiserror v1.0.22
   Compiling structopt v0.3.21
   Compiling num_enum v0.5.1
   Compiling bouffalo-cli v0.0.1 (/zs/tingo/personal/projects/2025/rust/embedded/riscv/bouffalo_lab/bouffalo-cli)
warning: unused import: `FirmwareBuilder`
  --> src/bl.rs:20:37
   |
20 | pub use firmware::{crc32, Firmware, FirmwareBuilder, Segment};
   |                                     ^^^^^^^^^^^^^^^
   |
   = note: `#[warn(unused_imports)]` on by default

warning: variant `InvalidMagicHeader` is never constructed
  --> src/bl/firmware.rs:50:5
   |
48 | pub enum ClockConfigError {
   |          ---------------- variant in this enum
49 |     #[error("The magic header value is invalid: {:?}", _0)]
50 |     InvalidMagicHeader([u8; 4]),
   |     ^^^^^^^^^^^^^^^^^^
   |
   = note: `ClockConfigError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
   = note: `#[warn(dead_code)]` on by default

warning: fields `reader`, `header`, `program_headers`, and `section_headers` are never read
  --> src/elf_parser.rs:10:5
   |
9  | pub struct ElfParser<R> {
   |            --------- fields in this struct
10 |     reader: BufReader<R>,
   |     ^^^^^^
11 |     header: Header,
   |     ^^^^^^
12 |     program_headers: Vec<ProgramHeader>,
   |     ^^^^^^^^^^^^^^^
13 |     section_headers: Vec<SectionHeader>,
   |     ^^^^^^^^^^^^^^^
   |
   = note: `ElfParser` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis

warning: multiple fields are never read
   --> src/elf_parser.rs:135:9
    |
133 | pub struct Header {
    |            ------ fields in this struct
134 |     /// This byte is set to either 1 or 2 to signify 32- or 64-bit format, respectively
135 |     pub class: Class,
    |         ^^^^^
136 |     /// The endianness of the file
137 |     pub endianness: Endianness,
    |         ^^^^^^^^^^
138 |     /// The ELF file version
139 |     pub version: u8,
    |         ^^^^^^^
140 |     /// The target OS ABI
141 |     pub os_abi: u8,
    |         ^^^^^^
142 |     /// The target OS ABI version
143 |     pub os_abi_version: u8,
    |         ^^^^^^^^^^^^^^
144 |     /// The object file type
145 |     pub file_type: u16,
    |         ^^^^^^^^^
146 |     /// The program entry address
147 |     pub entry_addr: u32,
    |         ^^^^^^^^^^
    |
    = note: `Header` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis

warning: multiple fields are never read
   --> src/elf_parser.rs:168:5
    |
166 | pub struct ProgramHeader {
    |            ------------- fields in this struct
167 |     /// The type of the program header segment
168 |     typ: ProgType,
    |     ^^^
169 |     /// The offset to the segment in the image file
170 |     offset: u32,
    |     ^^^^^^
171 |     /// The virtual address to map the segment to
172 |     virt_addr: u32,
    |     ^^^^^^^^^
173 |     /// The physical address to map the segment to, when relevant
174 |     phys_addr: u32,
    |     ^^^^^^^^^
175 |     /// Size of the segment in the file image, in bytes
176 |     file_size: u32,
    |     ^^^^^^^^^
177 |     /// Size of the segment in memory, in bytes
178 |     mem_size: u32,
    |     ^^^^^^^^
179 |     /// Segment-dependent flags
180 |     flags: u32,
    |     ^^^^^
...
187 |     alignment: u32,
    |     ^^^^^^^^^
    |
    = note: `ProgramHeader` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis

warning: multiple fields are never read
   --> src/elf_parser.rs:196:9
    |
192 | pub struct SectionHeader {
    |            ------------- fields in this struct
...
196 |     pub typ: SectionType,
    |         ^^^
197 |     /// The attributes of this section
198 |     pub flags: u32,
    |         ^^^^^
199 |     /// Virtual address for this section, if it's to be loaded into memory
200 |     pub virt_addr: u32,
    |         ^^^^^^^^^
...
204 |     pub size: u32,
    |         ^^^^
205 |     /// Contains the index of an associated section, which might be used depending on the type
206 |     pub link: u32,
    |         ^^^^
207 |     /// Contains information about the section
208 |     pub info: u32,
    |         ^^^^
209 |     /// The required alignment of the section
210 |     pub addr_align: u32,
    |         ^^^^^^^^^^
211 |     /// The size of each entry, in bytes, if this is a section with fixed sized data
212 |     pub entry_size: u32,
    |         ^^^^^^^^^^
    |
    = note: `SectionHeader` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis

warning: `bouffalo-cli` (bin "bouffalo-cli") generated 6 warnings (run `cargo fix --bin "bouffalo-cli"` to apply 1 suggestion)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.68s

2025-04-05: c2 - tty port

root@kg-core2:~ # sysctl dev.umodem.0.ttyname
dev.umodem.0.ttyname: U0

so

root@kg-core2:~ # ll /dev/cuaU0 /dev/ttyU0
crw-rw----  1 uucp  dialer  0x1cd Apr  5 15:17 /dev/cuaU0
crw-------  1 root  wheel   0x1b5 Apr  5 15:17 /dev/ttyU0

2025-04-05: c2 - when plugged into a usb port, the M0S Docks shows up as (from /var/log/messages)

Apr  5 15:17:29 kg-core2 kernel: ugen1.5: <Bouffalo C-Sky CKLink-Lite> at usbus1
Apr  5 15:17:29 kg-core2 kernel: umodem0 on uhub3
Apr  5 15:17:29 kg-core2 kernel: umodem0: <C-Sky CKLink-Lite> on usbus1
Apr  5 15:17:29 kg-core2 kernel: umodem0: data interface 2, has no CM over data, has no break

usbconfig says

root@kg-core2:~ # usbconfig -d ugen1.5
ugen1.5: <Bouffalo C-Sky CKLink-Lite> at usbus1, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (100mA)

device description

root@kg-core2:~ # usbconfig -d ugen1.5 dump_device_desc
ugen1.5: <Bouffalo C-Sky CKLink-Lite> at usbus1, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (100mA)

  bLength = 0x0012 
  bDescriptorType = 0x0001 
  bcdUSB = 0x0200 
  bDeviceClass = 0x00ef  <Miscellaneous device>
  bDeviceSubClass = 0x0002 
  bDeviceProtocol = 0x0001 
  bMaxPacketSize0 = 0x0040 
  idVendor = 0x42bf 
  idProduct = 0xb210 
  bcdDevice = 0x0217 
  iManufacturer = 0x0001  <Bouffalo>
  iProduct = 0x0002  <C-Sky CKLink-Lite>
  iSerialNumber = 0x0003  <FactoryAIOT Prog 49E0C2>
  bNumConfigurations = 0x0001 

device config

root@kg-core2:~ # usbconfig -d ugen1.5 dump_curr_config_desc
ugen1.5: <Bouffalo C-Sky CKLink-Lite> at usbus1, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (100mA)


 Configuration index 0

    bLength = 0x0009 
    bDescriptorType = 0x0002 
    wTotalLength = 0x006a 
    bNumInterfaces = 0x0003 
    bConfigurationValue = 0x0001 
    iConfiguration = 0x0000  <no string>
    bmAttributes = 0x0080 
    bMaxPower = 0x0032 

    Additional Descriptor

    bLength = 0x08
    bDescriptorType = 0x0b
    bDescriptorSubType = 0x00
     RAW dump: 
     0x00 | 0x08, 0x0b, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00


    Interface 0
      bLength = 0x0009 
      bDescriptorType = 0x0004 
      bInterfaceNumber = 0x0000 
      bAlternateSetting = 0x0000 
      bNumEndpoints = 0x0002 
      bInterfaceClass = 0x00ff  <Vendor specific>
      bInterfaceSubClass = 0x0001 
      bInterfaceProtocol = 0x0000 
      iInterface = 0x0004  <CKLink-Lite>

     Endpoint 0
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0002  <OUT>
        bmAttributes = 0x0002  <BULK>
        wMaxPacketSize = 0x0040 
        bInterval = 0x0000 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 

     Endpoint 1
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0081  <IN>
        bmAttributes = 0x0002  <BULK>
        wMaxPacketSize = 0x0040 
        bInterval = 0x0000 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 

      Additional Descriptor

      bLength = 0x08
      bDescriptorType = 0x0b
      bDescriptorSubType = 0x01
       RAW dump: 
       0x00 | 0x08, 0x0b, 0x01, 0x02, 0x02, 0x02, 0x01, 0x00



    Interface 1
      bLength = 0x0009 
      bDescriptorType = 0x0004 
      bInterfaceNumber = 0x0001 
      bAlternateSetting = 0x0000 
      bNumEndpoints = 0x0001 
      bInterfaceClass = 0x0002  <Communication device>
      bInterfaceSubClass = 0x0002 
      bInterfaceProtocol = 0x0001 
      iInterface = 0x0002  <C-Sky CKLink-Lite>

      Additional Descriptor

      bLength = 0x05
      bDescriptorType = 0x24
      bDescriptorSubType = 0x00
       RAW dump: 
       0x00 | 0x05, 0x24, 0x00, 0x10, 0x01


      Additional Descriptor

      bLength = 0x05
      bDescriptorType = 0x24
      bDescriptorSubType = 0x01
       RAW dump: 
       0x00 | 0x05, 0x24, 0x01, 0x00, 0x02


      Additional Descriptor

      bLength = 0x04
      bDescriptorType = 0x24
      bDescriptorSubType = 0x02
       RAW dump: 
       0x00 | 0x04, 0x24, 0x02, 0x02


      Additional Descriptor

      bLength = 0x05
      bDescriptorType = 0x24
      bDescriptorSubType = 0x06
       RAW dump: 
       0x00 | 0x05, 0x24, 0x06, 0x01, 0x02


     Endpoint 0
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0085  <IN>
        bmAttributes = 0x0003  <INTERRUPT>
        wMaxPacketSize = 0x0040 
        bInterval = 0x0000 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 


    Interface 2
      bLength = 0x0009 
      bDescriptorType = 0x0004 
      bInterfaceNumber = 0x0002 
      bAlternateSetting = 0x0000 
      bNumEndpoints = 0x0002 
      bInterfaceClass = 0x000a  <CDC-data>
      bInterfaceSubClass = 0x0000 
      bInterfaceProtocol = 0x0000 
      iInterface = 0x0000  <no string>

     Endpoint 0
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0004  <OUT>
        bmAttributes = 0x0002  <BULK>
        wMaxPacketSize = 0x0040 
        bInterval = 0x0000 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 

     Endpoint 1
        bLength = 0x0007 
        bDescriptorType = 0x0005 
        bEndpointAddress = 0x0083  <IN>
        bmAttributes = 0x0002  <BULK>
        wMaxPacketSize = 0x0040 
        bInterval = 0x0000 
        bRefresh = 0x0000 
        bSynchAddress = 0x0000 

2025-04-05: I created this page.

2025-04-04: the package arrived, straight into my mailbox.

2025-03-25: the order was shipped.

2025-03-22: from AliExpress, I ordered 4 x Sipeed M0S Dock tinyML RISC-V BL616 wireless Wifi6 Module development board at USD 4.90 each, add USD 4.90 in tax, for a total of USD 24.50.