Skip to content

Commit 7fad3cd

Browse files
committed
perf: improve some interface functions of hm0360 camera and discarded useless interfaces
1 parent 588eeff commit 7fad3cd

File tree

3 files changed

+368
-199
lines changed

3 files changed

+368
-199
lines changed

sensors/hm0360.c

Lines changed: 137 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,6 @@ static int write_addr_reg(uint8_t slv_addr, const uint16_t reg, uint16_t x_value
144144

145145
#define write_reg_bits(slv_addr, reg, mask, enable) set_reg_bits(slv_addr, reg, 0, mask, (enable) ? (mask) : 0)
146146

147-
static int set_ae_level(sensor_t *sensor, int level);
148-
149147
static int reset(sensor_t *sensor)
150148
{
151149
vTaskDelay(100 / portTICK_PERIOD_MS);
@@ -163,80 +161,131 @@ static int reset(sensor_t *sensor)
163161
{
164162
ESP_LOGD(TAG, "Camera defaults loaded");
165163
vTaskDelay(100 / portTICK_PERIOD_MS);
166-
set_ae_level(sensor, 0);
167164
}
168165
return ret;
169166
}
170167

171168
static int set_pixformat(sensor_t *sensor, pixformat_t pixformat)
172169
{
173170
int ret = 0;
171+
sensor->pixformat = pixformat;
172+
173+
switch (pixformat) {
174+
case PIXFORMAT_GRAYSCALE:
175+
break;
176+
default:
177+
ESP_LOGE(TAG, "Only support GRAYSCALE");
178+
return -1;
179+
}
180+
174181
return ret;
175182
}
176183

177184
static int set_framesize(sensor_t *sensor, framesize_t framesize)
178185
{
179186
int ret = 0;
180187

188+
sensor->status.framesize = framesize;
189+
ret = write_regs(sensor->slv_addr, sensor_default_regs);
190+
191+
if (framesize == FRAMESIZE_QQVGA)
192+
{
193+
ESP_LOGI(TAG, "Set FRAMESIZE_QQVGA");
194+
ret |= write_regs(sensor->slv_addr, sensor_framesize_QQVGA);
195+
ret |= set_reg_bits(sensor->slv_addr, 0x3024, 0, 0x01, 1);
196+
}
197+
else if (framesize == FRAMESIZE_QVGA)
198+
{
199+
ESP_LOGI(TAG, "Set FRAMESIZE_QVGA");
200+
ret |= write_regs(sensor->slv_addr, sensor_framesize_QVGA);
201+
ret |= set_reg_bits(sensor->slv_addr, 0x3024, 0, 0x01, 1);
202+
}
203+
else if (framesize == FRAMESIZE_VGA)
204+
{
205+
ESP_LOGI(TAG, "Set FRAMESIZE_VGA");
206+
ret |= set_reg_bits(sensor->slv_addr, 0x3024, 0, 0x01, 0);
207+
}
208+
else
209+
{
210+
ESP_LOGI(TAG, "Dont suppost this size, Set FRAMESIZE_VGA");
211+
ret |= set_reg_bits(sensor->slv_addr, 0x3024, 0, 0x01, 0);
212+
}
213+
214+
if (ret == 0)
215+
{
216+
_set_pll(sensor, 0, 0, 0, 0, 0, 0, 0, 0);
217+
ret |= write_reg(sensor->slv_addr, 0x0104, 0x01);
218+
}
219+
181220
return ret;
182221
}
183222

184223
static int set_hmirror(sensor_t *sensor, int enable)
185224
{
186-
int ret = 0;
187-
return ret;
225+
if (set_reg_bits(sensor->slv_addr, 0x0101, 0, 0x01, enable)) {
226+
return -1;
227+
}
228+
229+
ESP_LOGD(TAG, "Set h-mirror to: %d", enable);
230+
231+
return 0;
188232
}
189233

190234
static int set_vflip(sensor_t *sensor, int enable)
191235
{
192-
int ret = 0;
193-
return ret;
194-
}
236+
if (set_reg_bits(sensor->slv_addr, 0x0101, 1, 0x01, enable)) {
237+
return -1;
238+
}
239+
240+
ESP_LOGD(TAG, "Set v-flip to: %d", enable);
195241

196-
static int set_quality(sensor_t *sensor, int qs)
197-
{
198242
return 0;
199243
}
200244

201245
static int set_colorbar(sensor_t *sensor, int enable)
202246
{
203-
return 0;
204-
}
247+
if (set_reg_bits(sensor->slv_addr, 0x0601, 0, 0x01, enable)) {
248+
return -1;
249+
}
250+
251+
ESP_LOGD(TAG, "Set color-bar to: %d", enable);
205252

206-
static int set_gain_ctrl(sensor_t *sensor, int enable)
207-
{
208253
return 0;
209254
}
210255

211256
static int set_exposure_ctrl(sensor_t *sensor, int enable)
212257
{
213-
int ret = 0;
214-
215-
return ret;
216-
}
258+
if (set_reg_bits(sensor->slv_addr, 0x2000, 0, 0x01, enable)) {
259+
return -1;
260+
}
217261

218-
// real gain
219-
static int set_agc_gain(sensor_t *sensor, int gain)
220-
{
221-
int ret = 0;
222-
return ret;
223-
}
224-
static int set_aec_value(sensor_t *sensor, int value)
225-
{
226-
int ret = 0;
227-
return ret;
228-
}
262+
ESP_LOGD(TAG, "Set exposure to: %d", enable);
229263

230-
static int set_ae_level(sensor_t *sensor, int level)
231-
{
232-
int ret = 0;
233-
return ret;
264+
return 0;
234265
}
235266

236267
static int set_brightness(sensor_t *sensor, int level)
237268
{
238-
int ret = 0;
239-
return ret;
269+
uint8_t ae_mean;
270+
271+
switch (level) {
272+
case 0:
273+
ae_mean = 60;
274+
break;
275+
case 1:
276+
ae_mean = 80;
277+
break;
278+
case 2:
279+
ae_mean = 100;
280+
break;
281+
case 3:
282+
ae_mean = 127;
283+
break;
284+
default:
285+
ae_mean = 80;
286+
}
287+
288+
return write_reg(sensor->slv_addr, AE_TARGET_MEAN, ae_mean);
240289
}
241290

242291
static int get_reg(sensor_t *sensor, int reg, int mask)
@@ -316,10 +365,6 @@ static int set_reg(sensor_t *sensor, int reg, int mask, int value)
316365
return ret;
317366
}
318367

319-
static int set_res_raw(sensor_t *sensor, int startX, int startY, int endX, int endY, int offsetX, int offsetY, int totalX, int totalY, int outputX, int outputY, bool scale, bool binning)
320-
{
321-
return 0;
322-
}
323368
static int set_xclk(sensor_t *sensor, int timer, int xclk)
324369
{
325370
int ret = 0;
@@ -332,20 +377,40 @@ static int set_xclk(sensor_t *sensor, int timer, int xclk)
332377
return ret;
333378
}
334379

380+
static int _set_pll(sensor_t *sensor, int bypass, int multiplier, int sys_div, int root_2x, int pre_div, int seld5, int pclk_manual, int pclk_div)
381+
{
382+
uint8_t value = 0;
383+
uint8_t pll_cfg = 0;
384+
385+
if (sensor->xclk_freq_hz <= 6000000)
386+
{
387+
value = 0x03;
388+
}
389+
else if (sensor->xclk_freq_hz <= 12000000)
390+
{
391+
value = 0x02;
392+
}
393+
else if (sensor->xclk_freq_hz <= 18000000)
394+
{
395+
value = 0x01;
396+
}
397+
else
398+
{ // max is 48000000
399+
value = 0x00;
400+
}
401+
402+
pll_cfg = read_reg(sensor->slv_addr, PLL1CFG);
403+
return write_reg(sensor->slv_addr, PLL1CFG, (pll_cfg & 0xFC) | value);
404+
}
405+
406+
static int set_dummy(sensor_t *sensor, int val)
407+
{
408+
ESP_LOGW(TAG, "Unsupported");
409+
return -1;
410+
}
411+
335412
static int init_status(sensor_t *sensor)
336413
{
337-
sensor->status.brightness = 0;
338-
sensor->status.contrast = 0;
339-
sensor->status.saturation = 0;
340-
// sensor->status.awb = check_reg_mask(sensor->slv_addr, AEWBCFG, 0x02);
341-
sensor->status.agc = true;
342-
// sensor->status.aec = check_reg_mask(sensor->slv_addr, AEWBCFG, 0x04);
343-
// sensor->status.hmirror = check_reg_mask(sensor->slv_addr, RDCFG, 0x02);
344-
// sensor->status.vflip = check_reg_mask(sensor->slv_addr, RDCFG, 0x01);
345-
// sensor->status.lenc = check_reg_mask(sensor->slv_addr, ISPCTRL3, 0x40);
346-
// sensor->status.awb_gain = read_reg(sensor->slv_addr, DGAIN);
347-
// sensor->status.agc_gain = read_reg(sensor->slv_addr, AGAIN);
348-
// sensor->status.aec_value = read_reg(sensor->slv_addr, AETARGM);
349414
return 0;
350415
}
351416

@@ -375,36 +440,36 @@ int hm0360_init(sensor_t *sensor)
375440
sensor->reset = reset;
376441
sensor->set_pixformat = set_pixformat;
377442
sensor->set_framesize = set_framesize;
378-
sensor->set_contrast = NULL;
443+
sensor->set_contrast = set_dummy;
379444
sensor->set_brightness = set_brightness;
380-
sensor->set_saturation = NULL;
381-
sensor->set_sharpness = NULL;
382-
sensor->set_gainceiling = NULL;
383-
sensor->set_quality = set_quality;
445+
sensor->set_saturation = set_dummy;
446+
sensor->set_sharpness = set_dummy;
447+
sensor->set_gainceiling = set_dummy;
448+
sensor->set_quality = set_dummy;
384449
sensor->set_colorbar = set_colorbar;
385-
sensor->set_gain_ctrl = set_gain_ctrl;
450+
sensor->set_gain_ctrl = set_dummy;
386451
sensor->set_exposure_ctrl = set_exposure_ctrl;
387-
sensor->set_whitebal = NULL;
452+
sensor->set_whitebal = set_dummy;
388453
sensor->set_hmirror = set_hmirror;
389454
sensor->set_vflip = set_vflip;
390455
sensor->init_status = init_status;
391-
sensor->set_aec2 = NULL;
392-
sensor->set_aec_value = set_aec_value;
393-
sensor->set_special_effect = NULL;
394-
sensor->set_wb_mode = NULL;
395-
sensor->set_ae_level = set_ae_level;
396-
sensor->set_dcw = NULL;
397-
sensor->set_bpc = NULL;
398-
sensor->set_wpc = NULL;
399-
sensor->set_agc_gain = set_agc_gain;
400-
sensor->set_raw_gma = NULL;
401-
sensor->set_lenc = NULL;
402-
sensor->set_denoise = NULL;
456+
sensor->set_aec2 = set_dummy;
457+
sensor->set_aec_value = set_dummy;
458+
sensor->set_special_effect = set_dummy;
459+
sensor->set_wb_mode = set_dummy;
460+
sensor->set_ae_level = set_dummy;
461+
sensor->set_dcw = set_dummy;
462+
sensor->set_bpc = set_dummy;
463+
sensor->set_wpc = set_dummy;
464+
sensor->set_agc_gain = set_dummy;
465+
sensor->set_raw_gma = set_dummy;
466+
sensor->set_lenc = set_dummy;
467+
sensor->set_denoise = set_dummy;
403468

404469
sensor->get_reg = get_reg;
405470
sensor->set_reg = set_reg;
406-
sensor->set_res_raw = set_res_raw;
407-
sensor->set_pll = NULL;
471+
sensor->set_res_raw = NULL;
472+
sensor->set_pll = _set_pll;
408473
sensor->set_xclk = set_xclk;
409474
return 0;
410475
}

0 commit comments

Comments
 (0)