Merge pull request #554 from kwagyeman/kwabena/ov2640_fixes

OV2640/JPEG mode fixes
This commit is contained in:
Ibrahim Abd Elkader 2019-07-22 23:36:26 +02:00 committed by GitHub
commit f392b270cc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 488 additions and 441 deletions

File diff suppressed because it is too large Load Diff

View File

@ -208,4 +208,36 @@
#define REG32_SVGA 0x09
#define REG32_CIF 0x00
#define VAL_SET(x, mask, rshift, lshift) ((((x) >> rshift) & mask) << lshift)
#define CTRLI_V_DIV_SET(x) VAL_SET(x, 0x3, 0, 3)
#define CTRLI_H_DIV_SET(x) VAL_SET(x, 0x3, 0, 0)
#define SIZEL_HSIZE8_11_SET(x) VAL_SET(x, 0x1, 11, 6)
#define SIZEL_HSIZE8_SET(x) VAL_SET(x, 0x7, 0, 3)
#define SIZEL_VSIZE8_SET(x) VAL_SET(x, 0x7, 0, 0)
#define HSIZE8_SET(x) VAL_SET(x, 0xFF, 3, 0)
#define VSIZE8_SET(x) VAL_SET(x, 0xFF, 3, 0)
#define HSIZE_SET(x) VAL_SET(x, 0xFF, 2, 0)
#define VSIZE_SET(x) VAL_SET(x, 0xFF, 2, 0)
#define XOFFL_SET(x) VAL_SET(x, 0xFF, 0, 0)
#define YOFFL_SET(x) VAL_SET(x, 0xFF, 0, 0)
#define VHYX_VSIZE_SET(x) VAL_SET(x, 0x1, (8+2), 7)
#define VHYX_HSIZE_SET(x) VAL_SET(x, 0x1, (8+2), 3)
#define VHYX_YOFF_SET(x) VAL_SET(x, 0x3, 8, 4)
#define VHYX_XOFF_SET(x) VAL_SET(x, 0x3, 8, 0)
#define TEST_HSIZE_SET(x) VAL_SET(x, 0x1, (9+2), 7)
#define ZMOW_OUTW_SET(x) VAL_SET(x, 0xFF, 2, 0)
#define ZMOH_OUTH_SET(x) VAL_SET(x, 0xFF, 2, 0)
#define ZMHH_ZSPEED_SET(x) VAL_SET(x, 0x0F, 0, 4)
#define ZMHH_OUTH_SET(x) VAL_SET(x, 0x1, (8+2), 2)
#define ZMHH_OUTW_SET(x) VAL_SET(x, 0x3, (8+2), 0)
#endif //__REG_REGS_H__

View File

@ -275,6 +275,12 @@ static void py_image_print(const mp_print_t *print, mp_obj_t self_in, mp_print_k
(self->_cobj.w * self->_cobj.h) * sizeof(uint16_t));
break;
}
case IMAGE_BPP_BAYER: {
mp_printf(print, "{\"w\":%d, \"h\":%d, \"type\"=\"bayer\", \"size\":%d}",
self->_cobj.w, self->_cobj.h,
(self->_cobj.w * self->_cobj.h) * sizeof(uint8_t));
break;
}
default: {
if((self->_cobj.data[0] == 0xFE) && (self->_cobj.data[self->_cobj.bpp-1] == 0xFE)) { // for ide
print->print_strn(print->data, (const char *) self->_cobj.data, self->_cobj.bpp);

View File

@ -46,9 +46,6 @@ static mp_obj_t py_sensor_snapshot(uint n_args, const mp_obj_t *args, mp_map_t *
// Snapshot image
mp_obj_t image = py_image(0, 0, 0, 0);
// Sanity checks
PY_ASSERT_TRUE_MSG((sensor.pixformat != PIXFORMAT_JPEG), "Operation not supported on JPEG");
if (sensor.snapshot(&sensor, (image_t*) py_image_cobj(image), NULL)==-1) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_RuntimeError, "Sensor Timeout!!"));
return mp_const_false;
@ -683,6 +680,7 @@ STATIC const mp_map_elem_t globals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_WVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_WVGA)}, /* 720x480 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_WVGA2), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_WVGA2)}, /* 752x480 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_SVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_SVGA)}, /* 800x600 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_XGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_XGA)}, /* 1024x768 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_SXGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_SXGA)}, /* 1280x1024 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_UXGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_UXGA)}, /* 1600x1200 */

View File

@ -195,6 +195,7 @@ Q(QQVGA2)
Q(WVGA)
Q(WVGA2)
Q(SVGA)
Q(XGA)
Q(SXGA)
Q(UXGA)

View File

@ -62,6 +62,7 @@ const int resolution[][2] = {
{720, 480 }, /* WVGA */
{752, 480 }, /* WVGA2 */
{800, 600 }, /* SVGA */
{1024, 768 }, /* XGA */
{1280, 1024}, /* SXGA */
{1600, 1200}, /* UXGA */
};
@ -996,7 +997,13 @@ int sensor_snapshot(sensor_t *sensor, image_t *image, streaming_cb_t streaming_c
break;
case PIXFORMAT_JPEG:
// Read the number of data items transferred
MAIN_FB()->bpp = (MAX_XFER_SIZE - __HAL_DMA_GET_COUNTER(&DMAHandle))*4;
MAIN_FB()->bpp = ((MAX_XFER_SIZE/4) - __HAL_DMA_GET_COUNTER(&DMAHandle))*4;
// Remove trailing zeros...
if (MAIN_FB()->bpp) {
while (!MAIN_FB()->pixels[MAIN_FB()->bpp - 1]) {
MAIN_FB()->bpp -= 1;
}
}
break;
default:
break;

View File

@ -68,6 +68,7 @@ typedef enum {
FRAMESIZE_WVGA, // 720x480
FRAMESIZE_WVGA2, // 752x480
FRAMESIZE_SVGA, // 800x600
FRAMESIZE_XGA, // 1024x768
FRAMESIZE_SXGA, // 1280x1024
FRAMESIZE_UXGA, // 1600x1200
} framesize_t;