]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - packages/devs/flash/arm/mxc/v2_0/src/mxcmci_core.c
TX51 pre-release
[karo-tx-redboot.git] / packages / devs / flash / arm / mxc / v2_0 / src / mxcmci_core.c
index 56b7e41ff65c0c517f112555d6ec256820752569..43d1fb625a9c41591fb634c4f363b3bf1fe2b540 100644 (file)
 //
 //==========================================================================
 
+#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
 
@@ -78,64 +79,64 @@ int HighCapacityCard = 0;
 
 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;
 }
 
 /*==========================================================================
@@ -196,44 +197,45 @@ cyg_uint32 card_get_csd(void)
 
 }
 
-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;
 
 }
 
@@ -251,7 +253,7 @@ cyg_uint32 card_get_capacity_size(void)
     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);