USB composite device example program, drag-and-drop flash writer.
Dependencies: SWD USBDevice mbed BaseDAP
USBMSD_Drop/RomDisk.h@1:ea8e179320d7, 2013-09-28 (annotated)
- Committer:
- va009039
- Date:
- Sat Sep 28 03:21:14 2013 +0000
- Revision:
- 1:ea8e179320d7
add USBMSD_Drop class. add CDC(Virtual COM) and HID(for example CMSIS-DAP), but KL25Z not work.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 1:ea8e179320d7 | 1 | // RomDisk.h 2013/9/26 |
va009039 | 1:ea8e179320d7 | 2 | #pragma once |
va009039 | 1:ea8e179320d7 | 3 | |
va009039 | 1:ea8e179320d7 | 4 | #define ATTR_READ_ONLY 0x01 |
va009039 | 1:ea8e179320d7 | 5 | #define ATTR_HIDDEN 0x02 |
va009039 | 1:ea8e179320d7 | 6 | #define ATTR_SYSTEM 0x04 |
va009039 | 1:ea8e179320d7 | 7 | #define ATTR_VOLUME_ID 0x08 |
va009039 | 1:ea8e179320d7 | 8 | #define ATTR_DIRECTORY 0x10 |
va009039 | 1:ea8e179320d7 | 9 | #define ATTR_ARCHIVE 0x20 |
va009039 | 1:ea8e179320d7 | 10 | #define ATTR_LONG_NAME (ATTR_READ_ONLY|ATTR_HIDDEN|ATTR_SYSTEM|ATTR_VOLUME_ID) |
va009039 | 1:ea8e179320d7 | 11 | |
va009039 | 1:ea8e179320d7 | 12 | struct DirEntry { |
va009039 | 1:ea8e179320d7 | 13 | uint8_t name[8+3]; |
va009039 | 1:ea8e179320d7 | 14 | uint8_t attr; |
va009039 | 1:ea8e179320d7 | 15 | uint8_t NTres; |
va009039 | 1:ea8e179320d7 | 16 | uint8_t cDateTime_ms; |
va009039 | 1:ea8e179320d7 | 17 | uint16_t cTime; |
va009039 | 1:ea8e179320d7 | 18 | uint16_t cDate; |
va009039 | 1:ea8e179320d7 | 19 | uint16_t aDate; |
va009039 | 1:ea8e179320d7 | 20 | uint16_t clusterHI; |
va009039 | 1:ea8e179320d7 | 21 | uint16_t mTime; |
va009039 | 1:ea8e179320d7 | 22 | uint16_t mDate; |
va009039 | 1:ea8e179320d7 | 23 | uint16_t cluster; |
va009039 | 1:ea8e179320d7 | 24 | uint32_t size; |
va009039 | 1:ea8e179320d7 | 25 | bool is_free() { |
va009039 | 1:ea8e179320d7 | 26 | return name[0] == 0xe5 || name[0] == 0x00; |
va009039 | 1:ea8e179320d7 | 27 | } |
va009039 | 1:ea8e179320d7 | 28 | bool is_file() { |
va009039 | 1:ea8e179320d7 | 29 | return is_free() == false && attr == ATTR_ARCHIVE; |
va009039 | 1:ea8e179320d7 | 30 | } |
va009039 | 1:ea8e179320d7 | 31 | int cmpDateTime(DirEntry* entry) { |
va009039 | 1:ea8e179320d7 | 32 | if (mDate > entry->mDate) { |
va009039 | 1:ea8e179320d7 | 33 | return 1; |
va009039 | 1:ea8e179320d7 | 34 | } else if (mDate < entry->mDate) { |
va009039 | 1:ea8e179320d7 | 35 | return -1; |
va009039 | 1:ea8e179320d7 | 36 | } |
va009039 | 1:ea8e179320d7 | 37 | if (mTime > entry->mTime) { |
va009039 | 1:ea8e179320d7 | 38 | return 1; |
va009039 | 1:ea8e179320d7 | 39 | } else if (mTime < entry->mTime) { |
va009039 | 1:ea8e179320d7 | 40 | return -1; |
va009039 | 1:ea8e179320d7 | 41 | } |
va009039 | 1:ea8e179320d7 | 42 | return 0; |
va009039 | 1:ea8e179320d7 | 43 | } |
va009039 | 1:ea8e179320d7 | 44 | } __attribute__((__packed__));; |
va009039 | 1:ea8e179320d7 | 45 | |
va009039 | 1:ea8e179320d7 | 46 | struct SectorIndex { |
va009039 | 1:ea8e179320d7 | 47 | int block; |
va009039 | 1:ea8e179320d7 | 48 | const uint8_t* data; |
va009039 | 1:ea8e179320d7 | 49 | }; |
va009039 | 1:ea8e179320d7 | 50 | |
va009039 | 1:ea8e179320d7 | 51 | extern const SectorIndex sector_index[]; // RomDiskData.cpp |
va009039 | 1:ea8e179320d7 | 52 | |
va009039 | 1:ea8e179320d7 | 53 | class RomDisk { |
va009039 | 1:ea8e179320d7 | 54 | public: |
va009039 | 1:ea8e179320d7 | 55 | RomDisk(); |
va009039 | 1:ea8e179320d7 | 56 | int read(uint8_t * data, uint32_t block); |
va009039 | 1:ea8e179320d7 | 57 | int write(const uint8_t * data, uint32_t block); |
va009039 | 1:ea8e179320d7 | 58 | uint32_t sectors(); |
va009039 | 1:ea8e179320d7 | 59 | bool is_fat(uint32_t sector); |
va009039 | 1:ea8e179320d7 | 60 | bool is_rootdir(uint32_t sector); |
va009039 | 1:ea8e179320d7 | 61 | int dir_count(uint32_t sector); |
va009039 | 1:ea8e179320d7 | 62 | uint32_t cluster_to_sector(uint32_t cluster); |
va009039 | 1:ea8e179320d7 | 63 | protected: |
va009039 | 1:ea8e179320d7 | 64 | uint64_t _sectors; |
va009039 | 1:ea8e179320d7 | 65 | }; |