1.概述
actuator驅動信息文件是指vendor目錄下的$ActuatorName_actuator.h文件(如gigaset_actuator.h)。此信息文件就是一個actuator_driver_ctrl_t結構體。包括actuator_params與actuator_tuned_params兩部分,即driver與tunning兩部分。文檔以目前最主流的VCM為例進行參數的介紹。
2.driver部分信息——actuator_params
act_type: actuator類型,目前就VCM、PIEZO及HVCM三種
data_size:數據長度(VCM指傳輸lens位置的數據長度?)
init_settings:actuator的初始化參數
reg_tbl:寄存器列表,用來下actuator移動參數,這些參數又包括如下一些參數選項
reg_write_type:寫入數據的格式,VCM一般使用DAC,10位表示0~1023
reg_addr:寫入數據寄存器地址,如果不需要具體地址,則配置為0xFFFF
data_shift:數據對應寄存器的移位
hw_mask:其它bit位的控制設置,比如VCM的ring_ctrl
hw_shift:控制設置對應寄存器的移位
reg_tbl部分舉例AD5823如下:
.reg_tbl =
{
.reg_tbl_size = 1,
.reg_params =
{
{
.reg_write_type = MSM_ACTUATOR_WRITE_DAC,
.hw_mask = 0x00000400, ////除data外的其它b it位的mask
.reg_addr = 0x04, //寄存器寫地址為reg04
.hw_shift = 0, //hw_mask已經制定了明確的bit位,所以不再需要移位
.data_shift = 0, //reg05[7:0]為數據,所以不需要移位
},
},
},
查看驅動代碼大致如下:
value = (next_lens_position <<
write_arr[i].data_shift) |
((hw_dword & write_arr[i].hw_mask) >>
write_arr[i].hw_shift);
最終獲得I2C數據代碼如下:
i2c_byte1 = (value & 0xFF00) >> 8; // 對應reg04寄存器值
i2c_byte2 = value & 0xFF; //對應reg05寄存器值
這里獲得的value及需要寫入寄存器的值,上面的hw_dword參數來自於tunning參數表中的hw_params (此驅動的hw_params值為0x00000400)。下面再來看看AD5823的寄存器介紹:
上圖中reg04的bit[3]設置是否開啟RING_CTRL模式,bit[7:4]為零,由前面講到的hw_dword及hw_mask來設置。
再舉例DW9714如下:
.reg_params =
{
{
.reg_write_type = MSM_ACTUATOR_WRITE_DAC,
.hw_mask = 0x0000000F, //除data外的其它b it位的mask
.reg_addr = 0xFFFF, //沒有寄存器地址
.hw_shift = 0, //hw_mask已經制定了明確的bit位,不再需要移位
.data_shift = 4, //10bit的數據移位
},
},
再看DW9714規格書寄存器介紹如下:
與代碼對比可以看出,byte2的S[3:0]對應給出了mask位,需要根據tunning參數的hw_dword來確定具體的模式,此驅動給出的tunning參數為0x00000004,即S[3:0]-0100;而PD及FLAG被設置為0。
3. tunning部分——actuator_tuned_params
tunning參數分為向近景方向移動與向遠景方向移動兩部分(MOVE_NEAR&MOVE_FAR),每個部分又可設定多個移動場景,各個場景參數可以單獨設定,以便實現更細化的控制。
高通在這里實現了一個lens位置數組,數組中的具體值對應着實際的lens位置,所以在驅動中可以看到step_pos與lens_pos兩個參數,分別對應詞數組表的下標index及當前index對應的值(此值為lens的實際位置)。代碼體現如下:
curr_lens_pos = a_ctrl->step_position_table[a_ctrl->curr_step_pos];
具體一些參數介紹如下:
initial_code:初始lens的位置,對應VCM的0~1023的范圍
scenario_size:向近景與遠景方向移動部分的場景數
ringing_scenario: 各對應場景向近景與遠景方向的移動步數最大值
region_size:對lens的移動進行多個區段划分,可實現更細化的設置(針對非線性?)
region_params:對應每個區段的在移動步數表中的index范圍,即bound
step_bound:對應具體的macro及infinity的bound邊界值,所有區段合起來就是總 長度(對應上面提到的表的長度)
code_per_step:在當前分區中每個step對應移動的實際lens長度
上面這些參數一起最終聲場移動步數表數組,具體在msm_actuator_init_step_table函數中實現,具體可查看代碼(msm_actuator.c文件),關鍵語句:
cur_code = set_info->af_tuning_params.initial_code; //初始值
code_per_step =a_ctrl->region_params[region_index].code_per_step; //當前分區的步長
cur_code += code_per_step; //每步疊加一個步長
damping:這部分參數用來做剎車消除磁滯,與前面的場景參數相呼應。
ringing_params:各個具體場景對應的參數設置。下面三個參數為當前場景各區段的參數設置。
damping_step: // 對應場景lens每次移動的最大步長
damping_delay: // 對應場景lens每次移動I2C命令間的延時
hw_params: // 對應場景actuator硬件寄存器的控制設置
上面寫了那么多,總結起來也就下面幾點:
1.有一個數組lens_pos[max_bound] -----> 對應前面多次提到的移動步數數組
2.為了更好的消除磁滯,設定了多種移動的規則,根據每次移動的最大step來確定使用哪個規則---->規則即前面講的場景,最大step就是前面的ringing_scenario數組中對應每個場景的值,這個值表示數組的下標。
3.將整個移動范圍分成多個區間,細分每個區間lens步進,針對線性化問題改善。
4.針對不同場景的不同區間設定磁滯消除參數。
另外要注意的一點是高通AF算法發出的參數為step數量,而不是具體的lens位置,具體lens位置需要查表獲得。其實從這部分參數設定來看可以發現這里主要對驅動芯片的驅動方式進行設定,算法上前進步長的判斷還是在其它地方實現,只要控制了每次的step長度,也就相當於進行了磁滯控制,所以參數damping_step設置為最大值是可以理解的。
下面舉例來說明一下:
.actuator_tuned_params =
{
.scenario_size =
{
1, /* MOVE_NEAR */ // 場景數量,這里就定義了一個場景
1, /* MOVE_FAR */
},
.ringing_scenario =
{
/* MOVE_NEAR */
{
400, //對應場景最大步子,移動步數小於此值表示適用此場景參數。這里只定義了一個場景,所以將此值設置為最大步數(即數組容量)。此值表示每次移動步數的步子大小判斷,不是具體的數組下標。
},
/* MOVE_FAR */
{
400,
},
},
.initial_code = 70, // 初始lens的位置
.region_size = 1, //對lens的移動進行多個區段划分,用於不同區間磁滯的參數設定
.region_params =
{
{
.step_bound = // 對應每個區段的step bound,這里只定義了一個區間,即整個VCM移動過程使用同樣的磁滯處理。
{
400, /* Macro step boundary*/ // 當前區段的結束step
0, /* Infinity step boundary*/ //當前區段的起始step
},
.code_per_step = 1, // step表中lens的步進長度
},
},
.damping =
{
/* damping[MOVE_NEAR] */
{
/* Scenario 0 */ // 當前場景的磁滯參數
{
.ringing_params =
{
/* Region 0 */ // 當前區間的磁滯參數
{
.damping_step = 0x3FF, //這里設置為最大值1023,相當於不做磁滯處理,直接一次設定到需要的值。
.damping_delay = 6000,
.hw_params = 0x00000000,
},
},
},
},
/* damping[MOVE_NEAR] */
{
/* Scenario 0 */
{
.ringing_params =
{
/* Region 0 */
{
.damping_step = 0x3FF,
.damping_delay = 6000,
.hw_params = 0x00000000,
},
},
},
},
},
}, /* actuator_tuned_params */