Implement MT triggered mode using ioctls

This commit is contained in:
iabdalkader 2019-03-04 20:55:17 +02:00
parent 542076f540
commit 54e431adb2
6 changed files with 66 additions and 63 deletions

View File

@ -20,7 +20,7 @@ sensor.set_framesize(sensor.VGA) # Set frame size to VGA (640x480)
sensor.skip_frames(time = 2000) # Wait for settings take effect. sensor.skip_frames(time = 2000) # Wait for settings take effect.
clock = time.clock() # Create a clock object to track the FPS. clock = time.clock() # Create a clock object to track the FPS.
sensor.mt9v034_set_triggered_mode(True) sensor.ioctl(sensor.IOCTL_SET_TRIGGERED_MODE, True)
while(True): while(True):
clock.tick() # Update the FPS clock. clock.tick() # Update the FPS clock.

View File

@ -385,22 +385,36 @@ static int set_lens_correction(sensor_t *sensor, int enable, int radi, int coef)
return 0; return 0;
} }
int mt9v034_set_triggered_mode(sensor_t *sensor, int enable) static int ioctl(sensor_t *sensor, int request, va_list ap)
{ {
int ret = 0;
uint16_t chip_control; uint16_t chip_control;
int ret = cambus_readw(sensor->slv_addr, MT9V034_CHIP_CONTROL, &chip_control);
switch (request) {
case IOCTL_SET_TRIGGERED_MODE: {
int enable = va_arg(ap, int);
ret = cambus_readw(sensor->slv_addr, MT9V034_CHIP_CONTROL, &chip_control);
ret |= cambus_writew(sensor->slv_addr, MT9V034_CHIP_CONTROL, ret |= cambus_writew(sensor->slv_addr, MT9V034_CHIP_CONTROL,
(chip_control & (~MT9V034_CHIP_CONTROL_MODE_MASK)) (chip_control & (~MT9V034_CHIP_CONTROL_MODE_MASK))
| ((enable != 0) ? MT9V034_CHIP_CONTROL_SNAP_MODE : MT9V034_CHIP_CONTROL_MASTER_MODE)); | ((enable != 0) ? MT9V034_CHIP_CONTROL_SNAP_MODE : MT9V034_CHIP_CONTROL_MASTER_MODE));
ret |= sensor->snapshot(sensor, NULL, NULL); // Force shadow mode register to update... ret |= sensor->snapshot(sensor, NULL, NULL); // Force shadow mode register to update...
return ret; break;
}
case IOCTL_GET_TRIGGERED_MODE: {
int *enable = va_arg(ap, int *);
ret = cambus_readw(sensor->slv_addr, MT9V034_CHIP_CONTROL, &chip_control);
if (ret >= 0) {
*enable = ((chip_control & MT9V034_CHIP_CONTROL_MODE_MASK) == MT9V034_CHIP_CONTROL_SNAP_MODE);
}
break;
}
default: {
ret = -1;
break;
}
} }
int mt9v034_get_triggered_mode(sensor_t *sensor) return ret;
{
uint16_t chip_control;
int ret = cambus_readw(sensor->slv_addr, MT9V034_CHIP_CONTROL, &chip_control);
return (ret >= 0) ? ((chip_control & MT9V034_CHIP_CONTROL_MODE_MASK) == MT9V034_CHIP_CONTROL_SNAP_MODE) : -1;
} }
int mt9v034_init(sensor_t *sensor) int mt9v034_init(sensor_t *sensor)
@ -429,8 +443,7 @@ int mt9v034_init(sensor_t *sensor)
sensor->set_vflip = set_vflip; sensor->set_vflip = set_vflip;
sensor->set_special_effect = set_special_effect; sensor->set_special_effect = set_special_effect;
sensor->set_lens_correction = set_lens_correction; sensor->set_lens_correction = set_lens_correction;
sensor->mt9v034_set_triggered_mode = mt9v034_set_triggered_mode; sensor->ioctl = ioctl;
sensor->mt9v034_get_triggered_mode = mt9v034_get_triggered_mode;
SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_VSYNC, 0); SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_VSYNC, 0);
SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_HSYNC, 0); SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_HSYNC, 0);

View File

@ -409,7 +409,30 @@ static mp_obj_t py_sensor_set_vsync_output(mp_obj_t pin_obj) {
static mp_obj_t py_sensor_ioctl(uint n_args, const mp_obj_t *args) static mp_obj_t py_sensor_ioctl(uint n_args, const mp_obj_t *args)
{ {
return mp_obj_new_int(-1); mp_obj_t ret_obj = mp_const_true;
int request = mp_obj_get_int(args[0]);
switch (request) {
case IOCTL_SET_TRIGGERED_MODE:
if (n_args < 2 || sensor_ioctl(request, mp_obj_get_int(args[1])) != 0) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Sensor control failed!"));
}
break;
case IOCTL_GET_TRIGGERED_MODE: {
int enabled;
if (sensor_ioctl(request, &enabled) != 0) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Sensor control failed!"));
}
ret_obj = mp_obj_new_bool(enabled);
break;
}
default:
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Operation not supported!"));
break;
}
return ret_obj;
} }
static mp_obj_t py_sensor_write_reg(mp_obj_t addr, mp_obj_t val) { static mp_obj_t py_sensor_write_reg(mp_obj_t addr, mp_obj_t val) {
@ -421,18 +444,6 @@ static mp_obj_t py_sensor_read_reg(mp_obj_t addr) {
return mp_obj_new_int(sensor_read_reg(mp_obj_get_int(addr))); return mp_obj_new_int(sensor_read_reg(mp_obj_get_int(addr)));
} }
static mp_obj_t py_mt9v034_set_triggered_mode(mp_obj_t enable) {
int temp = sensor_mt9v034_set_triggered_mode(mp_obj_get_int(enable));
if (temp < 0) nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Sensor control failed!"));
return mp_const_none;
}
static mp_obj_t py_mt9v034_get_triggered_mode() {
int temp = sensor_mt9v034_get_triggered_mode();
if (temp < 0) nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Sensor control failed!"));
return mp_obj_new_bool(temp);
}
//static void py_sensor_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { //static void py_sensor_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
// mp_printf(print, "<Sensor MID:0x%.2X%.2X PID:0x%.2X VER:0x%.2X>", // mp_printf(print, "<Sensor MID:0x%.2X%.2X PID:0x%.2X VER:0x%.2X>",
// sensor.id.MIDH, sensor.id.MIDL, sensor.id.PID, sensor.id.VER); // sensor.id.MIDH, sensor.id.MIDL, sensor.id.PID, sensor.id.VER);
@ -474,8 +485,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_vsync_output_obj, py_sensor_se
STATIC MP_DEFINE_CONST_FUN_OBJ_2(py_sensor_write_reg_obj, py_sensor_write_reg); STATIC MP_DEFINE_CONST_FUN_OBJ_2(py_sensor_write_reg_obj, py_sensor_write_reg);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_read_reg_obj, py_sensor_read_reg); STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_read_reg_obj, py_sensor_read_reg);
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_sensor_ioctl_obj, 1, 5, py_sensor_ioctl); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_sensor_ioctl_obj, 1, 5, py_sensor_ioctl);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_mt9v034_set_triggered_mode_obj, py_mt9v034_set_triggered_mode);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_mt9v034_get_triggered_mode_obj, py_mt9v034_get_triggered_mode);
STATIC const mp_map_elem_t globals_dict_table[] = { STATIC const mp_map_elem_t globals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_sensor) }, { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_sensor) },
@ -525,6 +534,10 @@ STATIC const mp_map_elem_t globals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_SXGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_SXGA)}, /* 1280x1024 */ { 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 */ { MP_OBJ_NEW_QSTR(MP_QSTR_UXGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_UXGA)}, /* 1600x1200 */
// IOCTLs
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_SET_TRIGGERED_MODE), MP_OBJ_NEW_SMALL_INT(IOCTL_SET_TRIGGERED_MODE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_GET_TRIGGERED_MODE), MP_OBJ_NEW_SMALL_INT(IOCTL_GET_TRIGGERED_MODE)},
// Sensor functions // Sensor functions
{ MP_OBJ_NEW_QSTR(MP_QSTR_reset), (mp_obj_t)&py_sensor_reset_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_reset), (mp_obj_t)&py_sensor_reset_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_sleep), (mp_obj_t)&py_sensor_sleep_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_sleep), (mp_obj_t)&py_sensor_sleep_obj },
@ -562,8 +575,6 @@ STATIC const mp_map_elem_t globals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_ioctl), (mp_obj_t)&py_sensor_ioctl_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_ioctl), (mp_obj_t)&py_sensor_ioctl_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR___write_reg), (mp_obj_t)&py_sensor_write_reg_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR___write_reg), (mp_obj_t)&py_sensor_write_reg_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR___read_reg), (mp_obj_t)&py_sensor_read_reg_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR___read_reg), (mp_obj_t)&py_sensor_read_reg_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_mt9v034_set_triggered_mode), (mp_obj_t)&py_mt9v034_set_triggered_mode_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_mt9v034_get_triggered_mode), (mp_obj_t)&py_mt9v034_get_triggered_mode_obj },
}; };
STATIC MP_DEFINE_CONST_DICT(globals_dict, globals_dict_table); STATIC MP_DEFINE_CONST_DICT(globals_dict, globals_dict_table);

View File

@ -201,6 +201,10 @@ Q(UXGA)
Q(NORMAL) Q(NORMAL)
Q(NEGATIVE) Q(NEGATIVE)
//IOCTLs
Q(IOCTL_SET_TRIGGERED_MODE)
Q(IOCTL_GET_TRIGGERED_MODE)
Q(reset) Q(reset)
Q(flush) Q(flush)
Q(snapshot) Q(snapshot)
@ -238,8 +242,6 @@ Q(set_lens_correction)
Q(ioctl) Q(ioctl)
Q(__write_reg) Q(__write_reg)
Q(__read_reg) Q(__read_reg)
Q(mt9v034_set_triggered_mode)
Q(mt9v034_get_triggered_mode)
// GPIOS // GPIOS
Q(P1) Q(P1)

View File

@ -1001,23 +1001,3 @@ int sensor_snapshot(sensor_t *sensor, image_t *image, streaming_cb_t streaming_c
return 0; return 0;
} }
int sensor_mt9v034_set_triggered_mode(int enable)
{
/* call the sensor specific function */
if (sensor.mt9v034_set_triggered_mode == NULL) {
/* operation not supported */
return -1;
}
return sensor.mt9v034_set_triggered_mode(&sensor, enable);
}
int sensor_mt9v034_get_triggered_mode()
{
/* call the sensor specific function */
if (sensor.mt9v034_get_triggered_mode == NULL) {
/* operation not supported */
return -1;
}
return sensor.mt9v034_get_triggered_mode(&sensor);
}

View File

@ -96,6 +96,11 @@ typedef enum {
ACTIVE_HIGH ACTIVE_HIGH
} polarity_t; } polarity_t;
typedef enum {
IOCTL_SET_TRIGGERED_MODE,
IOCTL_GET_TRIGGERED_MODE,
} ioctl_t;
#define SENSOR_HW_FLAGS_VSYNC (0) // vertical sync polarity. #define SENSOR_HW_FLAGS_VSYNC (0) // vertical sync polarity.
#define SENSOR_HW_FLAGS_HSYNC (1) // horizontal sync polarity. #define SENSOR_HW_FLAGS_HSYNC (1) // horizontal sync polarity.
#define SENSOR_HW_FLAGS_PIXCK (2) // pixel clock edge. #define SENSOR_HW_FLAGS_PIXCK (2) // pixel clock edge.
@ -153,8 +158,6 @@ typedef struct _sensor {
int (*set_lens_correction) (sensor_t *sensor, int enable, int radi, int coef); int (*set_lens_correction) (sensor_t *sensor, int enable, int radi, int coef);
int (*ioctl) (sensor_t *sensor, int request, va_list ap); int (*ioctl) (sensor_t *sensor, int request, va_list ap);
int (*snapshot) (sensor_t *sensor, image_t *image, streaming_cb_t streaming_cb); int (*snapshot) (sensor_t *sensor, image_t *image, streaming_cb_t streaming_cb);
int (*mt9v034_set_triggered_mode) (sensor_t *sensor, int enable);
int (*mt9v034_get_triggered_mode) (sensor_t *sensor);
} sensor_t; } sensor_t;
// Resolution table // Resolution table
@ -253,10 +256,4 @@ int sensor_set_vsync_output(GPIO_TypeDef *gpio, uint32_t pin);
// Default snapshot function. // Default snapshot function.
int sensor_snapshot(sensor_t *sensor, image_t *image, streaming_cb_t streaming_cb); int sensor_snapshot(sensor_t *sensor, image_t *image, streaming_cb_t streaming_cb);
// MT9V034 Set Triggered Mode register
int sensor_mt9v034_set_triggered_mode(int enable);
// MT9V034 Get Triggered Mode register
int sensor_mt9v034_get_triggered_mode();
#endif /* __SENSOR_H__ */ #endif /* __SENSOR_H__ */