mirror of
https://github.com/apache/nuttx.git
synced 2026-08-07 21:47:17 +00:00
sim/raw_gadget: let's raw_epxhandle exit when unregister usbdev
Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
parent
839eaacbcc
commit
b64dd8bed0
1 changed files with 38 additions and 2 deletions
|
|
@ -26,6 +26,7 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
|
@ -199,6 +200,7 @@ struct usb_raw_gadget_dev_t
|
|||
struct usb_raw_control_io_s ep0_ctrl;
|
||||
struct usb_raw_ep_entry_s eps_entry[USB_RAW_EPS_NUM_MAX];
|
||||
struct usb_raw_eps_info_s eps_info;
|
||||
bool loop_stop;
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
|
|
@ -218,6 +220,16 @@ static struct usb_raw_gadget_dev_t g_raw_gadget_dev =
|
|||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
static void host_raw_handle_signal(int signum)
|
||||
{
|
||||
struct usb_raw_gadget_dev_t *dev = &g_raw_gadget_dev;
|
||||
|
||||
if (signum == SIGUSR2)
|
||||
{
|
||||
dev->loop_stop = true;
|
||||
}
|
||||
}
|
||||
|
||||
static void host_raw_fifocreate(struct usb_raw_fifo_s *fifo,
|
||||
uint16_t elem_size, uint16_t elem_num)
|
||||
{
|
||||
|
|
@ -586,8 +598,13 @@ static void *host_raw_ep0handle(void *arg)
|
|||
struct usb_raw_gadget_dev_t *dev = &g_raw_gadget_dev;
|
||||
struct usb_raw_ep_entry_s *entry = &dev->eps_entry[0];
|
||||
struct usb_raw_control_event_s event;
|
||||
struct sigaction action;
|
||||
|
||||
while (dev->fd >= 0)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = host_raw_handle_signal;
|
||||
sigaction(SIGUSR2, &action, NULL);
|
||||
|
||||
while (!dev->loop_stop)
|
||||
{
|
||||
event.inner.type = 0;
|
||||
event.inner.length = sizeof(event.ctrl);
|
||||
|
|
@ -621,8 +638,13 @@ static void *host_raw_ephandle(void *arg)
|
|||
struct usb_raw_gadget_dev_t *dev = &g_raw_gadget_dev;
|
||||
struct usb_raw_ep_entry_s *entry = arg;
|
||||
struct usb_raw_data_io_s *io;
|
||||
struct sigaction action;
|
||||
|
||||
while (dev->fd >= 0)
|
||||
memset(&action, 0, sizeof(action));
|
||||
action.sa_handler = host_raw_handle_signal;
|
||||
sigaction(SIGUSR2, &action, NULL);
|
||||
|
||||
while (!dev->loop_stop)
|
||||
{
|
||||
io = (struct usb_raw_data_io_s *)
|
||||
host_raw_fifoalloc(&entry->fifo);
|
||||
|
|
@ -687,6 +709,7 @@ int host_usbdev_init(uint32_t speed)
|
|||
host_raw_vbusdraw(fd, 0x32);
|
||||
host_raw_configure(fd);
|
||||
dev->fd = fd;
|
||||
dev->loop_stop = false;
|
||||
|
||||
host_raw_fifocreate(&dev->eps_entry[0].fifo,
|
||||
(sizeof(struct host_usb_ctrlreq_s)
|
||||
|
|
@ -700,7 +723,20 @@ int host_usbdev_init(uint32_t speed)
|
|||
int host_usbdev_deinit(void)
|
||||
{
|
||||
struct usb_raw_gadget_dev_t *dev = &g_raw_gadget_dev;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < USB_RAW_EPS_NUM_MAX &&
|
||||
dev->eps_entry[i].ep_thread > 0; i++)
|
||||
{
|
||||
pthread_kill(dev->eps_entry[i].ep_thread, SIGUSR2);
|
||||
pthread_join(dev->eps_entry[i].ep_thread, NULL);
|
||||
}
|
||||
|
||||
pthread_kill(dev->ep0_thread, SIGUSR2);
|
||||
pthread_join(dev->ep0_thread, NULL);
|
||||
host_raw_close(dev->fd);
|
||||
dev->fd = -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue