299 lines
9.1 KiB
C
299 lines
9.1 KiB
C
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <pthread.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/prctl.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
#include "xmedia_debug.h"
|
|
#include "xmedia_msensor.h"
|
|
#include "msensor_chip_ioctl.h"
|
|
#include "msensor_mng_ioctl.h"
|
|
|
|
#define MSENSOR_CHIP_NAME "/dev/msensor_chip"
|
|
#define MSENSOR_MNG_NAME "/dev/msensor_mng"
|
|
|
|
static xmedia_bool g_msensor_tgid_init = XMEDIA_FALSE;
|
|
static xmedia_s32 g_msensor_chip_fd[XMEDIA_MSENSOR_MAX_DEV_NUM] = { [0 ...(XMEDIA_MSENSOR_MAX_DEV_NUM - 1)] = -1 };
|
|
static xmedia_s32 g_msensor_mng_fd[XMEDIA_MSENSOR_MAX_DEV_NUM] = { [0 ...(XMEDIA_MSENSOR_MAX_DEV_NUM - 1)] = -1 };
|
|
|
|
static pthread_mutex_t g_msensor_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
|
|
#define MSENSOR_MUTEX_LOCK() \
|
|
do { \
|
|
(void)pthread_mutex_lock(&g_msensor_mutex); \
|
|
} while (0)
|
|
|
|
#define MSENSOR_MUTEX_UNLOCK() \
|
|
do { \
|
|
(void)pthread_mutex_unlock(&g_msensor_mutex); \
|
|
} while (0)
|
|
|
|
#define MSENSOR_TRACE(level, fmt, ...) \
|
|
do { \
|
|
printf("[Func]:%s [Line]:%d [Info]:" fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
#define MSENSOR_CHECK_INIT_RETURN() \
|
|
do { \
|
|
MSENSOR_MUTEX_LOCK(); \
|
|
if (g_msensor_tgid_init != XMEDIA_TRUE) { \
|
|
printf("msensor not init!\n"); \
|
|
MSENSOR_MUTEX_UNLOCK(); \
|
|
return XMEDIA_ERRCODE_NOT_INIT; \
|
|
} \
|
|
MSENSOR_MUTEX_UNLOCK(); \
|
|
} while (0)
|
|
|
|
static xmedia_s32 msensor_check_dev(xmedia_s32 dev)
|
|
{
|
|
if ((dev >= XMEDIA_MSENSOR_MAX_DEV_NUM) || (dev < 0)) {
|
|
MSENSOR_TRACE(MODULE_DBG_ERR, "dev id(%d) is invalid\r\n", dev);
|
|
return XMEDIA_ERRCODE_INVALID_PIPE_ID;
|
|
}
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
static xmedia_s32 msensor_check_null_ptr(xmedia_void *ptr)
|
|
{
|
|
if (ptr == XMEDIA_NULL) {
|
|
MSENSOR_TRACE(MODULE_DBG_ERR, "null pointer\n");
|
|
return XMEDIA_ERRCODE_NULL_PTR;
|
|
}
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
static xmedia_s32 msensor_check_chip_open(xmedia_s32 dev)
|
|
{
|
|
MSENSOR_MUTEX_LOCK();
|
|
|
|
if (g_msensor_chip_fd[dev] < 0) {
|
|
xmedia_s32 arg = dev;
|
|
g_msensor_chip_fd[dev] = open(MSENSOR_CHIP_NAME, O_RDONLY);
|
|
if (g_msensor_chip_fd[dev] < 0) {
|
|
MSENSOR_MUTEX_UNLOCK();
|
|
MSENSOR_TRACE(MODULE_DBG_ERR, "open msensor dev %d err, ret %d\n", dev, g_msensor_chip_fd[dev]);
|
|
return XMEDIA_ERRCODE_NOT_READY;
|
|
}
|
|
if (ioctl(g_msensor_chip_fd[dev], MSENSOR_CMD_CHIP_BIND_FLAG2FD, &arg)) {
|
|
close(g_msensor_chip_fd[dev]);
|
|
g_msensor_chip_fd[dev] = -1;
|
|
MSENSOR_MUTEX_UNLOCK();
|
|
MSENSOR_TRACE(MODULE_DBG_ERR, "msensor dev %d, ret %d\n", dev, g_msensor_chip_fd[dev]);
|
|
return XMEDIA_ERRCODE_NOT_READY;
|
|
}
|
|
}
|
|
MSENSOR_MUTEX_UNLOCK();
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
static xmedia_s32 msensor_check_mng_open(xmedia_s32 dev)
|
|
{
|
|
MSENSOR_MUTEX_LOCK();
|
|
|
|
if (g_msensor_mng_fd[dev] < 0) {
|
|
xmedia_s32 arg = dev;
|
|
g_msensor_mng_fd[dev] = open(MSENSOR_MNG_NAME, O_RDONLY);
|
|
if (g_msensor_mng_fd[dev] < 0) {
|
|
MSENSOR_MUTEX_UNLOCK();
|
|
MSENSOR_TRACE(MODULE_DBG_ERR, "open msensor dev %d err, ret %d\n", dev, g_msensor_mng_fd[dev]);
|
|
return XMEDIA_ERRCODE_NOT_READY;
|
|
}
|
|
if (ioctl(g_msensor_mng_fd[dev], MSENSOR_CMD_MNG_BIND_FLAG2FD, &arg)) {
|
|
close(g_msensor_mng_fd[dev]);
|
|
g_msensor_mng_fd[dev] = -1;
|
|
MSENSOR_MUTEX_UNLOCK();
|
|
MSENSOR_TRACE(MODULE_DBG_ERR, "msensor dev %d, ret %d\n", dev, g_msensor_mng_fd[dev]);
|
|
return XMEDIA_ERRCODE_NOT_READY;
|
|
}
|
|
}
|
|
MSENSOR_MUTEX_UNLOCK();
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
#define MSENSOR_CHECK_NULL_PTR_RETURN(ptr) \
|
|
do { \
|
|
xmedia_s32 ret = msensor_check_null_ptr((xmedia_void *)(ptr)); \
|
|
if (ret != XMEDIA_SUCCESS) { \
|
|
return ret; \
|
|
} \
|
|
} while (0)
|
|
|
|
|
|
#define MSENSOR_CHECK_DEV_ID_RETURN(dev) \
|
|
do { \
|
|
xmedia_s32 ret = msensor_check_dev(dev); \
|
|
if (ret != XMEDIA_SUCCESS) { \
|
|
return ret; \
|
|
} \
|
|
} while (0)
|
|
|
|
#define MSENSOR_CHECK_CHIP_OPEN_RETURN(dev) \
|
|
do { \
|
|
xmedia_s32 ret = msensor_check_chip_open(dev); \
|
|
if (ret != XMEDIA_SUCCESS) { \
|
|
return ret; \
|
|
} \
|
|
} while (0)
|
|
|
|
#define MSENSOR_CHECK_MNG_OPEN_RETURN(dev) \
|
|
do { \
|
|
xmedia_s32 ret = msensor_check_mng_open(dev); \
|
|
if (ret != XMEDIA_SUCCESS) { \
|
|
return ret; \
|
|
} \
|
|
} while (0)
|
|
|
|
xmedia_s32 xmedia_msensor_init(xmedia_void)
|
|
{
|
|
MSENSOR_MUTEX_LOCK();
|
|
|
|
if (g_msensor_tgid_init == XMEDIA_TRUE) {
|
|
MSENSOR_MUTEX_UNLOCK();
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
g_msensor_tgid_init = XMEDIA_TRUE;
|
|
|
|
MSENSOR_MUTEX_UNLOCK();
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_void xmedia_msensor_exit(xmedia_void)
|
|
{
|
|
xmedia_s32 i;
|
|
|
|
MSENSOR_MUTEX_LOCK();
|
|
|
|
if (g_msensor_tgid_init == XMEDIA_FALSE) {
|
|
MSENSOR_MUTEX_UNLOCK();
|
|
return ;
|
|
}
|
|
|
|
for (i = 0; i < XMEDIA_MSENSOR_MAX_DEV_NUM; i++) {
|
|
if (g_msensor_mng_fd[i] >= 0) {
|
|
close(g_msensor_mng_fd[i]);
|
|
g_msensor_mng_fd[i] = -1;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < XMEDIA_MSENSOR_MAX_DEV_NUM; i++) {
|
|
if (g_msensor_chip_fd[i] >= 0) {
|
|
close(g_msensor_chip_fd[i]);
|
|
g_msensor_chip_fd[i] = -1;
|
|
}
|
|
}
|
|
|
|
g_msensor_tgid_init = XMEDIA_FALSE;
|
|
|
|
MSENSOR_MUTEX_UNLOCK();
|
|
return;
|
|
}
|
|
|
|
xmedia_s32 xmedia_msensor_create_dev(xmedia_s32 dev, const xmedia_msensor_param *param)
|
|
{
|
|
MSENSOR_CHECK_DEV_ID_RETURN(dev);
|
|
MSENSOR_CHECK_NULL_PTR_RETURN(param);
|
|
|
|
MSENSOR_CHECK_INIT_RETURN();
|
|
MSENSOR_CHECK_CHIP_OPEN_RETURN(dev);
|
|
|
|
return ioctl(g_msensor_chip_fd[dev], MSENSOR_CMD_CREATE, param);
|
|
}
|
|
|
|
xmedia_s32 xmedia_msensor_destroy_dev(xmedia_s32 dev)
|
|
{
|
|
MSENSOR_CHECK_DEV_ID_RETURN(dev);
|
|
|
|
MSENSOR_CHECK_INIT_RETURN();
|
|
MSENSOR_CHECK_CHIP_OPEN_RETURN(dev);
|
|
|
|
return ioctl(g_msensor_chip_fd[dev], MSENSOR_CMD_DESTROY);
|
|
}
|
|
|
|
xmedia_s32 xmedia_msensor_get_param(xmedia_s32 dev, xmedia_msensor_param *param)
|
|
{
|
|
MSENSOR_CHECK_DEV_ID_RETURN(dev);
|
|
MSENSOR_CHECK_NULL_PTR_RETURN(param);
|
|
|
|
MSENSOR_CHECK_INIT_RETURN();
|
|
MSENSOR_CHECK_CHIP_OPEN_RETURN(dev);
|
|
|
|
return ioctl(g_msensor_chip_fd[dev], MSENSOR_CMD_GET_PARAM, param);
|
|
}
|
|
|
|
xmedia_s32 xmedia_msensor_start_dev(xmedia_s32 dev)
|
|
{
|
|
MSENSOR_CHECK_DEV_ID_RETURN(dev);
|
|
|
|
MSENSOR_CHECK_INIT_RETURN();
|
|
MSENSOR_CHECK_CHIP_OPEN_RETURN(dev);
|
|
|
|
return ioctl(g_msensor_chip_fd[dev], MSENSOR_CMD_START);
|
|
}
|
|
|
|
xmedia_s32 xmedia_msensor_stop_dev(xmedia_s32 dev)
|
|
{
|
|
MSENSOR_CHECK_DEV_ID_RETURN(dev);
|
|
|
|
MSENSOR_CHECK_INIT_RETURN();
|
|
MSENSOR_CHECK_CHIP_OPEN_RETURN(dev);
|
|
|
|
return ioctl(g_msensor_chip_fd[dev], MSENSOR_CMD_STOP);
|
|
}
|
|
|
|
xmedia_s32 xmedia_msensor_add_user(xmedia_s32 dev, xmedia_s32 *user_id)
|
|
{
|
|
MSENSOR_CHECK_DEV_ID_RETURN(dev);
|
|
|
|
MSENSOR_CHECK_INIT_RETURN();
|
|
MSENSOR_CHECK_CHIP_OPEN_RETURN(dev);
|
|
MSENSOR_CHECK_MNG_OPEN_RETURN(dev);
|
|
|
|
return ioctl(g_msensor_mng_fd[dev], MSENSOR_CMD_ADD_USER, user_id);
|
|
}
|
|
|
|
xmedia_s32 xmedia_msensor_delete_user(xmedia_s32 dev, xmedia_s32 user_id)
|
|
{
|
|
MSENSOR_CHECK_DEV_ID_RETURN(dev);
|
|
|
|
MSENSOR_CHECK_INIT_RETURN();
|
|
MSENSOR_CHECK_CHIP_OPEN_RETURN(dev);
|
|
MSENSOR_CHECK_MNG_OPEN_RETURN(dev);
|
|
|
|
return ioctl(g_msensor_mng_fd[dev], MSENSOR_CMD_DELETE_USER, &user_id);
|
|
}
|
|
|
|
xmedia_s32 xmedia_msensor_get_data(xmedia_s32 dev, xmedia_msensor_data_info *data)
|
|
{
|
|
MSENSOR_CHECK_DEV_ID_RETURN(dev);
|
|
MSENSOR_CHECK_NULL_PTR_RETURN(data);
|
|
|
|
MSENSOR_CHECK_INIT_RETURN();
|
|
MSENSOR_CHECK_CHIP_OPEN_RETURN(dev);
|
|
MSENSOR_CHECK_MNG_OPEN_RETURN(dev);
|
|
|
|
return ioctl(g_msensor_mng_fd[dev], MSENSOR_CMD_GET_DATA, data);
|
|
}
|
|
|
|
xmedia_s32 xmedia_msensor_send_data(xmedia_s32 dev, const xmedia_msensor_data_info *data)
|
|
{
|
|
MSENSOR_CHECK_DEV_ID_RETURN(dev);
|
|
MSENSOR_CHECK_NULL_PTR_RETURN(data);
|
|
|
|
MSENSOR_CHECK_INIT_RETURN();
|
|
MSENSOR_CHECK_CHIP_OPEN_RETURN(dev);
|
|
MSENSOR_CHECK_MNG_OPEN_RETURN(dev);
|
|
|
|
return ioctl(g_msensor_mng_fd[dev], MSENSOR_CMD_SEND_DATA, data);
|
|
}
|
|
|