跳到主要内容

RISC-V 子系统开发与使用

1. 准备工作

  1. 开发环境
    • Ubuntu22.04 虚拟机或者主机
    • Luckfox_Lume_SDK_260427.tar.gz
  2. 硬件准备:
    • Luckfox Lume 主板
    • USB 转 TTL 串口模块 ×2
    • USB Type-A to Type-C 数据线
    • 100M/1000M 以太网线缆
    • 路由器(用于开发板网络连接)

2. E907(RISC-V) Baremetal Demo 测试

本章节介绍如何编译并运行 E907(RISC-V) Baremetal Demo。编译完成后,可将生成的固件传输至开发板,并由 Linux 侧加载运行。

2.1 编译 E907(RISC-V)Baremetal Demo

  1. i.进入 {SDK}/rtos/lichee/baremetal 目录

  2. 执行 ./build.sh config 命令,选择对应方案,这里以 t153_e907 demo 为例:

    ~/{SDK}/rtos/lichee/baremetal$  ./build.sh config
    Welcome to mkscript setup progress
    All available bare_project:
    0. mr153_e907
    1. t153
    2. t153_e907
    3. t536
    4. t536_e907
    Choice [t153_e907]: 2
    All available bare_board:
    0. bga_demo
    1. demo
    2. sram_lp
    Choice [demo]: 1
    INFO: Prepare executive of tools ...
    INFO: ./tools/riscv64-elf-x86_64-20201104 ready ...
    #
    # No change to .config
    #
    INFO: use ./projects/t153_e907/demo/sun8iw22p1_mr153_e907_demo_defconfig ...
  3. 执行 ./build.sh 编译,得到 t153_e907_demo.elf 固件。

    文件说明
    t153_e907_demo.bin二进制镜像
    t153_e907_demo.elf带符号表、段信息、调试信息的可执行文件,用来给 Linux 端加载
    t153_e907_demo.map内存布局映射表

2.2 运行 E907(RISC-V)Baremetal Demo

  1. 将 t153_demo.elf 上传到开发板,文件传输可选择 adb 或 scp 任意一种方式即可,无需同时执行两种方式。

    • 使用 adb 上传:
      adb  push t153_e907_demo.elf  /lib/firmware/
    • 使用 scp 上传:
      scp t153_e907_demo.elf  root@<ip>:/lib/firmware/
      # eg: scp t153_demo.elf root@192.168.xxx.xxx:/lib/firmware/
  2. 将 ELF 镜像重命名为 amp_arm_bare.bin:

    mv /lib/firmware/t153_e907_demo.elf /lib/firmware/amp_rv0.bin
  3. 连接子系统 UART(RX:PD14 TX:PD15,串口波特率设置为 115200。) 串口,子系统 UART 引脚如下:

  4. 执行以下命令启动 E907(RISC-V)从核系统:

    echo  start > /sys/class/remoteproc/remoteproc0/state
  5. 如果通过调试串口登录系统,可看到如下启动日志输出:

    root@luckfox:~# echo  start > /sys/class/remoteproc/remoteproc0/state
    [ 9390.584130] remoteproc remoteproc0: powering up e907_rproc
    [ 9390.584638] remoteproc remoteproc0: using private firmware, skip checking here
    [ 9390.584651] remoteproc remoteproc0: Booting fw image amp_rv0.bin, size 207428
    [ 9390.584675] remoteproc remoteproc0: load fw from filesystem, filename: amp_rv0.bin
    [ 9390.584885] remoteproc remoteproc0: sunxi_rproc_elf_load_segments,989 find segments err
    [ 9390.585137] sunxi-rproc 1a00000.e907_rproc: boot address: 0x421c5000
    [ 9390.585295] remoteproc0#vdev0buffer: assigned reserved memory node vdev0buffer@42100000
    [ 9390.585744] virtio_rpmsg_bus virtio0: rpmsg host is online
    [ 9390.585820] remoteproc0#vdev0buffer: registered virtio0 (type 7)
    [ 9390.585829] remoteproc remoteproc0: remote processor e907_rproc is now up

  6. 子系统 UART 会输出 Letter Shell 终端信息:

2.3 Rpmsg 通信测试

  1. 在 Baremetal 端串口输入以下命令,启动 RPMsg 测试程序:
    hal_rpmsg_test
  2. 在 Linux 端执行以下命令,通过 RPMsg 设备节点向 Baremetal 端发送测试数据:
    echo hello >  /dev/rpmsg_test
  3. 送成功后,Baremetal 端串口将显示如下接收到的数据内容:

3. E907(RISC-V) FreeRTOS 测试

本章节介绍如何编译并运行 E907(RISC-V) FreeRTOS Demo。编译完成后,可将生成的固件传输至开发板,并由 Linux 侧加载运行。

3.1 编译 E907(RISC-V)FreeRTOS Demo

  1. 进入 {SDK}/rtos/ 目录,设置环境变量。

    source envsetup.sh
  2. 执行 ./build.sh config 命令,选择对应方案,这里以 t153 demo 为例:

    ~/{SDK}/rtos$ lunch_rtos
    last=t153_e907_demo

    You're building on Linux

    Lunch menu... pick a combo:
    1. ai985_e906_scanp_fastboot
    2. mr153_e907_evb1
    3. mr527_e906_evb
    4. mr536_e907_evb1
    5. t153_bga_demo
    6. t153_demo
    7. t153_demo_smp
    8. t153_e907_bga_demo
    9. t153_e907_demo
    10. t536_demo
    11. t536_demo_smp
    12. t536_e907_demo
    Which would you like? [Default t153_e907_demo]: 9
    select=9...
    t153_e907/demo
    '/home/luckfox_lume/rtos/lichee/rtos/projects/t153_e907/demo/defconfig' -> '/home/luckfox_lume/rtos/lichee/rtos/.config'
    ============================================
    RTOS_BUILD_TOP=/home/luckfox_lume/rtos
    RTOS_TARGET_ARCH=riscv
    RTOS_TARGET_CHIP=sun8iw22p1
    RTOS_TARGET_DEVICE=t153_e907
    RTOS_PROJECT_NAME=t153_e907_demo
    ============================================
    Run mrtos_menuconfig to config rtos
    Run m or mrtos to build rtos
  3. 执行 mrtos 编译,得到 {SDK}/rtos/lichee/rtos/build/t153_e907_demo/img/rt_system.elf 固件

    文件说明
    rt_system.bin二进制镜像
    rt_system.elf带符号表、段信息、调试信息的可执行文件,用来给 Linux 端加载
    rt_system.map内存布局映射表
    rt_system.syms符号导出表
    sys_config.fexRTOS 配置文件,文本格式
    sys_config.binRTOS 可加载配置文件

3.2 运行 E907(RISC-V)FreeRTOS Demo

  1. 将 rt_system.elf 上传到开发板,文件传输可选择 adb 或 scp 任意一种方式即可,无需同时执行两种方式。

    • 使用 adb 上传:
      adb  push rt_system.elf  /lib/firmware/
    • 使用 scp 上传:
      scp rt_system.elf  root@<ip>:/lib/firmware/
      # eg: scp rt_system.elf root@192.168.xxx.xxx:/lib/firmware/
  2. 将 ELF 镜像重命名为 amp_rv0.bin:

    mv /lib/firmware/rt_system.elf /lib/firmware/amp_rv0.bin
  3. 连接子系统 UART(RX:PD14 TX:PD15,串口波特率设置为 115200。) 串口,子系统 UART 引脚如下:

  4. 执行以下命令启动 E907(RISC-V)从核系统:

    echo  start > /sys/class/remoteproc/remoteproc0/state
  5. 如果通过调试串口登录系统,可看到如下启动日志输出:

    root@luckfox:~# echo  start > /sys/class/remoteproc/remoteproc0/state
    [ 9390.584130] remoteproc remoteproc0: powering up e907_rproc
    [ 9390.584638] remoteproc remoteproc0: using private firmware, skip checking here
    [ 9390.584651] remoteproc remoteproc0: Booting fw image amp_rv0.bin, size 207428
    [ 9390.584675] remoteproc remoteproc0: load fw from filesystem, filename: amp_rv0.bin
    [ 9390.584885] remoteproc remoteproc0: sunxi_rproc_elf_load_segments,989 find segments err
    [ 9390.585137] sunxi-rproc 1a00000.e907_rproc: boot address: 0x421c5000
    [ 9390.585295] remoteproc0#vdev0buffer: assigned reserved memory node vdev0buffer@42100000
    [ 9390.585744] virtio_rpmsg_bus virtio0: rpmsg host is online
    [ 9390.585820] remoteproc0#vdev0buffer: registered virtio0 (type 7)
    [ 9390.585829] remoteproc remoteproc0: remote processor e907_rproc is now up

  6. 子系统 UART 会输出 Shell 终端信息:

3.3 Rpmsg 通信测试

  1. 在 FreeRTOS 端串口输入以下命令,启动 RPMsg 测试程序:
    rpmsg_test -N test -L 496 -c -v
  2. 在 Linux 端执行以下命令,通过 RPMsg 设备节点向 FreeRTOS 端发送测试数据:
    rpmsg_test -r e907_rproc@1a00000 -c test -L 496 -v
  3. 送成功后,FreeRTOS 端串口将显示如下接收到的数据内容: