USB Device ROM Stack API example program
LPC1549のROM APIを使ったRAMディスクです。PCからはUSBメモリとして見えます。
参考:
http://docs.lpcware.com/usbromlib/v1.0/
usbd_user_msc.c@0:ef2c0c52abc4, 2014-03-14 (annotated)
- Committer:
- va009039
- Date:
- Fri Mar 14 09:14:16 2014 +0000
- Revision:
- 0:ef2c0c52abc4
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:ef2c0c52abc4 | 1 | #include <rl_usb.h> |
va009039 | 0:ef2c0c52abc4 | 2 | |
va009039 | 0:ef2c0c52abc4 | 3 | // from USBMSD_Ram.cpp http://mbed.org/users/samux/code/RAM_DISK/ |
va009039 | 0:ef2c0c52abc4 | 4 | //5 sectors |
va009039 | 0:ef2c0c52abc4 | 5 | const uint8_t disk_image_0[] = { |
va009039 | 0:ef2c0c52abc4 | 6 | //sector 0: boot sector |
va009039 | 0:ef2c0c52abc4 | 7 | 0xEB,0x3C,0x90,0x4D,0x53,0x44,0x4F,0x53,0x35,0x2E,0x30, 0x00,0x02,/*bytes per sector: 512*/ 0x08, /*sectors per cluster*/ 0x01,0x00,/*number of reserved sector*/ |
va009039 | 0:ef2c0c52abc4 | 8 | 0x01, /* number of FATs*/ 0x10,0x00, /*Maximum number of root directory entries: 16*/ 0x20,0x00, /*Total sector count: 32*/ 0xF0, 0x02,0x00,/*sectors per FAT: 2*/ 0x01,0x00,/*Sectors per track*/ 0x01,0x00, /*Number of heads*/ 0x00,0x00,0x00,0x00, |
va009039 | 0:ef2c0c52abc4 | 9 | 0x00,0x01,0x00,0x00,0x00,0x00, 0x29, /*boot signature*/ 0x74,0x19,0x02,0x27, /*volume ID*/ 'M','b','e','d',' ', |
va009039 | 0:ef2c0c52abc4 | 10 | 'U','S','B',' ',' ',' ', /*volume label: Mbed USB*/ 0x46,0x41,0x54,0x31,0x32,0x20,0x20,0x20,0x33,0xC9, |
va009039 | 0:ef2c0c52abc4 | 11 | 0x8E,0xD1,0xBC,0xF0,0x7B,0x8E,0xD9,0xB8,0x00,0x20,0x8E,0xC0,0xFC,0xBD,0x00,0x7C, |
va009039 | 0:ef2c0c52abc4 | 12 | 0x38,0x4E,0x24,0x7D,0x24,0x8B,0xC1,0x99,0xE8,0x3C,0x01,0x72,0x1C,0x83,0xEB,0x3A, |
va009039 | 0:ef2c0c52abc4 | 13 | 0x66,0xA1,0x1C,0x7C,0x26,0x66,0x3B,0x07,0x26,0x8A,0x57,0xFC,0x75,0x06,0x80,0xCA, |
va009039 | 0:ef2c0c52abc4 | 14 | 0x02,0x88,0x56,0x02,0x80,0xC3,0x10,0x73,0xEB,0x33,0xC9,0x8A,0x46,0x10,0x98,0xF7, |
va009039 | 0:ef2c0c52abc4 | 15 | 0x66,0x16,0x03,0x46,0x1C,0x13,0x56,0x1E,0x03,0x46,0x0E,0x13,0xD1,0x8B,0x76,0x11, |
va009039 | 0:ef2c0c52abc4 | 16 | 0x60,0x89,0x46,0xFC,0x89,0x56,0xFE,0xB8,0x20,0x00,0xF7,0xE6,0x8B,0x5E,0x0B,0x03, |
va009039 | 0:ef2c0c52abc4 | 17 | 0xC3,0x48,0xF7,0xF3,0x01,0x46,0xFC,0x11,0x4E,0xFE,0x61,0xBF,0x00,0x00,0xE8,0xE6, |
va009039 | 0:ef2c0c52abc4 | 18 | 0x00,0x72,0x39,0x26,0x38,0x2D,0x74,0x17,0x60,0xB1,0x0B,0xBE,0xA1,0x7D,0xF3,0xA6, |
va009039 | 0:ef2c0c52abc4 | 19 | 0x61,0x74,0x32,0x4E,0x74,0x09,0x83,0xC7,0x20,0x3B,0xFB,0x72,0xE6,0xEB,0xDC,0xA0, |
va009039 | 0:ef2c0c52abc4 | 20 | 0xFB,0x7D,0xB4,0x7D,0x8B,0xF0,0xAC,0x98,0x40,0x74,0x0C,0x48,0x74,0x13,0xB4,0x0E, |
va009039 | 0:ef2c0c52abc4 | 21 | 0xBB,0x07,0x00,0xCD,0x10,0xEB,0xEF,0xA0,0xFD,0x7D,0xEB,0xE6,0xA0,0xFC,0x7D,0xEB, |
va009039 | 0:ef2c0c52abc4 | 22 | 0xE1,0xCD,0x16,0xCD,0x19,0x26,0x8B,0x55,0x1A,0x52,0xB0,0x01,0xBB,0x00,0x00,0xE8, |
va009039 | 0:ef2c0c52abc4 | 23 | 0x3B,0x00,0x72,0xE8,0x5B,0x8A,0x56,0x24,0xBE,0x0B,0x7C,0x8B,0xFC,0xC7,0x46,0xF0, |
va009039 | 0:ef2c0c52abc4 | 24 | 0x3D,0x7D,0xC7,0x46,0xF4,0x29,0x7D,0x8C,0xD9,0x89,0x4E,0xF2,0x89,0x4E,0xF6,0xC6, |
va009039 | 0:ef2c0c52abc4 | 25 | 0x06,0x96,0x7D,0xCB,0xEA,0x03,0x00,0x00,0x20,0x0F,0xB6,0xC8,0x66,0x8B,0x46,0xF8, |
va009039 | 0:ef2c0c52abc4 | 26 | 0x66,0x03,0x46,0x1C,0x66,0x8B,0xD0,0x66,0xC1,0xEA,0x10,0xEB,0x5E,0x0F,0xB6,0xC8, |
va009039 | 0:ef2c0c52abc4 | 27 | 0x4A,0x4A,0x8A,0x46,0x0D,0x32,0xE4,0xF7,0xE2,0x03,0x46,0xFC,0x13,0x56,0xFE,0xEB, |
va009039 | 0:ef2c0c52abc4 | 28 | 0x4A,0x52,0x50,0x06,0x53,0x6A,0x01,0x6A,0x10,0x91,0x8B,0x46,0x18,0x96,0x92,0x33, |
va009039 | 0:ef2c0c52abc4 | 29 | 0xD2,0xF7,0xF6,0x91,0xF7,0xF6,0x42,0x87,0xCA,0xF7,0x76,0x1A,0x8A,0xF2,0x8A,0xE8, |
va009039 | 0:ef2c0c52abc4 | 30 | 0xC0,0xCC,0x02,0x0A,0xCC,0xB8,0x01,0x02,0x80,0x7E,0x02,0x0E,0x75,0x04,0xB4,0x42, |
va009039 | 0:ef2c0c52abc4 | 31 | 0x8B,0xF4,0x8A,0x56,0x24,0xCD,0x13,0x61,0x61,0x72,0x0B,0x40,0x75,0x01,0x42,0x03, |
va009039 | 0:ef2c0c52abc4 | 32 | 0x5E,0x0B,0x49,0x75,0x06,0xF8,0xC3,0x41,0xBB,0x00,0x00,0x60,0x66,0x6A,0x00,0xEB, |
va009039 | 0:ef2c0c52abc4 | 33 | 0xB0,0x4E,0x54,0x4C,0x44,0x52,0x20,0x20,0x20,0x20,0x20,0x20,0x0D,0x0A,0x52,0x65, |
va009039 | 0:ef2c0c52abc4 | 34 | 0x6D,0x6F,0x76,0x65,0x20,0x64,0x69,0x73,0x6B,0x73,0x20,0x6F,0x72,0x20,0x6F,0x74, |
va009039 | 0:ef2c0c52abc4 | 35 | 0x68,0x65,0x72,0x20,0x6D,0x65,0x64,0x69,0x61,0x2E,0xFF,0x0D,0x0A,0x44,0x69,0x73, |
va009039 | 0:ef2c0c52abc4 | 36 | 0x6B,0x20,0x65,0x72,0x72,0x6F,0x72,0xFF,0x0D,0x0A,0x50,0x72,0x65,0x73,0x73,0x20, |
va009039 | 0:ef2c0c52abc4 | 37 | 0x61,0x6E,0x79,0x20,0x6B,0x65,0x79,0x20,0x74,0x6F,0x20,0x72,0x65,0x73,0x74,0x61, |
va009039 | 0:ef2c0c52abc4 | 38 | 0x72,0x74,0x0D,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAC,0xCB,0xD8,0x55,0xAA, |
va009039 | 0:ef2c0c52abc4 | 39 | }; |
va009039 | 0:ef2c0c52abc4 | 40 | |
va009039 | 0:ef2c0c52abc4 | 41 | const uint8_t disk_image_1[] = { |
va009039 | 0:ef2c0c52abc4 | 42 | //sector 1: FAT 1 |
va009039 | 0:ef2c0c52abc4 | 43 | 0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F, |
va009039 | 0:ef2c0c52abc4 | 44 | }; |
va009039 | 0:ef2c0c52abc4 | 45 | |
va009039 | 0:ef2c0c52abc4 | 46 | const uint8_t disk_image_2[] = { |
va009039 | 0:ef2c0c52abc4 | 47 | //sector 2: FAT1: two sectors per FAT |
va009039 | 0:ef2c0c52abc4 | 48 | }; |
va009039 | 0:ef2c0c52abc4 | 49 | |
va009039 | 0:ef2c0c52abc4 | 50 | const uint8_t disk_image_3[] = { |
va009039 | 0:ef2c0c52abc4 | 51 | //sector 3: root directory |
va009039 | 0:ef2c0c52abc4 | 52 | //entry 1 |
va009039 | 0:ef2c0c52abc4 | 53 | 'M','b','e','d',' ','U','S','B',' ',' ',' ', 0x28,0x00,0x00,0x00,0x00, |
va009039 | 0:ef2c0c52abc4 | 54 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
va009039 | 0:ef2c0c52abc4 | 55 | //entry 2 |
va009039 | 0:ef2c0c52abc4 | 56 | 0x52,0x45,0x41,0x44,0x4D,0x45,0x20,0x20,0x54,0x58,0x54, /*readme.txt*/ 0x20,0x00,0x00,0x00,0x00, |
va009039 | 0:ef2c0c52abc4 | 57 | 0x21,0x00,0xBB,0x32,0x00,0x00, 0xDC,0x83,/*hour/min/doublesec*/ 0x6A,0x3F,/*year/month/day*/ 0x02,0x00, /*starting cluster*/ 0x1e,0x00,0x00,0x00, /*size*/ |
va009039 | 0:ef2c0c52abc4 | 58 | }; |
va009039 | 0:ef2c0c52abc4 | 59 | |
va009039 | 0:ef2c0c52abc4 | 60 | const uint8_t disk_image_4[] = { |
va009039 | 0:ef2c0c52abc4 | 61 | //sector 4: data |
va009039 | 0:ef2c0c52abc4 | 62 | 'H','e','l','l','o',' ','f','r','o','m',' ','M','b','e','d','!', |
va009039 | 0:ef2c0c52abc4 | 63 | '\r','\n','U','S','B',' ','M','S','D',' ','d','e','m','o', |
va009039 | 0:ef2c0c52abc4 | 64 | }; |
va009039 | 0:ef2c0c52abc4 | 65 | |
va009039 | 0:ef2c0c52abc4 | 66 | #define SLOT_SIZE 48 |
va009039 | 0:ef2c0c52abc4 | 67 | static int slot[SLOT_SIZE]; |
va009039 | 0:ef2c0c52abc4 | 68 | static uint8_t image[SLOT_SIZE][512]; |
va009039 | 0:ef2c0c52abc4 | 69 | |
va009039 | 0:ef2c0c52abc4 | 70 | static int index_block(int block) { |
va009039 | 0:ef2c0c52abc4 | 71 | int i; |
va009039 | 0:ef2c0c52abc4 | 72 | for(i = 0; i < SLOT_SIZE; i++) { |
va009039 | 0:ef2c0c52abc4 | 73 | if (slot[i] == block) { |
va009039 | 0:ef2c0c52abc4 | 74 | return i; |
va009039 | 0:ef2c0c52abc4 | 75 | } |
va009039 | 0:ef2c0c52abc4 | 76 | } |
va009039 | 0:ef2c0c52abc4 | 77 | return -1; |
va009039 | 0:ef2c0c52abc4 | 78 | } |
va009039 | 0:ef2c0c52abc4 | 79 | |
va009039 | 0:ef2c0c52abc4 | 80 | static int block_len(uint8_t* buf) { |
va009039 | 0:ef2c0c52abc4 | 81 | int i; |
va009039 | 0:ef2c0c52abc4 | 82 | for(i = 512-1; i >= 0; i--) { |
va009039 | 0:ef2c0c52abc4 | 83 | if (buf[i] != 0x00) { |
va009039 | 0:ef2c0c52abc4 | 84 | return i+1; |
va009039 | 0:ef2c0c52abc4 | 85 | } |
va009039 | 0:ef2c0c52abc4 | 86 | } |
va009039 | 0:ef2c0c52abc4 | 87 | return 0; |
va009039 | 0:ef2c0c52abc4 | 88 | } |
va009039 | 0:ef2c0c52abc4 | 89 | |
va009039 | 0:ef2c0c52abc4 | 90 | static void mem_cpy(uint8_t* dst, const uint8_t* src, int size) |
va009039 | 0:ef2c0c52abc4 | 91 | { |
va009039 | 0:ef2c0c52abc4 | 92 | while(size-- > 0) { |
va009039 | 0:ef2c0c52abc4 | 93 | *dst++ = *src++; |
va009039 | 0:ef2c0c52abc4 | 94 | } |
va009039 | 0:ef2c0c52abc4 | 95 | } |
va009039 | 0:ef2c0c52abc4 | 96 | |
va009039 | 0:ef2c0c52abc4 | 97 | static void mem_set(uint8_t* dst, uint8_t dat, int size) |
va009039 | 0:ef2c0c52abc4 | 98 | { |
va009039 | 0:ef2c0c52abc4 | 99 | while(size-- > 0) { |
va009039 | 0:ef2c0c52abc4 | 100 | *dst++ = dat; |
va009039 | 0:ef2c0c52abc4 | 101 | } |
va009039 | 0:ef2c0c52abc4 | 102 | } |
va009039 | 0:ef2c0c52abc4 | 103 | |
va009039 | 0:ef2c0c52abc4 | 104 | void usbd_msc_read_sect(uint32_t block, uint8_t *buf, uint32_t num_of_blocks) |
va009039 | 0:ef2c0c52abc4 | 105 | { |
va009039 | 0:ef2c0c52abc4 | 106 | int i; |
va009039 | 0:ef2c0c52abc4 | 107 | i = index_block(block); |
va009039 | 0:ef2c0c52abc4 | 108 | if (i != (-1)) { |
va009039 | 0:ef2c0c52abc4 | 109 | mem_cpy(buf, image[i], 512); |
va009039 | 0:ef2c0c52abc4 | 110 | } else { |
va009039 | 0:ef2c0c52abc4 | 111 | mem_set(buf, 0x00, 512); |
va009039 | 0:ef2c0c52abc4 | 112 | } |
va009039 | 0:ef2c0c52abc4 | 113 | } |
va009039 | 0:ef2c0c52abc4 | 114 | |
va009039 | 0:ef2c0c52abc4 | 115 | void usbd_msc_write_sect(uint32_t block, uint8_t *buf, uint32_t num_of_blocks) |
va009039 | 0:ef2c0c52abc4 | 116 | { |
va009039 | 0:ef2c0c52abc4 | 117 | int i, len; |
va009039 | 0:ef2c0c52abc4 | 118 | len = block_len(buf); |
va009039 | 0:ef2c0c52abc4 | 119 | i = index_block(block); |
va009039 | 0:ef2c0c52abc4 | 120 | if (i != -1) { |
va009039 | 0:ef2c0c52abc4 | 121 | if (len == 0) { |
va009039 | 0:ef2c0c52abc4 | 122 | slot[i] = -1; |
va009039 | 0:ef2c0c52abc4 | 123 | } else { |
va009039 | 0:ef2c0c52abc4 | 124 | mem_cpy(image[i], buf, 512); |
va009039 | 0:ef2c0c52abc4 | 125 | } |
va009039 | 0:ef2c0c52abc4 | 126 | } else { |
va009039 | 0:ef2c0c52abc4 | 127 | if (len != 0) { |
va009039 | 0:ef2c0c52abc4 | 128 | for(i = 0; i < SLOT_SIZE; i++) { |
va009039 | 0:ef2c0c52abc4 | 129 | if (slot[i] == (-1)) { |
va009039 | 0:ef2c0c52abc4 | 130 | slot[i] = block; |
va009039 | 0:ef2c0c52abc4 | 131 | mem_cpy(image[i], buf, 512); |
va009039 | 0:ef2c0c52abc4 | 132 | break; |
va009039 | 0:ef2c0c52abc4 | 133 | } |
va009039 | 0:ef2c0c52abc4 | 134 | } |
va009039 | 0:ef2c0c52abc4 | 135 | } |
va009039 | 0:ef2c0c52abc4 | 136 | } |
va009039 | 0:ef2c0c52abc4 | 137 | } |
va009039 | 0:ef2c0c52abc4 | 138 | |
va009039 | 0:ef2c0c52abc4 | 139 | void usbd_msc_init () { |
va009039 | 0:ef2c0c52abc4 | 140 | int i; |
va009039 | 0:ef2c0c52abc4 | 141 | for(i = 0; i < SLOT_SIZE; i++) { |
va009039 | 0:ef2c0c52abc4 | 142 | slot[i] = -1; |
va009039 | 0:ef2c0c52abc4 | 143 | mem_set(image[i], 0, 512); |
va009039 | 0:ef2c0c52abc4 | 144 | } |
va009039 | 0:ef2c0c52abc4 | 145 | for(i = 0; i < 5; i++) { |
va009039 | 0:ef2c0c52abc4 | 146 | slot[i] = i; |
va009039 | 0:ef2c0c52abc4 | 147 | } |
va009039 | 0:ef2c0c52abc4 | 148 | mem_cpy(image[0], disk_image_0, sizeof(disk_image_0)); |
va009039 | 0:ef2c0c52abc4 | 149 | mem_cpy(image[1], disk_image_1, sizeof(disk_image_1)); |
va009039 | 0:ef2c0c52abc4 | 150 | mem_cpy(image[2], disk_image_2, sizeof(disk_image_2)); |
va009039 | 0:ef2c0c52abc4 | 151 | mem_cpy(image[3], disk_image_3, sizeof(disk_image_3)); |
va009039 | 0:ef2c0c52abc4 | 152 | mem_cpy(image[4], disk_image_4, sizeof(disk_image_4)); |
va009039 | 0:ef2c0c52abc4 | 153 | |
va009039 | 0:ef2c0c52abc4 | 154 | USBD_MSC_MemorySize = 65536; |
va009039 | 0:ef2c0c52abc4 | 155 | USBD_MSC_BlockSize = 512; |
va009039 | 0:ef2c0c52abc4 | 156 | USBD_MSC_BlockGroup = 1; |
va009039 | 0:ef2c0c52abc4 | 157 | USBD_MSC_BlockCount = USBD_MSC_MemorySize / USBD_MSC_BlockSize; |
va009039 | 0:ef2c0c52abc4 | 158 | //USBD_MSC_BlockBuf = (uint8_t *)usb_buffer; |
va009039 | 0:ef2c0c52abc4 | 159 | //USBD_MSC_MediaReady = __TRUE; |
va009039 | 0:ef2c0c52abc4 | 160 | } |