GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)

This commit is contained in:
lai
2026-09-06 03:52:57 +08:00
commit b1928b41c0
21813 changed files with 4413081 additions and 0 deletions
@@ -0,0 +1,29 @@
ifneq ($(srctree),)
KERNEL_DIR := $(srctree)
SDK_DIR := $(shell cd $(KERNEL_DIR)/../../.. && /bin/pwd)
else
SDK_DIR := $(shell cd $(CURDIR)/../../../../../.. && /bin/pwd)
endif
include $(SDK_DIR)/build/base.mk
MOD_NAME := xm_msensor_mng
SRCS = ./src/msensor_exe.c
SRCS += ./src/msensor_buf.c
SRCS += ./src/msensor_mng_proc.c
SDK_KER_CFLAGS += -I$(GMP_DIR)/include
SDK_KER_CFLAGS += -I$(GMP_DIR)/drv/include
SDK_KER_CFLAGS += -I$(GMP_DIR)/usr/include
SDK_KER_CFLAGS += -I$(GMP_DIR)/drv/osal/include
SDK_KER_CFLAGS += -I$(GMP_DIR)/drv/ext/msensor/msensor_mng/include
SDK_KER_CFLAGS += -I$(GMP_DIR)/drv/ext/msensor/include
SDK_KER_CFLAGS += -I$(GMP_DIR)/drv/ext/msensor/ext_inc
#SDK_KER_CFLAGS += -I$(GMP_DIR)/drv/msensor/msensor_chip/main/
SDK_KER_CFLAGS += -DCONFIG_PROC_SHOW_SUPPORT
include $(SDK_DIR)/build/sdk_ko_rules.mk
@@ -0,0 +1,76 @@
/*
* Copyright (c); XMEDIA. All rights reserved.
*/
#ifndef __MSENSOR_BUF_H__
#define __MSENSOR_BUF_H__
#include "msensor_ext.h"
#include "osal.h"
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* end of #ifdef __cplusplus */
#define BUF_BLOCK_NUM 6
#define MAX_USER_NUM 10
/*
* min msensor gap between reader pointer and write pointer,
* to prevent new data overlap with reading/processing data
*/
#define WR_GAP 100
typedef struct {
xmedia_void *start_addr; /* start address */
xmedia_void *write_ptr; /* write pointer */
} msensor_buf_info;
typedef enum {
DATA_X,
DATA_Y,
DATA_Z,
DATA_TEMP,
DATA_PTS,
DATA_BUTT
} msensor_buf_data_type;
typedef struct {
xmedia_void *read_ptr[XMEDIA_MSENSOR_DATA_TYPE_MAX][DATA_BUTT];
xmedia_s32 reverd3[4]; /* array 4 */
} msensor_buf_user_context;
typedef struct {
xmedia_u32 user_cnt;
osal_spinlock_t mng_lock;
osal_spinlock_t read_lock[MAX_USER_NUM];
msensor_buf_user_context *user_ctx[MAX_USER_NUM];
osal_mutex_t mng_mutex;
} msensor_buf_user_mng;
msensor_buf_info **msensor_buf_get_info(xmedia_s32 dev);
osal_spinlock_t *msensor_buf_get_lock(xmedia_s32 dev);
xmedia_s32 msensor_buf_lock_init(xmedia_void);
xmedia_void msensor_buf_lock_exit(xmedia_void);
xmedia_s32 msensor_buf_init(xmedia_s32 dev, const xmedia_msensor_buf_attr *buf_attr,
xmedia_u32 gyro_freq, xmedia_u32 accel_freq, xmedia_u32 mag_freq);
xmedia_s32 msensor_buf_exit(xmedia_s32 dev);
xmedia_s32 msensor_buf_write_data(xmedia_s32 dev, xmedia_msensor_data_type data_type,
const xmedia_msensor_sample_data *sample_data);
xmedia_s32 msensor_buf_get_data(xmedia_s32 dev, xmedia_msensor_data_info *msensor_data);
xmedia_s32 msensor_buf_release_data(xmedia_s32 dev, xmedia_msensor_data_info *msensor_data_info);
xmedia_s32 msensor_buf_add_user(xmedia_s32 dev, xmedia_s32 *id);
xmedia_s32 msensor_buf_delete_user(xmedia_s32 dev, const xmedia_s32 *id);
xmedia_bool msensor_buf_get_status(xmedia_s32 dev);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* end of #ifdef __cplusplus */
#endif
@@ -0,0 +1,80 @@
/*
* Copyright (c); XMEDIA. All rights reserved.
*/
#ifndef __MSENSOR_EXE_H__
#define __MSENSOR_EXE_H__
#include "xmedia_debug.h"
#include "xmedia_type.h"
#include "xmedia_msensor.h"
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* end of #ifdef __cplusplus */
/* name MAG INTERFACE */
#define C_BMI160_BYTE_COUNT 2
#define BMI160_SLEEP_STATE 0x00
#define BMI160_WAKEUP_INTR 0x00
#define BMI160_SLEEP_TRIGGER 0x04
#define BMI160_WAKEUP_TRIGGER 0x02
#define BMI160_ENABLE_FIFO_WM 0x02
#define BMI160_MAG_INTERFACE_OFF_PRIMARY_ON 0x00
#define BMI160_MAG_INTERFACE_ON_PRIMARY_ON 0x02
#define BMI160_MODE_SWITCHING_DELAY 30
#define msensor_return_if_null_ptr(ptr) \
do { \
if ((ptr) == XMEDIA_NULL) { \
printk("input null ptr\n"); \
return XMEDIA_FAILURE; \
} \
} while (0)
typedef struct {
xmedia_u32 cmd;
xmedia_s32 (*func)(xmedia_uintptr_t arg);
} msensor_mng_info;
/* for msensor_mng proc */
#define MNG_MAX_LEN 10
typedef struct {
xmedia_char gyro_name[MNG_MAX_LEN];
xmedia_char accel_name[MNG_MAX_LEN];
xmedia_char mag_name[MNG_MAX_LEN];
xmedia_u64 buf_addr[XMEDIA_MSENSOR_DATA_TYPE_MAX];
xmedia_u32 buf_size[XMEDIA_MSENSOR_DATA_TYPE_MAX];
xmedia_u32 buf_overflow[XMEDIA_MSENSOR_DATA_TYPE_MAX];
xmedia_u32 buf_data_unmatch[XMEDIA_MSENSOR_DATA_TYPE_MAX];
xmedia_s32 buf_overflow_id[XMEDIA_MSENSOR_DATA_TYPE_MAX];
xmedia_s32 buf_data_unmatch_id[XMEDIA_MSENSOR_DATA_TYPE_MAX];
} msensor_mng_proc_info;
msensor_mng_proc_info *msensor_mng_get_proc_info(xmedia_s32 dev);
xmedia_s32 msensor_mng_proc_info_init(xmedia_s32 dev);
xmedia_s32 msensor_mng_buf_init(xmedia_s32 dev,
const xmedia_msensor_attr *motion_attr,
const xmedia_msensor_buf_attr *msensor_buf_attr,
const xmedia_msensor_config *msensor_config);
xmedia_s32 msensor_mng_buf_exit(xmedia_s32 dev);
xmedia_s32 msensor_mng_write_data_to_buf(xmedia_s32 dev, xmedia_msensor_data *msensor_data);
xmedia_s32 msensor_mng_write_data_2_buf(xmedia_s32 dev);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* end of #ifdef __cplusplus */
#endif
@@ -0,0 +1,42 @@
/*
* Copyright (c); XMEDIA. All rights reserved.
*/
#ifndef __MSENSOR_MNG_IOCTL_H__
#define __MSENSOR_MNG_IOCTL_H__
#include "xmedia_msensor.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* end of #ifdef __cplusplus */
#define MSENSOR_TYPE_MNG 10
typedef enum {
IOC_NR_MSENSOR_MNG_FLAG2FD,
IOC_NR_MSENSOR_MNG_GET_DATA,
IOC_NR_MSENSOR_MNG_RELEASE_BUF,
IOC_NR_MSENSOR_MNG_ADD_USER,
IOC_NR_MSENSOR_MNG_DELETE_USER,
IOC_NR_MSENSOR_MNG_SEND_DATA,
IOC_NR_MSENSOR_MNG_BUTT
} ioc_nr_msensor_mng;
#define MSENSOR_CMD_MNG_BIND_FLAG2FD _IOW(MSENSOR_TYPE_MNG, IOC_NR_MSENSOR_MNG_FLAG2FD, xmedia_u32)
#define MSENSOR_CMD_GET_DATA _IOWR(MSENSOR_TYPE_MNG, IOC_NR_MSENSOR_MNG_GET_DATA, xmedia_msensor_data_info)
#define MSENSOR_CMD_RELEASE_BUF _IOWR(MSENSOR_TYPE_MNG, IOC_NR_MSENSOR_MNG_RELEASE_BUF, xmedia_msensor_data_info)
#define MSENSOR_CMD_ADD_USER _IOWR(MSENSOR_TYPE_MNG, IOC_NR_MSENSOR_MNG_ADD_USER, xmedia_s32)
#define MSENSOR_CMD_DELETE_USER _IOWR(MSENSOR_TYPE_MNG, IOC_NR_MSENSOR_MNG_DELETE_USER, xmedia_s32)
#define MSENSOR_CMD_SEND_DATA _IOW(MSENSOR_TYPE_MNG, IOC_NR_MSENSOR_MNG_SEND_DATA, xmedia_msensor_data)
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* end of #ifdef __cplusplus */
#endif
@@ -0,0 +1,26 @@
/*
* Copyright (c); XMEDIA. All rights reserved.
*/
#ifndef __MSENSOR_MNG_PROC__
#define __MSENSOR_MNG_PROC__
#include "msensor_ext.h"
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* end of #ifdef __cplusplus */
int msensor_proc_init(xmedia_void);
void msensor_proc_exit(xmedia_void);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* end of #ifdef __cplusplus */
#endif
@@ -0,0 +1,832 @@
/*
* Copyright (c); XMEDIA. All rights reserved.
*/
#include "msensor_buf.h"
#include <linux/kernel.h>
#include "msensor_exe.h"
#include "osal.h"
static xmedia_bool g_forward[XMEDIA_MSENSOR_MAX_DEV_NUM] = { XMEDIA_TRUE };
static xmedia_bool g_buf_init[XMEDIA_MSENSOR_MAX_DEV_NUM] = { XMEDIA_FALSE };
msensor_buf_info g_buf_info[XMEDIA_MSENSOR_MAX_DEV_NUM][XMEDIA_MSENSOR_DATA_TYPE_MAX][DATA_BUTT];
static xmedia_s64 g_offset[XMEDIA_MSENSOR_MAX_DEV_NUM] = { 0 };
xmedia_bool g_already_released[XMEDIA_MSENSOR_MAX_DEV_NUM][MAX_USER_NUM] = { XMEDIA_FALSE };
msensor_buf_user_mng g_user_mng[XMEDIA_MSENSOR_MAX_DEV_NUM];
static unsigned long g_msensor_buf_len[XMEDIA_MSENSOR_MAX_DEV_NUM] = { 0 };
#define DATA_RESERVE_NUM 50
#define xmedia_align(x, a) ((a) * (((x) + (a) - 1) / (a)))
#define x_start_addr(dev, data_type) g_buf_info[dev][data_type][DATA_X].start_addr
#define y_start_addr(dev, data_type) g_buf_info[dev][data_type][DATA_Y].start_addr
#define z_start_addr(dev, data_type) g_buf_info[dev][data_type][DATA_Z].start_addr
#define temp_start_addr(dev, data_type) g_buf_info[dev][data_type][DATA_TEMP].start_addr
#define pts_start_addr(dev, data_type) g_buf_info[dev][data_type][DATA_PTS].start_addr
#define x_write_ptr(dev, data_type) g_buf_info[dev][data_type][DATA_X].write_ptr
#define y_write_ptr(dev, data_type) g_buf_info[dev][data_type][DATA_Y].write_ptr
#define z_write_ptr(dev, data_type) g_buf_info[dev][data_type][DATA_Z].write_ptr
#define temp_write_ptr(dev, data_type) g_buf_info[dev][data_type][DATA_TEMP].write_ptr
#define pts_write_ptr(dev, data_type) g_buf_info[dev][data_type][DATA_PTS].write_ptr
#define x_read_ptr(dev, i, data_type) g_user_mng[dev].user_ctx[i]->read_ptr[data_type][DATA_X]
#define y_read_ptr(dev, i, data_type) g_user_mng[dev].user_ctx[i]->read_ptr[data_type][DATA_Y]
#define z_read_ptr(dev, i, data_type) g_user_mng[dev].user_ctx[i]->read_ptr[data_type][DATA_Z]
#define temp_read_ptr(dev, i, data_type) g_user_mng[dev].user_ctx[i]->read_ptr[data_type][DATA_TEMP]
#define pts_read_ptr(dev, i, data_type) g_user_mng[dev].user_ctx[i]->read_ptr[data_type][DATA_PTS]
msensor_buf_info **msensor_buf_get_info(xmedia_s32 dev)
{
return (msensor_buf_info **)g_buf_info[dev];
}
xmedia_bool msensor_buf_get_status(xmedia_s32 dev)
{
return g_buf_init[dev];
}
osal_spinlock_t *msensor_buf_get_lock(xmedia_s32 dev)
{
return &g_user_mng[dev].mng_lock;
}
static xmedia_s32 msensor_buf_get_user_id(xmedia_s32 dev, xmedia_s32 *id)
{
xmedia_s32 i;
for (i = 0; i < MAX_USER_NUM; i++) {
if (g_user_mng[dev].user_ctx[i] == XMEDIA_NULL) {
*id = i;
return XMEDIA_SUCCESS;
}
}
MSENSOR_ERR_TRACE("dev %d no id for user.\n", dev);
return XMEDIA_FAILURE;
}
static xmedia_s32 msensor_buf_add_user_create_ctx(xmedia_s32 dev, const xmedia_s32 *id)
{
xmedia_s32 i;
xmedia_s32 j;
xmedia_ulong flags;
msensor_buf_user_context *user_ctx = XMEDIA_NULL;
msensor_mng_proc_info *proc_info = XMEDIA_NULL;
proc_info = msensor_mng_get_proc_info(dev);
user_ctx = (msensor_buf_user_context *)osal_vmalloc(sizeof(msensor_buf_user_context));
if (user_ctx == XMEDIA_NULL) {
MSENSOR_ERR_TRACE("dev %d osal_vmalloc failed.\n", dev);
return XMEDIA_FAILURE;
}
(xmedia_void) osal_memset(user_ctx, 0, sizeof(msensor_buf_user_context));
osal_spin_lock_irqsave(&g_user_mng[dev].read_lock[*id], &flags);
for (i = 0; i < DATA_BUTT; i++) {
if (i == DATA_PTS) {
for (j = 0; j < XMEDIA_MSENSOR_DATA_TYPE_MAX; j++) {
user_ctx->read_ptr[j][i] = (proc_info->buf_size[j] > DATA_RESERVE_NUM * BUF_BLOCK_NUM)
? (xmedia_u64 *)g_buf_info[dev][j][i].write_ptr
: g_buf_info[dev][j][i].write_ptr;
}
} else {
for (j = 0; j < XMEDIA_MSENSOR_DATA_TYPE_MAX; j++) {
user_ctx->read_ptr[j][i] = (int *)g_buf_info[dev][j][i].write_ptr;
}
}
}
g_forward[dev] = XMEDIA_TRUE;
g_user_mng[dev].user_ctx[*id] = user_ctx;
g_user_mng[dev].user_cnt++;
osal_spin_unlock_irqrestore(&g_user_mng[dev].read_lock[*id], &flags);
return XMEDIA_SUCCESS;
}
xmedia_s32 msensor_buf_add_user(xmedia_s32 dev, xmedia_s32 *id)
{
xmedia_s32 ret;
if (id == NULL) {
MSENSOR_ERR_TRACE("dev %d msensor id is null.\n", dev);
return XMEDIA_ERRCODE_NULL_PTR;
}
if (g_buf_init[dev] == XMEDIA_FALSE) {
MSENSOR_ERR_TRACE("dev %d buf not init, g_buf_init:%d\n", dev, g_buf_init[dev]);
return XMEDIA_FAILURE;
}
osal_mutex_lock(&g_user_mng[dev].mng_mutex);
/* step 1: get available ID */
if (g_user_mng[dev].user_cnt > MAX_USER_NUM) {
MSENSOR_ERR_TRACE("dev %d msensor id has reached toplimit.\n", dev);
goto err0;
}
/* get user id for use */
ret = msensor_buf_get_user_id(dev, id);
if (ret != XMEDIA_SUCCESS) {
*id = -1;
MSENSOR_ERR_TRACE("dev %d get_user_id failed.\n", dev);
goto err0;
}
if ((*id < 0) || (*id >= MAX_USER_NUM)) {
MSENSOR_ERR_TRACE("dev %d id(%d) out of range[0,%d].\n", dev, *id, MAX_USER_NUM);
goto err0;
}
/* step 2: create context for new ID */
ret = msensor_buf_add_user_create_ctx(dev, id);
if (ret != XMEDIA_SUCCESS) {
goto err0;
}
osal_mutex_unlock(&g_user_mng[dev].mng_mutex);
osal_msleep(200); /* 200ms */
return XMEDIA_SUCCESS;
err0:
osal_mutex_unlock(&g_user_mng[dev].mng_mutex);
return XMEDIA_FAILURE;
}
xmedia_s32 msensor_buf_delete_user(xmedia_s32 dev, const xmedia_s32 *id)
{
msensor_buf_user_context *msenser_buf_user_contex_temp = XMEDIA_NULL;
xmedia_ulong flags;
if (id == NULL) {
MSENSOR_ERR_TRACE("dev %d msensor id is null.\n", dev);
return XMEDIA_ERRCODE_NULL_PTR;
}
if ((*id < 0) || (*id >= MAX_USER_NUM)) {
MSENSOR_ERR_TRACE("dev %d id(%d) out of range[0,%d].\n", dev, *id, MAX_USER_NUM);
return XMEDIA_FAILURE;
}
if (g_buf_init[dev] == XMEDIA_FALSE) {
MSENSOR_ERR_TRACE("dev %d msensor buffer not inited.\n", dev);
return XMEDIA_FAILURE;
}
if (g_user_mng[dev].user_ctx[*id] == XMEDIA_NULL) {
msensor_debug_trace("dev %d id is null.\n", dev);
return XMEDIA_SUCCESS;
}
osal_mutex_lock(&g_user_mng[dev].mng_mutex);
osal_spin_lock_irqsave(&g_user_mng[dev].mng_lock, &flags);
/* release context */
msenser_buf_user_contex_temp = g_user_mng[dev].user_ctx[*id];
g_user_mng[dev].user_ctx[*id] = XMEDIA_NULL;
g_user_mng[dev].user_cnt--;
osal_spin_unlock_irqrestore(&g_user_mng[dev].mng_lock, &flags);
osal_mutex_unlock(&g_user_mng[dev].mng_mutex);
if (msenser_buf_user_contex_temp != XMEDIA_NULL) {
osal_vfree(msenser_buf_user_contex_temp);
msenser_buf_user_contex_temp = XMEDIA_NULL;
}
return XMEDIA_SUCCESS;
}
static xmedia_void msensor_buf_init_proc(xmedia_s32 dev, const xmedia_u32 *gyro_block_size,
const xmedia_u32 *acc_block_size, const xmedia_u32 *mag_block_size)
{
msensor_mng_proc_info *proc_info = XMEDIA_NULL;
proc_info = msensor_mng_get_proc_info(dev);
proc_info->buf_addr[XMEDIA_MSENSOR_DATA_TYPE_GYRO] =
(xmedia_u64)(xmedia_uintptr_t)g_buf_info[dev][XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_X].start_addr;
proc_info->buf_addr[XMEDIA_MSENSOR_DATA_TYPE_ACC] =
(xmedia_u64)(xmedia_uintptr_t)g_buf_info[dev][XMEDIA_MSENSOR_DATA_TYPE_ACC][DATA_X].start_addr;
proc_info->buf_size[XMEDIA_MSENSOR_DATA_TYPE_GYRO] = *gyro_block_size * BUF_BLOCK_NUM;
proc_info->buf_size[XMEDIA_MSENSOR_DATA_TYPE_ACC] = *acc_block_size * BUF_BLOCK_NUM;
msensor_debug_trace("##### dev %d gyro-au64_buf_addr:%llu acc-au64_buf_addr:%llu\n", dev,
proc_info->buf_addr[XMEDIA_MSENSOR_DATA_TYPE_GYRO],
proc_info->buf_addr[XMEDIA_MSENSOR_DATA_TYPE_ACC]);
return;
}
static xmedia_void msensor_buf_allocation_init(xmedia_s32 dev, xmedia_u32 buflen, xmedia_u32 gyro_odr,
xmedia_u32 accel_odr, xmedia_u32 mag_odr, const xmedia_void *vir_addr)
{
xmedia_s32 i;
xmedia_u32 gyro_block_size;
xmedia_u32 acc_block_size;
xmedia_u32 mag_block_size;
gyro_block_size = buflen * gyro_odr / (gyro_odr + accel_odr + mag_odr) / BUF_BLOCK_NUM / 32 * 32; /* align by 32 */
acc_block_size = buflen * accel_odr / (gyro_odr + accel_odr + mag_odr) / BUF_BLOCK_NUM / 32 * 32; /* align by 32 */
mag_block_size = (buflen / BUF_BLOCK_NUM - gyro_block_size - acc_block_size) / 32 * 32; /* align by 32 */
msensor_debug_trace("dev %d gyro block size %u, acc block size %d, mag block size %u\n", dev, gyro_block_size,
acc_block_size, mag_block_size);
for (i = 0; i < DATA_BUTT; i++) {
g_buf_info[dev][XMEDIA_MSENSOR_DATA_TYPE_GYRO][i].start_addr = (xmedia_u8 *)vir_addr + gyro_block_size * i;
g_buf_info[dev][XMEDIA_MSENSOR_DATA_TYPE_GYRO][i].write_ptr =
g_buf_info[dev][XMEDIA_MSENSOR_DATA_TYPE_GYRO][i].start_addr;
g_buf_info[dev][XMEDIA_MSENSOR_DATA_TYPE_ACC][i].start_addr =
(xmedia_u8 *)vir_addr + gyro_block_size * BUF_BLOCK_NUM + acc_block_size * i;
g_buf_info[dev][XMEDIA_MSENSOR_DATA_TYPE_ACC][i].write_ptr =
g_buf_info[dev][XMEDIA_MSENSOR_DATA_TYPE_ACC][i].start_addr;
}
msensor_debug_trace("**pts-write_pointer:%p\n", g_buf_info[dev][XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_PTS].write_ptr);
msensor_buf_init_proc(dev, &gyro_block_size, &acc_block_size, &mag_block_size);
return;
}
xmedia_s32 msensor_buf_init(xmedia_s32 dev, const xmedia_msensor_buf_attr *buf_attr, xmedia_u32 gyro_odr,
xmedia_u32 accel_odr, xmedia_u32 mag_odr)
{
xmedia_void *vir_addr = XMEDIA_NULL;
xmedia_s32 i;
if (g_buf_init[dev] == XMEDIA_TRUE) {
MSENSOR_ERR_TRACE("dev %d buf already inited\n", dev);
return XMEDIA_SUCCESS;
}
if ((buf_attr->phys_addr == 0) || (buf_attr->buf_len == 0)) {
MSENSOR_ERR_TRACE("dev %d buf addr can not be null and buf size must lager than 0\n", dev);
return XMEDIA_FAILURE;
}
if ((gyro_odr == 0) && (accel_odr == 0) && (mag_odr == 0)) {
MSENSOR_ERR_TRACE("dev %d can't all frequency be 0\n", dev);
return XMEDIA_FAILURE;
}
/* modify for 64bit chip */
vir_addr = osal_ioremap_wc((xmedia_u64)buf_attr->phys_addr, xmedia_align(buf_attr->buf_len, 4));
if (vir_addr == XMEDIA_NULL) {
MSENSOR_ERR_TRACE("dev %d ioremap err\n", dev);
return XMEDIA_FAILURE;
}
g_msensor_buf_len[dev] = xmedia_align(buf_attr->buf_len, 4);
(xmedia_void) osal_memset(vir_addr, 0, buf_attr->buf_len);
msensor_debug_trace("dev %d phy_addr:%llx vir_addr:%p buflen:%d\n", dev, buf_attr->phys_addr, vir_addr,
buf_attr->buf_len);
g_offset[dev] = buf_attr->phys_addr - (xmedia_u64)(xmedia_uintptr_t)vir_addr;
msensor_buf_allocation_init(dev, buf_attr->buf_len, gyro_odr, accel_odr, mag_odr, vir_addr);
osal_mutex_init(&g_user_mng[dev].mng_mutex);
for (i = 0; i < MAX_USER_NUM; i++) {
g_already_released[dev][i] = XMEDIA_TRUE;
}
g_buf_init[dev] = XMEDIA_TRUE;
return XMEDIA_SUCCESS;
}
xmedia_s32 msensor_buf_exit(xmedia_s32 dev)
{
xmedia_s32 i;
xmedia_s32 ret;
if (g_buf_init[dev] == XMEDIA_FALSE) {
MSENSOR_ERR_TRACE("dev %d buf already deinited\n", dev);
return XMEDIA_SUCCESS;
}
for (i = 0; i < MAX_USER_NUM; i++) {
ret = msensor_buf_delete_user(dev, &i);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("dev %d msensor delete user failed\n", dev);
}
}
osal_iounmap(g_buf_info[dev][XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_X].start_addr);
g_msensor_buf_len[dev] = 0;
(xmedia_void) osal_memset(&g_buf_info[dev], 0, sizeof(g_buf_info[dev]));
g_buf_init[dev] = XMEDIA_FALSE;
return ret;
}
static xmedia_void msensor_buf_write(xmedia_s32 dev, xmedia_msensor_data_type data_type,
const xmedia_msensor_sample_data *sample_data)
{
xmedia_void *next_write_pointer = XMEDIA_NULL;
/* step 2:write data */
*(xmedia_s32 *)x_write_ptr(dev, data_type) = sample_data->x;
*(xmedia_s32 *)y_write_ptr(dev, data_type) = sample_data->y;
*(xmedia_s32 *)z_write_ptr(dev, data_type) = sample_data->z;
*(xmedia_s32 *)temp_write_ptr(dev, data_type) = sample_data->temperature;
*(xmedia_u64 *)pts_write_ptr(dev, data_type) = sample_data->pts;
/* step 3:calculate next write pointer */
next_write_pointer = (xmedia_u8 *)x_write_ptr(dev, data_type) + sizeof(sample_data->x);
if (next_write_pointer >= y_start_addr(dev, data_type)) {
x_write_ptr(dev, data_type) = x_start_addr(dev, data_type);
y_write_ptr(dev, data_type) = y_start_addr(dev, data_type);
z_write_ptr(dev, data_type) = z_start_addr(dev, data_type);
temp_write_ptr(dev, data_type) = temp_start_addr(dev, data_type);
pts_write_ptr(dev, data_type) = pts_start_addr(dev, data_type);
} else {
x_write_ptr(dev, data_type) = (xmedia_u8 *)x_write_ptr(dev, data_type) + sizeof(sample_data->x);
y_write_ptr(dev, data_type) = (xmedia_u8 *)y_write_ptr(dev, data_type) + sizeof(sample_data->y);
z_write_ptr(dev, data_type) = (xmedia_u8 *)z_write_ptr(dev, data_type) + sizeof(sample_data->z);
temp_write_ptr(dev, data_type) = (xmedia_u8 *)temp_write_ptr(dev, data_type) + sizeof(sample_data->temperature);
pts_write_ptr(dev, data_type) = (xmedia_u8 *)pts_write_ptr(dev, data_type) + sizeof(sample_data->pts);
}
return;
}
xmedia_s32 msensor_buf_write_data(xmedia_s32 dev, xmedia_msensor_data_type data_type,
const xmedia_msensor_sample_data *sample_data)
{
xmedia_s32 i;
xmedia_void *tmp_ptr = XMEDIA_NULL;
xmedia_bool condition;
msensor_mng_proc_info *proc_info = XMEDIA_NULL;
xmedia_ulong flags;
proc_info = msensor_mng_get_proc_info(dev);
if (g_buf_init[dev] == XMEDIA_FALSE) {
MSENSOR_ERR_TRACE("dev %d when write_data(pts:%lld),msensor buf not be inited yet\n", dev, sample_data->pts);
return XMEDIA_FAILURE;
}
/* step 1:judge if any user overflow */
if ((xmedia_u8 *)y_start_addr(dev, data_type) - (xmedia_u8 *)x_write_ptr(dev, data_type) >
(xmedia_s32)(sizeof(sample_data->x) * WR_GAP)) {
tmp_ptr = (xmedia_u8 *)x_write_ptr(dev, data_type) + sizeof(sample_data->x) * WR_GAP;
} else {
tmp_ptr = (xmedia_u8 *)x_start_addr(dev, data_type) + sizeof(sample_data->x) * WR_GAP -
((xmedia_u8 *)y_start_addr(dev, data_type) - (xmedia_u8 *)x_write_ptr(dev, data_type));
}
for (i = 0; i < MAX_USER_NUM; i++) {
if (g_user_mng[dev].user_ctx[i] != XMEDIA_NULL) {
if (((tmp_ptr == y_start_addr(dev, data_type)) &&
(x_read_ptr(dev, i, data_type) == x_start_addr(dev, data_type))) ||
(tmp_ptr == x_read_ptr(dev, i, data_type))) {
proc_info->buf_overflow[data_type]++;
proc_info->buf_overflow_id[data_type] = i;
osal_spin_lock_irqsave(&g_user_mng[dev].read_lock[i], &flags);
condition =
((xmedia_u32 *)x_read_ptr(dev, i, data_type) + 1) >= (xmedia_u32 *)y_start_addr(dev, data_type);
x_read_ptr(dev, i, data_type) =
condition ? x_start_addr(dev, data_type) : (xmedia_u32 *)x_read_ptr(dev, i, data_type) + 1;
y_read_ptr(dev, i, data_type) =
condition ? y_start_addr(dev, data_type) : (xmedia_u32 *)y_read_ptr(dev, i, data_type) + 1;
z_read_ptr(dev, i, data_type) =
condition ? z_start_addr(dev, data_type) : (xmedia_u32 *)z_read_ptr(dev, i, data_type) + 1;
temp_read_ptr(dev, i, data_type) =
condition ? temp_start_addr(dev, data_type) : (xmedia_u32 *)temp_read_ptr(dev, i, data_type) + 1;
pts_read_ptr(dev, i, data_type) =
condition ? pts_start_addr(dev, data_type) : (xmedia_u64 *)pts_read_ptr(dev, i, data_type) + 1;
osal_spin_unlock_irqrestore(&g_user_mng[dev].read_lock[i], &flags);
}
}
}
/* write data */
msensor_buf_write(dev, data_type, sample_data);
return XMEDIA_SUCCESS;
}
static xmedia_void msensor_buf_release(xmedia_s32 dev, xmedia_msensor_data_info *data_info)
{
xmedia_s32 id = data_info->id;
xmedia_msensor_data_type data_type = data_info->data_type;
xmedia_ulong flags;
osal_spin_lock_irqsave(&g_user_mng[dev].read_lock[id], &flags);
if (data_info->data[1].num == 0) {
if (data_info->data[0].num > 0) {
if (((xmedia_u64)(xmedia_uintptr_t)data_info->data[0].x_phys_addr +
data_info->data[0].num * sizeof(xmedia_s32) - g_offset[dev]) >=
((xmedia_u64)(xmedia_uintptr_t)y_start_addr(dev, data_type))) {
x_read_ptr(dev, id, data_type) = x_start_addr(dev, data_type);
y_read_ptr(dev, id, data_type) = y_start_addr(dev, data_type);
z_read_ptr(dev, id, data_type) = z_start_addr(dev, data_type);
temp_read_ptr(dev, id, data_type) = temp_start_addr(dev, data_type);
pts_read_ptr(dev, id, data_type) = pts_start_addr(dev, data_type);
} else {
x_read_ptr(dev, id, data_type) = (xmedia_u8 *)data_info->data[0].x_phys_addr +
data_info->data[0].num * sizeof(xmedia_s32) - g_offset[dev];
y_read_ptr(dev, id, data_type) = (xmedia_u8 *)data_info->data[0].y_phys_addr +
data_info->data[0].num * sizeof(xmedia_s32) - g_offset[dev];
z_read_ptr(dev, id, data_type) = (xmedia_u8 *)data_info->data[0].z_phys_addr +
data_info->data[0].num * sizeof(xmedia_s32) - g_offset[dev];
temp_read_ptr(dev, id, data_type) = (xmedia_u8 *)data_info->data[0].temperature_phys_addr +
data_info->data[0].num * sizeof(xmedia_s32) - g_offset[dev];
pts_read_ptr(dev, id, data_type) = (xmedia_u8 *)data_info->data[0].pts_phys_addr +
data_info->data[0].num * sizeof(xmedia_u64) - g_offset[dev];
}
}
} else {
x_read_ptr(dev, id, data_type) =
(xmedia_u8 *)data_info->data[1].x_phys_addr + data_info->data[1].num * sizeof(xmedia_s32) - g_offset[dev];
y_read_ptr(dev, id, data_type) =
(xmedia_u8 *)data_info->data[1].y_phys_addr + data_info->data[1].num * sizeof(xmedia_s32) - g_offset[dev];
z_read_ptr(dev, id, data_type) =
(xmedia_u8 *)data_info->data[1].z_phys_addr + data_info->data[1].num * sizeof(xmedia_s32) - g_offset[dev];
temp_read_ptr(dev, id, data_type) = (xmedia_u8 *)data_info->data[1].temperature_phys_addr +
data_info->data[1].num * sizeof(xmedia_s32) - g_offset[dev];
pts_read_ptr(dev, id, data_type) =
(xmedia_u8 *)data_info->data[1].pts_phys_addr + data_info->data[1].num * sizeof(xmedia_u64) - g_offset[dev];
}
data_info->data[0].num = 0;
data_info->data[1].num = 0;
g_already_released[dev][id] = XMEDIA_TRUE;
osal_spin_unlock_irqrestore(&g_user_mng[dev].read_lock[id], &flags);
return;
}
xmedia_s32 msensor_buf_release_data(xmedia_s32 dev, xmedia_msensor_data_info *data_info)
{
xmedia_ulong flags;
if (data_info == XMEDIA_NULL) {
MSENSOR_ERR_TRACE("dev %d data info is null\n", dev);
return XMEDIA_ERRCODE_NULL_PTR;
}
osal_spin_lock_irqsave(&g_user_mng[dev].mng_lock, &flags);
if ((data_info->id < 0) || (data_info->id >= MAX_USER_NUM)) {
osal_spin_unlock_irqrestore(&g_user_mng[dev].mng_lock, &flags);
MSENSOR_ERR_TRACE("dev %d *id(%d) is out of range[0,%d].\n", dev, data_info->id, MAX_USER_NUM);
return XMEDIA_FAILURE;
}
if (g_buf_init[dev] == XMEDIA_FALSE) {
osal_spin_unlock_irqrestore(&g_user_mng[dev].mng_lock, &flags);
MSENSOR_ERR_TRACE("dev %d when release_data, msensor buf not be inited yet\n", dev);
return XMEDIA_FAILURE;
}
if (g_user_mng[dev].user_ctx[data_info->id] == XMEDIA_NULL) {
osal_spin_unlock_irqrestore(&g_user_mng[dev].mng_lock, &flags);
MSENSOR_ERR_TRACE("dev %d msensor buf release: id is null.\n", dev);
return XMEDIA_FAILURE;
}
if (data_info->data_type >= XMEDIA_MSENSOR_DATA_TYPE_MAX) {
osal_spin_unlock_irqrestore(&g_user_mng[dev].mng_lock, &flags);
MSENSOR_ERR_TRACE("dev %d data_type:%d is out of range.\n", dev, data_info->data_type);
return XMEDIA_FAILURE;
}
if (g_already_released[dev][data_info->id] == XMEDIA_TRUE) {
osal_spin_unlock_irqrestore(&g_user_mng[dev].mng_lock, &flags);
return XMEDIA_SUCCESS;
}
/* release data */
msensor_buf_release(dev, data_info);
osal_spin_unlock_irqrestore(&g_user_mng[dev].mng_lock, &flags);
return XMEDIA_SUCCESS;
}
static xmedia_s32 msensor_buf_arrive_back_start_addr(xmedia_s32 dev, const xmedia_msensor_data_info *data_info)
{
xmedia_s32 length[2] = { 0 }; /* 2 : cycle buf */
xmedia_s32 buftotal_len;
xmedia_bool loop_flag = XMEDIA_FALSE;
xmedia_u32 interval;
xmedia_u64 *p_pts_read_ptr = XMEDIA_NULL;
xmedia_msensor_data_type data_type = data_info->data_type;
xmedia_s32 id = data_info->id;
buftotal_len = (xmedia_u32 *)y_start_addr(dev, data_type) - (xmedia_u32 *)x_start_addr(dev, data_type);
p_pts_read_ptr = pts_read_ptr(dev, id, data_type);
while (1) {
if ((*p_pts_read_ptr <= data_info->begin_pts) || (p_pts_read_ptr == pts_write_ptr(dev, data_type))) {
if (p_pts_read_ptr == pts_write_ptr(dev, data_type)) {
MSENSOR_ERR_TRACE("dev %d arrive to write_addr!\n", dev);
}
break;
}
if (p_pts_read_ptr == pts_start_addr(dev, data_type)) {
loop_flag = XMEDIA_TRUE;
p_pts_read_ptr = (xmedia_u64 *)pts_start_addr(dev, data_type) + buftotal_len - 1;
} else {
p_pts_read_ptr--;
}
g_forward[dev] = XMEDIA_FALSE;
/* msensor_debug_trace("#####pts_read_pointer:%p %lld\n", pts_read_ptr, *pts_read_ptr) */
if (loop_flag == XMEDIA_TRUE) {
length[1]++;
} else {
length[0]++;
}
}
if (length[1] > 0) {
interval = (xmedia_u64 *)pts_start_addr(dev, data_type) + buftotal_len - p_pts_read_ptr;
x_read_ptr(dev, id, data_type) = (xmedia_u32 *)y_start_addr(dev, data_type) - interval;
y_read_ptr(dev, id, data_type) = (xmedia_u32 *)z_start_addr(dev, data_type) - interval;
z_read_ptr(dev, id, data_type) = (xmedia_u32 *)temp_start_addr(dev, data_type) - interval;
temp_read_ptr(dev, id, data_type) = (xmedia_u32 *)pts_start_addr(dev, data_type) - interval;
pts_read_ptr(dev, id, data_type) = p_pts_read_ptr;
} else {
interval = (xmedia_u64 *)pts_read_ptr(dev, id, data_type) - p_pts_read_ptr;
x_read_ptr(dev, id, data_type) = (xmedia_u32 *)x_read_ptr(dev, id, data_type) - interval;
y_read_ptr(dev, id, data_type) = (xmedia_u32 *)y_read_ptr(dev, id, data_type) - interval;
z_read_ptr(dev, id, data_type) = (xmedia_u32 *)z_read_ptr(dev, id, data_type) - interval;
temp_read_ptr(dev, id, data_type) = (xmedia_u32 *)temp_read_ptr(dev, id, data_type) - interval;
pts_read_ptr(dev, id, data_type) = p_pts_read_ptr;
}
return XMEDIA_SUCCESS;
}
static xmedia_void msensor_buf_get_data_assign(xmedia_s32 dev, xmedia_msensor_data_info *data_info)
{
xmedia_s32 id = data_info->id;
xmedia_msensor_data_type data_type = data_info->data_type;
xmedia_u32 interval;
msensor_mng_proc_info *proc_info = XMEDIA_NULL;
proc_info = msensor_mng_get_proc_info(dev);
if (data_info->data[0].num > 0) {
data_info->data[0].x_phys_addr = (xmedia_void *)((xmedia_u8 *)x_read_ptr(dev, id, data_type) + g_offset[dev]);
data_info->data[0].y_phys_addr = (xmedia_void *)((xmedia_u8 *)y_read_ptr(dev, id, data_type) + g_offset[dev]);
data_info->data[0].z_phys_addr = (xmedia_void *)((xmedia_u8 *)z_read_ptr(dev, id, data_type) + g_offset[dev]);
data_info->data[0].temperature_phys_addr =
(xmedia_void *)((xmedia_u8 *)temp_read_ptr(dev, id, data_type) + g_offset[dev]);
data_info->data[0].pts_phys_addr =
(xmedia_void *)((xmedia_u8 *)pts_read_ptr(dev, id, data_type) + g_offset[dev]);
}
if (data_info->data[1].num > 0) {
data_info->data[1].x_phys_addr = (xmedia_void *)((xmedia_u8 *)x_start_addr(dev, data_type) + g_offset[dev]);
data_info->data[1].y_phys_addr = (xmedia_void *)((xmedia_u8 *)y_start_addr(dev, data_type) + g_offset[dev]);
data_info->data[1].z_phys_addr = (xmedia_void *)((xmedia_u8 *)z_start_addr(dev, data_type) + g_offset[dev]);
data_info->data[1].temperature_phys_addr =
(xmedia_void *)((xmedia_u8 *)temp_start_addr(dev, data_type) + g_offset[dev]);
data_info->data[1].pts_phys_addr = (xmedia_void *)((xmedia_u8 *)pts_start_addr(dev, data_type) + g_offset[dev]);
}
if ((data_info->data[0].num == 0) && (data_info->data[1].num == 0)) {
g_already_released[dev][id] = XMEDIA_TRUE;
proc_info->buf_data_unmatch[data_type]++;
proc_info->buf_data_unmatch_id[data_type] = id;
interval = (xmedia_u32)(xmedia_uintptr_t)((xmedia_u8 *)pts_read_ptr(dev, id, data_type) -
(xmedia_u8 *)pts_start_addr(dev, data_type)) >>
1;
x_read_ptr(dev, id, data_type) = (xmedia_u8 *)x_start_addr(dev, data_type) + interval;
y_read_ptr(dev, id, data_type) = (xmedia_u8 *)y_start_addr(dev, data_type) + interval;
z_read_ptr(dev, id, data_type) = (xmedia_u8 *)z_start_addr(dev, data_type) + interval;
temp_read_ptr(dev, id, data_type) = (xmedia_u8 *)temp_start_addr(dev, data_type) + interval;
pts_read_ptr(dev, id, data_type) = pts_read_ptr(dev, id, data_type);
} else {
g_already_released[dev][id] = XMEDIA_FALSE;
}
data_info->addr_offset = g_offset[dev];
return;
}
static xmedia_void msensor_buf_get_data_process(xmedia_s32 dev, xmedia_msensor_data_info *data_info)
{
xmedia_bool loop_flag = XMEDIA_FALSE;
xmedia_bool first_found = XMEDIA_FALSE;
xmedia_u32 interval;
xmedia_u64 *pts_read_ptr = XMEDIA_NULL;
xmedia_void *pts_start_ptr = XMEDIA_NULL;
xmedia_s32 id = data_info->id;
xmedia_msensor_data_type data_type = data_info->data_type;
pts_read_ptr = pts_read_ptr(dev, id, data_type);
pts_start_ptr = pts_start_addr(dev, data_type);
while (1) {
if (((pts_read_ptr == pts_write_ptr(dev, data_type)) && (g_forward[dev] == XMEDIA_TRUE)) ||
(*pts_read_ptr > data_info->end_pts)) {
break;
}
if ((*pts_read_ptr >= data_info->begin_pts) && (*pts_read_ptr <= data_info->end_pts)) {
if (loop_flag == XMEDIA_TRUE) {
data_info->data[1].num++;
} else if (first_found == XMEDIA_FALSE) {
data_info->data[0].num++;
interval = (xmedia_u32)(xmedia_uintptr_t)((xmedia_u8 *)pts_read_ptr - (xmedia_u8 *)pts_start_ptr) >> 1;
x_read_ptr(dev, id, data_type) = (xmedia_u8 *)x_start_addr(dev, data_type) + interval;
y_read_ptr(dev, id, data_type) = (xmedia_u8 *)y_start_addr(dev, data_type) + interval;
z_read_ptr(dev, id, data_type) = (xmedia_u8 *)z_start_addr(dev, data_type) + interval;
temp_read_ptr(dev, id, data_type) = (xmedia_u8 *)temp_start_addr(dev, data_type) + interval;
pts_read_ptr(dev, id, data_type) = pts_read_ptr;
first_found = XMEDIA_TRUE;
} else {
data_info->data[0].num++;
}
}
pts_read_ptr++;
g_forward[dev] = XMEDIA_TRUE;
if (pts_read_ptr >= ((xmedia_u64 *)pts_start_ptr +
((xmedia_u8 *)y_start_addr(dev, data_type) - (xmedia_u8 *)x_start_addr(dev, data_type)) /
sizeof(xmedia_s32))) {
pts_read_ptr = pts_start_ptr;
if (first_found == XMEDIA_TRUE) {
loop_flag = XMEDIA_TRUE;
}
}
}
return;
}
static xmedia_s32 msensor_buf_data_check(xmedia_s32 dev, const xmedia_msensor_data_info *msensor_data)
{
if (g_buf_init[dev] == XMEDIA_FALSE) {
MSENSOR_ERR_TRACE("dev %d get data, but msensor buffer hasn't been initialised.\n", dev);
return XMEDIA_FAILURE;
}
if (msensor_data == XMEDIA_NULL) {
MSENSOR_ERR_TRACE("dev %d msensor_data(%p) is null!!!\n", dev, msensor_data);
return XMEDIA_FAILURE;
}
if ((msensor_data->id < 0) || (msensor_data->id >= MAX_USER_NUM)) {
MSENSOR_ERR_TRACE("dev %d id(%d) is out of range[0, %d].\n", dev, msensor_data->id, MAX_USER_NUM);
return XMEDIA_FAILURE;
}
if (msensor_data->data_type >= XMEDIA_MSENSOR_DATA_TYPE_MAX) {
MSENSOR_ERR_TRACE("dev %d data_type:%d out of range.\n", dev, msensor_data->data_type);
return XMEDIA_FAILURE;
}
/* Check whether user is created. */
if (g_user_mng[dev].user_ctx[msensor_data->id] == XMEDIA_NULL) {
MSENSOR_ERR_TRACE("dev %d msensor_buf_read_data: id:%d is null.\n", dev, msensor_data->id);
return XMEDIA_FAILURE;
}
if (g_already_released[dev][msensor_data->id] == XMEDIA_FALSE) {
MSENSOR_ERR_TRACE("dev %d please release last read\n", dev);
return XMEDIA_FAILURE;
}
if ((msensor_data->end_pts - msensor_data->begin_pts) > 5000000) { /* 5000000us */
MSENSOR_ERR_TRACE("dev %d end pts[%llu] - begin pts[%llu] = %llu, more than 5000000\n", dev,
msensor_data->end_pts, msensor_data->begin_pts,
msensor_data->end_pts - msensor_data->begin_pts);
return XMEDIA_FAILURE;
}
if (msensor_data->end_pts <= msensor_data->begin_pts) {
MSENSOR_ERR_TRACE("dev %d end_pts[%llu] <= begin_pts[%llu]\n", dev, msensor_data->end_pts,
msensor_data->begin_pts);
return XMEDIA_FAILURE;
}
return XMEDIA_SUCCESS;
}
xmedia_s32 msensor_buf_get_data(xmedia_s32 dev, xmedia_msensor_data_info *msensor_data)
{
xmedia_s32 ret;
xmedia_ulong flags;
xmedia_ulong flags_read;
xmedia_msensor_data_info data_info = { 0 };
ret = msensor_buf_data_check(dev, msensor_data);
if (ret != XMEDIA_SUCCESS) {
return ret;
}
/* remain check user id to be done */
osal_memcpy(&data_info, msensor_data, sizeof(xmedia_msensor_data_info));
if (msensor_data->data_type == XMEDIA_MSENSOR_DATA_TYPE_GYRO) {
msensor_mng_write_data_2_buf(dev);
}
osal_spin_lock_irqsave(&g_user_mng[dev].mng_lock, &flags);
ret = msensor_buf_data_check(dev, msensor_data);
if (ret != XMEDIA_SUCCESS) {
osal_spin_unlock_irqrestore(&g_user_mng[dev].mng_lock, &flags);
return ret;
}
ret = msensor_buf_arrive_back_start_addr(dev, &data_info);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("dev %d data_type:%d has no data.\n", dev, msensor_data->data_type);
osal_spin_unlock_irqrestore(&g_user_mng[dev].mng_lock, &flags);
return XMEDIA_FAILURE;
}
data_info.data[0].num = 0;
data_info.data[1].num = 0;
osal_spin_lock_irqsave(&g_user_mng[dev].read_lock[msensor_data->id], &flags_read);
msensor_buf_get_data_process(dev, &data_info);
msensor_buf_get_data_assign(dev, &data_info);
osal_spin_unlock_irqrestore(&g_user_mng[dev].read_lock[msensor_data->id], &flags_read);
osal_memcpy(msensor_data, &data_info, sizeof(xmedia_msensor_data_info));
osal_spin_unlock_irqrestore(&g_user_mng[dev].mng_lock, &flags);
ret = msensor_buf_release_data(dev, &data_info);
return ret;
}
static xmedia_s32 msensor_buf_sync_init(xmedia_s32 dev)
{
xmedia_s32 ret;
xmedia_s32 i;
for (i = 0; i < MAX_USER_NUM; i++) {
ret = osal_spin_lock_init(&g_user_mng[dev].read_lock[i]);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("dev %d spin_lock_init failed!!!!\n", dev);
return XMEDIA_FAILURE;
}
}
return XMEDIA_SUCCESS;
}
static xmedia_void msensor_buf_sync_deinit(xmedia_s32 dev)
{
xmedia_s32 i;
for (i = 0; i < MAX_USER_NUM; i++) {
osal_spin_lock_destroy(&g_user_mng[dev].read_lock[i]);
}
return;
}
xmedia_s32 msensor_buf_lock_init(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 dev;
for (dev = 0; dev < XMEDIA_MSENSOR_MAX_DEV_NUM; dev++) {
(xmedia_void) osal_memset(&g_user_mng[dev], 0, sizeof(msensor_buf_user_mng));
ret = osal_spin_lock_init(&g_user_mng[dev].mng_lock);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("spin_lock_init failed!!!!\n");
return XMEDIA_FAILURE;
}
ret = msensor_buf_sync_init(dev);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("msensor buf sync init failed!!!!\n");
return XMEDIA_FAILURE;
}
osal_mutex_init(&g_user_mng[dev].mng_mutex);
}
return XMEDIA_SUCCESS;
}
xmedia_void msensor_buf_lock_exit(xmedia_void)
{
xmedia_s32 dev;
for (dev = 0; dev < XMEDIA_MSENSOR_MAX_DEV_NUM; dev++) {
osal_mutex_destroy(&g_user_mng[dev].mng_mutex);
msensor_buf_sync_deinit(dev);
osal_spin_lock_destroy(&g_user_mng[dev].mng_lock);
}
return;
}
@@ -0,0 +1,560 @@
/*
* Copyright (c); XMEDIA. All rights reserved.
*/
#include "msensor_exe.h"
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include "osal.h"
#include "mmz.h"
#include "common.h"
#include "msensor_ext.h"
#include "msensor_buf.h"
#ifdef CONFIG_PROC_SHOW_SUPPORT
#include "msensor_mng_proc.h"
#endif
#include "msensor_mng_ioctl.h"
#define UMAP_MSENSOR_MNG_MINOR_BASE 154
#define UMAP_DEVNANME_MSENSOR_MNG_BASE "msensor_mng"
static osal_dev_t *g_msensor_mng_dev = XMEDIA_NULL;
msensor_mng_proc_info g_mng_proc_info[XMEDIA_MSENSOR_MAX_DEV_NUM] = { 0 };
static msensor_mng_callback g_msensor_mng_callback[XMEDIA_MSENSOR_MAX_DEV_NUM] = { XMEDIA_NULL };
static osal_atomic_t g_msensor_mng_user_ref[XMEDIA_MSENSOR_MAX_DEV_NUM] = { 0 };
#define USER_SEND_DATA 1
#define GYRO_NAME "ICM42670"
msensor_mng_proc_info *msensor_mng_get_proc_info(xmedia_s32 dev)
{
return &g_mng_proc_info[dev];
}
xmedia_s32 msensor_mng_proc_info_init(xmedia_s32 dev)
{
msensor_mng_proc_info *proc_info = XMEDIA_NULL;
proc_info = msensor_mng_get_proc_info(dev);
osal_memcpy(proc_info->gyro_name, "ICM42670", sizeof("ICM42670"));
osal_memcpy(proc_info->accel_name, "ICM42670", sizeof("ICM42670"));
return XMEDIA_SUCCESS;
}
xmedia_s32 msensor_mng_write_data_to_buf(xmedia_s32 dev, xmedia_msensor_data *msensor_data)
{
xmedia_u32 i;
xmedia_s32 ret = XMEDIA_SUCCESS;
osal_spinlock_t *mng_lock = msensor_buf_get_lock(dev);
xmedia_ulong flags;
if (msensor_data == XMEDIA_NULL) {
MSENSOR_ERR_TRACE("dev %d msensor data is null\n", dev);
return XMEDIA_ERRCODE_NULL_PTR;
}
if ((msensor_data->gyro_buf.data_num > XMEDIA_MSENSOR_MAX_DATA_NUM) ||
(msensor_data->acc_buf.data_num > XMEDIA_MSENSOR_MAX_DATA_NUM)) {
return XMEDIA_FAILURE;
}
osal_spin_lock_irqsave(mng_lock, &flags);
if ((msensor_data->attr.device_mask & XMEDIA_MSENSOR_DEVICE_GYRO) == XMEDIA_MSENSOR_DEVICE_GYRO) {
for (i = 0; i < msensor_data->gyro_buf.data_num; i++) {
if ((msensor_data->attr.temperature_mask & XMEDIA_MSENSOR_TEMP_GYRO) != XMEDIA_MSENSOR_TEMP_GYRO) {
msensor_data->gyro_buf.gyro_data[i].temperature = 0xffffffff;
}
ret = msensor_buf_write_data(dev, XMEDIA_MSENSOR_DATA_TYPE_GYRO, &(msensor_data->gyro_buf.gyro_data[i]));
}
}
if ((msensor_data->attr.device_mask & XMEDIA_MSENSOR_DEVICE_ACC) == XMEDIA_MSENSOR_DEVICE_ACC) {
for (i = 0; i < msensor_data->acc_buf.data_num; i++) {
if ((msensor_data->attr.temperature_mask & XMEDIA_MSENSOR_TEMP_ACC) != XMEDIA_MSENSOR_TEMP_ACC) {
msensor_data->acc_buf.acc_data[i].temperature = 0xffffffff;
}
ret = msensor_buf_write_data(dev, XMEDIA_MSENSOR_DATA_TYPE_ACC, &(msensor_data->acc_buf.acc_data[i]));
}
}
osal_spin_unlock_irqrestore(mng_lock, &flags);
return ret;
}
static xmedia_s32 msensor_buf_check_phys_addr(xmedia_s32 dev, xmedia_msensor_data_info *data_info)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_unused(dev);
if (data_info->data[0].num > 0) {
ret |= mmz_check_phyaddr((xmedia_u64)(xmedia_uintptr_t)data_info->data[0].x_phys_addr,
sizeof(xmedia_s32) * data_info->data[0].num);
ret |= mmz_check_phyaddr((xmedia_u64)(xmedia_uintptr_t)data_info->data[0].y_phys_addr,
sizeof(xmedia_s32) * data_info->data[0].num);
ret |= mmz_check_phyaddr((xmedia_u64)(xmedia_uintptr_t)data_info->data[0].z_phys_addr,
sizeof(xmedia_s32) * data_info->data[0].num);
ret |= mmz_check_phyaddr((xmedia_u64)(xmedia_uintptr_t)data_info->data[0].temperature_phys_addr,
sizeof(xmedia_s32) * data_info->data[0].num);
ret |= mmz_check_phyaddr((xmedia_u64)(xmedia_uintptr_t)data_info->data[0].pts_phys_addr,
sizeof(xmedia_u64) * data_info->data[0].num);
}
if (data_info->data[1].num > 0) {
ret |= mmz_check_phyaddr((xmedia_u64)(xmedia_uintptr_t)data_info->data[1].x_phys_addr,
sizeof(xmedia_s32) * data_info->data[1].num);
ret |= mmz_check_phyaddr((xmedia_u64)(xmedia_uintptr_t)data_info->data[1].y_phys_addr,
sizeof(xmedia_s32) * data_info->data[1].num);
ret |= mmz_check_phyaddr((xmedia_u64)(xmedia_uintptr_t)data_info->data[1].z_phys_addr,
sizeof(xmedia_s32) * data_info->data[1].num);
ret |= mmz_check_phyaddr((xmedia_u64)(xmedia_uintptr_t)data_info->data[1].temperature_phys_addr,
sizeof(xmedia_s32) * data_info->data[1].num);
ret |= mmz_check_phyaddr((xmedia_u64)(xmedia_uintptr_t)data_info->data[1].pts_phys_addr,
sizeof(xmedia_u64) * data_info->data[1].num);
}
return ret;
}
/* msensor mng ioctl functions */
static xmedia_s32 msensor_mng_drv_user_get_data(xmedia_s32 dev, xmedia_ulong arg)
{
xmedia_s32 ret;
ret = msensor_buf_get_data(dev, (xmedia_msensor_data_info *)arg);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("dev %d get data failed! ret=%x\n", dev, ret);
return ret;
}
ret = msensor_buf_check_phys_addr(dev, (xmedia_msensor_data_info *)arg);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("dev %d check msensor data addr share failed\n", dev);
return ret;
}
return ret;
}
static xmedia_s32 msensor_mng_drv_user_release_buf(xmedia_s32 dev, xmedia_ulong arg)
{
xmedia_s32 ret;
ret = msensor_buf_check_phys_addr(dev, (xmedia_msensor_data_info *)arg);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("dev %d check msensor_data_addr share failed\n", dev);
return XMEDIA_FAILURE;
}
ret = msensor_buf_release_data(dev, (xmedia_msensor_data_info *)arg);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("dev %d buf release failed! ret=%x\n", dev, ret);
return XMEDIA_FAILURE;
}
return ret;
}
static xmedia_s32 msensor_mng_drv_user_add_user(xmedia_s32 dev, xmedia_ulong arg)
{
xmedia_s32 ret;
ret = msensor_buf_add_user(dev, (xmedia_s32 *)arg);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("dev %d msensor buf add_user failed! ret=%x\n", dev, ret);
return ret;
}
return ret;
}
static xmedia_s32 msensor_mng_drv_user_delete_user(xmedia_s32 dev, xmedia_ulong arg)
{
xmedia_s32 ret;
ret = msensor_buf_delete_user(dev, (xmedia_s32 *)arg);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("dev %d msensor buf delete user failed! ret=%x\n", dev, ret);
return ret;
}
return ret;
}
static xmedia_s32 msensor_mng_drv_user_send_data(xmedia_s32 dev, xmedia_ulong arg)
{
#ifdef USER_SEND_DATA
xmedia_s32 ret;
xmedia_msensor_data *msensor_data;
msensor_data = (xmedia_msensor_data *)arg;
ret = msensor_mng_write_data_to_buf(dev, msensor_data);
if (ret != XMEDIA_SUCCESS) {
MSENSOR_ERR_TRACE("dev %d write data to buf failed! ret=%x\n", dev, ret);
return ret;
}
return ret;
#else
MSENSOR_ERR_TRACE("dev %d msensor send data not support\n", dev);
return XMEDIA_FAILURE;
#endif
}
xmedia_s32 msensor_mng_drv_get_data(xmedia_s32 dev, xmedia_ulong arg)
{
return msensor_mng_drv_user_get_data(dev, arg);
}
xmedia_s32 msensor_mng_drv_release_buf(xmedia_s32 dev, xmedia_ulong arg)
{
return msensor_mng_drv_user_release_buf(dev, arg);
}
xmedia_s32 msensor_mng_drv_add_user(xmedia_s32 dev, xmedia_ulong arg)
{
return msensor_mng_drv_user_add_user(dev, arg);
}
xmedia_s32 msensor_mng_drv_delete_user(xmedia_s32 dev, xmedia_ulong arg)
{
return msensor_mng_drv_user_delete_user(dev, arg);
}
xmedia_s32 msensor_mng_drv_send_data(xmedia_s32 dev, xmedia_ulong arg)
{
return msensor_mng_drv_user_send_data(dev, arg);
}
typedef xmedia_s32 (*msensor_ctl_ptr_func)(xmedia_s32 dev_id, xmedia_ulong arg);
typedef struct {
xmedia_u32 cmd;
msensor_ctl_ptr_func ptr_func;
} msensor_ioctl_func_item;
static msensor_ioctl_func_item g_msensor_mng_cmd_list[] = {
{ MSENSOR_CMD_GET_DATA, msensor_mng_drv_get_data }, { MSENSOR_CMD_RELEASE_BUF, msensor_mng_drv_release_buf },
{ MSENSOR_CMD_ADD_USER, msensor_mng_drv_add_user }, { MSENSOR_CMD_DELETE_USER, msensor_mng_drv_delete_user },
{ MSENSOR_CMD_SEND_DATA, msensor_mng_drv_send_data },
};
static xmedia_s32 msensor_mng_do_ioctl(xmedia_s32 dev, xmedia_u32 cmd, xmedia_ulong arg)
{
xmedia_s32 i;
for (i = 0; i < sizeof(g_msensor_mng_cmd_list) / sizeof(g_msensor_mng_cmd_list[0]); i++) {
if (cmd == g_msensor_mng_cmd_list[i].cmd) {
return g_msensor_mng_cmd_list[i].ptr_func(dev, arg);
}
}
MSENSOR_ERR_TRACE("dev %d msensor chip ioctl cmd 0x%x not supported!\n", dev, cmd);
return XMEDIA_ERRCODE_NOT_SUPPORT;
}
xmedia_slong msensor_mng_ioctl(xmedia_u32 cmd, xmedia_ulong arg, xmedia_void *private_data)
{
xmedia_s32 ret;
xmedia_s32 dev;
if (cmd == MSENSOR_CMD_MNG_BIND_FLAG2FD) {
*(xmedia_u32 *)private_data = *(xmedia_u32 *)arg;
return XMEDIA_SUCCESS;
}
dev = *(xmedia_u32 *)private_data;
osal_atomic_inc_return(&g_msensor_mng_user_ref[dev]);
ret = msensor_mng_do_ioctl(dev, cmd, arg);
osal_atomic_dec_return(&g_msensor_mng_user_ref[dev]);
return ret;
}
static xmedia_s32 msensor_mng_open(xmedia_void *private_data)
{
xmedia_unused(private_data);
return XMEDIA_SUCCESS;
}
static xmedia_s32 msensor_mng_release(xmedia_void *private_data)
{
xmedia_unused(private_data);
return XMEDIA_SUCCESS;
}
static xmedia_s32 msensor_mng_freeze(osal_dev_t *dev)
{
return XMEDIA_SUCCESS;
}
static xmedia_s32 msensor_mng_restore(osal_dev_t *dev)
{
return XMEDIA_SUCCESS;
}
// todo,待实现 init 函数
// static xmedia_s32 msensor_mng_fn_init(xmedia_void *args)
// {
// xmedia_unused(args);
// return XMEDIA_SUCCESS;
// }
xmedia_s32 msensor_mng_buf_init(xmedia_s32 dev, const xmedia_msensor_attr *motion_attr,
const xmedia_msensor_buf_attr *msensor_buf_attr,
const xmedia_msensor_config *msensor_config)
{
xmedia_u32 gyro_odr;
xmedia_u32 acc_odr;
xmedia_u32 magn_odr;
xmedia_s32 ret;
if (motion_attr == XMEDIA_NULL || msensor_buf_attr == XMEDIA_NULL || msensor_config == XMEDIA_NULL) {
MSENSOR_ERR_TRACE("input NULL\n");
return XMEDIA_FAILURE;
}
switch (motion_attr->device_mask) {
case XMEDIA_MSENSOR_DEVICE_GYRO | XMEDIA_MSENSOR_DEVICE_ACC: {
/* only for american present */
gyro_odr = msensor_config->gyro_config.odr;
acc_odr = msensor_config->acc_config.odr;
magn_odr = 0;
msensor_debug_trace("dev %d odr:gyro_odr:%d acc_odr:%d magn_odr:%d\n", dev, gyro_odr, acc_odr, magn_odr);
ret = msensor_buf_init(dev, msensor_buf_attr, gyro_odr, acc_odr, magn_odr);
break;
}
case XMEDIA_MSENSOR_DEVICE_GYRO: {
/* only for american present */
gyro_odr = msensor_config->gyro_config.odr;
acc_odr = 0;
magn_odr = 0;
msensor_debug_trace("dev %d gyro_odr:%d acc_odr:%d magn_odr:%d\n", dev, gyro_odr, acc_odr, magn_odr);
ret = msensor_buf_init(dev, msensor_buf_attr, gyro_odr, acc_odr, magn_odr);
break;
}
#if 0
case XMEDIA_MSENSOR_DEVICE_ALL: {
/* only for american present */
gyro_odr = msensor_config->gyro_config.odr;
acc_odr = msensor_config->acc_config.odr;
magn_odr = msensor_config->acc_config.odr;
msensor_debug_trace("dev %d gyro_odr:%d acc_odr:%d magn_odr:%d\n", dev, gyro_odr, acc_odr, magn_odr);
ret = msensor_buf_init(dev, msensor_buf_attr, gyro_odr, acc_odr, magn_odr);
break;
}
#endif
default: {
gyro_odr = 0;
acc_odr = 0;
magn_odr = 0;
MSENSOR_ERR_TRACE("dev %d msensor mng init buf(gyro_odr:%d acc_odr:%d magn_odr:%d) err!\n", dev, gyro_odr,
acc_odr, magn_odr);
ret = XMEDIA_FAILURE;
break;
}
}
return ret;
}
xmedia_s32 msensor_mng_buf_exit(xmedia_s32 dev)
{
return msensor_buf_exit(dev);
}
xmedia_s32 msensor_mng_get_chip_cfg(xmedia_s32 dev, xmedia_msensor_param *msensor_param)
{
if (g_msensor_mng_callback[dev].pfn_get_config_from_chip == XMEDIA_NULL) {
MSENSOR_ERR_TRACE("dev %d null point!\n", dev);
return XMEDIA_ERRCODE_NULL_PTR;
}
return g_msensor_mng_callback[dev].pfn_get_config_from_chip(dev, msensor_param);
}
xmedia_s32 msensor_mng_write_data_2_buf(xmedia_s32 dev)
{
if (g_msensor_mng_callback[dev].pfn_write_data_to_buf == XMEDIA_NULL) {
MSENSOR_ERR_TRACE("dev %d nul point!\n", dev);
return XMEDIA_ERRCODE_NULL_PTR;
}
return g_msensor_mng_callback[dev].pfn_write_data_to_buf(dev);
}
xmedia_s32 msensor_mng_register_call_back(xmedia_s32 dev, const msensor_mng_callback *callback)
{
msensor_return_if_null_ptr(callback);
g_msensor_mng_callback[dev].pfn_get_config_from_chip = callback->pfn_get_config_from_chip;
g_msensor_mng_callback[dev].pfn_write_data_to_buf = callback->pfn_write_data_to_buf;
return XMEDIA_SUCCESS;
}
xmedia_void msensor_mng_unregister_call_back(xmedia_s32 dev)
{
g_msensor_mng_callback[dev].pfn_get_config_from_chip = XMEDIA_NULL;
g_msensor_mng_callback[dev].pfn_write_data_to_buf = XMEDIA_NULL;
return;
}
static struct osal_fileops g_msensor_mng_fops = {
.open = msensor_mng_open,
.unlocked_ioctl = msensor_mng_ioctl,
.release = msensor_mng_release,
};
struct osal_pmops g_msensor_mng_drv_ops = {
.pm_freeze = msensor_mng_freeze,
.pm_restore = msensor_mng_restore,
};
static xmedia_s32 msensor_mng_atomic_init(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 i, j;
for (i = 0; i < XMEDIA_MSENSOR_MAX_DEV_NUM; i++) {
ret = osal_atomic_init(&g_msensor_mng_user_ref[i]);
if (ret != XMEDIA_SUCCESS) {
osal_printk("atomic init failed. \n");
goto failed;
}
osal_atomic_set(&g_msensor_mng_user_ref[i], 0);
}
return XMEDIA_SUCCESS;
failed:
for (j = i - 1; j >= 0; j--) {
osal_atomic_destory(&g_msensor_mng_user_ref[j]);
}
return ret;
}
static xmedia_void msensor_mng_atomic_exit(xmedia_void)
{
xmedia_s32 i;
for (i = 0; i < XMEDIA_MSENSOR_MAX_DEV_NUM; i++) {
osal_atomic_destroy(&g_msensor_mng_user_ref[i]);
}
return;
}
xmedia_s32 msensor_mng_module_init(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 i;
#ifdef CONFIG_PROC_SHOW_SUPPORT
ret = msensor_proc_init();
if (ret != XMEDIA_SUCCESS) {
osal_printk("msensor proc init failed\n");
goto FAIL0;
}
#endif
g_msensor_mng_dev = osal_createdev(UMAP_DEVNANME_MSENSOR_MNG_BASE);
if (g_msensor_mng_dev == XMEDIA_NULL) {
osal_printk("msensor: create device failed\n");
goto FAIL1;
}
g_msensor_mng_dev->fops = &g_msensor_mng_fops;
g_msensor_mng_dev->minor = UMAP_MSENSOR_MNG_MINOR_BASE;
g_msensor_mng_dev->osal_pmops = &g_msensor_mng_drv_ops;
ret = osal_registerdevice(g_msensor_mng_dev);
if (ret != XMEDIA_SUCCESS) {
osal_printk("register msensor device failed!\n");
goto FAIL2;
}
for (i = 0; i < XMEDIA_MSENSOR_MAX_DEV_NUM; i++) {
(xmedia_void) osal_memset(&g_mng_proc_info[i], 0, sizeof(g_mng_proc_info[i]));
}
ret = msensor_buf_lock_init();
if (ret != XMEDIA_SUCCESS) {
osal_printk("register msensor buf lock init failed!\n");
goto FAIL3;
}
ret = msensor_mng_atomic_init();
if (ret != XMEDIA_SUCCESS) {
osal_printk("register msensor device failed!\n");
goto FAIL4;
}
osal_printk("load xm_msensor_mng.ko OK!\n");
return XMEDIA_SUCCESS;
FAIL4:
msensor_buf_lock_exit();
FAIL3:
osal_deregisterdevice(g_msensor_mng_dev);
FAIL2:
osal_destroydev(g_msensor_mng_dev);
FAIL1:
#ifdef CONFIG_PROC_SHOW_SUPPORT
msensor_proc_exit();
FAIL0:
#endif
return XMEDIA_FAILURE;
}
/* if static, liteos warning */
xmedia_void msensor_mng_module_exit(xmedia_void)
{
xmedia_s32 i;
msensor_mng_atomic_exit();
msensor_buf_lock_exit();
for (i = 0; i < XMEDIA_MSENSOR_MAX_DEV_NUM; i++) {
(xmedia_void) osal_memset(&g_mng_proc_info[i], 0, sizeof(g_mng_proc_info[i]));
}
osal_deregisterdevice(g_msensor_mng_dev);
osal_destroydev(g_msensor_mng_dev);
#ifdef CONFIG_PROC_SHOW_SUPPORT
msensor_proc_exit();
#endif
osal_printk("unload msensor_mng.ko OK!\n");
}
#ifdef MODULE
EXPORT_SYMBOL(msensor_mng_buf_init);
EXPORT_SYMBOL(msensor_mng_buf_exit);
EXPORT_SYMBOL(msensor_mng_write_data_to_buf);
EXPORT_SYMBOL(msensor_mng_register_call_back);
EXPORT_SYMBOL(msensor_mng_unregister_call_back);
module_init(msensor_mng_module_init);
module_exit(msensor_mng_module_exit);
MODULE_DESCRIPTION("msensor driver");
MODULE_LICENSE("GPL");
#else
int __init msensor_mng_driver_init(void)
{
return msensor_mng_module_init();
}
#endif
@@ -0,0 +1,158 @@
/*
* Copyright (c); XMEDIA. All rights reserved.
*/
#include "msensor_mng_proc.h"
#include <linux/kernel.h>
#include "osal.h"
#include "msensor_buf.h"
#include "msensor_exe.h"
#define MSENSOR_MNG_INFO "msensor_mng"
#define MSENSOR_MNG_VERSION_INFO "msensor_mng debug V0.0.0.1"
static xmedia_void msensor_print_proc_title(osal_proc_entry_t *s, xmedia_char *title)
{
xmedia_s32 i;
for (i = 0; i < 50; i++) {
osal_seq_printf(s, "-");
}
osal_seq_printf(s, title);
for (i = 0; i < 50; i++) {
osal_seq_printf(s, "-");
}
osal_seq_printf(s, "\n");
}
static xmedia_void msensor_proc_show_gyro(xmedia_s32 dev, osal_proc_entry_t *s, msensor_buf_info (*buf_info)[DATA_BUTT])
{
msensor_mng_proc_info *proc_info = msensor_mng_get_proc_info(dev);
if (proc_info->gyro_name[0] == 0) {
return;
}
msensor_print_proc_title(s, "gyro sensor name");
osal_seq_printf(s, "%20s\n", proc_info->gyro_name);
msensor_print_proc_title(s, "gyro sensor param");
osal_seq_printf(s, "%16s%20s%16s%16s%16s%16s%16s\n", "dev_no", "buf_addr", "buf_size",
"overflow", "data_unmatch", "overflow_id", "data_unmatch_id");
osal_seq_printf(s, "%16d", dev);
osal_seq_printf(s, "%20llx", proc_info->buf_addr[XMEDIA_MSENSOR_DATA_TYPE_GYRO]);
osal_seq_printf(s, "%16u", proc_info->buf_size[XMEDIA_MSENSOR_DATA_TYPE_GYRO]);
osal_seq_printf(s, "%16u", proc_info->buf_overflow[XMEDIA_MSENSOR_DATA_TYPE_GYRO]);
osal_seq_printf(s, "%16u", proc_info->buf_data_unmatch[XMEDIA_MSENSOR_DATA_TYPE_GYRO]);
osal_seq_printf(s, "%16d", proc_info->buf_overflow_id[XMEDIA_MSENSOR_DATA_TYPE_GYRO]);
osal_seq_printf(s, "%16d\n", proc_info->buf_data_unmatch_id[XMEDIA_MSENSOR_DATA_TYPE_GYRO]);
msensor_print_proc_title(s, "gyro sensor addr");
osal_seq_printf(s, "%10s%20s%20s", "", "start_addr", "write_addr");
osal_seq_printf(s, "\n%10s%20px%20px", "x", buf_info[XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_X].start_addr,
buf_info[XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_X].write_ptr);
osal_seq_printf(s, "\n%10s%20px%20px", "y", buf_info[XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_Y].start_addr,
buf_info[XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_Y].write_ptr);
osal_seq_printf(s, "\n%10s%20px%20px", "z", buf_info[XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_Z].start_addr,
buf_info[XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_Z].write_ptr);
osal_seq_printf(s, "\n%10s%20px%20px", "temp", buf_info[XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_TEMP].start_addr,
buf_info[XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_TEMP].write_ptr);
osal_seq_printf(s, "\n%10s%20px%20px\n", "pts", buf_info[XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_PTS].start_addr,
buf_info[XMEDIA_MSENSOR_DATA_TYPE_GYRO][DATA_PTS].write_ptr);
return;
}
static xmedia_void msensor_proc_show_acc(xmedia_s32 dev, osal_proc_entry_t *s, msensor_buf_info (*buf_info)[DATA_BUTT])
{
msensor_mng_proc_info *proc_info = msensor_mng_get_proc_info(dev);
if (proc_info->accel_name[0] == 0) {
return;
}
msensor_print_proc_title(s, "acc sensor name");
osal_seq_printf(s, "%21s\n", proc_info->accel_name);
msensor_print_proc_title(s, "acc sensor param");
osal_seq_printf(s, "%16s%20s%16s%16s%16s%16s%16s\n", "dev_no", "buf_addr", "buf_size",
"overflow", "data_unmatch", "overflow_id", "data_unmatch_id");
osal_seq_printf(s, "%16d", dev);
osal_seq_printf(s, "%20llx", proc_info->buf_addr[XMEDIA_MSENSOR_DATA_TYPE_ACC]);
osal_seq_printf(s, "%16u", proc_info->buf_size[XMEDIA_MSENSOR_DATA_TYPE_ACC]);
osal_seq_printf(s, "%16u", proc_info->buf_overflow[XMEDIA_MSENSOR_DATA_TYPE_ACC]);
osal_seq_printf(s, "%16u", proc_info->buf_data_unmatch[XMEDIA_MSENSOR_DATA_TYPE_ACC]);
osal_seq_printf(s, "%16d", proc_info->buf_overflow_id[XMEDIA_MSENSOR_DATA_TYPE_ACC]);
osal_seq_printf(s, "%16d\n", proc_info->buf_data_unmatch_id[XMEDIA_MSENSOR_DATA_TYPE_ACC]);
msensor_print_proc_title(s, "acc sensor addr");
osal_seq_printf(s, "%10s%20s%20s\n", "", "start_addr", "write_addr");
osal_seq_printf(s, "%10s%20px%20px", "x", buf_info[XMEDIA_MSENSOR_DATA_TYPE_ACC][DATA_X].start_addr,
buf_info[XMEDIA_MSENSOR_DATA_TYPE_ACC][DATA_X].write_ptr);
osal_seq_printf(s, "\n%10s%20px%20px", "y", buf_info[XMEDIA_MSENSOR_DATA_TYPE_ACC][DATA_Y].start_addr,
buf_info[XMEDIA_MSENSOR_DATA_TYPE_ACC][DATA_Y].write_ptr);
osal_seq_printf(s, "\n%10s%20px%20px", "z", buf_info[XMEDIA_MSENSOR_DATA_TYPE_ACC][DATA_Z].start_addr,
buf_info[XMEDIA_MSENSOR_DATA_TYPE_ACC][DATA_Z].write_ptr);
osal_seq_printf(s, "\n%10s%20px%20px", "temp", buf_info[XMEDIA_MSENSOR_DATA_TYPE_ACC][DATA_TEMP].start_addr,
buf_info[XMEDIA_MSENSOR_DATA_TYPE_ACC][DATA_TEMP].write_ptr);
osal_seq_printf(s, "\n%10s%20px%20px\n", "pts", buf_info[XMEDIA_MSENSOR_DATA_TYPE_ACC][DATA_PTS].start_addr,
buf_info[XMEDIA_MSENSOR_DATA_TYPE_ACC][DATA_PTS].write_ptr);
return;
}
static xmedia_s32 msensor_proc_show(osal_proc_entry_t *s)
{
xmedia_s32 ret;
msensor_buf_info(*buf_info)[DATA_BUTT] = XMEDIA_NULL;
xmedia_s32 i;
osal_seq_printf(s,
"[msensor] version:[" MSENSOR_MNG_VERSION_INFO "], build time["__DATE__
", "__TIME__
"]\n");
for (i = 0 ; i < XMEDIA_MSENSOR_MAX_DEV_NUM; i++) {
if (msensor_buf_get_status(i) == XMEDIA_FALSE) {
continue;
}
ret = msensor_mng_proc_info_init(i);
if (ret != XMEDIA_SUCCESS) {
continue;
}
buf_info = (msensor_buf_info(*)[DATA_BUTT])msensor_buf_get_info(i);
msensor_proc_show_gyro(i, s, buf_info);
msensor_proc_show_acc(i, s, buf_info);
}
return 0;
}
xmedia_s32 msensor_proc_init(xmedia_void)
{
osal_proc_entry_t *msensor_entry = XMEDIA_NULL;
msensor_entry = osal_create_proc_entry(MSENSOR_MNG_INFO, XMEDIA_NULL);
if (msensor_entry == XMEDIA_NULL) {
printk("osal_create_proc_entry failed!\n");
return -1;
}
msensor_entry->read = msensor_proc_show;
msensor_entry->write = XMEDIA_NULL;
return 0;
}
void msensor_proc_exit(xmedia_void)
{
osal_remove_proc_entry(MSENSOR_MNG_INFO, XMEDIA_NULL);
return;
}