4
0
mirror of https://github.com/RT-Thread/rt-thread.git synced 2025-01-18 16:03:30 +08:00
imcu 6cbb2c3ee5 [bsp][cvitek] add cache opration functions for cache coherence
By default, the small core enables D-Cache without ensuring cache
coherence. Therefore, when using shared memory, inconsistencies can
occur in the data read by the small core and the big core.

Solution: Migrate cache-related functions from the official
duo-buildroot-sdk library to implement cache-related operations in
rthw.h. This allows you to either disable D-Cache or call the
flush_dcache_range function before reading and after writing for
synchronization.

It is recommended to use the flush_dcache_range function, as disabling
D-Cache can have a significant performance impact.

Signed-off-by: zdtyuiop4444 <ign7798540@gmail.com>
2025-01-16 09:05:52 +08:00
..
2024-03-28 23:35:54 +08:00

1. 参考文档

2. 概述

支持开发板以及集成 SoC 芯片信息如下

Duo 家族开发板采用 CV18xx 系列芯片。芯片的工作模式总结如下:

  • CV1800B支持一种工作模式
    • 大核RISC-V C906@1GHz+ 小核RISC-V C906@700MHz
  • SG2002原 CV181xC支持两种工作模式通过管脚 GPIO_RTX 的外围电路控制进行切换:
    • 大核RISC-V C906@1GHz+ 小核RISC-V C906@700MHz
    • 大核ARM Cortex-A53@1GHz+ 小核RISC-V C906@700MHz
  • SG2000原 CV181xH支持两种工作模式通过管脚 GPIO_RTX 的外围电路控制进行切换:
    • 大核RISC-V C906@1GHz+ 小核RISC-V C906@700MHz
    • 大核ARM Cortex-A53@1GHz+ 小核RISC-V C906@700MHz

3. BSP 支持情况

由于大小核的存在,以及不同 SoC 下不同工作模式的存在bsp/cvitek 提供了三种不同 BSP/OS需要单独编译。

BSP 名称 大小核 芯片架构 默认串口控制台 备注
cv18xx_risc-v 大核 RISC-V C906 uart0 支持 MMU支持 RT-Thread 标准版 和 RT-SMART 模式,默认运行 RT-SMART 版本
c906-little 小核 RISC-V C906 uart1 无 MMU运行 RT-Thread 标准版
cv18xx_aarch64 大核 ARM Cortex A53 uart0 支持 MMU 支持 RT-Thread 标准版 和 RT-SMART 版,默认运行 RT-Thread 标准版本

由于开发板默认运行的大核为 "cv18xx_risc-v", 所以本文将主要介绍 "cv18xx_risc-v" 和 "c906-little" 的构建和使用。有关 "cv18xx_aarch64" 的介绍请参考 这里

3.1. 驱动支持列表

驱动 支持情况 备注
uart 支持 默认波特率115200
gpio 支持
i2c 支持
adc 支持
spi 支持 默认 CS 引脚,每个数据之间 CS 会拉高,请根据时序选择 GPIO 作为 CS。若读取数据tx 需持续 dummy 数据。
pwm 支持
timer 支持
wdt 支持
sdio 支持
eth 支持

3.2. 默认串口控制台管脚配置

不同开发板 uart 输出管脚不同,默认配置可能导致串口无法正常显示,请根据开发板 uart 通过 scons --menuconfig 配置对应 uart 的输出管脚。

$ scons --menuconfig
  General Drivers Configuration  --->
      [*] Using UART  --->
          [*] Enable UART 1
          (IIC0_SDA) uart1 rx pin name
          (IIC0_SCL) uart1 tx pin name
开发板 大核 uart0 默认管脚 小核 uart1 默认管脚
Duo rx: UART0_RX
tx: UART0_TX
rx: IIC0_SDA
tx: IIC0_SCL
Duo 256M rx: UART0_RX
tx: UART0_TX
rx: IIC0_SDA
tx: IIC0_SCL
Duo S rx: UART0_RX
tx: UART0_TX
rx: JTAG_CPU_TCK
tx: JTAG_CPU_TMS

如需配置其他管脚可参考对应型号的开发板信息 https://milkv.io/docs/duo/overview

4. 编译

注:当前 bsp 只支持 Linux 编译,推荐 ubuntu 22.04

4.1. Toolchain 下载

  1. 用于编译 RT-Thread 标准版的工具链是 riscv64-unknown-elf-gcc 下载地址 https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1705395512373/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1-20240115.tar.gz

  2. 用于编译 RT-Thread Smart 版的工具链是 riscv64-unknown-linux-musl-gcc 下载地址 https://github.com/RT-Thread/toolchains-ci/releases/download/v1.7/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2

正确解压后(假设解压到 /opt 下, 也可以自己设定解压后的目录),导出如下环境变量,建议将这些 export 命令写入 ~/.bashrc并注意在使用不同工具链时确保导出正确的一组环境变量

构建 RT-Thread 标准版时按照以下配置:

export RTT_CC="gcc"
export RTT_CC_PREFIX=riscv64-unknown-elf-
export RTT_EXEC_PATH=/opt/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.1/bin

构建 RT-Thread Smart 版时按照以下配置:

export RTT_CC="gcc"
export RTT_CC_PREFIX=riscv64-unknown-linux-musl-
export RTT_EXEC_PATH=/opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin

4.2. 依赖安装

$ sudo apt install -y scons libncurses5-dev device-tree-compiler

4.3. 构建

异构芯片需单独编译每个核的 OS在大/小核对应的目录下,依次执行:

4.3.1. 开发板选择

$ scons --menuconfig

选择当前需要编译的目标开发板类型,默认是 "milkv-duo256m"。

Board Type (milkv-duo)  --->
    ( ) milkv-duo
    (X) milkv-duo256m
    ( ) milkv-duos

4.3.2. 开启 RT-Smart

目前大核默认启用 RT-Smart小核不支持 RT-Smart。

如果要对大核启用 RT-Smart可以按如下方式设置。

RT-Thread Kernel  --->
    [*] Enable RT-Thread Smart (microkernel on kernel/userland)

注意检查内核虚拟起始地址的配置,确保为 0xFFFFFFC000200000

    RT-Thread Kernel  --->
(0xFFFFFFC000200000) The virtural address of kernel start
    RT-Thread Components  --->

4.3.3. 编译

$ scons

编译成功后,会在 bsp/cvitek/output 对应开发板型号目录下自动生成 fip.binboot.sd 文件。

  • fip.bin:这是一个打包后生成的 bin 文件,包含了 fsblopensbiuboot 以及小核的内核镜像文件 rtthread.bin
  • boot.sd:这也是一个打包后生成的 bin 文件,包含了大核的内核镜像文件 rtthread.bin

5. 运行

  1. 将 SD 卡分为 2 个分区,第 1 个分区的分区格式为 FAT32,用于存放 fip.binboot.sd 文件,第 2 个分区可选,如果有可用于作为数据存储分区或者存放文件系统。

  2. 将根目录下的 fip.binboot.sd 复制到 SD 卡第一个分区中。两个固件文件可以独立修改更新,譬如后续只需要更新大核,只需要重新编译 "cv18xx_risc-v" 并替换 SD 卡第一个分区中的 boot.sd 文件即可。

  3. 更新完固件文件后, 重新上电可以看到串口的输出信息。

6. 大核 RT-Smart 启动并自动挂载根文件系统

大核启用 RT-Smart 后可以在启动阶段挂载根文件系统。目前 Duo 支持 ext4, fat 文件格式,具体操作说明如下:

6.1. 内核构建配置

首先确保开启 RT-Smart参考 4.3.2. 可按照以下方式开启 RT-Smart

在开启 RT-Smart 基础上确保如下配置修改。

  • 使能 BSP_USING_SDH: Enable Secure Digital Host Controller, 因为使用 sd-card 存放文件系统。

  • 使能 BSP_USING_RTC: Enable RTC, 避免挂载文件系统后执行命令报错:[W/time] Cannot find a RTC device!

  • 使能 BSP_ROOTFS_TYPE_DISKFS: Disk FileSystems, e.g. ext4, fat ..., 该配置默认已打开。

  • 内核默认支持 fat, 如果要挂载 ext4 的文件系统,则还需要额外安装 lwext4 软件包,即使能 PKG_USING_LWEXT4(具体 menuconfig 路径是 (Top) -> RT-Thread online packages -> system packages -> lwext4: an excellent choice of ext2/3/4 filesystem for microcontrollers.)。如果在菜单中找不到该软件包,可以退出 menuconfig 并执行 pkgs --upgrade 更新软件包索引后再尝试使能软件包。

    勾选该选项后还需要执行如下操作更新软件并安装源码到 bsp 的 packages 目录下:

    source ~/.env/env.sh
    pkgs --update
    

保存后重新编译内核。

6.2. 构建文件系统

这里用 RT-Thread 官方的 userapps 工具制作文件系统。

userapps 仓库地址: https://github.com/RT-Thread/userapps。具体操作参考 《介绍与快速入门》

制作根文件系统步骤如下,供参考:

cd $WS
git clone https://github.com/RT-Thread/userapps.git
cd $WS/userapps
source ./env.sh
cd apps
xmake f -a riscv64gc
xmake -j$(nproc)
xmake smart-rootfs
xmake smart-image -f fat

$WS/userapps/apps/build 路径下生成根文件系统镜像文件 fat.img

如果是制作 ext4 格式的文件系统 image则最后一步换成

xmake smart-image -f ext4

生成根文件系统镜像文件 ext4.img

6.3. 将文件系统写入 sd-card

将 SD 卡分为 2 个分区,第 1 个分区的分区格式为 FAT32,用于存放 fip.binboot.sd 文件,第 2 个分区用于存放文件系统,分区格式需要和具体文件系统的格式一致。这里以 fat 为例介绍如何制作 sd-card 上的文件系统分区ext4 的操作类似。

将 SD 卡插入 PC 主机系统,假设为 Ubuntu识别为 /dev/sdb,则第二个分区为 /dev/sdb2。将第二个分区挂载,假设挂载到 ~/ws/u-disk

将上一步生成的 fat.img 文件也挂载到一个临时目录,假设是 /tmp

最后将 /tmp 下的文件全部拷贝到 ~/ws/u-disk 中,即完成对 SD 卡中文件系统分区的烧写。

最后不要忘记卸载 SD 卡的分区。

简单步骤示例如下,供参考:

sudo mount -o loop fat.img /tmp
sudo mount /dev/sdb2 ~/ws/u-disk
sudo cp -a /tmp/* ~/ws/u-disk
sudo umount ~/ws/u-disk
sudo umount /tmp

6.4. 上电启动

6.4.1. FAT 的例子

启动完成后, 会看到 [I/app.filesystem] device 'sd1' is mounted to '/' as FAT 的输出,说明文件系统挂载成功。此时 msh 被替换为 /bin/ash

 \ | /
- RT -     Thread Smart Operating System
 / | \     5.2.0 build Nov 26 2024 09:55:38
 2006 - 2024 Copyright by RT-Thread team
lwIP-2.1.2 initialized!
[I/sal.skt] Socket Abstraction Layer initialize success.
[I/drivers.serial] Using /dev/ttyS0 as default console
[I/SDIO] SD card capacity 30216192 KB.
[I/SDIO] sd: switch to High Speed / SDR25 mode 

found part[0], begin: 1048576, size: 128.0MB
found part[1], begin: 135266304, size: 28.707GB
[I/app.filesystem] device 'sd1' is mounted to '/' as FAT
Hello RT-Smart!
msh />[E/sal.skt] not find network interface device by protocol family(1).
[E/sal.skt] SAL socket protocol family input failed, return error -3.
/ # ls
bin       etc       mnt       root      sbin      tc        usr
dev       lib       proc      run       services  tmp       var

6.4.2. EXT4 的例子

启动完成后, 会看到 [I/app.filesystem] device 'sd1' is mounted to '/' as EXT 的输出,说明文件系统挂载成功。此时 msh 被替换为 /bin/ash。如果 ls /bin -l,会看到大部分命令程序都是指向 busybox 的符号链接,符号链接是 EXT4 区别于 FAT 的重要特征。

 \ | /
- RT -     Thread Smart Operating System
 / | \     5.2.0 build Dec 17 2024 14:04:27
 2006 - 2024 Copyright by RT-Thread team
lwIP-2.1.2 initialized!
[I/sal.skt] Socket Abstraction Layer initialize success.
[I/drivers.serial] Using /dev/ttyS0 as default console
[I/SDIO] SD card capacity 30216192 KB.
[I/SDIO] sd: switch to High Speed / SDR25 mode 

found part[0], begin: 1048576, size: 128.0MB
found part[1], begin: 135266304, size: 28.707GB
[I/app.filesystem] device 'sd1' is mounted to '/' as EXT
Hello RT-Smart!
msh />[E/sal.skt] not find network interface device by protocol family(1).
[E/sal.skt] SAL socket protocol family input failed, return error -3.
/ # ls 
bin         lib         proc        sbin        tmp
dev         lost+found  root        services    usr
etc         mnt         run         tc          var
/ # ls /bin -l
lrwxrwxrwx    0 0        0                7 Dec 17  2024 arch -> busybox
lrwxrwxrwx    0 0        0                7 Dec 17  2024 ash -> busybox
lrwxrwxrwx    0 0        0                7 Dec 17  2024 base32 -> busybox
lrwxrwxrwx    0 0        0                7 Dec 17  2024 base64 -> busybox
lrwxrwxrwx    0 0        0                7 Dec 17  2024 bash -> busybox
lrwxrwxrwx    0 0        0                7 Dec 17  2024 bbconfig -> busybox
-rwxr-xr-x    0 0        0          1003000 Dec 17  2024 busybox
lrwxrwxrwx    0 0        0                7 Dec 17  2024 cat -> busybox
lrwxrwxrwx    0 0        0                7 Dec 17  2024 chattr -> busybox
lrwxrwxrwx    0 0        0                7 Dec 17  2024 chgrp -> busybox
lrwxrwxrwx    0 0        0                7 Dec 17  2024 chmod -> busybox
lrwxrwxrwx    0 0        0                7 Dec 17  2024 chown -> busybox
......

7. FAQ

  1. 如遇到不能正常编译,请先使用 scons --menuconfig 重新生成配置。

  2. 错误:./mkimage: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

可在 http://security.ubuntu.com/ubuntu/pool/main/o/openssl 下载 libssl1.1_1.1.1f-1ubuntu2_amd64.deb 文件后安装即可解决。 或使用以下命令下载安装:

$ wget http://security.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
$ sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb
  1. 如发现切换开发板编译正常,但无法正常打包,请切换至自动下载的 cvi_bootloader 目录,并手工运行 git pull 更新,或删除该目录后重新自动下载。

8. 联系人信息

维护人:flyingcys

更多信息请参考 https://riscv-rtthread-programming-manual.readthedocs.io