drivers/gpio: save memory if dont support signal
Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
parent
28815fb7c5
commit
1bad603fe7
@ -499,6 +499,14 @@ config DEV_GPIO
|
|||||||
Enables a simple GPIO input/output driver to support application-
|
Enables a simple GPIO input/output driver to support application-
|
||||||
space testing of hardware.
|
space testing of hardware.
|
||||||
|
|
||||||
|
config DEV_GPIO_NPOLLWAITERS
|
||||||
|
int "Max number of polls"
|
||||||
|
default 1
|
||||||
|
depends on DEV_GPIO
|
||||||
|
---help---
|
||||||
|
The maximum number of polls that can be registered with the GPIO
|
||||||
|
driver
|
||||||
|
|
||||||
config DEV_GPIO_NSIGNALS
|
config DEV_GPIO_NSIGNALS
|
||||||
int "Max number of signals"
|
int "Max number of signals"
|
||||||
default 1
|
default 1
|
||||||
|
@ -87,14 +87,19 @@ static const struct file_operations g_gpio_drvrops =
|
|||||||
|
|
||||||
static int gpio_handler(FAR struct gpio_dev_s *dev, uint8_t pin)
|
static int gpio_handler(FAR struct gpio_dev_s *dev, uint8_t pin)
|
||||||
{
|
{
|
||||||
|
#if CONFIG_DEV_GPIO_NSIGNALS > 0
|
||||||
int i;
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
DEBUGASSERT(dev != NULL);
|
DEBUGASSERT(dev != NULL);
|
||||||
|
|
||||||
dev->int_count++;
|
dev->int_count++;
|
||||||
|
|
||||||
poll_notify(dev->fds, CONFIG_DEV_GPIO_NSIGNALS, POLLIN);
|
#if CONFIG_DEV_GPIO_NPOLLWAITERS > 0
|
||||||
|
poll_notify(dev->fds, CONFIG_DEV_GPIO_NPOLLWAITERS, POLLIN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_DEV_GPIO_NSIGNALS > 0
|
||||||
for (i = 0; i < CONFIG_DEV_GPIO_NSIGNALS; i++)
|
for (i = 0; i < CONFIG_DEV_GPIO_NSIGNALS; i++)
|
||||||
{
|
{
|
||||||
FAR struct gpio_signal_s *signal = &dev->gp_signals[i];
|
FAR struct gpio_signal_s *signal = &dev->gp_signals[i];
|
||||||
@ -107,6 +112,7 @@ static int gpio_handler(FAR struct gpio_dev_s *dev, uint8_t pin)
|
|||||||
nxsig_notification(signal->gp_pid, &signal->gp_event,
|
nxsig_notification(signal->gp_pid, &signal->gp_event,
|
||||||
SI_QUEUE, &signal->gp_work);
|
SI_QUEUE, &signal->gp_work);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@ -305,10 +311,12 @@ static int gpio_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
FAR struct inode *inode;
|
FAR struct inode *inode;
|
||||||
FAR struct gpio_dev_s *dev;
|
FAR struct gpio_dev_s *dev;
|
||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
pid_t pid;
|
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
#if CONFIG_DEV_GPIO_NSIGNALS > 0
|
||||||
|
pid_t pid;
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
|
#endif
|
||||||
|
|
||||||
inode = filep->f_inode;
|
inode = filep->f_inode;
|
||||||
DEBUGASSERT(inode->i_private != NULL);
|
DEBUGASSERT(inode->i_private != NULL);
|
||||||
@ -383,6 +391,7 @@ static int gpio_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
if (dev->gp_pintype >= GPIO_INTERRUPT_PIN)
|
if (dev->gp_pintype >= GPIO_INTERRUPT_PIN)
|
||||||
{
|
{
|
||||||
flags = enter_critical_section();
|
flags = enter_critical_section();
|
||||||
|
#if CONFIG_DEV_GPIO_NSIGNALS > 0
|
||||||
if (arg)
|
if (arg)
|
||||||
{
|
{
|
||||||
pid = nxsched_getpid();
|
pid = nxsched_getpid();
|
||||||
@ -406,6 +415,7 @@ static int gpio_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (dev->register_count++ > 0)
|
if (dev->register_count++ > 0)
|
||||||
{
|
{
|
||||||
@ -442,8 +452,9 @@ static int gpio_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
case GPIOC_UNREGISTER:
|
case GPIOC_UNREGISTER:
|
||||||
if (dev->gp_pintype >= GPIO_INTERRUPT_PIN)
|
if (dev->gp_pintype >= GPIO_INTERRUPT_PIN)
|
||||||
{
|
{
|
||||||
pid = nxsched_getpid();
|
|
||||||
flags = enter_critical_section();
|
flags = enter_critical_section();
|
||||||
|
#if CONFIG_DEV_GPIO_NSIGNALS > 0
|
||||||
|
pid = nxsched_getpid();
|
||||||
for (i = 0; i < CONFIG_DEV_GPIO_NSIGNALS; i++)
|
for (i = 0; i < CONFIG_DEV_GPIO_NSIGNALS; i++)
|
||||||
{
|
{
|
||||||
if (pid == dev->gp_signals[i].gp_pid)
|
if (pid == dev->gp_signals[i].gp_pid)
|
||||||
@ -467,6 +478,7 @@ static int gpio_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (--dev->register_count > 0)
|
if (--dev->register_count > 0)
|
||||||
{
|
{
|
||||||
@ -583,22 +595,26 @@ static int gpio_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
static int gpio_poll(FAR struct file *filep,
|
static int gpio_poll(FAR struct file *filep,
|
||||||
FAR struct pollfd *fds, bool setup)
|
FAR struct pollfd *fds, bool setup)
|
||||||
{
|
{
|
||||||
|
#if CONFIG_DEV_GPIO_NPOLLWAITERS > 0
|
||||||
FAR struct inode *inode = filep->f_inode;
|
FAR struct inode *inode = filep->f_inode;
|
||||||
FAR struct gpio_dev_s *dev = inode->i_private;
|
FAR struct gpio_dev_s *dev = inode->i_private;
|
||||||
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Are we setting up the poll? Or tearing it down? */
|
/* Are we setting up the poll? Or tearing it down? */
|
||||||
|
|
||||||
flags = enter_critical_section();
|
flags = enter_critical_section();
|
||||||
if (setup)
|
if (setup)
|
||||||
{
|
{
|
||||||
|
#if CONFIG_DEV_GPIO_NPOLLWAITERS > 0
|
||||||
/* This is a request to set up the poll. Find an available
|
/* This is a request to set up the poll. Find an available
|
||||||
* slot for the poll structure reference
|
* slot for the poll structure reference
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < CONFIG_DEV_GPIO_NSIGNALS; i++)
|
for (i = 0; i < CONFIG_DEV_GPIO_NPOLLWAITERS; i++)
|
||||||
{
|
{
|
||||||
/* Find an available slot */
|
/* Find an available slot */
|
||||||
|
|
||||||
@ -620,7 +636,8 @@ static int gpio_poll(FAR struct file *filep,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i >= CONFIG_DEV_GPIO_NSIGNALS)
|
if (i >= CONFIG_DEV_GPIO_NPOLLWAITERS)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
fds->priv = NULL;
|
fds->priv = NULL;
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
|
@ -162,7 +162,9 @@ struct gpio_dev_s
|
|||||||
|
|
||||||
/* Writable storage used by the upper half driver */
|
/* Writable storage used by the upper half driver */
|
||||||
|
|
||||||
|
#if CONFIG_DEV_GPIO_NSIGNALS > 0
|
||||||
struct gpio_signal_s gp_signals[CONFIG_DEV_GPIO_NSIGNALS];
|
struct gpio_signal_s gp_signals[CONFIG_DEV_GPIO_NSIGNALS];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Read-only pointer to GPIO device operations (also provided by the
|
/* Read-only pointer to GPIO device operations (also provided by the
|
||||||
* lower half driver).
|
* lower half driver).
|
||||||
@ -170,7 +172,9 @@ struct gpio_dev_s
|
|||||||
|
|
||||||
FAR const struct gpio_operations_s *gp_ops;
|
FAR const struct gpio_operations_s *gp_ops;
|
||||||
|
|
||||||
FAR struct pollfd *fds[CONFIG_DEV_GPIO_NSIGNALS];
|
#if CONFIG_DEV_GPIO_NPOLLWAITERS > 0
|
||||||
|
FAR struct pollfd *fds[CONFIG_DEV_GPIO_NPOLLWAITERS];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Device specific, lower-half information may follow. */
|
/* Device specific, lower-half information may follow. */
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user