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_SPI_MEM == ENABLE
00052
00053 #include "conf_sd_mmc_spi.h"
00054 #include "sd_mmc_spi.h"
00055 #include "sd_mmc_spi_mem.h"
00056
00057
00058
00059
00060 #define Sd_mmc_spi_access_signal_on()
00061 #define Sd_mmc_spi_access_signal_off()
00062
00063
00064
00065
00066
00067
00068
00069
00070 extern U32 SD_MMC_SPI_DISK_SIZE;
00071 extern volatile U32 sd_mmc_spi_last_address;
00072 extern Bool sd_mmc_spi_init_done;
00073
00074 U8 sd_mmc_spi_presence_status = SD_MMC_INSERTED;
00075 extern Bool sd_mmc_spi_init_done;
00076
00077
00078
00079
00080
00081 void sd_mmc_spi_mem_init(void)
00082 {
00083 sd_mmc_spi_internal_init();
00084 }
00085
00086
00087
00088 Ctrl_status sd_mmc_spi_test_unit_ready(void)
00089 {
00090 Sd_mmc_spi_access_signal_on();
00091 switch (sd_mmc_spi_presence_status)
00092 {
00093 case SD_MMC_REMOVED:
00094 sd_mmc_spi_init_done = FALSE;
00095 if (OK == sd_mmc_spi_mem_check())
00096 {
00097 sd_mmc_spi_presence_status = SD_MMC_INSERTED;
00098 Sd_mmc_spi_access_signal_off();
00099 return CTRL_BUSY;
00100 }
00101 Sd_mmc_spi_access_signal_off();
00102 return CTRL_NO_PRESENT;
00103
00104 case SD_MMC_INSERTED:
00105 if (OK != sd_mmc_spi_mem_check())
00106 {
00107 sd_mmc_spi_presence_status = SD_MMC_REMOVING;
00108 sd_mmc_spi_init_done = FALSE;
00109 Sd_mmc_spi_access_signal_off();
00110 return CTRL_BUSY;
00111 }
00112 Sd_mmc_spi_access_signal_off();
00113 return CTRL_GOOD;
00114
00115 case SD_MMC_REMOVING:
00116 sd_mmc_spi_presence_status = SD_MMC_REMOVED;
00117 Sd_mmc_spi_access_signal_off();
00118 return CTRL_NO_PRESENT;
00119
00120 default:
00121 sd_mmc_spi_presence_status = SD_MMC_REMOVED;
00122 Sd_mmc_spi_access_signal_off();
00123 return CTRL_BUSY;
00124 }
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 }
00149
00150
00151
00152 Ctrl_status sd_mmc_spi_read_capacity(U32 *u32_nb_sector)
00153 {
00154
00155 Sd_mmc_spi_access_signal_on();
00156
00157 if (sd_mmc_spi_init_done == FALSE)
00158 {
00159 sd_mmc_spi_mem_init();
00160 }
00161
00162 if (sd_mmc_spi_init_done == TRUE)
00163 {
00164 *u32_nb_sector = sd_mmc_spi_last_block_address+1;
00165 Sd_mmc_spi_access_signal_off();
00166 return CTRL_GOOD;
00167 }
00168 else
00169 {
00170 Sd_mmc_spi_access_signal_off();
00171 return CTRL_NO_PRESENT;
00172 }
00173 }
00174
00175
00185 Bool sd_mmc_spi_wr_protect(void)
00186 {
00187 return FALSE;
00188 }
00189
00190
00196 Bool sd_mmc_spi_removal(void)
00197 {
00198 return FALSE;
00199
00200 }
00201
00202
00203
00204
00205
00206 #if ACCESS_USB == ENABLED
00207
00208 #include "usb_drv.h"
00209 #include "scsi_decoder.h"
00210
00211
00212
00213 Ctrl_status sd_mmc_spi_usb_read_10(U32 addr, U16 nb_sector)
00214 {
00215 Bool status;
00216
00217 if (sd_mmc_spi_init_done == FALSE)
00218 {
00219 sd_mmc_spi_mem_init();
00220 }
00221
00222 if (sd_mmc_spi_init_done == TRUE)
00223 {
00224 Sd_mmc_spi_access_signal_on();
00225 sd_mmc_spi_read_open(addr);
00226 status = sd_mmc_spi_read_multiple_sector(nb_sector);
00227 sd_mmc_spi_read_close();
00228 Sd_mmc_spi_access_signal_off();
00229 if (status == OK)
00230 return CTRL_GOOD;
00231 else
00232 return CTRL_NO_PRESENT;
00233 }
00234 else
00235 return CTRL_NO_PRESENT;
00236 }
00237
00238
00239 void sd_mmc_spi_read_multiple_sector_callback(const void *psector)
00240 {
00241 U16 data_to_transfer = MMC_SECTOR_SIZE;
00242
00243 while (data_to_transfer)
00244 {
00245 while (!Is_usb_in_ready(g_scsi_ep_ms_in));
00246
00247 Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_in);
00248 data_to_transfer = usb_write_ep_txpacket(g_scsi_ep_ms_in, psector,
00249 data_to_transfer, &psector);
00250 Usb_ack_in_ready_send(g_scsi_ep_ms_in);
00251 }
00252 }
00253
00254
00255
00256 Ctrl_status sd_mmc_spi_usb_write_10(U32 addr, U16 nb_sector)
00257 {
00258 Bool status;
00259
00260 if (sd_mmc_spi_init_done == FALSE)
00261 {
00262 sd_mmc_spi_mem_init();
00263 }
00264
00265 if (sd_mmc_spi_init_done == TRUE)
00266 {
00267 Sd_mmc_spi_access_signal_on();
00268 sd_mmc_spi_write_open(addr);
00269 status = sd_mmc_spi_write_multiple_sector(nb_sector);
00270 sd_mmc_spi_write_close();
00271 Sd_mmc_spi_access_signal_off();
00272 if (status == OK)
00273 return CTRL_GOOD;
00274 else
00275 return CTRL_NO_PRESENT;
00276 }
00277 else
00278 return CTRL_NO_PRESENT;
00279 }
00280
00281
00282 void sd_mmc_spi_write_multiple_sector_callback(void *psector)
00283 {
00284 U16 data_to_transfer = MMC_SECTOR_SIZE;
00285
00286 while (data_to_transfer)
00287 {
00288 while (!Is_usb_out_received(g_scsi_ep_ms_out));
00289
00290 Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_out);
00291 data_to_transfer = usb_read_ep_rxpacket(g_scsi_ep_ms_out, psector,
00292 data_to_transfer, &psector);
00293 Usb_ack_out_received_free(g_scsi_ep_ms_out);
00294 }
00295 }
00296
00297 #endif // ACCESS_USB == ENABLED
00298
00299
00300
00301
00302 #if ACCESS_MEM_TO_RAM == ENABLED
00303
00304 Ctrl_status sd_mmc_spi_mem_2_ram(U32 addr, void *ram)
00305 {
00306 Sd_mmc_spi_access_signal_on();
00307 sd_mmc_spi_check_presence();
00308
00309 if (sd_mmc_spi_init_done == FALSE)
00310 {
00311 sd_mmc_spi_mem_init();
00312 }
00313
00314 if (sd_mmc_spi_init_done == TRUE)
00315 {
00316 sd_mmc_spi_read_open(addr);
00317 if (KO == sd_mmc_spi_read_sector_to_ram(ram))
00318 {
00319 sd_mmc_spi_write_close();
00320 Sd_mmc_spi_access_signal_off();
00321 return CTRL_NO_PRESENT;
00322 }
00323 sd_mmc_spi_read_close();
00324 Sd_mmc_spi_access_signal_off();
00325 return CTRL_GOOD;
00326 }
00327 Sd_mmc_spi_access_signal_off();
00328
00329 return CTRL_NO_PRESENT;
00330 }
00331
00332
00346 Ctrl_status sd_mmc_spi_ram_2_mem(U32 addr, const void *ram)
00347 {
00348 Sd_mmc_spi_access_signal_on();
00349 sd_mmc_spi_check_presence();
00350
00351 if (sd_mmc_spi_init_done == FALSE)
00352 {
00353 sd_mmc_spi_mem_init();
00354 }
00355
00356 if (sd_mmc_spi_init_done == TRUE)
00357 {
00358 sd_mmc_spi_write_open(addr);
00359 if (KO == sd_mmc_spi_write_sector_from_ram(ram))
00360 {
00361 sd_mmc_spi_write_close();
00362 Sd_mmc_spi_access_signal_off();
00363 return CTRL_NO_PRESENT;
00364 }
00365 sd_mmc_spi_write_close();
00366 Sd_mmc_spi_access_signal_off();
00367 return CTRL_GOOD;
00368 }
00369 Sd_mmc_spi_access_signal_off();
00370
00371 return CTRL_NO_PRESENT;
00372 }
00373
00374
00375 #endif // ACCESS_MEM_TO_RAM == ENABLED
00376
00377
00378 #endif // SD_MMC_SPI_MEM == ENABLE