drivers/sensors: Update clock API.

Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
This commit is contained in:
iabdalkader 2025-07-03 12:58:28 +02:00
parent 09c0052dfa
commit 66ade9aeaf
4 changed files with 12 additions and 10 deletions

View File

@ -70,7 +70,8 @@
#define EVENT_THRESHOLD_SIGMA 10
#define EVT_CLK_MULTIPLIER (2)
#define EVT_CLK_FREQ (((omv_csi_get_clk_frequency() * EVT_CLK_MULTIPLIER) + 500000) / 1000000)
#define EVT_CLK_FREQ \
(((omv_csi_get_clk_frequency(csi, false) * EVT_CLK_MULTIPLIER) + 500000) / 1000000)
#define AFK_50_HZ (50)
#define AFK_60_HZ (60)
@ -235,7 +236,7 @@ static int set_framerate(omv_csi_t *csi, int framerate) {
}
int lines = ACTIVE_SENSOR_HEIGHT + VSYNC_CLOCK_CYCLES;
int clocks_per_frame = (omv_csi_get_clk_frequency() * EVT_CLK_MULTIPLIER) / framerate;
int clocks_per_frame = (omv_csi_get_clk_frequency(csi, false) * EVT_CLK_MULTIPLIER) / framerate;
int hsync_clocks = (clocks_per_frame / lines) - ACTIVE_SENSOR_WIDTH;
if (hsync_clocks <= 0) {

View File

@ -476,7 +476,7 @@ static int reset(omv_csi_t *csi) {
ret |= omv_i2c_writew2(csi->i2c, csi->slv_addr, 0x301A, reg | (1 << 9));
ret |= omv_i2c_writew2(csi->i2c, csi->slv_addr, MT9M114_REG_CAM_SYSCTL_PLL_DIVIDER_M_N,
(omv_csi_get_clk_frequency() == OMV_MT9M114_CLK_FREQ)
(omv_csi_get_clk_frequency(csi, true) == OMV_MT9M114_CLK_FREQ)
? 0x120 // xclk=24MHz, m=32, n=1, csi=48MHz, bus=76.8MHz
: 0x448); // xclk=25MHz, m=72, n=4, csi=45MHz, bus=72MHz
@ -675,7 +675,7 @@ static int set_framesize(omv_csi_t *csi, omv_csi_framesize_t framesize) {
ret |= omv_i2c_writew2(csi->i2c, csi->slv_addr, MT9M114_REG_SENSOR_CFG_Y_ADDR_END, sensor_he);
ret |= omv_i2c_writew2(csi->i2c, csi->slv_addr, MT9M114_REG_SENSOR_CFG_X_ADDR_END, sensor_we);
int pixclk = (omv_csi_get_clk_frequency() == OMV_MT9M114_CLK_FREQ) ? 48000000 : 45000000;
int pixclk = (omv_csi_get_clk_frequency(csi, true) == OMV_MT9M114_CLK_FREQ) ? 48000000 : 45000000;
ret |= omv_i2c_writew2(csi->i2c, csi->slv_addr, MT9M114_REG_SENSOR_CFG_PIXCLK, pixclk >> 16);
ret |= omv_i2c_writew2(csi->i2c, csi->slv_addr, MT9M114_REG_SENSOR_CFG_PIXCLK + 2, pixclk);

View File

@ -342,7 +342,7 @@ static int set_auto_exposure(omv_csi_t *csi, int enable, int exposure_us) {
ret |= omv_i2c_readw(csi->i2c, csi->slv_addr, window_width, &row_time_0);
ret |= omv_i2c_readw(csi->i2c, csi->slv_addr, horizontal_blanking, &row_time_1);
int clock = omv_csi_get_clk_frequency();
int clock = omv_csi_get_clk_frequency(csi, false);
int exposure = IM_MIN(exposure_us, MICROSECOND_CLKS / 2) * (clock / MICROSECOND_CLKS);
int row_time = row_time_0 + row_time_1;
@ -388,7 +388,7 @@ static int get_exposure_us(omv_csi_t *csi, int *exposure_us) {
ret |= omv_i2c_readw(csi->i2c, csi->slv_addr, fine_shutter_width_total, &int_pixels);
}
int clock = omv_csi_get_clk_frequency();
int clock = omv_csi_get_clk_frequency(csi, false);
if (reg & (context ? MT9V0X4_AEC_ENABLE_B : MT9V0XX_AEC_ENABLE)) {
ret |= omv_i2c_readw(csi->i2c, csi->slv_addr, MT9V0XX_AEC_EXPOSURE_OUTPUT, &int_rows);

View File

@ -1120,12 +1120,13 @@ static int get_gain_db(omv_csi_t *csi, float *gain_db) {
return ret;
}
static int calc_pclk_freq(uint8_t sc_pll_ctrl_0,
static int calc_pclk_freq(omv_csi_t *csi,
uint8_t sc_pll_ctrl_0,
uint8_t sc_pll_ctrl_1,
uint8_t sc_pll_ctrl_2,
uint8_t sc_pll_ctrl_3,
uint8_t sys_root_div) {
uint32_t pclk_freq = omv_csi_get_clk_frequency();
uint32_t pclk_freq = omv_csi_get_clk_frequency(csi, false);
pclk_freq /= ((sc_pll_ctrl_3 & 0x10) != 0x00) ? 2 : 1;
pclk_freq /= ((sc_pll_ctrl_0 & 0x0F) == 0x0A) ? 5 : 4; //camera has two MIPI lanes
switch (sc_pll_ctrl_3 & 0x0F) {
@ -1171,7 +1172,7 @@ static int set_auto_exposure(omv_csi_t *csi, int enable, int exposure_us) {
uint16_t hts = (hts_h << 8) | hts_l;
uint16_t vts = (vts_h << 8) | vts_l;
int pclk_freq = calc_pclk_freq(spc0, spc1, spc2, spc3, sysrootdiv);
int pclk_freq = calc_pclk_freq(csi, spc0, spc1, spc2, spc3, sysrootdiv);
int clocks_per_us = pclk_freq / 1000000;
int exposure = __USAT((exposure_us * clocks_per_us) / hts, 16);
@ -1214,7 +1215,7 @@ static int get_exposure_us(omv_csi_t *csi, int *exposure_us) {
aec = IM_MIN(aec, vts);
int pclk_freq = calc_pclk_freq(spc0, spc1, spc2, spc3, sysrootdiv);
int pclk_freq = calc_pclk_freq(csi, spc0, spc1, spc2, spc3, sysrootdiv);
int clocks_per_us = pclk_freq / 1000000;
*exposure_us = (aec * hts) / clocks_per_us;