USB Device ROM Stack API example program

Dependencies:   mbed

LPC1549のROM APIを使ったRAMディスクです。PCからはUSBメモリとして見えます。

参考:
http://docs.lpcware.com/usbromlib/v1.0/

Committer:
va009039
Date:
Fri Mar 14 09:14:16 2014 +0000
Revision:
0:ef2c0c52abc4
first commit

Who changed what in which revision?

UserRevisionLine numberNew 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 }