丨budboool · 11月20日 · 广东

全志T113双核异构处理器的使用基于Tina Linux5.0——异构双核通信的具体实现

5、TinaLinux异构双核通信的具体实现:

本章节以SBC-T113S4主板的TinaLinux为例,介绍异构双核通信的实现。该方法也同样适用于T113i平台。

本章节主要涉及到Tina Linux内核的配置、Tina Linux文件系统(openwrt)的配置、Freertos的配置。其中Tina Linux内核的配置包括设备树的配置及相关内核驱动及协议的配置;Tina Linux文件系统(openwrt)的配置包括异构双核通信测试程序和小核C906终端的配置;Freertos的配置包括通信协议的配置。

5.1、TinaLinux的配置
5.1.1、Tina内核设备树配置

在Tina根目录下,进入设备树目录(根据不同的处理器,进入不同的处理器目录),如下演示的是以SBC-T113S主板为例,该主板的主处理器是T113-S4,其配置文件都放在device/config/chips/t113_s4/configs/sbc_t113s4_nand/的目录下,内核的设备树则放在device/config/chips/t113_s4/configs/sbc_t113s4_nand/linux-5.4目录:

xxx@xxx:~/workspaces/t113_tina5.0$ cd device/config/chips/t113_s4/configs/sbc_t113s4_nand/

编辑设备树

xxx@xxx:~/workspaces/t113_tina5.0/device/config/chips t113_s4/configs/sbc_t113s4_nand/linux-5.4 $ vi board.dts

在设备树文件中找到C906相关的设备树节点,设备树默认设置为:


    reserved-memory {
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;

        /* c906 */
        c906_ddr: c906_ddr@42300000 {
            reg = <0x0 0x42300000 0x0 0x00600000>;
            no-map;
        };
        /*
         * The name should be "vdev%dbuffer".
         * Its size should be not less than
         *     RPMSG_BUF_SIZE * (num of buffers in a vring) * 2
         *   = 512 * (num of buffers in a vring) * 2
         */
        rv_vdev0buffer: vdev0buffer@42900000 {
            compatible = "shared-dma-pool";
            reg = <0x0 0x42900000 0x0 0x40000>;
            no-map;
        };

        /*
         * The name should be "vdev%dvring%d".
         * The size of each should be not less than
         *     PAGE_ALIGN(vring_size(num, align))
         *   = PAGE_ALIGN(16 * num + 6 + 2 * num + (pads for align) + 6 + 8 * num)
         *
         * (Please refer to the vring layout in include/uapi/linux/virtio_ring.h)
         */
        rv_vdev0vring0: vdev0vring0@42940000 {
            reg = <0x0 0x42940000 0x0 0x2000>;
            no-map;
        };
        rv_vdev0vring1: vdev0vring1@42942000 {
            reg = <0x0 0x42942000 0x0 0x2000>;
            no-map;
        };

        /* dsp0 */
        dsp0ddr: dsp0ddr@42000000 {
            reg = <0x0 0x42000000 0x0 0x00100000>;
            no-map;
        };

        dsp0_rpbuf_reserved: dsp0_rpbuf@42244000 {
            compatible = "shared-dma-pool";
            no-map;
            reg = <0x0 0x42244000 0x0 0x8000>;
        };

        /*
         * The name should be "vdev%dbuffer".
         * Its size should be not less than
         *     RPMSG_BUF_SIZE * (num of buffers in a vring) * 2
         *   = 512 * (num of buffers in a vring) * 2
         */
        vdev0buffer: vdev0buffer@42200000 {
            compatible = "shared-dma-pool";
            reg = <0x0 0x42200000 0x0 0x40000>;
            no-map;
        };

        /*
         * The name should be "vdev%dvring%d".
         * The size of each should be not less than
         *     PAGE_ALIGN(vring_size(num, align))
         *   = PAGE_ALIGN(16 * num + 6 + 2 * num + (pads for align) + 6 + 8 * num)
         *
         * (Please refer to the vring layout in include/uapi/linux/virtio_ring.h)
         */
        vdev0vring0: vdev0vring0@42240000 {
            reg = <0x0 0x42240000 0x0 0x2000>;
            no-map;
        };
        vdev0vring1: vdev0vring1@42242000 {
            reg = <0x0 0x42242000 0x0 0x2000>;
            no-map;
        };

        /*
        * dsp ram addr
        */
        dsp0dram: dsp0dram@400000 {
            reg = <0x0 0x400000 0x0 0x10000>;
            no-map;
        };
        dsp0iram0: dsp0iram0@420000 {
            reg = <0x0 0x420000 0x0 0x8000>;
            no-map;
        };
        dsp0iram1: dsp0iram1@440000 {
            reg = <0x0 0x440000 0x0 0x8000>;
            no-map;
        };
    };

    mailbox_heartbeat: mailbox_heartbeat@0 {
        compatible = "mailbox-heartbeat";
        rproc-np = <&c906_rproc>;
        mboxes = <&msgbox 6>, <&msgbox 7>;
        mbox-names = "tx", "rx";
        status = "okay";
    };

    dsp0_rproc: dsp_rproc@0 {
        compatible = "allwinner,hifi4-rproc", "simple-bus";
        clock-frequency = <600000000>;
        clocks = <&ccu CLK_PLL_PERIPH0_2X>, <&ccu CLK_DSP>, <&ccu CLK_BUS_DSP_CFG>, <&r_ccu CLK_R_AHB>;
        clock-names = "pll", "mod", "cfg", "ahbs";
        resets = <&ccu RST_BUS_DSP>, <&ccu RST_BUS_DSP_CFG>, <&ccu RST_BUS_DSP_DBG>, <&ccu RST_BUS_MSGBOX1>;
        reset-names = "mod-rst", "cfg-rst", "dbg-rst", "msg-rst";
        reg = <0x0 0x03000008 0x0 0x04>,
              <0x0 0x01700000 0x0 0x40>;
        reg-names = "sram-for-cpux", "hifi4-cfg";
        mboxes = <&msgbox 0>;
        mbox-names = "arm-kick";
        memory-region = <&dsp0ddr>, <&vdev0buffer>, <&vdev0vring0>, <&vdev0vring1>,
                <&dsp0dram>, <&dsp0iram0>, <&dsp0iram1>;
        memory-mappings =
            /* < DA        len        PA >    */
            /* local SRAM via external bus */
            < 0x28000    0x20000        0x28000 >,
            /* local SRAM via internal bus */
            < 0x400000    0x10000        0x400000 >,
            < 0x420000    0x8000        0x420000 >,
            < 0x440000    0x8000        0x440000 >,
            /* DDR front 256MB */
            < 0x10000000    0x10000000    0x40000000 >,
            /* local SRAM via internal bus */
            < 0x20028000    0x10000        0x400000 >,
            < 0x20038000    0x8000        0x420000 >,
            < 0x20040000    0x8000        0x440000 >,
            /* DDR front 256MB */
            < 0x30000000    0x10000000    0x40000000 >,
            /* DDR front 1GB */
            < 0x40000000    0x40000000    0x40000000 >,
            /* DDR front 1GB */
            < 0x80000000    0x40000000    0x40000000 >,
            /* DDR front 1GB */
            < 0xC0000000    0x40000000    0x40000000 >;

        id = <0>;
        status = "okay";
    };

    rpbuf_controller0: rpbuf_controller@0 {
        compatible = "allwinner,rpbuf-controller";
        remoteproc = <&dsp0_rproc>;
        ctrl_id = <0>;    /* index of /dev/rpbuf_ctrl */
        //iommus = <&mmu_aw 5 1>;
        memory-region = <&dsp0_rpbuf_reserved>;
        status = "okay";
    };

    rpbuf_sample: rpbuf_sample@0 {
        compatible = "allwinner,rpbuf-sample";
        rpbuf = <&rpbuf_controller0>;
        status = "okay";
    };

    c906_rproc: c906_rproc@0 {
        compatible = "allwinner,c906-rproc";
        clock-frequency = <800000000>;
        clocks = <&ccu CLK_PLL_PERIPH0_800M>, <&ccu CLK_RISCV>, <&ccu CLK_BUS_RISCV_CFG>, <&ccu CLK_RISCV_RST>, <&ccu CLK_BUS_RISCV>;
        clock-names = "pll", "mod", "cfg", "riscv-rst", "riscv-gate";
        resets = <&ccu RST_BUS_RISCV_CFG>, <&ccu RST_BUS_MSGBOX2>;
        reset-names = "cfg-rst", "msg-rst";
        memory-region = <&c906_ddr>, <&rv_vdev0buffer>, <&rv_vdev0vring0>, <&rv_vdev0vring1>;
        reg = <0x0 0x06010000 0x0 0x1000>;
        reg-names = "c906-cfg";
        mboxes = <&msgbox 4>;
        mbox-names = "arm-kick";
        memory-mappings =
            /* DA              len         PA */
            /* DDR for c906  */
            < 0x40000000 0x10000000 0x40000000 >;
        firmware-name = "amp_rv0.bin";
        status = "okay";
    };

SBC-T113S主板暂时使用uart3打印C906小核的打印信息(可以分配其他串口作为C906的终端,只要大核和小核的分配不冲突即可),为防止Tina内核抢占uart3,所以务必禁用uart3节点。

&uart3 {
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&uart3_pins_a>;
    pinctrl-1 = <&uart3_pins_b>;
    status = "disabled";
};

5.1.2、Tina内核配置

在Tina根目录下,执行make kernel_menuconfig,例如:

xxx@xxx:~/workspaces/t113_tina5.0$ make kernel_menuconfig
  • 使能硬件支持

进入内核配置界面后,进入Device Drivers 目录,选中Mailbox Hardware Support:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选中后进入Mailbox Hardware Support选项中,选中Allwinner Mailbox support:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 使能RPMsg驱动
    进入如下目录中
    → Device Drivers
    → Rpmsg drivers
    选中如下配置
    <*> allwinnertech rpmsg hearbeat driver
    <*> allwinner rpmsg tty driver
    <*> sunxi rpmsg ctrl driver
    <*> Virtio RPMSG bus driver
    选中完成后如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 使能RPBuf驱动
    进入如下目录中
    → Device Drivers
    → Rpbuf drivers
    -*- Rpbuf device interface
    <*> Rpmsg-based Rpbuf service driver
    <*> Allwinner Rpbuf controller driver
    <*> Allwinner Rpbuf sample driver
    注:
    1)Allwinner Rpbuf sample driver只是内核层的一个demo程序,可以不选。
    2)如果异构双核不进行大数据传输,RPBuf驱动可以不选。
    选中完成后如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 使能共享内存驱动

进入如下目录中
→ Device Drivers
→ Remoteproc drivers
选中如下配置
<*> SUNXI remote processor support --->
<*>Allwinner remoteproc support
<*>Allwinner remoteproc hifi4 boot //控制hifi4 dsp小核
<*>Allwinner remoteproc c906 boot ////控制c906小核
如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改完成后,保存内核配置并退出。

5.1.3、Tina文件系统配置(Openwrt)

配置中增加了amp_shell,这个是C906的控制台。另外也增加了rpbuf和rpmsg的演示程序,便于后续测试验证。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.1.4、编译Tina新固件

在Tina根目录下,输入mkernel指令编译刚刚选中的内核驱动,编译完成后,输入pack,打包生成新镜像(此时RTOS的固件并没有进行更新),例如:

xxx@xxx:~/workspaces/t113_tina5.0$ mkernel
...
xxx@xxx:~/workspaces/t113_tina5.0$ pack
...

如果需要将RTOS更新一并打包到固件,只要执行make –j32(32表示计算机处理器的线程数,根据具体计算机而定),编译结束后执行pack指令将生成的t113_s4_linux_sbc_t113s4_xxx.img(以SBC-T113S4主板为例)文件拷贝到Windows主机端,此时Tina的固件里面已经包含了新配置的RTOS。

5.2、C906 FreeRTOS内核配置及应用

麻雀虽小,一应俱全!FreeRTOS是一个实时的微型操作系统,它和大多数操作系统都一样,都具备内核和文件系统两个部分,内核重点是任务调度和文件系统管理等,文件系统则集成部分现成的指令和相关应用库并方便启动应用(APP)。另外,FreeRTOS还可以配置终端,刚刚说的指令,就是在终端里面执行的。有了调试终端给FreeRTOS应用调试带来了很大的方便。以下将如何配置FreeRTOS终端、如何配置FreeRTOS驱动组件、如何配置FreeRTOS异构通信演示程序等进行说明。

5.2.1、修改C906链接脚本

C906的FreeRTOS是有运行地址的,该运行地址在Tina内核的DTS中有明确,在RTOS对应的项目中也必须一致。以t113_s4_c906_evb1_auto项目为例,这里说的项目该项目涉及的相关代码核配置信息在SDK所在目录/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto中,该目录中有如下文件:

xxx@xxx:~/workspace/t113_tina5.0/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto$ tree -l
.
├── defconfig
├── defconfig_org
├── freertos.lds.S
├── Kconfig
├── Makefile
└── src
    ├── alsa_config.c
    ├── assert.c
    ├── card_default.c
    ├── FreeRTOSConfig.h
    ├── hooks.c
    └── main.c

找到freertos.lds.S文件,该文件保存有C906小核的链接信息。
修改freertos.lds.S,找到MEMORY节点,确认起始地址为0x42300000,长度为0x00600000。此参数需要和Tina设备树中的C906内存参数一致,查看kernel.lds 中MEMORY节点参数为:

/* Linker script to configure memory regions. */
MEMORY
{
    RAM (rwx)   : ORIGIN = CONFIG_ARCH_START_ADDRESS, LENGTH = CONFIG_ARCH_MEM_LENGTH
}

CONFIG_ARCH_START_ADDRESS和CONFIG_ARCH_MEM_LENGTH这两个参数在defconfig(和freertos.lds.S同一目录)中,查看defconfig内容如下:

#
# Architecture Options
#
# CONFIG_ARCH_ARM is not set
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_START_ADDRESS=0x42300000
CONFIG_ARCH_MEM_LENGTH=0x600000
CONFIG_LITTLE_ENDIAN=y
CONFIG_BITS_PER_LONG=64
# CONFIG_CACHE_ALIGN_CHECK is not set
CONFIG_TOOLCHAIN_FLOAT_HARD=y
CONFIG_PANIC_CLI=y
CONFIG_PANIC_CLI_PWD=y
CONFIG_IMG_VERSION_MESSAGE=y

确认和Tina Linux内核的dts配置一致。
Tina Linux内核的dts的配置如下:

/* c906 */
        c906_ddr: c906_ddr@42300000 {
            reg = <0x0 0x42300000 0x0 0x00600000>;
            no-map;
        };

5.2.2、RTOS终端使用uart3

在RTOS定制中,修改引脚分配也是通过修改sys_config.fex来完成的,以t113_s4_c906_evb1_auto项目为例,该文件在在SDK所在目录/rtos/board/t113_s4_c906/evb1_auto/configs目录下。
通过查询数据手册,查看引脚复用功能,假如我们使用PE8和PE9作为uart3作为终端串口:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改uart3节点作为终端串口:

[uart_para]
uart_debug_port = 3
uart_debug_tx   = port:PE08<5><1><default><default>
uart_debug_rx   = port:PE09<5><1><default><default>

5.3、修改RTOS相关组件的配置并编译

进入SDK所在目录/rtos/,执行source envsetup.sh,单独开起RTOS的编译环境。
然后按照3.2.2章节进入RTOS方案的选择和配置,执行配置指令mrtos_menuconfig,
进入后选中如下配置:

→ Drivers Options
→ soc related device drviers
→ UART Decives
[*] support uart3 device
[3] cli uart port number

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入如下目录,选中[*] enable sysconfig,启用读取解析 sys_config.fex 功能

→ Drivers Options
    → soc related device drivers
        → Common Option
        [*] enable sysconfig

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分别进入如下界面,选择对应的rpmsg/rpbuf/messagebox驱动,这些驱动与Tina Linux中的驱动对应。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进入如下界面,选中Freertos终端相关配置
[*] Multi Console Support
[*] Uart Multi Console Support
[ ] Uart Multi Console As Main Console
[*] Rpmsg Multi Console Support
[*] Rpmsg Multi Console Enable Cache Cmd

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注:Rpmsg Multi Console Support这个配置是和Tina Linux中的amp_shell控制台对应。

本次演示主要为了演示异构双核通信,配置基本完成。如果用户有其他应用需求,用户可以根据自己的需求进行配置。保存配置退出后,接下来进行编译。

ping@embedall:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos$ m
build rtos ...
===There isn't tina environment.===
 Note: will use shell command origin rather than the functon.
 Dark Builder
 Version (1.6.0 - BiCEP2 (Gravitational Waves))
 *[CC]     [SCRIPT]          build/t113_s4_c906_evb1_auto/img/sys_config.fex
  [LDS]    [Linker]          projects/t113_s4_c906/evb1_auto/freertos.lds
  CC       build/t113_s4_c906_evb1_auto/arch/common/common.o
  CC       build/t113_s4_c906_evb1_auto/arch/risc-v/common/exception.o
  CC       build/t113_s4_c906_evb1_auto/arch/risc-v/common/clocksource.o
  AS       build/t113_s4_c906_evb1_auto/arch/common/sys_config.o
  CC       build/t113_s4_c906_evb1_auto/arch/common/version.o
  CC       build/t113_s4_c906_evb1_auto/arch/risc-v/sun8iw20p1/sun8i.o
  AS       build/t113_s4_c906_evb1_auto/arch/risc-v/c906/head_s.o
  CC       build/t113_s4_c906_evb1_auto/arch/risc-v/c906/plic.o
  CC       build/t113_s4_c906_evb1_auto/arch/risc-v/c906/cache.o
  CC       build/t113_s4_c906_evb1_auto/arch/risc-v/c906/spinlock.o
  CC       build/t113_s4_c906_evb1_auto/arch/risc-v/c906/clic.o
  CC       build/t113_s4_c906_evb1_auto/arch/risc-v/c906/platform/platform_sun8iw20.o
  CC       build/t113_s4_c906_evb1_auto/arch/risc-v/c906/interrupt.o
  CC       build/t113_s4_c906_evb1_auto/components/thirdparty/console/FreeRTOS_CLI.o
  CC       build/t113_s4_c906_evb1_auto/components/common/thirdparty/md5/md5.o

……

  LD       build/t113_s4_c906_evb1_auto/components/common/thirdparty/openamp/open-amp/obj-in.o
  LD       build/t113_s4_c906_evb1_auto/components/common/thirdparty/openamp/obj-in.o
  LD       build/t113_s4_c906_evb1_auto/components/common/thirdparty/obj-in.o
  LD       build/t113_s4_c906_evb1_auto/components/obj-in.o
  LD       build/t113_s4_c906_evb1_auto/drivers/rtos-hal/hal/source/ccmu/sunxi-ng/obj-in.o
  LD       build/t113_s4_c906_evb1_auto/drivers/rtos-hal/hal/source/ccmu/obj-in.o
  LD       build/t113_s4_c906_evb1_auto/drivers/rtos-hal/hal/source/twi/obj-in.o
  LD       build/t113_s4_c906_evb1_auto/drivers/rtos-hal/hal/source/obj-in.o
  LD       build/t113_s4_c906_evb1_auto/drivers/rtos-hal/hal/obj-in.o
  LD       build/t113_s4_c906_evb1_auto/drivers/obj-in.o
  LD       build/t113_s4_c906_evb1_auto/kernel/FreeRTOS-orig/obj-in.o
  LD       build/t113_s4_c906_evb1_auto/kernel/obj-in.o
  [LD]     [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.elf
if [ -n /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img/  ]; then mkdir -p /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img; fi
Memory region         Used Size  Region Size  %age Used
             RAM:      214096 B         6 MB      3.40%
 *[IMAGE]  [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.bin
 *[SYMS]   [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.syms
   text    data     bss     dec     hex filename
 134576   69048   10472  214096   34450 build/t113_s4_c906_evb1_auto/img/rt_system.elf
copying /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img/rt_system.bin to /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/board/t113_s4_c906/evb1_auto/bin/freertos.fex
#### make completed successfully
'/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img/rt_system.bin' -> '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/board/t113_s4_c906/evb1_auto/bin/rtos_riscv_sun8iw20p1.f

编译完成后会在SDK目录下的/rtos/board/t113_s4_c906/evb1_auto/bin目录生成rtos_riscv_sun8iw20p1.fex和freertos.fex,这两个文件是一样的。

5.4、核对所选FreeRTOS组件

配置FreeRTOS组件是为了完成FreeRTOS APP的开发。本次的APP要完成的是异构通信,我们查看t113_s4_c906_evb1_auto项目代码了解其运行过程。
t113_s4_c906_evb1_auto项目的相关代码核配置信息在SDK所在目录/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto中,该目录中有如下文件:

xxx@xxx:~/workspace/t113_tina5.0/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto$ tree -l
.
├── defconfig
├── defconfig_org
├── freertos.lds.S
├── Kconfig
├── Makefile
└── src
    ├── alsa_config.c
    ├── assert.c
    ├── card_default.c
    ├── FreeRTOSConfig.h
    ├── hooks.c
    └── main.c

重点查看main.c文件,该文件内容如下:

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include "interrupt.h"
#include <portmacro.h>
#include "FreeRTOS.h"
#include "task.h"

#include <openamp/sunxi_helper/openamp.h>
#include <console.h>

#ifdef CONFIG_DRIVERS_MSGBOX
#include <hal_msgbox.h>
#endif

#ifdef CONFIG_COMPONENTS_AW_DEVFS
#include <devfs.h>
#endif

#ifdef CONFIG_COMPONENTS_OPENAMP
#include <openamp/sunxi_helper/rpmsg_master.h>

extern int openamp_init(void);
extern int rpbuf_init(void);

void openamp_init_thread(void *param)
{
        (void)param;

        openamp_init();

#ifdef CONFIG_RPMSG_CLIENT
        rpmsg_ctrldev_create();
#endif

#ifdef CONFIG_RPMSG_HEARBEAT
        extern int rpmsg_heart_init(void);
        rpmsg_heart_init();
#endif

#ifdef CONFIG_MULTI_CONSOLE
        extern int multiple_console_init(void);
        multiple_console_init();
#endif

#ifdef CONFIG_COMPONENTS_RPBUF
extern int rpbuf_init(void);
    rpbuf_init();
#endif
        hal_thread_stop(NULL);
}
#endif

void cpu0_app_entry(void *param)
{
        (void)param;

#ifdef CONFIG_COMPONENTS_AW_DEVFS
    devfs_mount("/dev");
#endif

#if defined CONFIG_COMPONENTS_OPENAMP
        void *thread;
        thread = hal_thread_create(openamp_init_thread, NULL,
                "amp_init", 8 * 1024, HAL_THREAD_PRIORITY_SYS);
        if (thread != NULL)
            hal_thread_start(thread);
#endif

#ifdef CONFIG_COMPONENT_CLI
    vCommandConsoleStart(0x1000, HAL_THREAD_PRIORITY_CLI, NULL);
#endif

        vTaskDelete(NULL);
}

该程序的入口函数是cpu0_app_entry,该程序通过函数hal_thread_create建立了openamp_init_thread线程。该线程通过openamp_init函数进行了openamp框架的初始化,同时如果选择了rpmsg通信,也进行了rpmsg通信的初始化等。可判定所选的FreeRTOS相关组件可以满足要求。

5.5、主板内使能C906
启动主板,打开串口终端进入主板控制台,将freertos.fex拷贝到/lib/firmware目录下。假设使用ADB功能将文件拷贝到主板的root/目录下

root@TinaLinux:~# cd /root/
root@TinaLinux:~# ls
freertos.fex

将root目录下的freertos.fex拷贝到/lib/firmware目录下

root@TinaLinux:~# cp freertos.fex /lib/firmware/
root@TinaLinux:~# ls /lib/firmware/
boot_xr829.bin fw_xr829.bin freertos.fex sdd_xr829.bin
etf_xr829.bin fw_xr829_bt.bin regulatory.db

拷贝完成后,可以在/lib/firmware目录下看到小核固件。接下来把主板的UART3(在RTOS配置中已经把UART3配置成终端串口)与计算机的串口连接起来,并配置计算机串口波特率为115200,通过计算机串口可以查看小核的相关信息。在Tina Linux主板串口终端输入指令:

root@TinaLinux:~# echo freertos.fex > /sys/class/remoteproc/remoteproc1/firmware

这一步是将freertos.fex固件放在硬件节点firmware 。接下来启动C906固件,指令如下:

root@TinaLinux:~#echo start > /sys/class/remoteproc/remoteproc1/state

remoteproc remoteproc1: powering up c906_rproc

[ 1489.549950] remoteproc remoteproc1: Booting fw image amp_rv0.bin, size 224392
[ 1489.558282] remoteproc remoteproc1: the version: UTS - Thu, 24 Oct 2024 14:39:36 +0800
[ 1489.558282] Compile Time - 14:39:36
[ 1489.571527]  remoteproc1#vdev0buffer: assigned reserved memory node vdev0buffer@42900000
[ 1489.581143] virtio_rpmsg_bus virtio0: rpmsg host is online
[ 1489.587680]  remoteproc1#vdev0buffer: registered virtio0 (type 7)
[ 1489.594617] remoteproc remoteproc1: remote processor c906_rproc is now up
root@TinaLinux:/# [ 1489.695824] virtio_rpmsg_bus virtio0: creating channel sunxi,rpmsg_ctrl addr 0x400
[ 1489.715788] virtio_rpmsg_bus virtio0: creating channel rpbuf-service addr 0x401
[ 1489.724381] rpbuf_service_rpmsg virtio0.rpbuf-service.-1.1025: rpmsg device parent 0: virtio0
[ 1489.734036] rpbuf_service_rpmsg virtio0.rpbuf-service.-1.1025: rpmsg device parent 1: remoteproc1#vdev0buffer
[ 1489.745237] rpbuf_service_rpmsg virtio0.rpbuf-service.-1.1025: rpmsg device parent 2: remoteproc1
[ 1489.755242] rpbuf_service_rpmsg virtio0.rpbuf-service.-1.1025: rpmsg device parent 3: 6010000.c906_rproc
[ 1489.766110] virtio_rpmsg_bus virtio0: creating channel sunxi,rpmsg_heartbeat addr 0x402
使能后可以在UART3上查看RV核的信息:
cpu0>help
Lists all the registered commands
[       help-built-in]--------------Lists all the built-in registered commands
[                  ts]--------------Displays a table showing the state of each FreeRTOS task
[      run-time-stats]--------------Displays a table showing how much processing time each FreeRTOS task has used
[   echo-3-parameters]--------------echo-3-parameters <param1> <param2> <param3>: Expects three parameters, echos each in turn
[     echo-parameters]--------------echo-parameters <...>: Take variable number of parameters, echos each in turn
[          rpbuf_demo]--------------rpbuf demo
[          rpbuf_test]--------------rpbuf test demo
[        console_dump]--------------dum all cli console info

[                exit]--------------Console Exit Command
[         msgbox_demo]--------------msgbox demo
[                help]--------------List all registered commands
[           backtrace]--------------Backtrace Command
[              md5sum]--------------Calculate md5sum
[  rproc_dump_mapping]--------------rproc dump mapping
[         eptdev_send]--------------send data used by rpmsg ept test
[        eptdev_close]--------------close rpmsg ept client
[     rpmsg_list_epts]--------------list endpoints
[   rpmsg_list_listen]--------------list listen
[                jtag]--------------init jtag gpio
[rpmsg_ctrlde_release]--------------release rpmsg ctrldev
[  rpmsg_ctrldev_init]--------------init rpmsg ctrldev
[        eptdev_reset]--------------reset rpmsg ctrl
[        eptdev_clear]--------------clear rpmsg name group
[       eptdev_unbind]--------------unbind rpmsg ept listen
[         eptdev_bind]--------------bind rpmsg ept name
[          rpmsg_test]--------------rpmsg test
[     rpmsg_test_send]--------------rpmsg test send
[     rpmsg_test_init]--------------init rpmsg test
[   rpmsg_test_extend]--------------rpmsg test with another rproc
[          hal_msgbox]--------------hal msgbox

cpu0>
查看RV核目前的任务:
cpu0>ts
Task          State  Priority  Stack    #
************************************************
Name            State   Pri     HWM     Idx     StkCur          StkBot
CLI                             X       18      3742    5       0x42363e30     0                                                                                                                                                             x4235c510
IDLE                            R       0       980     2       0x42348250     0                                                                                                                                                             x423463b0
Tmr Svc                         B       31      1978    3       0x4234c220     0                                                                                                                                                             x423483c0
ctrldev                         B       6       4026    8       0x4237d460     0                                                                                                                                                             x42375690
cpu-vring-ipi                   B       31      8128    7       0x42374780     0                                                                                                                                                             x42364950
推荐阅读
关注数
19
文章数
104
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息