diff --git a/drivers/ioexpander/ioe_dummy.c b/drivers/ioexpander/ioe_dummy.c index 2836610e7e..7ee408950b 100644 --- a/drivers/ioexpander/ioe_dummy.c +++ b/drivers/ioexpander/ioe_dummy.c @@ -124,11 +124,13 @@ static int ioe_dummy_multireadpin(FAR struct ioexpander_dev_s *dev, FAR uint8_t *pins, FAR bool *values, int count); #endif +#ifdef CONFIG_IOEXPANDER_INT_ENABLE static FAR void *ioe_dummy_attach(FAR struct ioexpander_dev_s *dev, ioe_pinset_t pinset, ioe_callback_t callback, FAR void *arg); static int ioe_dummy_detach(FAR struct ioexpander_dev_s *dev, FAR void *handle); +#endif static ioe_pinset_t ioe_dummy_int_update(FAR struct ioe_dummy_dev_s *priv); static void ioe_dummy_interrupt_work(void *arg); @@ -152,14 +154,16 @@ static const struct ioexpander_ops_s g_ioe_dummy_ops = ioe_dummy_option, ioe_dummy_writepin, ioe_dummy_readpin, - ioe_dummy_readpin, + ioe_dummy_readpin #ifdef CONFIG_IOEXPANDER_MULTIPIN - ioe_dummy_multiwritepin, - ioe_dummy_multireadpin, - ioe_dummy_multireadpin, + , ioe_dummy_multiwritepin + , ioe_dummy_multireadpin + , ioe_dummy_multireadpin +#endif +#ifdef CONFIG_IOEXPANDER_INT_ENABLE + , ioe_dummy_attach + , ioe_dummy_detach #endif - ioe_dummy_attach, - ioe_dummy_detach }; /**************************************************************************** @@ -545,6 +549,7 @@ static int ioe_dummy_multireadpin(FAR struct ioexpander_dev_s *dev, * ****************************************************************************/ +#ifdef CONFIG_IOEXPANDER_INT_ENABLE static FAR void *ioe_dummy_attach(FAR struct ioexpander_dev_s *dev, ioe_pinset_t pinset, ioe_callback_t callback, FAR void *arg) @@ -576,6 +581,7 @@ static FAR void *ioe_dummy_attach(FAR struct ioexpander_dev_s *dev, return handle; } +#endif /**************************************************************************** * Name: ioe_dummy_detach @@ -592,6 +598,7 @@ static FAR void *ioe_dummy_attach(FAR struct ioexpander_dev_s *dev, * ****************************************************************************/ +#ifdef CONFIG_IOEXPANDER_INT_ENABLE static int ioe_dummy_detach(FAR struct ioexpander_dev_s *dev, FAR void *handle) { @@ -611,6 +618,7 @@ static int ioe_dummy_detach(FAR struct ioexpander_dev_s *dev, cb->cbarg = NULL; return OK; } +#endif /**************************************************************************** * Name: ioe_dummy_int_update diff --git a/drivers/ioexpander/ioe_rpmsg.c b/drivers/ioexpander/ioe_rpmsg.c index ff19657794..0f536ff9d9 100755 --- a/drivers/ioexpander/ioe_rpmsg.c +++ b/drivers/ioexpander/ioe_rpmsg.c @@ -212,10 +212,15 @@ static const struct ioexpander_ops_s g_ioe_rpmsg_ops = ioe_rpmsg_option, ioe_rpmsg_writepin, ioe_rpmsg_readpin, - ioe_rpmsg_readpin, + ioe_rpmsg_readpin +#ifdef CONFIG_IOEXPANDER_MULTIPIN + , NULL + , NULL + , NULL +#endif #ifdef CONFIG_IOEXPANDER_INT_ENABLE - ioe_rpmsg_attach, - ioe_rpmsg_detach, + , ioe_rpmsg_attach + , ioe_rpmsg_detach #endif }; @@ -288,31 +293,27 @@ static int ioe_rpmsg_sendrecv(FAR struct rpmsg_endpoint *ept, static int ioe_rpmsg_direction(FAR struct ioexpander_dev_s *dev, uint8_t pin, int dir) { - FAR struct ioe_rpmsg_client_s *priv = - (struct ioe_rpmsg_client_s *)dev; + FAR struct ioe_rpmsg_client_s *priv = (struct ioe_rpmsg_client_s *)dev; struct ioe_rpmsg_direction_s msg; msg.pin = pin; msg.val = dir; return ioe_rpmsg_sendrecv(&priv->ept, IOE_RPMSG_DIRECTION, - (struct ioe_rpmsg_header_s *)&msg, - sizeof(msg)); + (struct ioe_rpmsg_header_s *)&msg, sizeof(msg)); } static int ioe_rpmsg_readpin(FAR struct ioexpander_dev_s *dev, uint8_t pin, FAR bool *value) { - FAR struct ioe_rpmsg_client_s *priv = - (struct ioe_rpmsg_client_s *)dev; + FAR struct ioe_rpmsg_client_s *priv = (struct ioe_rpmsg_client_s *)dev; struct ioe_rpmsg_readpin_s msg; int ret; msg.pin = pin; ret = ioe_rpmsg_sendrecv(&priv->ept, IOE_RPMSG_READPIN, - (struct ioe_rpmsg_header_s *)&msg, - sizeof(msg)); + (struct ioe_rpmsg_header_s *)&msg, sizeof(msg)); if (ret >= 0) { *value = ret; @@ -324,23 +325,20 @@ static int ioe_rpmsg_readpin(FAR struct ioexpander_dev_s *dev, uint8_t pin, static int ioe_rpmsg_writepin(FAR struct ioexpander_dev_s *dev, uint8_t pin, bool value) { - FAR struct ioe_rpmsg_client_s *priv = - (struct ioe_rpmsg_client_s *)dev; + FAR struct ioe_rpmsg_client_s *priv = (struct ioe_rpmsg_client_s *)dev; struct ioe_rpmsg_writepin_s msg; msg.pin = pin; msg.val = value; return ioe_rpmsg_sendrecv(&priv->ept, IOE_RPMSG_WRITEPIN, - (struct ioe_rpmsg_header_s *)&msg, - sizeof(msg)); + (struct ioe_rpmsg_header_s *)&msg, sizeof(msg)); } static int ioe_rpmsg_option(FAR struct ioexpander_dev_s *dev, uint8_t pin, int opt, void *regval) { - FAR struct ioe_rpmsg_client_s *priv = - (struct ioe_rpmsg_client_s *)dev; + FAR struct ioe_rpmsg_client_s *priv = (struct ioe_rpmsg_client_s *)dev; struct ioe_rpmsg_option_s msg; msg.pin = pin; @@ -348,8 +346,7 @@ static int ioe_rpmsg_option(FAR struct ioexpander_dev_s *dev, uint8_t pin, msg.val = (uintptr_t)regval; return ioe_rpmsg_sendrecv(&priv->ept, IOE_RPMSG_OPTION, - (struct ioe_rpmsg_header_s *)&msg, - sizeof(msg)); + (struct ioe_rpmsg_header_s *)&msg, sizeof(msg)); } #ifdef CONFIG_IOEXPANDER_INT_ENABLE @@ -358,8 +355,7 @@ static void *ioe_rpmsg_attach(FAR struct ioexpander_dev_s *dev, ioe_callback_t callback, FAR void *arg) { - FAR struct ioe_rpmsg_client_s *priv = - (struct ioe_rpmsg_client_s *)dev; + FAR struct ioe_rpmsg_client_s *priv = (struct ioe_rpmsg_client_s *)dev; struct ioe_rpmsg_attach_s msg; int ret; @@ -368,8 +364,7 @@ static void *ioe_rpmsg_attach(FAR struct ioexpander_dev_s *dev, msg.cbarg = (uintptr_t)arg; ret = ioe_rpmsg_sendrecv(&priv->ept, IOE_RPMSG_ATTACH, - (struct ioe_rpmsg_header_s *)&msg, - sizeof(msg)); + (struct ioe_rpmsg_header_s *)&msg, sizeof(msg)); if (ret >= 0) { return (FAR void *)(ret + 1); @@ -381,15 +376,13 @@ static void *ioe_rpmsg_attach(FAR struct ioexpander_dev_s *dev, static int ioe_rpmsg_detach(FAR struct ioexpander_dev_s *dev, FAR void *handle) { - FAR struct ioe_rpmsg_client_s *priv = - (struct ioe_rpmsg_client_s *)dev; + FAR struct ioe_rpmsg_client_s *priv = (struct ioe_rpmsg_client_s *)dev; struct ioe_rpmsg_detach_s msg; msg.cbidx = (uintptr_t)handle - 1; return ioe_rpmsg_sendrecv(&priv->ept, IOE_RPMSG_DETACH, - (struct ioe_rpmsg_header_s *)&msg, - sizeof(msg)); + (struct ioe_rpmsg_header_s *)&msg, sizeof(msg)); } #endif @@ -400,8 +393,7 @@ static int ioe_rpmsg_direction_handler(FAR struct rpmsg_endpoint *ept, FAR struct ioe_rpmsg_direction_s *msg = data; FAR struct ioe_rpmsg_server_s *priv = priv_; - msg->header.result = IOEXP_SETDIRECTION(priv->ioe, - msg->pin, msg->val); + msg->header.result = IOEXP_SETDIRECTION(priv->ioe, msg->pin, msg->val); return rpmsg_send(ept, msg, len); } @@ -413,8 +405,7 @@ static int ioe_rpmsg_option_handler(FAR struct rpmsg_endpoint *ept, FAR struct ioe_rpmsg_option_s *msg = data; FAR struct ioe_rpmsg_server_s *priv = priv_; - msg->header.result = IOEXP_SETOPTION(priv->ioe, - msg->pin, msg->opt, + msg->header.result = IOEXP_SETOPTION(priv->ioe, msg->pin, msg->opt, (void *)(uintptr_t)msg->val); return rpmsg_send(ept, msg, len); @@ -427,8 +418,7 @@ static int ioe_rpmsg_writepin_handler(FAR struct rpmsg_endpoint *ept, FAR struct ioe_rpmsg_writepin_s *msg = data; FAR struct ioe_rpmsg_server_s *priv = priv_; - msg->header.result = IOEXP_WRITEPIN(priv->ioe, - msg->pin, msg->val); + msg->header.result = IOEXP_WRITEPIN(priv->ioe, msg->pin, msg->val); return rpmsg_send(ept, msg, len); } @@ -463,21 +453,19 @@ static void ioe_rpmsg_irqworker(FAR void *priv_) msg.cbarg = cb->cbarg; ioe_rpmsg_sendrecv(cb->ept, IOE_RPMSG_IRQ, - (struct ioe_rpmsg_header_s *)&msg, - sizeof(msg)); + (struct ioe_rpmsg_header_s *)&msg, sizeof(msg)); cb->pendset = 0; } static int ioe_rpmsg_irq_cb(FAR struct ioexpander_dev_s *dev, - ioe_pinset_t pinset, FAR void *priv_) + ioe_pinset_t pinset, FAR void *priv_) { FAR struct ioe_rpmsg_cb_s *cb = priv_; cb->pendset |= pinset; - work_queue(HPWORK, &cb->work, ioe_rpmsg_irqworker, - cb, 0); + work_queue(HPWORK, &cb->work, ioe_rpmsg_irqworker, cb, 0); return OK; } @@ -494,9 +482,8 @@ static int ioe_rpmsg_attach_handler(FAR struct rpmsg_endpoint *ept, { if (!priv->cb[i].handler) { - priv->cb[i].handler = - IOEP_ATTACH(priv->ioe, msg->pinset, - ioe_rpmsg_irq_cb, &priv->cb[i]); + priv->cb[i].handler = IOEP_ATTACH(priv->ioe, msg->pinset, + ioe_rpmsg_irq_cb, &priv->cb[i]); if (priv->cb[i].handler) { @@ -521,8 +508,7 @@ static int ioe_rpmsg_detach_handler(FAR struct rpmsg_endpoint *ept, FAR struct ioe_rpmsg_detach_s *msg = data; FAR struct ioe_rpmsg_server_s *priv = priv_; - msg->header.result = IOEP_DETACH(priv->ioe, - priv->cb[msg->cbidx].handler); + msg->header.result = IOEP_DETACH(priv->ioe, priv->cb[msg->cbidx].handler); if (msg->header.result >= 0) { @@ -585,13 +571,11 @@ static void ioe_rpmsg_client_created(FAR struct rpmsg_device *rdev, if (!strcmp(priv->cpuname, rpmsg_get_cpuname(rdev))) { char eptname[RPMSG_NAME_SIZE]; - snprintf(eptname, RPMSG_NAME_SIZE, IOE_RPMSG_EPT_FORMAT, - priv->name); + snprintf(eptname, RPMSG_NAME_SIZE, IOE_RPMSG_EPT_FORMAT, priv->name); priv->ept.priv = priv; - rpmsg_create_ept(&priv->ept, rdev, eptname, - RPMSG_ADDR_ANY, RPMSG_ADDR_ANY, - ioe_rpmsg_ept_cb, NULL); + rpmsg_create_ept(&priv->ept, rdev, eptname, RPMSG_ADDR_ANY, + RPMSG_ADDR_ANY, ioe_rpmsg_ept_cb, NULL); nxsem_post(&priv->sem); } @@ -624,8 +608,7 @@ static void ioe_rpmsg_server_bind(FAR struct rpmsg_device *rdev, FAR struct ioe_rpmsg_server_s *priv = priv_; char eptname[RPMSG_NAME_SIZE]; - snprintf(eptname, RPMSG_NAME_SIZE, IOE_RPMSG_EPT_FORMAT, - priv->name); + snprintf(eptname, RPMSG_NAME_SIZE, IOE_RPMSG_EPT_FORMAT, priv->name); if (!strcmp(name, eptname)) { @@ -639,10 +622,8 @@ static void ioe_rpmsg_server_bind(FAR struct rpmsg_device *rdev, ept->priv = priv; - rpmsg_create_ept(ept, rdev, name, - RPMSG_ADDR_ANY, RPMSG_ADDR_ANY, - ioe_rpmsg_ept_cb, - ioe_rpmsg_server_unbind); + rpmsg_create_ept(ept, rdev, name, RPMSG_ADDR_ANY, RPMSG_ADDR_ANY, + ioe_rpmsg_ept_cb, ioe_rpmsg_server_unbind); } } @@ -678,10 +659,7 @@ int ioe_rpmsg_server_initialize(FAR const char *name, priv->name = name; priv->ioe = ioe; - ret = rpmsg_register_callback(priv, - NULL, - NULL, - ioe_rpmsg_server_bind); + ret = rpmsg_register_callback(priv, NULL, NULL, ioe_rpmsg_server_bind); if (ret < 0) { kmm_free(priv); @@ -699,8 +677,7 @@ int ioe_rpmsg_server_initialize(FAR const char *name, ****************************************************************************/ FAR struct ioexpander_dev_s * -ioe_rpmsg_client_initialize(FAR const char *cpuname, - FAR const char *name) +ioe_rpmsg_client_initialize(FAR const char *cpuname, FAR const char *name) { FAR struct ioe_rpmsg_client_s *priv; int ret; @@ -717,14 +694,12 @@ ioe_rpmsg_client_initialize(FAR const char *cpuname, } priv->ioe.ops = &g_ioe_rpmsg_ops; - priv->cpuname = cpuname; - priv->name = name; + priv->cpuname = cpuname; + priv->name = name; nxsem_init(&priv->sem, 0, 0); - ret = rpmsg_register_callback(priv, - ioe_rpmsg_client_created, - ioe_rpmsg_client_destroy, - NULL); + ret = rpmsg_register_callback(priv, ioe_rpmsg_client_created, + ioe_rpmsg_client_destroy, NULL); if (ret < 0) { kmm_free(priv); diff --git a/drivers/ioexpander/skeleton.c b/drivers/ioexpander/skeleton.c index f9913e9ab7..47c42ce279 100644 --- a/drivers/ioexpander/skeleton.c +++ b/drivers/ioexpander/skeleton.c @@ -81,30 +81,33 @@ struct skel_dev_s static int skel_lock(FAR struct skel_dev_s *priv); static int skel_direction(FAR struct ioexpander_dev_s *dev, uint8_t pin, - int dir); + int dir); static int skel_option(FAR struct ioexpander_dev_s *dev, uint8_t pin, - int opt, void *val); + int opt, void *val); static int skel_writepin(FAR struct ioexpander_dev_s *dev, uint8_t pin, - bool value); + bool value); static int skel_readpin(FAR struct ioexpander_dev_s *dev, uint8_t pin, - FAR bool *value); + FAR bool *value); static int skel_readbuf(FAR struct ioexpander_dev_s *dev, uint8_t pin, - FAR bool *value); + FAR bool *value); #ifdef CONFIG_IOEXPANDER_MULTIPIN static int skel_multiwritepin(FAR struct ioexpander_dev_s *dev, - FAR uint8_t *pins, FAR bool *values, int count); + FAR uint8_t *pins, FAR bool *values, + int count); static int skel_multireadpin(FAR struct ioexpander_dev_s *dev, - FAR uint8_t *pins, FAR bool *values, int count); + FAR uint8_t *pins, FAR bool *values, int count); static int skel_multireadbuf(FAR struct ioexpander_dev_s *dev, - FAR uint8_t *pins, FAR bool *values, int count); + FAR uint8_t *pins, FAR bool *values, int count); #endif #ifdef CONFIG_IOEXPANDER_INT_ENABLE static int skel_attach(FAR struct ioexpander_dev_s *dev, - ioe_pinset_t pinset, ioe_callback_t callback); -#endif + ioe_pinset_t pinset, ioe_callback_t callback); +static int skel_detach(FAR struct ioexpander_dev_s *dev, + FAR void *handle); static void skel_irqworker(void *arg); static void skel_interrupt(FAR void *arg); +#endif /**************************************************************************** * Private Data @@ -134,6 +137,7 @@ static const struct ioexpander_ops_s g_skel_ops = #endif #ifdef CONFIG_IOEXPANDER_INT_ENABLE , skel_attach + , skel_detach #endif }; @@ -412,7 +416,7 @@ static int skel_getmultibits(FAR struct skel_dev_s *priv, FAR uint8_t *pins, return -ENXIO; } - values[i] = ((pinset & (1 << pin) != 0); + values[i] = ((pinset & (1 << pin)) != 0); } return OK; @@ -438,8 +442,7 @@ static int skel_getmultibits(FAR struct skel_dev_s *priv, FAR uint8_t *pins, #ifdef CONFIG_IOEXPANDER_MULTIPIN static int skel_multiwritepin(FAR struct ioexpander_dev_s *dev, - FAR uint8_t *pins, FAR bool *values, - int count) + FAR uint8_t *pins, FAR bool *values, int count) { FAR struct skel_dev_s *priv = (FAR struct skel_dev_s *)dev; ioe_pinset_t pinset; @@ -506,8 +509,7 @@ static int skel_multiwritepin(FAR struct ioexpander_dev_s *dev, #ifdef CONFIG_IOEXPANDER_MULTIPIN static int skel_multireadpin(FAR struct ioexpander_dev_s *dev, - FAR uint8_t *pins, FAR bool *values, - int count) + FAR uint8_t *pins, FAR bool *values, int count) { FAR struct skel_dev_s *priv = (FAR struct skel_dev_s *)dev; int ret; @@ -549,8 +551,7 @@ static int skel_multireadpin(FAR struct ioexpander_dev_s *dev, #ifdef CONFIG_IOEXPANDER_MULTIPIN static int skel_multireadbuf(FAR struct ioexpander_dev_s *dev, - FAR uint8_t *pins, FAR bool *values, - int count) + FAR uint8_t *pins, FAR bool *values, int count) { FAR struct skel_dev_s *priv = (FAR struct skel_dev_s *)dev; int ret; @@ -590,7 +591,7 @@ static int skel_multireadbuf(FAR struct ioexpander_dev_s *dev, * ****************************************************************************/ -#ifdef CONFIG_skeleton_INT_ENABLE +#ifdef CONFIG_IOEXPANDER_INT_ENABLE static int skel_attach(FAR struct ioexpander_dev_s *dev, ioe_pinset_t pinset, ioe_callback_t callback) { @@ -630,6 +631,41 @@ static int skel_attach(FAR struct ioexpander_dev_s *dev, ioe_pinset_t pinset, } #endif +/**************************************************************************** + * Name: skel_detach_detach + * + * Description: + * Detach and disable a pin interrupt callback function. + * + * Input Parameters: + * dev - Device-specific state data + * handle - The non-NULL opaque value return by skel_attach_attch() + * + * Returned Value: + * 0 on success, else a negative error code + * + ****************************************************************************/ + +#ifdef CONFIG_IOEXPANDER_INT_ENABLE +static int skel_detach(FAR struct ioexpander_dev_s *dev, FAR void *handle) +{ + FAR struct skel_dev_s *priv = (FAR struct skel_dev_s *)dev; + FAR struct skel_callback_s *cb = + (FAR struct skel_callback_s *)handle; + + DEBUGASSERT(priv != NULL && cb != NULL); + DEBUGASSERT((uintptr_t)cb >= (uintptr_t)&priv->cb[0] && + (uintptr_t)cb <= + (uintptr_t)&priv->cb[CONFIG_SKELETON_INT_NCALLBACKS - 1]); + UNUSED(priv); + + cb->pinset = 0; + cb->cbfunc = NULL; + cb->cbarg = NULL; + return OK; +} +#endif + /**************************************************************************** * Name: skel_irqworker * @@ -639,7 +675,7 @@ static int skel_attach(FAR struct ioexpander_dev_s *dev, ioe_pinset_t pinset, * ****************************************************************************/ -#ifdef CONFIG_skeleton_INT_ENABLE +#ifdef CONFIG_IOEXPANDER_INT_ENABLE static void skel_irqworker(void *arg) { FAR struct skel_dev_s *priv = (FAR struct skel_dev_s *)arg; @@ -697,7 +733,7 @@ static void skel_irqworker(void *arg) * ****************************************************************************/ -#ifdef CONFIG_skeleton_INT_ENABLE +#ifdef CONFIG_IOEXPANDER_INT_ENABLE static void skel_interrupt(FAR void *arg) { FAR struct skel_dev_s *priv = (FAR struct skel_dev_s *)arg; @@ -778,7 +814,7 @@ FAR struct ioexpander_dev_s *skel_initialize(void) priv->dev.ops = &g_skel_ops; -#ifdef CONFIG_skeleton_INT_ENABLE +#ifdef CONFIG_IOEXPANDER_INT_ENABLE /* Attach the I/O expander interrupt handler and enable interrupts */ #warning Missing logic diff --git a/include/nuttx/ioexpander/ioexpander.h b/include/nuttx/ioexpander/ioexpander.h index ce963246dc..2a08d6bf32 100644 --- a/include/nuttx/ioexpander/ioexpander.h +++ b/include/nuttx/ioexpander/ioexpander.h @@ -335,8 +335,7 @@ struct ioexpander_ops_s CODE FAR void *(*ioe_attach)(FAR struct ioexpander_dev_s *dev, ioe_pinset_t pinset, ioe_callback_t callback, FAR void *arg); - CODE int (*ioe_detach)(FAR struct ioexpander_dev_s *dev, - FAR void *handle); + CODE int (*ioe_detach)(FAR struct ioexpander_dev_s *dev, FAR void *handle); #endif };