Duo S
Milk-V DuoS 是 Duo 的升级型号,升级了 SG2000 主控,拥有更大的内存(512MB)和更多的 IO 接口。 它集成了 WI-FI 6/BT 5 无线功能,并配备 USB 2.0 HOST 接口和 100Mbps 以太网端口,方便用户使用。 它支持双摄像头(2x MIPI CSI 2 通道)和 MIPI 视频输出(MIPI DSI 4 通道),可实现多种应用。 DuoS 还支持通过开关在 RISC-V 和 ARM 启动之间切换。 通过性能和接口的增强,DuoS 更适合各种场景和更复杂的项目开发需求。
SG2000 简介
SG2000 是一款高性能、低功耗芯片,专为智能监控 IP 摄像机、本地面部识别考勤机、智能家居设备等各种产品领域而设计。 它集成了 H.264/H.265 视频压缩解码和 ISP 能力。 支持 HDR 宽动态、3D 降噪、去雾、镜头畸变校正等多种图像增强和校正算法,为客户提供专业级的视频图像质量。
该芯片还集成了内部 TPU,在 INT8 运算下可提供约 0.5TOPS 的计算能力。专门设计的 TPU 调度引擎高效地为张量处理单元核心提供高带宽数据流。它还为用户提供了强大的深度学习模型编译器和软件 SDK 开发套件。 Caffe、Pytorch、ONNX、MXNet、TensorFlow(Lite)等主流深度学习框架都可以轻松移植到该平台。
SG2000 数据手册
我们已将 SG2000 的数据手册和 TRM 开源到GitHub。请 查看。
购买 SG2000 芯片
Milk-V 是 SG2000 芯片的全球授权经销商。您可以直接从我们的经销商 Arace 购买 SG2000 芯片的样品。如需批量订购,请联系 Milk-V 销售团队 获取报价。
上手指南
安装系统
-
从 SD 卡启动
请参考:启动 章节。
-
从 eMMC 启动
请参考:eMMC 版本固件烧录 章节。
USB 网络的使用
请参考:设置 章节。
DuoS GPIO 引脚分配
GPIO 引脚映射
GROUP | ADDR | PORT | CHIP | NUM | NAME | START |
---|---|---|---|---|---|---|
gpio0 | gpio@03020000 | porta | gpiochip0 | 480-511 | XGPIOA | 480 - XGPIOA[0] |
gpio1 | gpio@03021000 | portb | gpiochip1 | 448-479 | XGPIOB | 448 - XGPIOB[0] |
gpio2 | gpio@03022000 | portc | gpiochip2 | 416-447 | XGPIOC | 416 - XGPIOC[0] |
gpio3 | gpio@03023000 | portd | gpiochip3 | 384-415 | ||
gpio4 | gpio@05021000 | porte | gpiochip4 | 352-383 | PWR_GPIO | 352 - PWR_GPIO[0] |
排针 J3
排针 J3
上的 GPIO 使用 3.3V 逻辑电平。
SPI | PWM | I2C | UART | NUM | SG2000 | NAME | PIN | PIN | NAME | SG2000 | NUM | UART | PWM | SPI | JTAG |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3V3 | 1 | 2 | VSYS(5V) | ||||||||||||
PWM3 | I2C4_SCL | 468 | XGPIOB[20] | B20 | 3 | 4 | VSYS(5V) | ||||||||
I2C4_SDA | 469 | XGPIOB[21] | B21 | 5 | 6 | GND | |||||||||
I2C1_SCL | 466 | XGPIOB[18] | B18 | 7 | 8 | A16 | XGPIOA[16] | 496 | UART0_TX/UART1_TX | PWM4 | |||||
GND* | 9 | 10 | A17 | XGPIOA[17] | 497 | UART0_RX/UART1_RX | PWM5 | ||||||||
PWM1 | I2C1_SDA | UART2_TX | 459 | XGPIOB[11] | B11 | 11 | 12 | B19 | XGPIOB[19] | 467 | UART2_TX | PWM2 | |||
PWM2 | I2C1_SCL | UART2_RX | 460 | XGPIOB[12] | B12 | 13 | 14 | GND | |||||||
UART2_RX | 470 | XGPIOB[22] | B22 | 15 | 16 | A20 | XGPIOA[20] | 500 | JTAG_TRST | ||||||
3V3 | 17 | 18 | A19 | XGPIOA[19] | 499 | UART1_TX/UART1_RTS | PWM7 | JTAG_TMS | |||||||
SPI3_SDO | PWM3 | I2C2_SCL | 461 | XGPIOB[13] | B13 | 19 | 20 | GND | |||||||
SPI3_SDI | I2C2_SDA | 462 | XGPIOB[14] | B14 | 21 | 22 | A18 | XGPIOA[18] | 498 | UART1_RX/UART1_CTS | PWM6 | JTAG_TCK | |||
SPI3_SCK | UART2_TX | 463 | XGPIOB[15] | B15 | 23 | 24 | B16 | XGPIOB[16] | 464 | UART2_RX | SPI3_CS | ||||
GND | 25 | 26 | A28 | XGPIOA[28] | 508 | UART2_TX/UART1_TX |
GND*:引脚 9 在 V1.1 版本硬件中是一个低电平的 GPIO,在 V1.2 及更高版本硬件中为 GND。
注意:CSI 摄像头连接器 J2 上的 I2C 为 I2C2,所以在使用 J2 上的 CSI 摄像头时,J3 排针中的 I2C2 不可用。
排针 J4
排针 J4
上的 GPIO 使用 1.8V 逻辑电平。
PWM | I2C | UART | MIPI DSI | NUM | SG2000 | NAME | PIN | PIN | NAME | SG2000 | NUM | MIPI DSI |
---|---|---|---|---|---|---|---|---|---|---|---|---|
VSYS(5V) | 52 | 51 | AUDIO_OUT_R | |||||||||
PWM12 | I2C4_SCL | UART3_TX | 449 | XGPIOB[1] | B1 | 50 | 49 | AUDIO_OUT_L | ||||
PWM13 | I2C4_SDA | UART3_RX | 450 | XGPIOB[2] | B2 | 48 | 47 | AUDIO_IN_R | ||||
451 | XGPIOB[3] | B3 | 46 | 45 | AUDIO_IN_L | |||||||
PWM10 | I2C2_SDA | LCD_RST | 354 | PWR_GPIO[2] | E2 | 44 | 43 | 3V3 | ||||
PWM9 | I2C2_SCL | UART2_RX | LCD_PWR_CT | 353 | PWR_GPIO[1] | E1 | 42 | 41 | C18 | XGPIOC[18] | 434 | MIPI_TX_3N |
PWM8 | UART2_TX | LCD_PWM | 352 | PWR_GPIO[0] | E0 | 40 | 39 | C19 | XGPIOC[19] | 435 | MIPI_TX_3P | |
GND | 38 | 37 | GND | |||||||||
MIPI_TX_2N | 436 | XGPIOC[20] | C20 | 36 | 35 | C16 | XGPIOC[16] | 432 | MIPI_TX_CN | |||
MIPI_TX_2P | 437 | XGPIOC[21] | C21 | 34 | 33 | C17 | XGPIOC[17] | 433 | MIPI_TX_CP | |||
GND | 32 | 31 | GND | |||||||||
MIPI_TX_1N | 430 | XGPIOC[14] | C14 | 30 | 29 | C12 | XGPIOC[12] | 428 | MIPI_TX_0N | |||
MIPI_TX_1P | 431 | XGPIOC[15] | C15 | 28 | 27 | C13 | XGPIOC[13] | 429 | MIPI_TX_0P |
蓝色 LED 引脚
NAME | SG2000 | NUM |
---|---|---|
LED | XGPIOA[29] | 509 |
摄像头接口
DuoS 有两个 CSI 摄像头接连器:
- J1 是 16 PIN 间距为 0.5mm 与 Duo 和 Duo256M 摄像头兼容的连接器,可以直接使用 CAM-GC2083 摄像头。
- J2 是 15 PIN 间距为 1.0mm 与树莓派摄像头接口兼容的连接器,目前可以支持在树莓派上使用的 OV5647 摄像头。
注意,J1 接口使用的 I2C 为 I2C3,J2 接口使用的 I2C 为 I2C2,使用时注意检查引脚复用配置。
J1 接口 FPC 线序
J1 | Description |
---|---|
1 | GND |
2 | MIPI0_DN0 |
3 | MIPI0_DP0 |
4 | GND |
5 | MIPI0_DN1 |
6 | MIPI0_DP1 |
7 | GND |
8 | MIPI0_CKN |
9 | MIPI0_CKP |
10 | GND |
11 | SENSOR_RSTN0 (1.8V) |
12 | SENSOR_CLK0 (1.8V) |
13 | I2C3_SCL (1.8V) |
14 | I2C3_SDA (1.8V) |
15 | |
16 | 3V3 |
J2 接口 FPC 线序
J2 | Description |
---|---|
1 | 3V3 |
2 | I2C2_SDA (3.3V) |
3 | I2C2_SCL (3.3V) |
4 | SENSOR_CLK1 (3.3V) |
5 | SENSOR_RSTN1 (3.3V) |
6 | GND |
7 | MIPI0_DP5 (CAM1_CP) |
8 | MIPI0_DN5 (CAM1_CN) |
9 | GND |
10 | MIPI0_DP4 (CAM1_DP1) |
11 | MIPI0_DN4 (CAM1_DN1) |
12 | GND |
13 | MIPI0_DP3 (CAM1_DP0) |
14 | MIPI0_DN3 (CAM1_DN0) |
15 | GND |
POE 接口
POE Pin | Description |
---|---|
1 | VB- |
2 | VB+ |
3 | VA- |
4 | VA+ |
DuoS 使用指引
RISC-V 与 ARM 切换
DuoS 的大核可以选择使用 RISC-V 或者 ARM,可以通过主板上的切换开关来设置,如果您在使用中发现 DuoS 不能正常启动,请先检查该切换开关和使用的固件是否一致。
如果连接了调试串口,可以在第一行开机日志中看到,以 C
开头时代表从 RISC-V 核启动,以 B
开头时代表从 ARM 核启动。
- RISC-V:
C.SCS/0/0.C.SCS/0/0.WD.URPL.USBI.USBW
- ARM:
B.SCS/0/0.WD.URPL.B.SCS/0/0.WD.URPL.USBI.USBW
USB Type A 接口的使用
DuoS USB Type A 接口与 Type C 接口的 USB 功能是二选一的,不可以同时使用。默认固件配置的是 Type C 口的 USB 网口(USB-NCM)功能,如果需要切换为 Type A 口的 USB 2.0 HOST 口接 U 盘等设备使用,需要执行以下命令:
ln -sf /mnt/system/usb-host.sh /mnt/system/usb.sh
sync
然后执行 reboot
命令或重新上电使其生效。
比如 USB A 口接入 U 盘后,可以用 ls /dev/sd*
查看是否有检测到设备。
挂载到系统中查看 U 盘中的内容(以/dev/sda1为例):
mkdir /mnt/udisk
mount /dev/sda1 /mnt/udisk
查看 /mnt/udisk
目录中的内容是否符合预期:
ls /mnt/udisk
卸载U盘的命令:
umount /mnt/udisk
想恢复 Type C 口 的 USB 网卡(USB-NCM)功能时,执行:
rm /mnt/system/usb.sh
ln -sf /mnt/system/usb-ncm.sh /mnt/system/usb.sh
sync
然后执行 reboot
命令或重新上电使其生效。
DuoS 有板载以太网接口,所以 Type C 口的 USB 网口(USB-NCM)可以不用,一直保持切换为 A 口的 USB 2.0 Host 功能。
固定网口 MAC 地址
DuoS 以太网口 MAC 地址是随机分配的,这可能会导致每次重启之后,路由器为网口分配的 IP 地址会变,为了解决这个问题,可以使用如下命令配置一个固定的 MAC 地址:
替换命令中的 MAC 地址为你想使用的地址,另外注意在同一网段中,不能出现重复的 MAC 地址
echo "pre-up ifconfig eth0 hw ether 78:01:B3:FC:E8:55" >> /etc/network/interfaces && sync
然后执行 reboot 命令或重新上电使其生效。
UART 串口控制台
DuoS 主板上有预留 UART 调试串口,可以查看系统的启动日志,也可以在系统启动后登陆到控制台,执行一些终端命令。
USB-TTL 串口线
Duo 系列调试串口电平为 3.3V。
常见的 USB 转 TTL 串口线的引脚定义如下:
连接串口
如下图所示,连接 USB 到 TTL 串口线,不要连接红线。
Milk-V DouS | <---> | USB 转 TTL 串口 |
---|---|---|
GND (pin 6) | <---> | 黑色线 |
TX (pin 8) | <---> | 白色线 |
RX (pin 10) | <---> | 绿色线 |
DuoS 默认的串口参数如下:
baudrate: 115200
data bit: 8
stop bit: 1
parity : none
flow control: none
WIFI 配置
方法一
编辑如下文件,替换 ssid
和 psk
为要连接的 WIFI 账号和密码:
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
update_config=1
network={
ssid="wifi_test"
psk="12345678"
key_mgmt=WPA-PSK
}
再执行如下命令:
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
即可连接 WIFI,连接之后可以通过 ifconfig
或者 ip a
命令查看分配的 IP 地址。
如果需要开机自动连接 WIFI,可以把以下命令放到 /mnt/system/auto.sh
文件中。
interface="wlan0"
max_attempts=100
attempt=0
log_file="/var/log/auto.sh.log"
# Continuously attempt to detect if the interface exists, up to $max_attempts times
echo "start auto.sh" > "$log_file"
while [ $attempt -lt $max_attempts ]; do
# Check if the wlan0 interface exists
ip link show "$interface" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') $interface interface exists, starting wpa_supplicant..." >> "$log_file"
wpa_supplicant -B -i "$interface" -c /etc/wpa_supplicant.conf >> "$log_file"
break # Exit the loop if the interface is found
else
echo "$(date +'%Y-%m-%d %H:%M:%S') $interface interface not found, waiting..." >> "$log_file"
sleep 1 # Wait for 1 second before checking again
attempt=$((attempt + 1)) # Increment the attempt counter
fi
done
# If the maximum number of attempts is reached and the interface still not found, output an error message
if [ $attempt -eq $max_attempts ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') Interface $interface not found after $max_attempts attempts" >> "$log_file"
fi
固定 WIFI MAC 地址
DuoS WIFI MAC 地址是随机分配的,这可能会导致每次重启之后,路由器为 WIFI 分配的 IP 地址会变,可以使用如下命令为 WIFI 配置一个固定的 MAC 地址:
替换命令中的 MAC 地址为你想使用的地址,另外注意在同一网段中,不能出现重复的 MAC 地址
echo "MAC_ADDR=11:22:33:44:55:66" > /mnt/system/firmware/aic8800/rwnx_settings.ini && sync
然后执行 reboot 命令或重新上电使其生效。
eMMC 版本固件烧录
DuoS eMMC 版本出厂未烧录固件,需要使用 PC 通过 USB 接口烧录。
Windows 环境下烧录
-
安装驱动
下载 USB 驱动安装工具:CviUsbDownloadInstallDriver.zip。下载后解压安装即可。
-
下载烧录工具
下载 Windows 下的命令行烧录工具 CviBurn_v2.0_cli_windows.zip,下载后解压。
-
下载固件
下载 DuoS eMMC 最新版本的固件,当前是 milkv-duos-emmc-v1.1.3-2024-0930.zip,可以在烧录工具
CviBurn_v2.0_cli_windows
目录下新建 rom 文件夹,并将下载好的 eMMC 固件压缩包解压到 rom 目录下,此时烧录工具的目录结构如下:└───CviBurn_v2.0_cli_windows
│ cv_dl_magic.bin
│ usb_dl.exe
└───rom
│ boot.emmc
│ fip.bin
│ partition_emmc.xml
│ rootfs_ext4.emmc
| ...在 Windows 的终端中,
CviBurn_v2.0_cli_windows
目录下执行烧录命令:.\usb_dl.exe -s linux -c cv181x -i .\rom
也可以把固件放到其他目录,通过命令中的 -i 参数指定到对应的目录即可。
显示等待 USB 连接的信息:
按住 DuoS 上的 recovery 按键,再用 Type-C 数据线 连接 DuoS 和 PC 。
注意目前如果 DuoS 有插 SD 卡,请先将 SD 卡取下。
松开 recovery 按键, DuoS 会上电并进入烧录模式,PC 端会实时显示烧录进度:
[INFO] Waiting for USB device connection: ---
[INFO] found usb device vid=0x3346 pid=0x1000
[INFO] downloading file: .\rom\boot.emmc
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 3384664/213100824(1%)
[INFO] downloading file: .\rom\rootfs_ext4.emmc
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 20161944/213100824(9%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 36939224/213100824(17%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 53716504/213100824(25%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 70493784/213100824(33%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 87271064/213100824(40%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 104048344/213100824(48%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 120825624/213100824(56%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 137602904/213100824(64%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 154380184/213100824(72%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 171157464/213100824(80%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 187934744/213100824(88%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 204712024/213100824(96%)
[INFO] CVI_USB_PROGRAM
[INFO] updated size: 213100696/213100824(99%)
[INFO] USB download complete烧录完成后,DuoS 会自动重启,开机后看到 DuoS 上的蓝色 LED 闪烁,说明系统已经正常启动,烧录成功。
eMMC 擦除
如果需要将 eMMC 恢复到初始状态,请参考以下命令清除 eMMC 数据(请提前备份好eMMC中的重要文件):
- 解除 readonly
echo 0 > /sys/block/mmcblk0boot0/force_ro
echo 0 > /sys/block/mmcblk0boot1/force_ro - 擦除
dd if=/dev/zero of=/dev/mmcblk0boot0 bs=1M count=4
dd if=/dev/zero of=/dev/mmcblk0boot1 bs=1M count=4