//
//==========================================================================
+#include <cyg/infra/diag.h>
#include <cyg/io/mxcmci_host.h>
#include <cyg/io/mxcmci_core.h>
#include <cyg/io/mxcmci_mmc.h>
#include <cyg/hal/hal_soc.h>
#include <cyg/io/mxc_mmc.h>
-static cyg_uint32 csd_get_value(cyg_uint32 * pcsd, cyg_uint32 start_bit,
- cyg_uint32 end_bit);
+static cyg_uint32 csd_get_value(void *csd, cyg_uint32 start_bit,
+ cyg_uint32 end_bit);
#define MMCSD_INIT_DELAY 64
cyg_uint32 mxcmci_init(cyg_uint32 bus_width, cyg_uint32 base_address)
{
- cyg_uint32 init_status = FAIL;
-
- flash_dprintf(FLASH_DEBUG_MAX, "%s:try to init base address...\n",
- __FUNCTION__);
- /* initialize Interface Controller */
- host_init(base_address);
- flash_dprintf(FLASH_DEBUG_MAX, "%s:try to software reset...\n",
- __FUNCTION__);
-
- /* Software Reset to Interface Controller */
- host_reset(ESDHC_ONE_BIT_SUPPORT, ESDHC_LITTLE_ENDIAN_MODE);
- flash_dprintf(FLASH_DEBUG_MAX, "%s:try to set identification freq...\n",
- __FUNCTION__);
-
- /* Enable Identification Frequency */
- host_cfg_clock(IDENTIFICATION_FREQ);
-
- /* Add delay of 2 msec, let mmc/sd card to initialize */
- hal_delay_us(2 * 1000);
-
- flash_dprintf(FLASH_DEBUG_MAX, "%s:try to software resetto card...\n",
- __FUNCTION__);
-
- //diag_printf("SW Reset...\n");
- /* Issue Software Reset to card */
- if (mxcmci_software_reset())
- return FAIL;
-
- //diag_printf("Check Card...\n");
-
- /* Check if the card is SD Memory Card */
- if (!sd_voltage_validation()) {
- flash_dprintf(FLASH_DEBUG_MAX, "%s:try to verify SD card...\n",
- __FUNCTION__);
- /* Call SD Initialization Function */
- init_status = sd_init(bus_width);
- Card_type =
- ((csd.csd3 & CSD_STRUCT_MSK) ? SD_CSD_2_0 : SD_CSD_1_0);
- Card_Mode = 1;
- /* Card Command Class */
- CCC = csd_get_value(&csd, 84, 95);
- } else {
- flash_dprintf(FLASH_DEBUG_MAX, "%s:try to verify MMC card...\n",
- __FUNCTION__);
- /* Check if the card is MMC Memory Card */
- if (!mmc_voltage_validation()) {
-
- /* Call MMC Initialization Function */
- init_status = mmc_init(bus_width);
- Card_Mode = 0;
- Card_type = ((csd.csd3 & CSD_STRUCT_MSK) >> CSD_STRUCT_SHIFT) + SD_CSD_2_0;
- MMC_Spec_vers = (csd.csd3 & MMC_CSD_SPEC_VERS_MASK) >> MMC_CSD_SPEC_VERS_SHIFT;
- /* Card Command Class */
- CCC = csd_get_value(&csd, 84, 95);
- }
- }
-
- return init_status;
+ cyg_uint32 init_status = FAIL;
+
+ flash_dprintf(FLASH_DEBUG_MAX, "%s:try to init base address...\n",
+ __FUNCTION__);
+ /* initialize Interface Controller */
+ host_init(base_address);
+ flash_dprintf(FLASH_DEBUG_MAX, "%s:try to software reset...\n",
+ __FUNCTION__);
+
+ /* Software Reset to Interface Controller */
+ host_reset(ESDHC_ONE_BIT_SUPPORT, ESDHC_LITTLE_ENDIAN_MODE);
+ flash_dprintf(FLASH_DEBUG_MAX, "%s:try to set identification freq...\n",
+ __FUNCTION__);
+
+ /* Enable Identification Frequency */
+ host_cfg_clock(IDENTIFICATION_FREQ);
+
+ /* Add delay of 2 msec, let mmc/sd card to initialize */
+ hal_delay_us(2 * 1000);
+
+ flash_dprintf(FLASH_DEBUG_MAX, "%s:try to software resetto card...\n",
+ __FUNCTION__);
+
+ //diag_printf("SW Reset...\n");
+ /* Issue Software Reset to card */
+ if (mxcmci_software_reset())
+ return FAIL;
+
+ //diag_printf("Check Card...\n");
+
+ /* Check if the card is SD Memory Card */
+ if (!sd_voltage_validation()) {
+ flash_dprintf(FLASH_DEBUG_MAX, "%s:try to verify SD card...\n",
+ __FUNCTION__);
+ /* Call SD Initialization Function */
+ init_status = sd_init(bus_width);
+ Card_type =
+ ((csd.csd3 & CSD_STRUCT_MSK) ? SD_CSD_2_0 : SD_CSD_1_0);
+ Card_Mode = 1;
+ /* Card Command Class */
+ CCC = csd_get_value(&csd, 84, 95);
+ } else {
+ flash_dprintf(FLASH_DEBUG_MAX, "%s:try to verify MMC card...\n",
+ __FUNCTION__);
+ /* Check if the card is MMC Memory Card */
+ if (!mmc_voltage_validation()) {
+
+ /* Call MMC Initialization Function */
+ init_status = mmc_init(bus_width);
+ Card_Mode = 0;
+ Card_type = ((csd.csd3 & CSD_STRUCT_MSK) >> CSD_STRUCT_SHIFT) + SD_CSD_2_0;
+ MMC_Spec_vers = (csd.csd3 & MMC_CSD_SPEC_VERS_MASK) >> MMC_CSD_SPEC_VERS_SHIFT;
+ /* Card Command Class */
+ CCC = csd_get_value(&csd, 84, 95);
+ }
+ }
+
+ return init_status;
}
/*==========================================================================
}
-static cyg_uint32 csd_get_value(cyg_uint32 * pcsd, cyg_uint32 start_bit,
- cyg_uint32 end_bit)
+static cyg_uint32 csd_get_value(void *csd, cyg_uint32 start_bit,
+ cyg_uint32 end_bit)
{
- cyg_uint32 index = (start_bit / 32);
- cyg_uint32 end_index = (end_bit / 32);
- cyg_uint32 offset = (start_bit - 8) % 32;
- cyg_uint32 end_offset = (end_bit - 8) % 32;
- cyg_uint32 value;
- cyg_uint32 temp;
- //pcsd = &(csd.csd0);
- flash_dprintf(FLASH_DEBUG_MAX,
- "start_bit=%d, end_bit=%d, index=%d, end_index=%d, offset=%d\n",
- start_bit, end_bit, index, end_index, offset);
-
- if (index == end_index) {
- flash_dprintf(FLASH_DEBUG_MAX, "onl1y in index register\n");
- value =
- (*((cyg_uint32 *) ((cyg_uint32) pcsd + (index << 2)))) &
- ((1 << (end_offset + 1)) - (1 << offset));
- value = (value >> offset);
- } else {
- flash_dprintf(FLASH_DEBUG_MAX, "index and index+1 registers\n");
- value =
- *((cyg_uint32 *) ((cyg_uint32) pcsd +
- (index << 2))) & (0xFFFFFFFF -
- (1 << offset) + 1);
- value = (value >> offset);
- temp = (1 << (offset + end_bit - start_bit - 31)) - 1;
- temp =
- (*((cyg_uint32 *) ((cyg_uint32) pcsd + (index + 1) * 4)) &
- temp);
- value += temp << (32 - offset);
- }
-
- flash_dprintf(FLASH_DEBUG_MAX, "%s:value=%x (CSD:%x:%x:%x:%x)\n",
- __FUNCTION__, value, *pcsd, *(pcsd + 1), *(pcsd + 2),
- *(pcsd + 3));
- return value;
+ cyg_uint32 index = (start_bit / 32);
+ cyg_uint32 end_index = (end_bit / 32);
+ cyg_uint32 offset = (start_bit - 8) % 32;
+ cyg_uint32 end_offset = (end_bit - 8) % 32;
+ cyg_uint32 value;
+ cyg_uint32 temp;
+ cyg_uint32 *pcsd = csd;
+
+ flash_dprintf(FLASH_DEBUG_MAX,
+ "start_bit=%d, end_bit=%d, index=%d, end_index=%d, offset=%d\n",
+ start_bit, end_bit, index, end_index, offset);
+
+ if (index == end_index) {
+ flash_dprintf(FLASH_DEBUG_MAX, "onl1y in index register\n");
+ value =
+ (*((cyg_uint32 *) ((cyg_uint32) pcsd + (index << 2)))) &
+ ((1 << (end_offset + 1)) - (1 << offset));
+ value = (value >> offset);
+ } else {
+ flash_dprintf(FLASH_DEBUG_MAX, "index and index+1 registers\n");
+ value =
+ *((cyg_uint32 *) ((cyg_uint32) pcsd +
+ (index << 2))) & (0xFFFFFFFF -
+ (1 << offset) + 1);
+ value = (value >> offset);
+ temp = (1 << (offset + end_bit - start_bit - 31)) - 1;
+ temp =
+ (*((cyg_uint32 *) ((cyg_uint32) pcsd + (index + 1) * 4)) &
+ temp);
+ value += temp << (32 - offset);
+ }
+
+ flash_dprintf(FLASH_DEBUG_MAX, "%s:value=%x (CSD:%x:%x:%x:%x)\n",
+ __FUNCTION__, value, *pcsd, *(pcsd + 1), *(pcsd + 2),
+ *(pcsd + 3));
+ return value;
}
case MMC_CSD_1_0:
case MMC_CSD_1_1:
case MMC_CSD_1_2:
- c_size = csd_get_value(&csd, 62, 73);
+ c_size = csd_get_value((void*)&csd, 62, 73);
c_size_mult = csd_get_value(&csd, 47, 49);
blk_len = csd_get_value(&csd, 80, 83);
capacity = (c_size + 1) << (c_size_mult + 2 + blk_len - 10);