@@ -144,8 +144,6 @@ static int write_addr_reg(uint8_t slv_addr, const uint16_t reg, uint16_t x_value
144
144
145
145
#define write_reg_bits (slv_addr , reg , mask , enable ) set_reg_bits(slv_addr, reg, 0, mask, (enable) ? (mask) : 0)
146
146
147
- static int set_ae_level (sensor_t * sensor , int level );
148
-
149
147
static int reset (sensor_t * sensor )
150
148
{
151
149
vTaskDelay (100 / portTICK_PERIOD_MS );
@@ -163,80 +161,131 @@ static int reset(sensor_t *sensor)
163
161
{
164
162
ESP_LOGD (TAG , "Camera defaults loaded" );
165
163
vTaskDelay (100 / portTICK_PERIOD_MS );
166
- set_ae_level (sensor , 0 );
167
164
}
168
165
return ret ;
169
166
}
170
167
171
168
static int set_pixformat (sensor_t * sensor , pixformat_t pixformat )
172
169
{
173
170
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
+
174
181
return ret ;
175
182
}
176
183
177
184
static int set_framesize (sensor_t * sensor , framesize_t framesize )
178
185
{
179
186
int ret = 0 ;
180
187
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
+
181
220
return ret ;
182
221
}
183
222
184
223
static int set_hmirror (sensor_t * sensor , int enable )
185
224
{
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 ;
188
232
}
189
233
190
234
static int set_vflip (sensor_t * sensor , int enable )
191
235
{
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 );
195
241
196
- static int set_quality (sensor_t * sensor , int qs )
197
- {
198
242
return 0 ;
199
243
}
200
244
201
245
static int set_colorbar (sensor_t * sensor , int enable )
202
246
{
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 );
205
252
206
- static int set_gain_ctrl (sensor_t * sensor , int enable )
207
- {
208
253
return 0 ;
209
254
}
210
255
211
256
static int set_exposure_ctrl (sensor_t * sensor , int enable )
212
257
{
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
+ }
217
261
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 );
229
263
230
- static int set_ae_level (sensor_t * sensor , int level )
231
- {
232
- int ret = 0 ;
233
- return ret ;
264
+ return 0 ;
234
265
}
235
266
236
267
static int set_brightness (sensor_t * sensor , int level )
237
268
{
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 );
240
289
}
241
290
242
291
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)
316
365
return ret ;
317
366
}
318
367
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
- }
323
368
static int set_xclk (sensor_t * sensor , int timer , int xclk )
324
369
{
325
370
int ret = 0 ;
@@ -332,20 +377,40 @@ static int set_xclk(sensor_t *sensor, int timer, int xclk)
332
377
return ret ;
333
378
}
334
379
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
+
335
412
static int init_status (sensor_t * sensor )
336
413
{
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);
349
414
return 0 ;
350
415
}
351
416
@@ -375,36 +440,36 @@ int hm0360_init(sensor_t *sensor)
375
440
sensor -> reset = reset ;
376
441
sensor -> set_pixformat = set_pixformat ;
377
442
sensor -> set_framesize = set_framesize ;
378
- sensor -> set_contrast = NULL ;
443
+ sensor -> set_contrast = set_dummy ;
379
444
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 ;
384
449
sensor -> set_colorbar = set_colorbar ;
385
- sensor -> set_gain_ctrl = set_gain_ctrl ;
450
+ sensor -> set_gain_ctrl = set_dummy ;
386
451
sensor -> set_exposure_ctrl = set_exposure_ctrl ;
387
- sensor -> set_whitebal = NULL ;
452
+ sensor -> set_whitebal = set_dummy ;
388
453
sensor -> set_hmirror = set_hmirror ;
389
454
sensor -> set_vflip = set_vflip ;
390
455
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 ;
403
468
404
469
sensor -> get_reg = get_reg ;
405
470
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 ;
408
473
sensor -> set_xclk = set_xclk ;
409
474
return 0 ;
410
475
}
0 commit comments