征程 6 環(huán)視快啟 sample
01 功能概述
環(huán)視 4V 解串器直接接到 main 域,mcu 訪問(wèn) main 域 i2c、gpio、lpwm,對(duì) camera sensor、serdes 以及 lpwm 進(jìn)行初始化,完成環(huán)視的快速出圖。
mcu 啟動(dòng)后,會(huì)在 mcu task 中調(diào)用 Camera_Init 接口,完成 camera sensor、serdes 以及 lpwm 的配置,并使能數(shù)據(jù)流,數(shù)據(jù)會(huì)通過(guò)加串器 bypass 給 IVI。
Camera_Init 中會(huì)先檢查 AonSram 中當(dāng)前需要配置的 camera 通路是否 working,如果 working 狀態(tài),接口將直接退出,當(dāng)檢查 flag 為非 working 狀態(tài)時(shí),會(huì)將需要使能通路 flag 設(shè)置為 working,并開始初始化環(huán)視,并使能數(shù)據(jù)流 bypass 給 IVI。
1.1 mcu 編譯
mcu camera bypass 參考方案相關(guān)實(shí)現(xiàn)在 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 調(diào)試環(huán)境不適合 camera sensor & serdes 的調(diào)試工作,所以 camera sensor & serdes 的調(diào)試需要在 acore 側(cè)進(jìn)行,由 acore 完成 camera sensor & serdes 調(diào)試,調(diào)試完成后通過(guò) libcam 提供的 setting dump 命令得到 setting 文件,如 camdump-hbn_camera_test-608660-639939578641.log.i2c。
在開發(fā)板執(zhí)行如下命令,會(huì)在/log/camera 目錄下得到 dump 的 setting 文件:
# 創(chuàng)建默認(rèn) dump 目錄:
mkdir -p /log/camera
# 關(guān)閉診斷功能:
export CAM_DIAG_DISABLE=1
# 關(guān)閉內(nèi)參預(yù)讀功能:
export CAM_IPARAM_MODE=1
# 打開 debug 功能,不打印,但正常初始化并(開流完)后 dump 到文件:同時(shí) i2c 源記錄
export CAM_DEBUG_LEVEL=0x2201
# 打開 debug 功能,不打印,但正常初始化完(不開流)后 dump 到文件:同時(shí) i2c 源記錄
export CAM_DEBUG_LEVEL=0xa01
# 運(yùn)行相應(yīng)的配置,如:RX4/96724 4V 環(huán)視 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 環(huán)視 SENSING ISX031
/app/testcase/S10_Camera/testsuite/scripts/hbn_camera_test.sh 4v_yuv_cim0_ddr_1536p_isx031 config_SENSING_F190S0T7_MAX96724 R4
# 創(chuàng)建默認(rèn) dump 目錄: mkdir -p /log/camera # 關(guān)閉診斷功能: export CAM_DIAG_DISABLE=1 # 關(guān)閉內(nèi)參預(yù)讀功能: export CAM_IPARAM_MODE=1 # 打開 debug 功能,不打印,但正常初始化并(開流完)后 dump 到文件:同時(shí) i2c 源記錄 export CAM_DEBUG_LEVEL=0x2201 # 打開 debug 功能,不打印,但正常初始化完(不開流)后 dump 到文件:同時(shí) i2c 源記錄 export CAM_DEBUG_LEVEL=0xa01 # 運(yùn)行相應(yīng)的配置,如:RX4/96724 4V 環(huán)視 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 環(huán)視 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 對(duì) dump 的 setting 文件進(jìn)行解析,進(jìn)而得到 mcu 側(cè)可用的 Camera_Setting.h 文件。
./Camera_Setting_Tools camdump-hbn_camera_test-23984-48446987219.log.i2c
Camera_Setting.h 文件中包含 i2c bus、i2c 寄存器、gpio 操作、延時(shí)等,完全復(fù)用 acore 執(zhí)行側(cè)時(shí)序進(jìn)行初始化。
Camera_Setting.h 中的結(jié)構(gòu):
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 文件中,根據(jù)需要配置 lpwm 參數(shù),將參數(shù)填入 g_LpwmAttr 的初始化。
由于該參考方案需要 mcu 跨域訪問(wèn) i2c & ioext,而默認(rèn) mcu 側(cè)不一定配置了 main 域的 i2c & ioext,所以需要確認(rèn)需要訪問(wèn)的 i2c bus 以及 gpio 是否需要額外配置,如果需要額外配置,需要對(duì) i2c 以及 ioext 的 Config 進(jìn)行修改,并在 Camera_PreInit.c 中增加適配,并在 mcu HorizonTask.c 中 I2c_Init()之前調(diào)用 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],并進(jìn)行初始化。
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 中增加參數(shù) 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}參數(shù)
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}參數(shù)
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()函數(shù)放在 mcu 初始化任務(wù)中,注意要在 I2c_Init(NULL_PTR)之前。
將 Lpwm_Ops(0, 0)和 Camera_Init()放在 task 中只執(zhí)行一次,就可以編譯 mcu 鏡像了。
注:
如果是解串器接到 switch 并分別接到 mcu 側(cè) i2c bus 和 acore i2c bus,需要將解析后的 Camera_Setting.h 文件中 bus 替換成 mcu 側(cè)對(duì)應(yīng) bus,且不需要對(duì) I2c_PBcfg 以及 IoExt_PBcfg 進(jìn)行額外適配修改。
Camera_Setting_Tools 工具可在 mcu 工程 mcu/Tools/mcu_camsys_tools 目錄找到。
1.2 soc 側(cè)配置修改
soc 側(cè)在環(huán)視 4V 快起時(shí),需要在 hb_j6dev.json 中 deserial 的配置添加"flags":"0x20",表示打開環(huán)視 4V 快起功能。
打開該功能后,soc 在初始化時(shí),會(huì)通過(guò) i2c 讀取 deserial 的 0x108 寄存器判斷是否 mcu 已經(jīng)開流。
如果 mcu 已經(jīng)開流,soc 側(cè)會(huì)跳過(guò) deserial、sensor 的上電及初始化配置。
如果 mcu 未開流,soc 側(cè)會(huì)對(duì) deserial、sensor 進(jìn)行正常的上電及初始化配置。
1.3 mcu 側(cè)運(yùn)行
mcu 啟動(dòng)后,通過(guò) i2cdetect 確認(rèn)檢查 camera 設(shè)備被掃到。
確認(rèn)是否出流可以通過(guò)加串器出流寄存查看:I2c_Read 3 0x27 16 8 0x108
1.4 PYM-Sample
soc 側(cè)可通過(guò)以下命令打開環(huán)視 4V,進(jìn)行測(cè)試驗(yàn)證。
/app/sample/S83_Sample/S83E04_Module/camera_sample/scripts/camera_sample.sh matrix 4V_4xISX031_RX4_HK_SYNC t33554432
deserial 判斷 mcu 是否已經(jīng)初始化:
sensor 判斷 mcu 是否已經(jīng)初始化:
soc 側(cè)也可通過(guò)以下命令打開 3V,進(jìn)行測(cè)試驗(yàn)證。
/app/sample/S83_Sample/S83E04_Module/camera_sample/scripts/camera_sample.sh matrix 3V_2xOVX8B_1xOVX3C_RX0
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。