导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页
    1. 主页
    2. q1215200171
    3. 最佳
    • 资料
    • 关注 0
    • 粉丝 36
    • 我的积分 27591
    • 主题 319
    • 帖子 512
    • 最佳 159
    • 群组 1

    q1215200171 发布的最佳帖子

    • 全志在线开源芯片 新 SDK 平台下载方法汇总

      1、新 SDK 平台下载 D1-H/D1s SDK

      2、新 SDK 平台 SDK

      3、新 SDK 平台下载 R329 SDK

      4、新 SDK 平台下载 MR813 SDK

      5、新 SDK 平台下载 XR806 SDK

      注意!!!

      注意!!!

      在拉取任意一种SDK前,都需要【达到2级】且需要【先配置安装 Repo 工具】!!!

      -> -> ->论坛升级LV2获取下载权限专用水帖 LV2 UPUPUP <- <- <- 回复该贴【两条】评论后请耐心等待管理员审核

      GIT配置具体步骤如下

      SDK 使用 Repo 工具管理,拉取 SDK 需要配置安装 Repo 工具。

      Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workflow. Repo is not meant to replace Git, only to make it easier to work with Git. The repo command is an executable Python script that you can put anywhere in your path.

      Repo官网:git-repo

      安装 Repo 工具

      可以用包管理器进行安装:

      # Debian/Ubuntu.
      $ sudo apt-get install repo
      
      # Gentoo.
      $ sudo emerge dev-vcs/repo
      

      也可以手动单独安装:

      $ mkdir -p ~/.bin
      $ PATH="${HOME}/.bin:${PATH}"
      $ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
      $ chmod a+rx ~/.bin/repo
      

      国内镜像源安装:

      $ mkdir -p ~/.bin
      $ PATH="${HOME}/.bin:${PATH}"
      $ curl https://mirrors.bfsu.edu.cn/git/git-repo > ~/.bin/repo
      $ chmod a+rx ~/.bin/repo
      

      由于谷歌服务器位于国外,每次运行时Repo会检查更新导致下载较慢,国内用户可以配置镜像源。否则会像下图一样卡住不动然后失败。

      8d60364e-7c3d-42a9-88e8-40778344fee1-image.png

      更换镜像源

      Repo 的运行过程中会尝试访问官方的 git 源更新自己,更换镜像源可以提高下载速度。将如下内容复制到你的~/.bashrc 里

      $ echo export REPO_URL='https://mirrors.bfsu.edu.cn/git/git-repo' >> ~/.bashrc
      $ source ~/.bashrc
      

      如果您使用的是 dash、hash、 zsh 等 shell,请参照 shell 的文档配置。

      配置保存身份认证

      新版本 git 默认加强了安全性,身份认证不会保存,导致拉取 repo 需要多次输入密码,可以用下列命令配置:

      git config --global credential.helper store
      

      20c115a9-6a4c-40cc-8b35-9d70bc65974e-image.png

      常见问题

      • 卡在Downloading Repo source from https://gerrit.googlesource.com/git-repo 不动。

        • 国内网络较慢,参照上面的更换镜像源解决。
      • 配置保存身份认证无效不启用

        • 检查是否运行了 sudo git config --global credential.helper store 使用了 sudo 后保存的信息会存储到 root 用户下并非当前用户。
      • 出现错误 fatal: cannot make directory: File exists

        • 之前拉取了 repo 但是不完整,需要删除 .repo 文件夹重新拉取
      发布在 代码下载问题专区
      q1215200171
      budbool
    • 回复: 全志在线开源芯片 新 SDK 平台下载方法汇总

      D1-H/D1s SDK 拉取

      以 tina-d1-h 为例,讲述如何拉取 SDK。

      新建文件夹保存 SDK

      使用 mkdir 命令新建文件夹,保存之后需要拉取的 SDK,然后 cd 进入到刚才新建的文件夹中。

      $ mkdir tina-d1-h
      $ cd tina-d1-h
      

      初始化 Repo 仓库

      使用 repo init 命令初始化仓库,tina-d1-h 的仓库地址是 https://sdk.aw-ol.com/git_repo/D1_Tina_Open/manifest.git 需要执行命令:

      $ repo init -u https://sdk.aw-ol.com/git_repo/D1_Tina_Open/manifest.git -b master -m tina-d1-h.xml
      

      如果提示 Username for 'https://sdk.aw-ol.com': 请输入 全志在线开发者论坛 的用户名和密码。(注:需要全志在线开发者论坛LV2等级以上用户才有权限拉取 SDK)

      拉取 SDK

      使用命令 repo sync 拉取 SDK

      $ repo sync
      

      由于 SDK 普遍较大,拉取可能需要一定的时间。

      创建开发环境

      使用命令 repo start 创建开发环境分支

      $ repo start product-smartx-d1-h-tina-stable-v2.0 --all
      

      至此,SDK 获取完毕。

      发布在 代码下载问题专区
      q1215200171
      budbool
    • 回复: 全志在线开源芯片 新 SDK 平台下载方法汇总

      V853 SDK 拉取

      以 tina-v853-open 为例,讲述如何拉取 SDK。

      新建文件夹保存 SDK

      使用 mkdir 命令新建文件夹,保存之后需要拉取的 SDK,然后 cd 进入到刚才新建的文件夹中。

      $ mkdir tina-v853-open
      $ cd tina-v853-open
      

      初始化 Repo 仓库

      使用 repo init 命令初始化仓库,tina-d1-h 的仓库地址是 https://sdk.aw-ol.com/git_repo/V853Tina_Open/manifest.git 需要执行命令:

      $ repo init -u https://sdk.aw-ol.com/git_repo/V853Tina_Open/manifest.git -b master -m tina-v853-open.xml
      

      如果提示 Username for 'https://sdk.aw-ol.com': 请输入 全志在线开发者论坛 的用户名和密码。(注:需要全志在线开发者论坛LV2等级以上用户才有权限拉取 SDK)

      LV2 升级需要 49积分,获取积分方法如下:

      ① 1次主题帖发布(发帖):50积分
      ② 1次有效回帖:25积分
      ③ 1次点赞:6积分
      ④ 每日登录:6积分

      拉取 SDK

      使用命令 repo sync 拉取 SDK

      $ repo sync
      

      由于 SDK 普遍较大,拉取可能需要一定的时间。

      创建开发环境

      使用命令 repo start 创建开发环境分支

      $ repo start devboard-v853-tina-for-awol --all
      

      至此,SDK 获取完毕。

      通过此方式下载的V853 SDK在打上补丁后同样适用于V851s/V851se

      具体实现方式步骤可以参考:https://bbs.aw-ol.com/topic/2513/

      发布在 代码下载问题专区
      q1215200171
      budbool
    • 回复: 全志在线开源芯片 新 SDK 平台下载方法汇总

      R329 SDK 拉取

      以 R329-Tina-jishu 为例,讲述如何拉取 SDK。

      新建文件夹保存 SDK

      使用 mkdir 命令新建文件夹,保存之后需要拉取的 SDK,然后 cd 进入到刚才新建的文件夹中。

      $ mkdir R329-Tina-jishu
      $ cd R329-Tina-jishu
      

      初始化 Repo 仓库

      使用 repo init 命令初始化仓库,R329-Tina-jishu 的仓库地址是 https://sdk.aw-ol.com/git_repo/R329_Tina_jishu/manifest.git 需要执行命令:

      $ repo init -u https://sdk.aw-ol.com/git_repo/R329_Tina_jishu/manifest.git -b master -m R329-Tina-jishu.xml
      

      如果提示 Username for 'https://sdk.aw-ol.com': 请输入 全志在线开发者论坛 的用户名和密码。(注:需要全志在线开发者论坛LV2等级以上用户才有权限拉取 SDK)

      拉取 SDK

      使用命令 repo sync 拉取 SDK

      $ repo sync
      

      由于 SDK 普遍较大,拉取可能需要一定的时间。

      创建开发环境

      使用命令 repo start 创建开发环境分支

      $ repo start smartx-r329-tina-jishu --all
      

      至此,SDK 获取完毕。

      发布在 代码下载问题专区
      q1215200171
      budbool
    • 回复: 全志在线开源芯片 新 SDK 平台下载方法汇总

      XR806 SDK 拉取

      以 xr806_sdk 为例,讲述如何拉取 SDK。

      新建文件夹保存 SDK

      使用 mkdir 命令新建文件夹,保存之后需要拉取的 SDK,然后 cd 进入到刚才新建的文件夹中。

      $ mkdir xr806_sdk
      $ cd xr806_sdk
      

      初始化 Repo 仓库

      使用 repo init 命令初始化仓库,Tina-MR813-OPEN 的仓库地址是 https://sdk.aw-ol.com/git_repo/XR806/manifest.git 需要执行命令:

      $ repo init -u https://sdk.aw-ol.com/git_repo/XR806/manifest.git -b master -m xr806_sdk.xml
      

      如果提示 Username for 'https://sdk.aw-ol.com': 请输入 全志在线开发者论坛 的用户名和密码。(注:需要全志在线开发者论坛LV2等级以上用户才有权限拉取 SDK)

      拉取 SDK

      使用命令 repo sync 拉取 SDK

      $ repo sync
      

      由于 SDK 普遍较大,拉取可能需要一定的时间。

      创建开发环境

      使用命令 repo start 创建开发环境分支

      $ repo start xr806_sdk --all
      

      至此,SDK 获取完毕。

      发布在 代码下载问题专区
      q1215200171
      budbool
    • 回复: 全志在线开源芯片 新 SDK 平台下载方法汇总

      MR813 SDK 拉取

      以 Tina-MR813-OPEN 为例,讲述如何拉取 SDK。

      新建文件夹保存 SDK

      使用 mkdir 命令新建文件夹,保存之后需要拉取的 SDK,然后 cd 进入到刚才新建的文件夹中。

      $ mkdir Tina-MR813-OPEN
      $ cd Tina-MR813-OPEN
      

      初始化 Repo 仓库

      使用 repo init 命令初始化仓库,Tina-MR813-OPEN 的仓库地址是 https://sdk.aw-ol.com/git_repo/MR813_Tina_OPEN/manifest.git 需要执行命令:

      $ repo init -u https://sdk.aw-ol.com/git_repo/MR813_Tina_OPEN/manifest.git -b master -m Tina-MR813-OPEN.xml
      

      如果提示 Username for 'https://sdk.aw-ol.com': 请输入 全志在线开发者论坛 的用户名和密码。(注:需要全志在线开发者论坛LV2等级以上用户才有权限拉取 SDK)

      拉取 SDK

      使用命令 repo sync 拉取 SDK

      $ repo sync
      

      由于 SDK 普遍较大,拉取可能需要一定的时间。

      创建开发环境

      使用命令 repo start 创建开发环境分支

      $ repo start smartx-mr813-tina-v1.1 --all
      

      至此,SDK 获取完毕。

      发布在 代码下载问题专区
      q1215200171
      budbool
    • 【FAQ】全志D1芯片FAQ汇总(你不知道的和你想知道的的这里都有)

      01、【FAQ】全志D1芯片 如何解决Audiocodec使用S24_LE格式进行录音,软件分析波形异常的问题?
      02、【FAQ】全志D1芯片 如何在 Linux Device Tree 中配置预留内存?
      03、【FAQ】全志D1芯片 如何解决Gstreamer播放1080视频显示异常问题(重影)?
      04、【FAQ】全志D1芯片 如何对D1主频进行调节?
      05、【FAQ】全志D1芯片 如何解决Gstreamer:fb UI旋转(直接修改内核参数)后,sunxifbsink显示异常问题?
      06、【FAQ】全志D1芯片 Tina 如何查看通过 procd init 脚本启动的应用输出到 stdout/stderr 的打印信息?
      07、【FAQ】全志D1芯片 如何移植 rtl8821cu wifi 驱动到 Linux-5.4内核?
      08、【FAQ】全志D1芯片 XR829扫卡失败问题排查
      09、【FAQ】全志D1芯片 mp4(Xvid)视频文件播放花屏问题
      10、【FAQ】全志D1芯片 如何解决在创建视频解码器后,未送入视频帧数据之前,cpu被占满的问题?
      11、【FAQ】全志D1芯片 如何在休眠唤醒过程中通过-sunxi_dump-读写外设寄存器?
      12、【FAQ】全志D1芯片 minigui如何显示鼠标?
      13、【FAQ】全志D1芯片 uart测试用例(支持自发自收,板间收发,数据校验,收发时间统计)
      14、【FAQ】全志D1芯片 如何在tina使用tplayerdemo 进行rtsp拉流说明?
      15、【FAQ】全志全系列芯片 APST平台无法下载或者更新工具
      16、【FAQ】全志 F系列/R系列/V系列 RTOS平台cache操作接口介绍
      17、【FAQ】全志系列芯片如何把flash擦成空片?
      18、【FAQ】持续更新......

      发布在 MR Series
      q1215200171
      budbool
    • 开发者成长计划正式上线!一起争做社区”高手“!

      相信大家都已经发现社区有了一点小小的变化,头像下方多了个金闪闪的大V,通知栏有积分获取的通知,发帖、评论、点赞所有行为都有了实时的反馈,这其实就是全志在线社区为开发者们全新设立的开发者成长计划。

      积分制横图.png

      LV2最速升级方法:

      ① 1次主题帖发布==========50积分

      ② 1次有效回帖+4次点赞=====49积分

      开发者成长体系是以成长值作为核心衡量指标的激励体系,成长值获取公式为:成长值= 20%活跃 + 80%贡献,成长值是根据开发者在论坛中的行为,结合活跃与贡献进行的综合评价,成长值即决定了开发者在社区的用户等级,积分与成长值一同获取,在不久的将来将会上线积分商城,获取的积分可以兑换包括开发板在内的精美礼品,只要在论坛足够活跃,有足够多的贡献,心爱的板子再也不用花998,用积分兑换也可以把他带回家。

      积分细则如下:
      积分制度长图2.jpg

      积分、等级及积分记录查看方式如下:
      E3A8A39D-F4C5-4877-BF87-B91F1B321E5F.png 64CB6BB4-1A97-4e9b-B835-C1921A11E4CE.png
      562A7EC0-0AE1-42c7-92E6-B97AAB19E995.png

      发布在 公告
      q1215200171
      budbool
    • 【FAQ】全志V853芯片FAQ汇总(你不知道的和你想知道的的这里都有)

      01、【FAQ】全志V853芯片 如何解决getevent运行出错,报错为“could not add watch for /dev/input”的问题?
      02、【FAQ】全志V853芯片 Tina获取各个分区编译好后的分区镜像文件[脚本]
      03、【FAQ】全志V853芯片 如何支持ssh功能?
      04、【FAQ】全志V系列芯片 如何生成拍照缩略图和视频缩略图?
      05、【FAQ】全志V853芯片 swap功能简介与tina上swap分区使用方法
      06、【FAQ】全志V853芯片 VE debugfs调试节点信息说明
      07、【FAQ】全志V853芯片 编码P帧帧内如何刷新功能检查?
      08、【FAQ】全志V853芯片 如何在Tina V85x平台切换sensor?
      09、【FAQ】全志V系列芯片 Camera-WDR模式配置指南
      10、【FAQ】全志V853芯片 如何解决开启启动时amixer控件的自动配置问题?
      11、【FAQ】全志V853芯片 如何使busybox syslogd时间戳格式与kernel对齐?
      12、【FAQ】全志V853芯片 如何解决蓝牙扫描期间bluetoothd进程的RssAnon值一直升高?
      13、【FAQ】全志V853芯片 Tina下RTSP环境搭建方法
      14、【FAQ】全志V853芯片 在Tina下E907启动方式的选择
      15、【FAQ】全志V853芯片 如何查看NPU时钟电源配置以及信息?
      16、【FAQ】全志V853芯片 适配双目GC2053的操作步骤
      17、【FAQ】全志V853芯片 烧录spinor烧录器固件方法
      18、【FAQ】全志 F系列/R系列/V系列 RTOS平台cache操作接口介绍
      19、【FAQ】全志V853芯片 如何动态打开蓝牙kernel部分的log?
      20、【FAQ】全志V853芯片 Tina SDK LCD小分辨率DCLK设置问题
      21、【FAQ】全志系列芯片如何把flash擦成空片?
      22、【FAQ】全志V853芯片 Tina Linux下网络ADB内存泄露如何修复?
      23、【FAQ】全志V系列芯片 在TinaLinux如何判断安全固件与rotpk.bin是否对应?
      24、【FAQ】全志V85x芯片 快起方式下如何配置isp led?
      25、【FAQ】全志V85x芯片 如何放开快启方案的打印?
      26、【FAQ】全志V85x芯片 OTA升级失败出现"Found installer for stream recovery ubivol"以及"cannot write 16384 bytes: Operation not permitted"报错如何解决?
      27、【FAQ】全志V85x芯片 如何使用tiger lcd时lti锐化功能时程序abort?
      28、持续更新........

      发布在 V Series
      q1215200171
      budbool
    • 【XR806开发板试用】在 xr806 上移植 LVGL

      不多废话,直接开搞,先上效果图

      2915332568-61de7071c3e19.jpg

      准备

      • 开发环境啥的,已经有很多文章了,这里就不再提搭建开发环境的相关内容了。
        一个屏幕(1.8' 128x160)
        1760544702-61de70b959d3e.jpg

      • LVGL源码(v8.0.2)
        (链接: https://github.com/lvgl/lvgl)

      开搞

      新建工程
      在ohosdome目录下新建一个工程"SPI_LCD",然后在工程文件加中添加"inc","src"文件夹和"BUILD.gn"文件,接着在src目录下创建"main.c"和"lcd.c",在inc目录下创建lcd.h,并将lvgl8.0.2源码也下载到工程目录下,如下图:
      3213853044-61dec39fc317f.jpg

      lcd.c 和 lcd.h,这两个文件是lcd屏幕的驱动文件,里面包含了lcd的驱动程序,这里主要看一下用于移植LVGL的刷屏函数lcd_flush:

      void lcd_flush(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t *color_p)
      {
        uint16_t w = x2 - x1 + 1;
        uint16_t h = y2 - y1 + 1;
        uint32_t draw_size = w * h;
      
        lcd_set_address(x1, y1, x2-1, y2-1);
        for (uint32_t i=0; i<draw_size; i++)
        {
            lcd_write_dat_16(color_p[i]);
        }
      }
      

      移植LVGL

      1、添加源文件
      将lvgl目录下(包括子目录)所有".c"文件的相对路径添加到"BUILD.gn"文件中,以加入编译,如下图所示(展示部分):
      3666675931-61dec5a1ddf3a.jpg

      2、添加头文件路径
      一样修改"BUILD.gn"文件,如下图所示(对于移植LVGL,主要是红框中的):
      2556107498-61dec61759925.jpg

      3、LVGL配置文件
      复制./lvgl/lv_conf_template.h为./lvgl/lv_conf.h,并作相应修改,主要修改如下:

      #define LV_COLOR_DEPTH                  16
      #define LV_TICK_CUSTOM_INCLUDE          "kernel/os/os_time.h"
      #define LV_TICK_CUSTOM_SYS_TIME_EXPR    (OS_GetTicks())
      

      LVGL显示设备注册

      复制./lvgl/examples/porting/lv_port_disp_template.c为./lvgl/examples/porting/lv_port_disp.c,并作相应修改,主要修改如下:

      1、启用条件编译
      3704885820-61dec83701042.jpg

      2、添加LCD驱动头文件
      492719688-61dec859f20b9.jpg

      3、创建LVGL显示缓存
      红框中的值可以适当做相应调整
      3965176505-61dec8773572c.jpg

      4、设置LVGL显示设备的参数
      主要设置屏幕的宽度与高度
      1600506850-61dec8b7e34b9.jpg

      5、添加初始化LCD屏幕代码
      783356945-61dec8da085df.jpg

      6、添加LVGL的LCD刷屏函数
      1009909891-61dec8f8b09b5.jpg

      LVGL初始化

      在应用程序的一开始,初始化LVGL和LVGL的显示设备,首先要导入LVGL的头文件:
      2841080138-61deca088be91.jpg 2064961015-61deca10c1fb8.jpg

      定时调用LVGL任务处理器

      创建一个任务来执行LVGL任务处理器
      这里可以适当的在while(1)中加一个LOS_Msleep(1) 感谢群友.ACE彭洪权的反馈
      1074938830-61decab5c0845.jpg

      测试

      至此LVGL就移植完毕了,接下来编译测试代码
      2558845562-61decb1eb353d.jpg
      上面代码就是使用LVGL提供的标签控件在屏幕上显示"Hello, XR806!",就如开篇的第一张图片。

      总结

      以上就是将LVGL移植到XR806上运行的整个流程,个人感觉XR806的编程体验还是挺好的,提供了各种外设的丰富驱动,可以方便开发者快速使用XR806实现功能。

      文章转自极术社区:https://aijishu.com/a/1060000000292988
      作者:25Hz.

      发布在 Wireless & Analog Series
      q1215200171
      budbool
    • 回复: 全志在线开源芯片 新 SDK 平台下载方法汇总

      @dream 一样的,这几个现在不用签NDA在awol注册就可以直接下

      发布在 代码下载问题专区
      q1215200171
      budbool
    • 纵享丝滑!R128+LVGL驱动多尺寸RGB LCD屏幕流畅运行

      新晋点屏神器,R128!各种屏幕都能点!

      ezgif.com-optimize (11).gif

      高刷、大屏、宽色域......通常来讲,显示器的配置越高,越能给使用者带来优于其它一般配置显示器的体验。但就某些特殊的使用场景来讲,选择配置合适的显示屏幕,才能更精准地匹配上实际的使用需求。

      无论是工控监视设备、平板电脑、笔记本电脑等带屏产品,还是平时开发者在DIY掌机、小电脑、桌面机器人等电子设备时,都需要通过使用不同尺寸的RGB屏幕来满足特定的需求。

      R128和LVGL的组合就为这一类的应用场景提供了解决方案的另一种选择,对内存及处理器性能的低要求,可以让LVGL很好的适配不同尺寸的RGB屏幕以及各种应用场景。

      • 7寸方屏(1024x600)
        ezgif.com-video-to-gif-converted.gif

      • 4寸方屏(480x480)
        ezgif.com-video-to-gif-converted (1).gif

      • 4寸圆屏RGB(480x480)
        ezgif.com-video-to-gif-converted (2).gif

      R128适配RGB LCD配置

      如动图展示,其中最大的屏幕是 7寸1024x600分辨率,lvgl测试不加触摸能跑60多帧,加触摸是58帧左右,4寸480x480分辨率的屏幕时,R128的lv_benchmark跑分显示可达247fps,实现伪高刷。

      640.png

      R128目前以支持移植百问网的7寸(1024x600)、4寸方屏(480x480)、4寸圆屏RGB(480x480)。

      不同尺寸RGB屏幕的sys_config.fex配置有微小差异,以4寸方屏RGB配置代码为例:

      
      4寸方屏(480x480)
      ;lcd_driver_name     = "default_lcd"
      ;lcd_backlight       = 150
      ;lcd_if              = 0
      ;lcd_x               = 480
      ;lcd_y               = 480
      ;lcd_width           = 70
      ;lcd_height          = 70
      ;lcd_rb_swap         = 1
      ;lcd_dclk_freq       = 9
      ;lcd_pwm_used        = 1
      ;lcd_pwm_ch          = 7
      ;lcd_pwm_freq        = 500000
      ;lcd_pwm_pol         = 1
      ;lcd_hbp             = 20
      ;lcd_ht              = 526
      ;lcd_hspw            = 6
      ;lcd_vbp             = 10
      ;lcd_vt              = 510
      ;lcd_vspw            = 4
      ;lcd_lvds_if         = 0
      ;lcd_lvds_colordepth = 1
      ;lcd_lvds_mode       = 0
      ;lcd_frm             = 1
      ;lcd_io_phase        = 0x0000
      ;lcd_gamma_en        = 0
      ;lcd_bright_curve_en = 0
      ;lcd_cmap_en         = 0
      
      #触摸配置
      4寸方屏(480x480) GT911
      ;tp_max_x               = 480
      ;tp_max_y               = 480
      ;tp_addr                = 0x14
      

      7CBE9CDC-A3FD-4ce6-B051-8EC233D71A08.png

      LVGL配置修改以下内容:

      
      /*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/
      #define LV_COLOR_DEPTH 32  /*这里可以改为16,因为de会自动转换到32位,最终显示还是32位色深*/
      
      /*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/
      #define LV_COLOR_16_SWAP 0
      
      #ifndef USE_EVDEV
      #  define USE_EVDEV           1
      #endif
      

      以上配置完成后,编译打包烧录,上电后屏幕背光亮起,屏幕为黑色,并且可以在 LOG 中看到 SPI 初始化的 LOG。

      
      disp:[disp_device_attached_and_enable 230]attached ok, mgr0<-->dev0
      disp:[disp_device_attached_and_enable 243]type:1,mode:0,fmt:rgb,bits:8bits,eotf:4,cs:0 dvi_hdmi:2, range:2 scan:0 ratio:8
      [gt911][log] PRODUCT_ID=39:31:31:00:60:10
      [gt911][log] verison=00 range_x=0 range_y=0 point_num=0
      [gt911][log] PRODUCT_ID=39:31:31:00:60:10
      [gt911][log] verison=42 range_x=480 range_y=480 point_num=5
      

      开发资源

      Gitee源码获取链接:https://gitee.com/weidongshan/100ask_r128_demos
      GitHub源码获取链接:https://github.com/100askTeam/100ask_r128_demos

      ezgif.com-video-to-gif-converted (3).gif

      更多关于项目的详情可以前往百问网R128综合项目开发案例界面了解:https://aw-r128.100ask.net/zh/rtos/demo/part1/chapter15.html

      应用拓展

      在其它规格及尺寸屏幕上的LVGL运行效果对比也可以参考以下文章,文章内将对比了LVGL运行在R128平台时,SPI与DBI在不同型号屏幕下的性能差异。
      相关阅读:https://r128.docs.aw-ol.com/demo/spi_vs_dbi/
      640.png

      能进行虚拟光渲交互的智能家居中控,基于开源项目移植的NWatch智能手表,它们的产品形态其实类似,只是在屏幕的选择规格上有明显差异。

      相关阅读:https://bbs.aw-ol.com/topic/4793/
      640.gif

      相关阅读:https://bbs.aw-ol.com/topic/4563/
      640 (1).gif

      在原文链接演示的链接回复中,也可以发现有的开发者基于R128+LVGL的搭配实现了普通灯珠的点阵屏控制效果图,丰富的音视频接口为R128应对不同场景的需求提供了便利。

      6E85F489-20E6-477f-B322-0064B4B0AF69.png

      基于R128-S2设计的全套开发板已上线淘宝百问网韦东山老师个人店进行售卖,包含黑色的DshanMCU-R128s2-R16N16模组和全套的DshanMCU-R128s2-DEVKIT。

      • DshanMCU-R128s2-R16N16模组:29.9元
      • DshanMCU-R128s2-DEVKIT开发板:49.9元

      R128开发板购买链接:https://item.taobao.com/item.htm?spm=a21n57.1.0.0.46b0523cMfarLo&id=736154682975&ns=1&abbucket=5#detail

      “主图_01”为智能对象-1.jpg

      发布在 A Series
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 如何支持ssh功能?

      1 问题背景

      v853有客户需要使用到ssh服务,使用该服务来进行文件传输或者系统登陆。

      2 问题描述

      v853有客户需要使用到ssh服务,使用该服务来进行文件传输或者系统登陆。但在开发的过程中发现ssh的基本功能使用不了,包括使用ssh进行远程登录,和使用scp进行文件传输。

      3 解决办法

      3.1 编译ssh包,如下配置后进行编译即可编译ssh相关工具

      make menuconfig
       --> network
         --> ssh
           -*- openssh-client
           <*> openssh-client-utils
           -*- openssh-keygen
           < > openssh-moduli
           <*> openssh-server
           <*> openssh-server-pam
      

      3.2 添加sshd账号

      1.系统起来后启动/usr/sbin/sshd服务可能会失败,因为此时没有sshd账号,因此需要创建一个sshd账号

      2.在/etc/passwd文件中添加sshd账号信息,如下:

      sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/bin/ash
      

      注意:该信息需要根据系统实际情况进行改动,例如在v853中使用的是ash shell,但其他方案中不一定使用的是ash shell

      3.使用ssh-keygen命令创建3个key

      ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
      ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
      ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
      

      4.mkdir /var/empty/sshd --> 创建sshd账号的工作目录

      5.使用passwd命令给sshd账号添加密码。

      6.在小机端执行命令/usr/sbin/sshd启动ssh服务

      7.执行完上面的操作后即可在pc端使用ssh工具使用sshd账号远程登录小机端了。

      3.3 以root用户登录小机端

      上面的操作只能以sshd账号登录到小机端,sshd账号权限有限,在开发阶段很多操作都做不了,因此一般需要使用root用户进行登录,

      执行下面的操作后即可以root用户进行登录

      1.使用passwd命令给root账号添加密码,一般新烧的系统root账号是没有设定密码的,在tina系统中使用passwd命令修改的密码是保存在/etc/passwd文件中的。

      2.rm /etc/shadow(tina v853方案中要删除shadow里root账号信息,否则远程登录时使用的是shadow里的密码,但该密码不清楚是什么,该密码与/etc/passwd中的密码有覆盖现象)

      3.修改/etc/ssh/sshd_config文件,添加PermitRootLogin yes配置项(该配置项是允许ssh以root账号登录)

      4.如果此前sshd服务已开启,那么重启sshd服务,到此可以以root账号登录小机端了。

      3.4 使用scp工具进行文件传输

      在开发阶段一般scp要以root账户去进行文件的传输,否则很容易因文件权限的问题导致传输失败,因此在使用scp时最好已调通以root用户进行登录。

      1.tina SDK中的package/network/openssh包里把scp和ssh工具名字修改为了openssh-ssh和openssh-scp了,在window系统中使用scp命令上传或下载文件会报错。

      2.报错原因是小机端找不到scp工具,因此需要把package/network/openssh包里的openssh-scp工具名字修改回scp即可

      (修改package/network/openssh/Makefile文件)

      注意:该问题是pc端是window系统时发现的,其他系统作为登录端时可能不需要,可以自行进行测试。

      4.问题总结

      v853方案使用上面方法可以使用ssh功能,其他方案因系统(例如shell,busboy)等原因需要根据实际情况进行修改(可以参考上面的做法)。

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 回复: 全志在线开源芯片 新 SDK 平台下载方法汇总

      @mc964203886 点几个赞升到2级再看看

      发布在 代码下载问题专区
      q1215200171
      budbool
    • 全志客户服务平台智能客服使用指南

      全志客户服务平台承载着为广大企业客户提供在线预览及下载技术文档、获取技术资源、快速查看FAQ、实时提交反馈问题等重要的功能。作为与客户交流并帮助客户解决问题的工具平台,客户服务平台从上线伊始,一直专注于打磨服务功能,致力于为客户带来良好的使用体验,并在使用的过程中吸取经验来提高为客户解决问题的效率。

      近年来,全志科技基于市场需要和对产品趋势的理解,不断拓宽旗下芯片的产品线,各系列芯片的技术资源、开发文档、教学视频不断更新迭代,FAQ的数量也不断增长,在客户服务平台上架可供客户查阅的FAQ已有2000余条。

      客户服务平台日益丰富的技术资源,虽提升了解决客户目标问题的可能性,却也为客户在实际使用中带来了检索困难,操作繁琐等不良体验。

      全志科技长期坚持以客户为中心的理念,为更好的帮助客户快速定位和解决开发过程中遇到的问题,提升服务效率,全志客户服务平台对原有的文档检索及资料获取的流程进行优化,对智能客服功能作出了重要升级,客户现可以通过与智能客服对话的形式,来实现芯片文档获取、技术资源下载、FAQ快速检索等功能。

      本文将为广大客户服务平台的用户演示通过智能客服快速查找技术文档,FAQ精准检索,以及一些新增功能的解释和使用方法介绍。

      客户服务平台智能客服接入指南

      智能客服功能部署在全志客户服务平台,全志客户服务平台主要面向所有全志芯片的代理商、方案商以及渠道合作伙伴、企业开发者,提供全面产品包下载与在线技术支持服务。

      全志客户服务平台网址:https://open.allwinnertech.com

      还未注册客户服务平台账号的客户可以先点击“立即注册”按钮进行注册,企业用户建议使用企业邮箱进行注册,用户名账号建议选用公司英文或拼音,后续该账号将作为公司主体的主账号用户名。需要注意的是,首次注册的新用户是未进行NDA认证的账号。

      90DB0F40-5390-4ea3-9033-CF7AD612DE5D.png

      还未注册客户服务平台账号的客户可以先点击“立即注册”按钮进行注册,企业用户建议使用企业邮箱进行注册,用户名账号建议选用公司英文或拼音,后续该账号将作为公司主体的主账号用户名。需要注意的是,首次注册的新用户是未进行NDA认证的账号。

      kehufuwulujin.png

      使用未进行NDA认证的客户账号在登录客户服务平台后,页面内不显示“在线咨询”按钮,客户可以先进行NDA认证,根据提示提交相关材料,通过认证后可正常使用智能客服功能。

      图片1.png

      账号登录成功后,点击页面左上方的马上认证跳转到NDA认证页面。按照要求填写公司证件号、地址,选择意向芯片平台、意向产品品类。该项关系到审核NDA资质的审核分配人员,请按你需要合作的芯片平台填写。

      如果之前有全志客户经理已经与贵司对接,请填写【业务受理人】姓名,届时系统将按指定的受理人审核。

      如果没有,也可以不用填写,选择意向芯片、意向品类即可,由系统为你分配审核人员。

      图片2.png

      按照全志的NDA模板填写了协议并条提交盖章签字后的附件,可点击【下一步】。

      点击【上传已签订的NDA文件】,上传文件。点击【上传三证扫描附件或复印件】,上传企业的三证等资料,方便资料审核。

      图片3.png

      客户服务平台目前仅面向与全志合作、商务往来的企业,即全志的企业客户才能进行NDA认证,面向个人开发者群体的服务暂未开放,提交申请会被拒绝。

      图片4.png

      对于提交申请的企业主体开发者,即可在资质申请页看到当前状态,平台一般3-4个工作日完成审核。审核通过后,便可拥有该平台的使用及权限。

      每个企业只有一个企业账号主体,若是开发者所在企业已经拥有企业主账号,则可以联系企业开发组的拥有者或管理员,添加到企业开发组中。企业主账号通过认证后,其申请者将为企业主账号的拥有者,且不可更改,相关配置也均与拥有者账号相关,故要求企业在申请企业NDA时,申请者的账号必须填写企业的账号,该账号不随人员变动而变动。

      图片5.png

      使用已进行NDA认证的客户账号在登录客户服务平台后,可以在“工作台”栏目页面的右下角看到“在线咨询”按钮的入口,点击按钮就会弹出智能客服的对话窗口,再次点击关闭窗口。

      图片6.png

      智能客服对话窗口包含以下几项内容:

      (1)猜你想问:
      平台设置的默认问题,可以通过该栏目对目标问题进行快速提问。猜你想问的栏目下默认设置了7个问题,可以快速获取全志客户服务平台的功能简介、编译工具链的介绍、V系列常见客户问题、芯片开发板购买链接等技术资源;

      (2)点击加载更多:
      查看智能客服历史对话消息;

      (3)快捷短语:
      平台设置的默认快捷短语,可以实现快捷回复以实现短语对应功能。快捷短语栏目下目前默认设置了查看V系列常见客户问题目录和查看V系列应用开发常见客户问题目录,客户可以通过该快捷短语了解开发常见问题的初级目录。

      (4)输入栏:
      客户可以通过该板块输入文字与智能客服对话,在对话框内有默认设置的提问模板和提问示例,在不了解问题所属目录板块的时候,可以配合输入栏上方的快捷短语使用。

      图片7.png

      技术资源&开发问题检索流程演示

      目前可支持通过智能客服检索到的V系列常见客户问题数量为220条,全面覆盖八大不同板块类型,其中包含技术资源、开发文档、FAQ等内容。

      V系列常见客户问题目录:
      1、入门指南——7个相关词条
      2、芯片规格及性能——6个相关词条
      3、文档流程指引——6个相关词条
      4、开发环境搭建——3个相关词条
      5、SDK版本介绍——5个相关词条
      6、BSP开发相关——26个相关词条
      7、应用开发相关——144个相关词条

      • 多媒体系统——17个相关词条
      • 音频相关——1个相关词条
      • Camera相关——17个相关词条
      • 图形系统相关——4个相关词条
      • USB相关——6个相关词条
      • NPU相关——20个相关词条
      • 图像调试相关——12个相关词条
      • 网络相关——35个相关词条
      • 文件系统相关——3个相关词条
      • 蓝牙相关——29个相关词条

      8、系统开发相关——23个相关词条

      • 系统配置——9个相关词条
      • 系统调试——13个相关词条
      • 休眠唤醒——1个相关词条

      以下内容将为大家详细介绍在智能客服内检索目标技术资源及开发问题的步骤。

      常规检索

      以客户在使用V系列(V53x、V83x、V85x)Tina SDK开发环境下遇到的Camera曝光闪烁问题为例,来演示通过智能客服在客户服务平台上进行常规检索相关开发资源的流程。

      步骤一: 点击在“猜你想问”设置的默认短语“V系列常见客户问题”,会弹出对应的V系列常见客户问题目录,各目录方块中的黑体字为目录名称,灰体字为该目录下的相关词条数量,点击对应词条即会弹出该词条下的相关问题;

      图片8.png

      步骤二: 这时候可以客户可以对自己遇到的问题进行分类,以本文的问题为例,Camera模块下遇到的问题应当归类到应用开发问题,点击“应用开发相关”卡片;

      步骤三: 在“应用开发相关”下有10个相关的模块卡片,选择需要的“Camera相关”卡片;

      图片9.png

      步骤四: 点击后可以看到17个Camera相关的问题词条,在卡片内没有灰体字显示相关词条数量的卡片即为FAQ,选择需要的“Camera曝光闪烁排查指南”卡片;

      步骤五: 点击后可以看到FAQ的相关内容,大部分FAQ会将问题的问题背景、问题表现、根本原因、解决方法、附件等内容进行详细的阐述,通过以上步骤即可正确找到所需要的FAQ。

      图片10.png

      步骤六: 点击下方的展开更多即可阅读FAQ详细内容。

      图片11.png

      以上几个步骤仅以客户视角进行开发技术问题的FAQ检索为例,同理,客户在使用智能客服的过程中,也可以通过相同的方法获取到预设在智能客服内部的其它技术资源, 例如V85x各封装型号规格差异的技术文档,V85x开源开发板的购买链接等内容。

      快捷检索

      若客户在遇到开发问题时,无法通过“V系列常见客户问题”下设置的默认目录来锁定问题,可以在智能客服搜索框直接输入关键词来查找相关FAQ,但该方法目前仅适用部分FAQ。还是以客户在使用V系列(V53x、V83x、V85x)Tina SDK开发环境下遇到的Camera曝光闪烁问题为例,来演示通过智能客服在客户服务平台上进行快捷检索相关FAQ的流程。

      1、模糊搜索

      在输入框输入关键词Camera后,在输入框上方会出现与Camera词条相关的FAQ,点击选择需要的“Camera曝光闪烁排查指南”即可。

      图片12.png

      2、固定模式检索

      在输入框内有固定提问模板的提示,可以通过查看V系列常见客户问题目录的词条来实现固定模式的快捷检索,此方法适用于已熟悉智能客服目录配置的客户使用。

      提问模板【V系列】+【客户问题目录词条】,提问示例:V系列入门指南

      图片13.png

      目录返回功能

      在按照上一章的步骤检索到目标技术资源后,可能会出现已检索的技术资源未能解决问题或者还想继续检索一下其它技术资源的情况,那么以下就如何返回上一级目录和返回初始的V系列常见客户问题目录给出几个最快捷的方法。

      FAQ末尾处返回上级目录

      在每一条FAQ的末尾处都有一个“猜您可能还想了解”的菜单,菜单内会关联与该FAQ相似的其它FAQ方便客户快速检索,同时,菜单内的第一条链接也是返回上一级菜单的快捷短语。以下方图片为例,在检索到V85x系列平台各封装型号及功能对照表后,可以点击“芯片规格及性能”返回该FAQ的上级目录,或者点击其它链接跳转到对应的FAQ下。

      图片14.png

      次级目录下返回上级目录

      点击每个次级目录下的最后一个方块按钮都可以快速返回上一级目录。

      图片15.png

      通过快捷短语返回初始目录

      可以通过点击输入栏上方的快捷短语“回到V系列常见客户问题目录”,即可快速返回初始目录。

      图片16.png

      针对子目录较多且较为常用的“应用开发”及“系统开发”板块,智能客服也提供了通过快捷短语的返回目录的方式,点击相应的快捷短语即可返回相应目录。

      图片17.png

      全志客户服务平台网址:https://open.allwinnertech.com

      发布在 公告
      q1215200171
      budbool
    • 【FAQ】全志XR806芯片FAQ汇总(你不知道的和你想知道的的这里都有)

      01、【FAQ】全志XR806芯片 系统异常重启如何解决?
      02、【FAQ】全志XR806芯片 如何更换打印log口?
      03、【FAQ】全志XR806芯片 为什么开机时候串口以及部分gpio会有电平跳变?
      04、【FAQ】全志XR806芯片 mac地址要如何存放以及如何获取?
      05、【FAQ】全志XR806芯片 固件烧录完成后,程序不是预期烧录程序或者甚至无法启动如何解决?
      06、【FAQ】全志XR806芯片 如何使用timer命令行命令?
      07、【FAQ】全志XR806芯片 如何修改中断优先级?
      08、【FAQ】全志XR806芯片 如何设置AP模式默认IP地址、子网掩码、网关?
      09、【FAQ】全志XR806芯片 低功耗蓝牙BLE断开连接错误码和分析?
      10、【FAQ】全志XR806芯片 select引发崩溃如何解决?
      11、【FAQ】全志XR806芯片 如何打开 LwIP 调试信息?
      12、【FAQ】全志XR806芯片 执行扫描动作时,偶尔会扫描不到目标的AP如何解决?
      13、【FAQ】全志XR806芯片 如何解决编译错误undefined reference to?
      14、【FAQ】全志XR806芯片 standby模式下gpio的电平状态是如何变化?
      15、【FAQ】全志XR806芯片 如何清除扫描列表缓存?
      16、【FAQ】全志XR806芯片 RTC时钟不能跑、有时候时间不准是什么原因?
      17、【FAQ】全志XR806芯片 如何使用watchpoint功能?
      18、【FAQ】全志XR806芯片getsockopt、setsockopt失败如何解决?
      19、【FAQ】全志XR806芯片 串口修改波特率后与目标波特率不匹配如何解决?
      20、【FAQ】全志XR806芯片 Xradio Skylark 中的无线网络回调事件含义
      21、【FAQ】全志XR806芯片 如何使用phoenixMC软件把应用固件与etf固件合并在一起?
      22、【FAQ】全志XR806芯片 RF参数是如何保存的?
      23、【FAQ】全志XR806芯片 汇编代码调试技巧
      24、【FAQ】全志XR806芯片 如何解决第三方静态库函数符号重复?
      25、【FAQ】全志XR806芯片 如何创建自定义状态回调函数?
      26、【FAQ】全志XR806芯片 如何获取ap的rssi值?
      27、【FAQ】全志XR806芯片 XR806如何添加本地音频到flash?
      28、【FAQ】全志XR806芯片 XR MCU的外设驱动为什么修改无效?
      29、【FAQ】全志XR系列 XRMCU如何播放xip中的音频?
      30、【FAQ】全志XR系列 XRMCU如何修改录音编码器的输入数据?
      31、【FAQ】全志XR系列 如何调试wifi频偏问题?
      32、【FAQ】全志XR系列 如何统计XRMCU的内存使用情况
      33、【FAQ】全志XR系列 设置音频结构体HttpStreamBufferConfig成员有什么意义?
      34、【FAQ】全志全系列芯片 APST平台无法下载或者更新工具
      35、【FAQ】全志XR806 Freertos+XRMCU+ADC采样频率偏低
      36、【FAQ】全志XR806 Freertos + XRMCU +ADC采样数值不准
      37、【FAQ】全志系列芯片如何把flash擦成空片?
      38、持续更新....

      发布在 Wireless & Analog Series
      q1215200171
      budbool
    • 【送开发板啦】百问科技基于全志D1-H定制的开发板——东山哪吒STU第一堂系统开发直播课堂

      DONGSHANSTU.jpg

      发布在 MR Series
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 Tina Linux下网络ADB内存泄露如何修复?

      1.主题

      Tina Linux 网络ADB内存泄露修复

      2.问题背景

      硬件:V853
      软件:Tina4.0 Linux-4.9
      背景:使用网络adb时,反复connect disconnect,会发生内存泄露的问题。

      3.问题描述

      3.1复现步骤

      1、首先使能网络ADB功能。

      killall adbd
      export ADB_TRANSPORT_PORT=5555
      /bin/adbd -D > /dev/null &
      

      2、连接无线网络,保持小机与测试电脑处于同一个局域网中。
      由于每款产品连接无线网络的命令不大一致,因此此处就不对网络连接进行赘述了。

      3、编写bat脚本,进行压测。

      :loop
      adb disconnect
      adb connect 192.168.0.101
      adb disconnect
      timeout /t 3
      goto :loop
      pause
      

      4、使用内存泄露工具查看内存是否泄露。

      3.2具体表现

      使用内部一款内存泄露工具观察adbd工具内存占用情况:

      行 2499: 632        504        74         /bin/adbd
      行 2539: 632        504        74         /bin/adbd
      行 2581: 632        504        74         /bin/adbd
      行 2629: 632        504        74         /bin/adbd
      行 2672: 632        504        74         /bin/adbd
      行 2711: 632        504        74         /bin/adbd
      行 2753: 632        504        74         /bin/adbd
      行 2796: 632        504        74         /bin/adbd
      行 2841: 632        504        74         /bin/adbd
      行 2881: 632        504        74         /bin/adbd
      行 2921: 632        504        74         /bin/adbd
      行 2961: 632        504        74         /bin/adbd
      行 3008: 632        504        74         /bin/adbd
      行 3047: 632        504        74         /bin/adbd
      行 3091: 632        504        74         /bin/adbd
      行 3131: 632        504        74         /bin/adbd
      行 3181: 632        504        74         /bin/adbd
      行 3221: 632        504        74         /bin/adbd
      行 3265: 632        504        74         /bin/adbd
      行 3309: 632        504        74         /bin/adbd
      行 3349: 632        504        74         /bin/adbd
      行 3399: 632        504        74         /bin/adbd
      行 3439: 632        504        74         /bin/adbd
      行 3483: 632        504        74         /bin/adbd
      行 3523: 632        504        74         /bin/adbd
      行 3574: 632        504        74         /bin/adbd
      行 3614: 632        504        74         /bin/adbd
      行 3654: 632        504        74         /bin/adbd
      行 3694: 632        636        206        /bin/adbd
      行 3740: 632        636        206        /bin/adbd
      行 3780: 632        636        206        /bin/adbd
      行 3820: 632        636        206        /bin/adbd
      行 3860: 632        636        206        /bin/adbd
      行 3900: 632        636        206        /bin/adbd
      行 3946: 632        636        206        /bin/adbd
      行 3986: 632        636        206        /bin/adbd
      行 4026: 632        636        206        /bin/adbd
      行 4066: 632        636        206        /bin/adbd
      行 4117: 632        636        202        /bin/adbd
      行 4159: 632        636        206        /bin/adbd
      行 4203: 632        636        202        /bin/adbd
      行 4245: 632        636        204        /bin/adbd
      行 4292: 632        636        206        /bin/adbd
      行 4333: 632        668        234        /bin/adbd
      

      发现确实存在内存泄露的情况。

      4.问题分析

      使能网络adb时,将命令改成:

      killall adbd
      export ADB_TRANSPORT_PORT=5555
      /bin/adbd -D &
      

      将adbd的log信息输出到控制台上,观察adbd的运行情况。

      根据log信息以及对比源码能够发现,在调用transport.c的transport_registration_func()函数时,当读到的action等于0,即退出adb时,就会free掉一些之前malloc的指针。

      ADB1.jfif

      5.根本原因

      通过在函数transport_registration_func()的free动作前后添加打印能够发现,在adb disconnect时,并没有调用到free的动作。

      再在register_socket_transport()中calloc结构体atransport前后添加打印发现,每次adb connect时,都会重新调用register_socket_transport()去注册传输所需要的资源,并且会重新申请一篇内存。

      那么就根据前后,就能知道在disconnect时有一篇内存没有释放,而后重新connect时又新申请内存,导致了内存的泄露。

      对比有线adb,在连接时会申请结构体atransport的内存,在拔出usb线时也会free掉对应的内存。

      再看回来函数transport_registration_func(),

      ADB2.jfif

      在初始化时,这里注册了一个异步事情回调函数,当接收到事件的时候,就会调用transport_registration_func()去处理事件。对于拔出USB线来说,就会对gadget进行disconnect,然后composite gadget就会通过uevent通知应用层已经断开连接了,于是adbd就能够获取到事件从而去断开连接,释放资源。

      而对于网络adb来说,暂无这种机制。所以就需要依靠在output_thread中,在通信失败后主动触发断连的操作。

      在部分SDK中,存在这么一个补丁:

      diff --git a/utils/adb/src/transport.c b/utils/adb/src/transport.c
      index 9fd6cc2..97a438b 100755
      --- a/utils/adb/src/transport.c
      +++ b/utils/adb/src/transport.c
      @@ -285,7 +285,6 @@ static void *output_thread(void *_t)
               } else {
                   D("%s: remote read failed for transport\n", t->serial);
                   put_apacket(p);
      -            break;
               }
           }
      

      补丁的作用时,当通信失败时,就会断连、释放资源。这个补丁引入是为了修复USB ADB在通信不佳的情况下,触发了通信失败然后导致了USB重新枚举。
      但是引入该补丁后,在使用网络ADB时,通信失败也不会被断连了,因此也造成了内存泄露的问题。

      6.解决办法

      基于上述情况,在output_thread中加入限制的条件。在USB ADB时,取消break,让其一直在循环当中。对于网络ADB来说,则是执行break,当发生断连时,能够及时将资源释放掉。

      修复的补丁如附件所示。

      0001-adbd-only-transport_local-can-disconnect-in-outputth.patch

      发布在 V Series
      q1215200171
      budbool
    • 回复: 全志在线开源芯片 新 SDK 平台下载方法汇总

      @mc964203886 配置一下 sudo git config --global credential.helper store

      发布在 代码下载问题专区
      q1215200171
      budbool
    • 回复: 开发者成长计划正式上线!一起争做社区”高手“!

      @xiaowenge 平平无奇搬运工😧

      发布在 公告
      q1215200171
      budbool
    • 我用V851s做了一个魔法棒,成本80元,可以通过手势识别控制一切电子设备

      本项目作者: realTiX
      项目名称: 赛博魔杖
      芯片平台: 全志V851s, BMI088,HLK-B40

      F1636EF9-933A-488e-B41D-7FD1254FBE32.png

      这是一个可以直接启动原神的魔法棒~

      原神,启动!

      640 (6).gif

      这是一个万全的解决方案!只需要花80元再动动手,就可以将哈利波特的魔杖与人工智能结合到一起!它就是用全志V851s做的赛博魔杖!

      LEVCx35psWejdBBFMo8IyOREKoq44L2Pgvj8vZlB.jpeg

      这个魔法手杖有啥亮点

      手势识别“控万物”

      它可以通过手势识别,控制一切你想控制的电子设备(灯、空调),也可开原神。

      主要是通过识别手势画出来的字符控制,当前识别字符为字母 A~Z,也有数字 0~9等更多的模型。

      640 (7).gif

      控制的过程中,你也可以高喊一句阿瓦达!

      关于手势控制精度,您可以参照开源代码仓库训练精度更高(当前准确率为 92%),可识别字符(当前为字母 A~Z,数字 0~9)更多的模型。

      成本低,易复刻,有技术含量

      总成本包含外壳只需要80元,如果你想要一个更好看的外壳,也可以自己替。

      蓝牙通信

      本魔杖使用蓝牙串口透传模块通信,可以用这个功能开启原神。

      你可以参照代码仓库中的通信协议自行扩充本魔杖功能以及依此协议开发其他蓝牙终端,以达到遥控更多带有蓝牙的终端设备的目的。

      硬件部分

      这是魔杖本身的电路设计部分,其实并不复杂:

      其基础硬件主要包含:全志 V851s,BMI088,HLK-B40。

      640 (11).png

      640 (12).png

      魔杖如何轻松开关灯?多亏了这个开灯器打配合!看看它的电路吧:

      640 (13).png

      640 (14).png

      整体配合效果就是这样的:

      640 (8).gif

      硬件设计参考:Yuzukilizard 柚木PI 迷你 AIoT 开发板

      软件部分

      通过本章节,你会了解到——AI手势识别功能是如何做到的。

      1、软件构成

      使用Keras训练手势识别模型,转为 TFlite 模型。

      再通过谷歌提供的 TFlite C API 运行模型。

      2、代码仓库

      代码仓库顺序如下:

      • bmi088 获取挥棒手势数据
      • Keras 挥棒手势识别模型训练
      • V851s 赛博魔杖
      • 蓝牙控制的简易舵机开关灯装置_HLK-B40
      • 原神 蓝牙安卓启动器

      1、在工程附件中可下载固件文件(文末有入口)。
      640 (15).png
      2、将 TF 卡 通过读卡器连接电脑。
      3、使用 全志提供的 PhoenixCard 软件。
      4、按下图步骤下载固件到 TF 卡中。
      640.jpe
      5、固件下载完成后,插入 TF 卡槽中。
      6、魔杖初次开机需要半分钟(正常开机会闪三下灯)。非初次则需要 8 秒时间开机,如果开机很久都没闪灯,请重启或检查硬件(可插入数据线连接电脑,重启魔杖并使用 MobaXterm 查看串口打印信息以确定原因)。
      7、开机后进入陀螺仪初始化,期间会亮灯。也就是说,加上开机亮灯,会亮 4 次。
      8、注意,本魔杖 Type-C 口正反插分别为 USB-OTG 和 串口,请插上去后查看电脑驱动,以确定哪一方向为串口。
      9、开灯器固件在代码仓库下载源码,可自行编译或直接下载固件,参考 STC 51单片机程序下载方法。

      搞定了这一步,就要开始组装魔杖了!

      组装

      ①组装魔杖:在工程附件中可下载 3D 外壳文件,制作出来后按下图方式嵌入电路板及电池。

      640 (1).jpe

      ②组装开灯器:同上,有设计文件,制作出来后,按下图组装开灯器,注意红外头需引出。

      640 (2).jpe

      不觉得很酷吗,科技并带着乐趣

      蓝牙连接

      以上操作完成并正常开机后,就可以尝试连接蓝牙了。

      使用海凌科官网提供的 HLK-B40 软件 连接到蓝牙模块,

      按照下图内容修改参数设置:

      640 (3).jpe

      上图是魔杖的蓝牙模块配置,开灯器的蓝牙模块配置图略,魔杖和开灯器一个作主机一个做从机就行 了

      同样使用海凌科官网提供的 HLK-B40 软件连接到蓝牙模块,按照下图内容修改参数 设置:

      640 (4).jpe

      上图需要注意的点为透传相关 UUID。

      三个 UUID 需要改成同一个才能和手机 APP 正常通信,否则手机只能连接模块但无法收发数据。

      接着在代码仓库下载源码,自行编译,或直接下载 apk。

      注意!手机 app 需要打开权限,否则无法正常使用。

      640 (5).jpe

      此 APP 不联网,定位权限是使用蓝牙的前提,不会泄露您的任何信息。

      开源项目资料获取

      需要【软硬件资料+视频演示文件】,请“复制链接”进入开源页查看:https://oshwhub.com/realtix/cyber-wand-v851s_bmi088_keras

      640 (9).gif

      PS:空调也能控制,再也不用为满屋子找不到空调遥控器而发愁啦~

      640 (10).gif

      本文转载了「立创开源硬件平台」的用户创作,如有侵权,请联系删除
      原文链接:https://mp.weixin.qq.com/s/-jUd17vBvcNGdUSbRAQDxg
      项目链接:https://oshwhub.com/realtix/cyber-wand-v851s_bmi088_keras

      发布在 V Series
      q1215200171
      budbool
    • 3月全志芯片开源项目分享合集

      GPT语音对话猫猫

      作者:KJ
      开源项目地址:https://oshwhub.com/kjpig/esp32-chat-meow

      G6mmAvPwLQuwTdozMsSGdNb040TNPofXyIaX6MLB.jpeg

      GPT语音对话猫猫有两个不同的硬件版本,其中一个使用Linux系统来进行功能实现的硬件版本,是采用了基于全志H3芯片的香橙派Zero开发板。

      这个版本由一个基本的Linux派和语音扩展模板组成,非常简单。语音扩展模块提供了一个基本的麦克风输入和一个功放,同时提供锂电池充放电系统,达到便携的目的,通过修改语音扩展板的PCB理论可以支持绝大多数的派,选择香橙派主要是因为其尺寸迷你,价格性能也不错。

      连接上语音扩展模块化后,将音箱连接ChatGPT,与之对话,就可以充当一个能聊天的语音助手。再借助ChatGPT的函数调用功能,可以做出类似小爱同学智能音箱那样控制实体设备的功能。

      rDrv3KvlTQMNTfF2o3EbVdgBPz76KjmANdSNjdeC.png

      39C080F6-B067-4951-873E-22E0BDFF66F8.png

      405616BC-B5C3-46ad-A850-62D9F6613A4E.png

      6CD41D97-ABDA-4e65-AD9A-A1F848363D46.png

      D43EA878-C43F-45b4-B51A-6E059ABB7708.png

      AXP2101全功能专业电源管理模块

      mp7wVFFQ0JtS0UTULw0Jzz1EsZUHAtDTyAR39aKA.jpeg

      作者:mondraker
      开源项目链接:https://oshwhub.com/mondraker/axp2101_2023-11-18_20-15-19

      AXP2101作为PMIC被广泛使用在LilyGO、M5Stack等创客圈口碑较好的企业产品中,并且有由大佬维护的GitHub库,包含Linux驱动,arduino库,espidf例程,Micropython例程,plantformIO例程等等......作者本人也是选用AXP2101来对过往基于AXP202/AXP173芯片所开发的项目进行换代升级。

      硬件部分的升级主要体现在:为方便PCB电路板的设计与焊接,增加成功率,本设计采用模块化思想,将AXP202外围电路封装为一个邮票孔模块焊接在主板上,将可用户自定义的管脚全部引出,极大简化了芯片外围(只有电感与电容),增加了多路电源,布线简单,芯片封装缩小,融合ACIN与VBUS为一个输入。

      软件与寄存器部分的升级主要体现在:内置的电量计量算法通过内置的库仑计与电压计等等准确计算出电池电量,存在REG A4中(直接读寄存器就能读出来,不需要任何转化),更高的可选的充电电流(充电模式可定制线性充电与开关充电),各方面的功能都有了更精细的配置等。

      qEvXqskgU1Z04tAEZuTTYnOG5W21Dx2pbTEhHA9r.png

      GFix6MVLeTTLJEeNWQYBGMMkrZ6n6J9PhCIBTTGO (1).jpeg

      CB3713C0-02D1-4c73-899F-E38C116BDB43.png

      4BD2D5E9-1B11-4b43-995A-40DE91260103.png

      Bomb Pi Zero

      作者:Bomb Studio
      开源项目地址:https://oshwhub.com/bomb-studio/bomb-pi-zero

      Ttn7WCi7ZbI0uIHPErB4u176nj8t9910Zw4aPK9Q.jpeg

      本项目这是基于 Yuzuki Chameleon 修改的更小的H616开发板,在原工程基础上完全重置pcb,重新layout,以缩小整块pcb,外形类似树莓派Zero板型,并适配嘉立创的盘中孔工艺。

      为了缩小体积,作者把emmc放在开发板背面,并在背面用丝印标注了GPIO管脚定义。为了方便焊接,螺丝孔周围没有铜,再也不用担心螺丝孔上锡了,并且修改Type-C口的CC脚电阻,原电路可能会在使用CC线或者有emark的线缆时出现问题。

      其他电路没有修改,功能完全相同。开发板板载4个USB Type C 接口,分别为3个HOST和一个OTG,支持USB摄像头与采集卡输入。H616支持HDMI显示,板载一个 HDMI接口;同时板载XR829 蓝牙/WIFI模组和引出RJ45百兆接口;板载eMMC与TF卡槽;40 Pin GPIO,可以扩展 SPI LCD 显示屏,千兆以太网,麦克风阵列,CAN收发器,温湿度传感器,加速度传感器等等。

      AE026BFA-F150-41fa-AA5C-DC588D7D6BED.png

      A8E90B4D-BA5C-43eb-9EAE-3537F1E31CDE.png

      1D09A38E-3953-491c-932F-798864886620.png

      F2E58439-D64D-4039-BB2D-FA52D50E742C.png

      发布在 爱搞机专区
      q1215200171
      budbool
    • 用R128复刻自平衡赛车机器人,还实现了三种不同的操控方式

      经常翻车的朋友们都知道,能在翻车后快速摆正车身的车才是好车。

      就像动画《四驱兄弟》中展现的那样,在比赛中需要跟着赛车一起跑圈,而且赛车如果被撞翻还需要重新用手扶正,所浪费的时间非常影响比赛结果。

      EE2D3553-365A-4409-903B-F6097D543112.png

      如果小豪和小烈可以拥有一款能通过发挥R128的WiFi&蓝牙特性的平衡小车,从而能通过WiFi或蓝牙连接的方式进行控制,既可以自平衡和转向,又可以远程操控,那冠军岂不是手到擒来。

      ezgif.com-optimize (5).gif

      ezgif.com-optimize (4).gif

      它,就是可以自平衡的赛车机器人——B_ROBOT_100ASK

      项目简介

      本项目基于jjrobots的开源项目B-ROBOT EVO2进行复刻,与原开源项目不一样的地方是,作者将原本适配的的Arduino控制板移植为DShanMCU-R128s2-DevKit开发板,与此同时还添加了一些功能,比如自平衡功能、WiFi&蓝牙控制、App控制以及语音控制功能,让平衡小车的操控乐趣更上一层楼。

      D8A56F71-0A76-4d94-9B9D-212BB2DD2048.png

      ezgif.com-optimize (6).gif

      硬件设计

      本项目中的自平衡赛车机器人的硬件设计结构非常简单,硬件部分主要由R128开发板和几个驱动模块组成。

      D39C081F-C757-4f0c-8050-13E12ACBC4C3.png

      • 供电模块
        自平衡机器人采用锂电池供电的方式,并利用mini360航模电池降压模块来将较进行电压的转化工作,以满足小车设备对电压方面的需求

      • 电机驱动模块

      自平衡机器人选用两个NEMA17步进电机,并选用DDRV8825步进电机驱动模块来负责与电机之间的控制信息传输。

      DDRV8825步进电机驱动模块的体积小,驱动能力强,它只需要一个PWM波就能控制步进电机,同时基本上三个引脚就能完全控制步进电机。

      通过该模块可以使小车快速反应R128下达的运动信息,驱动小车本身的轮子进行运动。

      • 平衡模块

      MPU6050是一种6轴运动跟踪传感器,它包含3轴陀螺仪、3轴加速度计、运动处理器和温度传感器。它可以通过I2C总线接口与微控制器进行通信,并且可以通过辅助I2C总线与其他传感器设备通信。

      MPU6050的主要作用是帮助机器人实现姿态感知和运动控制,提高机器人的自主性和灵活性。

      遥控手柄UI控制(LVGL)

      作者本人还利用R128开发板来移植了一个酷炫的LVGL遥控手柄UI,通过手柄上的菜单栏UI可以选择不同的机器人基础参数设置和进行机器人操控。

      ezgif.com-optimize (7).gif

      在自平衡机器人启动后,可以通过面包板上的两个手柄去遥控机器人的前进后退和转弯,并且在屏幕上还会实时返回机器人的倾斜角度、速度、电量等状态。

      ezgif.com-optimize (8).gif

      实现APP控制

      在机器人竞速中,必须要在准确性和速度之间找到平衡。为了更好的反馈给自平衡机器人设置不同参数下的运动状态,作者针对自平衡机器人进行了控制App的适配。

      app-v2-e1538486753789.png

      App可以实时显示电池状态和机器人的倾斜角度,操作者只需要通过App中的几个可视化按钮和滑动栏来实时修改其PID,以实现对机器人速度和状态的远程控制。

      自平衡机器人的一般行为由一组参数定义:

      
      // NORMAL MODE PARAMETERS  
       #define MAX_THROTTLE 550  MAXIMUM VELOCITY
       #define MAX_STEERING 140 MAXIMUM SPINNING VELOCITY
       #define MAX_TARGET_ANGLE 14 MAXIMUM ANGLE REACHED WHEN MOVING
      
      // PRO MODE = MORE AGGRESSIVE (MAXIMUM SETTINGS)
       #define MAX_THROTTLE_PRO 860  MAXIMUM VELOCITY. PRO MODE
       #define MAX_STEERING_PRO 280 MAXIMUM SPINNING VELOCITY. PRO MODE
       #define MAX_TARGET_ANGLE_PRO 32  MAXIMUM ANGLE REACHED WHEN MOVING. PRO MODE
      
       #define KP 0.32 // 0.14
       #define KD 0.050 // 0.028
       #define KP_THROTTLE 0.075 //0.075
       #define KI_THROTTLE 0.1 // 0.1
       #define KP_POSITION 0.06 //0.055
       #define KD_POSITION 0.45 //0.5
       //#define KI_POSITION 0.02
      

      比如:

      • 高MAX_THROTTLE_PRO值会使机器人更快,但如果不能顺利恢复垂直位置,稳定性会降低。

      • 高MAX_STEERING_PRO值会让机器人旋转得更快,但转弯时更难精确控制。

      • 高MAX_TARGET_ANGLE_PRO值将使机器人减小其相对于地板的角度,但这会使恢复和转弯变得更加困难。

      ezgif.com-optimize (4).gif

      ezgif.com-optimize (3).gif

      UDP 网络通信控制

      这个功能的实现比较简单,利用R128本身自带的WiFi&蓝牙特性,来实现两块R128开发板(机器人自身携带&手上的操控端)的UDP网络通信控制。

      ezgif.com-optimize (9).gif

      源码获取

      基于R128-S2设计的全套开发板已上线淘宝百问网韦东山老师个人店进行售卖,包含黑色的DshanMCU-R128s2-R16N16模组和全套的DshanMCU-R128s2-DEVKIT。

      • DshanMCU-R128s2-R16N16模组:39.9元
      • DshanMCU-R128s2-DEVKIT开发板:49.9元

      R128开发板购买链接:https://item.taobao.com/item.htm?spm=a21n57.1.0.0.46b0523cMfarLo&id=736154682975&ns=1&abbucket=5#detail

      “主图_01”为智能对象-1.jpg

      Gitee源码获取链接:https://gitee.com/weidongshan/100ask_r128_demos
      GitHub源码获取链接:https://github.com/100askTeam/100ask_r128_demos

      更多关于项目的详情可以前往百问网R128综合项目开发案例界面了解:https://aw-r128.100ask.net

      发布在 A Series
      q1215200171
      budbool
    • 一条命令搞定全志XR806编译环境

      本文转自极术社区:https://aijishu.com/a/1060000000311849、

      XR806是全志科技旗下子公司广州芯之联研发设计的一款支持Wi-Fi和BLE的高集成度无线MCU芯片,基于安谋科技STAR-MC1架构,支持鸿蒙L0系统。

      全志科技同时也发布了一款XR806的开发板,具体长这样:
      1398772385-623c08aba9567.jpg

      之前有很多刚接触它的朋友,被编译环境难住了。

      最近正好有空,干脆把相关代码和编译工具都做了配置和集成,做了个容器给大家。

      系统是Ubuntu 20.04,OpenHarmony代码版本是1.0.1_release。

      项目地址:
      https://hub.docker.com/r/verdureorange/ubuntu_xr806/

      具体用法:
      装完Docker以后,docker run -it verdureorange/ubuntu_xr806:v1 /bin/bash

      如果你是Windows或Mac,可以下载Docker桌面版:
      https://www.docker.com/products/docker-desktop/

      主要代码在/root/xr806_openharmony/,大家可以直接在里面编译或调试。

      如果有不清楚的地方可以看以下视频,感谢前面很多开发者所做的工作。

      发布在 Wireless & Analog Series
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 Tina下RTSP环境搭建方法

      1.主题

      Tina V85X RTSP环境搭建方法

      2.问题背景

      本FAQ主要介绍Tina V85X上搭建RTSP环境的方法。

      目的
      对于小内存的机器(不支持SD卡扩展),无法存储大文件,需要通过RTSP方式查看编码的结果码流;

      测试和调试时,方便实时查看编码后的码流。

      3.问题描述

      3.1复现步骤

      硬件环境

      • PC主机(台式或笔记本)
      • USB转网口
      • 开发板(支持网口)
      • USB Hub(备选,若PC的USB口够用可不用)

      硬件连接方式
      89cbc0d9b40e4c138ce91ad57d0506af.jpg

      硬件连接好后,在PC命令行(Win+R,输入cmd)中,通过 ipconfig 命令可以查看新加网卡的IP地址和子网掩码(后面配置小机端IP和netmask时需要用到)。

      3.2具体表现

      软件环境

      按前面的硬件环境配置好后,在小机端(开发板)通过命令 ifconfig 查看IP地址发现没有分配。此时,可以临时用 ifconfig 命令配置一下(重启后会失效,需要重配)。

      注意:

      小机端的IP地址配置需要与新加网卡的IP在同一个网段(169.254.234.xxx),子网掩码需要与新加网卡的一致(255.255.0.0)。

      ifconfig eth0 169.254.234.222 netmask 255.255.0.0
      

      另外,通过修改网络配置文件(/etc/sysconfig/network-scripts/ifcfg-xxx)的方式可以永久修改IP,但是当前客户方案不支持这样修改,所以只能采用临时修改的方式。别的方案上可以自行尝试。

      通过adb 将测试demo(支持RTSP)push 到小机端。

      adb push .\sample_rtsp\sample_rtsp /tmp
      adb push .\sample_rtsp\sample_rtsp.conf /tmp
      

      在小机端串口上,执行demo开启测试。

      cd /tmp
      chmod +x sample_rtsp
      ./sample_rtsp -path sample_rtsp.conf
      

      此时,在串口上可以看到RTSP的URL提示,根据当前测试情况选择对应的URL。比如: rtsp://169.254.34.222:8554/ch0 ,可以保存一下,后面使用VLC播放时要用到。

      在PC主机上开启软件VLC(或者PotPlayer),输入RTSP的URL即可实时播放。

      1e8a40f91f844b1c87465635bbba6c6d.jpg

      保存mp4文件
      在VLC播放时,还可以实时保存接收的测试流为mp4文件。

      总结

      通过前面的介绍,可以快速了解RTSP环境搭建的步骤。按照步骤一步一步可以顺利搭建RTSP测试环境,方便测试和调试。

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 梦回2004!我用全志V3s做了个成本100元,功能媲美MP4的随身终端

      本项目是基于全志V3S的随身终端(类似MP4),命名为V3S-PI,开发板使用四层板制作,全板采用0603电容电阻,相较于0402,制作更为方便,同时成本可压缩至100以内。

      项目简介

      开发板选用全志V3S为主控,V3s单核Cortex-A7带有硬件浮点计算,且芯片内封64Mbyte DDR2,无需再外挂DDR2芯片,极大程度上为开发板的走线设计降低了难度。

      微信图片_20240108132611.jpg

      微信图片_20240108132629.jpg

      tGX4sE3Pkh6zu8MFPXX16bw9AFVWRdmInbsATjDh.jpeg

      开发板的外设以及功能有将近10个:获取天气、连耳机播放音乐、10M/100M以太网接口、连wifi、接入SD卡、调整屏幕亮度、按键控制、外接其他设备、1转4USB HUB......

      由于开发板设计功能繁多,为了教会大家自己DIY开发板,作者将项目整体拆分为了6大部分,分别为项目特性、软件开源、硬件开源、软件方案、开源网址,来对开发板整体设计进行全面介绍和详细讲解电路原理。

      项目特性

      • 全志V3S主控,采用单核Cortex-A7,带硬件浮点
      • 芯片内封64Mbyte DDR2,无需外挂DDR2
      • 支持RTL8723BS 2.4G WIFI
      • 通过CH334R扩展双USB口
      • 耳机接口采用V3S内置声卡
      • 支持10M/100M以太网接口
      • 支持SDMMC接口,用于启动系统
      • 支持CH340N 串口转USB,用于连接串口终端
      • 支持LRADC,四个ADC按键
      • 2.4寸LCD彩屏,使用SPI接口
      • 2x8扩展接口,用于扩展I2C/UART

      软件开源

      在目前网上资料的基础上,作者自行移植了主线内核Uboot以及root。目前仅支持SD卡以及SPI Nor启动,SPI Nand启动请不要参考当前代码。

      1、UBoot快速启动:

      git clone https://gitee.com/fhcloud/uboot-v3s
      cd uboot-v3s
      make v3s_pi_defconfig
      make
      

      输出的文件在源码根目录:

      u-boot-sunxi-with-spl.bin
      

      2、Linux快速启动:

      git clone https://gitee.com/fhcloud/linux-v3s
      cd linux-v3s
      make v3s_pi_defconfig
      make
      

      输出的内核文件在:

      arch/arm/boot/zImage
      

      输出的设备树请使用:

      arch/arm/boot/dts/sun8i-v3s-pi.dtb
      

      3、Buildroot快速启动:

      git clone https://gitee.com/fhcloud/buildroot-v3s.git
      cd buildroot-v3s
      make v3s_pi_defconfig
      make
      

      输出的文件在:

      output/images/rootfs.tar
      

      硬件开源

      硬件采用四层板设计,下面会将电路拆分为11部分,逐一说明。

      微信图片_20240115094646.png

      主控部分

      本项目主控采用全志V3S,需要注意的是,R3/R5电阻需使用1%,同时,EPHY存在两组电压。

      微信图片_20240108132631.png

      ADC按键

      板载四个ADC按键,电压跨度为0.2V,通过分压电阻实现。

      微信图片_20240108132636.png

      2x16 PIN扩展接口

      此处通过排针,引出了8个扩展接口,包含了一个串口/一个I2C总线,可用于外接其他设备。

      微信图片_20240108132639.png

      辅助供电

      板载四组供电芯片,分别产生3.0V、3.3V、1.8V、1.2V,其中:

      • 3.0V用于PLL以及AVCC模拟供电
      • 3.3V负责芯片IO以及其他外设供电
      • 1.8V用于内存供电
      • 1.2V用于V3S核心主控供电。
      • 三路DCDC最大输出电流2A。

      微信图片_20240108133108.png

      WiFi模块

      板载2.4G WIFI模块,使用RTL8723BS模块,V3S与WIFI模块之间采用SDIO接口连接,引出一个IPEX接口用于外接天线,R20-R27为SDIO和芯片要求的上拉电阻,C50/C51/C70为外围滤波电容,模块采用3.3V供电。

      微信图片_20240108133113.png

      10/100M以太网接口

      百兆以太网需要使用两组差分,分别为RX/TX差分。以太网PHY一般带自动翻转功能,所以RX/TX可以对调。V3S以太网使用电压驱动,只需在网口变压器中心抽头处加100NF电容到地即可。内部封装的电阻和2KV电容用于泄放主板的静电,防止高压打坏主控芯片。

      R28/R29为LED限流电阻,SH1 SH2为外壳,直接接地即可。

      微信图片_20240108133117.png

      2.4寸LCD彩屏

      2.4寸彩屏通过SPI与主控进行通信,PE8接彩屏重置线。PE9接DC用于区分数据/指令。

      LEDA为背光阳极,LEDK接Q1 MOS,用于主控控制背光开关,屏幕通过焊锡焊接到PCB板上。

      微信图片_20240108133120.png

      CH340串口转USB

      使用CH340N芯片,实现串口转USB,用于电脑连接终端。

      R30/R31用于确保双头TYPEC线正常供电,D1为TVS,用于保护USB接口,此处使用3.3V供电,所以CH340N的VCC和V3需要连接到一起,同时增加100nf电容。

      微信图片_20240108133126.png

      CH334R 1转4 USB HUB

      通过CH334R芯片,实现一转四个USB Host口,此处采用统一供电,所以VDD33与V5连接到一起即可。

      • XI XO输入12Mhz晶振
      • DPU/DMU接上行USB口

      微信图片_20240108133130.png

      耳机接口

      耳机接口采用PJ-342接口,带音频和录音:

      微信图片_20240108133133.png

      SD卡接口

      SD卡接口用于插入MicroSD卡,R32-R36为SD卡上拉电阻,这里CLK不需要上拉,否则可能会影响SDIO通信。

      微信图片_20240108133135.png

      软件设计

      软件方案主要讲这8个部分:Linux内核、2.4寸LCD彩屏驱动、USB、以太网、无线网卡RTL8723BS、ADC按键、音频播放、libcurl。

      Linux内核

      内核采用Linux5.15.143主线内核,在其基础上,修改了部分代码,适配V3S大部分外设。

      2.4寸 LCD裁判驱动

      LCD彩屏使用SPI接口与主控连接,由于各家屏幕初始化代码不同,所以st7735r.c文件在原来的基础上,我们只需修改st7735r_pipe_enable这个函数中的代码即可。

      • 软件部分采用TinyDRM,与传统的fbtft相比,不再是固定帧率刷新。
      • 采用DRM架构,可以与新架构程序更快集成。

      修改完成的代码参考下方文件,设备树配置参考:

      
      &spi0 {
             status = "okay";
             pinctrl-names = "default";
             pinctrl-0 = <&spi0_pins>;
      
      
             display@0 {
              compatible = "jianda,jd-t18003-t01";
              reg = <0>;
                 spi-max-frequency = <95000000>;
      
      
              backlight = <&panel_backlight>;
              dc-gpios = <&pio 4 9 0>; // PE9
              reset-gpios = <&pio 4 8 0>; // PE8
              rotation = <0>;
          };
      };
      

      除spi外,需要添加一个背光节点,这样就可以在用户层操作背光:

      panel_backlight: panel-backlight {
                    compatible = "gpio-backlight";
              gpios = <&pio 4 7 GPIO_ACTIVE_HIGH>; // PE7
                    default-on;
                    status = "okay";
             };
      

      USB接口

      设备树配置参考:

      
      &usb_otg {
             dr_mode = "host"; // peripheral
             status = "okay";
      };
      
      
      &usbphy {
             status = "okay";
      };
      

      除引用节点外,一定要添加ochi/echi,不然USB插入会没有反应:

      soc {
                    ehci0: usb@01c1a000 {
                           compatible = "allwinner,sun8i-v3s-ehci", "generic-ehci";
                           reg = <0x01c1a000 0x100>;
                           interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
                           clocks = <&ccu CLK_BUS_EHCI0>, <&ccu CLK_BUS_OHCI0>;
                           resets = <&ccu RST_BUS_EHCI0>, <&ccu RST_BUS_OHCI0>;
                           status = "okay";
                    };
      
      
                    ohci0: usb@01c1a400 {
                           compatible = "allwinner,sun8i-v3s-ohci", "generic-ohci";
                           reg = <0x01c1a400 0x100>;
                           interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
                           clocks = <&ccu CLK_BUS_EHCI0>, <&ccu CLK_BUS_OHCI0>,
                           <&ccu CLK_USB_OHCI0>;
                           resets = <&ccu RST_BUS_EHCI0>, <&ccu RST_BUS_OHCI0>;
                           status = "okay";
                    };
             };
      

      以太网

      直接引用DTSI文件中的emac节点即可,设备树参考:

      
      &emac {
             allwinner,leds-active-low;
             status = "okay";
      };
      

      无线网卡RTL8723BS

      Linux下SDIO架构类似于USB,设备插入后,如果有对应驱动,会自动加载。

      所以设备树中,我们只需要配置好MMC1接口,然后编译对应的驱动ko,在rootfs中加载即可。

      &emac {&mmc1 {
             broken-cd;
             bus-width = <4>;
             vmmc-supply = <&reg_vcc3v3>;
             status = "okay";
      };
             allwinner,leds-active-low;
             status = "okay";
      };
      

      编译完成的ko文件在buildroot的overlay目录下面,可以参考下方资料:

      微信图片_20240108133141.png

      r8723bs.ko就是编译完成的内核模块,此处的模块backport了5.19内核的驱动,相比于5.15的驱动更加稳定。

      除ko文件外,此处还需要加载网卡固件,参考下方目录:

      微信图片_20240108133144.png

      连接WIFI请参考下方脚本:

      [root@buildroot ~]# cat conn.sh
      modprobe r8723bs.ko
      wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
      udhcpc -i wlan0
      

      配置文件请参考下方:

      ctrl_interface=/var/run/wpa_supplicant
      ap_scan=1
      
      
      network={
              ssid="###############"
              psk="###############"
      }
      

      音频播放

      Buildroot中集成了alsa,默认声卡会静音状态,打开终端,输入alsamixer,首先解除静音。

      在当前界面,选中Headphone,然后按下M键 解除静音,然后使用键盘↑,调整音量到合适大小即可,界面可参考:

      微信图片_20240108133147.png

      调整完成后,输入mpv 文件名 --no-video,插入耳机,即可实现音乐播放:

      
      [root@buildroot ~]# mpv 2.flac --no-video
           Video --vid=1 [P] (mjpeg 500x500 1.000fps)
       (+) Audio --aid=1 (flac 2ch 48000Hz)
      File tags:
       Album: 西厢寻他
       Title: 西厢寻他
       Track: 1
      AO: [alsa] 48000Hz stereo 2ch s32
      A: 00:00:04 / 00:03:43 (2%)
      
      
      Exiting... (Quit)
      

      命令提示符显示当前目录,编辑/etc/profile文件,添加一行,然后export /etc/profile重新加载配置即可:

      export PS1='[\u@\h \w]\$ '
      

      开源资料获取

      本项目所有资料均已开源,软硬件都开源了,想获取资料自己DIY学习的伙伴,请前往 https://oshwhub.com/fanhuacloud/v3s_lcd 获取。

      640.gif

      发布在 爱搞机专区
      q1215200171
      budbool
    • 【开发板试用】新一期的全志XR806开发板免费试用,支持FreeRTOS+Openharmony

      XR806试用海报.jpg

      开发板数量:全志XR806开发板50块

      申请方式:极术社区在线填表 aijishu.com/e/1120000000426896

      系统推荐:FreeRTOS,全志在线免签NDA下载 https://xr806.docs.aw-ol.com/rtos/env/

      活动时间:申请截止9.22,试用截止10.31

      全志XR806开发板是一款基于XR806芯片设计,高度集成WiFi/BLE/常用外设,可供开发者进行方案评估、DIY或小规模产品研发,可广泛应用于智能家居、智能楼宇、智能城市和工业互联等领域。

      image-20211018163514601.png

      • 兼容802.11b/g/n,集成TCP/IP协议栈及WLAN协议栈、支持完整网络服务协议

      • 支持BLE 5.0,支持完整低功耗蓝牙服务GATT,SIG mesh完整协议栈

      • 内置低功耗PMU,支持智能低功耗管理系统,多级唤醒源设置;支持WiFi超低功耗保活,广泛应用各类低功耗应用场景

      • 丰富的io接口,板载15个可编程GPIO,支持常用外接接口,如SPI/UART/I2C/PWM/ADC/IrDA TX/RX

      • 全安全架构,TrustZone/安全总线/安全Memory/安全eFuse/安全启动/安全Debug接口/Flash实时加解密

      试用要求

      在收到开发板一个月内,参与试用的开发者需要在极术社区或全志在线开发者社区发布基于XR806的应用文章(不包含开箱体验及基础烧录,点灯类体验文章),完成发文任务的极术社区会邮寄相应礼品,标题请以【XR806开发板试用】+自主标题命题。

      优秀案例

      1. 【XR806开发板试用】棋子分拣机
      2. 【XR806开发板试用】轻松连上华为云实现物联网
      3. 【XR806开发板试用】在 xr806 上移植 LVGL
      4. 【XR806开发板试用】基于XR806的鸿蒙舵狗

      FreeRTOS软件入门

      XR806 是一颗高集成度无线应用MCU,其集成了ARMv8-M 内核、IEEE 802.11b/g/n Wi-Fi 子系统、BLE 5.0子系统、电源管理系统、高级别的安全系统以及丰富的外设接口,具有优秀的射频性能、稳定性、可靠性和超低功耗。

      芯之联软件开发平台,具有丰富的组件和灵活的应用框架,可满足用户对Wi-Fi、BLE、低功耗、安全等多方面的需求,可协助用户快速开发智能产品应用,包括物联网(IoT)、智能家居、云连接等。

      芯之联软件开发平台,具有丰富的组件和灵活的应用框架,可满足用户对Wi-Fi、BLE、低功耗、安全等多方面的需求,可协助用户快速开发智能产品应用,包括物联网(IoT)、智能家居、云连接等。

      image-20230816102035244.png

      XR806试用海报.jpg

      发布在 Wireless & Analog Series
      q1215200171
      budbool
    • 【FAQ】全志系列芯片如何把flash擦成空片?

      1.主题
      如何把flash擦成空片

      2.问题背景
      产品:all
      硬件:all
      软件:uboot+pc端烧录工具(PhoenixSuit/PhoenixUsbPro/awflash命令行工具)
      其他:无

      3.问题描述
      有的时候想把flash擦成空片或者只格式化普通分区如user data分区,但是又不想重新烧录固件,如何只进行擦除而不升级固件?

      4.解决办法
      (1)把附件spec_tool_只擦除flash不烧录固件的插件.fex,重命名为spec_tool.fex放到烧录工具目录下。
      (2)PhoenixSuit:选择机器对应的固件。选择工具界面上保留数据升级:勾选该按钮,则升级前不进行格式化,private,secure storage、user data、mbr分区保留,其他擦除;选择分区擦除升级:勾选该按钮,则升级前只格式化普通分区,private,secure storage分区保留,其他擦除(注意会擦除mbr然后重新烧录mbr);选择全盘擦除升级:勾选该按钮,则升级前格式化全盘,包括SN等数据整块flash全部擦除执行完后flash变成空片,然后执行烧录。
      (3)PhoenixUsbpro:不勾选工具上的全盘擦除,是否擦除取决于sysconfig.fex的eraseflag字段;勾选工具上的全盘擦除,整块flash全部擦除。
      (4)awflash:命令行烧录工具,加上参数-e表示全盘擦除,不带-e参数是否擦除取决于sysconfig.fex的eraseflag字段。

      注:全盘擦除需要是uboot2018及以上的uboot版本,如果需要恢复成正常烧录固件请把spec_tool.fex文件删除然后重启工具即可。擦成空片后的flash如果打开了工具会执行跳fel动作。如果操作不成功,请查看串口打印erase_flag的值是否对应正确。
      

      spec_tool_只擦除flash不烧录固件的插件.fex

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【优秀毕设分享】基于全志D1-H和XR806的名贵植物监控装置

      前言

      “42A4D9C6-E89F-43f8-90BA-BE9BC19CE174”为智能对象-1.jpg

      该毕业设计是使用全志D1-H哪吒开发以及XR806开发板,再辅以外围的各种电路和传感器原件,制作而成的一个名贵植物监控装置。

      95BAC021-ED3C-4b1d-8CB2-3FC79EA00ABD.png

      该装置使用了XR806开发板构成一个网络节点,作为采集端,并且还连接了多个传感器进行环境参数的采集,并使用socket服务将采集到的数据发送到服务端。另一边使用了D1-H哪吒开发板作为服务端,D1-H哪吒开发板连接了摄像头实时采集图像,并使用基于yolov5的方法分析叶片状态,判断叶片的健康度并作为服务器,将传感器传回的数据进行分析与显示。服务器根据分析的结果,能够对XR806发出指令,在缺水的时候能够及时补水,光照不足的时候进行补光。

      总1.png

      图片4.png

      技术栈运用

      D1-H开发板负责完成服务器收发信息、信息显示、光照控制、图像处理,涉及技术内容:

      • LVGL图形框架
      • Linux下Socket接口
      • Linux下多线程技术
      • cJSON解析器
      • YOLOV5目标检测
      • ......

      XR806开发板负责完成环境参数采集、光照控制、水泵控制,涉及技术内容:

      • LwIP协议栈
      • IIC总线
      • DHT11单总线
      • PWM调制
      • ADC采集
      • ......

      XR806端设计

      XR806主控的系统由传感器采集部分、电源部分和控制部分组成。传感器部分负责采集环境信息,电源部分主控供电,控制部分则根据系统的信息对特定的环境参数(LED灯,水泵)进行控制。

      1.png

      实物示意图.jpg

      充电电路

      因为电池的电压会随着点亮的变化会有一定幅度的改变,所以需要将其稳定下来才能使用。电源部分就是使用了一个AMS1117芯片,将锂电池输出的不稳定电压稳定到3.3V,给XR806开发板及传感器供电。AMS1117是一个正向低压降的线性稳压器,压降较小。其内部集成了过热保护功能与限流电路,能有效地保护电路的正常运行,是便携式设备稳压器的理想选择。

      图片7.png

      光线、温湿度控制

      补光控制主要使用了PWM调光技术。控制代码主要是控制PWM输出的占空比来调节光照的强度。在XR806中,首先初始化PWM的硬件,使用的是pwm_cycle_mode_Set(0)和pwm_capture_mode_set()函数。函数里主要配置的是相关的初始化结构体参数、PWM的频率、输出模式和占空比。初始化结束后,只要调用设置占空比的函数,即可设置占空比。结合光照传感器的控制,就可以将局部的光强控制在一定的范围内,也就是植物合适的光照。

      补水部分主要配合土壤湿度传感器来进行工作。土壤湿度传感器获取到土壤湿度数据后,XR806中会进行一个判断,如果ADC采集到的电压大于一定的阈值,则启动继电器,驱动水泵进行工作,将水抽到花盆中。而显示屏上,就可以看到土壤上是处于湿润还是干燥的状态。

      DB237D7E-9BE1-491c-A8D1-98F5A211D8DD.png

      温湿度、光照、土壤传感器均连接在XR806上,这里取三组传感器的采集数据与标准仪器采集的数据进行比对,由两个测试点作为对照,测量出两组光照强度。对比可以看出,总体误差不大,满足了装置的要求。

      微信图片_20220728162808.jpg

      D1-H与XR806通信

      白色圆圈.jpg

      TCP服务器的设计主要是能够保证D1-H与XR806稳定地进行连接,并在XR806断开后还能够继续等待XR806的重新连接。这边借鉴了github上的一个开源的socket服务器代码,它使用了多线程的技术,并能够承受住较大的服务器压力,非常适合本装置的使用。

      调试的基本过程如下,首先使用D1-H开发板连接上一个WiFi,然后用XR806也连接上同一个WiFi,在D1-H上启动服务器的代码,然后,启动XR806作为客户端进行连接。经过多次测试,D1-H开发板这边服务器运行非常稳定,下位机断开后会重新等待连接,在下位机重新启动后能非常迅速的进行重连。并且,在Linux下,可以使用system(wifi_info)函数来调用命令行,只需要将命令作为一个字符数组保持,就可以在程序中使用命令行操作,非常方便。本装置中连接WiFi的部分就是用这个方法,调用命令行来连接WiFi的。

      D1-H服务端设计

      D1-H主控的服务端软件设计根据项目所需要的功能分为三大部分。第一部分是图形界面的设计,采用的是LVGL,主要用于显示温度、湿度等数据;第二部分是TCP服务器的设计(已于上一部分介绍),用于上下位机之间的数据传输与通信;第三部分是图像处理部分,使用了YOLOV5+NCNN。

      040A0770-33A3-45cf-868A-E1CC7D4A703F.png

      数据显示界面

      图形界面使用的是LVGL。LVGL的作者是来自匈牙利的Gabor Kiss-Vamosikisvegabor,LVGL用C语言编写,具有很强的兼容性(并且与C++兼容),模拟器可在没有嵌入式硬件的PC上启动嵌入式GUI设计,同时LVGL作为一个图形库,它自带着接近三十多种小工具可以供开发者使用。这些强大的构建块按钮搭配上带有非常丝滑的动画以及可以做到平滑滚动的高级图形,同时兼具着不高的配置要求以及开源属性,成为广大开发者在选择GUI时的第一选择。

      根据系统的需求,图形界面需要能够显示下位机传上来的数据,而LVGL中可以使用文本控件进行数据的显示。显示图片可以使用一个图像控件配合PNG解码器进行显示。首先,需要创建两个基本控件对象,一个用于停靠采集处理后图像的图像控件,一个是停靠数据显示子控件的控件。在图像控件上,停靠了一个图像,即采集处理后的图像;在数据显示区上,放置了一系列的控件来展示环境参数信息;上边还有用于控制光照强度和水泵的开关。

      LVGL.jpg

      图像处理

      图像处理部分主要是YOLOV5的使用。使用之前,首先要训练针对特定场景的模型。首先需要创建自己的数据集,数据集分为两个部分,图像文件和标签文件。图像文件就是包含了待检测目标部分的图片和不带待检测目标的图像,分别作为正负样本进行训练。标签文件包含了检测目标的信息,标签文件的形式如下表4.2所示。一行数据代表了图像中的一个目标,若文件中含有多行数据,则表明图像中有多个目标。标签文件需要自己对需要检测的目标做标注。

      79F3E3BD-6B21-4c81-AFF8-08AE4E12A35B.png

      有一个比较特别的是,YOLOV5的标签格式是txt后缀的,不是我们常见的xml格式后缀的,需要自己编写代码进行转换。准备好了图像和标签后,还需要保证每个标签与图像的名称一致。准备就绪后,就可以调用train.py文件进行训练。在训练的时候,需要指定一些参数,如下图所示

      E54A0F8E-B65F-481e-8B40-C02AC54D7C9B.png

      启动训练后,电脑会自动开始训练。训练完成后,我们可以看到目标训练结果保存的位置,有一个pt格式的文件。然后可以用detect.py文件来做一个测试,将加载的权重文件换成刚刚训练结束生成的权重文件。detect程序会使用这个文件进行检测,最后会输出一张结果图。从结果图中就可以看出目标检测的结果。

      毕设开题PPT、答辩PPT、论文全文及相关源码将在全志在线开发者社区开源
      毕设开题PPT、答辩PPT、论文全文及相关源码将在全志在线开发者社区开源
      毕设开题PPT、答辩PPT、论文全文及相关源码将在全志在线开发者社区开源
      毕设开题PPT、答辩PPT、论文全文及相关源码将在全志在线开发者社区开源
      毕设开题PPT、答辩PPT、论文全文及相关源码将在全志在线开发者社区开源

      发布在 MR Series
      q1215200171
      budbool
    • 轻算力也能玩大模型,V821成功对接DeepSeek和豆包视觉大模型

      全志推出的最新大模型套件,可以无缝切换各种主流大模型。各大模型官方提供的接入示例多是python、java等语言实现,而全志的套件使用纯C语言实现,内存资源占用少,可方便应用在全志平台Tina Linux系统和Tina RTOS系统上。

      目前,该套件已集成到V821 SDK中,会于2月底随V821 SDK V1.1发出,届时欢迎各位开发者升级体验。

      全志生态的小伙伴们成功在全志A733和T527的SoC平台上实现了DeepSeek-R1-Distill-Qwen-1.5B模型的部署,充分验证了高算力平台在端侧部署AI推理上的潜力。今天我们带来一款全志新的视觉芯片V821,通过网络接入的方式打通DeepSeek-R1满血版模型和豆包视觉大模型,并展示其语言和视觉交互的能力和多样性。

      相较于大模型的端侧部署,云端大模型对端侧硬件算力、存储资源等要求较低,以极佳的成本代价就可以体验到模型最佳的性能表现,覆盖更多的场景形态。本地设备将文字,语音,图像等相关数据通过网络上传,凭借云端大模型对数据的分析和推理海量数据的分析和推理能力,并结合网络搜索的信息,更好地,更加准确地,更加快速地做出判断和反馈,大幅提升应答速度和输出的准确率。

      全志本次在V821平台上基于豆包视觉大模型和DeepSeek语言大模型API实现了完整的大模型接入套件,让V821具备了语言交互及图像识别等丰富能力,让开发者更容易实现大模型的应用,极大的方便了基于V821的智能产品的开发与拓展。

      V821豆包视觉大模型实时采集图像进行物品识别示例:

      下面的视频展示V821接入DeepSeek语言大模型,支持多轮对话+流式输出功能:

      通过以上的两段演示可以发现,在有了接入套件所提供的便利后,云端部署的大模型的运行达到了“满血”状态,无论是物品识别还是多轮持续对话都有很快的输出,确保在微型化设备算力资源受限的情况下,也能流畅自然地使用大模型,实现本地设备与云端AI结合。

      V821是一颗高集成度的低功耗WiFi视觉SOC,集成了高性能ISP和H.264、JPEG编码单元,同时内置了WiFi,因此可以很方便的接入AI视觉大模型,快速实现微型化、高清视频、云端AI结合、低功耗一体化的视觉产品落地。

      V821简要规格如下:

      • 通用算力:CPU RISC-V 1GHz + MCU RISC-V 600MHz
      • 视频输入:1x2lane/2x1lane MIPI-CSI + 支持一路并口CSI
      • 视频引擎:支持H.264最大3072x3072;MJPEG最大8192x8192;支持双目1920x1080@15fps + 640x480@15fps
      • WiFi(内置):WiFi4 单频2.4GHz + 低功耗版本保活功耗180uA(DTIM10)
      • 其他接口:支持一路音频输出/一路音频输入 + 3xSPI / 3xTWI / 4xUART / 12xPWM / 2xSDIO

      全志推出的最新大模型套件,可以无缝切换各种主流大模型。各大模型官方提供的接入示例多是python、java等语言实现,而全志的套件使用纯C语言实现,内存资源占用少,可方便应用在全志平台Tina Linux系统和Tina RTOS系统上。目前,该套件已集成到V821 SDK中,会于2月底随V821 SDK V1.1发出,届时欢迎各位开发者升级体验。

      使用全志提供的大模型接入套件,只需要简单的2个步骤即可接入豆包视觉大模型。

      步骤1:调用lm_init函数进行初始化大模型

      typedef struct {
        const char *url;
        const char *model;
        const char *api_key;
      } lm_config;
      
      
      int lm_init(lm_config *config, lm_handle *handle);
      

      初始化需要填充大模型的URL、模型、API key参数。参数的获取可在各大模型官网进行注册账号后获得,具体可参考各大模型官方的说明文档,本文接入的是豆包视觉大模型,可参考以下链接获取参数信息:https://www.volcengine.com/docs/82379/1362931

      步骤2:调用lm_generate函数访问大模型

      typedef int (*lm_outputcallback)(char* token, void* user_data);
      
      typedef struct {
        char *content;
        prompt_image *img;
      } lm_prompt;
      
      
      int lm_generate(lm_handle handle, lm_prompt *prompt, lm_outputcallback cb, void *user_data);
      

      prompt为输入的提示词,其带有两个参数,content表示输入的文本,img为输入的图片数据;cb为用户注册的回调函数,当接收到云端大模型返回数据时会回调该函数将token信息输出。

      按照以上部署方式使用该套件到V821上,还可以支持DeepSeek的多轮对话和流式输出。所谓“多轮对话”(Multi-turn Dialogue)是指大模型在与用户交互时,能够理解并记住对话历史,并根据上下文信息持续生成符合逻辑的连贯回复的能力,而流式输出是在云端大模型生成token回应时能够实时输出,支持多轮对话与流式输出的能力使得对话不再是孤立的“一问一答”,而是更接近人类自然交流的连续互动。

      全方位拥抱大模型生态,已成为多产品线全面革新的主旋律。AI大模型的普及为产品落地带来了更多元的玩法,全志将针对各产品线不同应用场景的独特需求,深度挖掘本地算力潜能,巧妙融合先进云端技术方案,为用户带来更智能便捷的交互体验,提升工作效率,营造智慧生活,逐步推动AI从前沿科技走向大众生活,用智能硬件助力AI惠民愿景的落地生根。

      发布在 V Series
      q1215200171
      budbool
    • 回复: 全志在线开源芯片 新 SDK 平台下载方法汇总

      @daizebin 秘密😁

      发布在 代码下载问题专区
      q1215200171
      budbool
    • 花费400元,DIY了一台A133平板电脑

      项目作者:flyn

      简介:DIY爱好者,在立创开源平台开源了个人的DIY项目4G手机MiniPhone以及焊接工具焊台、恒温加热台和多功能控制台。

      微信图片_20230815091514.png

      这是一款基于全志A133处理器DIY的平板电脑,可运行android和linux系统。平板搭载一块7寸1024X600分辨率的触摸液晶屏以及3000mAh的电池,且内置双频wifi6/BT5.2通信模块,运行内存2GB,内置32GeMMC,可以外接TF卡。

      微信图片_20230816120027.png

      微信图片_20230816115212.png

      本项目DIY成本共447.3元,花费清单如下:

      640.png

      硬件设计

      平板的PCB设计遵循嘉立创4层板免费打样规则,采用了3313层压,1.2mm厚度,线宽线距3.5mil,过孔0.3/0.4,尺寸控制到10x10以内。

      微信图片_20230816115215.png

      640 (6).png

      3HXQoIctVHHt2TsCxx2xCsBLd7IpCg7ogvsQGxVY.png

      元件基本都设计在PCB的正面,可以方便手焊或者是贴片加工,背面是显示屏的fpc连接座,平板元器件参数如下:

      • 尺寸:173x109x15mm
      • 屏幕:7寸,1024x600分辨率
      • 处理器:Allwinner A133 4核Cortex A53
      • 内存:2G LPDDR3
      • 存储:32G EMMC,可外扩TF卡
      • 电池:3.7V 3000mAh锂电池
      • 操作系统:Android 10
      • WIFI:双频WiFi6
      • 蓝牙:BT5.2
      • 音频接口:3.5mm耳机接口
      • 数据接口:USB2.0x1,USB OTGx1
      • 充电接口:Type-C口

      640 (7).png

      布线设计

      为了能够在嘉立创免费打板,PCB采用了4层板的设计,而A133是没有内置DDR的,所以如何将A133扇出和DDR走线设计将是PCB设计中的两个难点。

      aEJpzZiFe2Qmq0T4J9dpN2gvR7li1FyTI9MOb9zx.png 160a0Ky3CRzhyYRuA3FRe3LBJfaBVhndg6DxPgm0.png oat0Txxy8TbpW3OtOl1RwoPDQCwxcztUD6xzNHtb.png iAS54drqqJhGYgQiqeliYXH5EMrk3tKf4UStWaMg.png

      A133封装是0.5pitch的BGA,需要扇出走3.5mil线宽线距,为了方便走线,有部分焊盘改成椭圆形,DDR尽量走3W,而且免费层压结构最接近的是3313结构,走50阻抗要求线宽6.16mil,4mil的话在阻抗上有偏差。

      综上所述,层压设计为信号层-GND层-VCC层-信号层,DDR布线区域为信号-GND-信号-VCC。注意VCC-CPU和VCC-SYS等这些大电流的电压走线,要尽量粗和短,换层连接处多打过孔。

      布线前最好能找到一些官方的硬件设计指南资料之类的,有助于避坑确保一板过,本项目就参考了Whycan哇酷开发者社区和全志在线开发者社区内的一些设计资料。

      VKQkepQKC2K7wAqdm4YjDpM9398sFoH9ewOV42yy.png

      微信图片_20230815103130.png

      固件及测试

      设计的初衷是做一个可以正常使用的平板,并且可以用来学习linux,故本次项目无需编写太多代码,直接烧入从论坛获取的其它平板的镜像文件即可使用。

      拿到焊了部分元件的PCB板后,可以先通过DragonHD软件进行DDR测试。

      640 (4).png

      验证开发板无问题后,可以使用PhoenixCard软件,将镜像文件烧入到TF卡中来启动,此时内置的EMMC尚未使用。

      640 (3).png

      PCB在硬件上也是接出了调试口以及部分外设的GPIO,可以用来扩展模块学习。可用来调试和查看信息,Jtag口目前未使用,串口引脚如下图所示:

      640 (2).png

      设置波特率115200即可通讯,接口因为尺寸原因用的是1.27间距的排座,后面有设计转接板转成2.54间距的插针,方便调试和使用。

      Lo8Sh1kf5MBRkcFKnidpdjZh6dhGH0Ew1utq8nQi.png

      1dUJUiCGPyO365uxVXH67jytrcU4DTcYdHLu6oTW.png

      外壳设计及组装

      考虑到成本,也为了适应不同需求设计,外壳采用3D打印,且分为:外框、中间层、背板三部分。

      • 外框采用PLA,具有较高的硬度;
      • 中间层采用X树脂,SLA光敏树脂材料成本低;
      • 背板如有散热要求可以用铝型材cnc,可直接贴在处理器和ddr上,想要低成本可以选择PLA或者SLA。

      640 (5).png

      中间层扣在外框上作为PCB和显示屏的固定支架,觉得扣不牢的可以选择小螺丝继续固定。显示屏是直接卡在外框上的,背面和四周可以用双面胶粘住,注意装好后很难拆下来。请保证屏没有问题后再安装,这样设计的目的是让屏幕和外框齐平(建议外框颜色选择黑色和屏幕比较搭)。

      平板结构比较简单,可以参考以下方式安装:

      • 先将中间层卡在外框上,再将PCB板固定在中间层。
      • 接好液晶屏的fpc排线,将液晶屏背面贴好双面胶后扣进外框。
      • 连接好电池、扬声器、天线等并固定。
      • 盖上后盖,拧紧螺丝。

      640 (1).png

      使用体验

      资料获取

      本项目所有资料均已开源,需要【电路+代码+视频演示】源文件,并且想要自己DIY平板学习的伙伴,请戳文末的“阅读原文”获取。

      工程地址:https://oshwhub.com/flyn/flPad

      微信图片_20230815105011.png

      发布在 爱搞机专区
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 如何在Tina V85x平台切换sensor?

      目的

      V85x某方案目前默认Sensor是GC2053。实际使用时若需要用到GC4663(比如wdr功能)和SC530AI(支持500W),可按如下步骤完成切换。

      步骤

      下面以GC4663为例,SC530AI按相应方式适配。

      • Step1 检查Sensor驱动是否被编译成.ko文件
        GC4663 Sensor驱动文件gc4663_mipi.c和配置Sensor驱动编译的Makefile文件路径的路径:
        tina\lichee\linux-4.9\drivers\media\platform\sunxi-vin\modules\sensor
        修改配置Sensor驱动编译的Makefile文件:
        badd8248785d443697081edf9832fb5a.jfif

      添加后,重新mkernel即可编译出GC4663驱动的ko文件。
      fea9bceba2d343f795e9e87b6d0854e2.jfif

      • Step2 检查ISP效果文件是否已适配
        效果文件gc4663_mipi_wdr_default_v853.h路径:
        tina\external\eyesee-mpp\middleware\sun8iw21\media\LIBRARY\libisp\isp_cfg\SENSOR_H\gc4663
        效果文件解析文件isp_ini_parse.c路径:
        tina\external\eyesee-mpp\middleware\sun8iw21\media\LIBRARY\libisp\isp_cfg\

      若没有sensor对应的效果文件,则需要先添加和适配。

      适配后,通过make menuconfig修改sensor为gc4663。
      6ba18ae08ed94d9c82c4287be85e280d.jfif

      • Step3 检查board.dts是否已适配
        板级配置文件board.dts的路径:
        tina\device\config\chips\v853\configs\perf1
        cd8738d697024303abc0df74e8cd710c.jfif

      其中,I2C地址可以从GC4663 Sensor驱动中找到。
      tina\lichee\linux-4.9\drivers\media\platform\sunxi-vin\modules\sensor\gc4663_mipi.c
      4315d546df96410b842e83b42f17fb0c.jfif

      • Step4 修改ko自动加载脚本
        先将ko拷贝到/lib/modules/下,然后加载ko。
        (1)拷贝ko
        modules.mk的路径:
        tina\target\allwinner\v853-perf1
        02aa8ceffcd54e88b29f3b1da4ed89ef.jfif

      (2)加载ko
      S00mpp的路径:
      tina\target\allwinner\v853-perf1\busybox-init-base-files\etc\init.d
      ec50b82e7d93429da29f9b3e4672e389.jfif

      • Step5 重新编译mpp和固件

      重新编译mpp和固件的命令:

      cleanmpp && mkmpp && mp
      
      发布在 V Series
      q1215200171
      budbool
    • 【直播预告】全志XR806芯片应用实战分享

      37e3a7435fb2c2cc16a8a2a8266919b.jpg

      活动简介

      111111111.png
      XR806是全志科技研发设计的一款支持WiFi和BLE的IoT芯片,它采用了安谋科技自主研发的星辰“STAR-MC1”处理器,具有集成度高、硬件设计简单、BOM成本低、安全可靠等优点。可广泛满足智能家居、智慧楼宇、工业互联、儿童玩具、电子竞赛、极客DIY 等领域的无线连接需求。

      为了方便开发者自由开发和定制化,全志在线释放了包括完整系统源码、硬件原理图、bomlist、硬件位号图在内的全部软硬件资料。

      gittee仓库地址:https://gitee.com/awol/open-harmony_-xr806_manifest

      硬件资料下载地址:https://www.aw-ol.com/downloads?cat=12

      技术问题讨论地址:https://bbs.aw-ol.com

      活动报名及直播地址:https://aijishu.com/l/1110000000301384/join

      XR806优秀开发例程

      《基于OpenHarmony的棋子分拣机》

      《用全志XR806开源鸿蒙开发板做一个四足行走机器狗》

      《【XR806开发板实战】轻松连上华为云实现物联网》

      《在XR806开源鸿蒙开发板上移植LVGL》

      《在XR806上用ncnn跑神经网络mnist》

      发布在 Wireless & Analog Series
      q1215200171
      budbool
    • 【FAQ】全志F133(D1s)芯片 如何在Tina下进行显示旋转?

      问题背景

      目前显示多基于横屏的情况设计布局, UI, 图片, 视频等显示. 而常用到的MIPI屏大多都是竖屏, 为避免重新调整布局, 显示提供了竖屏旋转成横屏的显示方式, 节省客户开发时间.

      显示旋转有硬件G2D旋转方式, 软件算法旋转方式, 可根据自己的方案屏情况, 测试对比两种方式选择使用, 主要评估内存占用, 时间效率, 旋转效果.

      显示驱动旋转framebuffer配置

      1.由于此前公版默认在modules.mk屏蔽了屏旋转相关配置, 如果你的版本是禁用旋转的, 需要把相关配置去掉.

      路径:target/allwinner/f133-common/modules.mk
      

      屏蔽以下3个相关选项:

      CONFIG_SUNXI_DISP2_FB_DISABLE_ROTATE
      
      CONFIG_SUNXI_DISP2_FB_ROTATION_SUPPORT
      
      CONFIG_SUNXI_DISP2_FB_HW_ROTATION_SUPPORT
      

      修改后的代码如下:

      .....
      $(eval $(call KernelPackage,net-rtl8821cs))
      
      define KernelPackage/sunxi-disp
        SUBMENU:=$(VIDEO_MENU)
        TITLE:=sunxi-disp support
        KCONFIG:=\
      	  CONFIG_DISP2_SUNXI=m \
      	  #CONFIG_SUNXI_DISP2_FB_DISABLE_ROTATE=y \
      	  #CONFIG_SUNXI_DISP2_FB_ROTATION_SUPPORT=n \
      	  #CONFIG_SUNXI_DISP2_FB_HW_ROTATION_SUPPORT=y \
      	  CONFIG_DISP2_SUNXI_BOOT_COLORBAR=n \
      	  CONFIG_DISP2_SUNXI_DEBUG=y \
      	  CONFIG_DISP2_SUNXI_COMPOSER=n \
      	  CONFIG_DISP2_SUNXI_SUPPORT_SMBL=y \
      
      .....
      

      2.硬件旋转需要确保G2D驱动已经使能

      make kernel_menuconfig
      	Device Drivers  --->
      		<*> SUNXI G2D Driver
      		[*]   sunxi g2d mixer module
      		[*]   sunxi g2d rotate module
      

      3.打开显示驱动旋转支持

      make kernel_menuconfig
      	Device Drivers  --->
      		Graphics support  ---> 
      			Frame buffer Devices  --->
      				 Video support for sunxi  --->
      				 	DISP2 Framebuffer rotation support (Disable rotation)  --->
      				 		 ( ) Disable rotation
      						 ( ) Software rotation support  	(不要选这个,方案未支持)
      						 (X) Hardware(G2D) rotation support (选择G2D旋转)
      

      4.dts配置

      board.dts 和 uboot-board.dts同步修改.

      &disp{
          .....
          disp_rotation_used       = <1>;/* 使能旋转功能 */
          degree0                  = <3>; /* X:screen index; 0:0 degree; 1:90 degree; 3:270 degree */
          fb0_width                = <1280>;/*fb 的长宽交换*/
          fb0_height               = <800>;
          .....
      };
      

      5.旋转后framebuffer编程是需要注意,旋转后的buffer不会直接显示到屏幕上, 需要在应用刷屏的地方调用FBIOPAN_DISPLAY接口.同步旋转后的buffer到LCD上.

      以修改公版旋转的GUI刷屏示例:

      路径:package/gui/littlevgl-6/lv_drivers/display/fbdev.c

      void fbdev_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_p){
      ....
          lv_disp_flush_ready(drv);
          ioctl(fbfd, FBIOPAN_DISPLAY, &vinfo); /*函数最后,在刷屏函数后面,调用 FBIOPAN_DISPLAY 接口*/
      }
      

      软件旋转LVGL UI配置

      公版上lvgl-6上做了UI旋转算法, 软件交换打点位置达成旋转. 该做法纯软件, 不需要改动其他配置, 在原来未旋转的基础上,修改LV_UI_ROTATE_DIRECTION宏即可.

      路径:lv_conf.h

      /* UI rotation:
      * - 0:  no rotate
      * - 1:  90°
      * - 2: 180°
      * - 3: 270°
      */
      
      #define LV_UI_ROTATE_DIRECTION     0
      

      视频旋转配置

      视频旋转有 解码器旋转 和 G2D旋转 两种方式.

      1.编码器旋转(VE),使用TPlayerSetRotate接口,注意该接口不支持LBC模式, 不支持H265视频旋转.具体请参考<Tina Linux 多媒体解码>文档.

      函数原型: int TPlayerSetRotate(TPlayer* p,TplayerVideoRotateTyperotateDegree);
      功能 设置视频旋转的角度
      参数 p: 通过 TPlayerCreate 函数创建的 TPlayer 指针; rotateDegree: 视频旋转的角度
      返回值 成功返回 0,失败返回-1。
      调用说明 这个函数需要在 TPlayerSetDataSource() 函数之前调用
      

      2.G2D旋转:

      方式一:(1)TPlayerSetG2dRotate()接口使用G2D做旋转。该接口在TPlayerCreate()之后调用。

      方式二:(2)直接在在配置文件中配置默认旋转,文件路径:

      ​ package/allwinner/tina_multimedia/tplayer/configs/f133_linux_cedarx.conf

      48 #use g2d module to rotate the video. notice:F133/R528
      49 g2d_rotate_flag = 1
      50 g2d_rotate_degree = 1
      

      图片旋转

      待支持.

      发布在 MR Series
      q1215200171
      budbool
    • 7月全志芯片开源项目分享合辑

      Barkas D1-H小电脑

      作者:Chrithon

      开源项目地址:https://oshwhub.com/chrithon/barkasd1-h-original-barkasb1000

      bfcdf528-deed-4293-b259-7ffb6db4df5c-image.png

      一块适用于Sipeed Lichee RV(全志D1-H)的小电脑底板。拥有GPIO、USB接口和独立的UART接口。

      该板子搭载了6个GPIO口,以及可供用户连接各种USB设备(如U盘等),可用于如小彩灯控制等各种应用。板子上的UART串口可以使用户使用USB转串口设备通过串口访问小电脑。只需要打开支持串口访问的ssh工具并找到相对应的端口编号(Windows下是COMX,Linux下是ttyUSBX)即可访问该板子。

      固件可以直接使用主线Buildroot,然后使用“make nezha_defconfig”编译并编译烧录,也可以直接使用Ubuntu镜像找到Sipeed Lichee RV Dock那一栏下载。

      019291d8-d9d1-4960-9d90-64aaf3d79304-image.png

      305df833-3648-4e88-a578-8d60725ccfbc-image.png

      H616复古手机

      作者:HongLin

      开源项目地址:https://oshwhub.com/honglin/First_CRT_SmartPhone

      4189c25f-613e-4625-a294-abdb2688a449-image.png

      这款复古手机其实是一个脑洞向的作品,整体采用模块化的设计,具备安卓手机常用的绝大多数功能,可以拍视频、打电话、玩游戏、上网......甜点特性是可以通过换内存卡的方式进入Linux系统(Linux系统下没有CVBS驱动),还支持HDMI视频输出。

      对于开源社区的贡献就在于,只需要基于这款复古手机进行简单修改,就可以获得一款配置电池的Linux开发板或者自带摇杆鼠标的PDA手持终端。

      虽是一款娱乐向的DIY产品,但作者本人也面面俱到的配上了和复古手机相关的原理图设计、硬件电路设计、安卓系统移植、外壳设计等详尽教程。

      36e8d592-0900-4ee0-9804-4b2e36dd2596-image.png

      73b59777-07c8-43c0-994c-b488056db616-image.png

      XR32F429开发板

      作者:cnchens

      开源项目地址:https://oshwhub.com/chenrunyu/xr32f429coreboard

      fff6234c-dfa3-44f2-8bfd-80227ce361ac-image.png

      XR32F429 基于主频最高可达 192MHz 的高性能 ARM Cortex-M4F 32 位 RISC 内核。Cortex-M4F 内核具有一个浮点单元 (FPU) 单精度,它包含所有 ARM 单精度数据处理指令和数据类型。它还实现了一个内存保护单元 (MPU),可实现应用程序安全性

      本开发板是基于XR32F429芯片设计的开发板,外设接口十分简单,只有一个TF卡和GPIO排针用于扩展功能,它支持集成的 832KB SRAM 和 2MB 闪存 ROM,还包括许多外设,包括 UART、TWI、SPI、I2S、DMIC、PWM、IrDA (T/R)、CSI、SDIO 和辅助 ADC。

      dd5c4de3-f0ed-4247-8bbd-cc41e07e43ad-image.png

      FunKey-A32G开源掌机

      作者:morinaka

      开源项目地址:https://oshwhub.com/morinaka/funkey-3-2-cun-gba-mori-0603-wei-yan-zheng-you-wen-ti

      7f29474b-e82c-4844-b879-a624deedf34e-image.png

      FunKey-A32G开源掌机,是一款基于全志V3S芯片设计的掌机,使用funkey-OS开源系统,可以运行FC SFC GB GBA 等复古游戏平台。

      在尺寸的选择上掌机使用了分辨率480*320的3.2寸IPS屏幕,GBA外壳全贴合IPS外壳,可以不用切除限位条,但GBA音量开关、GBA导电胶、GBA按键等GBA外观配件自行购买。

      固件目前有无撕裂的测试版,可供暂时游玩,并且在未来还会开源60帧版本的固件提升掌机游戏体验。

      35c34e93-ef0b-4f27-84ba-5bc4a94cc9eb-image.png

      1e2d4fc9-4712-4ed7-80c2-8e34f6233c60-image.png

      发布在 爱搞机专区
      q1215200171
      budbool
    • 【FAQ】全志V85x芯片 快起方式下如何配置isp led?

      1.主题

      快起方式如何配置isp led

      2.问题背景

      产品:v853,v851系列产品
      软件:快启方案

      3.问题分析

      sunxi平台在spl支持两种配置isp led的方式

      1.通过修改源码方式

      修改spl/common/update_ispparm.c文件中的的全局变量结构体

      //spl/common/update_ispparm.c
      struct Camera_Param camera_param[] = {
      	[enum_camera0] = {
      		.sign = CAMERA1_SIGN,
      		.addr = CFG_ISPPARAM_LOAD_ADDR,
      		.adc_channel = CAMERA1_ADC_CHANNEL, //读取adc的通道
      		.gpio_info = {
      			[enum_ir_cut0] = {
      				.port = SUNXI_GPIO_D,  //port 口
      				.port_num = 18, //port pin脚
      				.mul_sel = SUNXI_GPIO_OUTPUT,  //功能配置
      				.pull = SUNXI_GPIO_PULL_DISABLE, //上拉模式
      				.drv_level  = SUNXI_GPIO_DRV_LEVEL1, //驱动模式
      				.data = OUPUT_LOW_LEVEL, //初始化数据,此处表示初始化为低电平
       ...
      			},}},}
      

      2.通过内核设备树方式

      此方式需要打开fdt的宏CFG_SUNXI_FDT=y,此种方式优先级高于方式一

      以853平台为例,增加以下节点即可

      //arch/arm/boot/dts/sun8iw21p1.dtsi
      isp_boot0_gpio:isp_boot0_gpio@0 {
          device_type = "isp_boot0_gpio";
          /* port:0x3--D  0xFF--no use
          * pin:0x5--5
          * mul_sel:0x1
          * pull:0xffffffff -- default
          * drv_level:0xffffffff
          * data:0x0
          */
          camera0_cut0 = <0x54 0x3 0x12 0x1 0x0 0x1 0x0>;
          camera0_cut1 = <0x54 0x3 0x8 0x1 0x0 0x1 0x0>;
          camera0_led = <0x54 0xFF 0xFF 0x1 0x0 0x1 0x0>;
          camera1_cut0 = <0x54 0x3 0x12 0x1 0x0 0x1 0x0>;
          camera1_cut1 = <0x54 0x3 0x8 0x1 0x0 0x1 0x0>;
          camera1_led = <0x54 0xFF 0xFF 0x1 0x0 0x1 0x0>;
      };
      
      发布在 V Series
      q1215200171
      budbool
    • 玄铁杯RISC-V大赛『三等奖』智能帘窗

      智能帘窗采用D1-H哪吒开发板为主控,D1-H哪吒与下位机各模块/传感器进行数据通信并进行数据的处理,并在最后依据处理后的数据来对风扇、电机、OLED屏幕等上位机硬件进行控制。

      5A41430C-5A76-4703-8CE5-5FE87AE1CA0A.png
      系统硬件架构

      PART01 方案及硬件

      29419E11-404A-4bbb-B393-FC83A5C897AC.png
      产品实物图

      模拟平常卧室,其可能存在的场景有:突然下雨、户外湿度过大关窗以及户外天气较好开窗通风等场景。以上相关场景需要获取许多数据从进行准确的判定,其中包括室内外温湿度,当前时间,室外是否下雨,窗户状态,窗帘状态以及户外光照强度等,下图为系统方案。

      图片11.png
      系统方案图

      本项目采用器材如下:

      • DHT11*2
      • 舵机*1
      • 普通步进电机*1
      • 雨滴传感器模块*1
      • PCF8591模块*1
      • 光纤传感器模块*1
      • OLED12864*1
      • 按键*4
      • 风扇*1

      PART02 功能描述

      首先系统上电后会显获取室内温湿度、可燃气体浓度、室外光照强度、温湿度以及是否下雨,自动关窗标识位,风扇标识位等信息(依靠”/project/”目录下的一些文件实现,例如“curtain”、“auto_window_flag”文件等),接着将读取本地存储的舵机以及步进电机的位置信息,四个按键(触控按键)分别对应窗户以及窗帘的开和关程度的控制,最后将室内外温湿度以及室外光照强度以及风扇开关状态和可燃气体浓浓度过高警告展示在OLED屏幕上。若室内可燃气体浓度超过阈值将默认打开风扇,并且此时是无法关闭的(手机APP操作),除非可燃气体浓度降低至阈值方可手动关闭风扇。

      4E938422-79AC-4a38-9C9B-5EAB988A180F.png
      OLED屏幕状态显示

      除此之外本项目还将使用本地WIFI/有线网络通过MQTT协议连接腾讯云物联网服务,用户可以查看本地状态信息并依据光照强度、室内外温湿度、下雨自动关窗户,云端/本地控制窗帘或窗户,此操作于手机APP(腾讯云提供)服务上完成。

      9F36884E-C47C-4d3d-8326-403080FC6F5B.png
      APP控制

      PART03 参赛团队

      南通大学“孤勇队” 队员:The_Qiang

      发布在 MR Series
      q1215200171
      budbool
    • 回复: 升级LV2

      @lucky 你都快3级了,不用水了

      发布在 灌水区
      q1215200171
      budbool
    • 【FAQ】全志V系列芯片 在TinaLinux如何判断安全固件与rotpk.bin是否对应?

      1.主题

      TinaLinux如何判断安全固件与rotpk.bin是否对应

      2.问题背景

      客户在开发过程中,经常遇到安全固件烧录后,启动失败并不停烧录的问题。

      这个问题有可能有多种原因,最常见的一种是安全固件与烧录到开发板efuse中的rotpk不一致。

      如果可以从安全固件中提取rotpk的话,将提取的rotpk与efuse中烧录的rotpk(或一组签名密钥对中的rotpk.bin文件)对比,即可判断是否对应。

      那么如何从安全固件中提取rotpk?

      3.问题分析

      提取思路:

      安全固件中包含了各个镜像的签名证书,其中TOC1中包含了使用根密钥签名的证书。

      全志安全启动使用的证书是X509格式,通过openssl可以解析根密钥签名的证书内容,提取证书中的公钥。

      将公钥按照特定组织方式,再次计算sha256,即可获得安全固件中的根密钥公钥的hash值,即rotpk。

      4.解决办法

      这里提供一个genrotpkfromfw.sh的脚本,使用方法:

      ./genrotpkfromfw.sh <secure firmware>
      

      执行完后,会在当前目录生成rotpk_rsa.bin,并打印其中的内容。

      user@pc:$ ./getrotpkfromfw.sh tina_xxx_secure_v0.img
      Successfully get rotpk file: rotpk_rsa.bin from tina_xxx_secure_v0.img
      rotpk content:
      00000000  90 fa 80 f1 54 49 51 2a  8a 04 23 97 06 6f 5f 78  |....TIQ*..#..o_x|
      00000010  0b 6c 8f 89 21 98 e8 d1  ba a4 2e b6 ce d1 76 f3  |.l..!.........v.|
      00000020
      

      脚本内容如下:

      #!/bin/bash
      
      function help_usage()
      {
              echo "Get rotpk from secure firmware"
              echo "USAGE: $0 <secure firmware>"
      }
      
      if [ -z "$1" ]; then
              help_usage
              exit 1
      fi
      
      
      FW=$1
      TOC_STR="|sunxi-secure"
      CERT=.cert_tmp
      GENPUBKEY_RSA=key_rsa_pub.bin
      ROTPK_RSA=rotpk_rsa.bin
      
      rm -f $CERT $GENPUBKEY_RSA $ROTPK_RSA
      
      
      #############################
      # 1. get cert               #
      #############################
      toc_addr=`hexdump -C $FW | grep $TOC_STR | awk '{print strtonum("0x"$1)}'`
      cert_offset=`hexdump -s $(($toc_addr + 128)) -n 4 $FW | head -1|  awk '{print strtonum("0x"$5$4$3$2)}'`
      cert_addr=$(($toc_addr+$cert_offset))
      dd if=$FW of=$CERT bs=1 count=4k skip=$cert_addr 2> /dev/null
      
      if [ ! -f $CERT ]; then
              echo "Error: generate $CERT error"
              exit 1
      fi
      
      #############################
      # 2. get root public key    #
      #############################
      openssl x509 -modulus -in $CERT -inform der -noout | awk -F = '{print $2}' | xxd -r -ps > $GENPUBKEY_RSA
      openssl x509 -in $CERT -inform der -text -noout | grep 65537 > /dev/null
      if [ $? -eq 0 ]; then
                      echo 010001 | xxd -r -ps >> $GENPUBKEY_RSA
      else
                      echo "Error: RSA Exponent is not 65537"
                      rm -f $CERT $GENPUBKEY_RSA $ROTPK_RSA
                      exit 1
      fi
      dd if=/dev/zero of=temp.bin bs=1 count=253 > /dev/null 2>&1
      cat temp.bin | tr "\000" "\221" >> $GENPUBKEY_RSA
      rm -f temp.bin
      
      #############################
      # 3. get rotpk              #
      #############################
      # generate $ROTPK_RSA based on $GENPUBKEY_RSA
      openssl dgst -sha256 -binary -out $ROTPK_RSA $GENPUBKEY_RSA
      rm -f $CERT $GENPUBKEY_RSA
      
      echo "Successfully get rotpk file: $ROTPK_RSA from $FW"
      echo "rotpk content:"
      hexdump -C $ROTPK_RSA
      
      发布在 V Series
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 如何解决getevent运行出错,报错为“could not add watch for /dev/input”的问题?

      一、问题背景

      如果系统已经注册了input设备,想要使用getevent命令去获取input事件时,发现getevent运行会报错,不能正常运行。

      报错信息为:could not add watch for /dev/input, Function not implemented

      如下图所示:

      6e6c9fc2f9634f57a869062ed47e3f06.jfif

      二、问题分析

      通过小机端目录/dev/input/下,发现是有event*的,证明是已经注册有input设备了,有input设备getevent就可以正常运行。

      通过getevent源码得知,"could not add watch"的错误是由于运行函数inotify_add_watch(),获取不到所对应的inotify的watch而产生的。

      ab1eecf8885c4e918ff36c1fcc614a08.jfif

      inotify是一个内核用于通知用户空间程序文件系统变化的机制,现在获取不到inotify可以判断为内核空间没有给到用户空间权限或者是接口。

      内核空间是有对应的配置使能用户空间的接口的,选上该配置,即可解决问题。

      3776606cab8d41df900dffe6b6be8351.jfif

      PS:另外,使用cat /dev/input/event* | hexdump -C 也可以获取input事件。

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 用39块钱的V851se视觉开发板做了个小相机,还可以物品识别、自动追焦!

      用39块钱的V851se视觉开发板做了个小相机。

      QQ20240220142818-ezgif.com-optimize.gif

      可以进行物品识别、自动追焦!

      1421097787-1-192-ezgif.com-optimize.gif

      WeChat_20240220115646-ezgif.com-video-to-gif-converter.gif

      这个超低成本的小相机是在V851se上移植使用全志在线开源版本的Tina Linux与OpenCV框架开启摄像头拍照捕获视频,并结合NPU实现Mobilenet v2目标分类识别以及运动追踪等功能......并最终实现功能完整的智能小相机。

      ISP适配

      可以适配V851se的Tina5.0升级到了21.05版本的OpenWrt,相较于商业量产版本的Tina Linux 支持更多新的软件包,不过可惜的是MPP包没有移植到Tina5.0,所以想使用摄像头就需要另辟蹊径。

      虽然Tina5.0并没有移植MPP包,但也内置了一个libAWispApi包,支持在用户层对接 ISP,但是很可惜这个包也没有适配V85x系列,这里就需要自行适配。

      其实适配很简单,SDK 已经提供了lib只是没提供编译支持,我们需要前往以下文件夹中新建一个v851se文件夹:

      openwrt/package/allwinner/vision/libAWIspApi/machinfo
      

      然后再新建文件build.mk写入如下配置:

      ISP_DIR:=isp600
      

      image-20240122161729785.png

      然后在menuconfig中勾选上这个包,并进行如下配置:

      Allwinner  --->
        Vision  --->
          <*> camerademo........................................ camerademo test sensor  --->
            [*]   Enabel vin isp support
      

      image-20240122202641560.png

      编译系统然后烧录系统,运行命令 camerademo ,可以看到是正常拍摄照片的

      image-20240122162014027.png

      1411021229-1-192-ezgif.com-optimize.gif

      OpenCV适配

      OpenCV在打包好的固件中已经默认适配好了,如果不想了解如何适配OpenCV可以直接前往点击链接获取资料并跳过这部分

      OpenCV默认不支持开启RAW Sensor,不过现在需要配置为OpenCV开启RAW Sensor抓图,然后通过OpenCV送图到之前适配的libAWispApi库进行 ISP 处理。

      在这里增加一个函数作为 RAW Sensor 抓图的处理。

      #ifdef __USE_VIN_ISP__
      bool CvCaptureCAM_V4L::RAWSensor()
      {
          struct v4l2_control ctrl;
          struct v4l2_queryctrl qc_ctrl;
      
          memset(&ctrl, 0, sizeof(struct v4l2_control));
          memset(&qc_ctrl, 0, sizeof(struct v4l2_queryctrl));
          ctrl.id = V4L2_CID_SENSOR_TYPE;
          qc_ctrl.id = V4L2_CID_SENSOR_TYPE;
      
          if (-1 == ioctl (deviceHandle, VIDIOC_QUERYCTRL, &qc_ctrl)){
              fprintf(stderr, "V4L2: %s QUERY V4L2_CID_SENSOR_TYPE failed\n", deviceName.c_str());
              return false;
          }
      
          if (-1 == ioctl(deviceHandle, VIDIOC_G_CTRL, &ctrl)) {
              fprintf(stderr, "V4L2: %s G_CTRL V4L2_CID_SENSOR_TYPE failed\n", deviceName.c_str());
              return false;
          }
      
          return ctrl.value == V4L2_SENSOR_TYPE_RAW;
      }
      #endif
      

      这段代码的功能是检查V4L2摄像头设备的传感器类型是否为RAW格式。它使用了V4L2的ioctl函数来查询和获取传感器类型信息。

      然后在OpenCV的捕获流函数:

      bool CvCaptureCAM_V4L::streaming(bool startStream)
      

      添加 ISP 处理

      #ifdef __USE_VIN_ISP__
        RawSensor = RAWSensor();
      
        if (startStream && RawSensor) {
          int VideoIndex = -1;
      
          sscanf(deviceName.c_str(), "/dev/video%d", &VideoIndex);
      
          IspPort = CreateAWIspApi();
          IspId = -1;
          IspId = IspPort->ispGetIspId(VideoIndex);
          if (IspId >= 0)
            IspPort->ispStart(IspId);
        } else if (RawSensor && IspId >= 0 && IspPort) {
          IspPort->ispStop(IspId);
          DestroyAWIspApi(IspPort);
          IspPort = NULL;
          IspId = -1;
        }
      #endif
      

      这段代码主要用于控制图像信号处理(ISP)的启动和停止。根据条件的不同,可以选择在开始视频流捕获时启动ISP流处理,或者在停止视频流捕获时停止ISP流处理,以便对视频数据进行处理和增强。

      至于其他包括编译脚本的修改,全局变量定义等操作,可以参考原文链接中的补丁文件。

      在执行完以上步骤后,可以快速测试摄像头输出demo:

      OpenCV  --->
        <*> opencv....................................................... opencv libs
        [*]   Enabel sunxi vin isp support
        <*> opencv_camera.............................opencv_camera and display image
      

      QQ20240220142818-ezgif.com-optimize.gif

      MobileNet V2

      MobileNet V2是一种轻量级的卷积神经网络,它专为移动设备和嵌入式设备上的实时图像分类和目标检测任务设计。

      MobileNet V2的关键特点包括使用深度可分离卷积来减少计算量和参数数量,引入带线性瓶颈的倒残差结构以增加非线性表示能力,以及提供宽度乘数参数以适应不同计算资源限制。这些特点使得MobileNet V2成为资源受限的移动设备上的理想选择。

      首先对输入图像进行预处理,以适应MobileNet V2 SSD模型的输入要求。通过通道格式转换、图像大小调整和数据填充等操作,将输入图像转换为适合模型输入的格式。

      void get_input_data(const cv::Mat& sample, uint8_t* input_data, int input_h, int input_w, const float* mean, const float* scale){
          cv::Mat img;
          if (sample.channels() == 1)
              cv::cvtColor(sample, img, cv::COLOR_GRAY2RGB);
          else
              cv::cvtColor(sample, img, cv::COLOR_BGR2RGB);
          cv::resize(img, img, cv::Size(input_h, input_w));
          uint8_t* img_data = img.data;
          /* nhwc to nchw */
          for (int h = 0; h < input_h; h++) {
              for (int w = 0; w < input_w; w++) {
                  for (int c = 0; c < 3; c++) {
                      int in_index = h * input_w * 3 + w * 3 + c;
                      int out_index = c * input_h * input_w + h * input_w + w;
                      input_data[out_index] = (uint8_t)(img_data[in_index]);  //uint8
      

      关键步骤是要实现非极大值抑制算法(NMS),用于去除高度重叠的框,只保留得分最高的那个框。算法通过计算框之间的交集面积和设置的阈值来进行筛选,并将保留的框的索引存储在picked向量中。

      // 非极大值抑制算法(NMS)
      static void nms_sorted_bboxes(const std::vector<Bbox_t>& bboxs, std::vector<int>& picked, float nms_threshold) {
          picked.clear();
          const int n = bboxs.size();
          
          // 创建存储每个框面积的向量
          std::vector<float> areas(n);
          
          // 计算每个框的面积并存储
          for (int i = 0; i < n; i++){
              areas[i] = (bboxs[i].xmax - bboxs[i].xmin) * (bboxs[i].ymax - bboxs[i].ymin);
      

      通过一系列操作,包括转换为向量、计算缩放比例、创建存储检测结果的向量等,将输出数据转换为检测结果,并按照置信度从高到低排序。然后应用非极大值抑制算法对检测结果进行筛选,最后将筛选后的目标框位置、大小和类别置信度等信息绘制在图像上。

      // 按照分数对框进行排序
          std::sort(BBox.begin(), BBox.end(), comp);
      
          // 应用非极大值抑制算法,获取保留的框的索引
          std::vector<int> keep_index;
          nms_sorted_bboxes(BBox, keep_index, iou_threshold);
      
          // 创建存储框位置的向量
          std::vector<cv::Rect> bbox_per_frame;
      
          // 遍历保留的框,绘制框和标签
          for(int i = 0; i < keep_index.size(); i++) {
              int left = BBox[keep_index[i]].xmin;
              int top = BBox[keep_index[i]].ymin;
              int right = BBox[keep_index[i]].xmax;
              int bottom = BBox[keep_index[i]].ymax;
              cv::rectangle(bgr, cv::Point(left, top), cv::Point(right, bottom), cv::Scalar(0, 0, 255), 1);
              char text[256];
              sprintf(text, "%s %.1f%%", class_names[BBox[keep_index[i]].cls_idx], BBox[keep_index[i]].score * 100);
              cv::putText(bgr, text, cv::Point(left, top), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(0, 255, 255), 1, 8, 0);
              bbox_per_frame.emplace_back(left, top, width, height);
          }
      

      image-20240126200516520.png

      NPU开发流程

      V851se芯片内置一颗NPU,其处理性能为最大0.5TOPS并有128KB内部高速缓存用于高速数据交换,NPU 开发完整的流程如下图所示:
      image-20240126194601436.png

      模型训练

      在模型训练阶段,用户根据需求和实际情况选择合适的框架(如Caffe、TensorFlow 等)使用数据集进行训练得到符合需求的模型,此模型可称为预训练模型。也可直接使用已经训练好的模型。V851s 的 NPU 支持包括分类、检测、跟踪、人脸、姿态估计、分割、深度、语音、像素处理等各个场景90 多个公开模型。

      signal函数

      在模型转化阶段,通过Acuity Toolkit把预训练模型和少量训练数据转换为NPU可用的模型NBG文件。一般步骤如下:

      1、模型导入,生成网络结构文件、网络权重文件、输入描述文件和输出描述文件。
      2、模型量化,生成量化描述文件和熵值文件,可改用不同的量化方式。
      3、仿真推理,可逐一对比float和其他量化精度的仿真结果的相似度,评估量化后的精度是否满足要求。
      4、模型导出,生成端侧代码和*.nb 文件,可编辑输出描述文件的配置,配置是否添加后处理节点等。

      1421107658-1-192-ezgif.com-optimize.gif

      开源资料获取

      本文所有内容均转载自原作者本人的个人论坛,文章内所提到的源代码、固件等开发资料均开源在作者的个人网站和Github上,

      • 完整代码Github开源链接:https://github.com/YuzukiHD/TinyVision/tree/main/tina/openwrt/package/thirdparty/vision/opencv_camera_mobilenet_v2_ssd/src

      • 原文及更详细步骤讲解:https://www.gloomyghost.com/live/20240126.aspx

      发布在 V Series
      q1215200171
      budbool
    • 【FAQ】全志D1芯片 如何对D1主频进行调节?

      【问题背景】
      在D1项目开发的过程中,有时候需要调节CPU主频,以对一些场景、功耗或性能进行测试,故对主频的调节方法进行介绍,方便大家后面调主频

      【适用场景】
      硬件:D1芯片平台 软件:Tina系统

      【基本操作】

      1.在烧了Tina固件的D1开发板上可以看到调频相关节点:

      3d6597a2851b4d15a77c03c25fda9b7b.jfif

      2.在系统启动log中,可以看到默认频率,一般是1G

      a43c9ff24fe14f42936d96ae38578486.jfif

      3.查看内核文件发现SDK提供了RV的调频代码,看来可以将调频模块加载起来

      65f0ecc9398b49f097c885c8a2935ca5.jfif
      4.打开内核相关配置:make ARCH=riscv menuconfig,选择:

      CPU Power Management  --->
          CPU Frequency scaling  --->
              ARCH RISCV Allwinner nvmem based SUN50I CPUFreq driver
      

      如图:
      75dd751c9626447aa13489e8173b056d.jfif

      c2b088f4cb8d4003868a242949adee54.jfif

      5b280e91402b4dbea7d4d1bbbfdc4112.jfif

      5.查找调频相关的dts中频率表的配置,只有1008M,可以进行超频修改,比如改到1.3G

      6d8b3309eb614d89b2168e3ecdea5104.jfif

      6.重新编译打包烧写,可以跑到1.3G

      9d0e670b2be242c482b87ce2b7aae769.jfif

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【FAQ】全志D1芯片 如何移植 rtl8821cu wifi 驱动到 Linux-5.4内核?

      问题背景
      移植 Linux-4.9 或之前的内核版本下的 wifi 驱动到 Linux-5.4 内核版本时会出现编译和运行错误,
      该 FAQ 主要用于帮助开发人员解决驱动移植出现的问题。

      问题分析
      移植到 Linux-5.4 内核版本时出现如下编译错误:

      WARNING: module 8821cu uses symbol kernel_read from namespace VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver, but does not import it.
      

      出现该 WANRING 的原因是内核版本升级后文件系统存在差异,驱动调用了 kernel_read()和 kernel_write() 函数,需要进行 import VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver 处理。

      移植到 Linux-5.4 内核版本时运行的错误:

      04e7d843b1934a02af9d0335885f837c.jfif
      出现该问题的原因是 Linux-5.3 及以后版本 cfg80211.h 里结构体 wiphy_vendor_command 新增了变量 policy 和 maxattr。

      解决方案

      出现编译错误时解决方案如下:

      diff --git a/drivers/net/wireless/rtl8821cu/os_dep/linux/os_intfs.c b/drivers/net/wireless/rtl8821cu/os_dep/linux/os_intfs.c
      index c4b515763ac8..466a3b27f521 100644
      --- a/drivers/net/wireless/rtl8821cu/os_dep/linux/os_intfs.c
      +++ b/drivers/net/wireless/rtl8821cu/os_dep/linux/os_intfs.c
      @@ -28,6 +28,8 @@ MODULE_LICENSE("GPL");
       MODULE_DESCRIPTION("Realtek Wireless Lan Driver");
       MODULE_AUTHOR("Realtek Semiconductor Corp.");
       MODULE_VERSION(DRIVERVERSION);
      +MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
      

      出现运行错误时解决方案为遍历驱动里所有使用 wiphy_vendor_command 结构体并修改如下:

      diff --git a/drivers/net/wireless/rtl8821cu/os_dep/linux/rtw_cfgvendor.c b/drivers/net/wireless/rtl8821cu/os_dep/linux/rtw_cfgvendor.c
      index 6bac27d37766..09e24dcc9480 100644
      --- a/drivers/net/wireless/rtl8821cu/os_dep/linux/rtw_cfgvendor.c
      +++ b/drivers/net/wireless/rtl8821cu/os_dep/linux/rtw_cfgvendor.c
      @@ -1756,6 +1756,11 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
                      },
                      .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
                      .doit = rtw_cfgvendor_gscan_get_capabilities
      +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0))
      +               ,
      +               .policy = VENDOR_CMD_RAW_DATA,
      +               .maxattr = 1
      +#endif
              },
      
      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 swap功能简介与tina上swap分区使用方法

      swap功能简介

      1、概念介绍

      swap:系统内存紧张时进行的内存回收操作。

      swap分区:在swap内存回收操作中,被回收的匿名页会回写到swap分区。

      系统没有swap分区的时候,依旧会进行swap操作,swap操作不一定会操作到swap分区。

      2、swap分区介绍

      linux系统支持各种块设备、文件作为swap分区,且容量可以叠加。比如同时使用spinor上的swap裸分区和TF卡上的文件叠加作为swap分区。申请成功的swap容量可以通过free命令查看.

      ​             total       used       free     shared    buffers     cached
      Mem:        511776     506952       4824          0        512        836
      -/+ buffers/cache:     505604       6172
      Swap:         1020         44        976
      

      各存储基于TINA SDK使用swap的方法

      1、swap分区使用方法

      swap分区的使能依赖mkswap命令和swapon命令。对于TINA SDK大部分存储来说。只需要make menuconfig选中mkswap、swapon命令,且在sys_partition(_nor).fex分区表中分配一个作为swap分区的裸分区即可。

      root@(none):/# free
                   total       used       free     shared    buffers     cached
      Mem:        511776      16820     494956          0       1260       2068
      -/+ buffers/cache:      13492     498284
      Swap:            0          0          0
      
      root@(none):/# mkswap /dev/by-name/swap
      Setting up swapspace version 1, size = 1020 KiB
      no label, UUID=c714a274-5c8b-44e9-87f0-e6ce39226621
      
      root@(none):/# swapon /dev/by-name/swap
      [  223.756712] Adding 1020k swap on /dev/by-name/swap.  Priority:-1 extents:1 across:1020k SS
      root@(none):/# free
                   total       used       free     shared    buffers     cached
      Mem:        511776      16820     494956          0       1356       2128
      -/+ buffers/cache:      13336     498440
      Swap:         1020          0       1020
      

      2、存储使用差异

      大部分存储都可以使用上文介绍的方式来使能swap分区,mkswap的前提是你可以获得一个可读可写的块设备/文件,比如mtdblockn、mmcblk0pn、nandn。

      对于ubi nand来说,tina系统默认使用squashfs+ubifs来获得一个可读写的overlay,其中squashfs就依赖于块设备,但对于ubi nand来说,提供给squashfs的ubiblock必须是只读的,只读的ubiblock+只读文件系统squashfs的搭配。所以尽管在用户态可以创建出ubiblock,创建出来的ubiblock也是只读的,不满足mkswap的需求。此时尝试基于可读写的overlay创建文件,利用ubifs上的文件来作为swap,测试发现mkswap可以成功,但是并不能swapon。

      基于以上,提出了两种方法:

      (1)直接不使用ubi nand的逻辑分区,即不使用mtdblock上的ubiblock,直接使用mtdblock,操作底层的物理块设备,pstore/blk在ubi nand上也是此种做法,但是这种做法的风险点在于,mtdblock并没有磨损平衡,只有坏块处理。所以对应的swap分区寿命不长。

      (2)不使用tina squashfs+overlay的做法,直接使用mkfs.ubifs制作一个可读可写的rootfs,内核关闭readonly-ubi块的配置,让系统可以顺利创建出可读可写的ubiblock。但是需要牺牲根文件系统只读的功能,在掉电等存储不稳定的场景下,根文件系统有可能被损坏。在保证存储稳定性的情况下,这种方法应该是优选。

      小知识

      1、swap分区没有被用完,为什么依旧会oom

      内核触发kswapd进行内存回收时,会对匿名页和文件页进行回收(有更多仲裁方法,不展开叙述),其中文件页的回收方法是清除缓存的文件内容,并不需要回写flash,因为文件页的实际文件一直保存在flash中,下一次读文件时,需要重新从flash中读回文件,无法直接从缓存中获取文件内容;匿名页的回收方法是写到swap分区(当存在swap分区的时候)。所以当你内存临界,且在系统仲裁下已经没有可以回收的匿名页时,尽管swap分区没有用完,依旧会触发oom。

      2、CPU占用率和内存的取舍

      /proc/sys/vm/swappiness节点描述系统对swap分区的使用原则,0表示最大限度使用物理内存,100表示最大限度使用swap分区。在内存紧张的情况下,可以使用swap分区,但是频繁使用swap分区必然导致CPU占用率的升高,此时可以通过调节swappiness节点来对CPU占用率和内存进行平衡。

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 如何使busybox syslogd时间戳格式与kernel对齐?

      问题背景

      部分客户使用busybox syslogd作为产品的日志管理系统,syslogd 默认的时间戳及其格式与kernel不同,在分析启动时间时不便于和kernel对比,因此tina提供了调整busybox日志格式的相关patch,本文就此进行说明。

      问题说明

      • busybox 默认时间戳是通过 time() 函数获取的(日历时间),并将其转换成如下格式
      Jan  1 00:58:45 procd: - shutdown -
      Jan  1 08:58:45 bluetoothd[1587]: Exit
      
      • 而 kernel 的时间戳是通过 local_clock 获得的,最终来源于 sched_clock,由 arch_timer 驱动的,可达 ns 级。 kernel 在输出 msg 时,会在 printk_log 结构中添加时间戳,最终被转换为如下格式:
      [    0.323034] pwm module init!
      [    0.327689] sunxi-pm debug v3.10
      
      • 由上可知,有两点区别:
        busybox 输出的是日历时间,受RTC,NTP等影响,会UTC时间同步。 而 kernel 输出的是系统启动 sched_clock 服务以来的时间。
        busybox 的输出格式带有日期量, 而 kernel 只是启动以来的时间长度值。

      解决方案

      说明
      首先,需要在 busybox 中获取到 kernel 的启动时间,这里我们可采用 clock_gettime 这个函数,该函数支持获取 CLOCK_REALTIME,CLOCK_MONOTONIC,CLOCK_BOOTTIME,CLOCK_PROCESS_CPUTIME_ID等时间值。

      然后,将获取到的时间转换为内核的输出格式。

      步骤

      1, 在 $(TINA_TOPDIR)/package 打附件补丁
      2, 执行 make menuconfig, 按照需要配置目前支持读取 CLOCK_REALTIME,CLOCK_MONOTONIC,CLOCK_BOOTTIME 等时间类型

      Base system  ---> busybox ---> System Logging Utilities  ---> [*] syslogd ---> 
      
      [*]   Support kernel stamp format.
            Choose Time Source (CLOCK_BOOTTIME)  --->
      

      附件:busybox_support_kernel_stamp.diff

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【FAQ】全志D1芯片 uart测试用例(支持自发自收,板间收发,数据校验,收发时间统计)

      问题背景
      部分客户或者技术人员需要验证uart的功能,包括数据准确性、传输速度、长时间传输稳定性等,但发现没有方便使用的测试用例。

      用例功能
      1.支持短接外部接口或者使能Loopback自发自收
      2.可配置用例为发送模式和接收模式进行板间收发测试
      3.可打印收传输时间信息,用于计算传输速率
      4.支持各项参数如传输通道、波特率、data size、传输次数的个性化设置
      5.支持校验收发信息是否准确

      使用步骤
      使能uart_test
      make menuconfig 使能 PACKAGE_UART_TEST宏,即可编译出uart_test文件

      使用说明

      例子:

      /*Master模式短接外部引脚即可自发自收*/
      Master:uart_test -d 2 -n 100 -t 10 -g -p
      Slave: uart_test -d 2 -n 100 -t 10 -g -p -m
      Loopback:uart_test -d 1 -b 1500000 -n 10 -s 256 -l -g
      
      参数选择:
      1.-d,选择uart通道,默认通道1
      2.-b,波特率选择,默认115200Hz
      3.-n,传输次数,默认100次
      4.-s,发送数据size,默认16bytes
      5.-p,开启打印统计时间信息
      6.-t,收发多少轮数据后打印统计的时间信息,默认收发10次后打印一次
      7.-l,开启loopback回环
      8.-g,开启打印发送数据信息
      9.-m,以接收模式调用测试程序,用于板间收发测试
      

      测试验证

      root@TinaLinux:/# uart_test -d 2 -n 100 -t 10 -f -l -g
      =======uart_test test args=======
      uart_port: /dev/ttyS2.
      baudrate: 115200.
      test cycle: 100.
      bytes_per_cycle: 16.
      flow ctrl:true.
      debug log:true.
      trans mode
      
      nSpeed:115200
      set done!
      Select(/dev/ttyS2), Cnt 100.
      [main] line:292 read_size=0
      0:transmit 16 bytes.
      ==== write data ====
      
      0x39 0x34 0x33 0x34 0x39 0x38 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
      1:transmit 16 bytes.
      ==== write data ====
      
      0x31 0x34 0x33 0x36 0x39 0x37 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
      2:transmit 16 bytes.
      ==== write data ====
      
      0x33 0x34 0x33 0x38 0x37 0x33 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
      3:transmit 16 bytes.
      ==== write data ====
      
      0x35 0x34 0x34 0x30 0x34 0x32 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
      4:transmit 16 bytes.
      ==== write data ====
      
      0x37 0x34 0x34 0x32 0x30 0x34 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
      5:transmit 16 bytes.
      ==== write data ====
      
      0x39 0x34 0x34 0x33 0x36 0x34 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
      6:transmit 16 bytes.
      ==== write data ====
      
      0x31 0x34 0x34 0x35 0x32 0x36 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
      7:transmit 16 bytes.
      ==== write data ====
      
      0x33 0x34 0x34 0x36 0x38 0x37 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
      8:transmit 16 bytes.
      ==== write data ====
      
      0x35 0x34 0x34 0x38 0x35 0x35 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
      9:transmit 16 bytes.
      ==== write data ====
      
      0x37 0x34 0x35 0x30 0x35 0x37 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
      cnt:  10
      err_cnt:  0
      suc_cnt:  10
      time:  2s 1675us
      10:transmit 16 bytes.
      ==== write data ====
      
      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【FAQ】全志R329 Tina中如何使用adb/串口密码登录?

      如果需要在adb shell密码登录命令行终端,可按以下步骤进行操作。

      /etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。

      文件中每行代表一个用户,同样使用 “:” 作为分隔符,不同之处在于,每行用户信息被划分为 9 个字段。每个字段的含义如下:

      用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

      adb 设置密码登录,操作如下:

      1、创建密码:

      这个操作可通过 makepasswd 工具创建,命令如下:

      makepasswd  --clearfrom=-  --crypt-md5 <<< YourPass
      
      eg:
      usr # makepasswd  --clearfrom=-  --crypt-md5 <<< allwinner
      allwinner   $1$z6v447Dx$HH4Ytv0Hvi5MfxVgQ6uSE.
      

      2、填充 /etc/shadow 文件:

      在 target/allwinner/方案名/base-file/etc/shadow 文件中,添加如下信息,第二字段的信息就是上述 makepasswd 创建的密码密文:

      root:$1$z6v447Dx$HH4Ytv0Hvi5MfxVgQ6uSE.:1:0:99999999999:7:::
      

      3、修改 adb_shell 文件:

      在 tina/package/utils/adb 目录下,修改当前目录的 adb_shell 文件,将该文件的 /bin/sh 替换为 /bin/login;

      4、执行 make menuconfig

      在 Base system —> <> busybox —> Login/Password Management Utilities —> [] login,按照上述路径选上 login;

      5、重新编译烧写固件

      adb shell命令之后将会需要输入用户名和密码,上述的例子,用户名为:root,密码为:allwinner;

      注意:上述的操作,只是 adb shell 需要登录密码,在串口端仍不需要登录密码。

      串口端也进行密码登录的操作

      如果在串口端也需要进行相应的密码登录验证,需要修改 /etc/inittab 这个文件。在 target/allwinner/方案名/base-file/etc 目录下存在 inittab 文件,原文件如下:

      ::sysinit:/etc/init.d/rcS S boot
      ::shutdown:/etc/init.d/rcS K shutdown
      ::askconsole:/bin/ash --login
      

      修改为

      ::sysinit:/etc/init.d/rcS S boot
      ::shutdown:/etc/init.d/rcS K shutdown
      ::askconsole:/bin/login
      

      使串口终端通过 login 登录,注意,这个一样需要 login 的支持,所以 busybox 需要选上 login(参照上述adb的第 4 点选上 login)。

      通过公私钥的加密验证方式登录 adb 终端

      ubuntu 系统,~/.ssh 目录下,会存在一个 adb 使用的公私钥,分别是 id_rsa.pub 和 id_rsa ,而 windows 则是在系统盘的 user 目录下有 .android 目录存放公私钥。将 PC 端的公钥添加到设备端的某个路径,设备端的服务开启公私钥加密验证的方式,在使用 adb 的时候,将需要使用 PC 端的秘钥和设备端的公钥进行验证,验证通过之后才可以通过 adb 进入设备终端。
      当前 Tina 系统有支持通过adb的公私钥进行验证的,patch 如下:

      diff --git a/utils/adb/Makefile b/utils/adb/Makefile
      index c57fc6b..28c4ddb 100755
      --- a/utils/adb/Makefile
      +++ b/utils/adb/Makefile
      @@ -133,6 +133,9 @@ define Package/adbd_auth_service/install
              $(INSTALL_DIR) $(1)/bin
              $(INSTALL_BIN) $(PKG_BUILD_DIR)/auth/adbd_auth_service $(1)/bin/
       
      +       $(INSTALL_DIR) $(1)/etc
      +       $(INSTALL_DATA) ./id_rsa.pub $(1)/etc/
      +
              $(INSTALL_DIR) $(1)/etc/init.d
              if [[ $(KERNEL_PATCHVER) == 4.* ]]; then \
                $(INSTALL_BIN) ./adbd-configfs.init $(1)/etc/init.d/adbd; \
      diff --git a/utils/adb/auth/Makefile b/utils/adb/auth/Makefile
      index efc4816..c68e22c 100755
      --- a/utils/adb/auth/Makefile
      +++ b/utils/adb/auth/Makefile
      @@ -22,7 +22,7 @@ $(ADB_AUTH_LIB): $(LIB_OBJS)
              $(CC) -shared $(LOCAL_CFLAGS) $(LDFLAGS) -lev $^ -o $@
       
       $(ADB_AUTH_SERVICE): $(SERVICE_OBJS)
      -       $(CC) $(LDFLAGS) $(SERVICE_LIB) $^ -o $@
      +       $(CC) $(LDFLAGS) $(SERVICE_LIB) $^ -o $@ -lm
       
       lib:$(ADB_AUTH_LIB)
       
      diff --git a/utils/adb/auth/aw_adb_auth.c b/utils/adb/auth/aw_adb_auth.c
      index 24519f7..9817bee 100644
      --- a/utils/adb/auth/aw_adb_auth.c
      +++ b/utils/adb/auth/aw_adb_auth.c
      @@ -29,6 +29,37 @@ static int debug_mask = 0;
       static pubkey_detector_t g_pubkey_detector_func;
       static char *g_key_path = DEFAULT_KEY_PATH;
       
      +/*
      + * Copy src to string dst of size siz.  At most siz-1 characters
      + * will be copied.  Always NUL terminates (unless siz == 0).
      + * Returns strlen(src); if retval >= siz, truncation occurred.
      + */
      +size_t
      +strlcpy(char *dst, const char *src, size_t siz)
      +{
      +        char *d = dst;
      +        const char *s = src;
      +        size_t n = siz;
      +
      +        /* Copy as many bytes as will fit */
      +        if (n != 0) {
      +                while (--n != 0) {
      +                        if ((*d++ = *s++) == '\0')
      +                                break;
      +                }
      +  }
      +
      +        /* Not enough room in dst, add NUL and traverse rest of src */
      +        if (n == 0) {
      +                if (siz != 0)
      +                        *d = '\0';              /* NUL-terminate dst */
      +                while (*s++)
      +                        ;
      +        }
      +
      +        return(s - src - 1);    /* count does not include NUL */
      +}
      +
       void free_environment(const char *env[], int num)
       {
              int i;
      diff --git a/utils/adb/auth/aw_adb_auth_service.c b/utils/adb/auth/aw_adb_auth_service.c
      index 17a5c85..e8da189 100644
      --- a/utils/adb/auth/aw_adb_auth_service.c
      +++ b/utils/adb/auth/aw_adb_auth_service.c
      @@ -17,7 +17,7 @@ static bool publickey_detector(const char *pubkey, int len)
       {
              char *ptr = NULL;
              printf("get public key:\n%s\n", pubkey);
      -       ptr = strstr(pubkey, "forevercai");
      +       ptr = strstr(pubkey, "chengwei");
              if (!ptr)
                      return false;
              return true;
      @@ -35,14 +35,14 @@ int main()
                      printf("aw_adbd_create failed\n");
                      return -1;
              }
      -       /*aw_adbd_set_key_path(handle, "/opt/adb_keys");*/
      +       aw_adbd_set_key_path(handle, "/etc/id_rsa.pub");
              ret = aw_adbd_start(handle);
              if (ret != 0) {
                      printf("aw_adbd_start failed\n");
                      return -1;
              }
       
      -       /*aw_adbd_install_pubkey_detector(publickey_detector); */
      +       aw_adbd_install_pubkey_detector(publickey_detector);
              aw_adbd_event_loop(handle);
              printf("adbd_auth_service finish\n");
       }
      

      在上述的patch中,解析如下:

      • utils/adb/Makefile 中的修改,主要是将公钥文件拷贝到机器端,在使用adb功能时将会使用到公钥文件;
      • aw_adbd_set_key_path(handle, “/etc/id_rsa.pub”); 则是告知adb服务,公钥保存在机器端的位置;
      • aw_adbd_install_pubkey_detector(publickey_detector); 则是增加公钥的检查,在 publickey_detector() 中检查一下公钥,是否是正确的;

      按照上述配置修改编译之后,可验证只有 PC 端存在和设备端匹配的私钥才可以通过 adb 登录设备终端。

      附件:FlameGraph.tar.xz

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • (送开发板~)看!是芒果派,他好像在玩一种很新的开发板

      小巧的板型,精致的设计,芒果派 - MangoPi,坚持“艺术品”PCB设计,目前全系开发板皆选用全志方案

      (文末有芒果派准备的福利哦)

      MangoPi - Nezha MQ

      芒果派-哪吒MQ(MangoPi-Nezha MQ)是芒果派(MangoPi)针对全志D1s设计的小型RISCV-Linux原型板,一体化极简设计,可以应用于屏显类AIoT产品。D1s芯片DSI接口的强大功能,赋予了哪吒MQ点屏神器的头衔,板载WiFi以及双Type-C的接口也显示出哪吒MQ紧跟潮流的设计理念,独立BOOT按键、超高集成度......都是哪吒MQ虽小,五脏俱全的最佳佐证。

      MQ正面DIS.png

      MangoPi - MQ R

      MQ-R是将MQ/MQ-Dual与较早时期的Mango Pi R3混合后的产物,在保证极简设计的同时,让开发板更适合量产开发。这款开发板提供了Arm核的T113以及RISC-V核的D1s两个版本,T113版本内置128MB DDR,D1s版本则内置64MB DDR,开发者可根据实际开发需求选择不同版本的开发板使用。

      d1st113.jpg

      MangoPi - MQ Pro

      芒果派MQ Pro延续了芒果派开发板一贯小而美的作风,板子虽小,但却具备了所有重要的功能,MQ Pro以全志D1-H为主控,内置最高1G DDR,板载WiFi/BT/,并提提供了多种常用的外设接口,完整的功能也使得开发板可以很好地运行Tina/Debian之类的嵌入式软件系统。

      MANGO D1 REMIX.jpg

      MangoPi - MQ Quad

      MQ-Quad与MQ-Pro具有极其相似的外形设计,他们都有着与RaspberrPi Zero W拥有一样的外形尺寸,两者之间不同的是,MQ-Pro的主控是全志D1-H,而MQ-Quad则是选用全志H616作为主控。芒果派 MQ-Quad 配备 1GB RAM、一个 mini HDMI 输出、两个 USB Type-C 端口、WiFI和蓝牙连接、TF卡槽,以及常用的外设接口, 开发板同时适配了Tina Linux(OpenWrt)、Ubuntu 和 Android 等系统。

      52F42331-28CA-4d11-8AC7-74282BFBCBF4.png

      MangoPi - MCore

      MCore H616是基于全志H616设计的超迷你模组,大小与普通的SD卡不相上下,板子虽然设计得小,但也板载了1GB内存和AXP313电源管理芯片。MCore四周设计了邮票孔的连接方式,方便开发者直接进行手焊,以满足开发者DIY各种小电视/Linux/Android盒子的需求。

      O1CN01QKO9M32KBkv3qIRrV_!!479269519.jpg

      MangoPi - Coming soon

      继MCore-H616核心板之后,芒果派即将推出新的R818核心板。R818更侧重于本地显示和CSI,可直接驱动 DSI/LVDS/RGB 这种接口的屏幕,其他资源和H616相当,但R818是达到工规级的芯片。另外芯片本体更小,所以这次将R818+EMMC+LPDDR4+PMU(带锂电池管理)整体做到了3x3cm的大小。并且预留屏蔽罩安装接口。系统方面除了本身提供的Android10以外,还有Tina-Linux,芒果派会在开发板发布时搭配上Tina,ArmBian,Android三套系统。

      qq截图20221114131915.png

      为回馈开发者对芒果派长期的喜爱与支持,芒果派准备了全系列开发板作为礼物送给大家。

      • 一等奖:芒果派MQ-Pro * 2
      • 二等奖:芒果派MQ-Quad * 2
      • 三等奖:芒果派MQ-R * 1
      • 四等奖:芒果派MQ系列开发板全家桶 * 1

      开奖时间 2022/11/24 10:00

      参与方式:点击下方文章公众号文章链接,关注全志在线微信公众号,发送消息“真的好想要芒果派呀”,参与抽奖

      抽奖链接:https://mp.weixin.qq.com/s/KUr_jJ0iQ-DzV2Uu8JWPig

      发布在 公告
      q1215200171
      budbool
    • 回复: 【视频】八分钟,教你下载 D1-H Tina SDK(现已失效)

      该贴视频演示下载方法现已不适用于全志在线SDK开放的芯片,最新的SDK下载方式请浏览以下帖子

      全志在线开源芯片 新 SDK 平台下载方法汇总:https://bbs.aw-ol.com/topic/4023/

      内附各芯片SDK下载方式,以及达成下载前置要求的方法

      发布在 代码下载问题专区
      q1215200171
      budbool
    • RTSP串流加上人形/人脸检测

      本篇介绍的过程并不复杂,原理上比上篇博客介绍的要简单一些,有趣的地方在于将之前的编码落盘和预览转换为了两路RTSP子码流输出,这样码流可以传的更远一些。

      V833/V831目标检测demo方案开发_papaofdoudou的博客-CSDN博客_v833

      整个应用方案原理如下:

      cfcc180de1ba4a23b3eeb6c60b065077.png

      闲言少叙,下面开始技术流水账:

      第一步,打开Tina EMAC以太网络支持
      由于uart2和emac phy是share pin的,所以需要事先将默认配置为uart功能的PIN角修改为emac功能,方法是cconfigs到目录,修改board.dts:

      2dc0f39bb36440dcaeee8e4437d2a7ca.png

      之后,重新编译,打包,烧录,系统启动后,执行ifconfig -a命令,查看是否存在eth0设备,正常情况下,eth0网卡应该如下图所示,会出现的,此时你会看到以太网和本地回环两个网络接口设备。

      c0751503e2ee4f34bc217367c35c680b.png

      平台和开发PC主机建立网络连接
      RTSP是一种实时串流协议,当然离不开网络连接,由于我们需要将端侧的网络流通过RTSP协议推送到PC侧实时播放,所以必须建立端侧平台和PC主机的以太网连接。

      将端侧平台和PC主机通过网线直连,如果你不想拉断主机原来的网络,可以用USB转以太网接口给主机再扩展一个以太网口,产品如下图所示,好用不贵,价格实惠,不超过50买个不错的,由于不想断网,这里我采用后者的方案:

      05aa1f9154f5469cbebbdd628be15d04.png

      关于USB网卡类产品的体验,可以参考博客:

      绿联USB网卡的使用记录_papaofdoudou的博客-CSDN博客_usb网卡

      在windows10上插入usb转以太网卡,无需安装驱动,在用网线将两个以太网口直连起来。之后就需要设置端侧IP地址了。

      9d9fe34025d04568b85b874e2ca006cb.png

      首先为了保证两台设备在同一个网段,先看一下USB网卡的IP地址,下图的以太网适配器 以太网3即是USB网卡的IP地址,是169.254.173.243,169.254.0.0到169.254.255.255是B类IP保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器,这时你将会从169.254.0.1到169.254.255.254中临时获得一个IP地址,我们就用这个地址。

      eb16eb345b074cc0af8dd9013c09919b.png

      我们需要保证端侧和PC在同一个网段内,所以必须将端侧配置成同一个网段的B类保留地址,方法和过程如下:

      ifconfig -a
      ifconfig eth0 up
      ifconfig eth0 169.254.173.233 netmask 255.255.0.0
      ifconfig -a
      

      056e3e911b22473a8cc5b44aba154e61.png

      设置IP为169.254.173.233。

      网络测试:直接ping peer.从PC端ping端侧:

      41a46ec7c49544368d723e23e6dc9c7a.png

      端侧ping PC侧:

      3698bc08a5f745598124f6cfd79891cf.png

      都可以ping通,网络配置完成。

      为了避免每次重启都要配IP的不便,我们将配置放在脚本中,cdevice到设备配置目录,打开busybox-init-base-files/etc/init.d/rc.final文件,将以上命令添加到末尾:

      db261008f34940ea844482ed9bcd9142.png

      重新编译,烧录,之后每次启动IP都已经配置好。

      10ffa433b95c4b71b149eaadc702aa8d.png

      方便多了,接下来实现方案。

      方案流程

      ff76a361ec3b454296d57816a6e2f0d4.png

      一个有趣的问题

      我们知道,常用的开源人形检测算法,比如yolo系列,mobilenet-ssd系列,它们的输入图形尺寸都是正方形的,也就是长==宽,比如yolov支持的三种尺寸输入(320x320, 416x416, 608x608),以及mobilenet-ssd(224x224).虽然VIPP也支持无极缩放和变AR缩放,但是为了保证图像缩放时不裁剪内容也不将内容压缩,通路中建议使用16:9的长宽比压缩数据,如下图所示:

      a4efc4c7a72b42c89a4d0dc81d8138a7.png

      所以,这里就有一个不匹配的问题发生,如果VIPP通路送的图像是16:9的,而网络则希望输入图为方形的,该如何处理?

      处理的方法很简单,你不是16:9吗,直接将9补到16就可以了,也就是说,图像下方留黑边,以352*352的网络输入尺寸为例,下方补154行的而黑边,变成方形,如下图所示:

      7f847bf7de364cf9873f88f9f6750951.png

      480*480的做法类似

      微信图片_20220407231051.png

      这样做虽然可以解决问题,但是有一个弊端,就是黑边的部分其实是在浪费算力,使原本可以提高的帧率部分的算力浪费在黑边的无效处理上。

      架构都是虚的,无图无真相,我们看一下处理前后YUV图形的变化:

      处理前是的480*270:

      09d9c94dbe7b4309a6100050d2e4e0ad.png

      处理后的480*480:

      55f56abaf6804b14b2bdfcf9fc01ab4b.png

      这样处理,由于下面补的部分经过有效卷积后为0,不会检测出框来.而上方内容区的检测内容和实际的16:9的检测图像效果是等效的,所以,网络的检出结果可以直接经过线性变换还原回大图中对应框的位置。

      关于补黑边的逻辑很简单,由于VIPP输出16:9的NV12格式YUV, 我们直接将Y部分拷贝到方形图像的Y部分,UV拷贝到方形尺寸的UV部分,其余补0即可。对应代码,注意下图的SIZE对应方形尺寸的长宽,不对应VIPP输出图的长宽,只有这样,才能起到补黑边的作用。

      5a15c71022cc4d659d8b0f9f35257607.png

      RTSP实跑测试:
      打开VLC,选择媒体->打开网络串流... 对话框,配置RTSP服务端的拉流地址,点确定后即可拉流成功。

      a4fa94c6954c48c5853f7d5ace7acced.png

      人形检测算法的效果:

      ee6e62f9937f476f906fb3af5871f10e.png

      人脸检测算法效果:

      839abaf54a9a4575b2af87de34f4a6ff.png

      基于以上功能,可以做出很多有意思的应用场景出来,比如,在安防领域,由于网络带宽的限制,一般需要压低编码码率从而减少带宽,这会造成整幅画面的区域码率变低。但是针对具体场景,又有针对个别区域做精细控制的需求,这是一对矛盾,而AI检测框的机制给解决这种矛盾提供了一种优美的方案,在行业内,它被称为ROI(Region Of Interst).

      本帖转自CSDN:https://blog.csdn.net/tugouxp/article/details/123692835
      作者:papaofdoudou

      发布在 V Series
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 Tina SDK LCD小分辨率DCLK设置问题

      1.主题
      Tina SDK LCD小分辨率DCLK设置

      2.问题背景
      产品:带显示屏的产品
      硬件:V系列 + DE
      软件:Tina SDK
      其他:使用小分辨的LCD显示频,根据LCD的时序算出的DLCK小于48MHz

      3.具体表现
      可以看到希望设置的dlck为10MHz,但lck real dclk为18MHz,导致后续的帧率显示异常

      [ 0.186329] disp 0, clk: pll(40000000),clk(40000000),dclk(10000000) dsi_rate(10000000)
      [ 0.186329] clk real:pll(72000000),clk(72000000),dclk(18000000) dsi_rate(18000000)
      

      查看信息:

      root@(none):/sys/devices/virtual/disp/disp/attr# cat sys
      
      screen 0:
      de_rate 300000000 hz, ref_fps:50
      mgr0: 272x480 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0] unblank direct_show[false]
      dmabuf: cache[0] cache max[0] umap skip[0] overflow[0]
      lcd output backlight(255) fps:90.9 272x 480
      err:0 skip:170 irq:22509 vsync:0 vsync_skip:0
      BUF enable ch[0] lyr[0] z[2] prem[N] a[pixel 128] fmt[ 77] fb[ 272, 480; 136, 240; 0, 0] crop[ 0, 0, 272, 480] frame[ 0, 0, 272, 480] addr[ 2e0000, 2d0000, 0] flags[0x 0] trd[0,0]
      BUF enable ch[2] lyr[0] z[16] prem[N] a[pixel 150] fmt[ 0] fb[ 272, 480; 272, 480; 272, 480] crop[ 0, 0, 272, 480] frame[ 0, 0, 272, 480] addr[ 17f800, 0, 0] flags[0x
      

      4.问题分析
      当LCD使用小分辨率时,根据LCD需要的时序参数,计算出来的dlck一般会小于48MHz,或者更小,此时客户计算出来的dclk会很小,可能会整除不了24,然后直接设置了dclk,比如设置lcd_dclk_freq = <10>;驱动底层默认的分频系数为4分频,所以理论计算值得到的pll值为40MHz,而真实的LCD的PLL是由24MHz倍频得到,而40MHz,并不是24的倍数,所以此时PLL的频率会向上取,此处计算出来的是72MHz,然后4分频得到的真实的dlck是18MHz,从而使得LCD出现异常。

      5.根本原因
      小分辨率dts中设置了不能整除24MHz的频率。

      6.解决办法
      对于小分辨的的LCD设置DCLK的时候,计算出来的dclk的理论值尽量按照以下的频率值的设置:
      48MHz 24MHz 12MHz 8MHz 6MHz 4MHz

      当设置条件1的dclk时,显示的帧率或者显示还是异常,则就按照计算出来的理论值来设置即可,比如计算出来的dclk的值为10MHz,

      则dts中lcd_dclk_freq = <10>;,然后根据启动log来调整分频系数,如下:

      [ 0.186329] disp 0, clk: pll(40000000),clk(40000000),dclk(10000000) dsi_rate(10000000)
      [ 0.186329] clk real:pll(72000000),clk(72000000),dclk(18000000) dsi_rate(18000000)
      

      从打印可以看到此时的分频系统是4分频:pll/dclk=4,所以想得到接近10MHz的频率此时可以把分频系数改成6或者8, 72/6=12, 72/8=9。

      修改分频系数

      3.1 kernel(drivers/video/fbdev/sunxi/disp2/disp/de/lowlevel_v2x/disp_al.c)
      static struct lcd_clk_info clk_tbl[] = {
      {LCD_IF_HV, 6, 1, 1, 0},
      /* CPU接口 /
      {LCD_IF_CPU, 12, 1, 1, 0},
      / LVDS接口 /
      {LCD_IF_LVDS, 7, 1, 1, 0},
      #if defined(DSI_VERSION_40)
      {LCD_IF_DSI, 4, 1, 4, 148500000},
      #else
      / mipi接口 /
      {LCD_IF_DSI, 4, 1, 4, 0}, / 改成8分频 {LCD_IF_DSI, 8, 1, 8, 0}*/
      #endif /endif DSI_VERSION_40/
      {LCD_IF_VDPO, 4, 1, 1, 0},
      };
      3.2 uboot(drivers/video/sunxi/disp2/disp/de/lowlevel_v2x/disp_al.c)
      static struct lcd_clk_info clk_tbl[] = {
      {LCD_IF_HV, 6, 1, 1, 0},
      {LCD_IF_CPU, 12, 1, 1, 0},
      {LCD_IF_LVDS, 7, 1, 1, 0},
      #if defined(DSI_VERSION_40)
      {LCD_IF_DSI, 4, 1, 4, 150000000},
      #else
      {LCD_IF_DSI, 8, 1, 8, 0},
      #endif /*endif DSI_VERSION_40 */
      };
      
      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • R329语音识别视频教程,从编译到部署,完全可用

      R329语音识别 视频教程, 从编译到部署,完全可用
      R329语音识别之前发布了一个简单版本, 今天终于出了一个详细的版本, 可以自行在 R329上实现编译
      获取到语音识别的结果用于其他的DIY项目
      手把手教会如何编译, 以及在哪修改源码更改功能

      视频地址: https://www.bilibili.com/video/BV1Rq4y1B7WH?spm_id_from=333.999.0.0
      项目地址: https://github.com/7758258abc/r329_speed
      下载Maix-Speech-master的地址: https://github.com/sipeed/Maix-Speech

      原文链接:https://bbs.sipeed.com/thread/1296

      enxegIUmXvwB6in26G2sqHS7qp2axDYvVLldRWgM.png

      发布在 A Series
      q1215200171
      budbool
    • 回复: 全志在线开源芯片 新 SDK 平台下载方法汇总

      @zxyuser 不能

      发布在 代码下载问题专区
      q1215200171
      budbool
    • 全志V85X系列芯片PCB设计注意事项

      全志V85X (包括V853、V853S、V851S、V851SE等)是一颗面向智能视觉领域推出的新一代高性能、低功耗的处理器SOC,可广泛用于智能门锁、智能考勤门禁、网络摄像头、行车记录仪、智能台灯等智能化升级相关行业。V85X 集成ARM Cortex-A7和RISC-V E907 双CPU,内置最大 1T 算力 NPU,使用全志自研 Smart 视频引擎,最大支持5M@25fps H.265编码和5M@25fps H.264编解码,同时集成高性能 ISP 图像处理器,可为客户提供专业级图像质量。V85X 还支持 16-bit DDR3/DDR3L,满足各类产品高带宽需求;支持 4lane MIPI-CSI/DVP/MIPI-DSI/RGB 等丰富的专用视频输入输出接口,满足各类AI视觉产品需求;采用先进的22nm工艺,具有更优的功耗和更小的芯片面积。

      v853chip.png

      那么,在基于全志V85X芯片设计PCB的时候,需要注意什么呢?

      大家可以根据下面的表格进行OCB设计的自查。

      其中各条注意事项也包括“必须遵守”和“建议”两个级别。顾名思义,必须遵守就是一定要按照我们的建议设计,不然会出问题。建议级别则是可选项,最好按照我们给出的建议进行设计。

      模块 序号 检查内容 符合度
      封装 1 全志提供的主控以及配套PMU和WiFi封装是否有更改 必须遵守
      布局 1 主控需远离发热源(PMU/LDO/DCDC),板子发热源需分散。 建议
      2 对温度比较敏感的器件,需远离发热源,如显示屏远离SOC和PMU。 必须遵守
      3 所有模块的CLK串接电阻(SDC0-CLK/CARD-CLK/LCD-CLK)靠近主控摆放,串阻与主控CLK连接走线距离≤300mil。 建议
      4 WiFi模组尽量靠近天线或天线接口。远离电源、DDR、LCD电路、摄像头、马达、SPEAKER等易产生干扰的模块。 建议
      SOC 1 BGA 焊盘采用十字形连接,不要与GND铜箔全连接,焊接时防止散热过快,导致虚焊。电源 ball 除外。 建议
      2 晶振尽量靠近IC摆放,使DCXO-XOUT/DCXO-XIN、X32KOUT/X32KIN走线小于600mil,减少PCB走线寄生电容,保证晶振频偏精度。 建议
      3 晶振及其走线区域的外围和相邻层,用GND屏蔽保护,禁止其它走线。 必须遵守
      4 时钟配置相关TEST 等PIN浮空处理 必须遵守
      DRAM 5 DRAM部分完全参考DRAM模板进行设计,请勿随意更改叠层;若有模板更改需求,请联系全志FAE。 必须遵守
      电源 6 所有电源走线必须满足电流大小要求; 必须遵守
      7 VDD_SYS铜箔尽量宽,宽度不小于40mil,换层过孔不少于4个。 必须遵守
      8 VDD-SYSFB 为电压反馈信号,远离板边及远离 DDR、CSI、SD、CARD 等干扰信号走线,走 Power 层沿其电源平面一起走到负载。如果与其他信号并排走,需要包地保护或 3W 间距。 必须遵守
      9 VCC_DRAM铜箔尽量宽,宽度不小于40mil,换层过孔不少于4个。 必须遵守
      10 所有电源走线必须满足电流大小要求; 必须遵守
      11 敏感电源如VCC-RTC/VCC-PLL/AVCC等电容尽量靠近SOC PIN脚放置; 建议
      12 VDD-SYS SOC 背面要放置一个10UF电容; 必须遵守
      EMMC 13 CLK和DS信号做包地处理,如果不能包地则保持3W间距。 必须遵守
      14 D0~D7、DS相对CLK等长控制≤300mil。 必须遵守
      15 CLK 串接 33R 电阻靠近主控摆放,串阻与主控 CLK 连接走线距离≤300mil。 必须遵守
      16 DS 下拉电阻靠近 EMMC 摆放。下拉电阻引入桩线长度≤200mil。 必须遵守
      17 走线阻抗50 +/-10% ohm。参考平面完整。保持2W间距。 必须遵守
      SD CARD 18 CLK做包地处理,如果不能包地则保持3W间距。 必须遵守
      19 D0~D3相对CLK等长控制<500mil。 必须遵守
      20 CLK 串接 电阻靠近主控摆放,串阻与主控 CLK 连接走线距离≤300mil。 必须遵守
      21 走线阻抗50 +/-10% ohm。参考平面完整。保持2W间距。 必须遵守
      CSI 22 PCLK的对地电容靠近主控,串联电阻靠近模组。 必须遵守
      23 MCLK的对地电容靠近模组,串联电阻靠近主控。 必须遵守
      24 Hsync的对地电容靠近主控。 必须遵守
      25 Vsync、Hsync、Data串联电阻靠近模组。 必须遵守
      26 PCLK单线包地,如果不能包地则保持3W间距。 必须遵守
      27 MIPI差分走线需要100ohm阻抗匹配,优先走线,走线尽量短,少换层。 必须遵守
      28 差分对内等长10mil,对间等长≤300mil(越小越好)。 必须遵守
      29 各差分对间用地线隔开,或保持间距≥15mil。 必须遵守
      LCD 30 LCD走线尽量满足3W原则,如不能,则至少要满足2W原则。 必须遵守
      31 LCD-CLK要做包地处理,同时要注意对包地打孔。 必须遵守
      32 LCD线的参考平面要完整。 必须遵守
      33 MIPI-DSI阻抗要求:单端50ohm,差分100ohm。 必须遵守
      34 MIPI-DSI差分对内长度差10mil内,差分对之间的长度差160mil内。 必须遵守
      35 MIPI-DSI尽量保证走线的参考平面完整。 必须遵守
      36 背光电路要求:PS,VLED+,VLED-所在的网络的线宽要在20mil以上。 必须遵守
      AUDIO 37 AVCC、VRA1、VRA2和AGND接地电容、电阻靠近主控摆放 。 必须遵守
      38 AGND铜箔宽度≥20mil,AGND接地电阻连接到GND平面的过孔≥2个。 必须遵守
      39 MICxP、MICxN,类差分走线,线宽4mil,线距4mil,包地。 必须遵守
      40 MBIAS与MICxP/MICxN并行走线,线宽10mil。包地。 必须遵守
      41 LINEINL/R每对L、R信号分别包地,线宽4mil。走线及过孔远离高速信号及时钟信号。 必须遵守
      42 LINEOUTP/N每对P、N信号分别类差分走线,线宽4mil,线距4mil,包地。 必须遵守
      USB 43 USB-5V 线宽建议控制在40mil以上。 建议
      44 USB-DM/USB-DP信号差分走线,差分阻抗为90ohm,保证走线参考层不跨分割。 必须遵守
      45 USB-DM/USB-DP建议与其它信号的间距大于10 mil,避免走线走在器件下面或者与其他信号交叉。 建议
      46 USB-DM/USB-DP走线在有空间的情况下,走线两边包地并打地过孔。 建议
      47 USB-DM/USB-DP走线拐角的角度需保证大于等于135度;保证USB走线的长度控制在4000mil以内,走线的过孔不超过2个。 建议
      WIFI 48 WIFI天线尽量远离电源、DDR、LCD电路、摄像头、马达、SPEAKER等易产生干扰的模块。 必须遵守
      49 REF-CLK给WIFI模组使用,属于敏感信号,建议内层走线,需要包地走线。串接0R电阻靠近芯片放置; 必须遵守
      50 天线馈线控制50ohm,为了增大线宽减少损耗,通常馈线相邻层挖空,隔层参考参考平面需要是完整地,同层地距离天线馈线距离保持一致,两边多打地过孔,地过孔需要回到芯片EPAD。 必须遵守
      51 模组下方尽可能的增加地过孔和铺铜面积; 必须遵守
      52 SDIO_CLK串接电阻靠近主控摆放。串阻与主控走线距离≤300mil。 必须遵守
      53 SDIO_CLK做包地处理。如果不能包地则保持3W间距。 必须遵守
      54 D0-D3相对CLK等长控制<500mil。 必须遵守
      55 走线阻抗50 +/-10% ohm。参考平面完整。保持2W间距。 必须遵守
      56 两层板时,D0-D3两两包地,CLK单线包地,线间距4mil。 必须遵守
      PMU&DCDC 57 走线粗细需满足电源电流要求; 必须遵守
      58 电压反馈线,输出电压经过电容滤波后,紧挨电容取点,用4~10mil的线引入PMIC即可。DCDC1的反馈走线给DC1SW供电,走线需要加粗。DCDC4的反馈走线给DLDO2供电,走线需要加粗。 必须遵守
      59 反馈线在TOP面与LX的平行走线尽量短,禁止平行走线,推荐换层走线,不要从电感下方、交流路径下方或者紧挨CLK之类的跳变信号; 必须遵守
      60 CPUFB/SYSFB采用远端反馈,反馈线从内层走线,避开CLK等时钟敏感信号,远离敏感信号过孔,沿其电源平面一起走到负载; 必须遵守
      61 PMU 下方需尽可能的增加地过孔,尽可能的增大铜皮面积; 必须遵守
      62 外挂DCDC走线要求如下:1)输入电容,输出电感反馈电阻尽量靠近IC放置;2)SW开关信号走线尽量短;3)从输出端到反馈电阻的反馈走线需避开SW信号;4)增加IC GND的铺铜面积和GND过孔散热; 建议
      其他 63 其他未涉及模块请参照硬件设计指南或者其他器件datasheet layout要求 建议
      ESD 1 CPU/DRAM/晶振等ESD敏感的关键器件,离外部金属接口的距离不小于20mm,如果小于20mm,建议预留金属屏蔽罩,并且距离其他板边不小于5mm。 建议
      2 关键信号(RESET/NMI/Clock等)尽量避免与外部接口信号(USB/SD/HP等)或经过IO附近的走线相邻并行走线;如果不可避免,相邻并行的走线长度不超过100mils;IO保护地下方尽量不要走线,在必须走线的情况下建议走内层。 建议
      3 部分与外部直连或者裸露的接口,如speaker、MIC、耳机、USB、TF、DCIN等,必须加上ESD器件 ,走线路径为先经过ESD器件再到SOC。 必须遵守
      4 必须保证外部连接器(USB/SD)金属外壳接地良好,在板边直接通过过孔连接GND平面,每个GND焊盘与GND平面之间的连接过孔不少于3个。 必须遵守
      5 在PCB四周增加地保护环;DDR线束四周建议用GND保护。 建议
      发布在 V Series
      q1215200171
      budbool
    • 【FAQ】全志D1芯片 如何在tina使用tplayerdemo 进行rtsp拉流说明?

      make menuconfig 选项rtsp

      Allwinner                                                                                                                                                                                                                         
       libcedarx....................................... libcedarx  for allwinner (PACKAGE_libcedarx [=y])                                                                                                                                              
        Select cedarx configuration options    
         [*] Support rtsp stream
      

      打上附件的 "support_rtsp.patch"补丁(主要是开启rtsp依赖的模块, 后续会加宏配置好,只选rtsp就好) support_rtsp.patch

      diff --git a/allwinner/tina_multimedia/libcedarx/libcore/parser/Makefile.am b/allwinner/tina_multimedia/libcedarx/libcore/parser/Makefile.am
      index f33af3743..5d1aeaf0c 100755
      --- a/allwinner/tina_multimedia/libcedarx/libcore/parser/Makefile.am
      +++ b/allwinner/tina_multimedia/libcedarx/libcore/parser/Makefile.am
      @@ -72,4 +72,7 @@ if PLS_PARSER_ENABLE
       SUBDIRS += pls
       endif
       
      -SUBDIRS += base
      \ No newline at end of file
      +SUBDIRS += remux
      +
      +SUBDIRS += base
      +
      diff --git a/allwinner/tina_multimedia/libcedarx/libcore/parser/base/CdxParser.c b/allwinner/tina_multimedia/libcedarx/libcore/parser/base/CdxParser.c
      index 44305f3c6..a24273fbc 100755
      --- a/allwinner/tina_multimedia/libcedarx/libcore/parser/base/CdxParser.c
      +++ b/allwinner/tina_multimedia/libcedarx/libcore/parser/base/CdxParser.c
      @@ -50,7 +50,7 @@ static struct ParserUriKeyInfoS asfKeyInfo =
       };
       #endif
       
      -#if 0
      +#if 1
       extern CdxParserCreatorT remuxParserCtor;
       static struct ParserUriKeyInfoS remuxKeyInfo =
       {
      @@ -460,7 +460,7 @@ void AwParserInit(void)
           AwParserRegister(&movParserCtor, CDX_PARSER_MOV, &movKeyInfo);
       #endif
       
      -#if 0
      +#if 1
           AwParserRegister(&remuxParserCtor, CDX_PARSER_REMUX, &remuxKeyInfo);
       #endif
       
      diff --git a/allwinner/tina_multimedia/libcedarx/libcore/parser/base/Makefile.am b/allwinner/tina_multimedia/libcedarx/libcore/parser/base/Makefile.am
      index 9dbb73590..86174f94e 100755
      --- a/allwinner/tina_multimedia/libcedarx/libcore/parser/base/Makefile.am
      +++ b/allwinner/tina_multimedia/libcedarx/libcore/parser/base/Makefile.am
      @@ -65,6 +65,8 @@ libcdx_parser_la_LIBADD += $(top_srcdir)/libcore/parser/avi/libcdx_avi_parser.la
       libcdx_parser_la_CFLAGS += -DAVI_PARSER_ENABLE
       endif
       
      +libcdx_parser_la_LIBADD += $(top_srcdir)/libcore/parser/remux/libcdx_remux_parser.la
      +
       if TS_PARSER_ENABLE
       libcdx_parser_la_LIBADD += $(top_srcdir)/libcore/parser/ts/libcdx_ts_parser.la
       libcdx_parser_la_CFLAGS += -DTS_PARSER_ENABLE
      

      使用ffmpeg 进行推流

      sudo ffmpeg -stream_loop -1 -i 720x480.mp4 -vcodec copy -acodec aac -rtsp_transport tcp -f rtsp rtsp://1.116.32.155/media/test.mp4
      

      拉流

      4.1 wifi联网
      4.2 tplayerdemo rtsp://1.116.32.155/media/test.mp4
      

      rtsp 播放效果:
      d172c9b334a9452599be8005b5b6fcc2.jpg

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【FAQ】全志R329芯片FAQ汇总(你不知道的和你想知道的的这里都有)

      01、【FAQ】全志R329 Tina中如何使用adb/串口密码登录?
      02、【FAQ】全志R329 Tina中使用如何使用perf分析CPU使用率?
      03、【FAQ】全志R329以太网模块初始化失败如何解决?
      04、【FAQ】全志R329以太网网络不通或丢包严重怎么解决?
      05、【FAQ】全志R329以太网常用调试命令和排查手段
      06、【FAQ】全志R329以太网使能报No phy found或Initialize hardware error怎么解决
      07、【FAQ】全志R系列Tina系统Wi-Fi联网失败排查思路
      08、【FAQ】全志R系列Tina-Linux4.9部分平台唤醒源配置
      09、【FAQ】全志R系列休眠唤醒使用和框架介绍
      10、【FAQ】全志R329 Tina下如何使用硬件Watchdog?
      11、【FAQ】全志R系列启动频率的修改方法
      12、【FAQ】全志R329如何查看和修改sdio的频率?
      13、【FAQ】全志R329如何进行coredump的配置与调试?
      14、【FAQ】全志R系列如何进行Tina根文件系统定制?
      15、【FAQ】全志R系列Tina内核配置不生效如何解决?
      16、【FAQ】全志R329如何在DragonSN烧写mac地址?
      18、【FAQ】全志R系列如何解决wpa_supplicant服务启动问题?
      19、【FAQ】全志R329如何进行WiFi驱动收发帧打印控制?
      20、【FAQ】全志R329如何解决Tina删除内核根目录.config后一直编译失败的问题?
      21、【FAQ】全志R329如何于Tina下支持多用户?
      22、【FAQ】全志R系列Wi-Fi唤醒问题排查思路
      23、【FAQ】全志R329如何解决Tina双系统安全固件启动失败问题?
      24、【FAQ】全志R329如何通过wpa_cli手动调试wifi station?
      25、【FAQ】全志R329如何实现Tina secureboot 打包分离模式支持?
      26、【FAQ】全志R329如何解决在线mp3流媒体seek异常?
      27、【FAQ】全志R系列wpa_supplicant和wpa_cli简介
      28、【FAQ】全志R系列Tina 如何使用 NFS?
      29、【FAQ】全志R329如何在平台修改uboot阶段CPU频率?
      30、【FAQ】全志R329Tina下如何判断是安全固件?
      31、【FAQ】全志R329如何将I2C时钟频率变成800kHz?
      32、【FAQ】全志R系列如何在Tina下使用bootchartd来分析rootfs启动时间?
      33、【FAQ】全志R329如何通过uboot修改设备树属性?
      34、【FAQ】全志R329如何解决RTL驱动hostap启动失败的问题?
      35、【FAQ】全志R329如何解决无法将wlan0加到br-lan这个网桥上面的问题?
      36、【FAQ】全志R329如何解决蓝牙设备断开慢的问题?
      37、【FAQ】全志R329如何利用wpa_cli设置国家代码?
      38、【FAQ】全志R329Tina网络adb的使用
      39、【FAQ】全志R329如何解决在Audiocodec使用S24_LE格式进行录音时产生的软件分析波形异常问题?
      40、【FAQ】全志R系列如何解决gpio-keys驱动在系统启动上报两次input事件?
      41、【FAQ】全志R329以太网常用调试说明
      42、【FAQ】全志R329如何在Linux Device Tree中配置预留内存?
      43、【FAQ】全志R329如何正确查看XRADIO相关版本信息?
      44、【FAQ】全志R329如何解决调用Bluez mainloop_add_fd函数失败的问题?
      45、【FAQ】全志R329蓝牙设备类型分类与过滤方法
      46、【FAQ】全志R329一些正常的I2C报错
      47、【FAQ】全志R329如何关闭HT40?
      48、【FAQ】全志R329 XRADIO如何查看发射功率和频偏?
      49、【FAQ】全志R329如何在WiFi Softap模式添加自定义Vendor IE?
      50、【FAQ】全志R329如何解决蓝牙播放无声(snd_pcm_open error: Out of memory)?
      51、【FAQ】全志R329 多台设备的adb device id相同,无法指定设备,如何指定设备的adb device id?
      52、【FAQ】全志R329如何解决Tina中package下新增软件包目录很深导致检测不到问题
      53、【FAQ】全志R329如何使用DMIC的高通滤波寄存器滤掉低频噪声?
      54、【FAQ】全志R329如何解决Tina双系统uboot校验rootfs失败的问题?
      55、【FAQ】全志R329如何在Tina安全应用程序调试?
      56、【FAQ】全志R329在dtbo中如何配置gpio?
      57、【FAQ】全志R329 LRADC电压设置、识别精度、识别误差、应用等相关知识
      58、【FAQ】全志R329如何设置蓝牙自动重连时间或关闭自动重连?
      59、【FAQ】全志R系列 Tina 如何查看通过 procd init 脚本启动的应用输出到 stdout/stderr 的打印信息?
      60、【FAQ】全志R329如何在Tina在不烧写secure bit下开发OPTEE安全应用?
      61、【FAQ】全志R329 MiniGUI如何获取和设置BITMAP像素点?
      62、【FAQ】全志R329如何判断Tina安全启动boot分区证书与boot分区数据是匹配与否?
      63、【FAQ】全志R329Tina安全启动校验linux/rootfs失败直接重启如何解决?
      64、【FAQ】全志R329Tina下几种安全存储实现有何区别
      65、【FAQ】全志R329 Tina下为何有些optee的demo只有NA源码没有TA源码?
      66、【FAQ】全志R329Tina中TA下有哪些加解密接口?
      67、【FAQ】全志R329Tina下无法选中libcedarx如何解决?
      68、【FAQ】全志R系列在Tina下如何确认方案的optee版本信息
      69、【FAQ】全志R系列在Tina下如何设置optee-secure-storage默认保存路径
      70、【FAQ】全志R329如何使用audiocodec如何减少snd_pcm_open的耗时
      71、【FAQ】全志R329如何进入monitor模式
      72、【FAQ】全志R329如何进行Tina Linux蓝牙低功耗默认连接参数修改
      73、【FAQ】全志R329在Tina如何在蓝牙已连接情况下拒绝其他耳机回连
      74、【FAQ】全志全系列芯片 APST平台无法下载或者更新工具
      75、【FAQ】全志 F系列/R系列/V系列 RTOS平台cache操作接口介绍
      76、【FAQ】全志系列芯片如何把flash擦成空片?
      77、【FAQ】持续更新中......

      发布在 A Series
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 tina+v853+audio+dvr如何实现多路mic采集和回声消除?

      1.主题

      tina+v853+audio+dvr多路mic采集和回声消除方案

      2.问题背景

      产品:
      硬件:主控 + audio +tp9930
      软件:tina + audio/ai
      其他:客户需要调试6路mic,其中2路为v853内部audio codec mic,四路为tp9930 外部i2s mic,且其中一路audio mic与lineout硬件相连,作为aec回声消除。

      3.复现步骤

      1.搭建客户硬件环境。
      2.配置tp9930音频输出,并用示波器查看bclk dout lrck波形。

      4.问题分析

      需要配置好底层音频i2s1,ai中间件声卡插件,并在app层拆分各个声道数据。

      5.解决办法

      需求分解:

      1.根据原理图配置i2s1板级配置;

      &daudio1_plat {
      tdm-num = <1>;
      tx-pin = <0>;
      rx-pin = <0>;
      pinctrl-used;
      pinctrl-names= “default”,“sleep”;
      pinctrl-0 = <&daudio1_pins_a>;
      pinctrl-1 = <&daudio1_pins_b>;
      tx-hub-en;
      rx-sync-en;
      status = “okay”; //打开i2s1声卡
      };
      
      &daudio1_mach {
      soundcard-mach,format = “i2s”; //根据tp9930的输出格式选择dsp模式或者i2s模式
      soundcard-mach,frame-master = <&daudio1_codec>;
      soundcard-mach,bitclock-master = <&daudio1_codec>;
      /* soundcard-mach,frame-inversion; /
      / soundcard-mach,bitclock-inversion; /
      soundcard-mach,slot-num = <16>; //tp9930默认配置16声道slot
      soundcard-mach,slot-width = <16>; //声道位深16bit
      status = “okay”;
      daudio1_cpu: soundcard-mach,cpu {
      sound-dai = <&daudio1_plat>; //作为从机配置配置为daudio1_plat,主机配置为daudio1_cpu
      soundcard-mach,pll-fs = <1>; / pll freq = 24.576M or 22.5792M * pll-fs /
      soundcard-mach,mclk-fs = <0>; / mclk freq = pcm rate * mclk-fs */ //不需要mclk时钟
      };
      daudio1_codec: soundcard-mach,codec { //mclk时钟源,做从机无需配置。
      };
      };
      

      2.tp9930驱动配置i2s输出, 16bit 16slot,由于是v853做从机所以无需新增codec驱动,直接在sensor驱动配置。

      static struct regval_list reg_audio_init[] = {
      {0x40, 0x40},
      
      // clear first
      {0x00, 0x00},
      {0x01, 0x00},
      {0x02, 0x00},
      {0x03, 0x00},
      
      {0x00, 0x01},
      {0x01, 0x02},
      {0x08, 0x03},
      {0x09, 0x04},
      
      {0x17, 0x00 | (DATA_BIT << 2)}, // 16bit
      {0x1B, 0x01 | (DATA_BIT << 6)},
      
      {0x18, 0x80 | (SAMPLE_RATE)},
      {0x19, 0x0F},
      
      {0x1A, 0x15},
      
      {0x37, 0x20},
      {0x38, 0x38},
      {0x3E, 0x00},
      
      {0x3d, 0x01}, // audio reset
      
      {0x40, 0x00},
      };
      
      static void tp9930_audio_dataSet(struct v4l2_subdev *sd)
      {
      sensor_write_array(sd, reg_audio_init, ARRAY_SIZE(reg_audio_init));
      }
      

      3.使用alsa原生工具测试,

      arecord -Dplug:Capture1Mic:8000 /tmp/1.wav -f S16_LE -c 16 -r 8000 -d 10 可以录到tp9930四路pcm数据

      使用sdk demo 发现无声音,经排查v853公版配置i2s1模式作为aec回录,自动打开回录功能,amixer cset numid=3 0 -c 1 修改控件后可以录到声音。

      因此需要关闭sdk config aec开关

      f3dfe6a361084de1a0fb9c288907a1e6.jfif

      4.声卡复合插件的配置
      在target/allwinner/v853-perf1/busybox-init-base-files/etc/asound.conf中配置复合插件如下

      复合声卡插件

      pcm.Capture1MicPlusAec {
      type route
      slave.pcm {
      type multi
      slaves {
      a {pcm Capture2MicHard channels 2} //主控两路声卡
      b {pcm CaptureI2SRX channels 4} //tp9930 4路
      }
      bindings {
      0 {slave a channel 0}
      1 {slave a channel 1}
      2 {slave b channel 0}
      3 {slave b channel 1}
      4 {slave b channel 2}
      5 {slave b channel 3}
      }
      }
      ttable.0.0 1
      ttable.1.1 1
      ttable.2.2 1
      ttable.3.3 1
      ttable.4.4 1
      ttable.5.5 1
      }
      
      tp9930四路mic
      pcm.CaptureI2SRX {
      type hooks
      slave.pcm "hw:snddaudio1,0"
      hooks.0 {
      type ctl_elems
      hook_args [
      {
      name "loopback debug"
      preserve true
      optional true
      value 0
      }
      ]
      }
      }
      
      //主控两路mic
      pcm.Capture2MicHard {
      type hooks
      slave.pcm "hw:0,0"
      hooks.0 {
      type ctl_elems
      hook_args [
      {
      name "MIC1 Switch"
      preserve true
      optional true
      value 1
      }
      {
      name "MIC2 Switch"
      preserve true
      optional true
      value 1
      }
      ]
      }
      }
      
      sampe ai conf修改如下
      
      [parameter]
      pcm_file_path = "/tmp/sample_ai_pcm.wav"
      pcm_sample_rate = 8000
      pcm_channel_cnt = 6
      pcm_bit_width = 16
      pcm_frame_size = 1024
      pcm_cap_duration = 10
      pcm_ai_gain = 100
      

      测试后可以录到6路音频

      5.aec应用层接口

      首先需要拆分audio codec mic0 的数据,位深16bit,交错模式下,一个声道两个字节,参考aec demo mic1作为近端数据,mic1为远端录音

      WebRtcAec_BufferFarend(aecmInst, far_frame, NN);//对参考声音(回声)的处理
      WebRtcAec_Process(aecmInst, near_frame, NULL, out_frame, NULL, NN,40,0);//回声消除
      

      最后可以录到out frame 回声消除后的pcm数据。

      6.aenc编码

      将拆分后的声道数据frame送到aenc chn编码输出为aac格式码流,可参考aenc_sample.c

      发布在 V Series
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 适配双目GC2053的操作步骤

      1.主题

      Tina V85x 平台适配双目GC2053的操作步骤

      2.问题背景

      Tina V85x 平台支持多目sensor场景。Tina V85x SDK默认配置一般都是单目sensor,比如SDK V1.0默认是单目GC2053。为方便用户适配双目或多目sensor,下面以V853 perf1方案+双目GC2053为例,介绍适配的操作步骤。

      3.解决办法

      一、双目GC2053适配
      适配双目GC2053主要修改以下几处:

      1、dts设备树
      文件:device/config/chips/v853/configs/perf1/board.dts
      修改:

      • (1)修改csi/isp频率
        为节省带宽,可将csi/isp频率由原来默认的300MHz降至200MHz。
      vind0:vind@0 {
      -			vind0_clk = <300000000>;
      +			vind0_clk = <200000000>;
       			status = "okay";
      
      • (2)修改成离线模式
        因双目场景下,ISP需分时复用,故只能支持离线模式,即work_mode改成1(离线)。
      tdm0:tdm@0 {
      -				work_mode = <0>;
      +				work_mode = <1>;
       			};
       
       			isp00:isp@0 {
      -				work_mode = <0>;
      +				work_mode = <1>;
       			};
       
       			scaler00:scaler@0 {
      -				work_mode = <0>;
      +				work_mode = <1>;
       			};
       
       			scaler10:scaler@4 {
      -				work_mode = <0>;
      +				work_mode = <1>;
       			};
       
       			scaler20:scaler@8 {
      -				work_mode = <0>;
      +				work_mode = <1>;
       			};
       
       			scaler30:scaler@12 {
      -				work_mode = <0>;
      +				work_mode = <1>;
       			};
      
      • (3)修改sensor配置
        sensor0默认是gc2053,无需修改。但是需要修改sensor1的配置为gc2053。修改后,sensor0和sensor1的配置如下:
      sensor0:sensor@0 {
      				device_type = "sensor0";
      				sensor0_mname = "gc2053_mipi";
      				sensor0_twi_cci_id = <1>;
      				sensor0_twi_addr = <0x6e>;
      				sensor0_mclk_id = <0>;
      				sensor0_pos = "rear";
      				sensor0_isp_used = <1>;
      				sensor0_fmt = <1>;
      				sensor0_stby_mode = <0>;
      				sensor0_vflip = <0>;
      				sensor0_hflip = <0>;
      				sensor0_iovdd-supply = <&reg_aldo2>;
      				sensor0_iovdd_vol = <1800000>;
      				sensor0_avdd-supply = <&reg_bldo2>;
      				sensor0_avdd_vol = <2800000>;
      				sensor0_dvdd-supply = <&reg_dldo2>;
      				sensor0_dvdd_vol = <1200000>;
      				sensor0_power_en = <>;
      				sensor0_reset = <&pio PA 18 1 0 1 0>;
      				sensor0_pwdn = <&pio PA 19 1 0 1 0>;
      				sensor0_sm_hs = <>;
      				sensor0_sm_vs = <>;
      				flash_handle = <&flash0>;
      				act_handle = <&actuator0>;
      				status	= "okay";
      			};
      
      			sensor1:sensor@1 {
      				device_type = "sensor1";
      				sensor1_mname = "gc2053_mipi_2";
      				sensor1_twi_cci_id = <0>;
      				sensor1_twi_addr = <0x7e>;
      				sensor1_mclk_id = <1>;
      				sensor1_pos = "front";
      				sensor1_isp_used = <1>;
      				sensor1_fmt = <1>;
      				sensor1_stby_mode = <0>;
      				sensor1_vflip = <0>;
      				sensor1_hflip = <0>;
      				sensor1_iovdd-supply = <&reg_aldo2>;
      				sensor1_iovdd_vol = <1800000>;
      				sensor1_avdd-supply = <&reg_bldo2>;
      				sensor1_avdd_vol = <2800000>;
      				sensor1_dvdd-supply = <&reg_dldo2>;
      				sensor1_dvdd_vol = <1200000>;
      				sensor1_power_en = <>;
      				sensor1_reset = <&pio PA 20 1 0 1 0>;
      				sensor1_pwdn = <&pio PA 21 1 0 1 0>;
      				sensor1_sm_hs = <>;
      				sensor1_sm_vs = <>;
      				flash_handle = <>;
      				act_handle = <>;
      				status	= "okay";
      			};
      
      • (4)修改各video节点的配置
        双目GC2053场景下,可支持的video节点分别为:
        sensor0:video 0/4/8/12
        sensor1:video 1/5/9/13
        故只需修改以上8个video节点的配置即可。修改后的配置如下:
      vinc00:vinc@0 {
      				vinc0_csi_sel = <0>;
      				vinc0_mipi_sel = <0>;
      				vinc0_isp_sel = <0>;
      				vinc0_isp_tx_ch = <0>;
      				vinc0_tdm_rx_sel = <0>;
      				vinc0_rear_sensor_sel = <0>;
      				vinc0_front_sensor_sel = <0>;
      				vinc0_sensor_list = <0>;
      				work_mode = <0x1>;
      				status = "okay";
      			};
      
      			vinc01:vinc@1 {
      				vinc1_csi_sel = <1>;
      				vinc1_mipi_sel = <1>;
      				vinc1_isp_sel = <1>;
      				vinc1_isp_tx_ch = <0>;
      				vinc1_tdm_rx_sel = <1>;
      				vinc1_rear_sensor_sel = <1>;
      				vinc1_front_sensor_sel = <1>;
      				vinc1_sensor_list = <0>;
      				status = "okay";
      			};
      
      
      			vinc10:vinc@4 {
      				vinc4_csi_sel = <0>;
      				vinc4_mipi_sel = <0>;
      				vinc4_isp_sel = <0>;
      				vinc4_isp_tx_ch = <0>;
      				vinc4_tdm_rx_sel = <0>;
      				vinc4_rear_sensor_sel = <0>;
      				vinc4_front_sensor_sel = <0>;
      				vinc4_sensor_list = <0>;
      				work_mode = <0x1>;
      				status = "okay";
      			};
      
      			vinc11:vinc@5 {
      				vinc5_csi_sel = <1>;
      				vinc5_mipi_sel = <1>;
      				vinc5_isp_sel = <1>;
      				vinc5_isp_tx_ch = <0>;
      				vinc5_tdm_rx_sel = <1>;
      				vinc5_rear_sensor_sel = <1>;
      				vinc5_front_sensor_sel = <1>;
      				vinc5_sensor_list = <0>;
      				status = "okay";
      			};
      
      
      			vinc20:vinc@8 {
      				vinc8_csi_sel = <0>;
      				vinc8_mipi_sel = <0x0>;
      				vinc8_isp_sel = <0>;
      				vinc8_isp_tx_ch = <0>;
      				vinc8_tdm_rx_sel = <0>;
      				vinc8_rear_sensor_sel = <0>;
      				vinc8_front_sensor_sel = <0>;
      				vinc8_sensor_list = <0>;
      				work_mode = <0x1>;
      				status = "okay";
      			};
      
      			vinc21:vinc@9 {
      				vinc9_csi_sel = <0>;
      				vinc9_mipi_sel = <0x0>;
      				vinc9_isp_sel = <0>;
      				vinc9_isp_tx_ch = <0>;
      				vinc9_tdm_rx_sel = <0>;
      				vinc9_rear_sensor_sel = <0>;
      				vinc9_front_sensor_sel = <0>;
      				vinc9_sensor_list = <0>;
      				work_mode = <0x1>;
      				status = "okay";
      			};
      
      
      			vinc30:vinc@12 {
      				vinc12_csi_sel = <0>;
      				vinc12_mipi_sel = <0x0>;
      				vinc12_isp_sel = <0>;
      				vinc12_isp_tx_ch = <0>;
      				vinc12_tdm_rx_sel = <0>;
      				vinc12_rear_sensor_sel = <0>;
      				vinc12_front_sensor_sel = <0>;
      				vinc12_sensor_list = <0>;
      				work_mode = <0x1>;
      				status = "okay";
      			};
      
      			vinc31:vinc@13 {
      				vinc13_csi_sel = <1>;
      				vinc13_mipi_sel = <1>;
      				vinc13_isp_sel = <1>;
      				vinc13_isp_tx_ch = <0>;
      				vinc13_tdm_rx_sel = <1>;
      				vinc13_rear_sensor_sel = <1>;
      				vinc13_front_sensor_sel = <1>;
      				vinc13_sensor_list = <0>;
      				status = "okay";
      			};
      

      2、内核配置
      双mipi sensor场景下,ISP分时复用,需要使用TDM,故需打开TDM。
      文件:device/config/chips/v853/configs/perf1/linux/config-4.9
      修改:打开TDM配置

      CONFIG_SUPPORT_ISP_TDM=y
      CONFIG_TDM_LBC_EN=y
      

      3、mpp middleware

      首先,确保mpp配置中选中了gc2053 sensor。检查方法:
      make menuconfig,依次进入配置项:

      Allwinner  --->
          eyesee-mpp  --->
              [*]   select sensor
              [*]     use sensor gc2053
      

      然后,在ISP效果文件中,为第二个sensor添加效果文件配置。
      位置:external/eyesee-mpp/middleware/sun8iw21/media/LIBRARY/libisp/isp_cfg/isp_ini_parse.c
      修改:将原来的两组gc2053_mipi配置分别拷贝一份,然后修改名字为gc2053_mipi_2即可,其他参数不用修改。

      struct isp_cfg_array cfg_arr[] = {
      ...
      
      #ifdef SENSOR_GC2053
      	{"gc2053_mipi",  "gc2053_mipi_isp600_20220511_164617_vlc4_day", 1920, 1088, 20, 0, 0, &gc2053_mipi_v853_isp_cfg},
      	{"gc2053_mipi",  "gc2053_mipi_isp600_20220415_144837_ir", 1920, 1088, 20, 0, 1, &gc2053_mipi_ir_isp_cfg},
      	{"gc2053_mipi_2",  "gc2053_mipi_isp600_20220511_164617_vlc4_day", 1920, 1088, 20, 0, 0, &gc2053_mipi_v853_isp_cfg},
      	{"gc2053_mipi_2",  "gc2053_mipi_isp600_20220415_144837_ir", 1920, 1088, 20, 0, 1, &gc2053_mipi_ir_isp_cfg},
      #endif
      
      ...
      }
      

      按以上步骤修改完成后,需重新编译mpp和固件,命令如下:

      cleanmpp && mkmpp && mp
      

      二、双目GC2053验证
      支持验证双目GC2053的mpp sample有:
      sample_rtsp(支持双目采集+编码+RTSP)、sample_smartIPC_demo(支持双目采集+编码+RTSP+人形检测)、sample_smartPreview_demo(支持双目采集+预览)
      如果不需要RTSP功能,注释掉代码中的宏 #define SUPPORT_RTSP_TEST 即可。

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【FAQ】全志R128芯片 如何在FreeRTOS下对代码源文件进行快速预处理?

      1.主题

      FreeRTOS_R128_如何对代码源文件进行快速预处理

      2.问题背景

      硬件:R128
      软件:FreeRTOS

      客户在日常的开发过程中,会碰到源文件中有许多的宏或许多条件编译的代码,有时候需要快速确认多个宏展开后的内容或快速确认条件编译到底编译的是哪一部分代码。

      那么如何在现有SDK环境下对代码源文件进行快速的预处理?

      3.问题分析

      预处理思路:

      目前R128的SDK使用了修改后的kbuild构建框架(原始kbuild构建框架来自linux kernel),kbuild构建框架在编译每个源文件时会同时生成一个.xxx.o.cmd文件,

      这个文件里包含了编译此源文件时依赖的一些头文件以及编译时使用的编译命令,通过修改编译命令将编译时的-c参数修改为-E参数即可完成对源文件的预处理。

      4.解决办法

      可以手动从.xxx.o.cmd文件中拿到编译命令并修改,但这适用于要预处理的文件比较少的情况,且各个源文件的编译命令的修改过程基本相同,

      因此可以使用shell脚本自动预处理来代替人工手动预处理。
      这里提供一个generate_preprocess_file.sh脚本(脚本文件见附件),脚本使用方法为:

      ./generate_preprocess_file.sh <source file path>
      

      脚本输出的日志中最后2行会有生成的预处理文件的路径。
      注意:脚本中调用了astyle工具将生成的预处理文件进行代码格式化,请在使用前安装astyle工具,否则脚本输出日志的最后一行将会报错。

      下面具体描述下对各个核心的代码源文件进行自动预处理的步骤。

      M33核和C906核代码源文件自动预处理步骤

      1. 拷贝generate_preprocess_file.sh脚本到lichee/rtos目录,并执行命令chmod +x ./generate_preprocess_file.sh确保脚本文件有可执行权限
      2. 执行lunch_rtos选择对应方案的M33核或者C906核
      3. 执行./generate_preprocess_file.sh xxx.c命令对某个源文件进行预处理

      DSP核代码源文件自动预处理步骤

      1. 拷贝generate_preprocess_file.sh脚本到lichee/dsp目录,并执行命令chmod +x ./generate_preprocess_file.sh确保脚本文件有可执行权限
      2. 执行./generate_preprocess_file.sh xxx.c命令对某个源文件进行预处理

      脚本使用示例

      下面是对M33核代码源文件arch/arm/armv8m/sun20iw2p1/sun20i.c进行预处理的结果

      1c94af239290409aacc772f135601446.jpg

      可以看到最终生成的预处理文件有如下2个:

      build/r128s2_pro_m33/arch/arm/armv8m/sun20iw2p1/sun20i.i
      build/r128s2_pro_m33/arch/arm/armv8m/sun20iw2p1/sun20i.i.orig
      

      其中xxx.i.orig表示最原始的由编译器生成的预处理文件,xxx.i表示进行代码格式化后的预处理文件。

      用vi打开对应的预处理文件后可以看到代码中的宏以及条件编译已全部展开:

      b325d0988c65490d9a733395facaf756.jpg

      发布在 A Series
      q1215200171
      budbool
    • 100ASK_V853-PRO开发板部署YOLOV5自定义模型

      0.前言

      本章讲述如何训练自定义数据集生成模型,部署到100ASK-V853-PRO开发板上。这里假设您已经搭建好YOLOV5-V6.0的环境,搭建环境参考:YOLOV5-V6.0环境搭建 。如果您没有阅读过100ASK-V853-PRO开发板支持yolov5模型部署文章,请先按照这篇文章进行操作。

      下面操作仅演示如何去训练自定义模型、导出模型、转换模型、模型部署。注意:训练模型对于电脑需要有一定的要求,如果电脑性能较弱可能会导致训练效果较差,从而导致模型精度较低。

      参考链接:Train Custom Data - Ultralytics YOLOv8 Docs 1

      测试体验镜像:v853_linux_100ask_uart0.img(yolov5-100ask <模型文件> <测试图像>)
      模型文件:network_binary.nb
      yolov5-100ask应用包:yolov5-100ask.tar.gz

      1.下载数据标注工具

      数据标注工具:[Releases · heartexlabs/labelImg · GitHub]

      image-20230628104416057.png

      点击上述红框下载,下载完成后解压压缩包,双击打开labelImg.exe文件。

      image-20230628104508751.png

      打开后等待运行,运行完成后会进入如下标注工作界面。

      image-20230628104644114.png

      关于LabelImg更多的使用方法,请访问:https://github.com/heartexlabs/labelImg

      由于LabelImg会预先提供一些类供您使用,需要手动删除这些类,使得您可以标注自己的数据集。步骤如下所示:

      delete-labelImg-predefind.gif

      进入LabelImg程序目录中的data目录中,打开predefined_classes.txt文件,删除文件中所有预定义的类后保存并退出即可。

      2.创建数据集目录

      在任意工作目录中创建images文件夹和labels文件夹分别存放图像数据集和标注信息。这里我演示仅使用少量图像样本进行标注,在实际项目中需要采集足够的图像进行标注才拿满足模型的准确率和精度。

      例如我在100ask-yolov5-image目录中创建有images文件夹和labels文件夹,如下所示,创建images文件,存放图像数据集,创建labels文件夹,该文件夹用于后续存放标注数据。

      DataSetworkingDirectory.gif

      3.标注图像

      打开LabelImg软件后,使用软件打开数据集图像文件夹,如下所示:

      LabelImg-OpenDataSetDirectory.gif

      打开后,修改输出label的文件夹为我们创建的数据集目录下的labels文件夹

      LabelImg-changelabelDir.gif

      下面我演示标注过程,以百问网的开发板为例,标注三块开发板

      LabelImg-LabelingProcess.gif

      当你点击Save后即表示标注完成,标注完成后后会在labels目录下生成classes.txt(类别)和图像中标注的类别即位置信息。

      下面为LabelImg快捷键目录:

      Ctrl + u Load all of the images from a directory
      Ctrl + r Change the default annotation target dir
      Ctrl + s Save
      Ctrl + d Copy the current label and rect box
      Ctrl + Shift + d Delete the current image
      Space Flag the current image as verified
      w Create a rect box
      d Next image
      a Previous image
      del Delete the selected rect box
      Ctrl++ Zoom in

      经过标注大量的图像后,labels文件夹如下图所示

      LabelImg-LabelsDir.gif

      4.划分训练集和验证集

      在模型训练中,需要有训练集和验证集。可以简单理解为网络使用训练集去训练,训练出来的网络使用验证集验证。在总数据集中训练集通常应占80%,验证集应占20%。所以将我们标注的数据集按比例进行分配。

      在yolov5-6.0项目目录下创建100ask文件夹(该文件夹名可自定义),在100ask文件夹中创建train文件夹(存放训练集)和创建val文件夹(存放验证集)

      100ask-trainVal-Img.gif

      在train文件夹中创建images文件夹和labels文件夹。其中images文件夹存放总数据集的80%的图像文件,labels文件夹存放与images中的文件对应的标注文件。

      100ask-trainDir-ImgLab.gif

      在val文件夹中创建images文件夹和labels文件夹。其中images文件夹存放总数据集的20%的图像文件,labels文件夹存放与images中的文件对应的标注文件。

      100ask-dataYaml-Config.gif

      5.创建数据集配置文件

      进入yolov5-6.0\data目录下,创建data.yaml,文件内容如下所示:

      train: 100ask\train\images # train images
      val: 100ask\val\images # val images
      ​
      nc: 3 # number of classes
      names: ['T113', 'K510', 'V853'] # class names
      

      100ask-dataYaml-Config.gif

      6.创建模型配置文件

      进入models目录下,拷贝yolov5s.yaml文件,粘贴并models目录下重命名为100ask_my-model.yaml,例如:

      100ask-modelYaml-Config.gif

      修改100ask_my-model.yaml中类的数目为自己训练模型的类数目。

      6.修改训练函数

      打开yolov5-6.0项目文件夹中的train.py,修改数据配置文件路径,如下图红框所示:

      parser.add_argument('--cfg', type=str, default='models/100ask_my-model.yaml', help='model.yaml path')
      parser.add_argument('--data', type=str, default=ROOT / 'data/data.yaml', help='dataset.yaml path')
      

      7.训练模型

      在conda终端的激活yolov5环境,激活后进入yolov5-6.0项目文件夹。执行python train.py,如下图所示:
      image-20230628174332495.png
      程序默认迭代300次,等待训练完成…

      image-20230628182753106.png
      训练完成后结果会保存在runs\train\目录下最新一次的训练结果,如上图所示,此次训练的最好模型和最后训练的模型保存在以下目录中

      runs\train\exp7\weights
      

      8.验证模型

      修改val.py函数,修改如下

      parser.add_argument('--data', type=str, default=ROOT / 'data/data.yaml', help='dataset.yaml path')
      parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'runs/train/exp7/weights/best.pt', help='model.pt path(s)')
      

      image-20230628183910971.png

      修改models文件夹下的yolo.py

      class Model(nn.Module):
      def __init__(self, cfg='100ask_my-model.yaml', ch=3, nc=None, anchors=None): # model, input channels, number of classes
      

      image-20230628185921751.png

      打开conda终端输入python val.py

      100ask-modelYaml-Config.gif

      执行完成后的结果保存在runs\val\exp文件下。

      100ask-valRun.gif

      9.预测图像

      在data目录中新建100ask-images文件夹存放待检测的图像和视频文件。

      修改detect.py函数中,模型的路径与检测图像路径。

      parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'runs/train/exp7/weights/best.pt', help='model path(s)')
      parser.add_argument('--source', type=str, default=ROOT / 'data/100ask-images', help='file/dir/URL/glob, 0 for webcam')
      

      image-20230629103359183.png

      检测效果如下图所示:

      2023-06-28 191541(3).jpg

      10.导出ONNX模型

      修改export.py函数

      parser.add_argument('--data', type=str, default=ROOT / 'data/data.yaml', help='dataset.yaml path')
      parser.add_argument('--weights', type=str, default=ROOT / 'runs/train/exp7/weights/best.pt', help='weights path')
      

      image-20230629103642324.png

      在conda终端输入:

      python export.py --include onnx --dynamic
      

      image-20230629104014942.png

      导出的模型会与输入的模型位于同一路径下,假设我输入的模型位于:runs\train\exp7\weights

      image-20230629104123779.png

      11.简化模型

      简化模型前需要用到onnxruntime依赖包,输入以下命令安装:

      pip install onnxruntime==1.13.1 -i https://pypi.doubanio.com/simple/
      

      简化命令如下:

      python -m onnxsim <输入模型> <输出模型> --input-shape <输入图像尺寸>
      

      例如:

      输入模型路径为runs/train/exp7/weights/best.onnx,输出模型路径为runs/train/exp7/weights/best-sim.onnx

      输入图像尺寸固定为640x640。

      python -m onnxsim runs/train/exp7/weights/best.onnx runs/train/exp7/weights/best-sim.onnx --input-shape 1,3,640,640
      

      image-20230629110454569.png

      13.查看模型

      访问:https://netron.app/ 1

      image-20230629111343751.png

      可以看到输入已经固定为640x640,可看到模型有 4 个输出节点,其中 ouput 节点为后处理解析后的节点;在实际测试的过程中,发现 NPU 量化操作后对后处理的运算非常不友好,输出数据偏差较大,所以我们可以将后处理部分放在 CPU 运行;因此在导入模型时保留 350,498, 646 三个后处理解析前的输出节点即可。

      14.验证模型

      模型需要修改为简化后的模型路径。

      新建文件夹存放固定的输入图像尺寸。假设上述中我设置输入图像尺寸为640x640,那么此时我在data目录下新建100ask-images-640文件夹存放640x640的图像作为待测数据。
      修改detect.py函数

      parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'runs/train/exp7/weights/best-sim.onnx', help='model path(s)')
          parser.add_argument('--source', type=str, default=ROOT / 'data/100ask-images-640', help='file/dir/URL/glob, 0 for webcam')
      

      image-20230629112042899.png

      在conda终端输入:

      python detect.py
      

      image-20230629112859954.png

      通过输出信息可知:检测结果存储在runs\detect\exp6

      检测结果如下:

      test-640.jpg

      15.转换模型

      15.1 创建工作目录
      将简化后的best-sim.onnx模型传入配置到NPU模型转换工具的虚拟机中,创建模型工具目录,包含模型文件,量化文件夹data(存放量化图片),dataset.txt文件(存放量化图片的路径)。

      buntu@ubuntu2004:~/100ask-yolov5-test$ tree
      .
      ├── best-sim.onnx
      ├── data
      │ └── test01.jpg
      └── dataset.txt
      
      1 directory, 5 files
      

      工作目录如下所示:

      100ask-changeModelDir.gif

      15.2 导入模型
      导入模型前需要知道我们要保留的输出节点,由之前查看到我们输出的三个后处理节点为:350,498,646 。

      pegasus import onnx --model best-sim.onnx --output-data best-sim.data --output-model best-sim.json --outputs "350 498 646"
      

      导入生成两个文件,分别是是 yolov5s-sim.data 和 yolov5s-sim.json 文件,两个文件是 YOLO V5 网络对应的芯原内部格式表示文件,data 文件储存权重,cfg 文件储存模型。

      100ask-leadingInmodel.gif

      15.3 生成 YML 文件
      YML 文件对网络的输入和输出的超参数进行描述以及配置,这些参数包括,输入输出 tensor 的形状,归一化系数 (均值,零点),图像格式,tensor 的输出格式,后处理方式等等

      pegasus generate inputmeta --model best-sim.json --input-meta-output best-sim_inputmeta.yml
      

      100ask-generateModelInput.gif

      pegasus generate postprocess-file --model best-sim.json --postprocess-file-output best-sim_postprocess_file.yml
      
      

      100ask-generateModelOutput.gif

      修改 best-sim_inputmeta.yml 文件中的的 scale 参数为 0.0039216(1/255),目的是对输入 tensor 进行归一化,和网络进行训练的时候是对应的。

      修改过程如下图所示:

      100ask-changeInputYaml.gif

      15.4 量化

      生成量化表文件,使用非对称量化,uint8,修改 --batch-size 参数为你的 dataset.txt 里提供的图片数量。如果原始网络使用固定的batch_size,请使用固定的batch_size,如果原始网络使用可变batch_size,请将此参数设置为1。

      pegasus quantize --model best-sim.json --model-data best-sim.data --batch-size 1 --device CPU --with-input-meta best-sim_inputmeta.yml --rebuild --model-quantize best-sim.quantize --quantizer asymmetric_affine --qtype uint8
      

      100ask-quantifyModel.gif

      15.5 预推理
      利用前文的量化表执行预推理,得到推理 tensor

      pegasus inference --model best-sim.json --model-data best-sim.data --batch-size 1 --dtype quantized --model-quantize best-sim.quantize --device CPU --with-input-meta best-sim_inputmeta.yml --postprocess-file best-sim_postprocess_file.yml
      

      100ask-PreInferenceModel.gif

      15.6 导出模板代码与模型

      输出的模型可以在 ovxilb/100ask-best-sim_nbg_unify 文件夹中找到network_binary.nb模型文件。

      pegasus export ovxlib --model best-sim.json --model-data best-sim.data --dtype quantized --model-quantize best-sim.quantize --batch-size 1 --save-fused-graph --target-ide-project 'linux64' --with-input-meta best-sim_inputmeta.yml --output-path ovxilb/100ask-best-sim/100ask-simprj --pack-nbg-unify --postprocess-file best-sim_postprocessmeta.yml --optimize "VIP9000PICO_PID0XEE" --viv-sdk ${VIV_SDK}
      

      可以进入下图所示目录中将network_binary.nb模型文件拷贝出来备用。

      100ask-Export-NBModel.gif

      16.端侧部署
      这里引用上一篇《100ASK-V853-PRO开发板支持yolov5模型部署》我们编写的yolov5端侧部署程序,这里进入端侧部署程序文件夹中拷贝一份新程序进行修改。主要修改vnn_post_process.cpp程序。

      16.1 修改draw_objects函数
      修改draw_objects函数中的类名,这里我训练的模型的类别分别是T113、K510、V853

      image-20230629180241351.png

      类别名称需要yolov5-6.0项目data目录下data.yaml对应

      image-20230629180515157.png

      16.2 修改generate_proposals函数
      修改generate_proposals函数中的类类别数量为您类别数量。假设我训练的类别总共有T113、K510、V853,这3个类别,修改为3即可。

      image-20230629180707567.png

      修改后的文件如下所示:

      100ask-YOLOV5Dir.gif

      16.3 编译

      book@100ask:~/workspaces/tina-v853-open$ source build/envsetup.sh
      ...
      book@100ask:~/workspaces/tina-v853-open$ lunch
      ...1
      ...
      

      进入menuconfig选中yolov5-100ask配置,输入

      make menuconfig
      

      进入如下目录中

      100ask
      NPU
      <*> yolov5-100ask… yolov5-100ask demo
      

      image-20230629185606559.png

      编译并生成镜像

      book@100ask:~/workspaces/tina-v853-open$ make
      ...
      book@100ask:~/workspaces/tina-v853-open$ pack
      

      编译完成后使用全志烧写工具烧录镜像。

      16.4 测试
      主机端:

      传入640*640的图像文件和network_binary.nb模型文件

      book@100ask:~/workspaces/testImg$ adb push test-100ask.jpg /mnt/UDISK
      test-100ask.jpg: 1 file pushed. 0.6 MB/s (51039 bytes in 0.078s)
      book@100ask:~/workspaces/testImg$ adb push network_binary.nb /mnt/UDISK
      network_binary.nb: 1 file pushed. 0.7 MB/s (7409024 bytes in 10.043s)
      

      开发板端:

      进入/mnt/UDISK/目录下

      root@TinaLinux:/# cd /mnt/UDISK/
      root@TinaLinux:/mnt/UDISK# ls
      lost+found network_binary.nb overlay test-100ask.jpg
      

      运行yolov5检测程序

      yolov5-100ask network_binary.nb test-100ask.jpg
      

      image-20230629190424474.png
      执行完成后会在当前目录下生成输出文件yolov5_out.jpg

      root@TinaLinux:/mnt/UDISK# ls
      lost+found overlay yolov5_out.jpg
      network_binary.nb test-100ask.jpg
      主机端:

      拉取开发板端的输出图像yolov5_out.jpg

      book@100ask:~/workspaces/testImg$ adb pull /mnt/UDISK/yolov5_out.jpg ./
      /mnt/UDISK/yolov5_out.jpg: 1 file pulled. 0.8 MB/s (98685 bytes in 0.116s)
      

      17.检测效果图

      image-20230629190722233.png image-20230629191417157.png image-20230629191450619.png

      发布在 V Series
      q1215200171
      budbool
    • 【FAQ】全志R329Tina网络adb的使用

      问题背景

      硬件:R328+ Wi-Fi模组(RTL8723ds)
      软件:Tina3.0及以上
      说明:该FAQ旨在记录网络adb的使用

      问题简述

      客户整机已经封板,没法使用usb的adb和串口,客户提出是否有其他方式可以和板子交互。

      问题分析

      usb的adb和串口都没法使用,即有线方式无法使用了,那就只能是无线方式了,所以就想到了网络adb。

      使用网络adb还有一个好处就是多台设备压测时,省去了布线的操作。

      解决方法

      1.系统配置adb。

      46bc94b70413405d975d632d1cef157b.jfif

      2.将如下命令添加到自启动脚本中,一般选择/etc/init.d/local
      临时使用也可以直接在板卡执行。(一般串口只有一个时又要测试多台可以这样操作)

      killall adbd    //杀死adbd进程。
      export ADB_TRANSPORT_PORT=5555   //重新设置adbd的端口
      ./bin/adbd -D > /dev/null &   //重启adbd进程
      

      3.系统起来后联网并产看ip地址。

      4.pc执行:

      1.adb disconnect //断开所有连接
      2.adb connect ip  //和板子建立连接,ip为板子联网的之后获取的ip地址
      3.adb shell  //进入板子shell
      

      此时进入的shell就跟usb使用的adb shell一样。

      下面是我整理的一个常用网络adb做测试的简单脚本,也供大家参考

      for %%i in (110,111,112,113,167,168)   //使用自己测试板卡的ip地址
      do
          adb disconncect
          adb connect 192.168.1.%%i
          adb shell dmesg
          adb shell ...  //添加任何自己想做的操作
      done
      
      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【FAQ】全志R128芯片 如何解决打包时出现的ERROR: update_mbr failed?

      打包出现:ERROR: update_mbr failed

      image-20230914164512338 (1).png

      24993+0 records in
      24993+0 records out
      6398208 bytes (6.4 MB) copied, 0.0271082 s, 236 MB/s
      ERROR: dl file rtos_riscv.fex size too large
      ERROR: filename = rtos_riscv.fex
      ERROR: dl_file_size = 1579 sector
      ERROR: part_size = 1000 sector
      ERROR: update mbr file fail
      ERROR: update_mbr failed
      

      这是因为 rtos_riscv.fex 太大了,分区容量设置过小。

      解决方法

      • 确定打包使用的分区表

      运行打包命令,找到打包使用发分区表。例如这里使用的是 sys_partition_xip.fex

      image-20230914165018480 (1).png

      • 编辑分区表

      使用 cconfigs 命令进入目录,找到打包使用的分区表,编辑修改

      image-20230914165124547 (1).png

      • 找到上面报错的行,修改 size 选项,单位是扇区。对于 NOR 方案请对齐。这里我们修改到 7000

      image-20230914165241136 (1).png

      • 重新打包,正常通过

      image-20230914165351746 (1).png

      发布在 A Series
      q1215200171
      budbool
    • 【FAQ】全志V85x芯片 如何使用tiger lcd时lti锐化功能时程序abort?

      1.主题

      使用tiger lcd时lti锐化功能时程序abort

      2.问题背景

      产品:T113
      软件:tina5.0
      其他:使用tiger lcd调试lti参数

      3.问题描述

      3.1复现步骤

      1. m kerne_menuconfig选中按照如下方式选中pq驱动
      Device Drivers  --->
          Graphics support  --->
              Frame buffer Devices  --->
                  Video support for sunxi  --->
                      [*]   Support PQ driver
      
      1. m menuconfig按照如下方式勾选下位机软件
      Allwinner  --->
              Display  --->
                  <*> pqd.................................................................. pqd
      
      1. 编译烧录后进入控制台,输入usbdevice命令打开切换usb role后,再输入pqd运行上位机软件。
      2. 电脑端打开tiger lcd,点击open后切换到lti调试界面,调节参数后点write写入
        e20cf15b5e8b46ab8004addabb73d8ac.jfif

      3.2具体表现
      下位机程序abort退出,结果如图所示。
      3e7ad95f27f441ffbb9a2dc1126fec5f.jfif

      4.问题分析

      1. unsorted double linked list corrupted表明malloc时链表的被破坏,找不到下一个节点,该问题可能是越界写内存导致。
      2. 可以选择使用libasan进行调试,需要在Makefile中加入如下选项,
        594c1e6aa9634f5fa0889f6bf1e909cc.jfif
        并且在menuconfig按照如下方式配置
      Base system  ---> 
          [*]   Use external toolchain  ---> 
              -*- libc........................................................... C library
                  Configuration  --->
                      (./lib/ld{-*.so,-linux*.so.*} ./lib/lib{anl,c,gomp,cidn,crypt,dl,m,nsl,nss_dns,nss_files,resolv,util,ssp,asan}{-*.so,.so.*}) libc shared library files (use wildcards)
      
      1. 重新编译并将未strip过的可执行文件用adb推至/usr/bin下,重新复现问题,得到如下信息。
        22fee4598ca0491394d4a60b4babca17.jfif

      2. 可以看出问题在platform/allwinner/display/pqd/hardwares/de20x/de20x.c文件中的de20x_set_lti里。实际上这里malloc的数组是用来存储lti 11个寄存器的值
        b6d158e74f9347afb8ad71ef9726b4be.jfif 3fde3fa4f1e0476cb518530dda35f7b7.jfif

      再通过ioctl写入物理寄存器,但是malloc的长度PEAK_REG_NUM只有6,因此这里会发生写越界。同时如下代码处也要改过来
      08b4c7dc8693483a974d208bc965baf9.jfif

      5.根本原因

      寄存器数量配置错误,导致写内存越界,破坏了链表结构LTI_REG_NUM

      6.解决办法

      修改platform/allwinner/display/pqd/hardwares/de20x/de20x.c中de20x_set_lti和de20x_get_lti函数malloc的大小为LTI_REG_NUM,具体方式可参考如下补丁。

      diff --git a/hardwares/de20x/de20x.c b/hardwares/de20x/de20x.c
      index c8a1084..7aa66be 100644
      --- a/hardwares/de20x/de20x.c
      +++ b/hardwares/de20x/de20x.c
      @@ -328,7 +328,7 @@ int de20x_set_lti(const char* data, int size)
           int ret;
           UNUSED(size);
           struct lti_sharp *lti = (struct lti_sharp *)data;
      -    struct register_data* rdata = malloc(sizeof(struct register_data) * PEAK_REG_NUM);
      +    struct register_data* rdata = malloc(sizeof(struct register_data) * LTI_REG_NUM);
           get_lti_register_offset(rdata);
           ret = de20x_get_registers(rdata, LTI_REG_NUM);
           if (ret) {
      @@ -371,7 +371,7 @@ int de20x_get_lti(char* data, int size)
           int ret;
           UNUSED(size);
           struct lti_sharp *lti = (struct lti_sharp *)data;
      -    struct register_data* rdata = malloc(sizeof(struct register_data) * PEAK_REG_NUM);
      +    struct register_data* rdata = malloc(sizeof(struct register_data) * LTI_REG_NUM);
           get_lti_register_offset(rdata);
           ret = de20x_get_registers(rdata, LTI_REG_NUM);
           if (ret) {
      
      发布在 V Series
      q1215200171
      budbool
    • 【FAQ】全志V系列芯片 如何生成拍照缩略图和视频缩略图?

      适用范围

      只适用于V系列,并使用MPP多媒体框架。

      拍照缩略图的处理

      设置JPEG编码生成缩略图
      在创建一个JPEG编码的通路时,想要同时生成缩略图,其实很简单,只需要在调用AW_MPI_VENC_SendFrame之前调用AW_MPI_VENC_SetJpegExifInfo设置缩略图属性即可。

      VENC_EXIFINFO_S stExifInfo;
      memset(&stExifInfo, 0, sizeof(VENC_EXIFINFO_S));
      stExifInfo.ThumbWidth = thumbnailWidth;
      stExifInfo.ThumbHeight = thumbnailHeight;
      stExifInfo.thumb_quality = thumbnailQuality;
      stExifInfo.Orientation = mJpegRotate;
      AW_MPI_VENC_SetJpegExifInfo(vechn, &stExifInfo);
      AW_MPI_VENC_SendFrame(vechn, &frmInfo);
      

      获取缩略图

      通过调用接口AW_MPI_VENC_GetJpegThumbBuffer,我们可以得到缩略图buffer的起始指针,和其大小。需要注意的是,缩略图并不是单独的buffer,而是保存在整个JPEG图像数据中的。

      我们可以通过比较缩略的起始地址指针和JPEG图像数据的起始指针,得到其在JEPG文件中的偏移位置。同时由于JPEG文件的格式,我们可以在保存JPEG文件时,将得出的缩略图偏移量和大小写入到文件尾部,当需要缩略图去显示的时候,能更方便的获取到缩略图数据。

      int getThumbOffset(VENC_STREAM_S *pVencStream, VENC_JPEG_THUMB_BUFFER_S *pThumbBuf, off_t *pThumbOffset)
      {
          if (NULL == pVencStream || NULL == pThumbBuf)
          {
              aloge("fatal error! why parameter is null!");
              return -1;
          }
      
          if (pThumbBuf->ThumbAddrVir >= pVencStream->mpPack[0].mpAddr0 && \
              pThumbBuf->ThumbAddrVir < pVencStream->mpPack[0].mpAddr0+pVencStream->mpPack[0].mLen0)
          {
              *pThumbOffset = pThumbBuf->ThumbAddrVir - pVencStream->mpPack[0].mpAddr0;
          }
          else if (pThumbBuf->ThumbAddrVir >= pVencStream->mpPack[0].mpAddr1 && \
              pThumbBuf->ThumbAddrVir < pVencStream->mpPack[0].mpAddr1+pVencStream->mpPack[0].mLen1)
          {
              *pThumbOffset = pThumbBuf->ThumbAddrVir - pVencStream->mpPack[0].mpAddr1;
          }
      
          alogd("get thumb offet[%lld]", *pThumbOffset);
      
          return 0;
      }
      

      视频生成缩略图

      视频生成缩略图的方法是通过demux组件解析一帧图像,送入解码器,将其解码为YUV图像,再将其送入编码器缩放编码为较小的图像作为视频的缩略图。

      demux -> vdec -> venc -> jpeg
      

      详细的实现流程可以参考 softwinner/eyesee-mpp/framework/v316/demo/sample_ThumbRetriever下的sample_ThumbRetriever和eyesee-mpp/framework/v316/media/thumbretriever路径下的EyeseeThumbRetriever类的实现流程。

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【XR806开发板试用】系列之二 - I2C外设使用及控制OLED屏显示

      前言
      XR806硬件上支持SPI,I2C等其他外设接口,且DDR和FLASH,满足常见应用场景的开发,适合开发者进行方案评估、DIY或小规模产品研发使用。本篇文章,将使用到I2C接口,去控制OLED屏幕的显示。

      OLED屏幕规格: 0.96英寸 主控SSD1306 I2C接口 地址 0x3C
      XR806外设:I2C1
      

      创建工程
      参考device/xradio/xr806/ohosdemo目录下的wlan_demo,

      拷贝wlan_demo为xr806_oled,并同步修改ohosdemo和xr806_oled目录下的BUILD.gn。

      主要修改如下:

      1、device/xradio/xr806/ohosdemo/BUILD.gn

      group("ohosdemo") {
       deps = [
           #"hello_demo:app_hello",
           #"iot_peripheral:app_peripheral",
           #"wlan_demo:app_WlanTest",
           "xr806_oled:app_oled", #增加app_oled目标编译
       ]
      }
      

      2、device/xradio/xr806/ohosdemo/xr806_oled/BUILD.gn

      static_library("app_oled") {
         configs = []
      
         sources = [
        "main.c",
         ]
      
         cflags = board_cflags
      
         include_dirs = board_include_dirs
         include_dirs += [
          ".",
          "thirdparty/ssd1306/ssd1306",
          "//utils/native/lite/include",
          "//foundation/communication/wifi_lite/interfaces/wifiservice",
         ]
      
         deps = [
          "thirdparty/ssd1306/ssd1306:oled_ssd1306",
         ]
      }
      

      注意:

      • static_library代表生成静态库(.a)文件,其中包含main.c的静态库必须是app_打头,如app_hello,否则虽然可以编译成功,但无法生效;
      • ~~xr806_oled/BUILD.gn中静态库app_oled的命名,需要和ohosdemo/BUILD.gn中的一致;
      • thirdparty/ssd1306/ssd1306:oled_ssd1306 为依赖的开源库

      工程编译
      创建工程后,如果非首次编译,执行以下命令便可以编译:

      hb build
      

      编译如果遇到以下错误:

      [OHOS ERROR] /*
      [OHOS ERROR]  *
      [OHOS ERROR]  * Automatically generated file; DO NOT EDIT.
      [OHOS ERROR]  * XR806 SDK Configuration
      [OHOS ERROR]  *
      [OHOS ERROR]  */
      [OHOS ERROR] /*
      [OHOS ERROR]  *
      [OHOS ERROR]  * Automatically generated file; DO NOT EDIT.
      [OHOS ERROR]  * XR806 SDK Configuration
      [OHOS ERROR]  *
      [OHOS ERROR]  */
      [OHOS ERROR] {
      [OHOS ERROR]     "magic" : "AWIH",
      [OHOS ERROR]     "version" : "0.5",
      [OHOS ERROR]     "image" : {"max_size": "1532K"},
      [OHOS ERROR]     "section" :[
      [OHOS ERROR]   {"id": "0xa5ff5a00", "bin" :"boot_40M.bin", "cert": "null", "flash_offs": "0K", "sram_offs": "0x00230000", "ep": "0x00230101", "attr":"0x1"},
      [OHOS ERROR]   {"id": "0xa5fe5a01", "bin" :"app.bin", "cert": "null", "flash_offs": "32K", "sram_offs": "0x00201000", "ep": "0x00201101", "attr":"0x1"},
      [OHOS ERROR]   {"id": "0xa5fd5a02", "bin" :"app_xip.bin", "cert": "null", "flash_offs": "99K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x2"},
      [OHOS ERROR]   {"id": "0xa5fa5a05", "bin" :"wlan_bl.bin", "cert": "null", "flash_offs": "1170K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x1"},
      [OHOS ERROR]   {"id": "0xa5f95a06", "bin" :"wlan_fw.bin", "cert": "null", "flash_offs": "1173K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x1"},
      [OHOS ERROR]   {"id": "0xa5f85a07", "bin" :"sys_sdd_40M.bin", "cert": "null", "flash_offs": "1198K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x1"},
      [OHOS ERROR]   {}
      [OHOS ERROR]  ]
      [OHOS ERROR] }
      [OHOS ERROR] 
      [OHOS ERROR] make[2]: *** [../../../../project/project.mk:520:image] 错误 255
      [OHOS ERROR] make[2]: 离开目录“/home/algo/openharmony/xr806/device/xradio/xr806/xr_skylark/project/demo/audio_demo/gcc”
      [OHOS ERROR] make[1]: *** [../../../../project/project.mk:493:__build] 错误 2
      [OHOS ERROR] make[1]: 离开目录“/home/algo/openharmony/xr806/device/xradio/xr806/xr_skylark/project/demo/audio_demo/gcc”
      [OHOS ERROR] make: *** [Makefile:164:build] 错误 2
      [OHOS ERROR] you can check build log in /home/algo/openharmony/xr806/out/xr806/wifi_skylark/build.log
      [OHOS ERROR] /home/algo/.local/bin/ninja -w dupbuild=warn -C /home/algo/openharmony/xr806/out/xr806/wifi_skylark failed, return code is 1
      

      执行以下命令后,再次编译即可:

      cp  device/xradio/xr806/xr_skylark/project/demo/audio_demo/image/xr806/image_auto_cal.cfg  device/xradio/xr806/xr_skylark/project/demo/audio_demo/image/xr806/image.cfg
      

      编译后生成的镜像,便可以烧录验证。

      注:以上基础工程是基于wlan_demo,oled屏幕显示需要使用I2C外设和移植oled库

      库移植
      其实XR806本身自带了OLED主控为SSD1306的驱动(采用的是SPI接口方式),移植基于I2C接口的库也相对简单,可以参考开源库harmonyos-ssd1306,将其中的I2C相关头文件和API替换为XR806 OpenHarmony中的相关头文件和API,编译通过即可。

      其中涉及到BUID.gn的修改如下:

      static_library("oled_ssd1306") {
          sources = [
              "ssd1306.c",
              "ssd1306_fonts.c",
          ]
      
          include_dirs = [
              ".",
              "//kernel/liteos_m/kernel/arch/include",
              "//utils/native/lite/include",
              "//base/iot_hardware/peripheral/interfaces/kits",
          ]
      }
      

      开源库主要修改如下:

      #include "iot_i2c.h"
      #include "iot_errno.h"
      
      /**
       * @brief Defines I2C data transmission attributes.
       */
      typedef struct {
          /** Pointer to the buffer storing data to send */
          unsigned char *sendBuf;
          /** Length of data to send */
          unsigned int  sendLen;
          /** Pointer to the buffer for storing data to receive */
          unsigned char *receiveBuf;
          /** Length of data received */
          unsigned int  receiveLen;
      } IotI2cData;  
      
      
      static uint32_t ssd1306_SendData(uint8_t* data, size_t size)
      {
          uint32_t id = SSD1306_I2C_IDX;
          IotI2cData i2cData = {0};
          i2cData.sendBuf = data;
          i2cData.sendLen = size;
      
          return IoTI2cWrite(id, SSD1306_I2C_ADDR, i2cData.sendBuf, i2cData.sendLen);
      }
      

      ssd1306.h头文件定义SSD1306_I2C_IDX为1

      显示程序
      程序部分参考了上面提到的OLED库,完整的测试程序,可以参考harmonyos-ssd1306里的example.

      /*
       * Copyright (c) 2021-2031, AlgoIdeas
       *
       * SPDX-License-Identifier: Apache-2.0
       *
       * Change Logs:
       * Date           Author       Notes
       * 2020-12-13     AlgoIdeas    the first version
       */
      
      #include <stdio.h>
      #include "ohos_init.h"
      #include "kernel/os/os.h"
      #include "ssd1306.h"
      
      #define OLED_I2C_BAUDRATE       100000
      
      static OS_Thread_t g_main_thread;
      
      
      static void DrawChinese(void)
      {
          const uint32_t W = 12, H = 12, S = 16;
          uint8_t fonts[][24] = {
              {
                  /*-- ID:0,字符:"您",ASCII编码:C4FA,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
                  0x14,0x00,0x24,0x00,0x2F,0xF0,0x71,0x20,0xA5,0x40,0x29,0x20,0x33,0x10,0x20,0x00,
                  0x54,0x40,0x52,0xA0,0x90,0x90,0x0F,0x80,
              },{
                  /*-- ID:1,字符:"好",ASCII编码:BAC3,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
                  0x20,0x00,0x27,0xE0,0x20,0x40,0xF8,0x80,0x48,0x80,0x48,0xA0,0x57,0xF0,0x50,0x80,
                  0x30,0x80,0x28,0x80,0x4A,0x80,0x81,0x00,
              },{
                  /*-- ID:2,字符:"鸿",ASCII编码:BAE8,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
                  0x00,0x40,0x80,0x80,0x5D,0xE0,0x09,0x20,0xC9,0xA0,0x09,0x60,0x29,0x00,0xCD,0xF0,
                  0x58,0x10,0x43,0xD0,0x40,0x10,0x40,0x60,
              },{
                  /*-- ID:3,字符:"蒙",ASCII编码:C3C9,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/
                  0x09,0x00,0x7F,0xE0,0x09,0x00,0x7F,0xF0,0x80,0x10,0x7F,0xE0,0x0C,0x40,0x32,0x80,
                  0xC7,0x00,0x0A,0x80,0x32,0x70,0xC6,0x20
              }
          };
      
          ssd1306_Fill(Black);
          for (size_t i = 0; i < sizeof(fonts)/sizeof(fonts[0]); i++) {
              ssd1306_DrawRegion(i * H + 32, 26, W, H, fonts[i], sizeof(fonts[0]), S);
          }
          ssd1306_UpdateScreen();
          sleep(1);
      }
      
      static void MainThread(void *arg)
      {
          IoTI2cInit(SSD1306_I2C_IDX, OLED_I2C_BAUDRATE);
      
          usleep(20*1000);
      
          printf("ssd1306_Init.\n");
          ssd1306_Init();
          ssd1306_Fill(Black);
          ssd1306_SetCursor(22, 27);
          ssd1306_DrawString("Hello XR806!", Font_7x10, White);
      
          uint32_t start = HAL_GetTick();
          ssd1306_UpdateScreen();
          uint32_t end = HAL_GetTick();
          printf("ssd1306_UpdateScreen, time cost: %d ms.\n", end - start);
      
          usleep(2000*1000);
      
          while (1) {
              DrawChinese();
          }
      }
      
      void OledMain(void)
      {
           if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL,
                      OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {
               printf("[ERR] Create MainThread Failed\n");
           }
      }
      
      SYS_RUN(OledMain);
      

      运行效果
      最终OLED显示:您好鸿蒙
      1003546875-61b74f422e829.jfif

      参考资料
      【XR806开发板试用】系列之一 - Linux环境下Ubuntu完全开发流程
      https://xr806.docs.aw-ol.com/
      https://aijishu.com/a/1060000000256653

      本贴转自极术社区:https://aijishu.com/a/1060000000284333
      作者:H2O2_H2O2

      发布在 Wireless & Analog Series
      q1215200171
      budbool
    • 请叫我电源管理大师!3块钱就能做一个AXP202电源管理模块

      微信图片_20230725171210.png

      项目作者:mondraker

      2022年度立创开源达人,也是一名刚刚本科毕业的自动化专业的大学生,在立创开源了“电源模块”和“雪花的专栏”两个工程专辑,愿望是持续给大家带来实用,好用和酷炫的开源作品。

      SMMdKNWd08V15bfMRKzG1ZhsrKQnsLqi27Mgt0ra.jpeg

      本项目是来自立创开源平台的开源作品《AXP202【DIY设备电源管理迈入新时代】》,该开发板基于AXP173电源管理模块的升级版——AXP202芯片进行开发,方便开发者彻底摆脱苦苦寻找定制芯片的烦恼。该模块资料齐全,并且通过全功能验证,更重要的是具有超凡性价比,货源充足。

      项目简介

      ffs1rgARrk4CGtXn6rGWq2N8uoxCKglhOAL40ilj.jpeg

      该项目已经过长期验证,提供封装,3D文件等等,资料充足(包含IDF例程以及Arduino例程,中英文手册),并且这个邮票孔模组还可以在嘉立创免费下单打样,在打板的时候不选半孔工艺,收到板子后再手磨一下就可以使用了。

      由于芯片功能繁多,本文将分为功能、硬件、软件以及相关资源链接四大部分进行开发板设计原理到使用场景的全方位介绍。

      功能设计

      在硬件设计时,电源部分一直是万事开头、重中之重。我发现在大家平时的制作里经常讨论的核心问题就是:

      • 电源怎么设计
      • 求一个体积小的LDO
      • 求一个效率高的DCDC
      • 求一个电池充电芯片
      • 哪里有便宜的电源芯片

      还有很多开发者经常遇到的问题:

      • 外部输入电源和电池怎么实现高效可靠的电源通路管理
      • 怎么实现长按开关机
      • 怎么精确的检测电池电量
      • 怎么获取电源实时状态
      • 低功耗怎么办

      有一个芯片——AXP202,他可以实现上述的所有功能,并且体积小、效率高、功耗低、价格香!

      SMMdKNWd08V15bfMRKzG1ZhsrKQnsLqi27Mgt0ra.jpeg

      7w72JYYedE5s0W1BAYEc86i5ZDeMrI5z0zby43St.png

      如果你还需要5V输出,那么使用模块IPSOUT脚+DCDC5V的buck电路即可轻松实现,输出能力取决于外部供电的输入能力,且芯片专门有一个EXTEN脚控制外部DCDC芯片的EN脚,节省NCU的功能引脚,太香了。

      i5WTlJJDraZPyycNXcWMh9lPiVbAHHEAOXJBBj6d.png

      硬件设计

      AXP202模组做成邮票孔模块类型可以方便大家直接使用,因为这种芯片外围的阻容设计都有一些故事。

      为方便PCB电路板的设计与焊接,增加成功率,本设计采用模块化思想,将AXP202外围电路封装为一个邮票孔模块焊接在主板上,将可用户自定义的管脚全部引出,这样就可以方便的在主板上使用相应阻值的电阻来配置这些引脚。

      YG8DJv3uosd4ePHwaZi5ePjpApeGVVDAMkGgtFpI.png

      微信图片_20230724150316.png

      q5st1CM3Uui1NpJAk5E47gbGW4pumzQHJbYmYjG8.jpeg

      为统一封装,本次设计使用了标准2.54mm间距LCC邮票孔,便于焊接,使用了4层PCB设计用以缩小封装体积,引出全部必要的功能。

      HEQwvxnE6qjbVrJj8zVFqoB5K8cEPffItrp0ZkWl.png

      开发板引出了所有的功能,芯片外部可设置的一些引脚可以使用跳帽设置,并且加入了一个5V的DCDC升压,用以基本测试,地线引出较少,可以自己酌情添加,或者根据要使用的主控芯片自己绘制一个测试板。

      VszxQchkluWsXu4dG2SMuFcAxNRDk1XwAHZYWBdA.png

      相较于普通的I2C模块,电源管理模块还要给主控芯片提供电源,除此之外,AXP202必须在开机状态下,一定要共地,否则两者之间是无法正常通信的。

      nLxiASZE4IW4GAFWith4E4AoF3nTgg6F819VBKs1.png

      本模块P2P兼容AXP209电源管理芯片,程序也兼容,只是AXP209比AXP202多了一个OTP解码器,代码中操作寄存器即可。

      打板说明

      下单打1mm(下面图是1.6mm的非常厚,仅用以演示),选择四层板,不需要半孔工艺,打板寄回来之后是卷边的,需要先用镊子把半孔里多余的铜抠出来,然后用800目左右砂纸磨掉就可以正常使用了。

      SMMdKNWd08V15bfMRKzG1ZhsrKQnsLqi27Mgt0ra.jpeg

      BOd3kRjWBB3XF0VdpwqmbQaYnDy1I1ulPjdFDVEL.png

      软件部分

      AXP20x库以及Arduino相关例程,均来自于Lewis He大佬,感谢大佬的开源(开源协议:MIT)

      后续自己的例程都将围绕该库编写,自己添加了其它一些常用的寄存器与功能,比如LED指示灯的充电控制等等,以后的修改将同步更新至GitHub/Gitee。

      • 该库同时兼容AXP173/192/202等
      • 基本实现了芯片所有的功能
      • 代码中有相关功能注释,可以配合官方寄存器文档进行学习与编写
      • 代码中使用独立的I2C接口进行编写,移植至其他平台只需要写一个接口库即可,非常方便

      本项目所有资料均已开源,想获取资料自己DIY学习的伙伴,https://oshwhub.com/mondraker/axp202-zeng-ge-yan-zheng

      发布在 灌水区
      q1215200171
      budbool
    • 回复: 新 SDK 平台下载 V853 SDK

      @lw409309740 可以,要稍微修改一下,参考这里 https://bbs.aw-ol.com/topic/2513/

      发布在 V Series
      q1215200171
      budbool
    • 【FAQ】全志V系列芯片 Camera-WDR模式配置指南

      本文档提供V系列(V53x、V83x、V85x)SDK Camera-WDR模式的配置方法,其中主要内容包括:
      (1)Camera硬件条件支持
      (2)内核配置
      (3)WDR效果文件配置
      (4)MPP VI组件WDR模式配置
      (5)通路模式检查方法

      V系列Camera-WDR模式配置指南.pdf

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 回复: sdk 链接失效了吗?

      @quincy

      1. 执行命令设置全局保存密码
      git config --global credential.helper store
      
      1. 执行命令输入密码
      git clone https://sdk.aw-ol.com/git_repo/V853Tina_Open/manifest.git
      
      1. 使用repo拉取sdk
      repo init -u https://sdk.aw-ol.com/git_repo/V853Tina_Open/manifest.git -b master -m tina-v853-open.xml
      

      由于repo更新,目前不支持通过repo输入密码,请先使用git命令输入保存密码

      发布在 Wireless & Analog Series
      q1215200171
      budbool
    • 基于全志D1-H芯片的首台64位RISC-V便携式计算机上市

      近日,基于D1-H生态开发板的第一款RISC-V便携式计算机也已经宣布上市。

      技术开放社区Clockwork公司于近日宣布要推出一个由 RISC-V CPU驱动的DevTerm。这款设备被命名为 DevTerm R-01,售价为 239 美元,其配置主要如下:

      微信图片_20220328101620.png

      • ClockworkPi v3.14 主板
      • R-01 核心模块 ,RISC-V 64位单核 RV64IMAFDCVU @ 1.0GHz,1GB DDR3
      • Ext.模块
      • 6.86英寸 IPS 显示屏
      • Clockwork 65%比例的键盘
      • 电池模块
      • 双扬声器
      • 58毫米200dpi 热敏打印机组件
      • shell 和 bracket 系统
      • 带有 clockworkOS 的32GB 高速 TF 存储卡

      这款RISC-V便携式计算机一经推出便受到了RISC-V International CEO Calista Redmond 女士的青睐,“RISC-V生态快速发展,并可为开发者提供低成本且便捷易用的64 bit的RV终端。”

      ​微信图片_20220328101647.jpg

      RISC-V作为免费且灵活的开放指令集架构,在单片机和FPGA方面,已经取得了良好的开端。在商业落地方面,也开始应用在物联网安全、工业控制等领域。

      2021年4月,全志推出D1-H芯片,其是全球首颗量产的搭载平头哥玄铁906 RISC-V的应用处理器,为万物互联AIoT时代提供了新的智能关键芯片。

      D1-H搭载了阿里平头哥64位C906核心,支持RVV,1GHz+主频,可支持Linux、RTOS等系统。同时支持最高4K的H.265/H.264解码,内置一颗HiFi4 DSP,最高可外接2GB DDR3,可以应用于智慧城市、智能汽车、智能商显、智能家电、智能办公和科研教育等多个领域。

      全球首颗.png
      【国产芯片之光!】全志科技发布首颗RISC-V应用处理器

      2021年5月,全志携手平头哥发布基于玄铁C906处理器的全球首款支持64bit RISC-V指令集的D1-H哪吒开发板,为推动RISC-V生态在国内的发展贡献了厚重的力量。

      D1H哪吒.png

      微信公众号推文:基于全志D1-H芯片的首台64位RISC-V便携式计算机上市

      发布在 MR Series
      q1215200171
      budbool
    • AI赋能无惧黑光,全志V85X智影AI ISP全新升级

      当下,视频产品飞速迭代发展,从最早的VGA到720P、1080P,再到2K、4K,每一次技术升级,都大大提升了视觉产品的用户体验。其中,除了分辨率的持续升级,人们对夜视效果视觉体验的追求也从未停歇。夜幕降临光线不足时,当前主流视觉产品常常只能依靠红外、白光等外部补光方式实现黑白图像或彩色画面,颜色丢失/光线污染严重影响客户体验;而随着视觉Soc和AI NPU的深度结合,“黑光全彩技术”全新面世,它提高了产品感光极限,优化了产品在暗光环境下的彩色成像水平,给用户提供了优于人眼视觉的体验。

      全志针对这一技术升级与市场需求,在「V85X系列」芯片上推出了自研的新一代AI ISP 智慧图像处理引擎——「全志智影」。「全志智影」通过海量数据训练以及结合SOC平台的模型深度优化,它不仅可以在各类复杂低照场景下提升成像效果,实现黑光全彩,还可以为低照下AI检测处理(如人形、人脸等)提供更优质量的输入来提升检测识别率,在降低误触发等痛点功能上起到关键作用。

      「全志智影AI ISP」对比自身及业界传统ISP,可以在同等Sensor/镜头下提升2~4倍的感光度,优化低照度亮度/颜色/拖影表现。如下效果对比图,搭配背照式1/2.7 Sensor+F1.0光圈黑光全彩;此外,基于该技术搭配传统Sensor+普通镜头,在低照效果下同样有明显提升,该技术可广泛应用于安防、车载、泛视觉等各类场景,为这些场景下的用户体验提供升级优化的解决方案。

      6fb2f933-ac12-4031-bfa9-eb0bfe1e13aa-image.png

      与此同时,「全志智影AI ISP」针对终端产品在落地开发及量产过程中遇到的典型需求问题进行了深度优化,具备如下三大技术特点:

      (1)系统低消耗,多目易拓展

      可在最低128MB 16bit DDR3下实现1080P~1440P的处理及搭配客户应用量产,「全志智影AI ISP」搭配的降噪模型仅有百KB级别大小,无需更换Flash类型便可支持。同时引擎架构可支持双摄,以及未来三摄,便于未来多摄产品升级迭代。

      (2)系统低功耗

      相比于原有消费类安防产品红外黑白画面需要外挂红外灯板的成本和功耗(1W~2W),「全志智影AI ISP」在同等规格图像处理上只增加了200~400mW(取决于产品分辨率及帧率),在实现全彩画面的同时,节省红外补光的成本和功耗,还可进一步延长例如低功耗电池摄像机/可视门铃等至少0.5倍到1倍工作录像时长(具体倍数取决于夜晚红外触发次数),大幅度提升用户对整机体验。

      (3)毫秒级冷启动

      冷启动「全志智影AI ISP」出图到内存中,时间在500ms内;快启智影2.0即将在Q3发布,在原来基础上进一步提升出图速度,同时搭配新一代图像传感器组成AOV(AlwaysOnVideo)及预录(Pre-roll )方案,实现低功耗产品全天候亮如白昼、持久续航。

      18048a95-800d-4589-8c1a-b5dc253c5d97-image.png

      目前,V85X平台SDK已搭配全志最新「全志智影AI ISP」发布,同时提供稳定、易用的SDK软件开发包,以支撑视觉产品的快速升级及量产。

      「全志智影AI ISP」技术的全新发布,不仅是一次技术的突破,也是对传统成像技术的一次体验升级,更是全志AI技术在端侧落地的出色产品体现,它将让我们在黑暗光线条件下能看得更远、更清晰。未来,全志将基于「全志智影AI ISP」技术持续优化迭代,进一步提升AI ISP在低照度降噪效果,探索拓宽AI ISP在图像效果增强的更多可能性,并在后续不断推出更优秀的视觉芯片方案,为千行百业的智慧视觉带来无限可能。

      发布在 V Series
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 如何解决开启启动时amixer控件的自动配置问题?

      问题

      客户tina-v853-perf1板开机后,使用aplay, arecord等工具播放或采集音频失败。或者app直接调用snd_pcm_open()打开pcm设备,

      原因分析

      没有配置amixer控件建立通路,比较关键的控件是“MIC1 Switch”,必须配置为1,以打开通路。

      解决办法

      在开机启动时自动配置好amixer控件,避免用户自己手动配置amixer控件。有几种方式可选。

      • 在开机启动的脚本rc.final中,配置amixer控件。
      amixer cset name='MIC1 Switch' 1
      

      但是如果在编译固件时没有编译alsa-utils,那么固件中没有amixer,就不能使用这种方式了。

      • 在alsa配置文件asound.conf中使用hooks插件。
        tina-v853的perf1工程,asound.conf的路径是:target/allwinner/v853-perf1/busybox-init-base-files/etc/asound.conf。
      pcm.CaptureMic {
          type hooks
          slave.pcm "hw:0,0"
          hooks.0 {
              type ctl_elems
              hook_args [
                  {
                      name "MIC1 Switch"
                      preserve true
                      optional true
                      value 1
                  }
              ]
      
          }
      }
      

      如上代码,如果app打开的节点是pcm.CaptureMic,那么在asound.conf中定义它为hooks类型,然后把需要配置的amixer控件作为参数写进结构体中。这样在这个node被打开时,就调用一些hook函数,配置hooks里面指定的amixer控件。

      关于hooks类型的插件的说明,可以参考 https://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html 的"Plugin: hooks"。

      • 在代码中打开amixer控件并配置。
        tina-v853-perf1使用的是这种方式,所以需初始化mpp平台后,amixer控件才被配置好。
      for (elem = snd_mixer_first_elem(mixer->handle); elem; elem = snd_mixer_elem_next(elem)) 
      {
          snd_mixer_selem_get_id(elem, sid);
          //snd_mixer_selem_set_playback_volume_range(elem, AUDIO_VOLUME_MIN, AUDIO_VOLUME_MAX);
          //snd_mixer_selem_set_capture_volume_range(elem, AUDIO_VOLUME_MIN, AUDIO_VOLUME_MAX);
          // open lineout and mic switch
          const char *elem_name = snd_mixer_selem_get_name(elem);
         alogv("alsa_elem:%s",elem_name);
      
          if ( !strcmp(elem_name, AUDIO_ADC_MIC1_SWITCH) ) 
          {
              snd_mixer_selem_set_playback_switch(elem, 0, 1);
          } 
          else if ( !strcmp(elem_name, AUDIO_ADC_MIC2_SWITCH) )
          {
              snd_mixer_selem_set_playback_switch(elem, 0, 0);// disable mic2 by default
          }
          else if(!strcmp(elem_name, AUDIO_LINEIN_SWITCH))
          {
              snd_mixer_selem_set_playback_switch(elem, 0, 0);
          }
          else if (!strcmp(elem_name, AUDIO_LINEOUT_VOL)) 
          {
              // lineout volume. 0x1f~0x02 : 0dB~-43.5dB, 1.5dB/step. 27 : -6dB.
              // user had better not change this ctrls, nor will cause wave distort!
              long vol_val = 27;
              snd_mixer_selem_set_playback_volume(elem, 0, vol_val);
              alogd("set playback vol_val to value: %ld", vol_val);
              aoVolume = 100*vol_val/AUDIO_VOLUME_MAX;
              if (aiDevEnable) {
                  aioDebugUpdataFlag |= aoVolumeFlag;
              }
          }  
          else if (!strcmp(elem_name, AUDIO_LINEOUT_SWITCH))
          {
              snd_mixer_selem_set_playback_switch(elem, 0, 1);
          } 
          else if (!strcmp(elem_name, AUDIO_LINEOUT_MUX))
          {
              snd_mixer_selem_set_enum_item(elem, 0, 1);    // increase play volume when amplifier differential input
          } 
          else if(!strcmp(elem_name, AUDIO_PA_SWITCH)){
              snd_mixer_selem_set_playback_switch(elem, 0, 1);
              aoPALevel = 0;
          }
      }
      
      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 用T113做了块多功能卡片电脑,成本只要60块

      QQ图片20240422143001.jpg

      FunnyPi-T113是一款基于全志T113-S3/D1S处理器的完全开源多功能开发板,设计FunnyPi最初的目的是想借此T113卡片电脑来满足日常学习,并结合T113高效能和低功耗的特点,来满足像语音助手,智能家居屏幕、桌面摆件屏、博客服务器等嵌入式应用的开发需求。

      16c9eQ4qnf36ZZwVhonjgcrCiTYRYLIlFuOiLN19.jpeg

      • 全志T113-S3/D1s主控
      • 支持WIFI和蓝牙,屏幕连接
      • Type-C正反插切换otg和uart
      • 适配全志Tina-Linux
      • 支持快启

      作为面向初学者学习使用的多功能开发板,作者本人也面面俱到的配上了FunnyPi开发板的硬件选型、原理图设计、软件系统移植、快速点灯等详尽教程。

      硬件设计

      FunnyPi开发板内置了丰富的外设接口,包括USB、GPIO、I2C、SPI、UART等,方便用户连接各种传感器、执行器和其他外围设备,同时板载了标准RGB接口、PMIC芯片、串口转USB芯片等,方便开发者进行DIY开发。

      YbBaB7i6rsOa61ew7xYgtBvtiUvdNmbzRNrcNB76.png

      此外,这款开发板还具有强大的网络功能,支持板载WIFI和蓝牙模块,可实现无线网络连接和数据传输。最重要的一点是,本开发板所有阻容使用0603封装且将绝大部分元件放在了正面,非常方便手焊!

      iK0BNk6CsKiRrz555Dzscby3A42ieA724vQZqj2s.png

      • 成本:约60(嘉立创四层沉金免费)
      • 主控:T113-S3/D1s
      • WIFI+BT模组:RTL8723BS
      • 串口转USB:CH343P
      • 背光驱动:RY3730
      • 芯片供电:EA303

      设计FunnyPi最初的目的是想满足日常学习,并且可用做语音助手,智能家居屏幕、桌面摆件屏、博客服务器等,所以选择了丰富的接口设计方案。

      image.png

      为了方便统筹需要使用的硬件接口,将相关功能引脚做好分类。

      SCH_Schematic1_2-Core_2024-04-07.png

      软件适配

      作者本人给FunnyPi适配了Tina Linux,并十分详尽地介绍了在开发板上搭建环境的教程,内容包括Tina Linux移植、Uboot配置、debug串口配置、点灯教程、WiFi蓝牙通信适配等,可以满足小白开发者的快速上手。

      20240612_151413-ezgif.com-video-to-gif-converter.gif

      • Tina SDK开发环境搭建
      • Tina SDK的目录结构
      • 添加软件包
      • 如何创建自己的开发板
      • Uboot
      • 修改debug串口
      • 添加心跳灯
      • 使用ADB来传输文件
      • 适配WIFI
      • 适配蓝牙

      软件适配教程网址:https://www.yuque.com/flose-kgkgb/yxurbe/nbdi5d1cd63zg5r6?singleDoc#

      其它功能及开源资料获取

      整体来说,FunnyPi是一款功能十分全面的低成本开发板,很适合初学者来使用学习,本文与扩展板硬件相关的所有内容均转载自原作者flose本人立创开源硬件平台的工程页面和个人网站,软硬件资料均开源,感兴趣的小伙伴可以复制下方链接或者戳文末的“阅读原文”阅读了解。

      立创开源平台链接:https://oshwhub.com/flose/funnypi-quanzhi-t113-s3-card-computer

      FunnyPi开源网站:https://www.yuque.com/flose-kgkgb/yxurbe/nbdi5d1cd63zg5r6?singleDoc#

      U3hKCyEPdo8BKLiuJOu5jDZaAA700mmcPFr4GFJ2.jpeg

      发布在 爱搞机专区
      q1215200171
      budbool
    • 回复: 我的D1s哪吒开发板到货啦

      可以抽奖送一个可爱的小文哥吗

      发布在 MR Series
      q1215200171
      budbool
    • 【FAQ】全志V85x芯片 如何放开快启方案的打印?

      1.主题

      如何放开快启方案的打印

      2.问题背景

      产品:v851系列快启方案
      软件:tina
      其他:特有版本信息添加自由描述 (如固件版本,复现概率,特定环境)
      为什么在boot0增加打印启动过程无法看到?

      3.复现步骤

      在brandy/brandy-2.0/spl/的代码流程中可以发现很多使用printf方式的打印未被打印出来

      4.问题分析

      快起方案为了缩短启动时间,将printf函数的打印关闭,使用printf函数无法在启动时打印,可使用以下三种方式的任意一种都可以放开打印。

      • 编写代码时将printf替换为pr_emerg。
      • 打包时,修改sys_config.fex文件中的debug_mode,置为1。
      • 启动时,在键盘中输入D,只有一瞬间的捕获键盘输入的时间,可能需要重复几次才可成功。
      发布在 V Series
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 如何解决蓝牙扫描期间bluetoothd进程的RssAnon值一直升高?

      问题背景

      系统平台:Tina
      硬件平台:R818、R329、R328、R528 …
      模组:XR829、XR819S …

      问题描述

      客户反馈板子压测BLE扫描,不停止,bluetoothd进程RSS值一直升高。客户怀疑是内存泄露。

      问题分析

      1.该问题是用户一直扫描,导致RSS值升高,这个升高是合理的,因为每扫描到一个设备就会malloc一部分空间,期间不会释放该部分空间,只有在停止扫描3min后,才会一次性释放掉(bluez设计如此,3min的定时器清除暂存的扫描信息)。
      2.在实际测试,会发现3min停止扫描后,RSS值并没有变小。解释:malloc时空间过小,不超过一定阈值时,是采用 sbrk方式,其在用户释放之后 ptmalloc 对这块内存进行重新管理利用,进程依然持有这块内存。其属于glibc 内存池。
      3.测试1:修改M_MMAP_THRESHOLD: mmap 内存分配阈值为16B,测试到停止扫描rss的值会降低。
      4.测试2:脚本压测循环打开扫描15s–关闭扫描40s。压测3天,rss值不会增加。

      问题总结

      该问题澄清不是内存泄漏,是bluez机制如此,等停止扫描再一起释放。释放后的内存不会立即归还系统,所以不会体现在rss值上,属于进程循环使用的内存。

      解决办法

      • 方式一:客户不能一直扫描,应用层要扫描一段时间后,停止扫描一下,再启动扫描,要给bluetoothd一个释放的机会。就像bluetoothctl一样,执行scan on看起来是一直在扫描,实际上是做了一个定时器,一段时间后会停止扫描,再启动扫描。

      • 方式二:如果客户不通过dbus的扫描,而是通过socket直接和内核通信的。可以将bluez中关闭掉存
        储扫描到的设备信息,5.38版本不需要修改,设计就是这样,5.54及以上的版本需要修改。修改位置:
        src/adapter.c

      71a409c173364f3c83c923befd07ee34.jfif

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 大佬手搓了一个轻量级操作系统YiYiYa OS

      705F822F-02F3-4227-ABFC-CFA47C633FF5.png

      作者:evilbinary(鸭佬)

      YiYiYa操作系统是一个朴实无华的操作系统,追求快速开发,最小实现,同时遵循SOLID原则。编码简洁明了,非常适合学习操作系统的同学。目前既有宏内核,也逐步实现了微内核架构,未来将会是混合内核。

      目前YiYiYa OS支持很多种架构和平台,包括ARM-Cortex A7系列的V3s、T113-S3等芯片、ARM9内核的F1C系列芯片以及部分RISC-V内核芯片,所有移植教程及方法都在Github上公开。

      2024-01-20-15-53-16.png

      2024-01-20-16-37-45 (1).png

      系统架构

      架构从上而下分层设计,同一层从左到右为模块。越下层与用户离得远,就会变得越通用越公共。分层设计便于扩展,方便维护,每一层的职责单一,让每一层依赖都是固定,不会胡乱调用(实现低耦合)。同时高层依赖底层,依赖接口,不依赖具体细节实现,底层的改动不至于影响太大,这就是基本的设计原则。

      arch.png

      应用层

      应用层直接和用户操作打交道。有图形界面和shell命令交互。此层面对用户开发应用和常用库,对应源码目录为app。

      2024-01-21-17-19-45.png

      应用层

      应用层直接和用户操作打交道。有图形界面和shell命令交互。此层面对用户开发应用和常用库,对应源码目录为app。

      接口层(C标准库)

      接口层为操作系统内核向外核提供的基本功能。通过libc和libmusl可选,实现基本的标准库,方便开发者直接移植代码或者适配应用app。

      内核层

      内核层则为核心领域业务。每一小个模块都提供基本的功能。按各自的职责划分,分别对应与传统内核层则为核心领域业务。每一小个模块都提供基本的功能。按各自的职责划分,分别对应与传统操作系统的内存管理、进程通信、文件系统、进程通信、等等。在演进操作系统时候,可以修改这里,对应源码目录为kernel。

      基础设施层(公共层和硬件层)

      将硬件CPU相关和平台模块相关的单独作为公用库使用。目录为arch、platform、libs/kernel。

      在移植适配的时候基本上和这些模块打交道比较多,同时单独一个库可以提高内核代码复用性,内核有专门的内核库,以便增加代码安全,减少出错。

      828C40BF93C9.jpg

      • 支持荔枝派系列开发板,全志V3s,F1C200S,T113-S3等芯片,RISC-V的支持在规划中
      • 支持uboot引导内核,同时支持不需要uboot引导模式
      • 支持lcd屏幕,st7789、st7735、通用40pin rgb屏幕
      • 支持vfs,fat32文件格式
      • 支持elf文件,ipc管道等
      • 支持ahci、gpio、i2c、spi驱动等

      系统移植教程

      作者本人及团队自制的开源掌机FunKey所采用的操作系统就是基于Linux内核和YiYiYa OS,YiYiYa OS内提供了丰富的桌面系统和游戏开发框架,其非常简易的移植过程,也让开发者可以轻松地运用YiYiYa OS裸机开发自己的设备。

      以基于T113-S3开发的FunKey掌机为例,在进行平台移植时,需要在新增的duck/platform目录下添加gpio.h头文件以及编写 init.c 包含基本的串口功能,然后再执行以下三个步骤,就可以轻松运行起YiYiYa OS:

      克隆项目

      git clone https://github.com/evilbinary/YiYiYa.git
      make pull
      

      安装构建工具

      pip install yymake
      

      编译

      ya -m debug -p t113-s3 -r t113-s3
      

      jkjkk.gif

      #其它功能及开源资料获取

      整体来说,YiYiYa操作系统非常轻量,支持POSIX操作系统标准协议,同时还支持扩展,方便使用其他语言开发模块。在应用层,可以通过libc/libmusl标准库和常用的库开发应用;在内核层可以调用基本内核模块的功能和共用库,开发者可以在DIY过程中自行选择。

      2024-01-20-16-25-29.png

      2024-01-20-16-26-27.png

      2024-01-20-16-26-56.png

      本文所有内容均转载自原作者本人的Github仓库,除了YiYiYa OS外还有很多有趣有用的开发工具,感兴趣的小伙伴可以复制下方链接获取。

      evilbinary Github:https://github.com/evilbinary

      uyuooioiioio.JPG

      发布在 爱搞机专区
      q1215200171
      budbool
    • 技术流直播即将开始!“晕哥”带你玩转“玄铁杯”参赛开发板全志哪吒D1-H开发板

      微信图片_20220526094857.jpg

      • 讲座时间:2022-05-27 14:00 - 15:00
      • 报名方式:扫描海报二维码进入钉钉报名直播讲座
      • 主讲嘉宾:贺兴哇 -酷网主理人-全志在线开发者社区高级顾问
      • 讲座亮点:D1-H哪吒开发板相关介绍

      主讲嘉宾 贺兴

      哇酷网主理人
      全志在线开发者社区高级顾问

      东莞市哇酷科技有限公司创始人贺兴,人称晕哥,拥有个人管理的开发者社区——Whycan Forum(哇酷开发者社区),主要讨论全志Soc,因此同时也被全志在线开发者社区聘为高级顾问,晕哥十分热爱开源项目的分享,已就全志D1-H/D1s等芯片开源了不少优质项目,吸引了一大批开发者慕名而来。

      赛事详情

      2022“玄铁杯”RISC-V应用创新大赛正式启动,本次大赛分设“碳中和”、工业控制及机器人、视觉及可穿戴设备、智慧家居4条赛道,免费开放“云上实验室”助理参赛者探索开发不同领域的创新应用,感受RISC-V“算力自由”

      本次“玄铁杯”第二届RISC-V应用创新大赛即将于5月31日结束创意方案提交的阶段,目前已有1000+开发者基于全志D1-H哪吒和Sipeed Lichee D1-H DocK Pro两款开发板提交了300+份创意方案,方案从Linux和RTOS两种类型的操作系统出发,衍生出工业机器人、视觉及可穿戴设备、社区养老以及车载设备等时下最火热的赛道方案,赛事火爆程度可见一斑,开发者们赶快抓紧最后几天的上车机会,扫描参赛二维码,提交自己的创意方案。

      发布在 MR Series
      q1215200171
      budbool
    • 【FAQ】全志D1芯片 XR829扫卡失败问题排查

      【问题背景】
      硬件:D1 + Wi-Fi模组(XR829)
      软件:melis-v3.0
      说明:该FAQ旨在记录

      【问题简述】
      WiFi初始化指令执行后无法扫描到WiFi模组,即扫卡失败

      【问题分析】
      1、首先排查硬件问题,其次再找软件bug
      (1)同样的模组在跑其它软件时,可以正常工作;排除模组的硬件问题
      (2)定位软件bug,扫卡失败发生WiFi初始化阶段1

      2、解软件bug
      WiFi模组引脚图:
      92e5cd3275ac494c9c2c994f2f6f734b.jfif
      (1)WiFi初始化时会对模组进行上电
      可能时上电时序不对导致扫卡失败,检查REG_ON引脚时序
      REG_ON:执行WiFi初始化指令后,引脚时序应该是10ms高电平-》20ms低电平-》高电平
      (2)上电时序没有问题的话,检查sdio驱动问题,因为扫卡是通过是sdio下发cmd5
      使用其它sdio设备,看其是否可以正常工作;使用sd卡测试,可以正常工作,说明不是sdio的驱动问题

      检查指令引脚是否发出cmd5——SDIO CMD:在扫卡阶段检查该引脚是否有cmd5命令输入

      cmd5命令格式如下:
      860be038437041a48b05a796c65c8b41.jpg

      检查扫卡频率是否正常——SDIO CLK:在扫卡阶段,该引脚应该是输入4KHZ、50%占空比的方波。

      3、在检查这两个大方向后还是无法排查问题
      (1)和正常模组对比差异点
      最后发现LPO引脚输入24MHZ时钟,而正常模组为高电平;将该引脚修改为高电平,可以正常扫到卡。

      【解决方法】
      LPO引脚正常情况下是输入32.768KHZ的震荡信号作为低功耗时使用,故输入32.768KHZ时钟;测试可以正常扫到卡。
      执行wifi初始化指令后,设置LPO输入32KHZ、50%占空比的方波

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 你相信光吗?开源一个能进行虚拟光渲交互的D1s智能家居中控

      项目作者:是小叶呀~ @aldfaaa

      一位除了不会的都会的“全栈”工程师,接触国产RISC-V芯片(全志D1-H)的最早的一批开发者,热衷于有意思的DIY项目,有主控芯片自己焊接的无畏精神与小米加步枪的节俭精神。

      “B51F5616-09F8-4cf3-B47E-C19D05F9EDD5”为智能对象-1.jpg

      本文所介绍产品demo是在立创开源平台的开源作品**《全志D1s智能家居中控虚拟光渲交互(86盒)》**,项目选用RISC-V核心的全志D1s作为主控进行开发,并通过家庭WIFI内网,实现设备间MQTT通信,与其它开源单片机控制项目进行充分联动,旨在推广类似客制化键盘概念到智能家居领域,尝试打破各大厂商对物联网家居的包揽野心和APP的分散的局面,回归到注重用户体验的智能家居本心。

      ezgif.com-optimize.gif

      ezgif.com-video-to-gif.gif

      项目简介

      rxupu2Qi6ms2fI4X3VWcgffcblLdQDWmBcqUNtF5.jpeg

      项目整体形态以适配86盒安装为基础,使用全志RISC-V核心的D1s芯片作为主控,选择更契合广大房奴的户型的4.3寸长方形屏幕,屏显拉满输出RGB888,搭载全志系的芯之联XR829作为WIFI/BLE模块,多种方式联动。

      oFwf5GeWrG8joqWR716mqQaTzDvtGP61v476RIlF.jpeg

      在开发系统的选择上,作者基于全志最新公开的Melis 4.0实时操作系统进行本项目的开发,并针对Melis 4.0粗糙地适配了LVGL图形库,实现了在性能受限的嵌入式设备上的光照渲染核心技术,致敬homeassistant。

      硬件设计

      为了在结构上适配标准86盒安装,硬件设计方面不仅引出了D1s包括屏幕显示、网络、音频在内的大部分功能引脚,还为后续的DIY功能开发、与其它开源单片机控制项目进行充分联动预留了开发接口。

      02B4EF8A-70B2-40be-BE00-19D5E2D78399.png

      D1D4D45D-43C4-414f-8ABC-6BA1F2594EFD.png

      BOMgs4iXviaiw3OTCrT9LdzLcu7qm5FL66oaMPFF.png

      虽然功能繁多,但项目的硬件设计方面其实并没有什么难点,只是作者本人本着主控芯片自己焊接的无畏精神与小米加步枪的节俭精神,在星火计划里申请了第一板的PCB和物料。

      然而...作者确实高估了焊接eQFP芯片的难度,焊接完成发现还是存在结构等小问题,总结完各种问题后不断改了三个版本的PCB,甚至拖到了全志D1s都已经上架到了立创SMT元件库中。

      PdwUkFeCAVOiECJekMXYrsiKHlIw5reSjAtMUhzb.jpeg

      想要复刻的小伙伴需要注意以下几个方面:

      • SMT的版本系需要手工焊接B5819
      • 需要检查D1s元件是否反接, 不然会造成片内DDR无法校准的深坑
      • 不接USB_ID也不会影响D1s烧录镜像到Flash

      rTPdNnDNSdBFFTlp15FIY4V3du9DEIl6wQz6gZAm.png

      软件设计

      智能家居中控采用Melis 4.0以及RT-Thread内核的梦幻联动作为操作系统,并基于此系统进行了LVGL的适配工作,并在LVGL图形库实现了在性能受限的嵌入式设备上的光照渲染核心技术。

      3sN6zOmVRx3c8PUlGmix9XHlPuBc4FVzVKMmQwSq.png

      作为本项目的最核心亮点,作者为这款86盒专门适配了一套自研"光渲"算法,让交互不再停留在常规的按钮点击,显示界面会通过亮暗两种形态来反馈用户的操作效果。

      ezgif.com-optimize.gif

      ezgif.com-video-to-gif.gif

      除了实时反馈通过传统开关带来的灯光亮灭变化,用户在使用时还可以通过触摸屏幕,App控制等方式来充当灯光及其它智能家居的开关,通过该智能家居中控操作实现真正的全屋智能,回归到注重用户体验的智能家居本心。

      资料获取

      开门见山地说项目内的亮点:

      • 基于全志最新公开的Melis 4.0实时操作系统进行开发, 使用RTThread内核! 汝可知这其中的梦幻联动?
      • 针对Melis 4.0粗糙地适配了LVGL图形库;
      • 基于LVGL图形库实现了在性能受限的嵌入式设备上的光照渲染核心技术,致敬homeassistant;
      • 搭载全志系的芯之联XR829作为WIFI/BLE模块;
      • 选择4.3寸屏幕是因为长方形的更契合广大房奴的户型(自己家);
      • 结构上适配标准86盒安装;

      目前项目的整体功能还不算完善,项目作者本人也在初版demo的基础上不断增加更加智能化的功能,目前有以下三个计划:

      • 计划接入阿里云的MQTT服务, 正在谋划中...
      • 社区大佬正移植NES模拟器..
      • 方案适用于各种带屏设备, 逼格即可拉满! 包括但不限于:Voron, Klipper....(RISC-V生态百废待兴!)

      作者连同使用的开发系统一起打包了软件及硬件的源码,并熬了好个晚上填完了项目中的坑,本项目所有资料均已开源,想获取资料自己DIY学习的伙伴,请前往以下链接获取。

      https://oshwhub.com/fanlingg/D1s-smart-home-control

      2B3C193C-AAED-4314-A758-6128032C5222.png

      发布在 MR Series
      q1215200171
      budbool
    • 【FAQ】全志D1芯片 如何在 Linux Device Tree 中配置预留内存?

      前言

      有时我们需要在 Linux 内核中预留一部分内存空间用作特殊用途(给安全模块使用,给其它处理器使用,或是给特定的驱动程序使用等),在 Device Tree 中有提供两种方法对预留内存进行配置:memreserve 和 reserved-memory。

      memreserve

      memreserve 的使用方法比较简单,如下所示,会将从地址 0x40000000 开始共 1MB 的内存空间预留出来:

      /memreserve/ 0x40000000 0x00100000;
      

      使用 memreserve 预留出来的内存一般无法再被 Linux 系统使用(当然,也可以通过特殊方法让代码固定访问该地址,但这种并非标准用法,在此不展开描述)。

      reserved-memory

      reserved-memory 框架提供了更多样的使用方法,并且与内核的 DMA API 和 CMA 框架紧密联系。

      推荐先阅读一下内核自带的文档 Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt,里面有其详细的语法说明和注意事项(例如 reserved-memory 节点中的 #address-cells 和 #size-cells 的值需要与根节点的保持一致)。

      下面对几种常见的使用方法进行举例说明:

      通过 memremap/ioremap 来使用
      在 Device Tree 配置如下,然后通过“memory-region”参数可将该预留内存分配给特定的设备驱动使用:

      reserved-memory {
         #address-cells = <2>;
         #size-cells = <2>;
         ranges;
       
         foobar_reserved: foobar@70000000 {
            no-map;
            reg = <0x0 0x70000000 0x0 0x10000000>;
         };
      };
       
      foobar_driver: foobar_driver@0 {
         memory-region = <&foobar_reserved>;
      };
      

      在设备驱动程序中,可解析 Device Tree 节点获得预留内存的物理地址和大小,然后通过 memremap/ioremap 映射这片内存空间来使用:

      /* Get reserved memory region from Device-tree */
      np = of_parse_phandle(dev->of_node, "memory-region", 0);
      if (!np) {
        dev_err(dev, "No %s specified\n", "memory-region");
        goto error1;
      }
        
      rc = of_address_to_resource(np, 0, &r);
      if (rc) {
        dev_err(dev, "No memory address assigned to the region\n");
        goto error1;
      }
        
      lp->paddr = r.start;
      lp->vaddr = memremap(r.start, resource_size(&r), MEMREMAP_WB);
      dev_info(dev, "Allocated reserved memory, vaddr: 0x%0llX, paddr: 0x%0llX\n", (u64)lp->vaddr, lp->paddr);
      

      通过 DMA API 来使用

      设置“shared-dma-pool”属性后,可让设备驱动通过 DMA API 来使用预留内存:

      reserved-memory {
         #address-cells = <2>;
         #size-cells = <2>;
         ranges;
       
         foobar_reserved: foobar@70000000 {
            compatible = "shared-dma-pool";
            no-map;
            reg = <0x0 0x70000000 0x0 0x10000000>;
         };
      };
       
      foobar_driver: foobar_driver@0 {
         memory-region = <&foobar_reserved>;
      };
      

      设备驱动程序中可类似常规地使用 DMA API,它申请的内存不是来源于默认的 CMA 内存池,而是来源于该预留内存:

      /* Initialize reserved memory resources */
        rc = of_reserved_mem_device_init(dev);
        if(rc) {
          dev_err(dev, "Could not get reserved memory\n");
          goto error1;
        }
        
        /* Allocate memory */
        dma_set_coherent_mask(dev, 0xFFFFFFFF);
        lp->vaddr = dma_alloc_coherent(dev, ALLOC_SIZE, &lp->paddr, GFP_KERNEL);
        dev_info(dev, "Allocated coherent memory, vaddr: 0x%0llX, paddr: 0x%0llX\n", (u64)lp->vaddr, lp->paddr);
      

      给 CMA 预留内存

      有时我们不需要将预留内存分配给特定的设备驱动,而只是想给默认 CMA 内存池分配一片固定的内存区域,这时我们可配置上“reusable”和“linux,cma-default”:

      reserved-memory {
            #address-cells = <2>;
            #size-cells = <2>;
            ranges;
        
            linux,cma {
               compatible = "shared-dma-pool";
               reusable;
               reg = <0x0 0x70000000 0x0 0x10000000>;
               linux,cma-default;
            };
         };
      

      由此可见,不同于 memreserve,通过 reserved-memory 预留的内存有可能进入系统 CMA,这需要满足以下几个条件:

      • compatible 需要为“shared-dma-pool”
      • 没有定义“no-map”属性
      • 定义了“reusable”属性
      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 回复: 现在怎么才能获取到芒果派 t113-s3 MQ-Dual 的SDK呢?

      https://mangopi.org/mqr

      发布在 MR Series
      q1215200171
      budbool
    • 【FAQ】全志 F系列/R系列/V系列 RTOS平台cache操作接口介绍

      1.主题

      全志 F系列/R系列/V系列 RTOS平台cache操作接口介绍

      2.问题背景

      全志F系列/R系列/V系列所采用的RTOS,提供了一些关于 Cache 操作的接口,用于当不同 master 在内存上读写传递时使用,以下是 Cache 操作接口的使用介绍。

      • hal_dcache_clean
        函数原型:void hal_dcache_clean(unsigned long addr, int len);
        函数作用:将[addr, addr + len]地址在 dcache 上对应的数据刷回内存,其在dcache 上数据依旧有效。
        使用场景:提供数据给外设时,需要将停留在 dcache 上的数据写回内存,以让外设可以直接访问内存获取该笔数据(外设访问不会经过 dcache)。

      • hal_dcache_invalidate
        函数原型:void hal_dcache_invalidate(unsigned long addr, int len);
        函数作用:将[addr, addr + len]地址在 dcache 上对应的数据无效。
        使用场景:外设修改数据后,CPU需要将 dcache 上的数据无效,以让CPU可以获取到经过外设修改后的数据。

      • hal_dcache_clean_all
        函数原型:void hal_dcache_clean_all(void);
        函数作用:将所有的dcache 数据全部刷回。
        使用场景:较少使用,一般在动态关闭Dcache 的场景下去使用。

      • hal_dcache_invalidate_all
        函数原型:void hal_dcache_invalidate_all(void);
        函数作用:将所有的dcache 数据全部无效。
        使用场景:除了使能 dcache 的场景外,绝对不允许使用。

      • hal_icache_invalidate
        函数原型:void hal_icache_invalidate(unsigned long addr, int len);
        函数作用:将[addr, addr + len]地址在 icache 上对应的数据无效。
        使用场景:自修改代码指令时,需要无效icache。

      • hal_icache_invalidate_all
        函数原型:void hal_icache_invalidate_all(void);
        函数作用:将所有的dcache 数据全部无效。
        使用场景:自修改代码指令时,需要无效icache。

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【FAQ】全志系列芯片 如何在Tina Linux中使用脚本完成定制化升级?

      1.主题

      在Tina Linux中,如何使用脚本完成定制化升级

      2.问题背景

      硬件:全平台
      软件:Tina
      其他:支持OTA升级的平台,可实现脚本定制化升级

      3.具体表现

      在OTA升级过程中,添加定制化需求,实现控制变量升级。

      4.问题分析

      利用swupdate升级满足定制化脚本需求

      5.解决办法

      因为swupdate支持脚本,所以在升级过程中,添加能够实现定制升级的脚本即可,将带有定制升级的脚本编入策略描述文件(sw-descrition)OTA升级配置文件中(sw-subimgs),在打包ota升级包时,将脚本一起打包进ota包中。在进行下面的配置后,输入升级命令时,首先开始执行脚本中的内容,满足升级条件后,再进行升级流程。下面进行详细的步骤介绍:

      1.swupdate支持shellscript脚本,需要以下功能配置(默认选中)

      执行:make menuconfig/make ota_menuconfig
      Allwinner  --->
          <*> swupdate............................. software update for embedded system
              Swupdate Settings  --->
                  General Configuration  --->
                      [*] enable pre and postinstall scripts
              Image Handlers  --->
                  [*] shellscript
      

      2.在swupdate文件夹下创建脚本,名字随意,在脚本中写入要实现的功能。例如:目前有一个方案需要升级,但是分为A,B两种产品,对应做了不同的功能,为了防止升级混淆,可以利用脚本去控制变量升级,比如A产品方案中的env,可以添加一个变量project=a,B产品方案中的env添加一个变量project=b,那么脚本中的内容就可以判断project=a或b时,继续完成升级。env中添加内容和脚本内容举例如下:
      env中:
      437b4dfb25d84a1888090f5e7e82f323.jfif
      脚本内容如下:
      5d311321539a4651a33d32c62650894d.jfif

      3.在描述文件中添加脚本功能,在sw-description中添加以下代码:
      09a9b95225664e3c8e7b8fd5e7dcdbb2.jfif

      4.将脚本打包进ota包中,脚本名字可以任意起,我这里是preinstall_checkAB.sh。
      e547c5d447ba4368a39fb6db128e7ded.jfif

      5.重新编译主系统和recovery系统,烧录固件,打包ota包,再进行验证。

      6.验证:当校验失败时,返回值为1,会看到如下打印,不能升级。
      d58b2c9b048e4c6780f6a8ebafe08cc1.jfif
      校验成功时,返回值为0,看到如下打印,升级成功。
      1d1de11a87624a8d846a01351fd0b79b.jfif

      发布在 MR Series
      q1215200171
      budbool
    • 【FAQ】全志D1芯片 MiniGUI如何显示鼠标?

      【问题描述】
      有时候开发MiniGUI程序需要显示鼠标,但是怎么配置和调试都不显示,那么可以按照下面几步依次检查

      【解决方案】

      • 查看编译libminigui-gpl的时候,是否指定了–disable-cursor,如果指定了是没有鼠标显示的
      • 查看MiniGUI.cfg,cursorpath的路径下是否有鼠标图片,cursornumber是否大于0
      • 查看窗口的过程函数MSG_ERASEBKGND下是否返回了return 0并且什么也没有画,没有填充背景,这样是不显示鼠标的
      • 查看MiniGUI.cfg的输入引擎配置的是否是鼠标,如
      # IAL engine
      ial_engine=console
      mdev=/dev/input/mouse0
      mtype=IMPS2
      
      • 查看创建窗口是否获取了鼠标
      CreateInfo.hCursor = GetSystemCursor(0);
      
      • 查看创建自定义控件是否获取了鼠标
      MyClass.hCursor = GetSystemCursor(0);
      
      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【FAQ】全志V853芯片 烧录spinor烧录器固件方法

      1.主题

      v85x/v83x 烧录spinor烧录器固件方法

      2.问题背景

      产品:spinor 烧录
      硬件:v83x / v85x

      • 什么是spinor烧录器固件?
        烧录器固件就是就是在spinor flash上从地址start(0x00) ~ end 的二进制数据文件。

      • 哪些场景会使用烧录器固件?
        ①工厂会使用烧录器工具多一点,在贴片前,使用烧录器固件批量给多个spinor烧录固件。烧录完成后再贴片;
        ②开发的同学有些也喜欢烧录自己制作的烧录器固件,而非使用全志Tina SDK 编译出来的固件。

      • 如何制作烧录器固件?
        ①从一个已经烧录好的机器读取flash的全部二进制数据出来,形成一个烧录器固件;
        ②只要按照划分好各个分区的起始点,把需要pack后的分区文件按偏移拼接起来。如:

      |boot0|boot_package|mbr|boot|rootfs|env|…
      
      • 如何使用工具烧录spinor “烧录器固件” ?
        请看下面的解决方法:

      3.解决办法

      • 如果制作好了烧录器固件: factory_flash.bin 16M烧录到16M 的spinor 里面。

      • 插入usb到pc,板子进入efex 模式,进入efex 方式有:
        ①系统下输入reboot efex (进入后,打印会输出CCCC)
        ②在uboot输入 efex (进入后,打印会输出CCCC)
        ③按住2,上电开机 (进入后,打印会输出CCCC)
        ④短路flash,让flash读取失败 (进入后,打印会输出CCCC)

      • 下载附件工具sunxi-tester.exe(附件上) ,Pc(windows)上烧录工厂flash固件:
        sunxi-tester-v853-0704.zip

      0bf2a21a51884a33bbc42096c427b3bd.jpg

      • 使用帮助
      Usage: D:\我的文档\桌面\sunxi-tester.exe [options] command arguments… [command…]
      -h, --help Print this usage summary and exit
      -v, --verbose Verbose logging
      -p, --progress “write” transfers show a progress bar
      -l, --list Enumerate all (USB) FEL devices and exit
      spiflash-read addr length file Write SPI flash contents into file
      spiflash-write addr file Store file contents into SPI flash
      

      注意: 此工具sunxi-tester.exe 只能操作spinor flash 前面16M空间。 超过16M无法进行读写。

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 周易AIPU加持!R329助力研电赛人工智能选题

      第十七届中国研究生电子设计竞赛(以下简称“研电赛”)现已正式开赛,比赛已经进入报名阶段,各企业命题也已在官网发布,此次研电赛安谋科技(Arm China)的命题将聚焦人工智能领域,围绕着基于特定开发平台的理性智能体设计的主题进行,有着周易AIPU处理器加持的全志R329,也被选中为此次研电赛的开发平台之一。
      9045608bcb6347c28a07820d1de9b570.jpg

      本次研电赛选择搭载R329的开发平台是SIPEED Maix Sense R329开发平台。MaixSense开发板的套件包含了一个搭载全志R329的高度集成核心板,以及一个多功能的IO扩展底板,R329内置的周易AIPU处理器同时支持智能语音和视频图像处理的功能,开发者可以直接在开发板上轻松跑通相关AI模型,其特性与安谋科技聚焦人工智能领域设计的选题不谋而合。

      Maix Sense板载资源

      微信图片_20220413093440.png

      Maix Sense硬件参数

      O1CN01P5swK423vh6YJLxy2_!!2200606237318.png

      R329是全志科技针对智能语音旗舰市场推出的一款高集成度SoC,搭载双核A53 1.5G CPU,内置双核400MHz HiFi4 和 800MHz AIPU 0.25TOPS,可以满足各种智能产品开发的各种需求。

      20210901105215f5_f9d75126d8.jpg

      本次研电赛给出的赛题围绕具体应用场景,结合传感器、算法和控制设备,搭建完整理性智能体以实现针对性的场景业务需求为目的,对算法、传感器、控制设备等内容不限制使用,但需要基于所选择的开发平台进行开发,安谋科技也提供了50套免费的开发平台供本次比赛申请使用,关于本次研电赛的基本信息、报名链接等将一一给出:

      报名链接:
      https://cpipc.acge.org.cn/cw/hp/6

      开发平台申请:
      https://aijishu.com/e/1120000000259996

      R329介绍文档:
      https://r329.docs.aw-ol.com/

      命题技术交流群:
      https://aijishu.com/e/1120000000259996

      R329技术讨论区:
      https://bbs.aw-ol.com/category/2/r329

      发布在 A Series
      q1215200171
      budbool
    • 男人至死都是孩子——大佬在D1开发板上移植魂斗罗游戏

      小白通过buildroot搭建哪吒D1开发环境详细步骤,并且在HDMI显示器上玩上了魂斗罗(基于QT5).(感谢晕哥对我的指导)
      所有的内容都通过buildroot搭建,包括uboot,内核,qt5等等。
      我是通过UBUNTU18.4搭建的,如果在buildroot的下载过程中遇到了半天都下不下来,直接就强行终止,然后执行
      sudo systemd-resolve --flush-caches (UBUNTU18.4,其他的版本需要自己查)这个是刷DNS,我有的时候下载不动就用此命令。

      1.apt-get update

      2.sudo apt-get install -y sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio unzip rsync file bc wget python cvs git mercurial rsync scp subversion android-tools-mkbootimg libncurses5-dev

      Bzr 注意:第2步骤是我自己摸索出来的,与韦东山老师要求安装的库的不同,请注意。

      3.找一个文件夹 或者是home文件夹 mkdir -p ~/Neza-D1/ && cd ~/Neza-D1/ 这样就有Neza-D1文件夹了。

      4.git clone https://gitee.com/weidongshan/neza-d1-buildroot.git buildroot-2021 这个是韦东山老师的buildroot,下载速度应该是比较快。

      5.在buildroot-2021/configs/的文件夹下有neza-d1_defconfig,这个就是默认的配置文件。 通过make neza-d1_defconfig 生成默认文件。然后通过
      make menuconfig 进入buildroot配置,Qt5的这三个库去掉。(我是下载不下来没有办法去掉的,如果可以下载下来,也不用去掉)
      Qt5-coap需要去掉
      Qt5-knx 需要去掉
      Qt5-mqtt需要去掉

      6.make all,这个过程非常漫长。完成之后会在buildroot/image下生成sdcard.img,通过写SD卡的工具写入就可以了。

      7.写入之后,可以通过串口启动,就成功了一半,这个时候插入HDMI是不能识别,好像是sink什么什么错误。然后执行

      mount -t debugfs none /sys/kernel/debug;
      cd /sys/kernel/debug/dispdbg;
      echo disp0 > name; 
      echo switch1 > command; 
      echo 4 10 0 0 0x4 0x101 0 0 0 8 > param; 
      echo 1 > start;
      

      然后你的显示屏幕就只能显示左边一部分,然后你执行 cat /dev/urandom > /dev/fb0 应该可以看到左边一小半屏幕有雪花屏幕。

      8.我的LCD是1024x600的,显示不全应该是设备树的问题,然后就修改uboot设备树和linux内核设备树。
      uboot与linux内核都在 buildroot的output/build/目录下
      uboot设备树在 uboot-origin_master文件夹下的 arch/boot/dts/uboot-board.dts
      linux内核设备树在 linux-origin_master文件夹下的 arch/riscv/boot/dts/board.dts
      两个设备树都要修改成下面这种,-就是要去掉,+就是要增加,其中dev0_output_mode是调分辨率

      • <10>就是1080p
      • <5> 就是720p
      • <2> 就是360p

      具体可以查文档

              disp_init_enable         = <1>;
              disp_mode                = <0>;
      -       screen0_output_type      = <1>;
      -       screen0_output_mode      = <4>;
      -
      -       screen1_output_type      = <3>;
      -       screen1_output_mode      = <10>;
      -
      -       screen1_output_format    = <0>;
      -       screen1_output_bits      = <0>;
      -       screen1_output_eotf      = <4>;
      -       screen1_output_cs        = <257>;
      -       screen1_output_dvi_hdmi  = <2>;
      -       screen1_output_range     = <2>;
      -       screen1_output_scan      = <0>;
      -       screen1_output_aspect_ratio = <8>;
      -
      -       dev0_output_type         = <1>;
      -       dev0_output_mode         = <4>;
      +    screen0_output_type      = <3>;
      +    screen0_output_mode      = <10>;
      +
      +    screen0_output_format    = <0>;
      +    screen0_output_bits      = <0>;
      +    screen0_output_eotf      = <4>;
      +    screen0_output_cs        = <257>;
      +    screen0_output_dvi_hdmi  = <2>;
      +    screen0_output_range     = <2>;
      +    screen0_output_scan      = <0>;
      +    screen0_output_aspect_ratio = <8>;
      +
      +    screen1_output_type      = <1>;
      +    screen1_output_mode      = <4>;
      +
      +    dev0_output_type         = <4>;
      +    dev0_output_mode         = <10>;
              dev0_screen_id           = <0>;
      -       dev0_do_hpd              = <0>;
      -
      -       dev1_output_type         = <4>;
      -       dev1_output_mode         = <10>;
      -       dev1_screen_id           = <1>;
      -       dev1_do_hpd              = <1>;
      +       dev0_do_hpd              = <1>;
      

      改完成之后,在uboot-origin_master文件夹下与 linux-origin_master文件夹下都需要执行
      rm .stamp_built
      然后 在buildroot目录下 make all
      然后下载到sd卡,
      cat /dev/urandom > /dev/fb0 应该是全屏幕的雪花

      9.这个时候插入鼠标键盘虽然有打印消息但是没有/dev/input/ 这个时候需要在内核加入Event interface,
      修改完成还是需要 rm .stamp_built,烧入sd卡,这个时候就有/dev/input/eventx,这个时候鼠标与键盘还是不能用在qt5中。

      export QT_QPA_GENERIC_PLUGINS=tslib,evdevkeyboard:/dev/input/eventx,evdevmouse:/dev/input/eventx

      这个eventx需要根据实际情况来 这个时候qt5就支持键盘了.

      10.交叉编译QT5的NES模拟器,我在github下的,它那个需要很多的依赖,
      例如需要继承OPENGL。我后面就改成了,只要有最基本的库就可以了。(文件会随后发出来)
      qmake在 buildroot的output/host/bin目录下,有qmake就可以交叉编译。

      qt4-NES4_5_512_480_640_480.7z
      这个是QT5源文件,,qt4-NES4_5_512_480_640_480/Qt/hdl.nes 拷贝到根目录可以直接一运行,接上键盘就可以直接玩。
      1 2 A W S D L O通过这几个键就可以玩魂斗罗啦,嘻嘻。

      微信图片_20211013132647.jpg
      这个是我的HDMI显示器图

      for (y = 0; y < NES_DISP_HEIGHT; y++ )//240
      {
      for (x = 0; x < NES_DISP_WIDTH; x++ )//256
      {
      p=(WorkFrame+(y*NES_DISP_WIDTH)+x);
      ((WorkFrameX+(y<<1))+(x<<1))=*p;
      ((WorkFrameX+(y<<1))+((x<<1)+1))=*p;
      ((WorkFrameX+((y<<1)+1))+(x<<1))=*p;
      ((WorkFrameX+((y<<1)+1))+((x<<1)+1))=*p;
      }
      }
      这个是将图像放大两倍,mask一个标签
      infones的linux版本 绘制点是一点一点计算,如果屏幕比较大,应该就比较慢

      (文章转载自:WhyCan Forum 哇酷开发者社区 )
      (原文链接:https://whycan.com/t_7253.html )

      发布在 MR Series
      q1215200171
      budbool
    • 回复: 【FAQ】全志V853芯片 如何在Tina V85x平台切换sensor?

      @likehengall 签NDA

      发布在 V Series
      q1215200171
      budbool
    • 稚晖君又整活啦!基于全志F1C200s的超迷你&低成本开发板开源

      微信图片_20220406175415.png
      B站最强小电视(基于全志H3)

      微信图片_20220406175412.png
      钢铁侠机械臂

      曾经靠着“B站最强小电视”以及号称“钢铁侠机械臂”等硬核产品出圈的稚晖君又双叒叕来整活啦!

      微信图片_20220406193401.png

      这次稚晖君开源了基于全志F1C200s的一个超迷你&低成本的Linux开发板,项目名为Planck Pi,F1C200s采用的ARM9架构,SIP内置DDR的极简封装很适合作为Linux开发入门板卡。

      1.jpg 2.jpg

      稚晖君在个人的github仓库开源了软硬件所有资料,该项目内核版本用的5.4.77,移植了Debian系统,跟Ubuntu基本没有差异。

      项目资料获取方式:
      Github链接:https://github.com/peng-zhihui/Planck-Pi

      项目说明

      本项目是一个基于全志F1C200s芯片的超迷你&低成本的Linux开发板,本来是用于个人的某个小项目调试,现把所有硬件、软件(u-boot、内核、root-fs)开源出来。板卡成本应该不到50RMB,而且提供了很多资料,很适合用于新手作为入门Linux学习的开发板。

      板载资源:

      • 一个OLED 128x80
      • 一个麦克风 & 功放可以外接喇叭
      • 双面不同功能的Type-C接口分别提供USB转串口以及USB-OTG功能
      • 一个USB-A口用于外接设备
      • SD卡插槽
      • 引出绝大部分IO

      芯片介绍

      全志F1C200s是全志的一款高度集成、低功耗的移动应用处理器,可用于多种多媒体音视频设备中。

      全志F1C200s基于ARM 9架构,芯片集成了SiP的DDR,外围电路可以极其简单;它支持高清视频解码,包括H.264、H.263、MPEG 1/2/4等,还集成了音频编解码器和I2S/PCM接口,是一款开发简单、性价比较高的产品,也适合用来做入门级的Linux开发板。

      参数规格
      微信图片_20220406182453.png

      芯片框图
      68747470733a2f2f70656e677a68696875692d6d61726b646f776e2e6f73732d636e2d7368616e676861692e616c6979756e63732e636f6d2f696d672f32303232303430353137323935352e706e67.png

      硬件开发

      3.jpg
      原理图见仓库的源文件和PDF,需要说明的点是:

      板子的Type-C采用正反插不同功能,正面是USB转TTL串口功能,用于内核调试,反面是芯片的USB功能,在内核中我开启了USB的RNDIS网卡也就是说可以通过这个USB口模拟出一个网卡然后共享电脑的网络,也就不需要外接WiFi和以太网模块了很方便。
      由于芯片只有一个USB接口,因此为了能使板子作为Host外接其他设备,我在板卡上添加了一个OTG的跳线:

      4.jpg
      正常情况下不接跳线的话OTG功能为Device模式,也就是可以通过TypeC接口模拟网卡或者其他设备如MTP;当插上跳线帽之后,就可以作为Host在右边的A口插入USB设备了如U盘、键盘、鼠标等,注意此时C口的USB功能失效,需要通过串口登录板子。

      项目资料目录

      微信图片_20220406183634.png

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 泰酷辣!开源超迷你安卓手持终端CyberPad,芒果派惊喜之作

      ​继推出大小仅与普通SD卡不相上下爱的超迷你模组MCore-H616核心板之后,鸽了近半年时间的芒果派,又带来了一款惊喜之作——MCore-R818核心板。

      img_0806_2048-resized.jpg

      该款MCore的设计也是基于R818的特性,做出了一些小小的改变。

      芯片本体封装设计较小,核心板在3x3cm的大小下不仅预留了屏蔽罩安装接口,还集成起了R818+EMMC+LPDDR4+PMU四个部件,并提供2G+16G和4G+32G两种硬件配置。

      img_1007.jpg

      R818集成了用于UI渲染的GE8300 GPU,更侧重于处理本地的显示和CSI工作,可以直接驱动 DSI/LVDS/RGB 接口的屏幕,同时 13MP 摄像头的 ISP 还可以支持 1080P 的视频通话功能,并提供 800 万单摄或 500 万+ 200 万双摄两种方案。

      底板的设计一改往日芒果派精致小巧的风格,选择引出绝大部分功能资源。核心板与底板之间通过邮票孔的方式连接,得益于R818强大的音视频功能,底板上板载了3.1寸的电容触摸屏、RGB、MIPI等屏幕接口,还有15pin树莓CSI、OV2680、OV8858等摄像头接口,并板载了扬声器和mic音频接口。

      R818标准底板_Top.png

      微信图片_20230523105110.jpg

      资源:
      显示部分:

      • 板载3.1寸 800*480 电容触摸屏
      • RGB 40Pin输出,5寸屏,支持CTP
      • 树莓DSI-15pin显示输出
      • DSI+CTP 20pin显示接口,(dongshanpi MIPI屏)

      摄像头部分:

      • 树莓CSI-15pin
      • 800W,OV8858
      • 500W,OV5647
      • 200W,OV2680

      音频:

      • 板载扬声器1个
      • 板载双模拟mic

      通讯:

      • WiFi 12x12mm模组

      其他:

      • USB TypeC,支持快充,支持OTG
      • 锂电池接口,充放电
      • USB HOST 2.0 1个
      • TF卡
      • 系统按键:FEL,BOOT,电源。
      • ADC按键:安卓vol+,vol-
      • RGB LED 1个

      引出pin:
      UART0 (系统调试)
      UART2(通用)
      UART3(通用)
      SPI2
      TWI3
      若干IO

      目前芒果派已经对R818进行了全志Tina Linux以及Android 10的适配工作,并释放出了对应的SDK。

      安卓10在底板测试时的启动时间大概在20秒左右,电池电压为3.9V运行时,电流稳定在0.16A,而在安卓静态来回操作(没大型app)的情况下,主控在不加散热片的情况下依旧保持低温。

      img_0852-resized.jpg

      QQ图片20230523143727.jpg

      每一款新产品的诞生,往往都离不开创作过程中大开的脑洞。

      秉持小巧风格的芒果派终于还是对偌大的底板下手了,一款小巧的手持终端——CyberPad,也就应运而生了。(看起来是否有一种从开发板到实际产品应用的感觉呢~)

      CyberPad由屏幕、主板、电池以及转接板四个部分组成,芒果派为MCore重新设计了一块底板,该底板保留了屏幕和摄像头在内绝大部分的资源引出,并为了满足外接键鼠的需求,增加了一个Type-C接口。

      QQ图片20230523105351.jpg

      CyberPad目前还处在调试阶段,暂时未能实现量产,后续会搭配上一套新的外壳,并走DIY路线将CyberPad的相关PCB在官网进行开源;MCore-R818的核心板和底板则都会进行公开售卖,更多详细信息请前往芒果派官网了解。

      芒果派官网:mangopi.org
      芒果派淘宝店:https://widora.taobao.com/

      发布在 A Series
      q1215200171
      budbool
    • 麻雀d1s编译修复adb和phoenixsuit连接问题
      • 修复pc连接电脑掉电问题;
      • 修复phoenixsuit连接问题;

      修复pc连接电脑后掉电问题

      官方的tina编译出来之后,连接电脑,如果使用了otg口,会导致这个开发板不断的断开和重连.

      而且串口不断地打印断连重连的信息.有这个报错信息:

      WARN: get power supply failed\n
      

      看起来是和供电有关的问题,我在网上找到这个文章.

      作者说这是因为开发板连接usb之后会把某个电流限制到500ma.我们可以改一下

      在文件tina-d1-open/lichee/linux-5.4/drivers/usb/sunxi_usb/udc/sunxi_udc.c中,修改函数sunxi_set_cur_vol_work.

      void sunxi_set_cur_vol_work(struct work_struct *work)
      {
      #if !defined(SUNXI_USB_FPGA) && defined(CONFIG_POWER_SUPPLY)
              struct power_supply *psy = NULL;
              union power_supply_propval temp;
      
              if (of_find_property(g_udc_pdev->dev.of_node, "det_vbus_supply", NULL))
                      psy = devm_power_supply_get_by_phandle(&g_udc_pdev->dev,
                                                           "det_vbus_supply");
      
              if (!psy || IS_ERR(psy)) {
                      DMSG_PANIC("%s()%d WARN: get power supply failed\n",
                                 __func__, __LINE__);
              } else {
                      temp.intval = 2500; //改为2500ma
      
                      power_supply_set_property(psy,
                                              POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, &temp);
              }
      #endif
      }
      

      改完之后编译打包,这个现象不会出现了.

      修复phoenixsuit连接问题

      修改文件tina-d1-open/lichee/brandy-2.0/u-boot-2018/drivers/sunxi_flash/mmc/sdmmc.c中的sunxi_sprite_mmc_probe函数:

      int sunxi_sprite_mmc_probe(void)
      {
      #ifndef CONFIG_MACH_SUN50IW11
              return sdmmc_init_for_sprite(0, 0); //修改了这里.
      #else
              int workmode = uboot_spare_head.boot_data.work_mode;
              if (workmode == WORK_MODE_CARD_PRODUCT)
                      return -1;
              else
                      return sdmmc_init_for_sprite(0, 0);
      #endif
      }
      

      改了之后就可以直接用phoenixsuit来刷机.而不需要使用读卡器.

      文章作者: zzidun pavo
      文章链接: https://zzidun.github.io/2022/02/08/ma-que-d1s-bian-yi-xiu-fu-adb-he-phoenixsuit-lian-jie-wen-ti/

      发布在 MR Series
      q1215200171
      budbool
    • 回复: 自制V853机载视觉中枢

      @zyhao712 越来越期待成品无人机👍 👍 👍

      发布在 V Series
      q1215200171
      budbool
    • 【FAQ】全志R11移植camera senor时报I2C错误如何解决?

      在移植sensor时,最常遇到的问题是I2C通信失败,下面将就I2C通信失败问题进行相应的debug。

      DEBUG流程

      • 确认sys_config.fex中配置的sensor I2C地址是否正确(sensor datasheet中标注,读地址为0x6d,写地址为0x6c,那么sys_config.fex配置sensorI2C地址为0x6c);

      • 在完成以上操作之后,在senor上电函数中,将掉电操作屏蔽,保持sensor一直上电状态,方便debug;

      • 确认I2C地址正确之后,测量sensor的各路电源电压是否正确且电压幅值达到datasheet标注的电压要求;

      • 测量MCLK的电压幅值与频率,是否正常;

      • 测量sensor的reset、pown引脚电平配置是否正确,I2C引脚SCK、SDA是否已经硬件上拉;

      • 确认I2C接口使用正确并使能(CCI / TWI);

      • 如果还是I2C出错,协调硬件同事使用逻辑分析仪等仪器进行debug;

      经典错误

      1、I2C没有硬件上拉

      twi_start()450 - [i2c2] START can't sendout!
      twi_start()450 - [i2c2] START can't sendout!
      twi_start()450 - [i2c2] START can't sendout!
      [VFE_DEV_I2C_ERR]cci_write_a16_d16 error! slave = 0x1e, addr = 0xa03e, value = 0x  1
      

      出现上述的问题是因为SDA、SCK没有拉上,导致在进行I2C通信时,发送开始信号失败,SDA、SCK添加上拉即可。

      2、没有使能I2C

      [VFE]Sub device register "ov2775_mipi" i2c_addr = 0x6c start!
      [VFE_ERR]request i2c adapter failed!
      [VFE_ERR]vfe sensor register check error at input_num = 0
      

      出现上述的错误,是因为使用twi进行I2C通信但没有使能twi导致的错误。

      3、混用 cci 和 twi

      通过查看原理图确认,sensor是通过什么接口与主控进行通信的,在确认硬件连接没有问题的情况下,可查看出错时的log信息得知当前使用的接口。

      • 如果当前配置使用 CCI 进行 I2C 通信,出错将会报“[VFE_DEV_CCI_ERR]”或者“[VIN_DEV_CCI_ERR]”;

      • 如果当前配置使用的是 TWI 进行 I2C 通信,出错将会是“[VFE_DEV_I2C_ERR]”或者“[VIN_DEV_I2C_ERR]”;
        在出现问题的时候,可以注意 I2C 的错误打印信息,看看是什么标号开头的,这样可以确定,本身应该使用 TWI 的,但却报”[VFE_DEV_CCI_ERR]“错误,这个时候可以检查,是不是关于 cci 的配置没有弄好,相应的配置没有失能或者屏蔽,或者是定义了 USE_SPECIFIC_CCI 宏。

      4、sensor上电时序不对

      在sensor的上电过程,加上一定的延时是必要的。在主控输出MCLK、设置电源等操作之后,立刻sensor detect读取I2C,有可能会导致I2C读写失败的。因为这个时候,senor内部硬件没有准备好,这时候读写I2C将会出错,所以需要在上电之后,加上一定的延时操作。

      附件:FlameGraph.tar.xz

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【FAQ】全志R128芯片 在FreeRTOS下如何查看并更改各CPU核的默认运行频率?

      1.主题

      FreeRTOS_R128_如何查看并更改各CPU核的默认运行频率

      2.问题背景

      硬件:R128
      软件:FreeRTOS

      客户在日常开发过程中,需要评估各CPU核的默认运行频率,有时候需要降低默认运行频率来降低功耗,有时候又需要提升默认运行频率来增加算力。
      那么如何从查看并更改R128上各CPU核的默认运行频率?

      3.解决办法

      查看各CPU核默认运行频率
      默认启动各个CPU核时会打印对应CPU核的运行频率,如下图所示:
      启动日志中的CPU核频率打印.jpg

      更改各CPU核默认运行频率方法
      由于R128中各CPU核的默认运行频率是M33核上的代码配置的,因此只需修改M33核的代码即可。
      具体步骤为:

      • 首先通过执行crtos命令切换到rtos代码目录,rtos代码目录路径为:lichee/rtos
      • 然后修改文件arch/arm/armv8m/sun20iw2p1/sun20i.c里设置相关时钟频率的地方

      M33核

      M33核相关时钟硬件如下图:
      M33核时钟树.jpg

      目前SDK中M33核时钟ar200a_hclk的来源为:DPLL1输出时钟经过第一个分频器输出ck1_m33时钟,然后通过第二个分频器输出sysclk钟,最后通过一个多路选择器输出ar200a_hclk。

      DPLL1输出时钟的频率已经确定为1920M,因此要修改M33核的时钟,则只需要修改这2个分频器的分频值即可。

      由于SDK中默认将第一个分频器的分频值定为5(此分频器的分频值取值范围为4-8),也即ck1_m33时钟频率为1920/5=384M,而第二个分频器的分频值取值范围为1-16,因此如果要修改的M33核时钟频率在24M到384M之间且可以被384M整除,则只需要修改第2个分频器的分频值,例如将M33核默认运行频率修改为128M,则只需修改宏AR200A_FREQ即可,如下所示:

      diff --git a/arch/arm/armv8m/sun20iw2p1/sun20i.c b/arch/arm/armv8m/sun20iw2p1/sun20i.c
      index 9b8c1cb1..c09444fc 100755
      --- a/arch/arm/armv8m/sun20iw2p1/sun20i.c
      +++ b/arch/arm/armv8m/sun20iw2p1/sun20i.c
      @@ -445,7 +445,7 @@ static void rcosc_init(void)
       #define DPLL1_FREQ     (1920000000)
       #define DPLL2_FREQ     (1920000000)
       #define DPLL3_FREQ     (1600000000)
      -#define AR200A_FREQ    ( 192000000)
      +#define AR200A_FREQ    ( 128000000)
       #define DEVICE_FREQ    ( 192000000)
       static int sys_clk_init(void)
       {
      

      若要修改的M33核时钟频率不满足上述条件,则需要同时修改函数ar200a_clk_set里设置ck1_m33时钟频率的地方,例如修改ck1_m33时钟为240M(1920/8=240M):

      diff --git a/arch/arm/armv8m/sun20iw2p1/sun20i.c b/arch/arm/armv8m/sun20iw2p1/sun20i.c
      index 9b8c1cb1..29b71137 100755
      --- a/arch/arm/armv8m/sun20iw2p1/sun20i.c
      +++ b/arch/arm/armv8m/sun20iw2p1/sun20i.c
      @@ -190,7 +190,7 @@ static int ar200a_clk_set(u32 freq)
              /*fixed 384M*/
              //sr32(CCMU_AON_BASE+0xa4,  0, 3, 0x3);
              //0x4004c4a4: 0x8080000b
      -       ret = hal_clk_set_rate(clk_ck1_m33, 384000000);
      +       ret = hal_clk_set_rate(clk_ck1_m33, 240000000);
              if (HAL_CLK_STATUS_OK != ret) {
                      ret = -1;
                      goto err2;
      

      C906核
      C906核相关时钟硬件如下图:
      C906核时钟树.jpg

      目前SDK中C906核时钟rv_sys_clk的来源为:DPLL1输出时钟经过第一个分频器输出ck1_906时钟,然后通过第二个分频器输出rv_sys_clk时钟。

      DPLL1输出时钟的频率已经确定为1920M,因此要修改C906核的时钟,则只需要修改这2个分频器的分频值即可,第一个分频器的分频值可取2、2.5、3、4、7,第二个分频器的分频值可取1、2、4、8。

      例如将C906核默认运行频率修改为320M,需要修改sun20i_boot_c906函数中2处设置频率的地方,:

      diff --git a/arch/arm/armv8m/sun20iw2p1/sun20i.c b/arch/arm/armv8m/sun20iw2p1/sun20i.c
      index 9b8c1cb1..5798657b 100755
      --- a/arch/arm/armv8m/sun20iw2p1/sun20i.c
      +++ b/arch/arm/armv8m/sun20iw2p1/sun20i.c
      @@ -596,7 +596,7 @@ int sun20i_boot_c906(void)
      
              //set clk_ck1_c906 clk to 480M
              //sr32(CCMU_AON_BASE+0xa4,  4, 3, 0x1);
      -       ret = hal_clk_set_rate(clk_ck1_c906, 480000000);
      +       ret = hal_clk_set_rate(clk_ck1_c906, 640000000);
              if (HAL_CLK_STATUS_OK != ret) {
                      ret = -1;
                      goto err2;
      @@ -632,7 +632,7 @@ int sun20i_boot_c906(void)
              //set clk_ck_c906_div to 480000000;
              //sr32(CCMU_BASE+0x064, 0, 2, 0x0);
              clk_c906_div = hal_clock_get(HAL_SUNXI_CCU, CLK_RISCV_DIV);
      -       ret = hal_clk_set_rate(clk_c906_div, 480000000);
      +       ret = hal_clk_set_rate(clk_c906_div, 320000000);
              if (HAL_CLK_STATUS_OK != ret) {
                      ret = -1;
                      goto err6;
      

      PS:由于第一个分频器无法输出320M时钟,故先配置第一个分频器输出640M的ck1_c906时钟,然后由第二个分频器再进行2分频,从而得到320M的C906核时钟。

      DSP核
      DSP核相关时钟硬件如下图:
      DSP核时钟树.jpg

      目前SDK中DSP核时钟dsp_sys_clk的来源为:DPLL3输出时钟经过第一个分频器输出ck3_hifi5时钟,然后通过第二个分频器输出dsp_sys_clk时钟。

      DPLL3输出时钟的频率已经确定为1600M,因此要修改DSP核的时钟,则只需要修改这2个分频器的分频值即可,第一个分频器的分频值可取3、4、5、6、7,第二个分频器的分频值可取1、2、4、8。

      例如将DSP核默认运行频率修改为320M,只需修改宏DSP_CORE_CLOCK_FREQ即可,:

      diff --git a/arch/arm/armv8m/sun20iw2p1/sun20i.c b/arch/arm/armv8m/sun20iw2p1/sun20i.c
      index 9b8c1cb1..97d03ad7 100755
      --- a/arch/arm/armv8m/sun20iw2p1/sun20i.c
      +++ b/arch/arm/armv8m/sun20iw2p1/sun20i.c
      @@ -703,7 +703,7 @@ err1:
      
       #if defined(CONFIG_ARCH_ARMV8M_DEFAULT_BOOT_DSP) || defined(CONFIG_COMMAND_BOOT_DSP) \
              || defined(CONFIG_PM_SUBSYS_DSP_SUPPORT)
      -#define DSP_CORE_CLOCK_FREQ (400000000)
      +#define DSP_CORE_CLOCK_FREQ (320000000)
       #define DSP_LDO_WORK_VOLT (1200) //400M@1.2V, 274M@1.1V
       int __sun20i_boot_dsp_with_start_addr(uint32_t dsp_start_addr)
       {
      

      另外目前SDK代码中第一个分频器和第二个分频都配置成了相同的频率,若第一个分频器无法直接输出想要设置的频率,则需要分别将2个分频器配置成不同的输出频率。例如将DSP核默认运行频率修改为200M,第一个分频器最低输出时钟频率为1600/7=228.57M,无法直接输出200M,因此需要先配置第一个分频器输出400M的ck3_hifi5时钟,然后由第二个分频器进行2分频从而得到200M的dsp_sys_clk时钟,主要修改如下所示:

      diff --git a/arch/arm/armv8m/sun20iw2p1/sun20i.c b/arch/arm/armv8m/sun20iw2p1/sun20i.c
      index 9b8c1cb1..53f6828a 100755
      --- a/arch/arm/armv8m/sun20iw2p1/sun20i.c
      +++ b/arch/arm/armv8m/sun20iw2p1/sun20i.c
      @@ -703,7 +703,7 @@ err1:
      
       #if defined(CONFIG_ARCH_ARMV8M_DEFAULT_BOOT_DSP) || defined(CONFIG_COMMAND_BOOT_DSP) \
              || defined(CONFIG_PM_SUBSYS_DSP_SUPPORT)
      -#define DSP_CORE_CLOCK_FREQ (400000000)
      +#define DSP_CORE_CLOCK_FREQ (200000000)
       #define DSP_LDO_WORK_VOLT (1200) //400M@1.2V, 274M@1.1V
       int __sun20i_boot_dsp_with_start_addr(uint32_t dsp_start_addr)
       {
      @@ -752,7 +752,7 @@ int __sun20i_boot_dsp_with_start_addr(uint32_t dsp_start_addr)
      
           //set clk_ck3_hifi5 clk to 400M
           //sr32(CCMU_AON_BASE+0xa8,  8, 3, 0x3);
      -    ret = hal_clk_set_rate(clk_ck3_hifi5, DSP_CORE_CLOCK_FREQ);
      +    ret = hal_clk_set_rate(clk_ck3_hifi5, 400000000);
           if (HAL_CLK_STATUS_OK != ret) {
               ret = -1;
               goto err2;
      

      修改完成后重新编译M33核固件,因为R128中各CPU核的默认运行频率是M33核上的代码配置的。
      可先执行lunch_rtos选择对应方案的M33核,然后再执行mrtos编译以及执行pack命令打包固件。

      下图是修改M33核频率为128M、C906核频率为320M、DSP核频率为320M后的效果:
      修改默认运行频率.jpg

      发布在 A Series
      q1215200171
      budbool
    • 华清远见推出基于全志D1-H的嵌入式RISC-V实验箱

      这是华清远见首次使用全志芯片推出实验箱走进高校实验室,D1-H使用的是阿里平头哥的RISC-V C906核心,同时集成了大量全志自研IP,这将极大地提升国内高校嵌入式教育的国产化程度,让课程和实验都在自主可控的科研环境下进行。

      全志D1-H主板

      640.jpg

      主板采用全志的D1-H芯片为主控平台,D1-H是全球首颗量产的搭载平头哥玄铁906 RISC-V的应用处理器,支持RVV,1GHz+主频,可支持Linux系统。同时支持最高4K的H.265/H.264解码,最高可外接2GB DDR3,可以应用于智慧城市、智能汽车、智能商显、智能家电、智能办公和科研教育等多个领域。

      主板采用底板+核心板结构、核心板采用6层板设计、底板和核心板采用BTB连接器,方便插拔,且比传统插针稳定可靠,同时也配备了一块7寸电容触控屏。

      主板上留有2个2.54MM间距,双排插孔,50PIN标准Arduino插座,可以更换核心板运行不同的操作程序。

      配套Linux系统编程实验Linux网络编程实验、Linux设备驱动实验、综合项目案例,更加方便学习,易上手。

      嵌入式RISC-V实验箱

      640 (1).png

      实验箱分为两层结构,上层实验层,下层储物层,储物层的存放各种接线、传感器、一件还原节点等;主板带管理锁,方便储物层的设备安全管理;针对实验功能,实验箱具有整体化、一体化设计,铝合金包边,承重抗压不易变形。

      640 (2).png 图片

      D1-H可以独立直接访问3个标准的Arduino板载扩展接口及资源;也可以D1-H通过串口通信间接访问,再由串口通信直接访问控制3个标准的Arduino板载扩展接口及资源,形成微处理器+微控制器的复合应用。

      除了主控板之外,实验箱内还有若干外接的拓展板。

      • RISC-V核心板
      • 4G/GPS二合一模块
      • 无线传感网节点
      • 传感器模块
      • arduino键盘控制扩展板
      • arduino电机控制扩展板
      • arduino传感器扩展板
      • RFID模块
        *......

      华清远见

      在科研教育领域华清远见已深耕多年,科研中心推出的嵌入式、物联网、人工智能、AIoT虚拟仿真实验室已广泛应用于包括武汉大学、哈尔滨工业大学、北京邮电大学等知名高校,在业内拥有极高的知名度及认可度。

      640 (1).jpg
      于武汉大学完成物联网、嵌入式ARM实验箱的验收培训

      640 (2).jpg
      为山东大学搭建的高级自动驾驶飞行控制平台

      640 (3).jpg
      为沈阳工业大学搭建的人工智能实验室

      全志科研教育领域发展

      全志目前已经和中科院软件所、清华大学、同济大学、华侨大学、挪威科技大学等高校及科研机构达成了科研教育合作意向,未来全志将继续积极助力高校科研和教育行业,促进产学研合作。
      640 (4).jpg
      同济大学分享现场

      640 (4).png
      《挪威科技大学使用全志D1哪吒开发板开设操作系统课程》

      发布在 MR Series
      q1215200171
      budbool
    • 【FAQ】全志V85x芯片 OTA升级失败出现"Found installer for stream recovery ubivol"以及"cannot write 16384 bytes: Operation not permitted"报错如何解决?

      1.主题

      OTA升级失败出现"Found installer for stream recovery ubivol"以及"cannot write 16384 bytes: Operation not permitted"报错

      2.问题背景

      软件:Tina

      3.问题描述

      3.1复现步骤

      1. 在服务器生成OTA升级包。
      2. 将OTA升级包推入小机端,执行升级命令。
      3. 升级失败。

      3.2具体表现

      OTA升级失败,通过命令 cat /mnt/UDISK/swupdate.log查看升级失败log,出现 “cannot write 16384 bytes: Operation not permitted” 或 “Found installer for stream recovery ubivol” 错误。

      4.问题分析

      通过两条报错可以猜测,不允许操作,不能写入,以及报ubivol等问题。

      可以在设备端确认当前介质,执行ll dev/by-name确认(例:当前为emmc介质,为mmc*,如果为nand ubi介质为ubi* 或 nand*)
      137b03d7657e480f9684c6ff726b293e.jfif

      5.根本原因

      升级包的中文件的介质与当前板子的介质不对应,不能操作分区。

      6.解决办法

      1. 对于非ubi方案,无需选中 CONFIG_SWUPDATE_CONFIG_UBIVOL选项,在打包OTA包时,命令无需使用ubi后缀。
      2. 对于ubi方案,需要选中MTD:SWUPDATE_CONFIG_MTD选项,再选中 CONFIG_SWUPDATE_CONFIG_UBIVOL 选项,在打包OTA包时,使用ubi后缀,例如:swupdate_pack_swu -ubi 或 swupdate_pack_swu -ab-ubi。
      3. 以上操作在recovery升级中,在menuconfig和ota_menuconfig中都要执行,而AB升级,在menuconfig中执行即可。
      发布在 V Series
      q1215200171
      budbool
    • 全志XR806 Freertos+XRMCU+ADC采样频率偏低

      1.主题

      Freertos+XRMCU+ADC采样频率偏低

      2.问题背景

      硬件:XRMCU
      软件:freertos + ADC

      3.问题描述

      3.1复现步骤

      使用SDK自带的example/adc。

      修改adc_callback,adc_callback为中断回调,该函数的调用频率和ADC的频率一致,在该函数里面加一个IO口翻转。

      编译并烧录。

      用示波器或逻辑分析仪,检查IO口翻转频率和ADC_FEQ是否一致。

      3.2具体表现
      通过逻辑分析仪检查,实际ADC采样频率只有ADC_FEQ设置的1000分之一。

      4.问题分析

      读取ADC的所有相关寄存器,发现ADC使用的并不是默认时钟,而是低速时钟。高速时钟大约是40M,低速时钟是32K,大约相差1000倍,和测试结果相符。

      5.根本原因

      ADC的时钟选择已经在ROM化代码HAL_ADC_Init中写死,如下所示:

      __rom_xip_text
      HAL_Status HAL_ADC_Init(ADC_InitParam *initParam)
      {
          ……
          HAL_CCM_GPADC_SetMClock(CCM_APB_PERIPH_CLK_SRC_LFCLK, CCM_PERIPH_CLK_DIV_N_1, CCM_PERIPH_CLK_DIV_M_1);
          ……
      }
      

      即使外部再怎么修改修改时钟也不会生效。

      6.解决办法

      默认使用低速时钟的原因时,可以让ADC在低功耗模式时,依旧可以运行,而且ADC频率过高时,容易因为频繁进出中断导致程序卡死。
      如果希望设置成高速时钟,需要把src/rom/rom_bin/src/driver/chip/hal_adc.c部分的代码去ROM,如果设置的频率偏高,请使用burst模式。

      发布在 其它全志芯片讨论区
      q1215200171
      budbool
    • 【全志R329】R329开发板上的周易AIPU语音识别实战(PPT+视频)

      近期,极术社区联合矽速科技组织了搭载周易AIPU处理器的R329开发板申领活动,很多工程师进行了评测,但是如何能够更有效得利用周易AIPU来进行AI应用的部署开发呢?请关注本期由矽速科技CTO吴长泽带来的公开课。

      分享内容

      全志科技在2020年发布了搭载安谋科技“周易”AIPU的AI语音专用芯片R329,它主攻智能语音市场,其高算力、低功耗的特性引起了行业内的广泛关注。 本期课程将分享在矽速科技的MaixSense R329开发板上利用“周易”AIPU快速进行实时语音识别功能的全流程实现过程,让大家了解“周易”AIPU Compass SDK的强大,同时大家可以在开发板上DIY属于自己的智能语音助理。

      以下是内容大纲

      • 矽速MaixSense R329开发板软硬件介绍

      • “周易”AIPU Compass SDK简介及使用技巧

      • R329开发板上的视觉算法部署简介

      • 端侧LVCSR(大词汇量连续语音识别)算法实现

      视频及PPT

      • 视频观看地址:https://aijishu.com/l/1110000000226394

      • PPT部分预览(文末提供下载)

      a.png
      b.png
      c.png

      Q&A精选

      如果大家有对周易 Z2 AIPU/R329的问题,欢迎在此提问 https://aijishu.com/t/aipu/questions

      嘉宾简介

      吴才泽 Caesar Wu

      d.jfif

      Sipeed 矽速科技 CTO

      Caesar 毕业于浙江大学,拥有多年嵌入式软硬件设计经验,熟悉端侧AIoT算法优化部署。他开发的矽速MAIX开源AIoT产品系列深受国内外工程师及创客欢迎,目前他组织的MaixPy开源项目在github star已超过1K 。

      本次视频分享为周易"AIPU"系列第五期,前四期请点击下方链接。

      第一期|Arm中国周易“AIPU”初探
      第二期|快速贯通全志智能语音技术,R329专用处理器大剖析
      第三期|全志Tina-Linux软件平台及R329应用开发介绍(视频+PPT)
      第四期|Arm中国周易Z2 AIPU概述(视频+PPT)

      欢迎关注周易"AIPU"专栏获取周易"AIPU"更多技术干货等。

      (文章转载自:极术社区 极术小姐姐)
      (原文链接:https://aijishu.com/a/1060000000230794 )

      发布在 A Series
      q1215200171
      budbool
    • 1
    • 2
    • 1 / 2