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"
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+
4174static int usbhost_open (FAR struct inode * inode );
4275static int usbhost_close (FAR struct inode * inode );
4376static 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