Skip to content

Commit b6618b9

Browse files
committed
feat(platform/nuttx): add usbd_fs & usbh_serial
Signed-off-by: sakumisu <1203593632@qq.com>
1 parent c399be3 commit b6618b9

File tree

3 files changed

+372
-40
lines changed

3 files changed

+372
-40
lines changed

platform/nuttx/usbd_fs.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Copyright (c) 2025, sakumisu
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
#include <nuttx/fs/fs.h>
7+
8+
#include "usbd_core.h"
9+
#include "usbd_msc.h"
10+
11+
#ifndef CONFIG_USBDEV_MSC_THREAD
12+
#error "CONFIG_USBDEV_MSC_THREAD must be enabled"
13+
#endif
14+
15+
#ifndef CONFIG_USBDEV_MSC_DEVPATH0
16+
#define CONFIG_USBDEV_MSC_DEVPATH0 "/dev/ram1"
17+
#endif
18+
19+
static FAR struct inode *inode;
20+
static struct geometry geo;
21+
22+
void usbd_msc_get_cap(uint8_t busid, uint8_t lun, uint32_t *block_num, uint32_t *block_size)
23+
{
24+
int ret;
25+
26+
/* Open the block driver */
27+
28+
ret = open_blockdriver(CONFIG_USBDEV_MSC_DEVPATH0, 0, &inode);
29+
if (ret < 0) {
30+
*block_num = 0;
31+
*block_size = 0;
32+
return;
33+
}
34+
35+
/* Get the drive geometry */
36+
37+
if (!inode || !inode->u.i_bops || !inode->u.i_bops->geometry ||
38+
inode->u.i_bops->geometry(inode, &geo) != OK || !geo.geo_available) {
39+
*block_num = 0;
40+
*block_size = 0;
41+
return;
42+
}
43+
44+
*block_num = geo.geo_nsectors;
45+
*block_size = geo.geo_sectorsize;
46+
47+
USB_LOG_INFO("block_num: %ld, block_size: %ld\n", *block_num, *block_size);
48+
}
49+
50+
int usbd_msc_sector_read(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length)
51+
{
52+
if (inode->u.i_bops->read) {
53+
inode->u.i_bops->read(inode, buffer, sector, length / geo.geo_sectorsize);
54+
}
55+
56+
return 0;
57+
}
58+
59+
int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length)
60+
{
61+
if (inode->u.i_bops->write) {
62+
inode->u.i_bops->write(inode, buffer, sector, length / geo.geo_sectorsize);
63+
}
64+
65+
return 0;
66+
}

platform/nuttx/usbh_fs.c

Lines changed: 65 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,7 @@
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
6-
#include <nuttx/config.h>
7-
8-
#include <inttypes.h>
9-
#include <stdio.h>
10-
#include <stdlib.h>
11-
#include <string.h>
12-
#include <unistd.h>
13-
#include <assert.h>
14-
#include <errno.h>
15-
#include <debug.h>
16-
17-
#include <nuttx/irq.h>
18-
#include <nuttx/kmalloc.h>
19-
#include <nuttx/signal.h>
20-
#include <nuttx/arch.h>
21-
#include <nuttx/wqueue.h>
22-
#include <nuttx/scsi.h>
236
#include <nuttx/fs/fs.h>
24-
#include <nuttx/mutex.h>
257

268
#include "usbh_core.h"
279
#include "usbh_msc.h"
@@ -38,6 +20,57 @@
3820

3921
#define DEV_FORMAT "/dev/sd%c"
4022

23+
static int nuttx_errorcode(int error)
24+
{
25+
int err = 0;
26+
27+
switch (error) {
28+
case -USB_ERR_NOMEM:
29+
err = -EIO;
30+
break;
31+
case -USB_ERR_INVAL:
32+
err = -EINVAL;
33+
break;
34+
case -USB_ERR_NODEV:
35+
err = -ENODEV;
36+
break;
37+
case -USB_ERR_NOTCONN:
38+
err = -ENOTCONN;
39+
break;
40+
case -USB_ERR_NOTSUPP:
41+
err = -EIO;
42+
break;
43+
case -USB_ERR_BUSY:
44+
err = -EBUSY;
45+
break;
46+
case -USB_ERR_RANGE:
47+
err = -ERANGE;
48+
break;
49+
case -USB_ERR_STALL:
50+
err = -EPERM;
51+
break;
52+
case -USB_ERR_NAK:
53+
err = -EAGAIN;
54+
break;
55+
case -USB_ERR_DT:
56+
err = -EIO;
57+
break;
58+
case -USB_ERR_IO:
59+
err = -EIO;
60+
break;
61+
case -USB_ERR_SHUTDOWN:
62+
err = -ESHUTDOWN;
63+
break;
64+
case -USB_ERR_TIMEOUT:
65+
err = -ETIMEDOUT;
66+
break;
67+
68+
default:
69+
break;
70+
}
71+
return err;
72+
}
73+
4174
static int usbhost_open(FAR struct inode *inode);
4275
static int usbhost_close(FAR struct inode *inode);
4376
static ssize_t usbhost_read(FAR struct inode *inode, unsigned char *buffer,
@@ -90,18 +123,14 @@ static ssize_t usbhost_read(FAR struct inode *inode, unsigned char *buffer,
90123
DEBUGASSERT(inode->i_private);
91124
msc_class = (struct usbh_msc *)inode->i_private;
92125

93-
if (msc_class->hport && msc_class->hport->connected) {
94-
ret = usbh_msc_scsi_read10(msc_class, startsector, (uint8_t *)buffer, nsectors);
95-
if (ret < 0) {
96-
return ret;
97-
} else {
98-
#ifdef CONFIG_ARCH_DCACHE
99-
up_invalidate_dcache((uintptr_t)buffer, (uintptr_t)(buffer + nsectors * msc_class->blocksize));
100-
#endif
101-
return nsectors;
102-
}
126+
ret = usbh_msc_scsi_read10(msc_class, startsector, (uint8_t *)buffer, nsectors);
127+
if (ret < 0) {
128+
return nuttx_errorcode(ret);
103129
} else {
104-
return -ENODEV;
130+
#if defined(CONFIG_ARCH_DCACHE) && !defined(CONFIG_USB_DCACHE_ENABLE)
131+
up_invalidate_dcache((uintptr_t)buffer, (uintptr_t)(buffer + nsectors * msc_class->blocksize));
132+
#endif
133+
return nsectors;
105134
}
106135
}
107136

@@ -115,18 +144,14 @@ static ssize_t usbhost_write(FAR struct inode *inode,
115144
DEBUGASSERT(inode->i_private);
116145
msc_class = (struct usbh_msc *)inode->i_private;
117146

118-
if (msc_class->hport && msc_class->hport->connected) {
119-
#ifdef CONFIG_ARCH_DCACHE
120-
up_flush_dcache((uintptr_t)buffer, (uintptr_t)(buffer + nsectors * msc_class->blocksize));
147+
#if defined(CONFIG_ARCH_DCACHE) && !defined(CONFIG_USB_DCACHE_ENABLE)
148+
up_clean_dcache((uintptr_t)buffer, (uintptr_t)(buffer + nsectors * msc_class->blocksize));
121149
#endif
122-
ret = usbh_msc_scsi_write10(msc_class, startsector, (uint8_t *)buffer, nsectors);
123-
if (ret < 0) {
124-
return ret;
125-
} else {
126-
return nsectors;
127-
}
150+
ret = usbh_msc_scsi_write10(msc_class, startsector, (uint8_t *)buffer, nsectors);
151+
if (ret < 0) {
152+
return nuttx_errorcode(ret);
128153
} else {
129-
return -ENODEV;
154+
return nsectors;
130155
}
131156
}
132157

@@ -147,7 +172,7 @@ static int usbhost_geometry(FAR struct inode *inode,
147172
geometry->geo_nsectors = msc_class->blocknum;
148173
geometry->geo_sectorsize = msc_class->blocksize;
149174

150-
uinfo("nsectors: %" PRIdOFF " sectorsize: %" PRIi16 "\n",
175+
USB_LOG_DBG("nsectors: %ld, sectorsize: %ld\n",
151176
geometry->geo_nsectors, geometry->geo_sectorsize);
152177
return OK;
153178
} else {

0 commit comments

Comments
 (0)