1 /*
2  * Copyright (c) 2022, sakumisu
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef USBH_MSC_H
7 #define USBH_MSC_H
8 
9 #include "usb_msc.h"
10 #include "usb_scsi.h"
11 
12 struct usbh_msc {
13     struct usbh_hubport *hport;
14     struct usb_endpoint_descriptor *bulkin;  /* Bulk IN endpoint */
15     struct usb_endpoint_descriptor *bulkout; /* Bulk OUT endpoint */
16     struct usbh_urb bulkin_urb;              /* Bulk IN urb */
17     struct usbh_urb bulkout_urb;             /* Bulk OUT urb */
18 
19     uint8_t intf; /* Data interface number */
20     uint8_t sdchar;
21     uint32_t blocknum;  /* Number of blocks on the USB mass storage device */
22     uint16_t blocksize; /* Block size of USB mass storage device */
23 
24     void *user_data;
25 };
26 
27 struct usbh_msc_modeswitch_config {
28     const char *name;
29     uint16_t vid; /* Vendor ID (for vendor/product specific devices) */
30     uint16_t pid; /* Product ID (for vendor/product specific devices) */
31     const uint8_t *message_content;
32 };
33 
34 void usbh_msc_modeswitch_enable(struct usbh_msc_modeswitch_config *config);
35 int usbh_msc_scsi_init(struct usbh_msc *msc_class);
36 int usbh_msc_scsi_write10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors);
37 int usbh_msc_scsi_read10(struct usbh_msc *msc_class, uint32_t start_sector, const uint8_t *buffer, uint32_t nsectors);
38 
39 void usbh_msc_run(struct usbh_msc *msc_class);
40 void usbh_msc_stop(struct usbh_msc *msc_class);
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 #ifdef __cplusplus
47 }
48 #endif
49 
50 #endif /* USBH_MSC_H */
51