You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2024/01/18 01:49:09 UTC
(nuttx) branch master updated: drivers/usbhost: Update USB bluetooth driver
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 1c0299b687 drivers/usbhost: Update USB bluetooth driver
1c0299b687 is described below
commit 1c0299b687bb3b7e9dced170c22e85a02b948eae
Author: Lwazi Dube <lw...@gmail.com>
AuthorDate: Wed Jan 17 10:26:31 2024 -0500
drivers/usbhost: Update USB bluetooth driver
Miscellaneous changes addressing feedback from xiaoxiang781216.
---
drivers/usbhost/usbhost_bthci.c | 107 +++++++++++++++++-----------------------
1 file changed, 45 insertions(+), 62 deletions(-)
diff --git a/drivers/usbhost/usbhost_bthci.c b/drivers/usbhost/usbhost_bthci.c
index 9e23f4f21e..1b14a0b778 100644
--- a/drivers/usbhost/usbhost_bthci.c
+++ b/drivers/usbhost/usbhost_bthci.c
@@ -97,7 +97,7 @@ struct usbhost_state_s
char devchar; /* Character identifying the /dev/bthci[n] device */
volatile bool disconnected; /* TRUE: Device has been disconnected */
uint8_t ifno; /* Interface number */
- sem_t exclsem; /* Used to maintain mutual exclusive access */
+ mutex_t lock; /* Used to maintain mutual exclusive access */
struct work_s work; /* For interacting with the worker thread */
FAR uint8_t *tbuffer; /* The allocated transfer buffer */
size_t tbuflen; /* Size of the allocated transfer buffer */
@@ -148,7 +148,7 @@ static inline void usbhost_putle16(uint8_t *dest, uint16_t val);
/* Transfer descriptor memory management */
static inline int usbhost_talloc(FAR struct usbhost_state_s *priv);
-static inline int usbhost_tfree(FAR struct usbhost_state_s *priv);
+static inline void usbhost_tfree(FAR struct usbhost_state_s *priv);
/* struct usbhost_registry_s methods */
@@ -194,7 +194,7 @@ static int usbhost_bthci_ioctl(FAR struct bt_driver_s *dev,
* used to associate the USB class driver to a connected USB device.
*/
-static struct usbhost_id_s g_id[] =
+static const struct usbhost_id_s g_id[] =
{
{
USB_CLASS_WIRELESS_CONTROLLER, /* base */
@@ -387,14 +387,9 @@ static void usbhost_destroy(FAR void *arg)
usbhost_tfree(priv);
- /* Free the function address assigned to this device */
-
- usbhost_devaddr_destroy(hport, hport->funcaddr);
- hport->funcaddr = 0;
-
/* Destroy the semaphores */
- nxsem_destroy(&priv->exclsem);
+ nxmutex_destroy(&priv->lock);
/* Disconnect the USB host device */
@@ -826,14 +821,14 @@ static ssize_t usbhost_cmd_tx(FAR struct usbhost_state_s *priv,
{
int ret;
- nxsem_wait_uninterruptible(&priv->exclsem);
+ nxmutex_lock(&priv->lock);
ret = usbhost_ctrl_cmd(priv,
USB_REQ_DIR_OUT | USB_REQ_TYPE_CLASS |
USB_REQ_RECIPIENT_DEVICE,
0, 0, 0, (uint8_t *)buffer, buflen);
- nxsem_post(&priv->exclsem);
+ nxmutex_unlock(&priv->lock);
return ret;
}
@@ -943,7 +938,7 @@ static ssize_t usbhost_acl_tx(FAR struct usbhost_state_s *priv,
hport = priv->usbclass.hport;
DEBUGASSERT(hport);
- nxsem_wait_uninterruptible(&priv->exclsem);
+ nxmutex_lock(&priv->lock);
nwritten = DRVR_TRANSFER(hport->drvr, priv->bulkout,
(uint8_t *)buffer, buflen);
@@ -957,7 +952,7 @@ static ssize_t usbhost_acl_tx(FAR struct usbhost_state_s *priv,
nwritten = OK;
}
- nxsem_post(&priv->exclsem);
+ nxmutex_unlock(&priv->lock);
return nwritten;
}
@@ -1118,17 +1113,9 @@ static inline int usbhost_devinit(FAR struct usbhost_state_s *priv)
if (ret >= 0)
{
- ret = nxsem_wait_uninterruptible(&priv->exclsem);
- if (ret < 0)
- {
- return ret;
- }
-
/* Ready for normal operation */
uinfo("Successfully initialized\n");
-
- nxsem_post(&priv->exclsem);
}
return ret;
@@ -1220,19 +1207,20 @@ static inline int usbhost_talloc(FAR struct usbhost_state_s *priv)
{
uerr("ERROR: DRVR_ALLOC of ctrlreq failed: %d\n", ret);
- if (priv->evbuffer)
- {
- DRVR_FREE(hport->drvr, priv->evbuffer);
- priv->evbuffer = NULL;
- priv->evbuflen = 0;
- }
-
+ usbhost_tfree(priv);
return ret;
}
DEBUGASSERT(maxlen >= sizeof(struct usb_ctrlreq_s));
- return DRVR_ALLOC(hport->drvr, &priv->tbuffer, &priv->tbuflen);
+ ret = DRVR_ALLOC(hport->drvr, &priv->tbuffer, &priv->tbuflen);
+ if (ret < 0)
+ {
+ uerr("ERROR: DRVR_ALLOC of buffer failed: %d\n", ret);
+ usbhost_tfree(priv);
+ }
+
+ return ret;
}
/****************************************************************************
@@ -1250,10 +1238,9 @@ static inline int usbhost_talloc(FAR struct usbhost_state_s *priv)
*
****************************************************************************/
-static inline int usbhost_tfree(FAR struct usbhost_state_s *priv)
+static inline void usbhost_tfree(FAR struct usbhost_state_s *priv)
{
FAR struct usbhost_hubport_s *hport;
- int result = OK;
DEBUGASSERT(priv != NULL && priv->usbclass.hport != NULL);
hport = priv->usbclass.hport;
@@ -1273,12 +1260,10 @@ static inline int usbhost_tfree(FAR struct usbhost_state_s *priv)
if (priv->tbuffer)
{
- result = DRVR_FREE(hport->drvr, priv->tbuffer);
+ DRVR_FREE(hport->drvr, priv->tbuffer);
priv->tbuffer = NULL;
priv->tbuflen = 0;
}
-
- return result;
}
/****************************************************************************
@@ -1312,54 +1297,52 @@ static inline int usbhost_tfree(FAR struct usbhost_state_s *priv)
****************************************************************************/
static FAR struct usbhost_class_s *
- usbhost_create(FAR struct usbhost_hubport_s *hport,
- FAR const struct usbhost_id_s *id)
+usbhost_create(FAR struct usbhost_hubport_s *hport,
+ FAR const struct usbhost_id_s *id)
{
FAR struct usbhost_state_s *priv;
/* Allocate a USB host class instance */
priv = usbhost_allocclass();
- if (priv)
+ if (priv == NULL)
{
- /* Initialize the allocated storage class instance */
+ return NULL;
+ }
- memset(priv, 0, sizeof(struct usbhost_state_s));
+ /* Initialize the allocated storage class instance */
- /* Assign a device number to this class instance */
+ memset(priv, 0, sizeof(struct usbhost_state_s));
- if (usbhost_allocdevno(priv) == OK)
- {
- /* Initialize class method function pointers */
+ /* Assign a device number to this class instance */
- priv->usbclass.hport = hport;
- priv->usbclass.connect = usbhci_connect;
- priv->usbclass.disconnected = usbhost_disconnected;
+ if (usbhost_allocdevno(priv) == OK)
+ {
+ /* Initialize class method function pointers */
+
+ priv->usbclass.hport = hport;
+ priv->usbclass.connect = usbhci_connect;
+ priv->usbclass.disconnected = usbhost_disconnected;
- priv->btdev.head_reserve = 0;
- priv->btdev.open = usbhost_bthci_open;
- priv->btdev.send = usbhost_bthci_send;
- priv->btdev.close = usbhost_bthci_close;
- priv->btdev.ioctl = usbhost_bthci_ioctl;
+ priv->btdev.open = usbhost_bthci_open;
+ priv->btdev.send = usbhost_bthci_send;
+ priv->btdev.close = usbhost_bthci_close;
+ priv->btdev.ioctl = usbhost_bthci_ioctl;
- /* Initialize semaphores
- * (this works okay in the interrupt context)
- */
+ /* Initialize semaphores
+ * (this works okay in the interrupt context)
+ */
- nxsem_init(&priv->exclsem, 0, 1);
+ nxmutex_init(&priv->lock);
- /* Return the instance of the USB class driver */
+ /* Return the instance of the USB class driver */
- return &priv->usbclass;
- }
+ return &priv->usbclass;
}
/* An error occurred. Free the allocation and return NULL on all failures */
- if (priv)
- {
- usbhost_freeclass(priv);
- }
+ usbhost_freeclass(priv);
return NULL;
}