征程 6E camera diag sample
01 功能概述
本文的 demo sample 主要描述当前 camera 相关外设诊断的当前状态,并提供自定义实现的方法及使用说明。
1.1 软件架构说明
本 sample 基于现已实现的 camera 诊断架构,libcam 内的外设诊断功能对外设硬件状态进行监测,并支持将故障状态发送给 MCU 处理,或通过事件回调方式通知应用处理。
若打开诊断功能且使能诊断报告发送时,在 libcam.so 中会引用 libdiaglib.so 中的诊断发送 API,将诊断信息发送给 MCU,再由 MCU 侧进行处理。
若应用通过 API 注册了 camera 的事件回调处理函数,则会在故障状态变化时,通过该回调通知到应用进行处理。
Camera 外设诊断数据通路,默认支持应用注册的事件回调通知,但不发送诊断报告给 MCU,此处以 sample 形式提供,用户可根据实际项目或应用需要,进行定制,本文提供相应的定制使用说明。
1.2 诊断功能说明
Camera 外设诊断在 libcam 内实现,默认已实现了部分 Sensor/Serdes/Poc 设备的诊断功能,其在内部进行了诊断功能预定义,并以 diag_id 作为唯一识别索引,由诊断功能实现及实际硬件使用情况决定其值,可描述一个指定外设硬件的相应故障,关于其定义可参见: :ref:camera diag id。
此处定义的 camera 外设诊断,在 libcam 主体库中实现了框架,具体的外设诊断则由各 Sensor/Deserial 等子库定制实现:按主体框架的要求及外设功能安全手册描述,定义诊断 node 并向主体框架注册。
用户可根据实际应用需求,进行自定义定制开发与使用:
提供诊断功能的开关,默认打开状态,支持主动关闭诊断功能。
内部有默认的诊断信息隐射关系,可进行诊断信息的自定义诊断信息映射。
支持配置打开或关闭发送与回调功能。
1.3 代码位置与目录结构
API 流程说明
以下为 camera 诊断中相关的 API 调用流程:
此处的 :ref:hb_cam_set_event_callback 为可选调用,若应用需要处理 camera 诊断事件,可在初始化完成之后通过该 API 进行回调注册,之后在有故障发生或恢复时会通过该回调通知应用处理。
02 定制开发
本文中的 camera 外设诊断功能已在 libcam 库中实现,并默认打开编译集成,若有相应的定制需求,可参考下文进行开发。
2.1 诊断编译配置
该 camera 外设诊断功能由 libcam 中 Kconfig 的编译配置选项 HB_PKG_LIBCAM_DIAG 决定是否编译使能,其默认值为 y,集成使用,若需要关闭该功能可按下操作:
在关闭该诊断功能之后,src/diag 目录中的代码则直接不会编译集成到 libcam 库中,关闭诊断功能不影响正常数据处理功能。
camera 的自恢复功能依赖诊断功能,若关闭诊断功能,则自恢复功能也将失效。
此处 libcam 中的诊断报告默认使用诊断 API 进行诊断状态报告,因此在应用集成时若编译报错,需注意对该 libdiaglib 库的引用。
上述诊断报告的发送,可通过配置头文件 src/inc/private/cam_config.h 中的宏 CAM_CONFIG_LIBDIAG_EN 关闭:
注释该宏 CAM_CONFIG_LIBDIAG_EN 的定义即可关闭诊断发送功能,关闭后将不会发送诊断信息到 MCU,而由一行打印替代。
2.2 诊断信息映射
camera 诊断内部由 diag_id 唯一定义,在报告给 MCU 或用户时,可根据实际需要进行映射,将其转换为 module_id/event_id 进行报告。
目前内默认有一组映射关系,详见: :ref:诊断报告映射关系说明 。
该组默认的映射关系由 2 部分组成,用户可根据实际需要进行修改:按诊断类型定义了 module_id 的 BASE 值,定义在 src/diag/report/report.h 内:
若要完全修改映射的对应关系,也可以直接修改 src/diag/report/report.c 内的 cam_diag_mapping() 函数实现,目前默认为:
此处只需要按需要重新定义 diag_id 与 module_id/event_id 的映射关系,并在上述函数中实现 该转换即可,之后的诊断发送与回调则会使用转换后的 module_id/event_id 进行处理。
此处自定义并转换的 module_id 及 event_id 在满足项目需求的同时,还需满 J6X FUSA 错误集成策略
的要求,本文中的 camera 外设诊断在错误等级定义上都属于 NCF 错误。
2.3 诊断信息处理
默认支持诊断事件回调通知功能,若有处理需要,应用可通过 :ref:hb_cam_set_event_callback
注册回调函数之后即可在诊断故障或恢复时进行相应的处理,示例如下:该回调函数是按 port 注册的,支持对不同通路使用不同的回调处理函数,若通路不注册该回调,则不会收到处理通知。
若打开诊断发送功能,在出现故障时,该诊断信息会被发送到 MCU 侧,由 MCU 侧进行处理,此处在发送的信息中已将 module_id 与 event_id 分别按 2 字节(LSB)信息填充在 payload 中,处理时可用。
上为 MCU 侧的处理实现示例。
03 测试使用
3.1 诊断开关
若在编译集成时集成了诊断功能,则默认该诊断功能处于打开状态,若想在运行时也可以主动关闭诊断功能,有以下方式可关闭:
配置方式
配置环境变量方式
直接环境变量方式
上述方式都可以关闭诊断功能,其中配置方式多用于集成固化,环境变量方式多用于临时调试,请根据需要使用。
3.2 诊断报告与回调开关
在已打开诊断功能的前提下,对诊断报告的处理,支持报告给 MCU 与回调通知应用,默认为不报 MCU 但通知回调,若想修改该开关,有以下方式:
配置环境变量方式
直接环境变量方式
3.3 测试示例
此处以 1V 测试场景 1V_OVX8B_RX0 示例,使用 E 参数打开回调测试。
在上述 case 运行过程中,可操作寄存器进行错误注入及清除,此处仅为一种方式的示例,更多错误注入方式请参考外设手册:
测试有 log 如下,可看到有几个诊断事件的错误及恢复信息报出:
同时 logcat 中也有相关的诊断与报告等信息(此处仅为示例展示,若中间有 log 打印信息变化不一定严格对应):
并在 dmesg 中收到相应的诊断信息(此处仅为示例展示,若中间有 log 打印信息变化不一定严格对应):
同时 MCU 侧会收到相应的诊断报告信息(此处仅为示例展示,若中间有 log 打印信息变化不一定严格对应):
3.4 注意事项
上述示例仅为单路接入使用在特定硬件上的使用及注入测试,且在诊断功能已实现的前提下进行的测试示例。
对于自定义硬件及场景,则需根据实际硬件进行相应的配置,并适配相应的测试注入命令进行功能验证。
评论