rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
Functions | Variables
mass_storage_device.cpp File Reference

Detailed Description

Date
April 9, 2021
Author
Matthew Kennedy, (c) 2021

This file implements a USB mass storage device with multiple LUNs, so multiple drives can be mounted at once.

Definition in file mass_storage_device.cpp.

Functions

static uint32_t scsi_transport_transmit (const SCSITransport *transport, const uint8_t *data, size_t len)
 
static uint32_t scsi_transport_transmit_start (const SCSITransport *transport, const uint8_t *data, size_t len)
 
static uint32_t scsi_transport_transmit_wait (const SCSITransport *transport)
 
static uint32_t scsi_transport_receive (const SCSITransport *transport, uint8_t *data, size_t len)
 
bool msd_request_hook_new (USBDriver *usbp)
 

Variables

static const scsi_inquiry_response_t default_scsi_inquiry_response
 Hardcoded default SCSI inquiry response structure.
 
static const scsi_unit_serial_number_inquiry_response_t default_scsi_unit_serial_number_inquiry_response
 Hardcoded default SCSI unit serial number inquiry response structure.
 

Function Documentation

◆ msd_request_hook_new()

bool msd_request_hook_new ( USBDriver *  usbp)

Definition at line 211 of file mass_storage_device.cpp.

211 {
212 /* check that the request is for interface 0.*/
213 if (MSD_SETUP_INDEX(usbp->setup) != 0) {
214 return false;
215 }
216
217 if (usbp->setup[0] == (USB_RTYPE_TYPE_CLASS | USB_RTYPE_RECIPIENT_INTERFACE | USB_RTYPE_DIR_HOST2DEV)
218 && usbp->setup[1] == MSD_REQ_RESET) {
219 /* Bulk-Only Mass Storage Reset (class-specific request)
220 This request is used to reset the mass storage device and its associated interface.
221 This class-specific request shall ready the device for the next CBW from the host. */
222 /* Do any special reset code here. */
223 /* The device shall NAK the status stage of the device request until
224 * the Bulk-Only Mass Storage Reset is complete.
225 * NAK EP1 in and out */
226 // usbp->otg->ie[1].DIEPCTL = DIEPCTL_SNAK;
227 // usbp->otg->oe[1].DOEPCTL = DOEPCTL_SNAK;
228 /* response to this request using EP0 */
229 usbSetupTransfer(usbp, 0, 0, NULL);
230 return true;
231 } else if (usbp->setup[0] == (USB_RTYPE_TYPE_CLASS | USB_RTYPE_RECIPIENT_INTERFACE | USB_RTYPE_DIR_DEV2HOST)
232 && usbp->setup[1] == MSD_REQ_GET_MAX_LUN) {
233 /* Return the maximum supported LUN. */
234 static uint8_t zero = USB_MSD_LUN_COUNT - 1;
235 usbSetupTransfer(usbp, &zero, 1, NULL);
236 return true;
237 }
238
239 return false;
240}

Referenced by hybridRequestHook().

Here is the caller graph for this function:

◆ scsi_transport_receive()

static uint32_t scsi_transport_receive ( const SCSITransport *  transport,
uint8_t *  data,
size_t  len 
)
static

Definition at line 66 of file mass_storage_device.cpp.

67 {
68 usb_scsi_transport_handler_t *trp = reinterpret_cast<usb_scsi_transport_handler_t*>(transport->handler);
69 msg_t status = usbReceive(trp->usbp, trp->ep, data, len);
70 if (MSG_RESET != status)
71 return status;
72 else
73 return 0;
74}

Referenced by MassStorageController::MassStorageController().

Here is the caller graph for this function:

◆ scsi_transport_transmit()

static uint32_t scsi_transport_transmit ( const SCSITransport *  transport,
const uint8_t *  data,
size_t  len 
)
static

Definition at line 37 of file mass_storage_device.cpp.

38 {
39 usb_scsi_transport_handler_t *trp = reinterpret_cast<usb_scsi_transport_handler_t*>(transport->handler);
40 msg_t status = usbTransmit(trp->usbp, trp->ep, data, len);
41 if (MSG_OK == status)
42 return len;
43 else
44 return 0;
45}

Referenced by MassStorageController::MassStorageController().

Here is the caller graph for this function:

◆ scsi_transport_transmit_start()

static uint32_t scsi_transport_transmit_start ( const SCSITransport *  transport,
const uint8_t *  data,
size_t  len 
)
static

Definition at line 47 of file mass_storage_device.cpp.

48 {
49 usb_scsi_transport_handler_t *trp = reinterpret_cast<usb_scsi_transport_handler_t*>(transport->handler);
50 msg_t status = usbTransmitStart(trp->usbp, trp->ep, data, len);
51 if (MSG_OK == status)
52 return len;
53 else
54 return 0;
55}

Referenced by MassStorageController::MassStorageController().

Here is the caller graph for this function:

◆ scsi_transport_transmit_wait()

static uint32_t scsi_transport_transmit_wait ( const SCSITransport *  transport)
static

Definition at line 57 of file mass_storage_device.cpp.

57 {
58 usb_scsi_transport_handler_t *trp = reinterpret_cast<usb_scsi_transport_handler_t*>(transport->handler);
59 msg_t status = usbTransmitWait(trp->usbp, trp->ep);
60 if (MSG_OK == status)
61 return 0;
62 else
63 return 1;
64}

Referenced by MassStorageController::MassStorageController().

Here is the caller graph for this function:

Variable Documentation

◆ default_scsi_inquiry_response

const scsi_inquiry_response_t default_scsi_inquiry_response
static
Initial value:
= {
0x00,
0x80,
0x04,
0x02,
0x20,
0x00,
0x00,
0x00,
"Chibios",
"Mass Storage",
{'v',CH_KERNEL_MAJOR+'0','.',CH_KERNEL_MINOR+'0'}
}

Hardcoded default SCSI inquiry response structure.

Definition at line 156 of file mass_storage_device.cpp.

156 {
157 0x00, /* direct access block device */
158 0x80, /* removable */
159 0x04, /* SPC-2 */
160 0x02, /* response data format */
161 0x20, /* response has 0x20 + 4 bytes */
162 0x00,
163 0x00,
164 0x00,
165 "Chibios",
166 "Mass Storage",
167 {'v',CH_KERNEL_MAJOR+'0','.',CH_KERNEL_MINOR+'0'}
168};

Referenced by MassStorageController::attachLun().

◆ default_scsi_unit_serial_number_inquiry_response

const scsi_unit_serial_number_inquiry_response_t default_scsi_unit_serial_number_inquiry_response
static
Initial value:
=
{
0x00,
0x80,
0x00,
0x08,
"0000000"
}

Hardcoded default SCSI unit serial number inquiry response structure.

Definition at line 173 of file mass_storage_device.cpp.

174{
175 0x00,
176 0x80,
177 0x00,
178 0x08,
179 "0000000"
180};

Referenced by MassStorageController::attachLun().

Go to the source code of this file.