camx 马达的MSM_ACTUATOR_WRITE_DAC操作
为什么要分析 MSM_ACTUATOR_WRITE_DAC
目前的camx源码 省略了hw_mask 的处理。 一般来说 hw_mask 是0 ,但是对于非0情况 就会出现异常
mm-camera MSM_ACTUATOR_WRITE_DAC
驱动的处理
case MSM_ACTUATOR_WRITE_DAC:
value = (next_lens_position <<
write_arr[i].data_shift) |
((hw_dword & write_arr[i].hw_mask) >>
write_arr[i].hw_shift);
if (write_arr[i].reg_addr != 0xFFFF) {
i2c_byte1 = write_arr[i].reg_addr;
i2c_byte2 = value;
} else {
i2c_byte1 = (value & 0xFF00) >> 8;
i2c_byte2 = value & 0xFF;
}
i2c_tbl.reg_addr = i2c_byte1;
i2c_tbl.reg_data = i2c_byte2;
i2c_tbl.delay = delay;
a_ctrl->i2c_tbl_index++;
reg_setting.reg_setting = &i2c_tbl;
reg_setting.data_type = a_ctrl->i2c_data_type;
rc = a_ctrl->i2c_client.
i2c_func_tbl->i2c_write_table_w_microdelay(
&a_ctrl->i2c_client, ®_setting);
if (rc < 0) {
pr_err("i2c write error:%d\n", rc);
return rc;
}
break;
马达dw9714设置
.reg_tbl =
{
.reg_tbl_size = 1,
.reg_params =
{
{
.reg_write_type = ACTUATOR_WRITE_DAC,
.hw_mask = 0x0000000F,
.reg_addr = 0xFFFF,
.hw_shift = 0,
.data_shift = 4,
},
},
},
camx MSM_ACTUATOR_WRITE_DAC
驱动处理
case ActuatorOperation::WRITE_DAC_VALUE:
pWriteCmd = reinterpret_cast<CSLSensorI2CRandomWriteCmd*>
(static_cast<BYTE*>(pCmdBuffer) + offset);
pWriteCmd->header.count = 1;
pWriteCmd->header.opcode = CSLSensorI2COpcodeRandomWrite;
pWriteCmd->header.cmdType = CSLSensorCmdTypeI2CRandomRegWrite;
pWriteCmd->header.dataType = static_cast<UINT8>(pRegConfigTable->registerParam[i].regDataType);
pWriteCmd->header.addrType = static_cast<UINT8>(pRegConfigTable->registerParam[i].regAddrType);
pWriteCmd->regValPairs[0].reg = pRegConfigTable->registerParam[i].registerAddr;
pWriteCmd->regValPairs[0].val = targetPositionDAC << pRegConfigTable->registerParam[i].dataShift;
offset += sizeof(CSLSensorI2CRandomWriteCmd);
break;
马达dw9714设置
<!--Sequence of register configuration -->
<registerConfig>
<!--Actuator register configuration -->
<registerParam>
<!--Register address / data size in bytes -->
<regAddrType range="[1,4]">1</regAddrType>
<!--Register address / data size in bytes -->
<regDataType range="[1,4]">1</regDataType>
<!--Register address that is accessed -->
<registerAddr>0xFFFF</registerAddr>
<!--Register data to be programmed -->
<registerData>0</registerData>
<!--Actuator operations
Supported operations are: WRITE_HW_DAMP, WRITE_DAC, WRITE, WRITE_DIR_REG, POLL, READ_WRITE -->
<operation>WRITE_DAC_VALUE</operation>
<!--Delay in micro seconds -->
<delayUs>0</delayUs>
<!--Hardware mask -->
<hwMask>0x0000000F</hwMask>
<!--Number of bits to shift for HW -->
<hwShift>0</hwShift>
<!--Number of bits to shift for data -->
<dataShift>4</dataShift>
</registerParam>
</registerConfig>
总结
mm-camera架构成熟 对hwMask有进行处理
如果需要处理hwMask,思路就是对照mm-camera 打patch
马达还是那个马达 工作流程没有变