00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 #include "conf_access.h"
00051
00052
00053 #if VIRTUAL_MEM == ENABLE
00054
00055 #include "virtual_mem.h"
00056
00057
00058
00059
00060 #define VIRTUAL_MEM_TEST_CHANGE_STATE ENABLED
00061
00062
00063
00064
00065
00066
00067
00068 static U8 vmem_data[VMEM_NB_SECTOR * VMEM_SECTOR_SIZE];
00069
00070 static Bool cram_init = FALSE;
00071 #if (ACCESS_USB == ENABLED || ACCESS_MEM_TO_RAM == ENABLED) && VIRTUAL_MEM_TEST_CHANGE_STATE == ENABLED
00072 static volatile Bool s_b_data_modify = FALSE;
00073 #endif
00074
00075
00076
00077
00079 static void virtual_check_init(void)
00080 {
00081 U8 i;
00082
00083 if (cram_init) return;
00084
00085
00086
00087 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 0] = 0xEB;
00088 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 1] = 0x3C;
00089 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 2] = 0x90;
00090
00091 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 3] = 'A';
00092 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 4] = 'T';
00093 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 5] = 'M';
00094 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 6] = 'E';
00095 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 7] = 'L';
00096 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 8] = ' ';
00097 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 9] = ' ';
00098 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 10] = ' ';
00099
00100 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 11] = (U8)VMEM_SECTOR_SIZE;
00101 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 12] = VMEM_SECTOR_SIZE >> 8;
00102 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 13] = VMEM_CLUSTER_SIZE;
00103 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 14] = (U8)VMEM_RESERVED_SIZE;
00104 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 15] = VMEM_RESERVED_SIZE >> 8;
00105 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 16] = VMEM_NB_FATS;
00106 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 17] = (U8)VMEM_NB_ROOT_ENTRY;
00107 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 18] = VMEM_NB_ROOT_ENTRY >> 8;
00108 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 19] = (U8)VMEM_NB_SECTOR;
00109 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 20] = VMEM_NB_SECTOR >> 8;
00110 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 21] = VMEM_MEDIA_TYPE;
00111 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 22] = (U8)VMEM_SIZE_FAT;
00112 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 23] = VMEM_SIZE_FAT >> 8;
00113 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 24] = (U8)VMEM_SECT_PER_TRACK;
00114 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 25] = VMEM_SECT_PER_TRACK >> 8;
00115 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 26] = (U8)VMEM_NB_HEAD;
00116 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 27] = VMEM_NB_HEAD >> 8;
00117 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 28] = (U8)VMEM_NB_HIDDEN_SECT;
00118 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 29] = (U8)(VMEM_NB_HIDDEN_SECT >> 8);
00119 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 30] = (U8)(VMEM_NB_HIDDEN_SECT >> 16);
00120 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 31] = VMEM_NB_HIDDEN_SECT >> 24;
00121 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 32] = 0x00;
00122 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 33] = 0x00;
00123 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 34] = 0x00;
00124 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 35] = 0x00;
00125 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 36] = VMEN_DRIVE_NUMBER;
00126 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 37] = 0x00;
00127 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 38] = 0x29;
00128 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 39] = 0x00;
00129 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 40] = 0x00;
00130 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 41] = 0x00;
00131 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 42] = 0x00;
00132
00133 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 43] = 'V';
00134 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 44] = 'I';
00135 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 45] = 'R';
00136 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 46] = 'T';
00137 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 47] = 'U';
00138 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 48] = 'A';
00139 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 49] = 'L';
00140 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 50] = ' ';
00141 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 51] = 'M';
00142 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 52] = 'E';
00143 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 53] = 'M';
00144
00145 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 54] = 'F';
00146 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 55] = 'A';
00147 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 56] = 'T';
00148 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 57] = '1';
00149 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 58] = '2';
00150 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 59] = ' ';
00151 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 60] = ' ';
00152 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 61] = ' ';
00153
00154 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 510] = 0x55;
00155 vmem_data[PBR_SECTOR * VMEM_SECTOR_SIZE + 511] = 0xAA;
00156
00157
00158 for (i = 0; i < VMEM_NB_FATS; i++)
00159 {
00160
00161 vmem_data[(FAT_SECTOR + i * VMEM_SIZE_FAT) * VMEM_SECTOR_SIZE + 0] = 0xF8;
00162 vmem_data[(FAT_SECTOR + i * VMEM_SIZE_FAT) * VMEM_SECTOR_SIZE + 1] = 0xFF;
00163 vmem_data[(FAT_SECTOR + i * VMEM_SIZE_FAT) * VMEM_SECTOR_SIZE + 2] = 0xFF;
00164 }
00165
00166 cram_init = TRUE;
00167 }
00168
00169
00176 Ctrl_status virtual_test_unit_ready(void)
00177 {
00178 virtual_check_init();
00179
00180 return CTRL_GOOD;
00181 }
00182
00183
00191 Ctrl_status virtual_read_capacity(U32 *u32_nb_sector)
00192 {
00193 virtual_check_init();
00194 *u32_nb_sector = Max(VMEM_NB_SECTOR, 8) - 1;
00195
00196 return CTRL_GOOD;
00197 }
00198
00199
00204 Bool virtual_wr_protect(void)
00205 {
00206 return FALSE;
00207 }
00208
00209
00212 Bool virtual_removal(void)
00213 {
00214 return FALSE;
00215 }
00216
00217
00218
00219
00220 #if ACCESS_USB == ENABLED
00221
00222 #include "usb_drv.h"
00223 #include "scsi_decoder.h"
00224
00234 Ctrl_status virtual_usb_read_10(U32 addr, U16 nb_sector)
00235 {
00236 const void *ptr_cram;
00237 U16 data_to_transfer;
00238
00239 virtual_check_init();
00240 if (addr + nb_sector > Max(VMEM_NB_SECTOR, 8)) return CTRL_FAIL;
00241
00242 while (nb_sector--)
00243 {
00244
00245 addr = min(addr, VMEM_NB_SECTOR - 1);
00246
00247 ptr_cram = &vmem_data[addr++ * VMEM_SECTOR_SIZE];
00248 data_to_transfer = VMEM_SECTOR_SIZE;
00249 while (data_to_transfer)
00250 {
00251 while (!Is_usb_in_ready(g_scsi_ep_ms_in))
00252 {
00253 if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_in))
00254 return CTRL_FAIL;
00255 }
00256
00257 Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_in);
00258 data_to_transfer = usb_write_ep_txpacket(g_scsi_ep_ms_in, ptr_cram,
00259 data_to_transfer, &ptr_cram);
00260 Usb_ack_in_ready_send(g_scsi_ep_ms_in);
00261 }
00262 }
00263
00264 return CTRL_GOOD;
00265 }
00266
00267
00277 Ctrl_status virtual_usb_write_10(U32 addr, U16 nb_sector)
00278 {
00279 void *ptr_cram;
00280 U16 data_to_transfer;
00281
00282 virtual_check_init();
00283 if (addr + nb_sector > VMEM_NB_SECTOR) return CTRL_FAIL;
00284
00285 #if VIRTUAL_MEM_TEST_CHANGE_STATE == ENABLED
00286 if (addr + nb_sector > FILE_SECTOR && addr <= FILE_SECTOR)
00287 s_b_data_modify = TRUE;
00288 #endif
00289
00290 ptr_cram = &vmem_data[addr * VMEM_SECTOR_SIZE];
00291 while (nb_sector--)
00292 {
00293 data_to_transfer = VMEM_SECTOR_SIZE;
00294 while (data_to_transfer)
00295 {
00296 while (!Is_usb_out_received(g_scsi_ep_ms_out))
00297 {
00298 if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_out))
00299 return CTRL_FAIL;
00300 }
00301
00302 Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_out);
00303 data_to_transfer = usb_read_ep_rxpacket(g_scsi_ep_ms_out, ptr_cram,
00304 data_to_transfer, &ptr_cram);
00305 Usb_ack_out_received_free(g_scsi_ep_ms_out);
00306 }
00307 }
00308
00309 return CTRL_GOOD;
00310 }
00311
00312 #endif // ACCESS_USB == ENABLED
00313
00314
00315
00316
00317 #if ACCESS_MEM_TO_RAM == ENABLED
00318
00319 #include <string.h>
00320
00330 Ctrl_status virtual_mem_2_ram(U32 addr, void *ram)
00331 {
00332 virtual_check_init();
00333 if (addr + 1 > Max(VMEM_NB_SECTOR, 8)) return CTRL_FAIL;
00334
00335
00336 addr = min(addr, VMEM_NB_SECTOR - 1);
00337
00338 memcpy(ram, &vmem_data[addr * VMEM_SECTOR_SIZE], VMEM_SECTOR_SIZE);
00339
00340 return CTRL_GOOD;
00341 }
00342
00343
00353 Ctrl_status virtual_ram_2_mem(U32 addr, const void *ram)
00354 {
00355 virtual_check_init();
00356 if (addr + 1 > VMEM_NB_SECTOR) return CTRL_FAIL;
00357
00358 #if VIRTUAL_MEM_TEST_CHANGE_STATE == ENABLED
00359 if (addr + 1 > FILE_SECTOR && addr <= FILE_SECTOR)
00360 s_b_data_modify = TRUE;
00361 #endif
00362
00363 memcpy(&vmem_data[addr * VMEM_SECTOR_SIZE], ram, VMEM_SECTOR_SIZE);
00364
00365 return CTRL_GOOD;
00366 }
00367
00368 #endif // ACCESS_MEM_TO_RAM == ENABLED
00369
00370
00371 #endif // VIRTUAL_MEM == ENABLE