4.开发板硬件快速使用指南 - sophgo-forum-service/sophpi-huashan GitHub Wiki
华山派-CV181系列开发板是**算能和生态伙伴硬件十万个为什么**联合推出的的开源生态开发板,为广大使用者提供基于RISC-V的开源开发环境,以视觉、AI场景开发为核心,提供全国产化的解决方案。
开发板采用XuanTie C906 RISC-V双核CPU,内置4Gb\2Gb\1Gb DDR3L内存可选,算力达到0.5T,支持H.264/H.165/MJPEG 5Mp30(4:3 or 16:9)编码以及H.264/MJPEG 5Mp30(4:3 or 16:9) 内置Audio codec模块。并且兼容EMMC、SPINAND、NorFlash设计。
开发板拥有丰富的外设接口和硬件外围设备资源,包括两个Mipi CSI视觉输入,Mipi DSI和HDMI输出,Wifi、蓝牙和100Methernet(RJ45)无线协议,4个USB2.0,SD card,SPK out(扬声器)、MIC in(麦克风输入),Uart串口,SPI,I2C,PWM,GPIO等等。
结合开发板强大AI算力、全开源、小巧便携的优点,使得其应用场景十分广泛,像 智慧门禁、智能IPCam、无人机、扫读笔、机器人、智能门铃门锁等等
注意板端的RX脚接
usb-ttl
的TX脚,板端TX脚接usb-ttl
的RX脚



一切顺利的话终端显示
[root@cvitek]~#
可在开发板双排针J5中进行实验,其对应的GPIO口有GPIOB22,GPIOA20等。
PinName | PinN | PinN | PinName |
---|---|---|---|
1 | 2 | ||
IIC_SDA | 3 | 4 | |
IIC_SCL | 5 | 6 | |
GPIOB22 | 7 | 8 | UART1_TX/JTAG_TDI |
9 | 10 | UART1_RX/JTAG_TDO | |
PWR_BGPIO3 | 11 | 12 | PWM2 |
PWR_BGPIO5 | 13 | 14 | |
PWR_BGPIO15 | 15 | 16 | PWR_BGPIO16 |
17 | 18 | XBGPIO85 | |
SPI2_MOSI | 19 | 20 | |
SPI2_MISO | 21 | 22 | PWR_BGPIO14 |
SPI2_SCK | 23 | 24 | SPI2_CS |
25 | 26 | SPI3_CS | |
IIC3_SDA | 27 | 28 | IIC3_SCL |
GPIOA20/JTAG_TRST | 29 | 30 | |
31 | 32 | PWM6/JTAG_TCK | |
PWM7/JTAG_TMS | 33 | 34 | |
SPI3_MISO | 35 | 36 | PWR_BGPIO17 |
PWR_BGPIO1 | 37 | 38 | SPI3_MOSI |
39 | 40 | SPI3_SCK |
使用SDK发布的kernel。
加载内核。默认GPIO相关模块已全部编入内核,不需要再执行加载命令。
在控制台下运行GPIO读写命令或者自行在内核态或者用户态编写GPIO读写程序,就可以对GPIO进行输入输出操作。
echo N > /sys/class/gpio/export
N为待操作的GPIO编号,GPIO编号 = GPIO组号值 + 偏移值.
以原理图中GPIO1_2管脚为例, GPIO1对应GPIO组号值448, 偏移值为2.
因此GPIO编号N为448 + 2 = 450
组号值对应如下:
GPIO0 对应linux组号值为 480
GPIO1 对应linux组号值为 448
GPIO2 对应linux组号值为 416
GPIO3 对应linux组号值为 404
PWR_GPIO 对应linux组号值为 381
echo N > /sys/class/gpio/export 之后, 生成/sys/class/gpio/gpioN目录
设置为输入:echo in > /sys/class/gpio/gpioN/direction
设置为输出:echo out > /sys/class/gpio/gpioN/direction
例: 设置GPIO1_2 (即编号450)方向为输入:
echo in > /sys/class/gpio/gpio450/direction
设置GPIO1_2 (即编号450)方向为输出:
echo out > /sys/class/gpio/gpio450/direction
查看输入值: cat /sys/class/gpio/gpioN/value
或
输出低:echo 0 > /sys/class/gpio/gpioN/value
输出高:echo 1 > /sys/class/gpio/gpioN/value
echo N > /sys/class/gpio/export
使用SDK发布的kernel。
对应1.1章节所列J5中的UART1_TX,UART1_RX
加载内核。默认UART相关模块已全部编入内核,不需要再执行加载命令。
开发板烧录固件后通过串口线连接电脑,有正常打印则代表串口正常工作。
在控制台下运行命令:ls /dev/ 可查看对应的UART列表有如:ttyS0, ttyS1,...,ttyS4
更多串口编程操作可查找网络资料。
输出如下:

模块编译:源码路径为middleware/v2/sample/mipi_tx/
编译成功后会生成可执行文件sample_dsi,将其拷贝至SD卡后,并在板端进行进行验证。
实验前需要通过LCD接口(对应开发板J16)连接开发板至屏幕HX8394。
在控制台中依次执行下面命令:
./sample_dsi
devmem 0x0a088000 32 0xC0
devmem 0x0a088094 32 0x0701000a
其中第二条命令表示通过设置寄存器开启图像输出
第三条命令表示通过设置寄存器打开ColorBar
LCD屏幕上有显示彩条

1,HDMI线连接带有HDMI接口的高清屏幕。
2,FPC线连接开发板J13至双路Sensor模组GC2053+GC2093。
模块编译:源码路径分别为
middleware/v2/sample/display_test/
middleware/v2/sample/vio/
编译成功后会生成可执行文件lt9611_test和sample_vio,
将其拷贝至SD卡后,并在板端进行进行验证。
同时拷贝middleware/v2/sample/sensor_cfg/路径下的sensor_cfg.ini.gc2053+gc2093 至SD卡,
并重命名为sensor_cfg.ini。
板子通过HDMI接屏幕,且双路sensor模组GC2053+GC2093连接开发板并上电。
在控制台中依次执行下面命令
在挂载SD卡,并进入/mnt/sd目录后依次执行下面命令
cp sensor_cfg.ini /mnt/data
./lt9611_test
./sample_vio 19
1 //切换到GC2093进行显示
0 //切换到GC2053进行显示
HDMI屏幕上能切换显示GC2053及GC2093图像
如果接的是单目sensor, 需将sensor_cfg.ini.ov5647拷贝至SD卡,并重命名为sensor_cfg.ini。
挂载SD卡后,并进入/mnt/sd目录后依次执行下面命令:
cp sensor_cfg.ini /mnt/data
./lt9611_test
./sample_vio 0
此时屏幕会显示单目ov5647 sensor的图像。
屏幕显示输出如下

终端输出如下

开发板搭载有线网络模块与无线网络模块
CV182H 以太网模块提供 1 个 Ethernet MAC , 实现网路数据的接收与发送. Ethernet MAC 搭配内建 10/100Mbps Fast Ethernet Transceiver 可工作在 10/100Mbps 全 双工或半双工模式.
开发板默认已启动有线网卡,并打开了动态获取IP的方式
ifconfig
手动配置IP地址
ifconfig eth0 192.168.1.100
开发板IP与PC链接的IP在一个网段下,ping 通
ping 192.168.1.192
开发板板载了 8821 Wi-Fi,蓝牙芯片。 Wi-Fi 部分通过SDIO 总线与 CV1821H 通讯。
在板端依次执行下面命令
insmod /mnt/system/ko/3rd/8821cs.ko
ifconfig wlan0 up
ifconfig
在编译SDK后,会生成实验所其依赖的文件及路径为:
middleware/v2/sample/rtk_hciattach/rtk_hciattach
将rtk_hciattach拷贝至SD卡后,接入板子上电进行验证
开发板挂载SD卡并进入SD卡目录后,执行下面命令:
./rtk_hciattach -n -s 115200 ttyS2 rtk_h5
串口如看到下面打印信息则代表蓝牙固件下载成功,完成正常初始化
Realtek Bluetooth :Start downloading...
Realtek Bluetooth :Send last pkt
Realtek Bluetooth :Disable host hw flow control
Realtek Bluetooth :h5_hci_reset: Issue hci reset cmd
Realtek Bluetooth :Receive cmd complete event of command: 0c03
Realtek Bluetooth :Received cc of hci reset cmd
Realtek Bluetooth :Init Process finished
Realtek Bluetooth :Realtek Bluetooth post process
Realtek Bluetooth :Device setup complete
终端输出如下
在编译SDK后,会生成实验所其依赖的文件及路径为:
middleware/v2/sample/tp/tp
将可执行文件tp拷贝至SD卡后,接入板子上电进行验证
开发板挂载SD卡并进入SD卡目录后,执行下面命令
insmod /mnt/system/ko/3rd/gt9xx.ko
./tp test
1280 720 //panel resolution
0 // operate node id[0/1/2]
0 // init tp_event_0
1 //postion get looping
再滑动触摸屏,串口会打印除触摸位置坐标
在build/boards/mars/xxx/linux/*_defconfig配置文件中加入以下配置,并重新编译升级。
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_USB_STORAGE=y
板子正常启动后执行如下命令:
echo host > /proc/cviusb/otg_role
lsusb
串口可以看到下面打印信息,插入USB设备执行lsusb,可以看到usb设备列表更新则代表USB HUB完成正常初始化。
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 002: ID 058f:6254
终端输出如下
此实验所其依赖的文件会以模块的形式存储在固件当中,在板端如下路径可查阅:
/mnt/system/ko/mars_rtc.ko
板子正常启动后执行如下命令:
insmod /mnt/system/ko/mars_rtc.ko
date -s "2022-10-11 21:15:28"
hwclock -w
断电等待指定时间后上电,并执行如下命令:
insmod /mnt/system/ko/mars_rtc.ko
hwclock -r
硬件时钟时间有自动续上
终端输出如下
在编译SDK后,会生成实验所其依赖的文件及路径为:
middleware/v2/sample/audio/sample_audio
middleware/v2/lib/3rd/libcli.so
以及middleware/v2/lib/目录下的如下库文件:
libaaccomm2.so
libcvi_vqe.so
libaacdec2.so
libcvi_RES1.so
libsys.so
libaacenc2.so
libcvi_VoiceEngine.so
libtinyalsa.so
libaacsbrdec2.so
libcvi_audio.so
libaacsbrenc2.so
libcvi_ssp.so
将此依赖和测试程序sample_audio拷贝至SD卡后,接入板子上电进行验证
硬件板子连接J12至MIC,J11至喇叭
步骤1:板端测试环境准备 在挂载SD卡后按如下步骤准备测试环境
a), 在/mnt/data目录下新建目录lib
b), 将上述音频库文件拷贝至/mnt/data/lib
c), 申明库文件引用路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/sd/lib
d), cd /mnt/sd
步骤2:设置音频音量
a), 运行测试程序sample_audio设置音量值为24(可自由配置):
./sample_audio 6
0 //card id
24 // volume
1 // Select Ain
步骤3:确认是否使能speak 开发板默认关闭speak,若想开启,需拉高相关gpio(具体详情请询问FAE人员) 例:此专案cv1812h 的SPK_EN为495,则通过输入以下命令
echo 495 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio495/direction
echo 1 > /sys/class/gpio/gpio495/value
步骤4:确认录音正常
[录音正常测试]:sample_audio 4
输入命令
./sample_audio 4 --list -r 8000 -R 8000 -c 2 -p 320 -C 0 -V 0 -F Cvi_8k_2chn.raw -T 10预设录音秒数:10) ,然后对着mic朗读一段文字或播放一段音乐。
产出Cvi_8k_2chn.raw 档案.
步骤5:确认播放正常 [播放正常测试]:sample_audio 5 输入命令: ./sample_audio 5 --list -r 8000 -R 8000 -c 2 -p 320 -C 0 -V 0 -F Cvi_8k_2chn.raw -T 10
播音时确认喇叭有出声且大小合适没有爆音,杂音,明显失真等
终端打印输出

开发板板载 EMMC 与 Micro-SD Card卡槽
启动平台至 kernel 后,会自加载本地文件系统 squashFS 及 ext4。
ext4 文件系统的区域,启动至 kernel 后会自动挂载至 /mnt/data 目录,可读可写。
初始化及应用: 待 SD 卡插入后,进行如下操作(下文 X 为分区号,其值由 fdisk 工具进行分区时 决定): 指定 fdisk 操作的具体目录为: ~ $ fdisk /dev/mmcblk1
* 步骤 1. 检查分区信息
* a. 若没有显示出 p1,表示 SD 卡还没有分区, 请在 Linux 下用 fdisk 工具进行分区或是在 windows 系统上将 SD 卡进行格式化之后,进入步骤 2。
* b. 若有显示分区信息 p1,则表示 SD 卡已经被检测到,并已进行过分 区,可进入步骤 2 进行挂载。
* 步骤 2. 挂载 1. ~ $ mount /dev/mmcblk1pX /mnt/sd ,此命令会将 SD 卡上第 X 个分 区挂载至/mnt/sd 目录
一般而言sd卡挂载执行:
mount /dev/mmcblk0p1 /mnt/sd
示例:
# 插入SD卡前
[root@cvitek]~# ls /dev/
console cvi_vc_dec3 gpiochip3 mmcblk0p6
cv182xaadc cvi_vc_dec4 gpiochip4 mmcblk0p7
cv182xadac cvi_vc_dec5 hwrng mmcblk0rpmb
cvi-base cvi_vc_dec6 i2c-0 null
cvi-dwa cvi_vc_dec7 i2c-2 ptmx
cvi-fast-image cvi_vc_dec8 i2c-3 pts
cvi-ive cvi_vc_enc0 i2c-4 random
cvi-mipi-rx cvi_vc_enc1 ion rfkill
cvi-mipi-tx cvi_vc_enc2 kmsg root
cvi-rgn cvi_vc_enc3 log shm
cvi-rtos-cmdqu cvi_vc_enc4 mem snd
cvi-sys cvi_vc_enc5 mmcblk0 tty
cvi-tpu0 cvi_vc_enc6 mmcblk0boot0 ttyS0
cvi-vi cvi_vc_enc7 mmcblk0boot1 ttyS1
cvi-vo cvi_vc_enc8 mmcblk0p1 ttyS2
cvi-vpss full mmcblk0p2 ttyS3
cvi_vc_dec0 gpiochip0 mmcblk0p3 ttyS4
cvi_vc_dec1 gpiochip1 mmcblk0p4 urandom
cvi_vc_dec2 gpiochip2 mmcblk0p5 zero
# 插入SD卡后
[root@cvitek]~# ls /dev/
console cvi_vc_dec4 hwrng mmcblk1
cv182xaadc cvi_vc_dec5 i2c-0 mmcblk1p1 # 出现了 mmcbk1 和 mmcblk1p1
cv182xadac cvi_vc_dec6 i2c-2 null
cvi-base cvi_vc_dec7 i2c-3 ptmx
cvi-dwa cvi_vc_dec8 i2c-4 pts
cvi-fast-image cvi_vc_enc0 ion random
cvi-ive cvi_vc_enc1 kmsg rfkill
cvi-mipi-rx cvi_vc_enc2 log root
cvi-mipi-tx cvi_vc_enc3 mem shm
cvi-rgn cvi_vc_enc4 mmcblk0 snd
cvi-rtos-cmdqu cvi_vc_enc5 mmcblk0boot0 tty
cvi-sys cvi_vc_enc6 mmcblk0boot1 ttyS0
cvi-tpu0 cvi_vc_enc7 mmcblk0p1 ttyS1
cvi-vi cvi_vc_enc8 mmcblk0p2 ttyS2
cvi-vo full mmcblk0p3 ttyS3
cvi-vpss gpiochip0 mmcblk0p4 ttyS4
cvi_vc_dec0 gpiochip1 mmcblk0p5 urandom
cvi_vc_dec1 gpiochip2 mmcblk0p6 zero
cvi_vc_dec2 gpiochip3 mmcblk0p7
cvi_vc_dec3 gpiochip4 mmcblk0rpmb
[root@cvitek]~# mount /dev/mmcblk1p1 /mnt/sd
[root@cvitek]~# ls /mnt/sd/ #下面是sd卡内的文件
System Volume Information cfg.emmc
app_install.tar fip.bin
awtk_install fw_payload_uboot.bin
boot.emmc ipcam
capture_face_13_0.803522.jpg rootfs.emmc
capture_face_13_1.000000.jpg system.emmc
capture_face_20_1.000000.jpg tiger.bmp
[root@cvitek]~#
网线将开发板连接主机电脑 板端配置IP
ifconfig eth0 192.168.1.120 netmask 255.255.255.0 up
环境准备:
1.确保板子网口IP和主机虚拟机在同一网段,且相互可Ping通,假设服务器端ip为192.168.1.192。
2.主机虚拟机已配置NFS服务,如未安装执行sudo apt install nfs-kernel-server。
3.检查nfs-server是否已启动,执行sudo systemctl status nfs-server。
4.创建共享目录如/home/mnt/nfs,并授权访问。执行sudo chown nobody:nogroup /home/mnt/nfs
及sudo chmod -R 777 /home/mnt/nfs/
5.修改nfs服务器配置文件/etc/exports指定nfs服务器共享目录及属性,如添加以下指令:
/home/mnt/nfs 192.168.1.120(rw,sync,no_subtree_check)
6.使能配置文件,sudo exportfs -arv。
7.查看共享目录,showmount -e 192.168.1.192。
192.168.1.192为虚拟机IP
[root@cvitek]~# ping 192.168.1.192
PING 192.168.1.192 (192.168.1.192): 56 data bytes
64 bytes from 192.168.1.192: seq=0 ttl=64 time=1.948 ms
64 bytes from 192.168.1.192: seq=1 ttl=64 time=1.233 ms
64 bytes from 192.168.1.192: seq=2 ttl=64 time=1.160 ms
/home/mnt/nfs为虚拟机nfs 服务配置可读写的目录, 执行挂载命令:
mount -t nfs -o nolock -o tcp 192.168.1.192:/home/mnt/nfs /mnt/nfs
管脚连接示意图如下:
1.通过代码配置
编辑文件cvi_mmf_sdk/build/boards/mars/cv1812h_wevb_0007a_emmc_huashan/u-boot/cvi_board_init.c,在函数
cvi_board_init中可添加Jtag pinmux配置,如下:
PINMUX_CONFIG(IIC0_SCL, CV_SCL0__CR_4WTDI);
PINMUX_CONFIG(IIC0_SDA, CV_SDA0__CR_4WTDO);
PINMUX_CONFIG(JTAG_CPU_TMS, CV_2WTMS_CR_4WTMS);
PINMUX_CONFIG(JTAG_CPU_TCK, CV_2WTCK_CR_4WTCK);
PINMUX_CONFIG(JTAG_CPU_TRST, JTAG_CPU_TRST);
注:代码配置注意管脚复用时,此管脚被重复赋值,建议使用cvi_pinmux配置,更加灵活方便。
2.通过cvi_pinmux工具在串口命令行输入命令配置
cvi_pinmux -w IIC0_SCL/CV_SCL0
cvi_pinmux -w IIC0_SDA/CV_SDA0
cvi_pinmux -w JTAG_CPU_TMS/CV_2WTMS_CR_4WTMS
cvi_pinmux -w JTAG_CPU_TCK/CV_2WTCK_CR_4WTCK
cvi_pinmux -w JTAG_CPU_TRST/JTAG_CPU_TRST
cvi_pinmux -r IIC0_SCL
cvi_pinmux -r IIC0_SDA
cvi_pinmux -r JTAG_CPU_TCK
cvi_pinmux -r JTAG_CPU_TMS
cvi_pinmux -r JTAG_CPU_TRST
-
T-HEAD软件 安装路径:
https://cvitekcn.sharepoint.com/:u:/s/tmp/EZB9cDvtfHBNkqESUlqlCL8BsbDQRTQhXTPLVG4iPS3mHw?e=a9ySuD -
CKLINK调试器
-
板端上电后,使用cvi_pinmux配置Jtag pinmux之后,打开T-HeadDebugServer工具。
-
点击如下图按钮,Run debugger server.
-
进入虚拟机工作目录在,执行以下指令:
export PATH=$PATH:/工具链路径/gcc/riscv64-linux-musl-x86_64/bin 或 export PATH=$PATH:/工具链路径/gcc/riscv64-linux-x86_64/bin
riscv64-unknown-linux-musl-gdb ./testapp 或 riscv64-unknown-linux-gnu-gdb ./testap 即可进入下图模式:
-
可用的ip如步骤2中图中下方红框内所示,选择框中任意一行指令在步骤3中命令行中输入即可完成连接,如下图:
1.修改cvi_mmf_sdk/build/boards/mars/cv1812h_wevb_0007a_emmc_huashan/cv1812h_wevb_0007a_emmc_huashan_defconfig,添加以下选项,重新编译即可:
CONFIG_TARGET_PACKAGE_PINMUX=y
2.通过menuconfig修改 执行如下命令:
source build/cvisetup.sh
menuconfig
工具包路径如下:
选择完成后重新编译即可。
1,检查MIPI屏幕硬件对应的POWER, RESET, BACKLIGHT引脚是否在cvi_board_init.c中通过pinmux正确配置
2,所接屏幕对应驱动配置 combo_dev_cfg_s中的Lane_id及lane_pn_swap是否和原理图设计一致。
3,是否可以通过i2cdetect命令在终端可以扫描到I2C Address
4,输出彩图实验时需要通过寄存器开启VO及ColorBar
devmem 0x0a088000 32 0xC0
devmem 0x0a088094 32 0x0701000a
i2cdetect工具在扫描指定总线的I2C设备时如出现timed out问题,大部分原因是出现引脚重复定义的情况.
譬如如下两组Pin同时定义为I2C3。
PINMUX_CONFIG(VIVO_D1, IIC3_SDA);
PINMUX_CONFIG(VIVO_D0, IIC3_SCL);
PINMUX_CONFIG(SD1_CLK, IIC3_SDA);
PINMUX_CONFIG(SD1_CMD, IIC3_SCL);
问题排查:如代码不好确认,可通过查找《CVXXX__PINOUT_V0.1_CN》管脚功能定义手册,
查找II2C3_SDA有关的管脚及其寄存器,根据devmem命令查看对应寄存器是否有重复设定IIC3的情况。
1,确认Sensor电源供应正确.
2,确认Sensor输入参考时钟来源(主芯片或外部晶振)
3,确认I2C可擦写Sensor寄存器,I2C地址和Rset引脚在Code中是否有正确配置。
4,如i2cdetect扫不到Sensor不一定是Sensor问题,可能是sensori2c地址超越了i2cdetect工具扫描范围。
5, 其MIPI Lane线序是否在sensor_cfg.ini中正确配置