KDocs 研发资料库
  • 视频技术应用资料与文档入口汇总
  • Window下使用Makefile编译代码教程
  • AC52系列PWM使用说明文档
  • AC57系列PWM使用说明文档
  • 52 系列_串口外设的使用说明
  • 57 系列_串口外设的使用说明
  • AC52系列SPI使用说明文档
  • AC57系列SPI使用说明文档
  • AC52系列外部中断使用说明文档
  • AC57系列外部中断使用说明文档
  • AC54&56外部中断使用说明文档
  • AC52 红外捕获中断demo使用说明文档
  • 视频系列SDK汇总及获取方法
  • AC52系列软件典型问题整理文档获取
  • AC791N开发-入门到进阶开发指导文档(完善ing)
  • AC792N开发-入门到进阶开发指导文档(完善ing)
  • 792 littlefs文件系统配置
  • 792N系列 U盘单备份升级说明
  • 792x串口uart升级说明参考

AC792N开发-入门到进阶开发指导文档(完善ing)

📎 原始文档:https://www.kdocs.cn/l/cgESw1sY7o5H AC792N开发-入门到进阶开发指导文档(完善ing)

📌杰理工具说明文档:

(程序开发工具、固件处理工具、量产相关工具)
欢迎使用杰理工具文档 — JL Project Documentation

📌AC792N文档

https://doc.zh-jieli.com/AC792/zh-cn/wifi_video_master/index.html

一 : 硬件以及工具相关

1.1.1 硬件环境搭建

1.准备一块杰理 AC792N开发板
本文档以该开发板为例进行开发说明
开发板购买首页首页-杰理科技-淘宝网
image 2. 准备一台 PC 主机(运行 Windows )
windows 建议64位系统
3.准备一根带数据线的公对公 USB 线(例如TYPE-A 转 TYPE-C)
硬件调试步骤可参考如下文档
AC792N芯片外设调试指南V1.0.pdf
AC792N硬件调试指南V1.0.pdf

二: 软件环境搭建

2.1.1 编译器获取

杰理编译器 和vscode
CodeBlocks 集成开发环境 (建议 Windows 7 以上版本)
CodeBlocks既可以从官方网站下载,也可以直接从杰理网站镜像的地址下载。

  • 杰理工具管理网站安装。
    • 在浏览器中打开链接:http://pkgman.jieliapp.com/s/codeblocks
    • 双击下载后的 codeblocks-latest.exe ,按照提示进行安装即可 CodeBlocks官方网站安装。
  • 首先打开网址:http://www.codeblocks.org/downloads/ ,点击如图所示的 Download the binary release Visual Studio Code 方式
    下载网址: https://ruanjian.bzyinxiao6.com/soft/90656.html
    安装方式请查找网上说明

2.1.2 sdk编译和下载

2.1.2.0 codeblock方式编译
从gitee上拉取所需要的版本 https://gitee.com/Jieli-Tech/fw-AC792_SDK
image 进入工程路径里面包含wifi_bbm , wifi_camera, wifi_ipc以及wifi_story_machine工程(具体代码工程支持哪类产品开发,可和杰理工程人员沟通确认)
我们以wifi_camera工程为列
image 进入.cbp所在的工程路径 双击打开AC792N_WIFI_CAMERA.cbp工程
image 点击如下选项进行编译即可
image

至此编译完成,可进行烧录程序
image

2.1.2.1 vscode 编译

image vscode打开后选择terminal中的Run Task
imageimage 如下即编译完成,当设备进入烧录模式时,也可以直接进行编译和烧录
image 若工程中有新增减文件,可按照Makefile规则去编辑和编译

2.1.3 sdk固件中增加key方式

  • 普通key
  1. 把xxx.key文件放入sdk/cpu/wl83/tools文件夹中
  2. 修改sdk/cpu/wl83/tools/download.c中 image 把注释REM去掉
REM set KEY_FILE=-key JL_792N-XXXX.key

修改为(注意key文件名改成实际的文件名)

set KEY_FILE=-key JL_792N-XXXX.key
  • 二级key
  1. 把xxx.key1和xxx.mkey文件放入sdk/cpu/wl83/tools文件夹中
  2. 修改sdk/cpu/wl83/tools/download.c中 image 把注释REM去掉
REM set KEY_FILE=-key1 JL_792N-XXXX.key1 -mkey JL_792N-XXXX.mkey

修改为(注意key文件名改成实际的文件名)

set KEY_FILE=-key1 JL_792N-XXXX.key1 -mkey JL_792N-XXXX.mkey

具体说明见下文
二级秘钥使用说明 V1.2_20220809.pdf
注意AC791N系列只能用一拖二烧录使芯片带key,无法通过一拖八烧录使芯片带key
AC792N系列可以用一拖二或者一拖八烧key
AC791N和AC792N一拖二和一拖八烧录说明.otl

  • 是否需要烧key 客户自行决定,未烧key也可以生产,
  • 普通key 和二级key 的区别 如果普通加密使用普通key,二级key使用场景:
    1.公司 A 出售芯片给公司 B。
    2.公司 A 开发一个 SDK 提供给公司 B 做二次开发。
    双向保护机制:
    1.公司 A 在自己的核心库里面配置好密钥后,可保护公司 A 的 SDK 不外泄。在没有获得授权的情况下SDK 无法正常运行,可避免公司 B 从其他渠道购买芯片运行公司 A 所开发的 SDK。
    2.公司 A 没有公司 B 的 key1 文件,公司 A 拿到 fw 文件之后也无法生产,从而保护了公司 B 二次开发之后新 SDK 的权益。

三: UI工具以及使用说明(此处请继续完善)

3.0 UI章节使用说明 注意事项

UI编辑器下载链接:
https://doc.zh-jieli.com/AC792/JieLiGuiBuilder/JieLiGuiBuilder-setup-0.0.15-20241210.exe
针对已注册UI工具的开发者, 请阅读fw-AC792_SDK\ui_prj <UI工具使用指南>, 使用在线更新UI工程模板功能;
针对未注册UI工具的开发者, 只能使用离线方式下载UI工程,
阅读fw-AC792_SDK\ui_prj\README.md 下载后务必解压到本目录下,否则产生错误:
关于ui工具版本以及sdk 内核版本对应兼容关系
\fw-AC792_SDK\sdk\apps\common\lvgl_v8\lvgl.h中找到sdk内核版本
image 则按如下方式查找对应工具版本,如不匹配则更新到对应版本
image 注意:本章基于wifi camera工程讲解UI。

  1. 先仔细阅读 fw-AC792_SDK\ui_prj\UI工具使用指南.md 文档 获取UI工程(注意用模版方式创建,不要用离线ui工程可能没及时更新)
  2. 确保当前sdk版本是否和UI工程版本对应,若没有需要更新工具版本以及从GUI市场 市场项目中下载获取相应UI版本 imageimage

image

image 点击对应风格的ui模版,进行打包或编译
image

  1. UI 风格选择 sdk 中代码部分头文件app_config.h中需要配置对应的ui 风格

image 4. UI工具和控件的使用说明 这部分可查看UI工具中的其它->文档,里面有教程和使用案例。
imageimage

3.1 LY风格公版UI说明

3.1.1 简介

   LY UI工程是按键操作的UI工程,跟之前AC57xx、AC52xx和AC56xx中用的LY风格的UI类似,大部分UI操作跟之前LY风格UI一样。  

在JieLiGuiBuilder UI工具中,点击下面dvr_ly_800x480项目进入LY风格UI工程。
image 进入后会看到如下所示的页面
image 要在工程中使用LY风格的UI,需要在app_config.h下打开宏CONFIG_UI_STYLE_LY_ENABLE,如下
image 工程中LY风格UI代码在如下路径下
custom文件夹:是各页面的UI业务代码,是由用户编写并最终在JieLiGuiBuilder UI工具中打包拷贝到如下工程路径中;
generated文件夹:是由JieLiGuiBuilder UI工具生成的各页面lvgl初始化代码,该部分代码绝大多数是JieLiGuiBuilder UI工具自动生成,其中有一些事件回调中的代码是用户在JieLiGuiBuilder UI工具中添加。
image 按键操作UI时,需要将设备的按键消息跟LVGL的按键消息映射起来,这部分的对应关系在custom.c文件中。例如设备的MODE键消息是对应LVGL中的RIGHT消息等,具体关系如下:
image 详细的按键消息流程,可查看下面文档
AC792x按键消息流程.docx

3.1.2 usb_slave页面 - 行车记录仪USB页面

   usb_slave页面是当设备通过usb接到电脑时,弹出显示出来的一个页面,该有3个选项,分别可进入存储器模式、PC摄像头模式和录像模式。  

关键应用层代码:ui_action_usb.c,主要包含usb页面显示隐藏逻辑、USB页面加载卸载回调函数(显示隐藏之后要实现的动作)
usb_slave页面下按键进入选项的流程,下面以进入存储器为例
imageimage Q:什么时候显示和隐藏usb界面?
A:当792检测到usb上线或者下线事件的时候。以WiFicamera工程举例,如图:
image Q:USB页面加载卸载回调函数(显示隐藏),需要appcore切换模式应该如何做?。
A:公版ui_action_usb.c有代码演示,如图
image

3.1.3 video_rec页面 - 行车记录仪录像模式页面

录像页面主要分为预览界面和设置菜单界面,进入录像页面后默认显示预览界面。预览界面主要显示录像模式下各设置的状态信息和日期、车牌号等。如下:
image 在预览界面下按设备的MENU键打开录像设置菜单,按键消息会在view_scan容器控件中接收处理。打开录像设置菜单的UI动作如下
imageimage 打开设置菜单后,显示如下界面。在这个界面下按设备的UP和DOWN键可上下选中设置项,再OK键就进入设置项的子菜单,按MENU键则打开系统设置菜单界面。
image 所有设置项都是在这个容器里面
image 上面菜单中的设置项容器都加了事件冒泡,会将按键消息传到父控件view_menu中统一处理
image view_menu容器控件中处理的按键消息有两种,一个是设备按下OK键时显示出子菜单的处理,另一个是设备按下MENU键时打开系统菜单
image 子菜单是以弹窗的方式显示出来,这时根据保存在VM中的选项参数去聚焦和高亮相应的选项,如下:
image 在子菜单中按设备的OK键即可隐藏子菜单返回,同时会将当前选中的选项配置保存到flash中。子菜单中按MENU键也可返回。这些操作是在子菜单的容器中统一处理,如下:
image

3.1.4 video_photo页面-行车记录仪拍照模式页面

video_photo页面的UI处理流程跟video_rec页面的一样,也分为两大界面,预览界面和设置界面,跟video_rec页面的主要差异是一些状态图标和设置菜单的差异。这里就不再重复介绍,具体框架和流程可查看上面video_rec页面的介绍。
下面讲解下,是怎么从video_rec录像页面切到video_photo拍照页面。
在video_rec页面的预览界面下,按设备的MODE键可切到video_photo页面,这个切换的动作是在view_scan控件中接收按键消息去处理,如下:
image

3.1.5 行车记录仪回放页面(video_dir、video_file和video_play)

回放相关的页面一共有3个,分别是文件夹页面(video_dir)、文件九宫格页面(video_file)和播放页面(video_play)。如下:
image

3.1.5.1 video_dir页面-文件夹页面

进入回放页面时默认是显示video_dir页面,显示当前tf卡中的有文件夹的图标。其中进入回放页面是只有在video_photo页面中的预览界面下,按设备的MODE键。如下:
image

3.1.5.2 video_file页面-文件浏览器页面

该页面为记录仪的文件浏览器页面,包含文件删除、文件保护、文件查看等操作。
image

文件浏览器页面显示入口:
image

3.1.5.2 video_play页面-文件播放页面

文件播放页面跳转入口:
image

3.2 JL触摸风格公版UI说明

3.2.1 简介

   JL UI工程是同时支持触摸屏和按键操作的记录仪UI工程。主要涉及的UI页面有:  
  • USB界面
  • VIDEO_REC录像模式界面
  • 主页面
  • 顶层系统信息提示框
  • 系统设置界面
  • VIDEO_PHOTO拍照模式界面
  • VIDEO_DEC回放模式界面
  • 倒车界面
  • 车道偏移预警设置界面
  • 回放模式文件删除提示界面 在JieLiGuiBuilder UI工具中,点击下面dvr_ly_800x480项目进入JL风格UI工程。
    image

进入后会看到如下所示的页面
image 其中记录仪主要页面组成如下:
image

要在工程中使用JL风格的UI,需要在app_config.h下打开宏CONFIG_UI_STYLE_JL_ENABLE,如下
image

工程中JL风格UI代码在如下路径下
custom文件夹:是各页面的UI业务代码,是由用户编写并最终在JieLiGuiBuilder UI工具中打包拷贝到如下工程路径中;
generated文件夹:是由JieLiGuiBuilder UI工具生成的各页面lvgl初始化代码,该部分代码绝大多数是JieLiGuiBuilder UI工具自动生成,其中有一些事件回调中的代码是用户在JieLiGuiBuilder UI工具中添加。
image

3.2.2 usb_slave页面-行车记录仪USB界面

   usb_slave页面是当设备通过usb接到电脑时,弹出显示出来的一个页面,该有3个选项,分别设置792机器可进入massstorage存储器从机模式、uvc从机摄像头模式和行车记录仪录像模式。  

关键应用层代码:ui_action_usb.c,主要包含usb页面显示隐藏逻辑、USB页面加载卸载回调函数(显示隐藏之后要792实现的逻辑动作)
📌以792如何进入massstorage模式为例子(uvc从机摄像头模式类似),相关代码逻辑和UI回调机制如图:
imageimage

📌何时显示和隐藏usb界面
当792检测到usb上线或者下线事件的时候。以WiFicamera工程举例,如图:
image

📌显示USB界面,利用页面的加载函数回调,退出当前的appcore模式,只执行对应的USB任务。
公版ui_action_usb.c有代码演示,如图
image

📌usb页面切换到行车记录仪录像模式
image

ui_action_video_rec.c 利用页面的加载函数回调,让792 切换模式为录像模式:
image

3.2.3 video_rec页面-行车记录仪录像模式

行车记录仪录像模式,主要是记录仪方案的录像功能,UI页面涉及的功能包含如下:

  • 录像模式界面切换到拍照模式。
  • 录像模式界面切换到系统主界面。
  • 录像模式菜单设置页面及相关交互。
  • 录像模式录像参数的UI状态显示(日期时间、车牌、录像参数等UI状态)。

📌录像模式界面切换到拍照模式。
image

📌录像模式界面切换到系统主界面
image

📌录像模式菜单设置页面及相关交互
页面主要控件容器:

  1. view_video_set为录像模式菜单的控件容器,放置着录像模式的所有可配置菜单项的控件对象及相关UI逻辑。
  2. view_subpage为子菜单的控件容器,放置着菜单项配置的控件对象及相关UI逻辑。 view_subpage与view_video_set同一时刻只有一个容器在显示。
    imageimage 当设置按钮img_video_set被按下将根据view_subpage显示状态隐藏或者显示view_video_set
    image

3.2.4 video_photo页面-行车记录仪拍照模式

行车记录仪拍照模式,主要是记录仪方案的拍照功能,UI页面涉及的功能包含如下:

  • 拍照模式界面切换到录像模式。
  • 拍照模式界面切换到系统主界面。
  • 拍照模式菜单设置页面及相关交互。
  • 录像模式录像参数的UI状态显示(日期时间、拍照参数等UI状态)。

📌拍照模式界面切换到录像模式。
image

📌拍照模式界面切换到系统主界面
image

📌拍照模式菜单设置页面及相关交互
页面主要控件容器:

  1. view_video_set为拍照模式菜单的控件容器,放置着拍照模式的所有可配置菜单项的控件对象及相关UI逻辑。
  2. view_subpage为子菜单的控件容器,放置着菜单项配置的控件对象及相关UI逻辑。 view_subpage与view_video_set同一时刻只有一个容器在显示。
    imageimage 当设置按钮img_video_set被按下将根据view_subpage显示状态隐藏或者显示view_video_set
    image

3.3 空白模版创建

3.3.1 简介

   若客户不打算使用wifi_carmera自带的LY和JL两套模版UI,想要创建一个空白的UI工程,需要按照下面的流程进行创建并烧录到开发板上  

3.3.2 创建流程

在JieLiGuiBuilder UI工具中,新建项目中,找到VIDEO产品,并点击下一步,进入创建流程。
image 如果你跑的是wifi_carmera工程,则根据你所处的SDK分支,选择对应的板子,处在V3分支,则是3.0.0,V2分支则是2.0.0...... 若创建的UI是触摸风格,则选择JL的板子,按键风格,则使用LY的板子;
如果跑的是音箱工程,则选择wifi_soundbox板子,没有V1,V2,V3之分。
image 内核选择工具列表中列举的最新内核即可:
image 模版使用空白模版:
image 创建成功后,即可在新建的空白模版上进行设计。
3.3.3 打包到SDK并烧录的流程
若需要打包到SDK编译,则使用工具的"打包"功能。

  1. 工具端操作:客户在工具上点击“打包”,工具会将生成的custom/和generated/文件夹移动到SDK的lvgl_v8_ui_app/style_xx(xx是JL或者LY)下,并将工具打包压缩的图片、字体资源同步移动到SDK/cpu/wl83/tools/下指定的资源文件夹下。如果客户是wiif_carmera工程的话,工具会复制资源到dvr_xx_ui_res(xx是jl或者ly);若是wifi_soundbox工程,则复制到soundbox_ui_res下;
  2. codeblock端操作:跳转到codeblock上进行编译,原本SDK的lvgl_v8_ui_app/style_xx(xx是JL或者LY)下放置的是默认自带的模版UI,打包后,这部分的代码被替换掉,而codeblock编译时上不会自动更新被删除/新增的.c和.h文件,所以要先手动将这些文件移除,再重新添加codeblock编译即可。 注意:如果在工具上有新增页面或 custom/下有新增源文件编译,打包到codeblock上时,也要将这部分新增的代码Add进codeblock上编译。删除同理,也要Remove。
    image

四: SDK代码讲解说明

4.1.1 工程代码配置讲解

codeblock 打开对应工程 以 AC792N_WIFI_CAMERA.cbp 工程为列
截取常用部分,求他功能看如下codeblcok代码文件命名, 顾名思义
image

  1. 针对开发板配置对应板级board和外设定义 头文件board_config.h中定义芯片型号为 :#define CONFIG_BOARD_AC7926A
    板级型号为:#define CONFIG_BOARD_DEVELOP // 开发板
    如下
    image

//芯片型号sdram和flash配置文件
#include "chip_cfg.h"
image

board_develop.c中则为整个设备硬件的外设配置,具体定义 在board_develop_AC7926A.h 头文件中
若客户用的是其他芯片型号,可按上述方式配置对应的型号 如CONFIG_BOARD_AC7922A,CONFIG_BOARD_AC7925B等,如代码中未看到对应型号,客户需要了解自己手头拿到的主控是什么型号,内存大小,以及板子贴的flash 大小, 则可在现有型号上进行内存,flash大小修改,外设则可按照实际板子定义进行灵活修改。
问题:(配置完后烧录无打印,跑不起来,参考章节七 常见问题说明)

4.1.2 代码流程讲解

  1. app和ui 独立分开,系统app有video_rec, video_photo, video_dec, video_system 等app,基本每个app单独一个 xxx.c文件, ui 则在 apps\wifi_camera\lvgl_v8_ui_app 文件夹下, 目前公版提供两套ui,style_JL(触摸风格)的以及style_LY(按键风格) image 系统上电主控 maskrom--> uboot--> main( main入口函数)--> 创建app 应用--> 初始化lvgl ui界面显示
    其中main函数 对系统看门狗,clk时钟,中断,串口等外设的初始化,以及对rtos系统的初始化
    image 最终从app_task_handler线程 启动app应用, 客户可自行查看代码逻辑。
    image app 状态机的切换可参考 sdk\apps\common\example\system\app_state_machine 路径列子
    实际公版AC792N_WIFI_CAMERA.cbp 项目中有几个app模式, video_rec, video_photo, video_dec ,video_system 等app, 当触摸或者按键触发进行app 切换。 有些客户开发,模式单一,可能只用到一个app应用,无需切换,可以不关注app 的切换。

4.1.3 flash VM存储等用法

  1. flash区域分uboot ,code代码区域,res 资源区域,vm系统配置项存储区域,以及reserved区域, vm区域长度可在isd_config_rule.c文件中进行配置 image 存储区域有3个 1)VM区域; 2)sys_cfg.bin; 3)BTIF区域 ,
    配置项ID号分配如下: //
    [0]: 配置项ID号0为配置项工具保留ID号; //
    [ 1 ~ 59]: 共59项, 预留给用户自定义, 只存于VM区域; //
    [ 60 ~ 99]: 共40项, sdk相关配置项, 只存于VM区域; //
    [100 ~ 255]: 共156项, sdk相关配置项, 可以存于VM区域, sys_cfg.bin(作为默认值)和BTIF区域;//
    [512 ~ 700]: 共188项, sdk相关配置项, 只存于sys_cfg.bin;
    可参考syscfg_id.h 头文件说明
  2. wifi camera 工程中 app_database.c中idex用到了1-59 项,预留给用户自定义的,存了一些菜单参数 int syscfg_write(u16 item_id, void *buf, u16 len);
    int syscfg_read(u16 item_id, void *buf, u16 len); 接口进行读写,注意只针对索引号方式读写,长度最大一次4095字节
    如果客户需要进行大数量读写,该方式不建议用,可用littlefs 文件系统接口第三方开源库方式实现,该方式替代extflash,效率会高些。
    792 littlefs文件系统配置.otl
    另外有些客户可能会用到自定义flash 区域,存一些特定信息, 该部分空间与系统,工具毫无相关,分配给系统的flash 大小不是flash 实际的物理空间大小。可参考如下文档说明
    https://doc.zh-jieli.com/AC792/zh-cn/wifi_video_master/module_example/peripherals/flash_space.html

4.1.4 wifi 功能的用法

1. 792N系列支持的功能协议

  • 兼容IEEE802.11b/g/n标准
  • 支持802.11N MCS0~7,数据传输率最高到72.2Mbps
  • 支持仅 station 模式(即 STA 模式或 Wi-Fi 客户端模式),此时 AC79 连接到接入点 (AP)
  • 支持仅 AP 模式(即 Soft-AP 模式或接入点模式),此时基站连接到 AC79
  • 支持WPA/WPA2/WPA3-Personal
  • 支持 AMPDU、HT40(AC792N系列支持)、QoS
  • station 模式下支持低功耗休眠
  • 扫描接入点(包括主动扫描及被动扫描)
  • 支持混杂模式监听 IEEE802.11 Wi-Fi 数据包 初始化wifi 线程 在wifi_app_task,c中,屏蔽掉该线程 则关闭整个wifi 链路。
    image

流程和接口使用说明参考
https://doc.zh-jieli.com/AC792/zh-cn/wifi_video_master/module_example/wifi/wifi_instruction.html
用户在使用wifi 过程中若经常断开,吞吐率不够 最好找杰理硬件同事确认射频指标是否达标。

2. wifi 性能吞吐率测试

固件SDK配套sdk_tools下载链接 该连接有很多其他测试工具:
https://doc.zh-jieli.com/AC79/sdk_tools/AC79NN_SDK_V1.2.0/sdk_tools.rar
代码配置方式参考如下方式配置
https://doc.zh-jieli.com/AC792/zh-cn/wifi_video_master/module_example/wifi/wifi_iperf_test.html

3. wifi模式配置

以wifi camera 工程为列,app_config中配置了上电的wifi 的模式, ap 热点ssid和pwd 以及STA模式下去连接的 路由等热点名
image

4.内存优化 wifi 库选择

某些用户拿到的主控内存很小,如内部2MB 的sdram ,内部ram 为128KB
当内存不够用时,可评估更换小内存的wifi 驱动库以及lwip,同时需要评估wifi 吞吐率是否满足当下产品性能,目前该方式适用于791X 系列, 792根据实际情况咨询杰理团队。

image

4.1.5 系统升级分类

4.1.5.1 支持的升级方式

目前杰理792N系列,系统升级支持SD卡升级,U盘升级,HTTP升级,FTP升级,虚拟U盘升级,串口升级

升级方式单备份升级双备份升级预留区升级
SD卡升级支持支持支持
U盘升级支持支持支持
HTTP升级不支持支持支持
FTP升级不支持支持支持
虚拟U盘升级不支持支持支持
uart串口升级支持不支持支持

image

单备份结构
image 可参考开源文档相关说明
https://doc.zh-jieli.com/AC792/zh-cn/wifi_video_master/module_example/system/update.html
具体使用过程中遇到问题,可咨询杰理同学

4.1.5.2 SD卡升级

app_config.h中定义单双备份升级方式
image

  1. codeblcok或vs code编译生成固件后,tools下点击如下批处理(生成升级固件.bat) imageimage upgrade文件夹下生成的update.ufw 文件放置SD根目录
    image 注意在制作升级文件前,先保证当前设备已经烧录了对应升级方式的固件,才能进行升级
    image 升级代码文件在fs_update.c中
    image 升级时通过打印能看到升级进度。
  2. 若需要有ui 升级进度条,可参考如下文档方式实现 AC792系列_卡升级使用说明v1.2.docx

4.1.5.3 U盘升级

  1. 制作升级文件参考4.1.5.1 小节方式生成对应方式的升级固件 update.ufw 792N系列 U盘单备份升级说明.otl
  2. 双备份则按SD卡章节方式制作升级文件流程升级

4.1.5.4 http升级

http升级功能移植及测试说明如下所述,下面文档说明了如果在demo_wifi功能上跑通http升级以及测试http升级功能,客户可以基于此熟悉http升级功能,并在对应工程上开发。
硬件环境:AC7926开发板
软件环境:AC792N_SDK_V3
软件工程:demo_wifi
软件修改点:

  1. AC792N_DEMO_DEMO_WIFI.cbp需要增加如下文件: image
  2. app_main.c修改: image
  3. app_config.h image
  4. wifi_demo_task.c 需要注意的是url需要替换为客户自己的升级服务器的url
    image 升级文件制作:
    1、双击批处理
    image 2、选择http升级
    image 3、升级文件输出路径
    image

升级过程中打印
image 软件修改点附件
如下附件已经包含了在demo_wifi功能上移植http升级功能的所有修改,客户可以覆盖进行测试,但建议按照软件修改点,进行移植,有助于熟悉http升级功能。
AC792N http升级测试说明.zip

4.1.5.5 ftp升级

目前基于公版app, dvrunning2,wifi_camera工程做的测试, 设备端做AP模式
由于app的ota升级只支持双备份升级,所以需要在app_config.h中打开如图所示双备份升级的宏
image

  1. 修改tools下version.ver为1.0.1或以上,每次升级都要修改一次 image
  2. codeblcok或vs code编译生成固件后,tools下点击如下批处理(生成升级固件.bat) imageimage 3.upgrade文件夹下生成的update.ufw 文件放置在手机中,具体路径见下面APP截图
    image 4.在公版app DVRunning2连接机器后,进入关于界面,点击固件升级,之后选择对应文件,等待即可完成升级(需要将上述生成的升级文件放入手机如图所示对应路径中)。
    imageimageimage 5.升级时通过打印能看到升级进度。

4.1.5.6 虚拟u盘升级

开启虚拟U盘升级需要打开的宏如下所示,测试工程wifi_camera
image

虚拟U盘升级预留区是需要更新下面的文件
ram_disk_update.c

4.1.5.7 串口uart升级

串口升级可参考如下文档实现方式
792x串口uart升级说明参考.docx

4.1.5.8 关于备份区、资源、res区域以及预留扩展区的一些说明

资源区为用户存放资源文件的区域,其中分为两个区域:RES区域和预留区(RESERVED)

  • RES区:res资源区为app code中的一部分,在flash空间允许的范围内,res资源区大小没有限制。在双备份升级中,res资源区也会进行双备份处理,因此res资源在flash中会占用两倍的空间。
  • 预留区: 预留区以及扩展预留区域为独立于app code的一个区域,是客户可以自行配置和使用的区域,即系统会根据客户的配置文件在flash中预留出对应的空间大小由客户自行操作
  • 备份区:本平台顾名思义为两份,及flash中存在的两份的区域,升级断电等情况可从另一份备份区恢复的
  • 资源区 : 包括RES区 和预留区 一些概念词解释 ,开源文档中也有描述
    https://doc.zh-jieli.com/AC792/zh-cn/wifi_video_master/module_example/system/update.html
    (1) 预留区与res资源区有什么区别?
    答:预留区位于reserved区域,由用户自行配置,一旦生成其在flash中的位置和大小不能改变。 res资源区位于app code区,在flash空间允许的范围内,res资源区大小没有限制。在双备份升级中, res资源区也会进行双备份处理,因此res资源在flash中会占用两倍的空间。而预留区作为资源区时, 升级时资源文件大小不能超过对应预留区的空间大小。
    (2) 预留区备份升级与强刷升级有什么区别?
    答:预留区备份升级时,借用app code备份区作为临时区(前提是备份区空间必须大于资源文件大小), 先将资源写入该区,等数据校验成功后,再将资源从备份区覆盖到预留区,这样当意外断电时,也可以从 备份区恢复到预留区。而强刷升级则是直接将资源覆盖到预留区,当意外断电时,原来的预留区资源会造 成损坏。因此当使能强刷功能时,建议用户把重要的资源放在res资源区,如:一些开机时使用到的资源。
    (3)资源升级预留区的大小如何选取?
    答:预留区设置后,其空间大小不能改变,因此用户一开始就必须评估好以后可能存放最大资源上限,超 出预留区空间的资源可以存放到res区域。
    (4) 在usb下载或OTA升级时需要擦除或保留对应reserved区域,该如何设置?
    答:需要修改 cpu/wl83/tools/isd_config_rule.c, 擦除对应区域时XX_OPT设置为0,不操作指定区域时XX_OPT设置为1。如:vm区默认配置VM_OPT=0,因此在 每次烧录程序或ota升级时都会清除掉改区域,需要保留原来的vm数据需要配置VM_OPT=1。
    image (5) 采用单备份升级时,显示“head crc err”和“not found ufw code file”这样的错误提示信息?
    答:主要原因是单备份配置错误造成的,需要根据单备份升级配置进行正确配置。
    (6) 单备份和双备份可以交替使用吗?
    答:不行
    备份区为代码 app code 以及res部分,而 uboot 以及vm只有一份。
    而常规的双备份升级一般只升级code 和res 区域
    (7)升级后有时候发现功能还是上一次的代码功能 ,需要每次编译生成升级固件前改下版本号递增
    扩展外部存储器升级涉及到FLASH升级和外部存储器升级,其isd_config.ini配置文件分别由isd_config_rule.c和isd_config_rule_loader.c编译生成,在编译升级固件时需要对对应ini文件中BR22_TWS_VERSION版本号进行递增,否则会出现升级完成后再次在线烧录程序时跑的还是旧程序的情况,这时候需要重新擦除整块flash或重新格式化SD卡。

4.1.5.8.1 升级资源放RES区域,进行双备份升级

需要资源一起升级且不丢失 资源可放res区域进行双备份升级

4.1.5.8.1.1 res区简介
     res区是位于app_core区内,也就是跟代码区都是在一个app_core区下。在开了双备份时,代码和res资源都会备份,即res区的资源也会跟代码一样占用两倍的flash空间,如下是双备份时的flash空间划分。  

image

4.1.5.8.1.2 res区的使用
  • 添加res区资源 在sdk\cpu\wl83\tools目录下的download.c文件中,-res选项就是写入res区的资源,如下:
    image 下面在res区添加文件为例,修改download.c文件文件添加用户自己的资源
    imageimageimage 通过上面的配置就可将ota_res文件夹内容写入到res区中,在烧录时工具会自动写入,ota升级打包也会自动打包处理。
  • 读取res区资源 上面在res区写入文件后,代码中可通过文件系统接口fread对res区资源进行读取,读取res区的路径如下:
"mnt/sdfile/res/ota_res/test.mp3"   //其中"mnt/sdfile/res/"是res区的固定路径,后面按照实际路径来填写

res区资源文件的读取demo如下:

char name[128];
char read_buf[BUF_SIZE];
FILE *f = fopen("mnt/sdfile/res/ota_res/test.mp3", "r");
if (!f) {
    printf("fopen err!\n")
}else{
    fget_name(f, name, sizeof(name));
    printf("file_name: %s\n", name);

    int len = fread(read_buf, 1, sizeof(read_buf), f);
    if(len > 0)
    {
        put_buf(read_buf, sizeof(read_buf));
    }
}

注:res区是不能在代码中做写入操作。

4.1.5.8.2 资源放预留区以及拓展预留区升级

4.1.5.8.2.1 概述

预留区升级适用于只需要更改预留区资源而无需升级整个固件的情况。需要注意的是使用预留区升级功能需要在 [RESERVED_CONFIG] 中配置预留区,在 [RESERVED_EXPAND_CONFIG] 中进行 配置的预留区时也可以进行升级。

4.1.5.8.2.2 预留区及拓展预留区flash分区结构

关于AC792N flash结构说明,可参考开源网如下章节说明:7.17. UPDATE — JL Project Documentation
接下来,我们进一步解释预留区和拓展预留区在RESERVERED区域的分区结构,VM区域之后的区域顺序预留区和拓展预留区。[RESERVED_CONFIG]预留区里面的小最多可以设置6个配置项,其中VM、BTIF和PRCT为系统默认使用,用户不能占用。 用户可使用的只有3个配置项(如:配置文件中PROFILE、AISP和EXIF),可以根据实际需要进行使用和修改;当超出使用个数时,可以使用 [RESERVED_EXPAND_CONFIG] 拓展预留区域,拓展预留区在flash空间足够的情况下,配置项没有数量限制。如下图4-1-5-1所示为预留区和拓展预留区在flash中的分区结构。
image 图4-1-5-1 预留区和拓展预留区分区图

4.1.5.8.2.3 预留区及拓展预留区软件配置

预留区和拓展预留区最终生成配置文件的位置是在isd_conofig.ini文件里面,isd_conofig.ini文件由isd_conofig_rule.c编译的时候生成。因此,用户修改预留区和拓展预留区时候,需要在isd_config_ruler.c里面的修改。

4.1.5.8.2.3.1 预留区软件配置介绍

(1).预留区在配置文件中的位置为[RESERVED_CONFIG]这个关键之后的区域为预留区,如下图4-1-5-2所示:
image 图4-1-5-2 预留区开始位置
(2).预留区里面每个配置项由三个参数组成,分别为配置项起始地址、配置项长度和配置项是否可擦除等,如下图4-1-5-3所示:
image 图4-1-5-3 配置项参数
(3).预留区配置项的命名规则以前面的xxx_为配置项的名字,后面我们通过这个名字来读写配置项内容。如下图4-1-5-4所示:
image 图4-1-5-4 配置项名字
(4).我们在预留区新增加一个用户TEST配置项做例子,TEST_ADR地址设置为AUTO,长度TEST_LEN根据实际情况设置,TEST_OPT参数根据是否擦除配置。配置如下图4-1-5-5所示:
image 图4-1-5-5 新增加配置项
(4).编译完后,可以在FLASH_INFO编译信息中看到编译生成的配置项目的详细地址,说明flash分别地址等设置没问题,如下图4-1-5-6所示:
image 图4-1-5-6 配置项flash分区地址
(7).需要新增预留区的其他配置项方法类似,注意预留区的配置项最大可配置为6个。

4.1.5.8.2.3.2 预留区擦除读写方法介绍

预留区读写操作可以通过文件系统fread来读取数据,但是不能使用fwrite接口来写入数据。一般采用Flash写擦除接口来对预留区进行写操作。
(1).预留区的配置路径为"mnt/sdfile/app/xxx",其中xx为预留区配置项的名字,如要读写TEST区域的内容,那么路径为"mnt/sdfile/app/test"。
(2).我们以读取PROFILE预留区配置项为代码例子,验证擦除读写功能的详细示例代码如下:

#include "app_config.h"
#include "system/includes.h"
#include "fs/fs.h"
#include "asm/sfc_norflash_api.h"

#define USER_FLASH_SPACE_PATH "mnt/sdfile/app/test"

static u32 user_get_flash_exif_addr(void)
{
    u32 addr;

    //打开预留区
    FILE *profile_fp = fopen(USER_FLASH_SPACE_PATH, "r");
    if (profile_fp == NULL) {
        puts("user_get_flash_addr ERROR!!!\r\n");
        return 0;
    }

    struct vfs_attr file_attr;
    fget_attrs(profile_fp, &file_attr);

    //获取预留区的flash地址
    addr = sdfile_cpu_addr2flash_addr(file_attr.sclust);
    fclose(profile_fp);

    printf("user_get_flash_exif_addr = 0x%x, size = 0x%x \r\n", addr,file_attr.fsize);
    return addr;
}

static int c_main(void)
{
    printf("\r\n\r\n\r\n\r\n\r\n ----------- USER_FLASH_EXIF example run %s-------------\r\n\r\n\r\n\r\n\r\n", __TIME__);

    char buf[256];
    u32 flash_exif_addr = user_get_flash_exif_addr();
    if(flash_exif_addr==0)
        return -1;

    //擦除一个扇区
    puts("USER_FLASH_EXIF ERASE_SECTOR...\r\n");
    norflash_ioctl(NULL, IOCTL_ERASE_SECTOR, flash_exif_addr);

    puts("USER_FLASH_EXIF READ\r\n");
    memset(buf,0,sizeof(buf));

    //读取预留区数据
    norflash_read(NULL, buf, sizeof(buf), flash_exif_addr);
    put_buf(buf,sizeof(buf));

    puts("\r\n USER_FLASH_EXIF WRITE\r\n");
    for(int i=0;i<sizeof(buf);i++)
        buf[i] = i;

    //写入数据
    norflash_write(NULL, buf, sizeof(buf), flash_exif_addr);

    puts("USER_FLASH_EXIF READ\r\n");
    memset(buf,0,sizeof(buf));

    //再次读出来,查看数据是否写入成功
    norflash_read(NULL, buf, sizeof(buf), flash_exif_addr);
    put_buf(buf,sizeof(buf));

    return 0;
}
late_initcall(c_main);

(3).注意读预留区可以使用文件系统fread接口进行读取到具体的文件,参考格式如下所示:

#include "app_config.h"
#include "system/includes.h"
#include "fs/fs.h"#include "asm/sfc_norflash_api.h"


static read_reserved_data_test()
{
    printf("%s %d\n", __func__, __LINE__);

    u32 addr;
    char buf[256] = {0}; 

    #define USER_FLASH_SPACE_PATH "mnt/sdfile/app/test/test/2.txt"

    //打开预留区
    FILE *fp = fopen(USER_FLASH_SPACE_PATH, "r");
    if (fp == NULL) {
        puts("fopen ERROR!!!\r\n");
        return 0;
    }

    fread(buf, sizeof(buf), 1, fp);
    printf("read reserved_test data:%s\n", buf);
    fclose(fp);

}
4.1.5.8.2.3.3拓展预留区软件配置介绍

(1).拓展预留区在配置文件中的位置为[RESERVED_EXPAND_CONFIG]这个关键之后的区域为拓展预留区,如下图4-1-6-1所示:
image 图4-1-6-1 拓展预留区开始位置
(2).拓展预留区里面每个配置项一般由四个参数组成,分别为配置项资源烧录路径、配置项起始地址、配置项长度和配置项是否可擦除等,如下图4-1-6-2所示:
image 图4-1-6-2 配置项参数
(3).拓展预留区配置项的命名规则以前面的xxx_为配置项的名字,后面我们通过这个名字来读写配置项内容。如下图4-1-6-3所示:
image 图4-1-6-3 拓展预留区配置项名字
(4).我们在拓展预留区新增加一个用户LOGOPACKRES配置项做例子,首先需要在app_config.h里面定义相关宏,如下图4-1-6-4所示:
image 图4-1-6-4 宏定义LOGO区域
(5).在配置isd_config_ruler.c里面,根据实际情况配置LOGOPACKRES_FILE为资源烧录路径设置,LOGOPACKRES_ADR地址设置为AUTO,长度LOGOPACKRES_LEN根据实际情况设置,LOGOPACKRES_OPT参数根据是否擦除配置。配置如下图4-1-6-4所示:
image 图4-1-6-4 新增拓展预留区配置项
(6).关于配置LOGOPACKRES_FILE为资源烧录路径设置,在packres/UIPACKRES路径要存在LOGOPACKRES这个文件,否则编译报错。如下图4-1-6-5为资源放置位置。
image 图4-1-6-5 LOGOPACKRES位置
(7).打包工具packres.exe将poweronoff_res文件夹里面的资源打包为LOGOPACKRES放到packres/路径下,如下图4-1-6-6为资源打包工具的处理。
image 图4-1-6-6 LOGOPACKRES资源打包
(8).编译完后,可以在FLASH_INFO编译信息中看到编译生成的配置项目的详细地址,说明flash分别地址等设置没问题,如下图4-1-6-7所示:
image 图4-1-6-7 新增拓展预留区配置项flash分区地址
(9).需要新增拓展预留区的其他配置项方法类似,注意拓展预留区的配置项数目没有限制,flash空间允许的情况下。

4.1.5.8.2.3.4 拓展预留区擦除读写方法介绍

拓展预留区读写操作可以通过文件系统fread来读取数据,但是不能使用fwrite接口来写入数据。一般采用Flash写擦除接口来对预留区进行写操作。
(1).拓展预留区的配置路径为"mnt/sdfile/EXT_RESERVED/xxx",其中xx为拓展预留区配置项的名字,如要读写该区域的内容,那么路径为"mnt/sdfile/EXT_RESERVED/logopackres"。
(2).我们以读取LOGOPACKRES拓展预留区配置项为代码例子,验证读写功能的详细示例代码如下:

#include "app_config.h"
#include "system/includes.h"
#include "fs/fs.h"
#include "asm/sfc_norflash_api.h"

#define USER_FLASH_SPACE_PATH "mnt/sdfile/EXT_RESERVED/logopackres"

static u32 user_get_flash_exif_addr(void)
{
    u32 addr;

    //打开预留区
    FILE *profile_fp = fopen(USER_FLASH_SPACE_PATH, "r");
    if (profile_fp == NULL) {
        puts("user_get_flash_addr ERROR!!!\r\n");
        return 0;
    }

    struct vfs_attr file_attr;
    fget_attrs(profile_fp, &file_attr);

    //获取预留区的flash地址
    addr = sdfile_cpu_addr2flash_addr(file_attr.sclust);
    fclose(profile_fp);

    printf("user_get_flash_exif_addr = 0x%x, size = 0x%x \r\n", addr,file_attr.fsize);
    return addr;
}

static int c_main(void)
{
    printf("\r\n\r\n\r\n\r\n\r\n ----------- USER_FLASH_EXIF example run %s-------------\r\n\r\n\r\n\r\n\r\n", __TIME__);

    char buf[256];
    u32 flash_exif_addr = user_get_flash_exif_addr();
    if(flash_exif_addr==0)
        return -1;

    //擦除一个扇区
    puts("USER_FLASH_EXIF ERASE_SECTOR...\r\n");
    norflash_ioctl(NULL, IOCTL_ERASE_SECTOR, flash_exif_addr);

    puts("USER_FLASH_EXIF READ\r\n");
    memset(buf,0,sizeof(buf));

    //读取预留区数据
    norflash_read(NULL, buf, sizeof(buf), flash_exif_addr);
    put_buf(buf,sizeof(buf));

    puts("\r\n USER_FLASH_EXIF WRITE\r\n");
    for(int i=0;i<sizeof(buf);i++)
        buf[i] = i;

    //写入数据
    norflash_write(NULL, buf, sizeof(buf), flash_exif_addr);

    puts("USER_FLASH_EXIF READ\r\n");
    memset(buf,0,sizeof(buf));

    //再次读出来,查看数据是否写入成功
    norflash_read(NULL, buf, sizeof(buf), flash_exif_addr);
    put_buf(buf,sizeof(buf));

    return 0;
}
late_initcall(c_main);

(3).注意读拓展预留区可以使用文件系统fread接口进行读取到具体的文件,参考格式如下所示:

#include "app_config.h"
#include "system/includes.h"
#include "fs/fs.h"#include "asm/sfc_norflash_api.h"


static read_reserved_data_test()
{
    printf("%s %d\n", __func__, __LINE__);

    u32 addr;
    char buf[256] = {0}; 

    #define USER_FLASH_SPACE_PATH "mnt/sdfile/EXT_RESERVED/uipackres/ui/4b00002a.zip"

    //打开拓展预留区
    FILE *fp = fopen(USER_FLASH_SPACE_PATH, "r");
    if (fp == NULL) {
        puts("fopen ERROR!!!\r\n");
        return 0;
    }

    fread(buf, sizeof(buf), 1, fp);
    printf("read reserved_test data:%s\n", buf);
    fclose(fp);

}
4.1.5.8.2.4 预留区及拓展预留区与APP CODE区同时升级

预留区&拓展预留区支持和APP CODE同时一起升级,前提是需要通过生成升级固件.bat批处理脚本,将APP CODE和预留区/拓展预留区打包成update-ota.ufw的升级文件,系统读到升级文件后,对APP CODE区(代码+RES区)和预留区、拓展预留区同时升级。
(1).预留区与APP CODE区域同时升级说明
如下文档例子详细说明预留区与APP CODE区域同时升级的步骤,需要注意的是当打包为一个文件同时升级时候,APP CODE区域支持双备份升级,拓展预留区只支持单备份升级,由此有变砖的风险。详细链接如下所示:
AC792N 预留区资源OTA升级问题说明文档.docx
(2).拓展预留区与APP CODE区域同时升级说明
如下文档例子详细说明拓展预留区与APP CODE区域同时升级的步骤,需要注意的是当打包为一个文件同时升级时候,APP CODE区域支持双备份升级,拓展预留区只支持单备份升级,由此有变砖的风险。详细链接如下所示:
AC792N 拓展预留区资源OTA升级问题说明文档.docx

4.1.5.8.2.5 预留区及拓展预留区单独升级

关于预留区及拓展预留区单独升级,因为扩展预留区不能通过常规的OTA升级更新,实际上流程为代码正常跑起来后,拿到需要用户自行拿到预留区和拓展预留区需要升级的资源文件原始数据后(注意:此资源文件是不经过packres.exed打包的,即不是.ufw的文件),然后对应预留区或者拓展预留区区域进行flash的擦除写操作升级。

  1. .预留区单独升级 关于预留区擦除操作,参考4.1.5.8.2.3.2 预留区擦除读写方法的章节介绍,使用相关接口进行擦除写。另外原始sdk里面有相关的参考例子,可自行参考具体参考apps/common/update/expand_zone_file_update.c文件。
  2. .拓展预留区单独升级 关于预留区擦除操作,参考4.1.5.8.2.3.4 拓展预留区擦除读写方法的章节介绍,使用相关接口进行擦除写。另外原始sdk里面有相关的例子,可自行参考具体参apps/common/update/expand_zone_file_update.c文件。
4.1.5.8.2.6 预留区及拓展预留区常见问题
  1. .预留区中指定文件,但是没有填写绝对地址导致编译器报错问题,如“错误:在配置文件(isd_config.ini)中发现非标准的预留区域配置。 答:当预留区指定文件时,只有编译后才知道工具实际给文件分配的地址,因此需要对isd_config_rule.c 文件进行修改。如上图:在FLASH INFO中获知TEST_SIZE : 0x1000 , TEST_START_ADDR : 0xffd000,在isd_config_rule.c修改TEST_START_ADDR=0xffd000, TEST_LEN=0x1000。再编译工程即可。
    image
  2. .配置完预留区后,编译报类似错误ERROR: The reserved(EGGRES) config address is less then the prev reserved(MCURES) config address, please re-config. 答:一般是地址不按照顺序排列导致,参考解决思路如下:
    image

4.1.6 低功耗模式配置

4.1.6.1 测试环境说明

测试板子: AC7926开发板(必须拔掉摄像头)
测试工程 : wifi_camera工程
测试条件:蓝牙BLE连接手机,不开启wifi

4.1.6.2 低功耗配置说明
1. 在板级(board_xxxx.h)配置文件中做如下配置:

image

2. 低功耗进入和退出回调:

imageimage 3. 在lib_system_config.c中选择是自动进低功耗还是手动进低功耗 image 当选择手动进入低功耗时,可以使用下图这个接口进入低功耗:
image 选择手动进入低功耗还是手动进低功耗这个需要根据客户应用场景选择,如果客户进入低功耗过程有代码判断时机可以主动进入,如果客户无法判断代码何时进入低功耗,则需要选泽系统判断自动进入低功耗。

4.1.6.3 低功耗唤醒IO口配置
    1. 配置唤醒IO口,即在对应的文件中配置IO如下图所示:

image 2. 唤醒IO对应的唤醒回调,如下图所示: image 3. 在低功耗唤醒和退出回调中,添加唤醒IO的相关操作 imageimage 4. 在软关机回调中增加唤醒IO口保护 imageimage 5. 增加唤醒IO口初始化 image 6. 低功耗唤醒支持多个IO唤醒,每个IO口都有对应的唤醒回调,需参考PORT0进行配置

4.1.6.4 低功耗问题排查方法
4.1.6.4.1 无法进入低功耗

低功耗进不去时,可以在lib_power_config.c中下图所示变量置1,这个变量置1之后,会提示那些模块处于busy状态,需要关闭。
image 正常进入低功耗打印如下:
image

4.1.6.4.2 进出低功耗时间太短问题

可以外部定义这个全局变量,定义这个全局变量u8 config_system_timer_pdown = 10;增大其值。

4.1.6.4.3 常见外设关闭方法参考代码
static void wifi_app_task(void *priv)
{
    int msg[32];
    int res;

#ifdef PRODUCT_TEST_ENABLE
    u8 product_enter_check(void);
    if (product_enter_check()) {
        //进入产测模式后,将直接退出
        return;
    }
#endif

    wifi_set_event_callback(wifi_event_callback);
    wifi_on();

    //非量产模式下的AP和ST设置
#ifndef CONFIG_MASS_PRODUCTION_ENABLE
    //以下在wifi启动之后可以设置模式、名称、密码,不使用则是默认AP模式、wifi_camera_wl8x_xxxx、12345678
#ifdef CONFIG_WIFI_STA_MODE
    /*wifi_enter_sta_mode(STA_WIFI_SSID, STA_WIFI_PWD);//设置wifi进入STA模式以及STA名称和密码*/
    /*wifi_store_mode_info(STA_MODE, STA_WIFI_SSID, STA_WIFI_PWD);//保存默认模式*/
#else
    //设置WIFI模式和名称密码,注意:不同AP和STA模式需要对应的库
    /*wifi_enter_ap_mode("test_123456", "12345678");//设置wifi进入AP模式以及AP名称和密码*/
    /*wifi_store_mode_info(AP_MODE, "test_123456", "12345678");//保存默认模式*/
#endif
#endif

    net_app_init();
    sys_timer_add_to_task("sys_timer", NULL, wifi_app_timer_func, 5 * 1000);


    msleep(10 * 1000);


    wifi_off();
    wifi_rf_off();
#include "otg.h"
#include "asm\dsi.h"
#include "gpio.h"
    usb_otg_suspend(1,OTG_KEEP_STATE);
    extern s8 sleep_exit_flag ;
    while(1){

        gpio_direction_output(IO_PORTB_01,0);
        lvgl_ui_suspend();
        dsi_vdo_stop;
        memset(dsi_pll_con0,0,4);
        video_clock_early_uninit();
        jlgpu_clock_early_uninit();
        gpio_direction_output(TCFG_LCD_RESET_IO, 0);
        msleep(10);
        gpio_direction_output(TCFG_LCD_RESET_IO, 1);
        msleep(10);
        wdt_disable();
         printf("\n >>>>>>>>>>>>>>%s %d\n",__func__,__LINE__);
        low_power_user_request(-1);//睡眠时间
        printf("\n >>>>>>>>>>>>>>%s %d\n",__func__,__LINE__);
        while(1){
            if(sleep_exit_flag == 0){ //避免继续往下跑
                   msleep(100);

            }else{
                break;
            }
        }
        printf("\n >>>>>>>>>>>>>>%s %d\n",__func__,__LINE__);
        sleep_exit_flag = 0;
        msleep(5000);
        printf("\n >>>>>>>>>>>>>>%s %d\n",__func__,__LINE__);
        video_clock_early_init();
        jlgpu_clock_early_init();
        dma2d_init();
        dsi_vdo_kick;
        printf("\n >>>>>>>>>>>>>>%s %d\n",__func__,__LINE__);
        lvgl_ui_resume();
        printf("\n >>>>>>>>>>>>>>%s %d\n",__func__,__LINE__);
        gpio_direction_output(IO_PORTB_01,1);
        msleep(5000);
    }

}

五:点LCD屏讲解

5.1 点屏硬件说明及注意事项

792系列芯片目前可支持MIPI屏、RGB屏、MCU屏和SPI屏接口。
MIPI屏硬件接口支持1/2/4lane的设计接法,满足大部分的设计需求
RGB屏硬件接口支持3/6/8/9/16/18/24位接法,支持多种数据格式输出显示。
MCU屏接口支持8/16位的接法。
SPI屏接口支持1/2/4线接法,支持任意GPIO映射,灵活设计。
792系列芯片屏硬件设计,请严格按照AC792N系列屏接口说明;如不按照参考接法,会导致存无法点亮情况。参考资料链接:
https://gitee.com/Jieli-Tech/fw-AC792_SDK/tree/release/AC792N_SDK_V1/doc/%E7%A1%AC%E4%BB%B6%E8%B5%84%E6%96%99
image

5.2 MIPI屏软件配置、调试步骤及注意事项

以下章节我们专门介绍AC792N 平台上点MIPI屏软件配置、调试步骤及注意事项说明,用户可参考此章节了解点MIPI屏的过程和方法。

5.2.1 MIPI屏软件配置步骤说明

以下配置以AC791N_WIFI_CAMERA工程为例子配置MIPI屏,用户在其它工程的点MIPI屏配置也可以类似参考部分。
步骤1:在对应的板子头文件里面配置使能TCFG_LCD_ENABLE宏定义,如下图5-2-1所示:
image 图5-2-1 LCD宏使能
步骤2:配置对应的MIPI屏幕驱动使能和对应的IO口等基本信息的配置,如下图5-2-2所示:
image 图5-2-2 MIPI屏幕驱动使能
步骤3:在lcd_config.h里面,定义MIPI屏幕的宽&高,如下图5-2-3所示:
image 图5-2-3 定义MIPI屏的宽高
步骤4:将MIPI屏的驱动添加参编译,我们以Makefile为例子添加驱动(codeblock直接add文件即可),如下图5-2-4所示:
image 图5-2-4 将屏驱添加参与编译
步骤5:确认板级添加了屏相关的注册信息,如下图5-2-5所示:
image 图5-2-5 板级注册屏结构体
步骤6:修改MIPI屏驱初始化内容,将屏厂提供的初始化序列写入到init_cmd_list数组里,如下图5-2-6所示:
image 图5-2-6 修改初始化序列
步骤7:根据硬件原理图,配置AC792N和MIPI屏的lane脚的对应关系,配置说明如下图5-2-7所示:
image 图5-2-7 配置lane脚
步骤8:配置MIPI屏lane数据和时序,vda_line和hda_pixel为有效像素时钟,其它的时序可参考屏的时序手册(建议参考SDK原有的分辨率时序调整),关于时序说明如下图5-2-8所示:
image 图5-2-8 MIPI时序配置

5.2.2 主控MIPI参数说明

关于AC792N主控MIPI屏参数的详细说明,参考如下的注释说明:

#define freq 410    //频率会影响MIPI的刷新帧率,用户跟进实际情况选择合适的频率,具体可参考屏上电初始化打印的fps帧率
查找打印log信息里面:如average_one_frame_time:17168us, fps=58.24Hz,表示MIPI屏刷新帧率为58fps,可通过此参数freq调整刷新帧率;一般帧率建议在40~60fps之间。
REGISTER_MIPI_DEVICE_BEGIN(mipi_dev_t) = {
    .info = {
#ifdef USE_TEST_MODE
        .test_mode             = true,    //打开纯色测试模式
#else
        .test_mode             = false,    //关闭纯色测试模式
#endif
        .xres                 = __LCD_W,    //插值前显存水平分辨率
        .yres                 = __LCD_H,    //插值前显存垂直分辨率
        .target_xres         = __LCD_W,    //插值后屏水平分辨率
        .target_yres         = __LCD_H,    //插值后屏水平分辨率
        .interpolation_en     = 0,         //屏幕插值使能

        .test_mode_color    = 0x0000ff,    //纯色测试模式的RGB颜色
        .bg_color           = 0xff0000,    //背景颜色
        .format             = FORMAT_RGB888,    //输出数据格式
        .len                 = LEN_256,        //访问的块长度
        .interlaced_mode    = INTERLACED_NONE,    //隔行模式
        .rotate = ROTATE_90,    //旋转角度(90.0 / 180.0 / 270.0)

        .adjust = {            //颜色校正参数,一般可以默认,可通过屏效工具来调节
            .r_gain = 1.0,
            .g_gain = 1.0,
            .b_gain = 1.0,
            .bright_gain = 1.0,
            .contrast_gain = 1.0,
            .saturation_gain = 1.0,
            .mean = 128,
            .angle = 0,
            .mode = 0,
        },

        .in_rbs             = false, //输入数据RB交换
        .out_rbs            = false, //输出数据RB交换
        .in_fmt             = TCFG_LCD_INPUT_FORMAT,    //lvgl等输入RGB数据格式
        .out_fmt            = LCD_OUT_RGB888,           //处理后输出适配屏RGB数据格式
        .dither_en          = false, //使能dither 0低位截断 1dither
        .in_bt601           = false, //yuv422输入 转换0 bt601, 1 bt709
        .out_bt601          = false, //yuv422输出 转换0 bt601, 1 bt709
    },

    .lane_mapping = {    //lane的硬件配置,详细见步骤7
        .x0_lane = MIPI_LANE_DIS,
        .x1_lane = MIPI_LANE_DIS,
        .x2_lane = MIPI_LANE_EN | MIPI_LANE_CLK,
        .x3_lane = MIPI_LANE_EN | MIPI_LANE_D1,
        .x4_lane = MIPI_LANE_EN | MIPI_LANE_D0,
    },

    .video_timing = {    //MIPI时序配置
        .video_mode = VIDEO_STREAM_VIDEO,    //command/video mode
        .sync_mode  = SYNC_PULSE_MODE,       //sync pulse/event mode
        .color_mode = COLOR_FORMAT_RGB888,  //输出给MIPI屏幕的RGB格式
        .pixel_type = PIXEL_RGB888,         //输出给MIPI屏幕的RGB格式
        .virtual_ch = 0,                    //virtual channel(video mode)
        .hs_eotp_en = true,                //enable EoT packet

        .dsi_vdo_vsa_v  = vsa_line,        //vertical sync pluse
        .dsi_vdo_vbp_v  = vbp_line,        //vertical back porch
        .dsi_vdo_vact_v = vda_line,        //vertical active line
        .dsi_vdo_vfp_v  = vfp_line,        //vertical front porch

        .dsi_vdo_hsa_v   = ((bpp_num * hsa_pixel) / 8) - 10,    //horizontal sync pulse
        .dsi_vdo_hbp_v   = ((bpp_num * hbp_pixel) / 8) - 10,    //horizontal back porch
        .dsi_vdo_hact_v  = ((bpp_num * hda_pixel) / 8),        //horizontal active pixel
        .dsi_vdo_hfp_v   = ((bpp_num * hfp_pixel) / 8) - 6,    //horizontal front porch

        .dsi_vdo_bllp0_v = ((bpp_num * (hbp_pixel + hda_pixel + hfp_pixel) / 8) - 10),    //BLLP period width
        .dsi_vdo_bllp1_v = ((bpp_num * hda_pixel) / 8),    //horizontal null dummy
    },
    .timing = {
        /* 以下参数只需修改freq */
        .tval_lpx   = ((80     * freq / 1000) / 2 - 1),    // LowPower state period 传输时间
        .tval_wkup  = ((100000 * freq / 1000) / 8 - 1),    // 总线从ulps模式唤醒的时间
        .tval_c_pre = ((40     * freq / 1000) / 2 - 1),    // clk lane HS transition prepare time
        .tval_c_sot = ((300    * freq / 1000) / 2 - 1),    // clk lane HS transition sot time:LP-00
        .tval_c_eot = ((100    * freq / 1000) / 2 - 1),    // clk lane HS transition eot time
        .tval_c_brk = ((150    * freq / 1000) / 2 - 1),    // clk lane总线离开回到synLP-11的时间
        .tval_d_pre = ((60     * freq / 1000) / 2 - 1),    // data lane HS transition prepare time
        .tval_d_sot = ((160    * freq / 1000) / 2 - 1),    // data lane HS transition sot time:LP-00
        .tval_d_eot = ((100    * freq / 1000) / 2 - 1),    // data lane HS transition eot time
        .tval_d_brk = ((150    * freq / 1000) / 2 - 1),    // data lane总线离开回到LP-11的时间
        .tval_c_rdy = 400/* 64 */,
    },
    .pll4 = {
        .pll_freq = freq,    // mipi pll总线频率
    },

    /* .pll_freq = freq * 2, // 配置PLL频率的最佳范围为600MHz~1.2GHz,少于600MHz的频率通过二分频获得 */
    /* .pll_division = MIPI_PLL_DIV2, */

    .cmd_list = init_cmd_list,    //初始化序列数组
    .cmd_list_item = sizeof(init_cmd_list),
    .debug_mode = false,    //初始化通信是否成功打印开关
},
REGISTER_MIPI_DEVICE_END()

5.2.3 MIPI调试步骤

在配置完MIPI驱动的软件之后,一般参照如下步骤debug调试屏驱,步骤如下:
步骤1:打开详细的打印,配置方法(Makefile和codeblcok配置)如下图5-2-3-1所示:
imageimage 图5-2-3-1 Makefile&Codeblock打开详细打印
步骤2:打开MIPI LANE通信使能,如下图5-2-3-2所示:
image 图5-2-3-2 LANE通信打印使能
步骤3:经过如上两个步骤之后,可以看到LANE通信的打印过程,来判断LANE的配置是否正确,如下图5-2-3-3所示:
image 图5-2-3-3 LANE通信结果打印
步骤4:若步骤3打印bta fail通信失败,则需要排查硬件电源、复位和lane脚的配置是否正确,保证通信成功后再继续往下调试,bta 通信失败提示打印如下图5-2-4所示:
image 图5-2-3-4 bta fial打印
步骤5:若bta通信成功之后,再打开纯色测试模式,配置如下图5-2-3-5所示。
image 图5-2-3-5 使能纯色模式
步骤6:若纯色模式推纯色正常,则说明MIPI初始化序列没问题;反之,先检查一下屏的背光供电是否正常,屏背光正常的情况下,需要检查如上步骤的配置,并联系屏厂fae确认MIPI初始化序列是否正确,和屏厂做进一步的排查。
步骤7:纯色模式正常后,关闭test_mode模式,系统能正常推出UI,则说明MIPI的点屏已经正常。

5.2.4 MIPI屏常见问题及注意事项

1.跑起来一直打印imd busy pnd。

可能是由于屏幕宽高的分辨率配置不正常导致,检查_LCD_W和_LCD_H配置是否正确。

2.手动写MIPI寄存器,但是无法确认MIPI寄存器是否已经写进去了。

使用逻辑分析器抓写命令的过程,分析出写进入的命令数据。

3.MIPI始化打印bta通信正常了,确认屏的初始化序列没问题,但是推纯色和UI都不亮。

修改video模式下的sync mode为SYNC_EVENT_MODE,图下图5-2-4-1所示
imageimage 图5-2-4-1 修改及原因说明

4.MIPI始化打印bta通信正常了,但是上电有概率偶尔不亮。

打开bta 通信打印。看每次都可以成功,但是偶尔会出现点不亮的情况;可能是由于部分寄存器初始化写不进去导致。PACKET_DCS包改为PACKET_DCS_WITHOUT_BTA不带响应的包;如下图5-2-4-2所示:
image 图5-2-4-1 修改为不带响应包

5.MIPI始化打印bta通信正常了,但是推纯色和UI都不亮。

需要修改为burst mode推屏模式,修改方法如下:
imageimage 修改完之后测试一下mipi波形,确认burst mode是否生效,生效的波形如下:
image

5.3 RGB屏软件配置、调试步骤及注意事项

以下章节我们专门介绍AC792N 平台上点RGB屏软件配置、调试步骤及注意事项说明,用户可参考此章节了解点屏RGB屏的过程与方法。

5.3.1 RGB屏软件配置步骤说明

以下配置以AC792N_WIFI_CAMERA工程为例子配置RGB屏,用户在其它工程的点RGB屏配置也可以类似参考部分。
步骤1:在对应的板子头文件里面配置使能TCFG_LCD_ENABLE宏定义,如下图5-3-1-1所示:
image 图5-3-1-1 LCD宏使能
步骤2:配置对应的RGB屏幕驱动使能和对应的IO口等基本信息的配置,如下图5-3-1-2所示:
image 图5-3-1-2 RGB屏幕驱动使能
步骤3:在lcd_config.h里面,定义RGB屏幕的宽&高,如下图5-3-1-3所示:
image 图5-3-1-4 定义RGB屏宽高
步骤4:将RGB屏的驱动添加参编译,我们以Makefile为例子添加驱动(codeblock直接add文件即可),如下图5-3-1-4所示:
image 图5-3-1-4 将RGB屏驱添加参与编译
步骤5:确认板级添加了屏相关的注册信息,如下图5-3-1-5所示:
image 图5-3-1-5 板级注册屏结构体
步骤6:确认屏复位时序(若屏不使用硬件复位情况下)是否正确,如下图5-3-1-6所示:
image 图5-3-1-6 RGB屏软件复位
步骤6:修改RGB屏驱初始化内容,将屏厂提供的初始化序列写入到初始化序列函数里面(有些RGB屏初始化固化在屏里面。此类RGB屏不写初始化即可),如下图5-3-1-6所示:
image 图5-2-6 添加RGB屏初始化序列
步骤7:根据RGB屏的数据格式,配置主控输出RGB格式,如下图5-3-1-7所示:
image 图5-3-1-7 配置RGB格式
步骤8:配置硬件信号线、data数据口、数据位宽和时钟等,配置如下图5-3-1-8所示:
image 图5-3-1-8 配置硬件口和时钟
步骤9:根据屏幕的实际分辨率,配置推屏时序,以480X800为例子,参考配置如下图5-3-1-9所示:
image 图5-3-1-9 配置RGB屏时序

5.3.2 主控RGB参数说明

关于AC792N主控RGB屏参数的详细说明,参考如下的注释说明:

REGISTER_IMD_DEVICE_BEGIN(lcd_480x800_st7701s_dev) = {
    .info = {
#ifdef USE_TEST_MODE
        .test_mode          = true,    //打开推纯色测试模式
#else
        .test_mode          = false,    //关闭推纯色测试模式
#endif
        .test_mode_color = 0xff0000,    //纯色测试模式颜色
        .bg_color         = 0x00ff00,    //背景颜色
        .xres              = __LCD_W,    //插值前显存水平分辨率
        .yres              = __LCD_H,    //插值前显存垂直分辨率
        .target_xres     = __LCD_W,      //插值后屏水平分辨率
        .target_yres     = __LCD_H,      //插值后屏垂直分辨率
        .sample          = SAMP_YUV420,    //采样方式 YUV420/YUV422/YUV444
        .format          = FORMAT_RGB888,    //图层数据格式
        .interlaced_1st_filed = EVEN_FILED,    //首场是奇场or偶场,INTERLACED_DATA 时有效
        .interlaced_mode = INTERLACED_NONE,    //隔行模式
        .len              = LEN_256,        //访问的块长度
        .rotate = ROTATE_0,                // 旋转配置,旋转角度(90.0 / 180.0 / 270.0)
        .adjust = {    //颜色校正参数,一般可以默认,可通过屏效工具来调节
            .r_gain = 1.0,
            .g_gain = 1.0,
            .b_gain = 1.0,
            .bright_gain = 1.0,
            .contrast_gain = 1.0,
            .saturation_gain = 1.0,
            .mean = 128,
            .angle = 0,
            .mode = 0,
        },

        .in_rbs         = false, //输入数据RB交换
        .out_rbs        = false, //输出数据RB交换
        .in_fmt         = TCFG_LCD_INPUT_FORMAT,    //输入数据格式
        .out_fmt        = LCD_OUT_RGB888,    //输出数据格式
        .dither_en      = false, //使能dither 0低位截断 1dither
        .in_bt601       = false, //yuv422输入 转换0 bt601, 1 bt709
        .out_bt601      = false, //yuv422输出 转换0 bt601, 1 bt709
    },

    .data_out_endian = MODE_LE, //RGB565模式生效 RGB888调节swap

    .dclk_set         = CLK_EN | CLK_NEGATIVE,    //dclk使能以及极性配置
    .sync0_set      = SIGNAL_DEN | CLK_EN,        //DE/HSYNC/VSYNC
    .sync1_set      = SIGNAL_HSYNC | CLK_EN,        //DE/HSYNC/VSYNC
    .sync2_set      = SIGNAL_VSYNC | CLK_NEGATIVE | CLK_EN,    //DE/HSYNC/VSYNC

    .set_io_hd      = TCFG_LCD_RGB_IO_HD_LEVEL,    //数据脚gpio_hd
    .lcd_group      = PORT_GROUP_AA,    //数据口输出端口选择
    .ncycle         = CYCLE_ONE,        //推一个像素时钟数
    .data_width     = PORT_24BITS,      //硬件数据位宽
    .dclk_cfg       = DPI_CLK_STD_48M | DIVA_1 | DIVB_2,    //dclk时钟配置
    .timing = {    //RGB推屏时序配置
//下面的时间均指多少个时钟周期 调整de 或者行间隔可以调屏的大概效果
#define  HBP          15 //行同步信号后肩 单位:clk
#define  HFP          2  //行同步信号前肩 单位:clk
#define  HSPW         1  //水平信号宽度   单位:clk
#define  VSPW         2  //垂直信号宽度   单位:行
#define  VBP          16 //帧同步信号后肩 单位:行
#define  VFP          1  //帧同步信号前肩 单位:行

        //以下信号均为高有效1 以下为固定公式勿动
        .hori_total                = 480 * 1 + HBP + HFP + HSPW, //行总长 : 行像素*3 + 行同步信号后肩 + 行同步信号前肩 + 水平信号宽度
        .hori_sync                = 480 * 1 + HBP + HFP,        //行同步时间:  行像素*3 + 行同步信号后肩 + 行同步信号前肩
        .hori_back_porth        = HBP,                        //行同步信号后肩 (+HSPW?)
        .vert_total                = VSPW + VBP + 800 + VFP,     //帧总长: 垂直信号宽度 + 帧同步信号后肩 + 像素高 + 帧同步信号后肩
        .vert_sync                = VSPW,                       //帧于帧之间间隔多少个行中断:?
        .vert_back_porth_odd    = VBP + VSPW,                 //帧信号开始的时候经过多少个行中断开始de: 帧同步信号后肩 +  水平信号宽度
        .hori_pixel                = 480,                        //像素宽   480*3 = 1440
        .vert_pixel                = 800,                        //像素高
        .vert_back_porth_even    = 0,                          //推隔行数据才需要配置
    },
},
REGISTER_IMD_DEVICE_END()

5.3.3 RGB屏调试步骤

在配置完RGB驱动的软件之后,一般参照如下步骤debug调试屏驱,步骤如下:
步骤1:打开USE_TEST_MODE宏,配置主控输出纯色模式,如下图5-2-3-1所示:
image 图5-3-2-1 配置主控推出纯色模式
步骤2:打开USE_TEST_MODE宏后,若RGB屏上没有推出纯色,需要先排查硬件原理设计、电源、复位脚等信号是否正常。一般推荐使用逻辑分析仪抓取初始化的序列是否写入正常,并同时确保每个data数据信号正常。
步骤3:若写入的初始化序列逻辑分析仪抓出来是对的,且各个信号示波器显示都正常;但是RGB屏不显示纯色或者纯色正常,但是推UI颜色不对,则需要联系屏厂确认初始化序列是否正常;有条件的情况下,请屏厂提供测试架进行对抓数据比。
步骤4:纯色模式正常后,关闭USE_TEST_MODE宏,若系统能正常推出UI,则说明RGB点屏已经正常。

5.3.4 RGB屏常见问题及注意事项

  1. 如何根据不同rgb格式:RGB565/RGB888和不同的数据位宽配置推屏时序? 我们以8bit硬件接口,推RGB565的屏为例子,说明如何配置(其它位宽、RGB格式的配置思路也是类似的)。
    首先,要根据rgb格式配置.format 和.out_fmt参数;
    其次,配置ncycle和data_width,原理为:推一个rgb565格式像素,位宽为8位的情况下,需要推两个周期;如下代码段所示:
.format          = FORMAT_RGB565,
.out_fmt        = LCD_OUT_RGB565,

.ncycle         = CYCLE_TWO,
.data_width     = PORT_8BITS,

最后,我们配置时序根据一个RGB565像素需要两个时钟周期,修改如下图5-3-4-1参数的配置:
image 图5-3-1-1 配置像素时钟

2.位硬件接口的屏,按照RGB565的的硬件方式去推屏,推出来的屏有锯齿装?

锯齿和正常的现象对比如下图5-3-1-2所示:
image 图5-3-1-2 RGB565推屏有锯齿
解决方法为修改如下时序,如下图5-3-1-3所示:
image 图5-3-1-3 推屏时序修改
1. 推纯色和UI正常,但是推摄像头数据显示异常(摄像头数据保存rgb565下来正常),屏的数据格式为rgb666. 推UI和纯色显示正常,单独推摄像头数据出现花屏;保存合成前后的数据都是正常的,推到屏上后显示异常。
image 解决方法:这种一般是由于屏的初始化寄存器没有完全弄对导致,需要联系屏厂确认寄存器初始化序列。

5.4 MCU屏软件配置、调试步骤及注意事项

以下章节我们专门介绍AC792N 平台上点MCU屏软件配置、调试步骤及注意事项说明,用户可参考此章节了解点MCU屏的过程和方法。

5.4.1 MCU屏软件配置步骤说明

以下配置以AC791N_WIFI_CAMERA工程为例子配置MCU屏,用户在其它工程的点MCU屏配置也可以类似参考部分。
步骤1:在对应的板子头文件里面配置使能TCFG_LCD_ENABLE宏定义,如下图5-4-1-1所示:
image 图5-4-1-1 LCD宏使能
步骤2:配置对应的MCU屏幕驱动使能和对应的IO口等基本信息的配置,如下图5-4-1-2所示:
image 图5-4-1-2 MCU屏幕驱动使能
步骤3:在lcd_config.h里面,定义MCU屏幕的宽&高,如下图5-4-1-3所示:
image 图5-4-1-3 定义MCU屏宽高
步骤4:将MCU屏的驱动添加参编译,我们以Makefile为例子添加驱动(codeblock直接add文件即可),如下图5-4-1-4所示:
image 图5-4-1-4 将MCU屏驱添加参与编译
步骤5:确认板级添加了屏相关的注册信息,如下图5-4-1-5所示:
image 图5-4-1-5 板级注册屏结构体
步骤6:修改MCU屏驱初始化内容,将屏厂提供的初始化序列写入到init_cmd_list数组里,如下图5-4-1-6所示:
image 图5-4-1-6 修改MCU屏初始化序列
步骤7:根据MCU屏的数据格式,配置主控输出RGB格式,如下图5-4-1-7所示:
image 图5-4-1-7 配置MCU屏RGB格式
步骤8:配置周期数、硬件信号线、data数据口、数据位宽和时钟等,配置如下图5-4-1-8所示:
image 图5-4-1-8 图5-3-1-8 配置硬件口和时钟等
步骤9:根据屏幕的实际分辨率,配置推屏时序,以320X480分辨率为例子,参考配置如下图5-4-1-9所示:
image 图5-4-1-9 配置MCU推屏时序
步骤10:若需要通过TE来推屏,需要配置如下参数(不使用TE推屏泽te_mode_en写0即可),参考配置如下图5-4-1-10所示:
image 图5-4-1-10 配置MCU屏TE

5.4.2 主控MCU参数说明

关于AC792N主控MCU屏参数的详细说明,参考如下的注释说明:

REGISTER_IMD_DEVICE_BEGIN(lcd_mcu_dev) = {
    .info = {
        .test_mode       = false,        //打开或关闭推纯色测试模式
        .test_mode_color = 0x0000ff,     //纯色测试模式颜色
        .bg_color         = 0x00ff00,    //背景颜色
        .xres              = __LCD_W,    //插值前显存水平分辨率
        .yres              = __LCD_H,    //插值前显存垂直分辨率
        .target_xres      = __LCD_W,     //插值后屏水平分辨率
        .target_yres      = __LCD_H,     //插值后屏垂直分辨率
        .sample          = SAMP_YUV420,  //采样方式 YUV420/YUV422/YUV444
        .format          = FORMAT_RGB565,//图层数据格式
        .len              = LEN_256,    //访问的块长度
        .interlaced_mode = INTERLACED_NONE,//隔行模式
        .rotate          = ROTATE_0,     // 旋转配置,旋转角度(90.0 / 180.0 / 270.0)

        .adjust = {    //颜色校正参数,一般可以默认,可通过屏效工具来调节
            .r_gain = 1.0,
            .g_gain = 1.0,
            .b_gain = 1.0,
            .bright_gain = 1.0,
            .contrast_gain = 1.0,
            .saturation_gain = 1.0,
            .mean = 128,
            .angle = 0,
            .mode = 0,
        },

        .in_rbs         = false, //输入数据RB交换
        .out_rbs        = false, //输出数据RB交换
        .in_fmt         = TCFG_LCD_INPUT_FORMAT,    //输入RGB数据格式
        .out_fmt        = LCD_OUT_RGB565,    //输出RGB数据格式
        .dither_en      = false, //使能dither 0低位截断 1dither
        .in_bt601       = false, //yuv422输入 转换0 bt601, 1 bt709
        .out_bt601      = false, //yuv422输出 转换0 bt601, 1 bt709
    },

    .data_out_endian = MODE_BE,  //RGB565模式生效 RGB888调节swap
    .set_io_hd       = 1,    //数据脚gpio_hd
    .ncycle          = CYCLE_TWO,     //推一个像素电需要的时钟数
    .data_width      = PORT_8BITS,    //硬件数据位宽

    .dclk_set        = CLK_DIS,    //dclk使能以及极性配置
    .sync0_set       = CLK_EN  | SIGNAL_DEN,       //DE/HSYNC/VSYNC
    .sync1_set       = CLK_DIS | SIGNAL_HSYNC,    //DE/HSYNC/VSYNC
    .sync2_set       = CLK_DIS | SIGNAL_VSYNC,    //DE/HSYNC/VSYNC

    .lcd_group       = PORT_GROUP_AA,    //数据输出端口选择
    .clk_cfg          = PLL2_CLK_192M   | DIVA_3 | DIVB_2,    //dpi clk时钟配置
    .dclk_cfg        = DPI_CLK_STD_48M | DIVA_1 | DIVB_1,    //dclk时钟配置

    .timing = {    //MCU屏推屏时序配置
        .hori_total             = (320 + 40) * 2,    /*水平时钟总数(Horizontal Line/HSD period)*/
        .hori_sync                 = 20 * 2,        /*水平同步时钟(HSYNC pulse width/HSD pulse width)*/
        .hori_back_porth         = 20 * 2,        /*水平起始时钟(HSYNC blanking/HSD back porth)*/
        .hori_pixel             = 320,            /*水平像素(Horizontal display area/HSD display period)*/

        .vert_total             = 480 + 20,    /*垂直同步总数(Vertical display area/VSD period time)*/
        .vert_sync                 = 10,       /*垂直同步时钟(VSYNC pulse width)*/
        .vert_back_porth_odd     = 10,        /*垂直起始时钟(VSYNC Blanking Odd field/VSD back porch Odd field)*/
        .vert_back_porth_even     = 0,        /*垂直起始时钟(隔行模式)(VSYNC Blanking Even field/VSD back porch Even field)*/
        .vert_pixel             = 480,        /*垂直像素(Vertical display area)*/
    },

},
REGISTER_IMD_DEVICE_END()

5.4.3 MCU屏调试步骤

在配置完MCU屏驱动的软件之后,一般参照如下步骤debug调试屏驱,步骤如下:
步骤1:使能.test_mode参数,配置主控输出纯色模式,如下图5-4-3-1所示:
image 图5-4-3-1 配置主控推出纯色模式
步骤2:打开推纯色模式后后,若MCU屏上没有推出纯色,需要先排查硬件原理设计、电源、复位脚等信号是否正常。一般推荐使用逻辑分析仪抓取初始化的序列是否写入正常,并同时确保每个data数据信号正常。
步骤3:若写入的初始化序列逻辑分析仪抓出来是对的,且各个信号示波器显示都正常;但是MCU屏依然无法显示纯出色,则需要联系屏厂确认初始化序列是否正常。有条件的情况下,请屏厂提供测试架或者进行抓取数据和信号对比差异。
步骤4:纯色模式正常后,使能.test_mode = 0,若系统能正常推出UI,则说明MCU点屏已经正常。
步骤5:若推UI和摄像头正常后,发现屏上有明显的切线,需要使能屏的TE来进行调节,首先确保屏本身已经有TE信号后,在配置主控的TE使能,配置方法参考5.4.1步骤10。

5.4.4 MCU屏常见问题及注意事项

1.跑起来一直打印imd busy pnd。

可能是由于屏幕宽高的分辨率配置不正常导致,检查_LCD_W和_LCD_H配置是否正确。

2.跑起来后打印的wr刷屏帧率很低。

如果wr刷屏时钟上不去,同时调整如下两个参数和分频系数。如下图所示5-4-4-1所示:
image 图 5-4-4-1 解决MCU屏wr竖屏帧率低

5.5 SPI屏软件配置、调试步骤及注意事项

5.5.1 spi屏软件配置步骤说明

  1. 板级文件(board_xxxx.c)中搜索如下结构体: image
  2. 配置文件(sdk\apps\common\lcd\include\lcd_board_cfg_template.h): image
  3. 板级配置文件配置SPI外设(board_xxxx.h) image 注意事项,根据TCFG_LCD1_SPI_INTERFACE设备名配置对应的外设,如下所示:
    image
  4. 从sdk现有的屏驱赋值一份修改,现有屏驱如下图所示 image
  5. 根据屏厂给的初始化代码修改InitCode结构体,如下所示: image

5.5.2 spi屏常见问题及注意事项

按照5.5.1章节配置正确后,如果屏幕不亮的排查方法

  1. 确保屏的init函数有被调用,如下所示: image
  2. 采用逻辑分析仪抓取波形,分析spi是否有数据发出,并且初始化代码是否正确
  3. 如果初始代码有发出,但是屏幕不亮,需要和屏厂那边联调,主要有采用屏自测程序验证初始代码下载成功,通过逻辑分析仪分析cs时序是否符合屏设备要求
  4. 跟屏厂确认一下,屏是spi线一线屏幕还是QSPI模式,如果是QSPI屏幕可以参考如下文档修改: AC792N 点QSPI屏幕 注意事项说明.otl

六:点摄像头sensor讲解

6.1.1 sensor驱动点亮步骤

a.需要点亮的sensor模组需要确保模组在测试架上能成功出图
b.确保sensor的三路电压avdd, dvdd, iovdd符合sensor datasheet给出的参考范围内。
c.根据所需的分辨率720P MIPI/DVP、25fps/30fps向sensor原厂申请sensor初始化序列。
d.查看sensor的datasheet 编写代码,配置sensor的上电时序,pwdn,reset引脚,配置mipi/dvp接口引脚,配置iic接口,读写sensor id,如果能成功读取sensor id并和手册对应的值一致,说明iic读写正常。
e.参照以上步骤配置,一般情况下,sensor就能正常出图。
注意点,如果没有读到sensor id一般是硬件问题,需要重点排查硬件,再进行以下步骤
Eg: 全文以sc1336为例,进行说明。
imageimage

6.1.2 sensor如何配置mipi/dvp接口

MIPI配置如下图所示:
Attention: xx_inv N对N, P对P,是0; N对P,是1,每个引脚都要对应配置对才能出图。
image DVP配置如下图所示:
image

6.1.3 sensor配置iic接口

a. iic接口分为硬件iic和软件iic,配置好之后需要和注册的一致
b.clk是时钟线,dat是数据线,另外一个是速率推荐是400k,当ae收敛不够快,可以适当提高速率
imageimage 开发版io接口设置在board_develop_ac79xx.h,配置在board_develop.c,
imageimageimage

6.1.4 sensor如何配置曝光和增益

a.Sensor需要正确配置曝光和增益,不然会导致sensor闪烁,噪点偏多,影响图像质量。
b.首先查看datasheet,找到曝光和增益相关寄存器,然后找到增益表,根据datasheet适配。
c.如何确定配置是否正确,可以晃动摄像头看是否有闪烁,通过日志查看配置的增益值和datasheet里面的增益值是否一致。
d.关键函数calc gain和calc shutter,set_gain和set_shutter。
e.函数配置主要是限制最小最大增益,以及最小和最大曝光,其它参考datasheet和sensor原厂给的demo配置
imageimage 下图sensor原厂给的demo
imageimage

6.1.4.1 calc_shutter/set_shutter

calc_shutter函数的目的是计算出曝光行,然后通过set_shutter函数写到相应的寄存器中,这里主要用到公式,曝光行= 一帧的曝光时间*pclk/行长,注意最小和最大曝光行,
image

6.1.5 sensor曝光表配置

6.1.5.1 曝光表含义

image 该曝光表有四列,第一列为曝光索引,第二列为曝光时间,单位为微秒,40000即表示40ms, 第三列ISO表示曝光的增益, 100表示曝光增益为1倍, 400为4倍,第四列为AE算法的插值类型,供isp算法内部使用,第二列曝光时间小于10000时,第四列要设为AE_INTERP_EXP, 其余情况均为AE_INTERP_GAIN,曝光表的最后一行要以{​AE_CURVE_END, 0, 0, 0​}结尾,在进行自动曝光控制时,ISP算法内部计算出当前场景的EV值,然后再根据EV值,搜索曝光表,得到对应的曝光时间和曝光增益,之后配置到sensor对应的寄存器

6.1.5.2 如何选择曝光表

Sensor驱动中的对应的xxx_ae.c有多组曝光表,isp通过xxx_get_ae_curve(u32 type, u32 fps, int *min_ev, *max_ev)函数获取驱动中给定的曝光表,通过当前参数type(工频干扰的类型),fps(帧率)来选择不同的曝光表,如果工频电压为50hz, 为避免工频干扰,则曝光时间需要是10ms的整数倍,如果工频电压为60hz,为避免工频干扰,则曝光时间需要是8.33ms的整数倍,当工频电压为50hz, 帧率为25fps时,最大的曝光时间正好是40ms(1000ms/25=40ms)

6.1.5.3 如何配置曝光表

曝光表可以自行调整,曝光时间满足帧率要求,增益满足线性增加,参数设置不要太极端,建议曝光表不要做修改用公版给的参数,如果要限制最大的增益可以修改xxx_ae.h中的min_ev值通过限制索引值限制住最大增益
image

6.1.6 ISP图像效果调试说明

可参考如下文档进行
AC531N ISPTOOL调试流程.pdf
AC792N系列图像调试说明.docx
DV20细节调试文档.docx

七:认证资料获取汇总

AC791N 和AC792N 蓝牙wifi相关认证固件个资料获取入口
认证资料获取汇总(最新资料后台会更新).otl

AC792NAC792X_WiFi蓝牙认证_20250715
https://www.kdocs.cn/l/ca0ZiSTvxJe6
792进入FCC定频模式方法.pdf
AC791NAC791_WIFI蓝牙认证固件20250526
JL791X_WiFi蓝牙认证20250526(2).zip
79X定频认证接线示意图.pdf

八: 常见问题说明(FAQ)

7.1.1 板子烧录后无打印信息,跑不起来

  1. 测量电流是否有10mA及以上,电流稳定有起来,检查串口是否有配置正确 比如拉IO 电平确定系统是否有真正跑起来
  2. 若电流未起来, 内存未配置正确, 或flash 问题等未兼容到
  3. 以上还不行,反馈杰理同学协助排查

7.1.2 UI工程编译报错问题

  1. 先仔细阅读 fw-AC792_SDK\ui_prj\UI工具使用指南.md 文档 获取UI工程(注意用模版方式创建,不要用离线ui工程可能没及时更新)
  2. 确保当前sdk版本是否和UI工程版本对应,若没有需要更新工具版本以及从GUI市场 市场项目中下载获取相应UI版本 image
  3. UI 风格是否选择正确 app_config.h中
    image
  4. UI打包后,代码编译报错 imageimage

找不到对应文件,由于generated文件夹下的ui 为GUI工具生成,有些文件原生sdk有,当工具重新生成后文件对应不上,可在codeblock去掉该对应文件,其他vscode编译则需要相应修改makefile 是否有差异。

7.1.3 点屏异常情况

可参考前面5.2.4 5.3.4 5.6小节说明

7.1.4 AC792N WIFI认证

JL792X_WiFi蓝牙认证.rar

7.1.5 接mipi镜头打印出现imc_err 打印

图像表现为闪或花的情况,参考如下文档调试,如未有改善可联系杰理技术同事
792X接MIPI摄像头打印imc_err问题分析.pdf

7.1.6 WIFI性能的测试

进入STA模式。连接实验室的热点,启动测试
AC79系列测试WiFi吞吐率步骤.pdf

7.1.7 如何定位死机跑飞问题

参考如下文档
AC79NN 如何定位异常死机问题.otl

7.1.8 如何查询自己sdk 所用的版本号

参考如下文档
AC79NN 查看详细版本号方法.otl

7.1.9 关于更新GUI工具后打包异常问题

介于目前gui工具使用过程中有弹窗提示升级gui工具

  1. 当升级gui工具后,之前旧版本的UI工程不能用问题,可回退切换到之前gui版本 如因sdk功能开发需要,需更新固件sdk版本的,ui需要移植到新版本的,可联系杰理工程团队协助
    image
  2. 部分客户使用gui工程请尽量使用在线模版方式创建 imageimage 如下离线方式ui工程一般更新不及时导致功能对应不上,不建议用
    image

7.2.0 网络常见问题汇总(...ing)

7.2.0.1 mqtt版本差异导致连接不上服务器问题

电脑能连上设备不能连接上mqtt服务器,抓包显示差异如下:
imageimage 经查阅资料该字段代表mqtt版本后,修改代码如下:
image

7.2.1 ram和video ram的使用

演示条件如下:
1. 硬件环境:开发板 2. 软件环境:demo hello 3. sdk版本:不限 sdk开机打印信息如下:
image 从上图中我们可以得知792有128k的ram还有128k的video ram,当video ram没有被摄像头和UI使用时,用户可以使用video ram,用法如下所示:

char buf[128] SEC_USED(.video_ram_user_bss) ;//暂时只能定位到bss段,不能给初始值
static void hello_demo_task(void *p)
{

    memset(buf,0,sizeof(buf));
    memcpy(buf, "123456780", 9);
    while (1)
    {
        msleep(1000);
        printf("\n >>>>>>buf = %s     buf add = 0x%x\n",buf,buf);
    }
}

7.2.2 PD8上电拉高异常复位说明

关于pd上电拉高复位,参考如下文档:
AC792N 系列 PD8口及AC791N系列的PB1口的使用注意.pdf
软件上电开机时候,在如下地方设置取消拉高复位功能,代码如下图所示:
image

7.2.3 DMA串口收数据时间长问题

由于DMA串口收数据属于连续接收,当多次检测clk空闲时才触发会中断,完成一次收数,目前公版配置的clk次数过多,导致超时时间长,修改方法如下图所示:
image

本文档包含以下子页面

  • AC792N芯片外设调试指南V1.0
  • AC792N硬件调试指南V1.0
  • AC791N和AC792N一拖二和一拖八烧录说明
  • AC792系列_卡升级使用说明v1.2
  • 792N系列 U盘单备份升级说明
  • 792x串口uart升级说明参考
  • AC792N 预留区资源OTA升级问题说明文档
  • AC792N 拓展预留区资源OTA升级问题说明文档
  • AC792N 点QSPI屏幕 注意事项说明
  • AC531N ISPTOOL调试流程
  • AC792N系列图像调试说明
  • DV20细节调试文档
  • 792进入FCC定频模式方法
  • 79X定频认证接线示意图
  • AC792N 系列 PD8口及AC791N系列的PB1口的使用注意
Prev
AC791N开发-入门到进阶开发指导文档(完善ing)
Next
792 littlefs文件系统配置