#include <mass_storage_device.h>
|
| MassStorageController (USBDriver *usb) |
|
void | attachLun (uint8_t lunIndex, BaseBlockDevice *blkdev, uint8_t *blkbuf, size_t blkbufsize, const scsi_inquiry_response_t *inquiry, const scsi_unit_serial_number_inquiry_response_t *serialInquiry) |
|
| ThreadController (const char *name, tprio_t priority) |
|
void | start () |
| Start the thread.
|
|
void | stop () |
| Request thread termination and waits for termination.
|
|
|
void | sendCsw (uint8_t status, uint32_t residue) |
|
Definition at line 15 of file mass_storage_device.h.
◆ MassStorageController()
MassStorageController::MassStorageController |
( |
USBDriver * |
usb | ) |
|
Definition at line 76 of file mass_storage_device.cpp.
79 for (size_t i = 0; i < USB_MSD_LUN_COUNT; i++) {
80 scsiObjectInit(&
m_luns[i].target);
81 }
82
90}
LunEntry m_luns[USB_MSD_LUN_COUNT]
SCSITransport m_scsiTransport
usb_scsi_transport_handler_t m_scsiTransportHandler
A base class for a controller that requires its own thread.
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)
static uint32_t scsi_transport_transmit(const SCSITransport *transport, const uint8_t *data, size_t len)
◆ attachLun()
void MassStorageController::attachLun |
( |
uint8_t |
lunIndex, |
|
|
BaseBlockDevice * |
blkdev, |
|
|
uint8_t * |
blkbuf, |
|
|
size_t |
blkbufsize, |
|
|
const scsi_inquiry_response_t * |
inquiry, |
|
|
const scsi_unit_serial_number_inquiry_response_t * |
serialInquiry |
|
) |
| |
Definition at line 182 of file mass_storage_device.cpp.
185 {
187
188 auto& lun =
m_luns[lunIndex];
189
190
191 if (NULL == inquiry) {
193 }
194 else {
195 lun.config.inquiry_response = inquiry;
196 }
197 if (NULL == serialInquiry) {
199 }
200 else {
201 lun.config.unit_serial_number_inquiry_response = serialInquiry;
202 }
203 lun.config.blkbuf =
blkbuf;
204 lun.config.blkbufsize = blkbufsize;
205 lun.config.blkdev = blkdev;
207
208 scsiStart(&lun.target, &lun.config);
209}
chibios_rt::Mutex m_lunMutex
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.
static const scsi_inquiry_response_t default_scsi_inquiry_response
Hardcoded default SCSI inquiry response structure.
uint8_t blkbuf[4 *MMCSD_BLOCK_SIZE]
Referenced by attachMsdSdCard(), deattachMsdSdCard(), and initUsbMsd().
◆ cbwMeaningful()
bool MassStorageController::cbwMeaningful |
( |
const msd_cbw_t & |
cbw | ) |
|
|
staticprivate |
Definition at line 128 of file mass_storage_device.cpp.
128 {
129 if ((cbw.cmd_len & CBW_CMD_LEN_RESERVED_MASK) != 0) {
130 return false;
131 }
132
133 if ((cbw.flags & CBW_FLAGS_RESERVED_MASK) != 0) {
134 return false;
135 }
136
137 if (cbw.lun >= USB_MSD_LUN_COUNT) {
138 return false;
139 }
140
141 return true;
142}
Referenced by ThreadTask().
◆ cbwValid()
bool MassStorageController::cbwValid |
( |
const msd_cbw_t & |
cbw, |
|
|
msg_t |
status |
|
) |
| |
|
staticprivate |
Definition at line 114 of file mass_storage_device.cpp.
114 {
115
116 if (sizeof(msd_cbw_t) != recvd) {
117 return false;
118 }
119
120
121 if (cbw.signature != MSD_CBW_SIGNATURE) {
122 return false;
123 }
124
125 return true;
126}
Referenced by ThreadTask().
◆ sendCsw()
void MassStorageController::sendCsw |
( |
uint8_t |
status, |
|
|
uint32_t |
residue |
|
) |
| |
|
private |
◆ ThreadTask()
void MassStorageController::ThreadTask |
( |
| ) |
|
|
overrideprotectedvirtual |
Implements ThreadController< USB_MSD_THREAD_WA_SIZE >.
Definition at line 92 of file mass_storage_device.cpp.
92 {
93 while (!chThdShouldTerminateX()) {
94 const msg_t status = usbReceive(
m_usb, USB_MSD_DATA_EP, (uint8_t*)&
m_cbw,
sizeof(
m_cbw));
95
96 if (MSG_RESET == status) {
97 chThdSleepMilliseconds(50);
98 continue;
99 }
100
103 if (SCSI_SUCCESS == scsiExecCmd(target,
m_cbw.cmd_data)) {
105 } else {
106 sendCsw(CSW_STATUS_FAILED, scsiResidue(target));
107 }
108 } else {
109
110 }
111 }
112}
void sendCsw(uint8_t status, uint32_t residue)
static bool cbwValid(const msd_cbw_t &cbw, msg_t status)
static bool cbwMeaningful(const msd_cbw_t &cbw)
◆ m_cbw
msd_cbw_t MassStorageController::m_cbw |
|
private |
◆ m_csw
msd_csw_t MassStorageController::m_csw |
|
private |
◆ m_lunMutex
chibios_rt::Mutex MassStorageController::m_lunMutex |
|
private |
◆ m_luns
LunEntry MassStorageController::m_luns[USB_MSD_LUN_COUNT] |
|
private |
◆ m_scsiTransport
SCSITransport MassStorageController::m_scsiTransport |
|
private |
◆ m_scsiTransportHandler
usb_scsi_transport_handler_t MassStorageController::m_scsiTransportHandler |
|
private |
◆ m_state
usbmsdstate_t MassStorageController::m_state |
|
private |
◆ m_usb
USBDriver* const MassStorageController::m_usb |
|
private |
The documentation for this class was generated from the following files: