在 camera驅動調試的過程中, 當 camera 可以正常 預覽和拍照以后, 下面通常要檢查 AE 工作是否正常, 對於 sensor 來說, AE 就是 isp 或者 平台的 AEC 算法通過設置 sensor 的 gain 和 shutter 來控制圖像的亮度。這里面就有一個對應的過程, 一般的tuning 中的曝光表都是使用 平台 提供的 isp tuning 工具配置后產生的, 比如 gain 是 從 1 到 16倍, 有的可能會乘以一個倍數,比如高通平台的曝光表這個倍數是256, 256 表示 1倍。shutter 在 曝光表中是 linecount,這個一般不用轉化。
這個 gain 的設置在 sensor 的 spec 中肯定是有介紹的,不同的sensor 一般不一樣, 比如下面是(原創mojl) sony imx380 的gain 設置的說明:
Analog Gain:
This sensor can apply analog gain on photo-electron signal and digital gain on digital signal after ADC.
The formula for analog gain is shown below.
Analog gain parameters are set with registers. Analog gain and digital gain are set separately.
Analog Gain = (m0 × X + c0) / (m1 × X + c1)
m0 = 0; m1 = -1; c0 = c1 = 1024
Analog Gain = 1024 / (1024 - X)// X 表示寄存器要設置的值, 這里面規定了 X 的范圍 是 0 - 978
可以計算出 analog gain 的范圍:
1024 /(1024-0)< analog gain < 1024 / (1024-978)
1 < analog gain < 22
Digital Gain:
Digital gain = upper_byte + lower_byte / 256 [times]
upper byte range : 1 - 15
lower byte range: 0 - 255
1 < digital gain < 16
在使用的過程中,一般是先加 analog gain, analog gain 加到最大后 加 digital gain。 那么在代碼中怎么實現這個過程呢,就需要下面的幾個函數:
1 unsigned int sensor_real_to_register_gain(float real_gain);
2 float sensor_register_to_real_gain(unsigned int reg_gain);
3 unsigned int sensor_digital_gain_calc(float real_gain, float sensor_real_gain);
舉個例子, 上層設置下來 96 倍gain, real_gain = 96, 計算方法是怎樣的呢
設定analog gain 最大 16 倍 ,寄存器 960
設定digital gain 最大 8 倍
analog_reg_gain = sensor_real_to_register_gain(96) = 960; // 已經超過最大了
digital_reg_gain = real_gain / sensor_register_to_real_gain(analog_reg_gain) = 96 / 16 = 6
一般平台的 isp 還有 digital gain ,如果做超級大的gain 還可以使用 平台gain,比如 華為手機在專業模式下
有 102400 倍數的gain。