首页 > 其他分享 >征程 6 环视快启 sample

征程 6 环视快启 sample

时间:2024-10-23 20:44:09浏览次数:4  
标签:Camera 征程 快启 sample TCA9539 camera MODE mcu i2c

01 功能概述

环视 4V 解串器直接接到 main 域,mcu 访问 main 域 i2c、gpio、lpwm,对 camera sensor、serdes 以及 lpwm 进行初始化,完成环视的快速出图。

mcu 启动后,会在 mcu task 中调用 Camera_Init 接口,完成 camera sensor、serdes 以及 lpwm 的配置,并使能数据流,数据会通过加串器 bypass 给 IVI。

Camera_Init 中会先检查 AonSram 中当前需要配置的 camera 通路是否 working,如果 working 状态,接口将直接退出,当检查 flag 为非 working 状态时,会将需要使能通路 flag 设置为 working,并开始初始化环视,并使能数据流 bypass 给 IVI。

1.1 mcu 编译

mcu camera bypass 参考方案相关实现在 mcu/Service/Camera 目录下。

       ├── inc
       │  ├── camera_common_gpio.h        
       │  ├── camera_common_i2c.h        
       │  ├── camera_common_lpwm.h        
       │  ├── Camera_PreInit.h        
       │  ├── Camera_Setting.h        
       │  └── Camera_Sub.h        
       ├── SConscript        
       └── src        
       ├── Camera_Autosar.c        
       ├── camera_common_lpwm.c        
       ├── Camera_PreInit.c        
       ├── camsys_common_gpio.c        
       ├── camsys_common_i2c.c        
       └── I2c_Operation.c

由于 mcu 调试环境不适合 camera sensor & serdes 的调试工作,所以 camera sensor & serdes 的调试需要在 acore 侧进行,由 acore 完成 camera sensor & serdes 调试,调试完成后通过 libcam 提供的 setting dump 命令得到 setting 文件,如 camdump-hbn_camera_test-608660-639939578641.log.i2c。

在开发板执行如下命令,会在/log/camera 目录下得到 dump 的 setting 文件:

       # 创建默认 dump 目录:
        mkdir -p /log/camera
        # 关闭诊断功能:
        export CAM_DIAG_DISABLE=1
        # 关闭内参预读功能:
        export CAM_IPARAM_MODE=1
        # 打开 debug 功能,不打印,但正常初始化并(开流完)后 dump 到文件:同时 i2c 源记录
        export CAM_DEBUG_LEVEL=0x2201
        # 打开 debug 功能,不打印,但正常初始化完(不开流)后 dump 到文件:同时 i2c 源记录
        export CAM_DEBUG_LEVEL=0xa01
        # 运行相应的配置,如:RX4/96724 4V 环视 HK ISX031
        /app/testcase/S10_Camera/testsuite/scripts/hbn_camera_test.sh 4v_yuv_cim0_ddr_1536p_isx031 config_HK_F196P1_MAX96724 R4
        # 或:RX4/96724 4V 环视 SENSING ISX031
        /app/testcase/S10_Camera/testsuite/scripts/hbn_camera_test.sh 4v_yuv_cim0_ddr_1536p_isx031 config_SENSING_F190S0T7_MAX96724 R4       # 创建默认 dump 目录:        mkdir -p /log/camera        # 关闭诊断功能:        export CAM_DIAG_DISABLE=1        # 关闭内参预读功能:        export CAM_IPARAM_MODE=1        # 打开 debug 功能,不打印,但正常初始化并(开流完)后 dump 到文件:同时 i2c 源记录        export CAM_DEBUG_LEVEL=0x2201        # 打开 debug 功能,不打印,但正常初始化完(不开流)后 dump 到文件:同时 i2c 源记录        export CAM_DEBUG_LEVEL=0xa01        # 运行相应的配置,如:RX4/96724 4V 环视 HK ISX031        /app/testcase/S10_Camera/testsuite/scripts/hbn_camera_test.sh 4v_yuv_cim0_ddr_1536p_isx031 config_HK_F196P1_MAX96724 R4        # 或:RX4/96724 4V 环视 SENSING ISX031        /app/testcase/S10_Camera/testsuite/scripts/hbn_camera_test.sh 4v_yuv_cim0_ddr_1536p_isx031 config_SENSING_F190S0T7_MAX96724 R4

在得到 dump 的 setting 文件后,地平线提供工具 Camera_Setting_Tools 对 dump 的 setting 文件进行解析,进而得到 mcu 侧可用的 Camera_Setting.h 文件。

       ./Camera_Setting_Tools camdump-hbn_camera_test-23984-48446987219.log.i2c

Camera_Setting.h 文件中包含 i2c bus、i2c 寄存器、gpio 操作、延时等,完全复用 acore 执行侧时序进行初始化。

Camera_Setting.h 中的结构:

typedef struct {
                uint8_t bus; // i2c bus num
                uint8_t i2c_addr; // i2c addr, exception:(i2c_addr \| alen \| dlen) = 0 for gpio
                uint8_t i2c_op; // read/write/sleep
                uint8_t alen; // i2c reg addr length, exception:(i2c_addr \| alen \| dlen) = 0 for gpio
                uint8_t dlen; // i2c reg val length, exception:(i2c_addr \| alen \| dlen) = 0 for gpio
                uint32_t reg_addr; // i2c reg addr or gpio
                uint32_t value; // i2c reg value or gpio val
                uint32_t time_us; // i2c timestemp
                uint32_t delay_us; // i2c timestemp
        } cam_i2c_info_t;

lpwm 的配置在 camera_common_lpwm.c 文件中,根据需要配置 lpwm 参数,将参数填入 g_LpwmAttr 的初始化。

由于该参考方案需要 mcu 跨域访问 i2c & ioext,而默认 mcu 侧不一定配置了 main 域的 i2c & ioext,所以需要确认需要访问的 i2c bus 以及 gpio 是否需要额外配置,如果需要额外配置,需要对 i2c 以及 ioext 的 Config 进行修改,并在 Camera_PreInit.c 中增加适配,并在 mcu HorizonTask.c 中 I2c_Init()之前调用 Camera_PreInit.h 中提供的 Camera_PreInit()接口。

I2c 配置 matrix A 参考修改:

mcu/Config/McalCdd/gen_matrix_A/I2c/inc/I2c_PBcfg.h

将#define I2C_CONFIG_CHANNEL (4U)定义修改为#define I2C_CONFIG_CHANNEL (10U)。

#define I2C_CONFIG_CHANNEL (10U)
mcu/Config/McalCdd/gen_matrix_A/I2c/src/I2c_PBcfg.c
将 I2cConfig[4]初始化修改为 I2cConfig[10],并进行初始化。
        const I2c_ConfigType I2cConfig[10] =
        {
                {
                        I2cHwChannel0,
                        MASTER_MODE,
                        ADDRESS_7_BITS,
                        I2C_FAST_MODE,
                        0
                },
                {
                        I2cHwChannel1,
                        MASTER_MODE,
                        ADDRESS_7_BITS,
                        I2C_FAST_MODE,
                        0
                },
        {
                        I2cHwChannel2,
                        MASTER_MODE,
                        ADDRESS_7_BITS,
                        I2C_FAST_MODE,
                        0
                },
                {
                        I2cHwChannel3,
                        MASTER_MODE,
                        ADDRESS_7_BITS,
                        I2C_FAST_MODE,
                        0
                },
                {
                        I2cHwChannel4,
                        MASTER_MODE,
                        ADDRESS_7_BITS,
                        I2C_FAST_MODE,
                        0
                },
                {
                        I2cHwChannel5,
                        MASTER_MODE,
                        ADDRESS_7_BITS,
                        I2C_FAST_MODE,
                        0
                },
                {
                        I2cHwChannel6,
                        MASTER_MODE,
                        ADDRESS_7_BITS,
                        I2C_STANDARD_MODE,
                        0
                },
        {
                        I2cHwChannel7,
                        MASTER_MODE,
                        ADDRESS_7_BITS,
                        I2C_STANDARD_MODE,
                        0
                },
                {
                        I2cHwChannel8,
                        MASTER_MODE,
                        ADDRESS_7_BITS,
                        I2C_STANDARD_MODE,
                        0
                },
        {
                        I2cHwChannel9,
                        MASTER_MODE,
                        ADDRESS_7_BITS,
                        I2C_STANDARD_MODE,
                        0
                },
        };

ioext 配置 matrix A 参考修改:

mcu/Config/McalCdd/gen_matrix_A/IoExt/inc/TCA9539_Cfg.h

增加 acore tca9539 拓展 io i2c bus 定义

       #define TCA9539_ACORE_I2C_CHANNEL               5U
TCA9539_DEVICE 中增加参数 TCA9539_DEVICE2
        typedef enum
        {
                        TCA9539_DEVICE0 = 0,
                        TCA9539_DEVICE1 = 1,
                        TCA9539_DEVICE2,  // add for acore TCA9539
                        TCA9539_DEVICE_MAX
        } TCA9539_DEVICE;
mcu/Config/McalCdd/gen_matrix_A/IoExt/src/TCA9539_Cfg.c
TCA9539_DeviceMapping 增加{TCA9539_ACORE_I2C_CHANNEL, 0x74u}参数
        const TCA9539_DeviceMappingType TCA9539_DeviceMapping[TCA9539_DEVICE_MAX] =
        {
                        {TCA9539_0_I2C_CHANNEL, 0x74u},    /* Device 0 */
                        {TCA9539_0_I2C_CHANNEL, 0x75u},    /* Device 1 */
                        {TCA9539_ACORE_I2C_CHANNEL, 0x74u},   /* Device acore */
        };
TCA9539_RegRecord 增加{{0u, 0u}, {0xFFu, 0xFFu}, {0u, 0u}, {0xFFu, 0xFFu}参数
        TCA9539_RegRecordType TCA9539_RegRecord[TCA9539_DEVICE_MAX] =
        {
                {
                        {0u, 0u},
                        {TCA9539_0_OUTPUT_LEVEL_0, TCA9539_0_OUTPUT_LEVEL_1},
                        {TCA9539_0_POLORITY_INVERSION_0, TCA9539_0_POLORITY_INVERSION_1},
                        {TCA9539_0_CONFIGURATION_0, TCA9539_0_CONFIGURATION_1}
                },
                {
                        {0u, 0u},
                        {TCA9539_1_OUTPUT_LEVEL_0, TCA9539_1_OUTPUT_LEVEL_1},
                        {TCA9539_1_POLORITY_INVERSION_0, TCA9539_1_POLORITY_INVERSION_1},
                        {TCA9539_1_CONFIGURATION_0, TCA9539_1_CONFIGURATION_1}
                },
                {
                        {0u, 0u},
                        {0xFFu, 0xFFu},
                        {0u, 0u},
                        {0xFFu, 0xFFu}
                },
        };

在生成完 Camera_Setting.h 并配置好 g_LpwmAttr 后以及适配完 i2c&ioext 后:

  • 将 Camera_PreInit()函数放在 mcu 初始化任务中,注意要在 I2c_Init(NULL_PTR)之前。
  • 将 Lpwm_Ops(0, 0)和 Camera_Init()放在 task 中只执行一次,就可以编译 mcu 镜像了。

注:

  1. 如果是解串器接到 switch 并分别接到 mcu 侧 i2c bus 和 acore i2c bus,需要将解析后的 Camera_Setting.h 文件中 bus 替换成 mcu 侧对应 bus,且不需要对 I2c_PBcfg 以及 IoExt_PBcfg 进行额外适配修改。
  2. Camera_Setting_Tools 工具可在 mcu 工程 mcu/Tools/mcu_camsys_tools 目录找到。

1.2 soc 侧配置修改

soc 侧在环视 4V 快起时,需要在 hb_j6dev.json 中 deserial 的配置添加"flags":"0x20",表示打开环视 4V 快起功能。

打开该功能后,soc 在初始化时,会通过 i2c 读取 deserial 的 0x108 寄存器判断是否 mcu 已经开流。

  • 如果 mcu 已经开流,soc 侧会跳过 deserial、sensor 的上电及初始化配置。
  • 如果 mcu 未开流,soc 侧会对 deserial、sensor 进行正常的上电及初始化配置。

1.3 mcu 侧运行

mcu 启动后,通过 i2cdetect 确认检查 camera 设备被扫到。

确认是否出流可以通过加串器出流寄存查看:I2c_Read 3 0x27 16 8 0x108

1.4 PYM-Sample

soc 侧可通过以下命令打开环视 4V,进行测试验证。

/app/sample/S83_Sample/S83E04_Module/camera_sample/scripts/camera_sample.sh matrix 4V_4xISX031_RX4_HK_SYNC t33554432

deserial 判断 mcu 是否已经初始化:

sensor 判断 mcu 是否已经初始化:

soc 侧也可通过以下命令打开 3V,进行测试验证。

/app/sample/S83_Sample/S83E04_Module/camera_sample/scripts/camera_sample.sh matrix 3V_2xOVX8B_1xOVX3C_RX0

标签:Camera,征程,快启,sample,TCA9539,camera,MODE,mcu,i2c
From: https://www.cnblogs.com/horizondeveloper/p/18498319

相关文章

  • 信创与国产化OCR:迈向创新与自主的伟大征程
    什么是信创与国产化?信创(信息技术应用创新)是近年来中国推动信息技术国产化的核心战略。其目标是在信息技术领域实现自主可控,依赖国产化的硬件、软件和基础设施,确保国家信息安全。信创与国产化不仅仅是技术创新,更是中国在全球科技竞争中掌握话语权的关键一步。信创与国产化的......
  • 征程 6E DISPLAY 功能介绍及上手实践
    01功能概述本文将带大家一起实现单路、多路MIPICSITX输出、IDU回写、IDUoneshot模式、绑定输出VPS数据等功能,此处主要介绍各sample的实现与使用方法。02软件架构说明本文中绑定VPS输出功能基于libvioAPI实现,调用libvio提供的API,同时通过配置文件的方式,实......
  • lintsampler:高效从任意概率分布生成随机样本的新方法
    在实际应用中,我们经常需要从给定的概率密度函数(PDF)中抽取随机样本。这种需求在多个领域都很常见,例如:估计统计量进行蒙特卡洛模拟生成粒子系统用于物理仿真对于标准概率分布,如均匀分布或高斯分布(正态分布),numpy和scipy生态系统提供了现成的解决方案。通过numpy.rand......
  • prometheus 报错 Error on ingesting samples that are too old or are too far into
    level=warnts=2021-08-16T03:20:04.960Zcaller=scrape.go:1507component="scrapemanager"scrape_pool=mtailtarget=http://18.167.146.20:3903/metricsmsg="Erroroningestingsamplesthataretoooldoraretoofarintothefuture"num_dro......
  • Sample Game
    期望DP做法:建立正确的OI直觉:\(x^2\)的期望可以通过\(x\)的期望递推得出,\({(x+1)}^{2}=x^2+2x+1\)推式子的时候可以省去括号生成函数做法:注意到取出的数一定是单调不减的(除了最后一个数),为了让数列变美观,我们考虑怎样拿掉最后一个数。直接拿掉是不美的,我们考虑前缀和转化:\(P(le......
  • 征程6 NV12 理论与代码详解
    1.引言使用地平线征程6算法工具链进行模型部署时,如果你的模型输入是图像格式,通常会遇到如下信息。对于初学者,可能会存在一些疑问,比如:nv12是什么?明明算法模型是一个输入,为什么看hbm模型,有y和uv两个输入?为什么uv的validshape不是(1,224,224,2),而是(1,112,112,2)s......
  • 征程6 工具链常用工具和 API 整理(含新手示例)
    1.引言征程6工具链目前已经提供了比较丰富的集成化工具和接口来支持模型的移植和量化部署,本帖将整理常用的工具/接口以及使用示例来供大家参考,相信这篇文章会提升大家对征程6工具链的使用理解以及效率。干货满满,欢迎访问2.hb_config_generatorhb_config_generator是用于获......
  • 征程6 上基于 DEB 工具实现包管理
    1.引言在开发、调测过程中,开发人员需要将系统软件、应用软件部署到Soc板端,以用于运行调试。传统的部署方式是通过解压复制或者调用部署脚本。这样的部署方式需要有着方式不统一、维护投入大的缺点。在linux系统上,大多采用包管理的方式管理软件包,常见的包管理方式如上。相比......
  • 征程 6E/M 快速上手实战 Sample-Camera
    01Camera模块简述本文档简单介绍Camera子系统软件架构、列出已支持的Camera模组,并提供相应的配置说明,同时引用Sensor点亮调试方法介绍一颗新模组接入的步骤,再按根据重要功能按专题介绍接入方案限制、EMB接收等,并最终汇总平台已有单板的Camera接入使用说明,用于指导征......
  • 思维的力量:智商测试开启挑战智商界的征程!
    智力测试就是对智力的科学测试,它主要测验一个人的思维能力、学习能力和适应环境的能力。现代心理学界对智力有不同的看法。所谓智力就是指人类学习和适应环境的能力。智力包括观察能力、记忆能力、想象能力、思维能力等等。智商测试的意义评估智力水平:智商测试可以量化评估......