Libraries/USB/src/USB/MSC/Device.h
Go to the documentation of this file.
1 /****
2  * MSC/Device.h
3  *
4  * Copyright 2023 mikee47 <mike@sillyhouse.net>
5  *
6  * This file is part of the Sming USB Library
7  *
8  * This library is free software: you can redistribute it and/or modify it under the terms of the
9  * GNU General Public License as published by the Free Software Foundation, version 3 or later.
10  *
11  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  * See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along with this library.
16  * If not, see <https://www.gnu.org/licenses/>.
17  *
18  ****/
19 
20 #pragma once
21 
22 #include <Storage/Device.h>
23 #include "../DeviceInterface.h"
24 
25 namespace USB::MSC
26 {
27 struct LogicalUnit {
29  bool readOnly;
30 
31  operator bool() const
32  {
33  return device != nullptr;
34  }
35 
36  void getCapacity(uint32_t* block_count, uint16_t* block_size)
37  {
38  if(device == nullptr) {
39  return;
40  }
41 
42  *block_size = device->getSectorSize();
43  *block_count = device->getSectorCount();
44  }
45 
46  int read(uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
47  {
48  if(device == nullptr) {
49  return -1;
50  }
51 
52  auto blockSize = device->getSectorSize();
53  offset += blockSize * lba;
54  return device->read(offset, buffer, bufsize) ? bufsize : -1;
55  }
56 
57  int write(uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize)
58  {
59  if(device == nullptr || readOnly) {
60  return -1;
61  }
62 
63  auto blockSize = device->getSectorSize();
64  offset += blockSize * lba;
65  return device->write(offset, buffer, bufsize) ? bufsize : -1;
66  }
67 };
68 
69 class Device : public DeviceInterface
70 {
71 public:
73 
74  static bool setLogicalUnit(uint8_t lun, LogicalUnit unit);
75 
76  static void getCapacity(uint8_t lun, uint32_t* block_count, uint16_t* block_size)
77  {
78  return getLogicalUnit(lun).getCapacity(block_count, block_size);
79  }
80 
81  static int read(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
82  {
83  return getLogicalUnit(lun).read(lba, offset, buffer, bufsize);
84  }
85 
86  static int write(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize)
87  {
88  return getLogicalUnit(lun).write(lba, offset, buffer, bufsize);
89  }
90 
91  static void inquiry(uint8_t lun, uint8_t vendor_id[8], uint8_t product_id[16], uint8_t product_rev[4]);
92 
93  static bool isReady(uint8_t lun)
94  {
95  return getLogicalUnit(lun);
96  }
97 
98  static bool isReadOnly(uint8_t lun)
99  {
100  return getLogicalUnit(lun).readOnly;
101  }
102 
103  static constexpr size_t MAX_LUN{4};
104 
105 private:
106  static LogicalUnit getLogicalUnit(uint8_t lun)
107  {
108  return (lun < MAX_LUN) ? logicalUnits[lun] : LogicalUnit{};
109  }
110 
111  static LogicalUnit logicalUnits[];
112 };
113 
114 } // namespace USB::MSC
Represents a storage device (e.g. flash memory)
Definition: Components/Storage/src/include/Storage/Device.h:34
virtual storage_size_t getSectorCount() const
Obtain total number of sectors on this device.
Definition: Components/Storage/src/include/Storage/Device.h:164
virtual bool read(storage_size_t address, void *dst, size_t size)=0
Read data from the storage device.
virtual bool write(storage_size_t address, const void *src, size_t size)=0
Write data to the storage device.
virtual uint16_t getSectorSize() const
Get sector size, the unit of allocation for block-access devices.
Definition: Components/Storage/src/include/Storage/Device.h:156
Base class to support a USB device interface implementation.
Definition: DeviceInterface.h:30
DeviceInterface(uint8_t instance, const char *name)
Constructor.
Definition: DeviceInterface.h:37
Definition: Libraries/USB/src/USB/MSC/Device.h:70
static void inquiry(uint8_t lun, uint8_t vendor_id[8], uint8_t product_id[16], uint8_t product_rev[4])
static constexpr size_t MAX_LUN
Definition: Libraries/USB/src/USB/MSC/Device.h:103
static bool isReady(uint8_t lun)
Definition: Libraries/USB/src/USB/MSC/Device.h:93
static int write(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t *buffer, uint32_t bufsize)
Definition: Libraries/USB/src/USB/MSC/Device.h:86
static int read(uint8_t lun, uint32_t lba, uint32_t offset, void *buffer, uint32_t bufsize)
Definition: Libraries/USB/src/USB/MSC/Device.h:81
static bool isReadOnly(uint8_t lun)
Definition: Libraries/USB/src/USB/MSC/Device.h:98
static void getCapacity(uint8_t lun, uint32_t *block_count, uint16_t *block_size)
Definition: Libraries/USB/src/USB/MSC/Device.h:76
static bool setLogicalUnit(uint8_t lun, LogicalUnit unit)
Definition: Libraries/USB/src/USB/MSC/Device.h:26
A physical device instance managed by an MSC interface.
Definition: Libraries/USB/src/USB/MSC/Device.h:27
bool readOnly
Definition: Libraries/USB/src/USB/MSC/Device.h:29
int read(uint32_t lba, uint32_t offset, void *buffer, uint32_t bufsize)
Definition: Libraries/USB/src/USB/MSC/Device.h:46
int write(uint32_t lba, uint32_t offset, uint8_t *buffer, uint32_t bufsize)
Definition: Libraries/USB/src/USB/MSC/Device.h:57
void getCapacity(uint32_t *block_count, uint16_t *block_size)
Definition: Libraries/USB/src/USB/MSC/Device.h:36
Storage::Device * device
Definition: Libraries/USB/src/USB/MSC/Device.h:28