Milk-V Duo is an ultra-compact embedded development platform based on the CV1800B chip. It can run Linux and RTOS, providing a reliable, low-cost, and high-performance platform for professionals, industrial ODMs, AIoT enthusiasts, DIY hobbyists, and creators.
- CPU: CVITEK CV1800B (C906@1Ghz + C906@700MHz)
- Dual RV64 Core up to 1GHz
- 64MB RAM
- Provides 10/100Mbps Ethernet via optional add-on board
├── build // compilation scripts and board configs
├── build_milkv.sh // one-click compilation script
├── buildroot-2021.05 // buildroot source code
├── freertos // freertos system
├── fsbl // fsbl firmware in prebuilt form
├── install // temporary images stored here
├── isp_tuning // camera effect parameters
├── linux_5.10 // linux kernel
├── middleware // self-developed multimedia framework
├── milkv // configuration files for milkv
├── opensbi // opensbi library
├── out // final image for SD card
├── ramdisk // prebuilt ramdisk
└── u-boot-2021.10 // u-boot source code
- Using a local Ubuntu system,
Ubuntu 20.04 LTS
is recommended.
(You can also use Ubuntu installed in a virtual machine, Ubuntu installed through WSL on Windows, or Ubuntu-based systems using Docker) - Install a serial port tool:
mobaXterm
orXshell
or others.
Install the tools that compile dependencies:
sudo apt install -y pkg-config build-essential ninja-build automake autoconf libtool wget curl git gcc libssl-dev bc slib squashfs-tools android-sdk-libsparse-utils jq python3-distutils scons parallel tree python3-dev python3-pip device-tree-compiler ssh cpio fakeroot libncurses5 flex bison libncurses5-dev genext2fs rsync unzip dosfstools mtools tclsh ssh-client android-sdk-ext4-utils
Note:cmake
minimum version requirement is 3.16.5
Check the version of cmake
in the system
cmake --version
The version of cmake
installed using apt in the current Ubuntu 20.04
is
cmake version 3.16.3
The minimum requirement of this SDK is not met. Manual installation of the latest version 3.27.6
is needed.
wget https://github.com/Kitware/CMake/releases/download/v3.27.6/cmake-3.27.6-linux-x86_64.sh
chmod +x cmake-3.27.6-linux-x86_64.sh
sudo sh cmake-3.27.6-linux-x86_64.sh --skip-license --prefix=/usr/local/
When manually installed, cmake
is located in /usr/local/bin
. To check its version, use the command cmake --version
, which should display
cmake version 3.27.6
Install the tools that compile dependencies:
sudo apt install -y pkg-config build-essential ninja-build automake autoconf libtool wget curl git gcc libssl-dev bc slib squashfs-tools android-sdk-libsparse-utils jq python3-distutils scons parallel tree python3-dev python3-pip device-tree-compiler ssh cpio fakeroot libncurses5 flex bison libncurses5-dev genext2fs rsync unzip dosfstools mtools tcl openssh-client cmake
Additionally, the mkimage command in the SDK relies on libssl1.1
. Sometimes the system won't contain that because it has been deprecated, use dpkg -s libssl1.1
to check if you have installed it.
If not, the following two methods are both applicable:
-
Installation with additional repositories
echo "deb http://security.ubuntu.com/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list sudo apt update sudo apt install libssl1.1
-
Manual download and installation of the deb package
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb sudo dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb
If you wish to perform the compilation with WSL, there's an small issue building the image. The $PATH, due Windows interoperability, has Windows environment variables which include some spaces between the paths.
To solve this problem you need to change the /etc/wsl.conf
file and add the following lines:
[interop]
appendWindowsPath = false
After that, you need to reboot the WSL with wsl.exe --reboot
. Then you able to run the ./build_milkv.sh
script or the build_all
line in the step-by-step compilation method.
To rollback this change in /etc/wsl.conf
file set appendWindowsPath
as true. To reboot the WSL, can you use the Windows PowerShell command wsl.exe --shutdown
then wsl.exe
, after that the Windows environment variables become avaliable again in $PATH.
git clone https://github.com/milkv-duo/duo-buildroot-sdk.git --depth=1
- Execute the one-click compilation script
build_milkv.sh
cd duo-buildroot-sdk/
./build_milkv.sh
- After a successful compilation, you can find the generated SD card burning image
milkv-duo-*-*.img
in theout
directory
Note: The first compilation will automatically download the required toolchain, which is approximately 840MB in size. Once downloaded, it will be automatically extracted to the host-tools
directory in the SDK directory. For subsequent compilations, if the host-tools
directory is detected, the download will not be performed again
If you wish to perform step-by-step compilation, you can enter the following commands sequentially
export MILKV_BOARD=milkv-duo
source milkv/boardconfig-milkv-duo.sh
source build/milkvsetup.sh
defconfig cv1800b_milkv_duo_sd
clean_all
build_all
pack_sd_image
Location of the generated image: install/soc_cv1800b_milkv_duo_sd/milkv-duo.img
Note: Writing the image to the microSD card will erase the existing data on the card. Remember to back up important data before burning!!!
- To write the generated image to a microSD card on Windows, you can use tools like
balenaEtcher
,Rufus
, orWin32 Disk Imager
- To write the generated image to a microSD card on Linux, use the
dd
command. Please make sure to carefully confirm that theof
device/dev/sdX
corresponds to the microSD card you want to burnsudo dd if=milkv-duo-*-*.img of=/dev/sdX
- Insert the microSD card into the microSD card slot of the Milk-V Duo
- Connect the serial cable (optional)
- Power on, the Duo will boot up and enter the system normally
- If a serial cable is connected, you can view the boot logs in the serial console. After entering the system, you can use the serial console to log in to the terminal and execute relevant Linux commands
- Using a serial cable
- Using a USB network (RNDIS)
- Using the Ethernet interface (requires the IO-Board)
The username and password for logging into the Duo terminal are as follows:
root
milkv
If you want to disable the LED blinking feature on the Duo, you can execute the following command in the Duo terminal:
mv /mnt/system/blink.sh /mnt/system/blink.sh_backup && sync
This means renaming the LED blinking script, and after restarting the Duo, the LED will no longer blink.
If you want to restore LED blinking, rename it back to its original name and restart the device.
mv /mnt/system/blink.sh_backup /mnt/system/blink.sh && sync
Note that when using the IO-Board, the USB network (RNDIS) is not available, Please use the Ethernet interface on the IO-Board
If you need to assign a fixed MAC address to the Ethernet port of the IO-Board, please execute the following command(Replace the MAC address in the command with the MAC address you want to set, and please note that MAC addresses of different devices within the same network segment must not be duplicated)
echo "pre-up ifconfig eth0 hw ether 78:01:B3:FC:E8:55" >> /etc/network/interfaces
then reboot the board
Enable the 4 USB ports on the IO-Board:
rm /mnt/system/usb.sh
ln -s /mnt/system/usb-host.sh /mnt/system/usb.sh
sync
then reboot the board
For example, if a USB flash drive is connected to the USB port on the IO-Board, you can use the command ls /dev/sd*
to check if the device is detected
To mount the USB drive and view its contents in the system (taking /dev/sda1 as an example):
mkdir /mnt/udisk
mount /dev/sda1 /mnt/udisk
Verify if the contents in the /mnt/udisk
directory match the expectations
ls /mnt/udisk
The command to unmount a USB flash drive
umount /mnt/udisk
To restore the functionality of the USB network (RNDIS) when not using the IO-Board, you can follow these steps
rm /mnt/system/usb.sh
ln -s /mnt/system/usb-rndis.sh /mnt/system/usb.sh
sync
then reboot the board
-
Why is only a single core being displayed?
The CV1800B chip adopts a dual-core design. Currently, the Linux system runs on one of the cores, while the other core is used for running a real-time system. The SDK for this core has not been released yet and will be updated in the future
-
Why does it only show 28M when viewing the RAM?
Because a portion of the RAM is allocated to ION, which is the memory used when running algorithms with the camera. If you're not using the camera, you can modify the value of this ION_SIZE to 0 and then recompile to generate the image
- CV181x/CV180x MMF SDK Development Documents (Chinese): MultiMedia Framework Software Development Document
- CV Series Chip TPU SDK Development Documentation Compilation (Chinese): CV series chip TPU SDK development data summary