KL520_SDK_2.2/mdw/camera/kmdw_sensor.c
2025-12-17 15:55:25 +08:00

233 lines
6.1 KiB
C

/*
* KDP Sensor driver
*
* Copyright (C) 2019 Kneron, Inc. All rights reserved.
*
*/
#include "board.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "kmdw_sensor.h"
#if defined(BOARD_96) || defined(BOARD_DVP_EXAMPLE)
extern struct sensor_ops* kdev_sensor_gc2145_get_ops(void);
extern struct sensor_ops* kdev_sensor_sc132gs_get_ops(void);
#endif
struct kmdw_sensor_s {
uint32_t inuse;
struct sensor_ops *ops;
} sensor_s[CAM_ID_MAX];
kmdw_status_t kmdw_sensor_s_power(uint32_t cam_idx, uint32_t on)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->s_power == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->s_power(on);
}
kmdw_status_t kmdw_sensor_reset(uint32_t cam_idx)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->reset == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->reset();
}
kmdw_status_t kmdw_sensor_s_stream(uint32_t cam_idx, uint32_t enable)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->s_stream == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->s_stream(enable);
}
kmdw_status_t kmdw_sensor_enum_fmt(uint32_t cam_idx, uint32_t index, uint32_t *fourcc)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->enum_fmt == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->enum_fmt(index, fourcc);
}
kmdw_status_t kmdw_sensor_set_fmt(uint32_t cam_idx, struct cam_format *format)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->set_fmt == NULL)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].inuse == 0)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->set_fmt(format);
}
kmdw_status_t kmdw_sensor_get_fmt(uint32_t cam_idx, struct cam_format *format)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->get_fmt == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->get_fmt(format);
}
kmdw_status_t kmdw_sensor_set_gain(uint32_t cam_idx, uint32_t gain1, uint32_t gain2)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->set_gain == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->set_gain(gain1, gain2);
}
kmdw_status_t kmdw_sensor_set_aec(uint32_t cam_idx, struct cam_sensor_aec *aec_p)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->set_aec == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->set_aec(aec_p);
}
kmdw_status_t kmdw_sensor_set_exp_time(uint32_t cam_idx, uint32_t gain1, uint32_t gain2)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->set_exp_time == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->set_exp_time(gain1, gain2);
}
kmdw_status_t kmdw_sensor_get_lux(uint32_t cam_idx, uint16_t *expo, uint8_t *pre_gain, uint8_t *post_gain, uint8_t *global_gain, uint8_t *y_average)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->get_lux == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->get_lux(expo, pre_gain, post_gain, global_gain, y_average);
}
kmdw_status_t kmdw_sensor_led_switch(uint32_t cam_idx, uint32_t on)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->led_switch == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->led_switch(on);
}
kmdw_status_t kmdw_sensor_set_mirror(uint32_t cam_idx, uint32_t enable)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->set_mirror == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->set_mirror(enable);
}
kmdw_status_t kmdw_sensor_set_flip(uint32_t cam_idx, uint32_t enable)
{
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].ops->set_flip == NULL)
return KMDW_STATUS_ERROR;
return (kmdw_status_t)sensor_s[cam_idx].ops->set_flip(enable);
}
uint32_t kmdw_sensor_get_dev_id(uint32_t cam_idx)
{
if (cam_idx >= CAM_ID_MAX)
return 1;
if (sensor_s[cam_idx].ops->get_dev_id == NULL)
return 1;
return sensor_s[cam_idx].ops->get_dev_id();
}
struct sensor_ops * kmdw_sensor_get_ops(uint32_t sensor_idx)
{
struct sensor_ops *pops = NULL;
if (sensor_idx >= SENSOR_ID_MAX)
return NULL;
switch(sensor_idx)
{
case SENSOR_ID_HMX2056:
break;
case SENSOR_ID_OV9286:
break;
case SENSOR_ID_HMXRICA:
break;
case SENSOR_ID_GC2145:
pops = kdev_sensor_gc2145_get_ops();
break;
case SENSOR_ID_SC132GS:
pops = kdev_sensor_sc132gs_get_ops();
break;
default:
break;
}
return pops;
}
kmdw_status_t kmdw_sensor_register(uint32_t cam_idx, uint32_t sensor_idx)
{
struct sensor_ops *pops;
if (cam_idx >= CAM_ID_MAX)
return KMDW_STATUS_ERROR;
if (sensor_idx >= SENSOR_ID_MAX)
return KMDW_STATUS_ERROR;
pops = kmdw_sensor_get_ops(sensor_idx);
if(pops == NULL)
return KMDW_STATUS_ERROR;
if (sensor_s[cam_idx].inuse)
return KMDW_STATUS_ERROR;
sensor_s[cam_idx].ops = pops;
sensor_s[cam_idx].inuse = 1;
return KMDW_STATUS_OK;
}
kmdw_status_t kmdw_sensor_unregister(uint32_t cam_idx, struct sensor_ops *sensor_ops_p)
{
if (cam_idx >= CAM_ID_MAX || sensor_ops_p == NULL)
return KMDW_STATUS_ERROR;
if (!sensor_s[cam_idx].inuse)
return KMDW_STATUS_ERROR;
sensor_s[cam_idx].ops = NULL;
sensor_s[cam_idx].inuse = 0;
return KMDW_STATUS_OK;
}