导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页
    1. 主页
    2. hahage168
    H
    • 资料
    • 关注 0
    • 粉丝 1
    • 我的积分 494
    • 主题 2
    • 帖子 13
    • 最佳 5
    • 群组 0

    hahage168LV 3

    @hahage168

    494
    积分
    5
    声望
    8
    资料浏览
    13
    帖子
    1
    粉丝
    0
    关注
    注册时间 最后登录

    hahage168 取消关注 关注

    hahage168 发布的最佳帖子

    • T113开发板双核异构risc-v处理器的使用-基于tina5平台

      全志T113-i是一款双核Cortex-A7国产工业级处理器平台,并内置玄铁C906 RISC-V和HiFi4 DSP双副核心,可流畅运行Linux系统与Qt界面,并已适配OpenWRT系统、Preempt Linux系统。
      而其中的RISC-V属于超高能效副核心,标配内存管理单元,可运行RTOS或裸机程序。T113的主核运行Linux(Openwrt或者Preempt Linux)进行人机界面的交互和应用流程,而RISC-V则是后台
      英雄,可进行大数据数据采集,或者相关编码器的控制等,降低主核被中断的次数,大大提供了主核的运行效率。那么到底这个双核异构怎么用呢?今天盈鹏飞嵌入式就与你分享。

      以盈鹏飞嵌入式SBC-T113主板为例(以T113-i为主控的主板),我们先介绍下主板特性:

      产品特性

      • 采用Allwinner公司Cortex-A7双核T113-i处理器,运行最高速度为1.2GHZ;

      • 列表内置64-bit XuanTie C906 RISC-V协处理器;

      • 列表支持JPEG/MJPEG视频编码,最大分辨率1080p@60fps;支持多格式1080P@60fps视频解码 (H.265,H.264, MPEG-1/2/4);

      • 列表支持双通道LVDS/MIPI-DSI,分辨率最高1920x1080;

      • 列表支持512-1G Bytes DDR3 SDRAM;

      • 列表支持SPI NAND存储和启动(默认:256MB;可选128MB)或者EMMC启动(默认:4GB,最大32GB);

      • 列表支持四路USB2.0 HOST;

      • 列表支持六路RS232通信;

      • 列表支持双路CAN BUS通信(隔离);

      • 列表支持双路以太网,一路10/100M;一路10/100/1000M;

      • 列表稳定的操作系统的支持,可预装Ubuntu20.04/LINUX 5.4 Preempt/Tina5.0;

      • 列表标准3.5寸主板, 尺寸为:146*102MM;

      SBC-T113产品功能图:

      SBC-T113.png

      1、RTOS系统概述

      1.1、概述

      全志Tina Linux SDK中包含了RTOS系统,该系统是基于FreeRTOS内核的软件开发包,包含了系统开发用到的内核源码、驱动、工具、组件与应用程序包。通过Makefile脚本和Kconfig配置文件,使得用户可以通过menuconfig进行个性化裁减,编译出一个可以直接烧写到机器上运行的RTOS系统软件。

      1.2、系统框图

      e28014db-faf1-40b1-8aee-4c82580cf06e-image.png

      RTOS 系统框图如图所示,仅从软件的角度来看,从下至上分为内核层、组件层、应用层三个层次。各层次主要内容如下:

      • Kernel:内核层包括 FreeRTOS核心系统、文件系统、网络系统、BSP驱动等。

      • Component:组件层包括控制台、多媒体、功耗管理、OTA、音频系统、显示系统、图像采集等。

      • APP:应用层包括各种应用 demo。

      发布在 T Series
      H
      hahage168
    • T113开发板TINA5平台TVIN接口的测试(使用trecorderdemo)

      T113平台tina5使用TVIN接口开发连载
      T113平台具有两个TVIN接口,在全志内部通常把 TNIN 模块称为 TVD 或者 TVIN 模块,是一种用于采集模拟 CVBS视频的硬件模块,可将输入的 CVBS 信号或 YPbPr 信号转换成 YUV 信号。T113平台(sun8iw20p1)双通道共用一个ADC,使用时需切换,因此配置时也认为该平台只有单通道。以下是它内核层的总体框架:
      99b61885-6037-46bf-af9e-2289857c9790-image.png
      从以上框架得知,tvd 驱动只是负责把 tvd 的硬件描述完成并注册进 V4L2 框架,具体对 tvd 的使用还是放在用户态的应用层。也就说,在软件层面,使用V4L2的相关程序即可。因此V4L2的相关驱动在内核上务必选择上,否则无法工作。这里归纳关于用户态操作使用 tvd 模块的流程。 演示程序的操作过程(操作单路 tvd):

      1. 用 open 打开/dev/videox 节点,执行执行Ioctl:VIDIOC_S_INPUT 完成通道和 ADC 的 mapping,然后执行 Ioctl:VIDIOC_G_INPUT 确认通道和 ADC mapping 正确
      2. 执行 ioctl:VIDIOC_G_FMT,用于初始化 format以及获取当前 tvd 的锁状态
      3. 执行 ioctl:VIDIOC_S_FMT,定制 format,包括颜色空间,一般来说 V4L2_PIX_FMT_NV61 要好于 V4L2_PIX_FMT_NV12,多路拼接的时候,在这个 ioctl 中检测锁信号
      4. 执行 ioctl:VIDIOC_REQBUFS,通过 V4L2 框架申请 buffer
      5. 执行 ioctl:VIDIOC_QUERYBUF,获取 buffer
      6. 执行 ioctl:VIDIOC_QBUF,将获取到的 buffer 入列,供 tvd 模块写入数据
      7. 执行 ioctl:VIDIOC_STREAMON,使能 tvd 模块工作采集输入数据
      8. 通过 poll/select 的方式查询 dev/videox 节点,如有数据更新,执行 ioctl:VIDIOC_DQBUF 取出已经写好数据的 buffer
      9. 执行 ioctl:VIDIOC_QBUF,将步骤 9 中已经取出数据的 buffer 重新入列,供 tvd 模块写入数据
      10. 循环步骤 9‑10,直至需要停止tvd模块,执行ioctl:VIDIOC_STREAMOFF,关闭tvd模块
      11. 用 close 释放获取的 fd

      以下我们以盈鹏飞嵌入式SBC-T113S主板为例(该主板运行tina5.0),

      SBC-T113S产品特性:

      • 采用Allwinner公司Cortex-A7双核T113-S3/S4处理器,运行最高速度为1.2GHZ;

      • 内置64-bit XuanTie C906 RISC-V协处理器(仅T113-S4支持);

      • 支持JPEG/MJPEG视频编码,最大分辨率1080p@60fps;支持多格式1080P@60fps视频解码 (H.265,H.264, MPEG-1/2/4);

      • 支持RGB666/LVDS/MIPI-DSI,分辨率最高1920x1080;

      • 支持128-256M Bytes DDR3 SDRAM,其中T113-S3内置128MB;T113-S4内置256MB;

      • 支持SPI NAND存储和启动(默认:256MB)或者EMMC启动(默认:4GB,最大32GB);

      • 支持一路USB2.0 OTG(设计为TYPE-A接口);支持二路USB2.0 HOST;

      • 支持七路RS232通信或者6路RS232和1路RS485(非隔离);

      • 支持一路CAN BUS通信(非隔离);

      • 支持一路10/100M以太网;

      • 稳定的操作系统的支持,可预装LINUX 5.4(Preempt)或者OpenWRT;

      • 经典尺寸主板,尺寸为120*100MM;

      SBC-T113S产品功能评估图:
      SBC-T113S接口标示图CN_带序号 - 240805(A).jpg

      从内核配置到演示程序一一介绍;首先按照如下连接线路把SBC-T113S和摄像头连接起来:
      SBC-T113S主板可选配CVBS摄像头模块,配套转接线可接入CN27端口中,原理图如下:

      a0101c1c-2332-4f7e-b47f-40e827f48582-image.png

      以下是SBC-T113S主板与摄像头的连接示意图:
      aa9032ec-dce4-4d5f-8900-1854688a35c3-image.png

      说明:AV视频线的3.5mm一端插入主板的CN27,AV视频线的RCA白色莲花头是TVIN0信号输入;RCA红色莲花头是TVIN1信号输入;RCA黄色莲花头是TVOUT信号输出。
      图片中的AV一拖三音视频线是非标准的,线序定义是不统一的,用户获得连接线后最好用万用表测量下,保证线路连接的正确。以下是我司提供的AV一拖三音视频线的定义:
      628ed6b9-4be1-49db-ab16-eae03864780f-image.png

      发布在 其它全志芯片讨论区
      H
      hahage168
    • 回复: T113开发板双核异构risc-v处理器的使用-基于tina5平台

      2、RTOS SDK目录结构

      rtos
      ├──board	#包含各SoC板级配置目录
      │└──mr527_e906	#mr527_e906板级配置目录
      │└──t113_s3p_c906	#t113_s3p_c906板级配置目录
      │└──t113_s4_c906	#t113_s4_c906板级配置目录
      │└──t113_s4p_c906	#t113_s4p_c906板级配置目录
      │└──XXX	#XXX平台板级配置目录
      ├──envsetup.sh	#SDK环境初始化脚本
      ├──lichee
      │├──dsp	#DSP FreeRTOS系统
      │├──rtos	#C906/E906FreeRTOS系统
      │├──rtos components#FreeRTOS公共组件
      │└──rtos hal	#BSP驱动
      └──tools	#打包相关工具脚本目录
      
      

      所使用RTOS SDK目录结构如上所示,主要包括如下几个关键目录:
      board:板级配置目录,用于存放芯片方案的配置文件,主要包括系统配置文件sys_config.fex等。
      lichee/dsp:存放DSPFreeRTOS系统、组件、应用。
      lichee/rtos:存放E906FreeRTOS系统、组件、应用。
      lichee/rtos components:公共组件目录,lichee/dsp与lichee/rtos都可以使用该组件。
      lichee/rtos hal:BSP驱动目录,用于存放各种驱动代码。对lichee/dsp与lichee/rtos通用。
      tools:工具目录,用于存放编译打包相关的脚本、工具等。
      下面对lichee/rtos、lichee/rtos hal目录进行详细说明。lichee/dsp目录与lichee/rtos目录类似,此处不做介绍。

      2.1、lichee/rtos目录

      ├──arch	#处理器架构相关
      ├──build	#编译临时文件输出目录
      ├──components	#组件
      ├──drivers#驱动
      ├──include#头文件
      ├──kernel#FreeRTOS内核#方案工程
      ├──projects
      ├──scripts
      └──tools#工具链
      
      

      lichee/rtos目录主要包括arch(架构相关)、components(组件)、drivers(驱动)、include(头文件)、kernel(内核)、projects(工程)、toos(工具链)等目录,下面对常用重要目录分别进行介绍。

      2.1.1、arch目录

      arch目录主要放置跟SoC架构相关的内容,每个SoC单独目录管理,主要包括跟risc v架构相关的ARCH初始化、中断处理、异常处理、内存映射相关功能的实现。

      lichee/rtos/arch/
      ├──common
      └──risc v
      ├──arch.mk
      ├──c906
      ├──common
      ├──e906
      ├──includes
      ├──Kconfig
      ├──Makefile
      ├──sun55iw3p1
      └──sun8iw20p1
      
      

      2.1.2、components目录

      components 目录包含 allwinner 和第三方的组件。

      lichee/rtos/components/
      ├──aw
      │├──blkpart
      │├──bluetooth
      │├──csi
      │├──devfs
      │├──healthd
      │├──......
      │├──watchpoint
      │└──wireless_video
      ├──common >../../rtos components
      └──thirdparty
      ├──common
      ├──console
      ├──cplusplus
      ├──elmfat
      ├──finsh_cli
      ├──......
      └──vfs
      
      

      2.1.3、drivers目录

      drivers目录包含所需的外设驱动,主要包括各外设控制器驱动的具体实现(hal软连接)以及OSAL层接口(osal)。

      lichee/rtos/drivers/
      ├──drv
      ├─ CPUfreq	#POSIX头文件
      ├──leds
      ├── uart
      ├──.....
      ├── wireless
      ├─hal ->.../../rtos-hal/
      └──osal
      
      

      2.1.4、include 目录

      include 目录统一管理各模块提供的数据结构定义及函数声明。

      lichee/rtos/include/ 
      ├── arch 
      # 架构相关头文件 
      ├── FreeRTOS_POSIX # POSIX头文件 
      ├── ...... 
      └── vsprintf.h
      
      

      2.1.5、kernel目录

      kernel目录主要包含FreeRTOS的kernel源码,全志实现的系统功能相关代码。

      lichee/rtos/kernel/
      ├──FreeRTOS orig
      │└──Source
      └──Posix
      

      2.1.6 projects 目录

      projects目录下的每一个子目录代表一个project,实现main入口,选择不同的project编译出来的bin具有不同功能,每个project有独立的FreeRTOSConfig配置。例如t113-s4,其对应于t113_s4_c906子目录,这个子目录下面根据应用的不同建立不同的应用配置,如下有evb1_auto应用和evb1_auto_fastboot_video应用。

      rtos/lichee/rtos/projects/t113_s4_c906/
      ├── evb1_auto
      │   ├── defconfig
      │   ├── defconfig_org
      │   ├── freertos.lds.S
      │   ├── Kconfig
      │   ├── Makefile
      │   └── src
      │       ├── alsa_config.c
      │       ├── assert.c
      │       ├── card_default.c
      │       ├── FreeRTOSConfig.h
      │       ├── hooks.c
      │       └── main.c
      ├── evb1_auto_fastboot_video
      │   ├── defconfig
      │   ├── freertos.lds.S
      │   ├── Kconfig
      │   ├── Makefile
      │   └── src
      │       ├── alsa_config.c
      │       ├── assert.c
      │       ├── card_default.c
      │       ├── FreeRTOSConfig.h
      │       ├── hooks.c
      │       └── main.c
      └── Makefile
      
      

      2.1.7、tools目录

      这个目录主要包含一些预编译好的交叉编译工具链。

      xxx@xxx:lichee/rtos/tools$ ls -al
      total 663248
      drwxrwxr-x  3 ping ping      4096 Oct 21 14:28 .
      drwxrwxr-x 13 ping ping      4096 Oct 21 16:02 ..
      -rw-rw-r--  1 ping ping 103333888 Jan  8  2024 gcc-arm-melis-eabi-8-2019-q3-update-linux.tar.bz2
      -rw-rw-r--  1 ping ping 106566166 Jan  8  2024 gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
      -rwxrwxr-x  1 ping ping 137020992 Jan  8  2024 gcc-arm-none-eabi-8-2019-q3-update-win32.zip
      drwxr-xr-x  9 ping ping      4096 Oct 21 14:29 riscv64-elf-x86_64-20201104
      -rwxrwxr-x  1 ping ping 164604965 Jan  8  2024 riscv64-elf-x86_64-20201104.tar.gz
      -rwxrwxr-x  1 ping ping 167614189 Jan  8  2024 Xuantie-900-gcc-elf-newlib-mingw-V2.6.1-20220906.tar.gz
      xxx@xxx:lichee/rtos/tools$
      
      

      目前risc v基于GCC8.4.0的交叉编译器。

      xxx@xxx:lichee/rtos/tools$./riscv64-elf-x86_64-20201104/bin/riscv64-unknown-elf-gcc -v
      Using built-in specs.
      COLLECT_GCC=./riscv64-elf-x86_64-20201104/bin/riscv64-unknown-elf-gcc
      COLLECT_LTO_WRAPPER=/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/tools/riscv64-elf-x86_64-20201104/bin/../libexec/gcc/riscv64-unknown-elf/8.4.0/lto-wrapper
      Target: riscv64-unknown-elf
      Configured with: /ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/build/../source/riscv/riscv-gcc/configure --target=riscv64-unknown-elf --with-mpc=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/lib-for-gcc-x86_64-linux/ --with-mpfr=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/lib-for-gcc-x86_64-linux/ --with-gmp=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/lib-for-gcc-x86_64-linux/ --prefix=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/install --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --enable-libgcctf --with-newlib --with-sysroot=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/install/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../source/riscv/riscv-gcc --with-pkgversion='T-HEAD RISCV Tools V1.10.2 B20201104' --enable-multilib --with-abi=lp64d --with-arch=rv64gcxthead 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medany' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medany' CC=gcc CXX=g++
      Thread model: single
      gcc version 8.4.0 (T-HEAD RISCV Tools V1.10.2 B20201104)
       
      

      2.2、lichee/rtos hal目录

      lichee/rtos hal目录为BSP驱动目录,用于存放各种驱动代码。lichee/rtos/drivers目录下的rtos hal子目录软链接到该目录,下面对该目录进行介绍。

      lichee/rtos hal
      ├──hal	#BSP驱动代码
      ├──include	#驱动相关头文件
      └──tools
      

      lichee/rtos hal目录主要包括hal(BSP驱动代码)、include(驱动相关头文件)等目录,下面分别对其进行介绍。

      2.2.1、hal目录

      hal目录主要包含各外设驱动代码以及驱动测试代码,source子目录为驱动代码,test子目录为驱动测试代码

      lichee/rtos hal/hal
      ├──Makefile
      ├──source
      │├──ccmu
      │├──gpio
      │├──......
      │├──uart
      │└──watchdog
      └──test
      ├──ccmu
      ├──gpio
      ├──......
      ├──uart
      └──watchdog
      

      2.2.2、include目录

      include目录主要包含驱动相关头文件以及系统相关接口头文件。

      lichee/rtos hal/include
      ├──hal
      │├──aw alsa lib
      │├──aw_common.h
      │├──......
      │├──sunxi_hal_usb.h
      │├──sunxi_hal_watchdog.h
      │└──video
      └──osal
      ├──hal_atomic.h
      ├──hal_cache.h
      ├──......
      ├──hal_waitqueue.h
      └──hal_workqueue.h
      
      
      发布在 T Series
      H
      hahage168
    • 回复: T113开发板双核异构risc-v处理器的使用-基于tina5平台

      8、RTOS系统定制开发

      此处以在rtos/components/aw目录下创建一个简单的软件包为例,帮助客户了解RTOS环境,为RTOS系统定制开发提供基础。
      RTOS环境下的软件包主要由三部分组成,源文件,Makefile,Kconfig,如下:

      hello_world
      ├──hello_world.c
      ├──Kconfig
      └──Makefile
      
      

      其中Makefile指定该模块的编译规则,Kconfig则指定该模块的编译配置,从而达到功能可裁剪,镜像文件大小可灵活配置的目的。
      示例软件包实现简单的打印字符串“hello,world!”的功能,如下:

      #include<stdio.h>#include<
      intcmd_hello_world(void)
      {
      printf("hello,world!\n");return0;
      }
      FINSH_FUNCTION_EXPORT_CMD(cmd_hello_world,hello_world,helpforhello_world)
      /*这一行表示将函数cmd_hello_world封装成一个名为hello_world的命令,在RV控制台输入hello_world,即运行cmd_hello_world函数,最后一个参数为帮助信息。此外,头文件需要加上hal_cmd.h.*/
      
      

      Kconfig的写法如下:

      configCOMPONENT_HELLO_WORLD
      bool"HELLO_WORLDSupport"defaultn
      defaultn
      help
      supporthello_worldcommand.
      
      

      Kconfile的写法如下:

      obj-$(CONFIGCOMPONENTHELLOWORLD)+=hello_world.o
      

      此外,需要在上层目录的Kconfile以及Kconfig中加上该软件包,如下:

      上层Makefile
      obj-$(CONFIGCOMPONENT_HELLO_WORLD)+=helloworld
      
      上层Kconfig
      sourcecomponents/aw/hello_world/Kconfig
      
      

      开发完成后,运行mrtos_menuconfig,选中该模块对应的CONFIG后退出,然后mrtos进行编译,这样新增的软件包便可以编译到RTOS镜像文件中了。
      将RTOS镜像文件移动到TinaLinux环境下重新编译打包,新生成的固件打包烧录进开发板后,启动RV核,在RV核控制台输入help命令。

      ca1b9cd8-13d0-4c04-8044-b0484894ee2c-image.png

      可以看到有新增的hello_world命令,控制台输入hello_world命令,控制台输出如下:

      hello,world!
      

      RTOS下一个简单的软件包便创建成功了。

      发布在 T Series
      H
      hahage168
    • 回复: T113开发板双核异构risc-v处理器的使用-基于tina5平台

      4、异构双核通信简介

      本章节以SBC-T113S4主板为例,SBC-T113S4采用的处理器是T113-S4,该处理器集成了双核Cortex-A7,同时集成了RISC-V核C906,异构双核系统通讯在硬件上使用的是 MSGBOX,在软件层面上使用的是 AMP 与 RPMsg 通讯协议。其中 Cortex-A7 上基于 Linux 标准的 RPMsg 驱动框架,C906基于 OpenAMP 异构通信框架。

      4.1、AMP与RPMsg简要介绍

      T113-S4所带有的 A7 主核心与 C906 辅助核心是完全不同的两个核心,为了最大限度的发挥他们的性能,协同完成某一任务,所以在不同的核心上面运行的系统也各不相同。这些不同架构的核心以及他们上面所运行的软件组合在一起,就成了 AMP 系统 (Asymmetric Multiprocessing System, 异构多处理系统)。

      由于两个核心存在的目的是协同的处理,因此在异构多处理系统中往往会形成 Master - Remote 结构。主核心启动后启动从核心。当两个核心上的系统都启动完成后,他们之间就通过 IPC(Inter Processor Communication)方式进行通信,而 RPMsg 就是 IPC 中的一种。
      在AMP系统中,两个核心通过共享内存的方式进行通信。两个核心通过 AMP 中断来传递讯息。内存的管理由主核负责。

      cfd10cb6-c6d4-49a5-b2a3-06f4b4409223-image.png

      AMP 系统在每个通信方向上都有两个缓冲区,分别是 USED 和 AVAIL,这个缓冲区可以按照 RPMsg 中消息的格式分成一块一块链接形成一个环。

      d78996c4-f094-4d33-9741-d0ae8a54dd95-image.png

      当主核需要和从核进行通信的时候可以分为四步:
      (1)主核先从USED中取得一块内存(Allocate)
      (2)将消息按照消息协议填充
      (3)将该内存链接到 AVAIL 缓冲区中(Send)
      (4)触发中断,通知辅助核有消息处理

      3eb8ec1f-b7d7-44fb-8641-d553360d6c25-image.png

      反之,从核需要和主核通信的时候也类似:
      (1)从核先从AVAIL中取得一块内存(Allocate)
      (2)将消息按照消息协议填充
      (3)将该内存链接到 USED 缓冲区中(Send)
      (4)触发中断,通知主核有消息处理。

      6ef49569-310c-4568-99be-628bd703d3a3-image.png

      4.2、RPMsg协议

      既然 RPMsg 是一种信息交换的协议,与TCP/IP类似,RPMsg 协议也有分层,主要分为三层,分别是传输层、MAC层和物理层。

      c374526e-80c6-46fb-a981-36db50408a82-image.png

      其中 MAC层 的 VirtIO 是一种I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象。 提供了一套上层应用与各 Hypervisor 虚拟化设备之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率。
      RPMsg 总线上的消息都具有以下结构,包含消息头和数据两个固定的部分,该消息格式的定义位于drivers/rpmsg/virtio_rpmsg_bus.c中,具体定义如下:

      struct rpmsg_hdr {
          u32 src;
          u32 dst;
          u32 reserved;
          u16 len;
          u16 flags;
          u8 data[];
      } __packed;
      
      

      4.4、RPBuf通信

      由于RPMsg不适合大数据通信,全志公司提供了大数据传输的办法-RPBuf。
      RPBuf 全志基于 RPMsg 开发的一套通信机制,其实现原理是使用 RPMsg 传输数据的地址,而不是数据的本身,避免了数据的多次拷贝以及每次传输不能大于 496 字节的限制。
      rpbuf 中使用名字和长度来唯一标识一个 buffer,故不能创建相同名字的 buffer。
      rpbuf 中的 buffer 有 3 个状态:

      1. remote_dummy_buffers:该 buffer 远端已创建,本地未创建
      2. local_dummy_buffers:该 buffer 本地已创建,远端未创建
      3. buffers:远端、本地已创建,此时 buffer 才可用 后续章节将介绍如何定制系统并进行RPBuf通信。

      4.5、SBC-T113S主板的TinaLinux与Freertos通信

      SBC-T113主板运行的是Tina Linux,提供 AMP 与 RPMsg 对接 C906

      1. Linux remoteproc 管理控制 C906
      2. RPMsg 与 C906 通讯

      4.5.1、C906-FreeRTOS系统

      T113-S4的辅助核心 C906 上运行的是FreeRTOS操作系统。其独立于 A7 主核心中的 Linux 系统,可以独立运行。在FreeRTOS中,提供 OpenAMP 软件框架来与 A7 Linux 系统进行通信。

      • 提供了处理器的生命周期管理(LCM,Life Cycle Management),与 Linux 的remoteproc 兼容

      • 提供了处理器间的消息传输机制,与 Linux 的 RPMsg 兼容

      4.5.2、异构系统启动流程

      首先,由芯片内部的 BROM 寻找启动介质,在 SBC-T113主板上便是 eMMC 储存器(也有从NAND启动的版本)。找到启动介质后会运行其中的 BOOT0 代码。BOOT0 会在 A7 主核心中运行Linux 系统,也会在C906核心中运行RTOS系统。启动的两个系统是独立运行的。

      29df8a39-322f-4f63-b7a3-35ba7d5ddb91-image.png

      发布在 T Series
      H
      hahage168

    hahage168 发布的最新帖子

    • 回复: T113开发板双核异构risc-v处理器的使用-基于tina5平台

      8、RTOS系统定制开发

      此处以在rtos/components/aw目录下创建一个简单的软件包为例,帮助客户了解RTOS环境,为RTOS系统定制开发提供基础。
      RTOS环境下的软件包主要由三部分组成,源文件,Makefile,Kconfig,如下:

      hello_world
      ├──hello_world.c
      ├──Kconfig
      └──Makefile
      
      

      其中Makefile指定该模块的编译规则,Kconfig则指定该模块的编译配置,从而达到功能可裁剪,镜像文件大小可灵活配置的目的。
      示例软件包实现简单的打印字符串“hello,world!”的功能,如下:

      #include<stdio.h>#include<
      intcmd_hello_world(void)
      {
      printf("hello,world!\n");return0;
      }
      FINSH_FUNCTION_EXPORT_CMD(cmd_hello_world,hello_world,helpforhello_world)
      /*这一行表示将函数cmd_hello_world封装成一个名为hello_world的命令,在RV控制台输入hello_world,即运行cmd_hello_world函数,最后一个参数为帮助信息。此外,头文件需要加上hal_cmd.h.*/
      
      

      Kconfig的写法如下:

      configCOMPONENT_HELLO_WORLD
      bool"HELLO_WORLDSupport"defaultn
      defaultn
      help
      supporthello_worldcommand.
      
      

      Kconfile的写法如下:

      obj-$(CONFIGCOMPONENTHELLOWORLD)+=hello_world.o
      

      此外,需要在上层目录的Kconfile以及Kconfig中加上该软件包,如下:

      上层Makefile
      obj-$(CONFIGCOMPONENT_HELLO_WORLD)+=helloworld
      
      上层Kconfig
      sourcecomponents/aw/hello_world/Kconfig
      
      

      开发完成后,运行mrtos_menuconfig,选中该模块对应的CONFIG后退出,然后mrtos进行编译,这样新增的软件包便可以编译到RTOS镜像文件中了。
      将RTOS镜像文件移动到TinaLinux环境下重新编译打包,新生成的固件打包烧录进开发板后,启动RV核,在RV核控制台输入help命令。

      ca1b9cd8-13d0-4c04-8044-b0484894ee2c-image.png

      可以看到有新增的hello_world命令,控制台输入hello_world命令,控制台输出如下:

      hello,world!
      

      RTOS下一个简单的软件包便创建成功了。

      发布在 T Series
      H
      hahage168
    • 回复: T113开发板双核异构risc-v处理器的使用-基于tina5平台

      7、RTOS新增方案

      此处以在t113_s3p_c906 芯片下创建一个example_demo方案为例,帮助客户快速创建定制方案。
      第一步:进入rtos/board/t113_s3p_c906目录,创建 example_demo 文件夹(从evb1_auto方案拷贝过来)

      7fc09581-42af-4d90-adfd-6ee0f6a87990-image.png

      第二步:进入rtos/lichee/rtos/projects/t113_s3p_c906目录,创建example_demo文件夹(从evb1_auto方案拷贝过来)

      be496c61-e43e-4d69-839c-dd4557ef6f1e-image.png

      第三步:修改rtos/lichee/rtos/projects/Kconfig,新增example_demo配置项(从evb1_auto配置项拷贝过来)

      45d5e227-21c1-48cd-9022-0c7be628398a-image.png

      第四步:修改rtos/lichee/rtos/projects/t113_s3p_c906/Makefile,关联了example_demo方案编译

      228bcb7d-f89e-48d5-ae4f-7217e89b5216-image.png

      第五步:进入rtos目录,重新配置方案选择,这时候我们发现会多了t113_s3p_c906_example_demo 方案选择,我们重新选择t113_s3p_c906_example_demo 方案

      source envsetup.sh 
      lunch_rtos 
      You're building on Linux
      Lunch menu... pick a combo: 
      1. t113_i_c906_evb1_auto 
      2. t113_s3p_c906_evb1_auto 
      3. t113_s3p_c906_evb1_auto_fastboot 
      4. t113_s3p_c906_evb1_auto_fastboot_video 
      5. t113_s3p_c906_evb1_auto_non_os 
      6. t113_s3p_c906_example_demo 
      7. t113_s4_c906_evb1_auto 
      8. t113_s4_c906_evb1_auto_fastboot_video 
      9. t113_s4p_c906_evb1_auto
      Which would you like? [Default t113_s3p_c906_example_demo]:
      
      

      第六步:打开配置defconfig文件,选择正确方案配置项

      mrtos_menuconfig
      

      ef170378-33a5-48b1-af90-cf39c9298a23-image.png

      fb443d12-8369-475d-b9e7-2afecd27e915-image.png

      3be9ef3b-20e3-432c-81c9-aa1365d77b24-image.png

      第七步:重新编译

      mrtos clean
      mrtos
      
      
      发布在 T Series
      H
      hahage168
    • 回复: T113开发板双核异构risc-v处理器的使用-基于tina5平台

      6、双核通信验证

      6.1、C906小核创建通讯节点

      在C906小核串口终端建立两个通讯节点用于监听数据,输入eptdev_bind test 2

      cpu0 >eptdev_bind test 2
      

      查看监听节点,输入rpmsg_list_listen

      cpu0 >rpmsg_list_listen
      name listen alive
      test 2 0
      console 100 0
      
      

      6.2、大核创建通讯节点

      在Tina Linux下也创建两个通讯监听节点,输入以下两个命令

      echo test > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/open
      echo test > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/open
      
      

      输入后,如下所示:

      root@TinaLinux:/sys/class/rpmsg# echo test > /sys/class/rpmsg/rpmsg_ctrl-c906_rp
      roc@0/open
      [  946.762321] virtio_rpmsg_bus virtio0: creating channel sunxi,rpmsg_client addr 0x403
      root@TinaLinux:/sys/class/rpmsg# echo test > /sys/class/rpmsg/rpmsg_ctrl-c906_rp
      roc@0/open
      [  951.246499] virtio_rpmsg_bus virtio0: creating channel sunxi,rpmsg_client addr 0x404
      root@TinaLinux:/sys/class/rpmsg#
      
      

      在大核TIna Linux中也创建了两个监听节点,输入ls /dev/rpmsg*查看节点信息

      root@TinaLinux:~# ls /dev/rpmsg*
      /dev/rpmsg0 /dev/rpmsg1 /dev/rpmsg_ctrl-c906_rproc@0
      
      

      创建完成后,可以在C906小核终端中查看自动输出的信息

      cpu0 >ctrldev: Rx 44 Bytes
      client: Rx 8 Bytes
      rpmsg0: binding
      send 0x13131411 to rpmsg0
      create rpmsg0 client success
      ctrldev: Rx 44 Bytes
      client: Rx 8 Bytes
      rpmsg1: binding
      send 0x13131411 to rpmsg1
      create rpmsg1 client success
      
      

      6.3、大核传输至C906小核

      在Tina Linux下输入

      echo "hello Embfly SBC-T113S Board" > /dev/rpmsg0
      echo "hello Tina Linux" > /dev/rpmsg1
      
      

      将Linux Message 0信息通过创建的监听节点传输到C906小核,例如:

      root@TinaLinux:~# echo "hello Embfly SBC-T113S Board" > /dev/rpmsg0
      root@TinaLinux:~# echo "hello Tina Linux" > /dev/rpmsg1
      
      

      输入后,打开C906串口终端可以发现,大核传输过来的信息。

      rpmsg0: Rx 22 Bytes
      Data:hello Embfly SBC-T113S Board
      
      rpmsg1: Rx 17 Bytes
      Data:hello Tina Linux
      
      

      6.4、C906小核传输至大核

      在小核端需要使用命令 eptdev_send 用法 eptdev_send <id><data>,这里的id号从0开始,我们设置有两个通信节点,所以id号分别为0和1。
      在小核的串口终端输入以下命令:

      eptdev_send 0 "hello C906"
      eptdev_send 1 "hello C906"
      
      

      例如:

      cpu0 >eptdev_send 0 "hello C906"
      will send hello C906 to rpmsg0
      cpu0 >eptdev_send 1 "hello C906"
      will send hello C906 to rpmsg1
      
      

      输入完成后,小核会将信息分别传入rpmsg0和rpmsg1两个通讯节点。可以在大核Tina Linux端输入

      cat /dev/rpmsg0
      cat /dev/rpmsg1
      
      

      可查看从C906小核传输过来的信息。例如:

      root@TinaLinux:~# cat /dev/rpmsg0
      hello C906
      ^C
      root@TinaLinux:~# cat /dev/rpmsg1
      hello C906
      ^C
      
      

      按下Crtl+C结束监听前持续监听该节点。
      您可以在小核端多次传输信息到该节点,该节点支持持续接受小核传输的信息,例如:
      在C906小核,多次传输信息到监听节点rpmsg0

      cpu0 >eptdev_send 0 "hello C906 "
      will send hello C906 to rpmsg0
      cpu0 >eptdev_send 0 "hello C906 "
      will send hello C906 to rpmsg0
      cpu0 >eptdev_send 0 "hello C906 "
      will send hello C906 to rpmsg0
      cpu0 >eptdev_send 0 "hello C906 "
      will send hello C906 to rpmsg0
      cpu0 >eptdev_send 0 "hello C906 "
      will send hello C906 to rpmsg0
      cpu0 >eptdev_send 0 "hello C906 "
      will send hello C906 to rpmsg0
      cpu0 >eptdev_send 0 "hello C906 "
      will send hello C906 to rpmsg0
      
      

      在大核端则会一直接收到小核传输过来的信息

      root@TinaLinux:~# cat /dev/rpmsg0
      hello C906 hello C906 hello C906 hello C906 hello C906 hello C906 hello C906
      
      

      6.5、关闭相互通讯

      要关闭通信,只要在大核Tina Linux端操作节点即可。输入以下命令,echo <id>给到rpmsg的控制关闭节点即可。

      echo 0 > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/close
      echo 1 > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/close
      
      

      例如:

      root@TinaLinux:~# echo 0 > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/close
      [ 6783.156899] virtio_rpmsg_bus virtio0: destroying channel sunxi,rpmsg_client addr 0x403
      root@TinaLinux:~# echo 1 > /sys/class/rpmsg/rpmsg_ctrl-c906_rproc@0/close
      root@TinaLinux:~# [ 6784.224740] virtio_rpmsg_bus virtio0: destroying channel sunxi,rpmsg_client addr 0x404
      
      

      此时C906小核端也会自动关闭通信节点,自动输出以下信息

      send 0x13131411 to rpmsg0
      rpmsg0: unbinding
      ctrldev: Rx 44 Bytes
      send 0x13131411 to rpmsg1
      rpmsg1: unbinding
      
      
      发布在 T Series
      H
      hahage168
    • 回复: T113开发板双核异构risc-v处理器的使用-基于tina5平台

      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:

      9140a6ef-b546-41b4-968d-4766c0248be4-image.png

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

      459fda62-69d7-4b3f-999c-92af0dddccc8-image.png

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

      5fe56d87-3005-4552-aa3b-5398d3390679-image.png

      • 使能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驱动可以不选。
        选中完成后如下图所示:

      8810021b-226a-4785-b61f-4fc582b3cef5-image.png

      • 使能共享内存驱动

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

      07da5097-ed02-4f1e-a62f-b09002e00414-image.png

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

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

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

      8a7bfefd-5684-48dc-8f8b-bd56a7c69c54-image.png

      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作为终端串口:

      51d97141-803f-4c54-8324-2a9a0fa12fb8-image.png

      修改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
      
      

      3eae4129-7af5-49ac-801b-03b6b807a05a-image.png

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

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

      c75c4609-f137-4a3e-a944-1be021dccca6-image.png

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

      22f32ad2-0dd7-4991-99ac-c48d8f1d31e9-image.png

      720ad873-a333-457f-be05-b4754dba8a71-image.png

      c593e5d8-7f5e-4409-8fad-253e08086cc9-image.png

      c6cb74ef-097e-48c1-9968-bdc9f25fb65b-image.png

      进入如下界面,选中Freertos终端相关配置
      [] Multi Console Support
      [
      ] Uart Multi Console Support

      Uart Multi Console As Main Console

      [] Rpmsg Multi Console Support
      [
      ] Rpmsg Multi Console Enable Cache Cmd

      0285106f-cb98-47ab-9887-f331d1814fe5-image.png

      注: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
      
      
      发布在 T Series
      H
      hahage168
    • 回复: T113开发板双核异构risc-v处理器的使用-基于tina5平台

      4、异构双核通信简介

      本章节以SBC-T113S4主板为例,SBC-T113S4采用的处理器是T113-S4,该处理器集成了双核Cortex-A7,同时集成了RISC-V核C906,异构双核系统通讯在硬件上使用的是 MSGBOX,在软件层面上使用的是 AMP 与 RPMsg 通讯协议。其中 Cortex-A7 上基于 Linux 标准的 RPMsg 驱动框架,C906基于 OpenAMP 异构通信框架。

      4.1、AMP与RPMsg简要介绍

      T113-S4所带有的 A7 主核心与 C906 辅助核心是完全不同的两个核心,为了最大限度的发挥他们的性能,协同完成某一任务,所以在不同的核心上面运行的系统也各不相同。这些不同架构的核心以及他们上面所运行的软件组合在一起,就成了 AMP 系统 (Asymmetric Multiprocessing System, 异构多处理系统)。

      由于两个核心存在的目的是协同的处理,因此在异构多处理系统中往往会形成 Master - Remote 结构。主核心启动后启动从核心。当两个核心上的系统都启动完成后,他们之间就通过 IPC(Inter Processor Communication)方式进行通信,而 RPMsg 就是 IPC 中的一种。
      在AMP系统中,两个核心通过共享内存的方式进行通信。两个核心通过 AMP 中断来传递讯息。内存的管理由主核负责。

      cfd10cb6-c6d4-49a5-b2a3-06f4b4409223-image.png

      AMP 系统在每个通信方向上都有两个缓冲区,分别是 USED 和 AVAIL,这个缓冲区可以按照 RPMsg 中消息的格式分成一块一块链接形成一个环。

      d78996c4-f094-4d33-9741-d0ae8a54dd95-image.png

      当主核需要和从核进行通信的时候可以分为四步:
      (1)主核先从USED中取得一块内存(Allocate)
      (2)将消息按照消息协议填充
      (3)将该内存链接到 AVAIL 缓冲区中(Send)
      (4)触发中断,通知辅助核有消息处理

      3eb8ec1f-b7d7-44fb-8641-d553360d6c25-image.png

      反之,从核需要和主核通信的时候也类似:
      (1)从核先从AVAIL中取得一块内存(Allocate)
      (2)将消息按照消息协议填充
      (3)将该内存链接到 USED 缓冲区中(Send)
      (4)触发中断,通知主核有消息处理。

      6ef49569-310c-4568-99be-628bd703d3a3-image.png

      4.2、RPMsg协议

      既然 RPMsg 是一种信息交换的协议,与TCP/IP类似,RPMsg 协议也有分层,主要分为三层,分别是传输层、MAC层和物理层。

      c374526e-80c6-46fb-a981-36db50408a82-image.png

      其中 MAC层 的 VirtIO 是一种I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象。 提供了一套上层应用与各 Hypervisor 虚拟化设备之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率。
      RPMsg 总线上的消息都具有以下结构,包含消息头和数据两个固定的部分,该消息格式的定义位于drivers/rpmsg/virtio_rpmsg_bus.c中,具体定义如下:

      struct rpmsg_hdr {
          u32 src;
          u32 dst;
          u32 reserved;
          u16 len;
          u16 flags;
          u8 data[];
      } __packed;
      
      

      4.4、RPBuf通信

      由于RPMsg不适合大数据通信,全志公司提供了大数据传输的办法-RPBuf。
      RPBuf 全志基于 RPMsg 开发的一套通信机制,其实现原理是使用 RPMsg 传输数据的地址,而不是数据的本身,避免了数据的多次拷贝以及每次传输不能大于 496 字节的限制。
      rpbuf 中使用名字和长度来唯一标识一个 buffer,故不能创建相同名字的 buffer。
      rpbuf 中的 buffer 有 3 个状态:

      1. remote_dummy_buffers:该 buffer 远端已创建,本地未创建
      2. local_dummy_buffers:该 buffer 本地已创建,远端未创建
      3. buffers:远端、本地已创建,此时 buffer 才可用 后续章节将介绍如何定制系统并进行RPBuf通信。

      4.5、SBC-T113S主板的TinaLinux与Freertos通信

      SBC-T113主板运行的是Tina Linux,提供 AMP 与 RPMsg 对接 C906

      1. Linux remoteproc 管理控制 C906
      2. RPMsg 与 C906 通讯

      4.5.1、C906-FreeRTOS系统

      T113-S4的辅助核心 C906 上运行的是FreeRTOS操作系统。其独立于 A7 主核心中的 Linux 系统,可以独立运行。在FreeRTOS中,提供 OpenAMP 软件框架来与 A7 Linux 系统进行通信。

      • 提供了处理器的生命周期管理(LCM,Life Cycle Management),与 Linux 的remoteproc 兼容

      • 提供了处理器间的消息传输机制,与 Linux 的 RPMsg 兼容

      4.5.2、异构系统启动流程

      首先,由芯片内部的 BROM 寻找启动介质,在 SBC-T113主板上便是 eMMC 储存器(也有从NAND启动的版本)。找到启动介质后会运行其中的 BOOT0 代码。BOOT0 会在 A7 主核心中运行Linux 系统,也会在C906核心中运行RTOS系统。启动的两个系统是独立运行的。

      29df8a39-322f-4f63-b7a3-35ba7d5ddb91-image.png

      发布在 T Series
      H
      hahage168
    • 回复: T113开发板双核异构risc-v处理器的使用-基于tina5平台

      3、RTOS编译开发说明

      3.1、RTOS SDK与TinaLinux开发环境

      RTOS SDK相关代码已集成到Tina Linux开发环境,Tina Linux开发环境下的rtos子目录即为RTOS开发环境。

      ├──brandy
      ├──bsp
      ├──build
      ├──buildroot
      ├──build.sh >build/top_build.sh
      ├──device
      ├──kernel
      ├──openwrt
      ├──out
      ├──platform
      ├──prebuilt
      ├──rtos	#RTOS环境
      ├──tee_kit
      ├──test
      └──tools
      
      

      3.2、RTOS编译

      Tina集成了RTOS的编译、打包功能,而且适用于openwrt、buildroot等文件系统。这里以T113 S4平台作为例子进行阐述。

      3.2.1、关联RTOS方案

      TinaLinux的SDK中,SDK根目录下有device目录,该目录存放的是不同处理器平台及主板的配置,以SBC-T113S4_NAND为例,它是以T113_S4为主控制器的,其配置文件就存放在device/config/chips/t113_s4/configs/sbc_t113s4_nand目录下,那么该主板如何关联RTOS方案呢?

      xxx@xxx:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1/device/config/chips/t113_s4/configs/sbc_t113s4_nand$ tree -l
      .
      ├── bin
      │   ├── amp_dsp0.bin
      │   └── amp_rv0.bin
      ├── BoardConfig.mk //关联RTOS项目的关键
      ├── board.dts -> linux-5.4/board.dts
      ├── bsp
      │   ├── env.cfg
      │   └── sys_partition.fex
      ├── buildroot
      │   ├── BoardConfig.mk
      │   ├── BoardConfig_nor.mk
      │   ├── bootlogo.bmp
      │   ├── env_nor.cfg
      │   ├── swupdate
      │   │   ├── env_ab.cfg
      │   │   ├── sw-description-ab
      │   │   ├── sw-description-ab-rdiff
      │   │   ├── sw-description-recovery
      │   │   ├── sw-description-recovery-sign
      │   │   ├── sw-subimgs-ab.cfg
      │   │   ├── sw-subimgs-ab-rdiff.cfg
      │   │   ├── sw-subimgs-recovery.cfg
      │   │   ├── sw-subimgs-recovery-secure.cfg
      │   │   ├── sw-subimgs-recovery-sign.cfg
      │   │   ├── sys_partition_ab.fex
      │   │   └── sys_partition_recovery.fex
      │   ├── sys_partition.fex
      │   └── sys_partition_nor.fex
      ├── linux-5.4
      │   ├── board_backup.dts
      │   ├── board.dts
      │   ├── board_lvds1024x600.dts
      │   ├── board_lvds1024x768.dts
      │   ├── board_old.dts
      │   ├── board_spi4bit_drv30.dts
      │   ├── board_spi4bit.dts
      │   ├── board_spi_sbc-t113s_v1p0.dts
      │   ├── board_tft1024x600.dts
      │   ├── board_uart3.dts
      │   ├── board_xr829_sbc-t113s_v1p1.dts
      │   ├── config-5.4
      │   ├── config-5.4-recovery
      │   ├── config_uart3-5.4
      │   ├── env.cfg
      │   ├── env_uart3.cfg
      │   └── sys_partition.fex
      ├── openwrt
      │   ├── bootlogo.bmp
      │   ├── sys_partition.fex
      │   └── sys_partition_nor.fex
      ├── sys_config.fex
      ├── sys_config_old.fex
      ├── sys_config_uart3.fex
      ├── uboot-board_backup.dts
      ├── uboot-board.dts
      ├── uboot-board-lvds-lcd1024x600.dts
      ├── uboot-board_spi0_1wire.dts
      ├── uboot-board_spi_sbc-t113s_v1p0.dts
      ├── uboot-board_spi_sbc-t113s_v1p1.dts
      └── uboot-board-tft-lcd1024x600.dts
      
      

      在这些配置文件中有一个文件BoardConfig.mk,它就是关联RTOS应用的关键,这个文件的内容如下:

      a7612410-1de1-45b4-aa50-de4f5ded5cc2-image.png

      配置RTOS方案名的关键字段LICHEE_RTOS_PROJECT_NAME:=xxxxx。以我司SBC-T113S主板为例,在BoardConfig.mk中配置的是t113_s4_c906_evb1_auto的RTOS方案。开发者可以通过修改LICHEE_RTOS_PROJECT_NAME字段,更改构建RTOS方案。
      先进入Tina的rtos目录,rtos目录的内容如下:

      ├──board
      ├──envsetup.sh >tools/scripts/source_envsetup.sh
      ├──lichee
      ├──out
      └──tools
      
      

      执行如下指令进行RTOS的环境配置

      source envsetup.sh	#配置环境变量
      

      我们看到可以选择的RTOS方案,即是LICHEE_RTOS_PROJECT_NAME字段可以配置的RTOS方案。

      last=t113_s4_c906_evb1_auto
      You're building on Linux
      Lunch menu... pick a combo:
           1. t113_i_c906_evb1_auto
           2. t113_s3p_c906_evb1_auto
           3. t113_s3p_c906_evb1_auto_fastboot
           4. t113_s3p_c906_evb1_auto_fastboot_video
           5. t113_s3p_c906_evb1_auto_non_os
           6. t113_s3p_c906_example_demo
           7. t113_s4_c906_evb1_auto
           8. t113_s4_c906_evb1_auto_fastboot_video
           9. t113_s4p_c906_evb1_auto
      
      Which would you like? [Default t113_s4_c906_evb1_auto]:
      
      

      从以上RTOS的方案中,可以看到有支持t113-i处理器的,也有支持t113_s4处理器的,当前默认是t113_s4_c906_evb1_auto,这个是基于t113_s4处理器的方案。另外,这个方案是可以添加的,如果主板是基于T113I的,可以把t113_i_c906_evb1_auto作为蓝本增加自己方案,如果主板是基于T113-S4的,可以把t113_i_c906_evb1_auto作为蓝本增加自己方案。如何添加方案请看本手册的第六章节。

      3.2.2、单独编译RTOS方案

      执行lunch_rtos进行编译方案选择后,可以通过mrtos_menuconfig进行方案的配置,配置完成后即可通过m或者mrtos指令进行RTOS的编译。

      xxx@xxx:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos$ lunch_rtos
      last=t113_s4_c906_evb1_auto
      
      You're building on Linux
      
      Lunch menu... pick a combo:
           1. t113_i_c906_evb1_auto
           2. t113_s3p_c906_evb1_auto
           3. t113_s3p_c906_evb1_auto_fastboot
           4. t113_s3p_c906_evb1_auto_fastboot_video
           5. t113_s3p_c906_evb1_auto_non_os
           6. t113_s3p_c906_example_demo
           7. t113_s4_c906_evb1_auto
           8. t113_s4_c906_evb1_auto_fastboot_video
           9. t113_s4p_c906_evb1_auto
      
      Which would you like? [Default t113_s4_c906_evb1_auto]: 7
      select=7...
      t113_s4_c906/evb1_auto
      '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto/defconfig' -> '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/.config'
      ============================================
      RTOS_BUILD_TOP=/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos
      RTOS_TARGET_ARCH=riscv
      RTOS_TARGET_CHIP=sun8iw20p1
      RTOS_TARGET_DEVICE=t113_s4_c906
      RTOS_PROJECT_NAME=t113_s4_c906_evb1_auto
      ============================================
      Run mrtos_menuconfig to config rtos
      Run m or mrtos to build rtos
      
      

      以上提示我们通过mrtos_menuconfig可以进行应用的配置,执行结果如下:

      b6e0e6d4-a8f7-4b86-85fc-9e49dc078c0e-image.png

      从配置情况看,和Linux的内核配置比较接近,也是可以配置各种驱动外设,见下图:

      c84cfc5d-79b7-4699-89a1-1bc1e79d3863-image.png

      T113系列拥有双核Cortex-A7核心,也拥有RV64-C906核心,这两个核心使用的外设是共通的,因此选择C906选择外设的时候,要避开Cortex-A7已经使用的外设。例如:Cortex-A7核心已经把PE2/PE3这两个GPIO作为UART来使用,C906就不能再使用PE2/PE3。
      另外,这里要明确的一点是:每个RTOS应用也是有对应的配置文件的,对于t113_s4_c906_evb1_auto这个项目的配置文件在如下目录:

      TinaSDK所在目录/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto/defconfig
      

      配置完成后即可执行m或者mrtos执行进行编译,指令执行结果如下:

      xxx@xxx:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos$ mrtos
      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
        [CONF]   [Tina-RT-Builder] .dbuild/..//include/generated/t113_s4_c906_evb1_aut                                                                                                                                                             o/autoconf.h
        [LDS]    [Linker]          projects/t113_s4_c906/evb1_auto/freertos.lds
        CC       build/t113_s4_c906_evb1_auto/arch/common/version.o
        LD       build/t113_s4_c906_evb1_auto/arch/common/obj-in.o
        LD       build/t113_s4_c906_evb1_auto/arch/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/bu                                                                                                                                                             ild/t113_s4_c906_evb1_auto/img/  ]; then mkdir -p /home/ping/workspace/t113_tina                                                                                                                                                             5.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%
       *[SYMS]   [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.syms
       *[IMAGE]  [Tina-RT-Builder] build/t113_s4_c906_evb1_auto/img/rt_system.bin
         text    data     bss     dec     hex filename
       134576   69048   10472  214096   34450 build/t113_s4_c906_evb1_auto/img/rt_syst                                                                                                                                                             em.elf
      copying /home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/bu                                                                                                                                                             ild/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/t11                                                                                                                                                             3_s4_c906_evb1_auto/img/rt_system.bin' -> '/home/ping/workspace/t113_tina5.0/t11                                                                                                                                                             3_tinasdk5.0-v1/rtos/board/t113_s4_c906/evb1_auto/bin/rtos_riscv_sun8iw20p1.fex'
      ping@embedall:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos$
      
      

      从以上信息我们得到一些信息,编译出来的固件名字是freertos.fex/rtos_riscv_sun8iw20p1.fex,其实两个固件是一样的。固件是编译出来,但是这个固件如何打包到Tina生成的根文件系统中呢?请看下一章。

      3.2.3、在Tina下编译RTOS方案

      在TinaSDK根目录中,先选择好整体平台方案,见如下说明:

      • buildroot方案

      1、首先使用如下命令选择整体平台方案

      ./build.sh config
      

      2、然后RTOS相关操作命令如下

      ./build.sh rtos            #单独编译RTOS方案
      ./build.sh rtos menuconfig #修改RTOS配置文件
      ./build.sh rtos clean	#清除RTOS编译中间文件
      
      

      注意:执行./build.sh不会编译RTOS

      • openwrt方案

      1、首先使用如下命令选择整体平台方案

      source build/envsetup.sh   #生效环境变量
      lunch	#选择openwrt方案
      
      

      2、执行make会先编译RTOS,再编译Tina

      • 快捷命令

      在Tina根目录下,执行了source build/envsetup.sh配置环境后,可使用RTOS快捷命令进行RTOS的配置和编译等。

      20b3f0e3-505c-4e2a-b368-f7b0e9e0b542-image.png

      3.3、RTOS固件打包

      我们以编译openwrt方案为例,在的编译openwrt的过程中,会首先编译RTOS,然后将生成的镜像文件自动拷贝到对应平台方案中,并且rt_system.elf重名为amp_rv0.bin,见如下信息:

      xxx@xxx:~/workspace/t113_tina5.0/t113_tinasdk5.0-v1$ make -j32
      ===There is tina environment.===
       Note: make is the shell functon in envsetup.sh.
      
      == action: openwrt_build, action_args: -j32 ==
      ========ACTION List: build_rtos ;========
      options :
      INFO: build rtos ...
      Setup env done!
      Run lunch_rtos to select project
      last=t113_s4_c906_evb1_auto
      select=t113_s4_c906_evb1_auto...
      t113_s4_c906/evb1_auto
      '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/projects/t113_s4_c906/evb1_auto/defconfig' -> '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/.config'
      ============================================
      RTOS_BUILD_TOP=/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos
      RTOS_TARGET_ARCH=riscv
      RTOS_TARGET_CHIP=sun8iw20p1
      RTOS_TARGET_DEVICE=t113_s4_c906
      RTOS_PROJECT_NAME=t113_s4_c906_evb1_auto
      ============================================
      Run mrtos_menuconfig to config rtos
      Run m or mrtos to build rtos
      build rtos ...
       Dark Builder
       Version (1.6.0 - BiCEP2 (Gravitational Waves))
       *[CC]     [SCRIPT]          build/t113_s4_c906_evb1_auto/img/sys_config.fex
        [CONF]   [Tina-RT-Builder] .dbuild/..//include/generated/t113_s4_c906_evb1_auto/autoconf.h
        [LDS]    [Linker]          projects/t113_s4_c906/evb1_auto/freertos.lds
        CC       build/t113_s4_c906_evb1_auto/arch/common/version.o
        LD       build/t113_s4_c906_evb1_auto/arch/common/obj-in.o
        LD       build/t113_s4_c906_evb1_auto/arch/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.fex'
      '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/build/t113_s4_c906_evb1_auto/img/rt_system.elf' -> '/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/device/config/chips/t113_s4/configs/sbc_t113s4_nand/bin/amp_rv0.bin'
      
      

      然后在Tina环境中打包,确保RTOS编译固件amp_rv0.bin打包到根文件系统中。
      说明:
      1)buildroot需要执行./build.sh&&./build.sh pack命令
      2)openwrt需要执行make&&pack命令
      打包完成后,生产的固件位于tina5.0/out/t113_s4_linux_sbc_t113s4_uart0.img,可以使用PhoenixSuit工具烧录到主板上。

      3.4、RISC-V核启动

      进入主核Linux控制台后,执行如下命令即可完成RV核异构通信框架的初始化:

      echo start>/sys/class/remoteproc/remoteproc1/state
      

      注:T113-S4处理器包括了DSP HIFI核心,也包括了RISC-V核心,因此它应该具备remoteproc0/remoteproc1两个节点(这两个节点在内核的DTS中是可配置的,可以删除任何一个节点)。如果两个节点都在,那么remoteproc0节点是DSP核心,remoteproc1节点是RISC-V核心。

      3.5、RTOS镜像文件更新

      更新RTOS镜像文件的方法有以下两种:
      1、Tina Linux环境下,按照RTOS编译、RTOS固件打包步骤重新编译固件,并烧录进开发板,之后再启动RV核。
      2、通过adb push将新生成的镜像文件amp_rv0.bin推到/lib/firmware目录下,在Linux控制台依执行如下命令:

      echo stop>/sys/class/remoteproc/remoteproc1/state	#关闭RV。
      echo amp_rv0.bin>/sys/class/remoteproc/remoteproc1/firmware
      echo start>/sys/class/remoteproc/remoteproc1/state	#启动RV
      
      
      发布在 T Series
      H
      hahage168
    • 回复: T113开发板双核异构risc-v处理器的使用-基于tina5平台

      2、RTOS SDK目录结构

      rtos
      ├──board	#包含各SoC板级配置目录
      │└──mr527_e906	#mr527_e906板级配置目录
      │└──t113_s3p_c906	#t113_s3p_c906板级配置目录
      │└──t113_s4_c906	#t113_s4_c906板级配置目录
      │└──t113_s4p_c906	#t113_s4p_c906板级配置目录
      │└──XXX	#XXX平台板级配置目录
      ├──envsetup.sh	#SDK环境初始化脚本
      ├──lichee
      │├──dsp	#DSP FreeRTOS系统
      │├──rtos	#C906/E906FreeRTOS系统
      │├──rtos components#FreeRTOS公共组件
      │└──rtos hal	#BSP驱动
      └──tools	#打包相关工具脚本目录
      
      

      所使用RTOS SDK目录结构如上所示,主要包括如下几个关键目录:
      board:板级配置目录,用于存放芯片方案的配置文件,主要包括系统配置文件sys_config.fex等。
      lichee/dsp:存放DSPFreeRTOS系统、组件、应用。
      lichee/rtos:存放E906FreeRTOS系统、组件、应用。
      lichee/rtos components:公共组件目录,lichee/dsp与lichee/rtos都可以使用该组件。
      lichee/rtos hal:BSP驱动目录,用于存放各种驱动代码。对lichee/dsp与lichee/rtos通用。
      tools:工具目录,用于存放编译打包相关的脚本、工具等。
      下面对lichee/rtos、lichee/rtos hal目录进行详细说明。lichee/dsp目录与lichee/rtos目录类似,此处不做介绍。

      2.1、lichee/rtos目录

      ├──arch	#处理器架构相关
      ├──build	#编译临时文件输出目录
      ├──components	#组件
      ├──drivers#驱动
      ├──include#头文件
      ├──kernel#FreeRTOS内核#方案工程
      ├──projects
      ├──scripts
      └──tools#工具链
      
      

      lichee/rtos目录主要包括arch(架构相关)、components(组件)、drivers(驱动)、include(头文件)、kernel(内核)、projects(工程)、toos(工具链)等目录,下面对常用重要目录分别进行介绍。

      2.1.1、arch目录

      arch目录主要放置跟SoC架构相关的内容,每个SoC单独目录管理,主要包括跟risc v架构相关的ARCH初始化、中断处理、异常处理、内存映射相关功能的实现。

      lichee/rtos/arch/
      ├──common
      └──risc v
      ├──arch.mk
      ├──c906
      ├──common
      ├──e906
      ├──includes
      ├──Kconfig
      ├──Makefile
      ├──sun55iw3p1
      └──sun8iw20p1
      
      

      2.1.2、components目录

      components 目录包含 allwinner 和第三方的组件。

      lichee/rtos/components/
      ├──aw
      │├──blkpart
      │├──bluetooth
      │├──csi
      │├──devfs
      │├──healthd
      │├──......
      │├──watchpoint
      │└──wireless_video
      ├──common >../../rtos components
      └──thirdparty
      ├──common
      ├──console
      ├──cplusplus
      ├──elmfat
      ├──finsh_cli
      ├──......
      └──vfs
      
      

      2.1.3、drivers目录

      drivers目录包含所需的外设驱动,主要包括各外设控制器驱动的具体实现(hal软连接)以及OSAL层接口(osal)。

      lichee/rtos/drivers/
      ├──drv
      ├─ CPUfreq	#POSIX头文件
      ├──leds
      ├── uart
      ├──.....
      ├── wireless
      ├─hal ->.../../rtos-hal/
      └──osal
      
      

      2.1.4、include 目录

      include 目录统一管理各模块提供的数据结构定义及函数声明。

      lichee/rtos/include/ 
      ├── arch 
      # 架构相关头文件 
      ├── FreeRTOS_POSIX # POSIX头文件 
      ├── ...... 
      └── vsprintf.h
      
      

      2.1.5、kernel目录

      kernel目录主要包含FreeRTOS的kernel源码,全志实现的系统功能相关代码。

      lichee/rtos/kernel/
      ├──FreeRTOS orig
      │└──Source
      └──Posix
      

      2.1.6 projects 目录

      projects目录下的每一个子目录代表一个project,实现main入口,选择不同的project编译出来的bin具有不同功能,每个project有独立的FreeRTOSConfig配置。例如t113-s4,其对应于t113_s4_c906子目录,这个子目录下面根据应用的不同建立不同的应用配置,如下有evb1_auto应用和evb1_auto_fastboot_video应用。

      rtos/lichee/rtos/projects/t113_s4_c906/
      ├── evb1_auto
      │   ├── defconfig
      │   ├── defconfig_org
      │   ├── freertos.lds.S
      │   ├── Kconfig
      │   ├── Makefile
      │   └── src
      │       ├── alsa_config.c
      │       ├── assert.c
      │       ├── card_default.c
      │       ├── FreeRTOSConfig.h
      │       ├── hooks.c
      │       └── main.c
      ├── evb1_auto_fastboot_video
      │   ├── defconfig
      │   ├── freertos.lds.S
      │   ├── Kconfig
      │   ├── Makefile
      │   └── src
      │       ├── alsa_config.c
      │       ├── assert.c
      │       ├── card_default.c
      │       ├── FreeRTOSConfig.h
      │       ├── hooks.c
      │       └── main.c
      └── Makefile
      
      

      2.1.7、tools目录

      这个目录主要包含一些预编译好的交叉编译工具链。

      xxx@xxx:lichee/rtos/tools$ ls -al
      total 663248
      drwxrwxr-x  3 ping ping      4096 Oct 21 14:28 .
      drwxrwxr-x 13 ping ping      4096 Oct 21 16:02 ..
      -rw-rw-r--  1 ping ping 103333888 Jan  8  2024 gcc-arm-melis-eabi-8-2019-q3-update-linux.tar.bz2
      -rw-rw-r--  1 ping ping 106566166 Jan  8  2024 gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
      -rwxrwxr-x  1 ping ping 137020992 Jan  8  2024 gcc-arm-none-eabi-8-2019-q3-update-win32.zip
      drwxr-xr-x  9 ping ping      4096 Oct 21 14:29 riscv64-elf-x86_64-20201104
      -rwxrwxr-x  1 ping ping 164604965 Jan  8  2024 riscv64-elf-x86_64-20201104.tar.gz
      -rwxrwxr-x  1 ping ping 167614189 Jan  8  2024 Xuantie-900-gcc-elf-newlib-mingw-V2.6.1-20220906.tar.gz
      xxx@xxx:lichee/rtos/tools$
      
      

      目前risc v基于GCC8.4.0的交叉编译器。

      xxx@xxx:lichee/rtos/tools$./riscv64-elf-x86_64-20201104/bin/riscv64-unknown-elf-gcc -v
      Using built-in specs.
      COLLECT_GCC=./riscv64-elf-x86_64-20201104/bin/riscv64-unknown-elf-gcc
      COLLECT_LTO_WRAPPER=/home/ping/workspace/t113_tina5.0/t113_tinasdk5.0-v1/rtos/lichee/rtos/tools/riscv64-elf-x86_64-20201104/bin/../libexec/gcc/riscv64-unknown-elf/8.4.0/lto-wrapper
      Target: riscv64-unknown-elf
      Configured with: /ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/build/../source/riscv/riscv-gcc/configure --target=riscv64-unknown-elf --with-mpc=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/lib-for-gcc-x86_64-linux/ --with-mpfr=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/lib-for-gcc-x86_64-linux/ --with-gmp=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/lib-for-gcc-x86_64-linux/ --prefix=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/install --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --enable-libgcctf --with-newlib --with-sysroot=/ldhome/software/toolsbuild/slave/workspace/riscv64_build_elf_x86_64/install/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../source/riscv/riscv-gcc --with-pkgversion='T-HEAD RISCV Tools V1.10.2 B20201104' --enable-multilib --with-abi=lp64d --with-arch=rv64gcxthead 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medany' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medany' CC=gcc CXX=g++
      Thread model: single
      gcc version 8.4.0 (T-HEAD RISCV Tools V1.10.2 B20201104)
       
      

      2.2、lichee/rtos hal目录

      lichee/rtos hal目录为BSP驱动目录,用于存放各种驱动代码。lichee/rtos/drivers目录下的rtos hal子目录软链接到该目录,下面对该目录进行介绍。

      lichee/rtos hal
      ├──hal	#BSP驱动代码
      ├──include	#驱动相关头文件
      └──tools
      

      lichee/rtos hal目录主要包括hal(BSP驱动代码)、include(驱动相关头文件)等目录,下面分别对其进行介绍。

      2.2.1、hal目录

      hal目录主要包含各外设驱动代码以及驱动测试代码,source子目录为驱动代码,test子目录为驱动测试代码

      lichee/rtos hal/hal
      ├──Makefile
      ├──source
      │├──ccmu
      │├──gpio
      │├──......
      │├──uart
      │└──watchdog
      └──test
      ├──ccmu
      ├──gpio
      ├──......
      ├──uart
      └──watchdog
      

      2.2.2、include目录

      include目录主要包含驱动相关头文件以及系统相关接口头文件。

      lichee/rtos hal/include
      ├──hal
      │├──aw alsa lib
      │├──aw_common.h
      │├──......
      │├──sunxi_hal_usb.h
      │├──sunxi_hal_watchdog.h
      │└──video
      └──osal
      ├──hal_atomic.h
      ├──hal_cache.h
      ├──......
      ├──hal_waitqueue.h
      └──hal_workqueue.h
      
      
      发布在 T Series
      H
      hahage168
    • T113开发板双核异构risc-v处理器的使用-基于tina5平台

      全志T113-i是一款双核Cortex-A7国产工业级处理器平台,并内置玄铁C906 RISC-V和HiFi4 DSP双副核心,可流畅运行Linux系统与Qt界面,并已适配OpenWRT系统、Preempt Linux系统。
      而其中的RISC-V属于超高能效副核心,标配内存管理单元,可运行RTOS或裸机程序。T113的主核运行Linux(Openwrt或者Preempt Linux)进行人机界面的交互和应用流程,而RISC-V则是后台
      英雄,可进行大数据数据采集,或者相关编码器的控制等,降低主核被中断的次数,大大提供了主核的运行效率。那么到底这个双核异构怎么用呢?今天盈鹏飞嵌入式就与你分享。

      以盈鹏飞嵌入式SBC-T113主板为例(以T113-i为主控的主板),我们先介绍下主板特性:

      产品特性

      • 采用Allwinner公司Cortex-A7双核T113-i处理器,运行最高速度为1.2GHZ;

      • 列表内置64-bit XuanTie C906 RISC-V协处理器;

      • 列表支持JPEG/MJPEG视频编码,最大分辨率1080p@60fps;支持多格式1080P@60fps视频解码 (H.265,H.264, MPEG-1/2/4);

      • 列表支持双通道LVDS/MIPI-DSI,分辨率最高1920x1080;

      • 列表支持512-1G Bytes DDR3 SDRAM;

      • 列表支持SPI NAND存储和启动(默认:256MB;可选128MB)或者EMMC启动(默认:4GB,最大32GB);

      • 列表支持四路USB2.0 HOST;

      • 列表支持六路RS232通信;

      • 列表支持双路CAN BUS通信(隔离);

      • 列表支持双路以太网,一路10/100M;一路10/100/1000M;

      • 列表稳定的操作系统的支持,可预装Ubuntu20.04/LINUX 5.4 Preempt/Tina5.0;

      • 列表标准3.5寸主板, 尺寸为:146*102MM;

      SBC-T113产品功能图:

      SBC-T113.png

      1、RTOS系统概述

      1.1、概述

      全志Tina Linux SDK中包含了RTOS系统,该系统是基于FreeRTOS内核的软件开发包,包含了系统开发用到的内核源码、驱动、工具、组件与应用程序包。通过Makefile脚本和Kconfig配置文件,使得用户可以通过menuconfig进行个性化裁减,编译出一个可以直接烧写到机器上运行的RTOS系统软件。

      1.2、系统框图

      e28014db-faf1-40b1-8aee-4c82580cf06e-image.png

      RTOS 系统框图如图所示,仅从软件的角度来看,从下至上分为内核层、组件层、应用层三个层次。各层次主要内容如下:

      • Kernel:内核层包括 FreeRTOS核心系统、文件系统、网络系统、BSP驱动等。

      • Component:组件层包括控制台、多媒体、功耗管理、OTA、音频系统、显示系统、图像采集等。

      • APP:应用层包括各种应用 demo。

      发布在 T Series
      H
      hahage168
    • 回复: T113开发板TINA5平台TVIN接口的测试(使用trecorderdemo)

      配置trecorderdemo

      trecorderdemo要想正确运行,必须先进行配置,配置文件是recorder.cfg,它位于/etc/目录下。

      • 修改recorder.cfg
      ;-------------------------------------------------------------------------------
      number_of_camera = 2
      screen_width = 1024
      screen_height = 600
      camera_id = 0
      ;-------------------------------------------------------------------------------
      ; 3 for cvbs sensor
      ; 2 for usb sensor
      ; 1 for raw sensor (need isp)
      ; 0 for yuv sensor
      ;-------------------------------------------------------------------------------
      camera_type = 3
      
      video_enable = 1
      video_width = 720
      video_height = 480
      video_framerate = 30
      video_format = YUV420SP
      video_memory = MMAP
      video_rotation = 0
      video_use_wm = 0
      video_wm_pos_x = 0
      video_wm_pos_y = 0
      ;-------------------------------------------------------------------------------
      ; scale down need isp
      ;-------------------------------------------------------------------------------
      video_scale_down_enable = 0
      video_sub_width =
      video_sub_height =
      video_buf_num = 3
      
      audio_enable = 0
      audio_format = PCM
      audio_channels = 2
      audio_samplerate = 8000
      audio_samplebits = 16
      audio_bitrate = 128000
      
      display_enable = 1
      display_rect_x = 0
      display_rect_y = 0
      display_rect_width = 720
      display_rect_height = 480
      ;-------------------------------------------------------------------------------
      ; 0 ZORDER_TOP
      ; 1 ZORDER_MIDDLE
      ; 2 ZORDER_BOTTOM
      ;-------------------------------------------------------------------------------
      display_zorder = 0 
      ;-------------------------------------------------------------------------------
      ; 0 ROTATION_ANGLE_0
      ; 1 ROTATION_ANGLE_90
      ; 2 ROTATION_ANGLE_180
      ; 3 ROTATION_ANGLE_270
      ;-------------------------------------------------------------------------------
      display_rotation = 0
      
      

      主要修改如下:

      8ccee726-9ce2-4eee-8d59-f92e6e69251b-image.png

      画红框的参数说明如下:

      • screen_width = 1024/screen_height = 600,表示显示屏的参数,比如演示时的屏幕分辨率是1024x600。

      • camera_id = 0,这个参数很重要。务必是0。trecorderdemo程序不是专门为tvin演示编写的,而是为主板可以接的各种camera,例如符合UVC协议的usb camera等。trecorderdemo程序中只能显示两路camera,一路是/dev/video0,另外一路是/dev/video1,在程序中分别对应的是front camera,另外一个对应的是back camera,见下图:

      root@TinaLinux:/dev# trecorderdemo --help
      ****************************************************************************
      * This program shows how to test trecorder
      ****************************************************************************
      ****************************************************************************
      * trecorderdemo 0: front channel recorder test
      * trecorderdemo 1: rear channel recorder test
      * trecorderdemo 2: front and rear two channel recorder test
      * trecorderdemo audio X: audio X recording test(X = 0/1)
      ***************************************************************************
      root@TinaLinux:/dev# trecorderdemo --help
      ****************************************************************************
      * This program shows how to test trecorder
      ****************************************************************************
      ****************************************************************************
      * trecorderdemo 0: front channel recorder test
      * trecorderdemo 1: rear channel recorder test
      * trecorderdemo 2: front and rear two channel recorder test
      * trecorderdemo audio X: audio X recording test(X = 0/1)
      ***************************************************************************
      root@TinaLinux:/dev# trecorderdemo --help
      ****************************************************************************
      * This program shows how to test trecorder
      ****************************************************************************
      ****************************************************************************
      * trecorderdemo 0: front channel recorder test
      * trecorderdemo 1: rear channel recorder test
      * trecorderdemo 2: front and rear two channel recorder test
      * trecorderdemo audio X: audio X recording test(X = 0/1)
      ***************************************************************************
      root@TinaLinux:/dev# trecorderdemo --help
      ****************************************************************************
      * This program shows how to test trecorder
      ****************************************************************************
      ****************************************************************************
      * trecorderdemo 0: front channel recorder test
      * trecorderdemo 1: rear channel recorder test
      * trecorderdemo 2: front and rear two channel recorder test
      * trecorderdemo audio X: audio X recording test(X = 0/1)
      ***************************************************************************
      root@TinaLinux:/dev# trecorderdemo --help
      ****************************************************************************
      * This program shows how to test trecorder
      ****************************************************************************
      ****************************************************************************
      * trecorderdemo 0: front channel recorder test
      * trecorderdemo 1: rear channel recorder test
      * trecorderdemo 2: front and rear two channel recorder test
      * trecorderdemo audio X: audio X recording test(X = 0/1)
      
      
      • 列表camera_type,这个参数是确认摄像头的类型,如果是T113的TVIN接口的摄像头,选择3(cvbs sensor);如果是USB接口的摄像头,选择2(usb sensor);如果是处理器内部带了ISP了,那么一般会使用raw sensor,这个时候选择1。

      • 列表video_width/video_height,这两个参数是明确视频的分辨率,本次测试的摄像头是NTSC格式的,那么它的分辨率是720x480。

      • 列表video_format=YUV420SP,在用camerademo调试摄像头的时候,会给出这个参数。对应的是output_fmt=YUV420;

      • 列表display_rect_width/display_rect_height,这两个参数表示在屏幕上显示时的视频框的大小。我们一般会设置和video_width/video_height一样。

      trecorderdemo演示

      演示时,务必把摄像头先接好,如果未接摄像头,程序会处于假死状态,因为无法识别到摄像头。执行trecorderdemo前,务必先执行fbinit进行清屏。具体演示步骤如下:

      fbinit
      trecorderdemo 0
      
      

      以下截取部分执行日志信息:

      root@TinaLinux:/mnt/SDCARD# ./fbinit
      fbinit test version:V2.0.20220506
      ================Usage================
      /fbinitmeans:clean /dev/fb0
      /fbinit 0         means:clean /dev/fb0
      /fbinit 1         means:clean /dev/fb1
      /fbinit 2         means:clean /dev/fb2
      ================usage================
      cleanning /dev/fb0 ...
      clean /dev/fb0 finish
      root@TinaLinux:/mnt/SDCARD# trecorderdemo  0
      ****************************************************************************
      * This program shows how to test trecorder
      ****************************************************************************
      ▒_▒h:ii
      
      >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>tina_multimedia<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      tag   : tina3.5
      branch: tina-dev
      date  : Mon Jul 15 19:04:59 2019 +0800
      Change-Id: I5f6c8a88d7b387a312b7744797a0d5f8ab07ee7a
      -------------------------------------------------------------------------------
      [  126.503419] [tvd] vidioc_s_fmt_vid_cap:1623
      [  126.503419] interface=0
      [  126.503419] system=NTSC
      [  126.503419] format=0
      [  126.503419] output_fmt=YUV420
      [  126.519441] [tvd] vidioc_s_fmt_vid_cap:1627
      [  126.519441] row=1
      [  126.519441] column=1
      [  126.519441] ch[0]=0
      [  126.519441] ch[1]=0
      [  126.519441] ch[2]=0
      [  126.519441] ch[3]=0
      [  126.538190] [tvd] vidioc_s_fmt_vid_cap:1629
      [  126.538190] width=720
      [  126.538190] height=480
      [  126.538190] dev->sel=0
      [  126.551055] [tvd] tvd_cagc_and_3d_config:1481 tvd0 agc auto mode
      [  126.557990] [tvd] tvd_cagc_and_3d_config:1490 tvd0 CAGC enable:0x1
      [  126.567569] [tvd] tvd_cagc_and_3d_config:1517 tvd0 3d enable :0x4f900000
      [  126.596333] [tvd] vidioc_streamon:1712 Out vidioc_streamon:0
      [  126.596367] VE: enable hw clock
      [  126.606308] enable_cedar_hw_clk,563
      ---------------------------------------------------------------------------------------------
                    | Preview Status | Preview Size | Audio Status | Water Mark | Recorder Status |
      ---------------------------------------------------------------------------------------------
      front   |     enable     |    full      |    normal    |   disable  |      stop       |
      ---------------------------------------------------------------------------------------------
      rear    |                |              |              |            |                 |
      ---------------------------------------------------------------------------------------------
      
      RecorderCmd#
      
      

      屏幕显示如下:

      c4a45643-4534-4f6c-804c-6e29850111b1-image.png

      trecorderdemo功能强大,它整合了视频预览,录制音视频等功能,目前只实现了预览功能,其他功能待验证。

      发布在 其它全志芯片讨论区
      H
      hahage168
    • 回复: T113开发板TINA5平台TVIN接口的测试(使用trecorderdemo)

      通过camerademo判断摄像头的属性

      camerademo程序可以用来对摄像头视频进行截图,也可以用来对摄像头进行调试。当使用它进行摄像头调试的时候,务必是针对/dev/video0设备。我们先看看它的帮助说明,执行camerademo–help指令如下:

      root@TinaLinux:/dev# camerademo --help
      [CAMERA]**********************************************************
      [CAMERA]*                                                        *
      [CAMERA]*              this is camera test.                      *
      [CAMERA]*                                                        *
      [CAMERA]**********************************************************
      [CAMERA]******************** camerademo help *********************
      [CAMERA] This program is a test camera.
      [CAMERA] It will query the sensor to support the resolution, output format and test frame rate.
      [CAMERA] At the same time you can modify the data to save the path and get the number of photos.
      [CAMERA] When the last parameter is debug, the output will be more detailed information
      [CAMERA] There are eight ways to run:
      [CAMERA]    1.camerademo --- use the default parameters.
      [CAMERA]    2.camerademo debug --- use the default parameters and output debug information.
      [CAMERA]    3.camerademo setting --- can choose the resolution and data format.
      [CAMERA]    4.camerademo setting debug --- setting and output debug information.
      [CAMERA]    5.camerademo NV21 640 480 30 bmp /tmp 5 --- param input mode,can save bmp or yuv.
      [CAMERA]    6.camerademo NV21 640 480 30 bmp /tmp 5 debug --- output debug information.
      [CAMERA]    7.camerademo NV21 640 480 30 bmp /tmp 5 Num --- /dev/videoNumparam input mode,can save bmp or yuv.
      [CAMERA]    8.camerademo NV21 640 480 30 bmp /tmp 5 Num debug --- /dev/videoNum output debug information.
      [CAMERA]    8.camerademo NV21 640 480 30 bmp /tmp 5 Num 1 --- 1/2: chose memory: V4L2_MEMORY_MMAP/USERPTR
      [CAMERA]**********************************************************
      root@TinaLinux:/dev#
      
      

      通过以上提示,可以看到该程序可以进行摄像头的配置、调试、以及截图。正常来说,截图正常就证明摄像头工作正常。
      为了做TVIN摄像头的调试,我们务必先要执行指令:ln–sf /dev/video4 /dev/video0,因为camerademo程序做调试的时候,只能针对video0;

      root@TinaLinux:/dev# camerademo debug
      [CAMERA]**********************************************************
      [CAMERA]*                                                        *
      [CAMERA]*              this is camera test.                      *
      [CAMERA]*                                                        *
      [CAMERA]**********************************************************
      [CAMERA]**********************************************************
      [CAMERA] open /dev/video0!
      [CAMERA]**********************************************************
      [CAMERA_DEBUG] Querey device capabilities succeed
      [CAMERA_DEBUG] cap.driver=sunxi-tvd
      [CAMERA_DEBUG] cap.card=sunxi-tvd
      [CAMERA_DEBUG] cap.bus_info=tvd_v4l2_dev0
      [CAMERA_DEBUG] cap.version=0x00010000
      [CAMERA_DEBUG] cap.capabilities=0x85200001
      [CAMERA]**********************************************************
      [CAMERA] The path to data saving is /tmp.
      [CAMERA] The number of captured photos is 5.
      [CAMERA] save bmp format
      [CAMERA_DEBUG]**********************************************************
      [CAMERA_DEBUG] enumerate image formats
      [CAMERA_DEBUG] format index = 0, name = NV12
      [CAMERA_DEBUG] format index = 1, name = NV21
      [CAMERA_DEBUG] format index = 2, name = NV16
      [CAMERA_DEBUG] format index = 3, name = NV61
      [CAMERA_DEBUG]*********************************************************
      [CAMERA_DEBUG] The sensor supports the following formats :
      [CAMERA_DEBUG] Index 0 : NV12.
      [CAMERA_DEBUG] Index 1 : NV21.
      [CAMERA_DEBUG] Index 2 : NV16.
      [CAMERA_DEBUG] Index 3 : NV61.
      [   69.731859] [tvd] vidioc_s_fmt_vid_cap:1623
      [   69.731859] interface=0
      [   69.731859] system=NTSC
      [   69.731859] format=0
      [   69.731859] output_fmt=YUV420
      [CAMERA_DEBUG]**********************************************************
      [CAMERA_DEBUG] The NV12 supports the following resolut[   69.750104] [tvd] vidioc_s_fmt_vid_cap:1627
      [   69.750104] row=1
      [   69.750104] column=1
      [   69.750104] ch[0]=0
      [   69.750104] ch[1]=0
      [   69.750104] ch[2]=0
      [   69.750104] ch[3]=0
      ions:
      [CAMERA_DEBUG] Index 0 : 720 * 480
      [CAMERA_DEBUG] Index 1 : 720 * 576
      [CAMERA_DEBUG]***********************************[   69.779945] [tvd] vidioc_s_fmt_vid_cap:1629
      [   69.779945] width=720
      [   69.779945] height=480
      [   69.779945] dev->sel=0
      ***********************
      [CAMERA_DEBUG] The NV21 supports the following resolutions:
      [CAMERA_DEBUG] Index 0 : 720 * 480
      [CAMER[   69.803870] [tvd] tvd_cagc_and_3d_config:1481 tvd0 agc auto mode
      A_DEBUG] Index 1 : 720 * 576
      [CAMERA_DEBUG]**********************************************************
      [CAMERA_DEBUG] The NV16 [   69.821636] [tvd] tvd_cagc_and_3d_config:1490 tvd0 CAGC enable:0x1
      supports the following resolutions:
      [CAMERA_DEBUG] Index 0 : 720 * 480
      [CAMERA_DEBUG] Index 1 : 720 * 576
      [CAMERA_DEBUG]*****[   69.843758] [tvd] tvd_cagc_and_3d_config:1517 tvd0 3d enable :0x4f900000
      *****************************************************
      [CAMERA_DEBUG] The NV61 supports the following resolutions:
      [CAMERA_DEBU[   69.860018] [tvd] vidioc_streamon:1712 Out vidioc_streamon:0
      G] Index 0 : 720 * 480
      [CAMERA_DEBUG] Index 1 : 720 * 576
      [CAMERA]**********************************************************
      [CAMERA] Using format parameters NV21.
      [CAMERA_ERR] sensor not support 640 * 480
      [CAMERA] use support for the first resolution
      [CAMERA] camera pixelformat: NV21
      [CAMERA] Resolution size : 720 * 480
      [CAMERA] The photo save path is /tmp.
      [CAMERA] The number of photos taken is 5.
      beginion_alloc_open
      pid: 1543, g_alloc_context = 0xc97158
      [CAMERA] Camera captur[   69.914962] [tvd] tvd_isr:810 In tvd_isr
      eframerate is 0/0
      [CAMERA] VIDIOC_S_FMT succeed
      [CAMERA] fmt.type = 1
      [CAMERA] fmt.fmt.pix.width = 720
      [CAMERA] fmt.fmt.pix.height = 480
      [CAMERA] fmt.fmt.pix.pixelformat = NV21
      [CAMERA] fmt.fmt.pix.field = 1
      [CAMERA_DEBUG] reqbuf number is 3
      [CAMERA_DEBUG] map buffer index: 0, mem: 0xb6d27000, len: 7e900, offset: 0
      [CAMERA_DEBUG] map buffer index: 1, mem: 0xb6ca8000, len: 7e900, offset: 7f000
      [CAMERA_DEBUG] map buffer index: 2, mem: 0xb6c29000, len: 7e900, offset: fe000
      [CAMERA] stream on succeed
      [CAMERA] camera0 capture num is [0]
      [CAMERA_DEBUG]*****DQBUF[0] FINISH*****
      [CAMERA_PROMPT] the time interval from the start to the first frame is 73 ms
      [CAMERA_DEBUG] the interval of two frames is 0 ms
      [CAMERA_DEBUG]************QBUF[0] FINISH**************
      [CAMERA] camera0 capture num is [1]
      [CAMERA_DEBUG]*****DQBUF[1] FINISH*****
      [CAMERA_DEBUG] the interval of two frames is 161 ms
      [CAMERA_DEBUG]************QBUF[1] FINISH**************
      [CAMERA] camera0 capture num is [2]
      [CAMERA_DEBUG]*****DQBUF[2] FINISH*****
      [CAMERA_DEBUG] the interval of two frames is 161 ms
      [CAMERA_DEBUG]************QBUF[2] FINISH**************
      [CAMERA] camera0 capture num is [3]
      [CAMERA_DEBUG]*****DQBUF[0] FINISH*****
      [CAMERA_DEBUG] the interval of two frames is 162 ms
      [CAMERA_DEBUG]************QBUF[0] FINISH**************
      [CAMERA] camera0 capture num is [4]
      [CAMERA_DEBUG]*****DQBUF[1] FINISH*****
      [CAMERA_DEBUG] the interval of two frames is 161 ms
      [CAMERA_DEBUG]************QBUF[1] FINISH**************
      [CAMERA] Capture thread finish
      [CAMERA_DEBUG]***************************************************************
      [CAMERA_DEBUG] Query the actual frame rate.
      [CAMERA_DEBUG] camera fps = 31.2.
      [   72.853618] [tvd] vidioc_s_fmt_vid_cap:1623
      [   72.853618] interface=0
      [   72.853618] system=NTSC
      [   72.853618] format=0
      [   72.853618] output_fmt=YUV420
      [CAMERA_DEBUG]***************************************************************
      [CAMERA] close /dev/video0
      ion_alloc_close
      pid[   72.870400] [tvd] vidioc_s_fmt_vid_cap:1627
      [   72.870400] row=1
      [   72.870400] column=1
      [   72.870400] ch[0]=0
      [   72.870400] ch[1]=0
      [   72.870400] ch[2]=0
      [   72.870400] ch[3]=0
      : 1543, release g_alloc_context = 0xc97158
      [CAMERA_DEBUG]***************************************************************
      [CAM[   72.900202] [tvd] vidioc_s_fmt_vid_cap:1629
      [   72.900202] width=720
      [   72.900202] height=480
      [   72.900202] dev->sel=0
      ERA_DEBUG] Performance Testing---format:NV21 size:720 * 480
      [   72.924121] [tvd] tvd_cagc_and_3d_config:1481 tvd0 agc auto mode
      [   72.936083] [tvd] tvd_cagc_and_3d_config:1490 tvd0 CAGC enable:0x1
      [   72.945822] [tvd] tvd_cagc_and_3d_config:1517 tvd0 3d enable :0x4f900000
      [   72.954767] [tvd] vidioc_streamon:1712 Out vidioc_streamon:0
      [CAMERA_DEBUG] The interval from open to streaming is 148 ms.
      [CAMERA_DEBUG]***************************************************************
      root@TinaLinux:/dev#
      
      

      通过该信息分析,该摄像头是NTSC制式,分辨率是720x480,另外,它输出的格式是YUV420,这个信息为我们配置trecorderdemo提供的重点技术支撑。
      camerademo也可以进行摄像头的视频截图,对于TVIN来说,指令如下:

      camerademo NV21 720 480 30 bmp /tmp 5 4
      

      最后一个数字4表示使用/dev/video4。截图后图片正常表示硬件和驱动正常。

      发布在 其它全志芯片讨论区
      H
      hahage168