driver/sensor: support access remote sensor by rpmsg
Signed-off-by: Jiuzhu Dong <dongjiuzhu1@xiaomi.com>
This commit is contained in:
parent
1cc7f6e63a
commit
c5f87bb5c6
@ -18,6 +18,13 @@ config USENSOR
|
|||||||
---help---
|
---help---
|
||||||
Allow application to register user sensor by /dev/usensor.
|
Allow application to register user sensor by /dev/usensor.
|
||||||
|
|
||||||
|
config SENSORS_RPMSG
|
||||||
|
bool "Sensor rpmsg Support"
|
||||||
|
default n
|
||||||
|
depends on RPTUN
|
||||||
|
---help---
|
||||||
|
Allow application to read or control remote sensor device by rpmsg.
|
||||||
|
|
||||||
config SENSORS_WTGAHRS2
|
config SENSORS_WTGAHRS2
|
||||||
bool "Wtgahrs2 Sensor Support"
|
bool "Wtgahrs2 Sensor Support"
|
||||||
default n
|
default n
|
||||||
|
@ -28,6 +28,10 @@ ifeq ($(CONFIG_USENSOR),y)
|
|||||||
CSRCS += usensor.c
|
CSRCS += usensor.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_SENSORS_RPMSG),y)
|
||||||
|
CSRCS += sensor_rpmsg.c
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_SENSORS_WTGAHRS2),y)
|
ifeq ($(CONFIG_SENSORS_WTGAHRS2),y)
|
||||||
CSRCS += wtgahrs2.c
|
CSRCS += wtgahrs2.c
|
||||||
endif
|
endif
|
||||||
|
@ -599,8 +599,9 @@ static ssize_t sensor_write(FAR struct file *filep, FAR const char *buffer,
|
|||||||
{
|
{
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct sensor_upperhalf_s *upper = inode->i_private;
|
FAR struct sensor_upperhalf_s *upper = inode->i_private;
|
||||||
|
FAR struct sensor_lowerhalf_s *lower = upper->lower;
|
||||||
|
|
||||||
return sensor_push_event(upper, buffer, buflen);
|
return lower->push_event(lower->priv, buffer, buflen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
||||||
@ -967,8 +968,6 @@ int sensor_custom_register(FAR struct sensor_lowerhalf_s *lower,
|
|||||||
|
|
||||||
/* Initialize the upper-half data structure */
|
/* Initialize the upper-half data structure */
|
||||||
|
|
||||||
upper->lower = lower;
|
|
||||||
|
|
||||||
list_initialize(&upper->userlist);
|
list_initialize(&upper->userlist);
|
||||||
upper->state.esize = esize;
|
upper->state.esize = esize;
|
||||||
upper->state.min_interval = ULONG_MAX;
|
upper->state.min_interval = ULONG_MAX;
|
||||||
@ -1007,6 +1006,16 @@ int sensor_custom_register(FAR struct sensor_lowerhalf_s *lower,
|
|||||||
goto drv_err;
|
goto drv_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_SENSORS_RPMSG
|
||||||
|
lower = sensor_rpmsg_register(lower, path);
|
||||||
|
if (lower == NULL)
|
||||||
|
{
|
||||||
|
ret = -EIO;
|
||||||
|
goto drv_err;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
upper->lower = lower;
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
drv_err:
|
drv_err:
|
||||||
@ -1069,6 +1078,10 @@ void sensor_custom_unregister(FAR struct sensor_lowerhalf_s *lower,
|
|||||||
sninfo("UnRegistering %s\n", path);
|
sninfo("UnRegistering %s\n", path);
|
||||||
unregister_driver(path);
|
unregister_driver(path);
|
||||||
|
|
||||||
|
#ifdef CONFIG_SENSORS_RPMSG
|
||||||
|
sensor_rpmsg_unregister(lower);
|
||||||
|
#endif
|
||||||
|
|
||||||
nxsem_destroy(&upper->exclsem);
|
nxsem_destroy(&upper->exclsem);
|
||||||
if (circbuf_is_init(&upper->buffer))
|
if (circbuf_is_init(&upper->buffer))
|
||||||
{
|
{
|
||||||
|
1303
drivers/sensors/sensor_rpmsg.c
Normal file
1303
drivers/sensors/sensor_rpmsg.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -857,6 +857,11 @@ struct sensor_ops_s
|
|||||||
* Sensor driver.
|
* Sensor driver.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
typedef CODE ssize_t (*sensor_push_event_t)(FAR void *priv,
|
||||||
|
FAR const void *data,
|
||||||
|
size_t bytes);
|
||||||
|
typedef CODE void (*sensor_notify_event_t)(FAR void *priv);
|
||||||
|
|
||||||
struct sensor_lowerhalf_s
|
struct sensor_lowerhalf_s
|
||||||
{
|
{
|
||||||
/* The type of sensor device */
|
/* The type of sensor device */
|
||||||
@ -908,8 +913,7 @@ struct sensor_lowerhalf_s
|
|||||||
* A negated errno value is returned on any failure.
|
* A negated errno value is returned on any failure.
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
CODE ssize_t (*push_event)(FAR void *priv, FAR const void *data,
|
sensor_push_event_t push_event;
|
||||||
size_t bytes);
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Name: notify_event
|
* Name: notify_event
|
||||||
@ -925,7 +929,7 @@ struct sensor_lowerhalf_s
|
|||||||
* priv - Upper half driver handle
|
* priv - Upper half driver handle
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
CODE void (*notify_event)(FAR void *priv);
|
sensor_notify_event_t notify_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The private opaque pointer to be passed to upper-layer during callback */
|
/* The private opaque pointer to be passed to upper-layer during callback */
|
||||||
@ -1084,6 +1088,58 @@ void sensor_custom_unregister(FAR struct sensor_lowerhalf_s *dev,
|
|||||||
int usensor_initialize(void);
|
int usensor_initialize(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: sensor_rpmsg_register
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This function registers rpmsg takeover for the real lower half, and
|
||||||
|
* initialize rpmsg resource.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - The instance of lower half sensor driver.
|
||||||
|
* path - The path of character node, ex: /dev/sensor/xxx.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* The takeover rpmsg lowerhalf returned on success, NULL on failure.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_SENSORS_RPMSG
|
||||||
|
FAR struct sensor_lowerhalf_s *sensor_rpmsg_register(
|
||||||
|
FAR struct sensor_lowerhalf_s *lower,
|
||||||
|
FAR const char *path);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: sensor_rpmsg_unregister
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This function unregisters rpmsg takeover for the real lower half, and
|
||||||
|
* release rpmsg resource. This API corresponds to the
|
||||||
|
* sensor_rpmsg_register.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* lower - The instance of lower half sensor driver.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_SENSORS_RPMSG
|
||||||
|
void sensor_rpmsg_unregister(FAR struct sensor_lowerhalf_s *lower);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: sensor_rpmsg_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* This function initializes the context of sensor rpmsg, registers
|
||||||
|
* rpmsg callback and prepares enviroment to intercat with remote sensor.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* OK on success; A negated errno value is returned on any failure.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_SENSORS_RPMSG
|
||||||
|
int sensor_rpmsg_initialize(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef EXTERN
|
#undef EXTERN
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user