1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
|
//*****************************************************************************
//
// usbdmsc.h - USB mass storage device class driver.
//
// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved.
// Software License Agreement
//
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
//
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 2.1.0.12573 of the Tiva USB Library.
//
//*****************************************************************************
#ifndef __USBDMSC_H__
#define __USBDMSC_H__
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif
//*****************************************************************************
//
//! \addtogroup msc_device_class_api
//! @{
//
//*****************************************************************************
//*****************************************************************************
//
//! Media Access functions.
//
//*****************************************************************************
typedef struct
{
//
//! This function is used to initialize and open the physical drive number
//! associated with the parameter \e ui32Drive. The function returns
//! zero if the drive could not be opened for some reason. In the case of
//! removable device like an SD card this function must return zero if
//! the SD card is not present.
//! The function returns a pointer to data that should be passed to other
//! APIs or returns 0 if no drive was found.
//
void *(*pfnOpen)(uint32_t ui32Drive);
//*************************************************************************
//
//! This function closes the drive number in use by the mass storage class
//! device. The \e pvDrive is the pointer that was returned from a call to
//! \e pfnOpen. This function is used to close the physical drive
//! number associated with the parameter \e pvDrive. This function
//! returns 0 if the drive was closed successfully and any other value
//! indicates a failure.
//
//*************************************************************************
void (*pfnClose)(void *pvDrive);
//*************************************************************************
//
//! This function reads a block of data from a device opened by the
//! \e pfnOpen call. The \e pvDrive parameter is the pointer that was
//! returned from the original call to \e pfnOpen. The \e pui8Data
//! parameter is the buffer that data will be written into. The data area
//! pointed to by \e pui8Data must be at least \e ui32NumBlocks * Block
//! Size bytes to prevent overwriting data. The \e ui32Sector is the block
//! address to read and \e ui32NumBlocks is the number of blocks to read.
//! This function returns the number of bytes that were read from the
//! and placed into the \e pui8Data buffer..
//
//*************************************************************************
uint32_t (*pfnBlockRead)(void *pvDrive, uint8_t *pui8Data,
uint32_t ui32Sector, uint32_t ui32NumBlocks);
//*************************************************************************
//
//! This function is use to write blocks to a physical device from the
//! buffer pointed to by the \e pui8Data buffer. The \e pvDrive parameter
//! is the pointer that was returned from the original call to \e pfnOpen.
//! The \e pui8Data is the pointer to the data to write to the storage
//! device and \e ui32NumBlocks is the number of blocks to write. The
//! \e ui32Sector parameter is the sector number used to write the block.
//! If the number of blocks is greater than one then the block address
//! increments and writes to the next block until
//! \e ui32NumBlocks * Block Size bytes are written. This function returns
//! the number of bytes that were written to the device.
//
//*************************************************************************
uint32_t (*pfnBlockWrite)(void *pvDrive, uint8_t *pui8Data,
uint32_t ui32Sector, uint32_t ui32NumBlocks);
//*************************************************************************
//
//! This function returns the total number of blocks on a physical device
//! based on the \e pvDrive parameter. The \e pvDrive parameter
//! is the pointer that was returned from the original call to \e pfnOpen.
//
//*************************************************************************
uint32_t (*pfnNumBlocks)(void *pvDrive);
//*************************************************************************
//
//! This function returns the block size for a physical device based on the
//! \e pvDrive parameter. The \e pvDrive parameter is the pointer
//! that was returned from the original call to \e pfnOpen.
//
//*************************************************************************
uint32_t (*pfnBlockSize)(void *pvDrive);
}
tMSCDMedia;
//*****************************************************************************
//
// These defines control the default sizes of USB transfers for data and
// commands.
//
//*****************************************************************************
#define DEVICE_BLOCK_SIZE 512
//*****************************************************************************
//
// USBDMSCMediaChange() tUSBDMSCMediaStatus values.
//
//*****************************************************************************
typedef enum
{
eUSBDMSCMediaPresent,
eUSBDMSCMediaNotPresent,
eUSBDMSCMediaStopped,
eUSBDMSCMediaUnknown
}
tUSBDMSCMediaStatus;
//*****************************************************************************
//
// PRIVATE
//
// This structure defines the private instance data and state variables for the
// mass storage class. The memory for this structure is in the the
// sPrivateData field in the tUSBDMSCDevice structure passed on
// USBDMSCInit() and should not be modified by any code outside of the mass
// storage device code.
//
//*****************************************************************************
typedef struct
{
//
// Base address for the USB controller.
//
uint32_t ui32USBBase;
//
// The device info to interact with the lower level DCD code.
//
tDeviceInfo sDevInfo;
//
// These three values are used to return the current sense data for an
// instance of the mass storage class.
//
uint8_t ui8ErrorCode;
uint8_t ui8SenseKey;
uint16_t ui16AddSenseCode;
//
// The pointer to the instance returned from the Open call to the media.
//
void *pvMedia;
//
// The connection status of the device.
//
volatile bool bConnected;
//
// Holds the flag settings for this instance.
//
uint32_t ui32Flags;
//
// Holds the current media status.
//
tUSBDMSCMediaStatus iMediaStatus;
//
// MSC block buffer.
//
uint32_t pui32Buffer[0x1000>>2];
//
// Current number of bytes to transfer.
//
uint32_t ui32BytesToTransfer;
//
// The LBA for the current transfer.
//
uint32_t ui32CurrentLBA;
//
// The IN endpoint number, this is modified in composite devices.
//
uint8_t ui8INEndpoint;
//
// The IN DMA channel.
//
uint8_t ui8INDMA;
//
// The OUT endpoint number, this is modified in composite devices.
//
uint8_t ui8OUTEndpoint;
//
// The OUT DMA channel.
//
uint8_t ui8OUTDMA;
//
// The bulk class interface number, this is modified in composite devices.
//
uint8_t ui8Interface;
//
// Active SCSI state.
//
uint8_t ui8SCSIState;
//
// A copy of the DMA instance data used with calls to USBLibDMA functions.
//
tUSBDMAInstance *psDMAInstance;
}
tMSCInstance;
//*****************************************************************************
//
// This is the size of the g_pui8MSCInterface array in bytes.
//
//*****************************************************************************
#define MSCINTERFACE_SIZE (23)
//*****************************************************************************
//
//! The size of the memory that should be allocated to create a configuration
//! descriptor for a single instance of the USB Audio Device.
//! This does not include the configuration descriptor which is automatically
//! ignored by the composite device class.
//
//
//*****************************************************************************
#define COMPOSITE_DMSC_SIZE (MSCINTERFACE_SIZE)
//*****************************************************************************
//
//! The structure used by the application to define operating parameters for
//! the mass storage device.
//
//*****************************************************************************
typedef struct
{
//
//! The vendor ID that this device is to present in the device descriptor.
//
const uint16_t ui16VID;
//
//! The product ID that this device is to present in the device descriptor.
//
const uint16_t ui16PID;
//
//! 8 byte vendor string.
//
const uint8_t pui8Vendor[8];
//
//! 16 byte vendor string.
//
const uint8_t pui8Product[16];
//
//! 4 byte vendor string.
//
const uint8_t pui8Version[4];
//
//! The maximum power consumption of the device, expressed in milliamps.
//
const uint16_t ui16MaxPowermA;
//
//! Indicates whether the device is self or bus-powered and whether or not
//! it supports remote wakeup. Valid values are \b USB_CONF_ATTR_SELF_PWR
//! or \b USB_CONF_ATTR_BUS_PWR, optionally ORed with
//! \b USB_CONF_ATTR_RWAKE.
//
const uint8_t ui8PwrAttributes;
//
//! A pointer to the string descriptor array for this device. This array
//! must contain the following string descriptor pointers in this order.
//! Language descriptor, Manufacturer name string (language 1), Product
//! name string (language 1), Serial number string (language 1), MSC
//! Interface description string (language 1), Configuration description
//! string (language 1).
//!
//! If supporting more than 1 language, the descriptor block (except for
//! string descriptor 0) must be repeated for each language defined in the
//! language descriptor.
//!
//
const uint8_t * const *ppui8StringDescriptors;
//
//! The number of descriptors provided in the \e ppStringDescriptors
//! array. This must be 1 + ((5 + (num HID strings)) * (num languages)).
//
const uint32_t ui32NumStringDescriptors;
//
//! This structure holds the access functions for the media used by this
//! instance of the mass storage class device. All of the functions in
//! this structure are required to be filled out with valid functions.
//
const tMSCDMedia sMediaFunctions;
//
//! This is the callback function for various events that occur during
//! mass storage class operation.
//
const tUSBCallback pfnEventCallback;
//
//! The private instance data for this device. This memory
//! must remain accessible for as long as the MSC device is in use and
//! must not be modified by any code outside the MSC class driver.
//
tMSCInstance sPrivateData;
}
tUSBDMSCDevice;
//*****************************************************************************
//
// MSC-specific device class driver events
//
//*****************************************************************************
//*****************************************************************************
//
//! This event indicates that the host has completed other operations and is
//! no longer accessing the device.
//
//*****************************************************************************
#define USBD_MSC_EVENT_IDLE (USBD_MSC_EVENT_BASE + 0)
//*****************************************************************************
//
//! This event indicates that the host is reading the storage media.
//
//*****************************************************************************
#define USBD_MSC_EVENT_READING (USBD_MSC_EVENT_BASE + 1)
//*****************************************************************************
//
//! This event indicates that the host is writing to the storage media.
//
//*****************************************************************************
#define USBD_MSC_EVENT_WRITING (USBD_MSC_EVENT_BASE + 2)
//*****************************************************************************
//
// API Function Prototypes
//
//*****************************************************************************
extern void *USBDMSCInit(uint32_t ui32Index,
tUSBDMSCDevice *psMSCDevice);
extern void *USBDMSCCompositeInit(uint32_t ui32Index,
tUSBDMSCDevice *psMSCDevice,
tCompositeEntry *psCompEntry);
extern void USBDMSCTerm(void *pvInstance);
extern void USBDMSCMediaChange(void *pvInstance,
tUSBDMSCMediaStatus eMediaStatus);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif
#endif
|