00001
00015
00016
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 #include "conf_access.h"
00049
00050
00051 #if (SD_MMC_MCI_0_MEM == ENABLE) || (SD_MMC_MCI_1_MEM == ENABLE)
00052
00053 #include "conf_sd_mmc_mci.h"
00054 #include "sd_mmc_mci.h"
00055 #include "sd_mmc_mci_mem.h"
00056
00057
00058
00059
00060 #define Sd_mmc_mci_access_signal_on()
00061 #define Sd_mmc_mci_access_signal_off()
00062
00064 extern Bool sd_mmc_mci_init_done[MCI_NR_SLOTS];
00066 extern U32 g_u32_card_size[MCI_NR_SLOTS];
00068 static U8 sd_mmc_mci_presence_status[MCI_NR_SLOTS] = {SD_MMC_INSERTED, SD_MMC_INSERTED};
00069
00072
00073
00074
00075 Ctrl_status sd_mmc_mci_test_unit_ready(U8 slot)
00076 {
00077 if (slot > MCI_LAST_SLOTS) return CTRL_FAIL;
00078
00079 Sd_mmc_mci_access_signal_on();
00080 switch (sd_mmc_mci_presence_status[slot])
00081 {
00082 case SD_MMC_REMOVED:
00083 sd_mmc_mci_init_done[slot] = FALSE;
00084 if (OK == sd_mmc_mci_mem_check(slot))
00085 {
00086 sd_mmc_mci_presence_status[slot] = SD_MMC_INSERTED;
00087 Sd_mmc_mci_access_signal_off();
00088 return CTRL_BUSY;
00089 }
00090 Sd_mmc_mci_access_signal_off();
00091 return CTRL_NO_PRESENT;
00092
00093 case SD_MMC_INSERTED:
00094 if (OK != sd_mmc_mci_mem_check(slot))
00095 {
00096 sd_mmc_mci_presence_status[slot] = SD_MMC_REMOVING;
00097 sd_mmc_mci_init_done[slot] = FALSE;
00098 Sd_mmc_mci_access_signal_off();
00099 return CTRL_BUSY;
00100 }
00101 Sd_mmc_mci_access_signal_off();
00102 return CTRL_GOOD;
00103
00104 case SD_MMC_REMOVING:
00105 sd_mmc_mci_presence_status[slot] = SD_MMC_REMOVED;
00106 Sd_mmc_mci_access_signal_off();
00107 return CTRL_NO_PRESENT;
00108
00109 default:
00110 sd_mmc_mci_presence_status[slot] = SD_MMC_REMOVED;
00111 Sd_mmc_mci_access_signal_off();
00112 return CTRL_BUSY;
00113 }
00114 }
00115
00116
00117 Ctrl_status sd_mmc_mci_test_unit_ready_0(void)
00118 {
00119 return sd_mmc_mci_test_unit_ready(0);
00120 }
00121
00122
00123 Ctrl_status sd_mmc_mci_test_unit_ready_1(void)
00124 {
00125 return sd_mmc_mci_test_unit_ready(1);
00126 }
00127
00128
00129 Ctrl_status sd_mmc_mci_read_capacity(U8 slot, U32 *u32_nb_sector)
00130 {
00131 Sd_mmc_mci_access_signal_on();
00132
00133 if( !sd_mmc_mci_mem_check(slot) )
00134 {
00135 Sd_mmc_mci_access_signal_off();
00136 return CTRL_NO_PRESENT;
00137 }
00138 *u32_nb_sector = g_u32_card_size[slot]-1;
00139 Sd_mmc_mci_access_signal_off();
00140 return CTRL_GOOD;
00141 }
00142
00143
00144 Ctrl_status sd_mmc_mci_read_capacity_0(U32 *u32_nb_sector)
00145 {
00146 return sd_mmc_mci_read_capacity(0, u32_nb_sector);
00147 }
00148
00149
00150 Ctrl_status sd_mmc_mci_read_capacity_1(U32 *u32_nb_sector)
00151 {
00152 return sd_mmc_mci_read_capacity(1, u32_nb_sector);
00153 }
00154
00155
00156 Bool sd_mmc_mci_wr_protect(U8 slot)
00157 {
00158 return is_sd_mmc_mci_card_protected(slot);
00159 }
00160
00161
00162 Bool sd_mmc_mci_wr_protect_0(void)
00163 {
00164 return sd_mmc_mci_wr_protect(0);
00165 }
00166
00167
00168 Bool sd_mmc_wr_mci_protect_1(void)
00169 {
00170 return sd_mmc_mci_wr_protect(1);
00171 }
00172
00173
00174 Bool sd_mmc_mci_removal(U8 slot)
00175 {
00176 return FALSE;
00177 }
00178
00179
00180 Bool sd_mmc_mci_removal_0(void)
00181 {
00182 return sd_mmc_mci_removal(0);
00183 }
00184
00185
00186 Bool sd_mmc_mci_removal_1(void)
00187 {
00188 return sd_mmc_mci_removal(1);
00189 }
00190
00192
00193 #if ACCESS_USB == ENABLED
00194
00195 #include "usb_drv.h"
00196 #include "scsi_decoder.h"
00197
00198
00201
00202
00203
00204 Ctrl_status sd_mmc_mci_usb_read_10(U8 slot, U32 addr, U16 nb_sector)
00205 {
00206 Sd_mmc_mci_access_signal_on();
00207
00208 if( !sd_mmc_mci_mem_check(slot) )
00209 {
00210 Sd_mmc_mci_access_signal_off();
00211 return CTRL_NO_PRESENT;
00212 }
00213
00214 if( !sd_mmc_mci_dma_read_open(slot, addr, NULL, nb_sector) )
00215 return CTRL_FAIL;
00216
00217 if( !sd_mmc_mci_read_multiple_sector(slot, nb_sector) )
00218 return CTRL_FAIL;
00219
00220 if( !sd_mmc_mci_read_close(slot) )
00221 return CTRL_FAIL;
00222
00223 Sd_mmc_mci_access_signal_off();
00224 return CTRL_GOOD;
00225 }
00226
00227
00228 Ctrl_status sd_mmc_mci_usb_read_10_0(U32 addr, U16 nb_sector)
00229 {
00230 return sd_mmc_mci_usb_read_10(0, addr, nb_sector);
00231 }
00232
00233
00234 Ctrl_status sd_mmc_mci_usb_read_10_1(U32 addr, U16 nb_sector)
00235 {
00236 return sd_mmc_mci_usb_read_10(1, addr, nb_sector);
00237 }
00238
00239
00240 void sd_mmc_mci_read_multiple_sector_callback(const void *psector)
00241 {
00242 U16 data_to_transfer = SD_MMC_SECTOR_SIZE;
00243
00244
00245 while (data_to_transfer)
00246 {
00247 while (!Is_usb_in_ready(g_scsi_ep_ms_in))
00248 {
00249 if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_in))
00250 return;
00251 }
00252
00253 Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_in);
00254 data_to_transfer = usb_write_ep_txpacket(g_scsi_ep_ms_in, psector,
00255 data_to_transfer, &psector);
00256 Usb_ack_in_ready_send(g_scsi_ep_ms_in);
00257 }
00258 }
00259
00260
00261 Ctrl_status sd_mmc_mci_usb_write_10(U8 slot,U32 addr, U16 nb_sector)
00262 {
00263 Sd_mmc_mci_access_signal_on();
00264
00265 if( !sd_mmc_mci_mem_check(slot) )
00266 {
00267 Sd_mmc_mci_access_signal_off();
00268 return CTRL_NO_PRESENT;
00269 }
00270
00271 if( !sd_mmc_mci_dma_write_open(slot, addr, NULL, nb_sector) )
00272 return CTRL_FAIL;
00273
00274 if( !sd_mmc_mci_write_multiple_sector(slot, nb_sector) )
00275 return CTRL_FAIL;
00276
00277 if( !sd_mmc_mci_write_close(slot) )
00278 return CTRL_FAIL;
00279
00280 Sd_mmc_mci_access_signal_off();
00281 return CTRL_GOOD;
00282
00283 }
00284
00285
00286 Ctrl_status sd_mmc_mci_usb_write_10_0(U32 addr, U16 nb_sector)
00287 {
00288 return sd_mmc_mci_usb_write_10(0, addr, nb_sector);
00289 }
00290
00291
00292 Ctrl_status sd_mmc_mci_usb_write_10_1(U32 addr, U16 nb_sector)
00293 {
00294 return sd_mmc_mci_usb_write_10(1, addr, nb_sector);
00295 }
00296
00297
00298 void sd_mmc_mci_write_multiple_sector_callback(void *psector)
00299 {
00300 U16 data_to_transfer = SD_MMC_SECTOR_SIZE;
00301
00302
00303 while (data_to_transfer)
00304 {
00305 while (!Is_usb_out_received(g_scsi_ep_ms_out))
00306 {
00307 if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_out))
00308 return;
00309 }
00310
00311 Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_out);
00312 data_to_transfer = usb_read_ep_rxpacket(g_scsi_ep_ms_out, psector,
00313 data_to_transfer, &psector);
00314 Usb_ack_out_received_free(g_scsi_ep_ms_out);
00315 }
00316 }
00317
00318
00320
00321 #endif // ACCESS_USB == ENABLED
00322
00323
00324 #if ACCESS_MEM_TO_RAM == ENABLED
00325
00328
00329
00330
00331 Ctrl_status sd_mmc_mci_mem_2_ram(U8 slot, U32 addr, void *ram)
00332 {
00333 if( !sd_mmc_mci_mem_check(slot) )
00334 {
00335 Sd_mmc_mci_access_signal_off();
00336 return CTRL_NO_PRESENT;
00337 }
00338
00339 if( !sd_mmc_mci_read_open(slot, addr, 1) )
00340 return CTRL_FAIL;
00341
00342 if( !sd_mmc_mci_read_sector_2_ram(slot, ram) )
00343 return CTRL_FAIL;
00344
00345 if( !sd_mmc_mci_read_close(slot) )
00346 return CTRL_FAIL;
00347
00348 Sd_mmc_mci_access_signal_off();
00349 return CTRL_GOOD;
00350
00351 }
00352
00353
00354 Ctrl_status sd_mmc_mci_dma_mem_2_ram(U8 slot, U32 addr, void *ram)
00355 {
00356 if( !sd_mmc_mci_mem_check(slot) )
00357 {
00358 Sd_mmc_mci_access_signal_off();
00359 return CTRL_NO_PRESENT;
00360 }
00361
00362 if( !sd_mmc_mci_dma_read_open(slot, addr, ram, 1) )
00363 return CTRL_FAIL;
00364
00365 if( !sd_mmc_mci_dma_read_sector_2_ram(slot,ram) )
00366 return CTRL_FAIL;
00367
00368 if(! sd_mmc_mci_read_close(slot) )
00369 return CTRL_FAIL;
00370
00371 Sd_mmc_mci_access_signal_off();
00372 return CTRL_GOOD;
00373
00374 }
00375
00376
00377 Ctrl_status sd_mmc_mci_mem_2_ram_0(U32 addr, void *ram)
00378 {
00379 return sd_mmc_mci_mem_2_ram(0, addr, ram);
00380 }
00381
00382
00383 Ctrl_status sd_mmc_mci_mem_2_ram_1(U32 addr, void *ram)
00384 {
00385 return sd_mmc_mci_mem_2_ram(1, addr, ram);
00386 }
00387
00388
00389 Ctrl_status sd_mmc_mci_multiple_mem_2_ram(U8 slot, U32 addr, void *ram, U32 nb_sectors)
00390 {
00391 if( !sd_mmc_mci_mem_check(slot) )
00392 {
00393 Sd_mmc_mci_access_signal_off();
00394 return CTRL_NO_PRESENT;
00395 }
00396
00397 if( !sd_mmc_mci_read_open(slot, addr, nb_sectors) )
00398 return CTRL_FAIL;
00399
00400 if( !sd_mmc_mci_read_multiple_sector_2_ram(slot, ram, nb_sectors) )
00401 return CTRL_FAIL;
00402
00403 if( !sd_mmc_mci_read_close(slot) )
00404 return CTRL_FAIL;
00405
00406 Sd_mmc_mci_access_signal_off();
00407 return CTRL_GOOD;
00408 }
00409
00410
00411 Ctrl_status sd_mmc_mci_dma_multiple_mem_2_ram(U8 slot, U32 addr, void *ram, U32 nb_sectors)
00412 {
00413 if( !sd_mmc_mci_mem_check(slot) )
00414 {
00415 Sd_mmc_mci_access_signal_off();
00416 return CTRL_NO_PRESENT;
00417 }
00418
00419 if( !sd_mmc_mci_dma_read_open(slot, addr, ram, nb_sectors ) )
00420 return CTRL_FAIL;
00421
00422 if( !sd_mmc_mci_dma_read_multiple_sector_2_ram(slot, ram, nb_sectors) )
00423 return CTRL_FAIL;
00424
00425 if( !sd_mmc_mci_read_close(slot) )
00426 return CTRL_FAIL;
00427
00428 Sd_mmc_mci_access_signal_off();
00429 return CTRL_GOOD;
00430 }
00431
00432
00433 Ctrl_status sd_mmc_mci_multiple_mem_2_ram_0(U32 addr, void *ram, U32 nb_sectors)
00434 {
00435 return sd_mmc_mci_multiple_mem_2_ram(0, addr, ram, nb_sectors);
00436 }
00437
00438
00439 Ctrl_status sd_mmc_mci_multiple_mem_2_ram_1(U32 addr, void *ram, U32 nb_sectors)
00440 {
00441 return sd_mmc_mci_multiple_mem_2_ram(1, addr, ram, nb_sectors);
00442 }
00443
00444
00445 Ctrl_status sd_mmc_mci_ram_2_mem(U8 slot, U32 addr, const void *ram)
00446 {
00447 if( !sd_mmc_mci_mem_check(slot) )
00448 {
00449 Sd_mmc_mci_access_signal_off();
00450 return CTRL_NO_PRESENT;
00451 }
00452
00453 if( !sd_mmc_mci_write_open(slot, addr, 1) )
00454 return CTRL_FAIL;
00455
00456 if( !sd_mmc_mci_write_sector_from_ram(slot,ram) )
00457 return CTRL_FAIL;
00458
00459 if( !sd_mmc_mci_write_close(slot) )
00460 return CTRL_FAIL;
00461
00462 Sd_mmc_mci_access_signal_off();
00463 return CTRL_GOOD;
00464 }
00465
00466
00467 Ctrl_status sd_mmc_mci_dma_ram_2_mem(U8 slot, U32 addr, const void *ram)
00468 {
00469 if( !sd_mmc_mci_mem_check(slot) )
00470 {
00471 Sd_mmc_mci_access_signal_off();
00472 return CTRL_NO_PRESENT;
00473 }
00474
00475 if( !sd_mmc_mci_dma_write_open(slot, addr, ram, 1) )
00476 return CTRL_FAIL;
00477
00478 if( !sd_mmc_mci_dma_write_sector_from_ram(slot, ram) )
00479 return CTRL_FAIL;
00480
00481 if( !sd_mmc_mci_write_close(slot) )
00482 return CTRL_FAIL;
00483
00484 Sd_mmc_mci_access_signal_off();
00485 return CTRL_GOOD;
00486 }
00487
00488
00489 Ctrl_status sd_mmc_mci_ram_2_mem_0(U32 addr, const void *ram)
00490 {
00491 return sd_mmc_mci_ram_2_mem(0, addr, ram);
00492 }
00493
00494
00495 Ctrl_status sd_mmc_mci_ram_2_mem_1(U32 addr, const void *ram)
00496 {
00497 return sd_mmc_mci_ram_2_mem(1, addr, ram);
00498 }
00499
00500
00501 Ctrl_status sd_mmc_mci_multiple_ram_2_mem(U8 slot, U32 addr, const void *ram, U32 nb_sectors)
00502 {
00503 if( !sd_mmc_mci_mem_check(slot) )
00504 {
00505 Sd_mmc_mci_access_signal_off();
00506 return CTRL_NO_PRESENT;
00507 }
00508
00509 if( !sd_mmc_mci_write_open(slot, addr, nb_sectors) )
00510 return CTRL_FAIL;
00511
00512 if( !sd_mmc_mci_write_multiple_sector_from_ram(slot, ram, nb_sectors) )
00513 return CTRL_FAIL;
00514
00515 if( !sd_mmc_mci_write_close(slot) )
00516 return CTRL_FAIL;
00517
00518 Sd_mmc_mci_access_signal_off();
00519 return CTRL_GOOD;
00520 }
00521
00522
00523 Ctrl_status sd_mmc_mci_dma_multiple_ram_2_mem(U8 slot, U32 addr, const void *ram, U32 nb_sectors)
00524 {
00525 if( !sd_mmc_mci_mem_check(slot) )
00526 {
00527 Sd_mmc_mci_access_signal_off();
00528 return CTRL_NO_PRESENT;
00529 }
00530
00531 if( !sd_mmc_mci_dma_write_open(slot, addr, ram, nb_sectors) )
00532 return CTRL_FAIL;
00533
00534 if( !sd_mmc_mci_dma_write_multiple_sector_from_ram(slot, ram, nb_sectors) )
00535 return CTRL_FAIL;
00536
00537 if( !sd_mmc_mci_write_close(slot) )
00538 return CTRL_FAIL;
00539
00540 Sd_mmc_mci_access_signal_off();
00541 return CTRL_GOOD;
00542 }
00543
00544
00545 Ctrl_status sd_mmc_mci_multiple_ram_2_mem_0(U32 addr, const void *ram, U32 nb_sectors)
00546 {
00547 return sd_mmc_mci_multiple_ram_2_mem(0, addr, ram, nb_sectors);
00548 }
00549
00550
00551 Ctrl_status sd_mmc_mci_multiple_ram_2_mem_1(U32 addr, const void *ram, U32 nb_sectors)
00552 {
00553 return sd_mmc_mci_multiple_ram_2_mem(1, addr, ram, nb_sectors);
00554 }
00555
00556
00558
00559 #endif // ACCESS_MEM_TO_RAM == ENABLED
00560
00561
00562 #endif // SD_MMC_MCI_0_MEM == ENABLE || SD_MMC_MCI_1_MEM == ENABLE