专栏算法工具链J6 环视快启sample

J6 环视快启sample

费小财2024-08-08
291
0

功能概述

环视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。

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的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目录找到。


soc侧配置修改


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

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

如果mcu已经开流,soc侧会跳过deserial、sensor的上电及初始化配置。

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


mcu侧运行

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

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


soc侧运行

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

算法工具链
社区征文征程6技术深度解析官方教程
评论0
0/1000