drivers/usbdev: Unregister CDCACM by instance number

Add a function to search the cdcacm instance by the devnode
minor number to unregister it

Signed-off-by: Jukka Laitinen <jukka.laitinen@tii.ae>
This commit is contained in:
Jukka Laitinen
2025-09-14 09:59:40 +03:00
committed by Xiang Xiao
parent d84bf53085
commit 2435caa925
2 changed files with 68 additions and 3 deletions
+49 -3
View File
@@ -3430,8 +3430,53 @@ void cdcacm_uninitialize(FAR struct usbdevclass_driver_s *classdev)
{
FAR struct cdcacm_driver_s *drvr = (FAR struct cdcacm_driver_s *)classdev;
FAR struct cdcacm_dev_s *priv = drvr->dev;
char devname[CDCACM_DEVNAME_SIZE];
cdcacm_uninitialize_instance(priv->minor, classdev);
}
/****************************************************************************
* Name: cdcacm_uninitialize_instance
*
* Description:
* Function to uninitialize specific cdcacm instance
*
* Input Parameters:
* minor - CDCACM node minor number
*
* Returned Value:
* OK when successful, -ENODEV if cdcacm is not initialized
*
****************************************************************************/
int cdcacm_uninitialize_instance(int minor,
FAR struct usbdevclass_driver_s *classdev)
{
int ret;
FAR struct cdcacm_driver_s *drvr = (FAR struct cdcacm_driver_s *)classdev;
FAR struct cdcacm_dev_s *priv;
char devname[CDCACM_DEVNAME_SIZE];
/* Create device node path from minor number */
snprintf(devname, sizeof(devname), CDCACM_DEVNAME_FORMAT, minor);
/* If classdev is not provided, find it from the file system */
if (classdev == NULL)
{
FAR struct cdcacm_alloc_s *cdcacm_alloc = find_driver(devname);
if (cdcacm_alloc != NULL)
{
drvr = &cdcacm_alloc->drvr;
classdev = &drvr->drvr;
}
else
{
return -ENODEV;
}
}
priv = drvr->dev;
#ifdef CONFIG_SYSLOG_CDCACM
if (g_syslog_cdcacm == priv)
@@ -3445,18 +3490,19 @@ void cdcacm_uninitialize(FAR struct usbdevclass_driver_s *classdev)
cdcacm_disconnect(classdev, priv->usbdev);
#ifndef CONFIG_CDCACM_COMPOSITE
usbdev_unregister(&drvr->drvr);
usbdev_unregister(classdev);
#endif
/* Un-register the CDC/ACM TTY device */
snprintf(devname, sizeof(devname), CDCACM_DEVNAME_FORMAT, priv->minor);
ret = unregister_driver(devname);
if (ret < 0)
{
usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_UARTUNREGISTER),
(uint16_t)-ret);
}
return ret;
}
/****************************************************************************
+19
View File
@@ -391,6 +391,25 @@ int cdcacm_initialize(int minor, FAR void **handle);
void cdcacm_uninitialize(FAR struct usbdevclass_driver_s *classdev);
/****************************************************************************
* Name: cdcacm_uninitialize_instance
*
* Description:
* Function to uninitialize specific cdcacm instance
*
* Input Parameters:
* minor - CDCACM node minor number
* classdev - The class object returned by cdcacm_classobject().
* if NULL, the driver is searched from the filesystem.
*
* Returned Value:
* OK when successful, -ENODEV if cdcacm is not initialized
*
****************************************************************************/
int cdcacm_uninitialize_instance(int minor,
FAR struct usbdevclass_driver_s *classdev);
/****************************************************************************
* Name: cdcacm_get_composite_devdesc
*