diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2014-02-04 19:27:07 +0100 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2014-02-10 23:14:26 +0100 |
commit | 1f4f7369eebfea85b9cb74a7ecae04b05bf44d07 (patch) | |
tree | 18b4d3908b749b9841109e03b33736eb95f3ec0b | |
parent | f982ea63989694f47bf8508883ddaa685d71fdf4 (diff) | |
download | rockbox-1f4f7369eebfea85b9cb74a7ecae04b05bf44d07.tar.gz rockbox-1f4f7369eebfea85b9cb74a7ecae04b05bf44d07.zip |
imx233: add support for sd/mmc probing
zenxfi2: add support for internal storage on the SD version
The code can now skip devices marked as PROBE if they fail to init, thus
making it possible to handle various kinds of internal storages. The current
code probably doesn't interplay nicely since it acquires pins and never
release them so it will probably break NAND code when it's ready but NAND code
is not ready yet anyway.
Change-Id: I4cb962de4215661e521743a3f511445dbbf28673
-rw-r--r-- | firmware/export/config/creativezenxfi2.h | 2 | ||||
-rw-r--r-- | firmware/target/arm/imx233/sdmmc-imx233.c | 26 |
2 files changed, 26 insertions, 2 deletions
diff --git a/firmware/export/config/creativezenxfi2.h b/firmware/export/config/creativezenxfi2.h index 020d7433cf..d60f9a4277 100644 --- a/firmware/export/config/creativezenxfi2.h +++ b/firmware/export/config/creativezenxfi2.h | |||
@@ -132,7 +132,7 @@ | |||
132 | 132 | ||
133 | /* define this if the flash memory uses the SecureDigital Memory Card protocol */ | 133 | /* define this if the flash memory uses the SecureDigital Memory Card protocol */ |
134 | #define CONFIG_STORAGE (/*STORAGE_NAND |*/ STORAGE_SD) | 134 | #define CONFIG_STORAGE (/*STORAGE_NAND |*/ STORAGE_SD) |
135 | #define NUM_DRIVES 1 | 135 | #define NUM_DRIVES 2 |
136 | #define HAVE_MULTIDRIVE | 136 | #define HAVE_MULTIDRIVE |
137 | #define HAVE_MULTIVOLUME | 137 | #define HAVE_MULTIVOLUME |
138 | #define HAVE_HOTSWAP_STORAGE_AS_MAIN | 138 | #define HAVE_HOTSWAP_STORAGE_AS_MAIN |
diff --git a/firmware/target/arm/imx233/sdmmc-imx233.c b/firmware/target/arm/imx233/sdmmc-imx233.c index 8103e980d1..7df0e412e5 100644 --- a/firmware/target/arm/imx233/sdmmc-imx233.c +++ b/firmware/target/arm/imx233/sdmmc-imx233.c | |||
@@ -73,6 +73,7 @@ struct sdmmc_config_t | |||
73 | #define WINDOW (1 << 5) | 73 | #define WINDOW (1 << 5) |
74 | #define WP_PIN (1 << 6) | 74 | #define WP_PIN (1 << 6) |
75 | #define WP_INVERTED (1 << 7) | 75 | #define WP_INVERTED (1 << 7) |
76 | #define PROBE (1 << 8) | ||
76 | 77 | ||
77 | /* modes */ | 78 | /* modes */ |
78 | #define SD_MODE 0 | 79 | #define SD_MODE 0 |
@@ -103,6 +104,12 @@ struct sdmmc_config_t sdmmc_config[] = | |||
103 | .mode = MMC_MODE, | 104 | .mode = MMC_MODE, |
104 | }, | 105 | }, |
105 | #elif defined(CREATIVE_ZENXFI2) | 106 | #elif defined(CREATIVE_ZENXFI2) |
107 | { | ||
108 | .name = "internal/SD", | ||
109 | .flags = WINDOW | PROBE, | ||
110 | .ssp = 2, | ||
111 | .mode = SD_MODE, | ||
112 | }, | ||
106 | /* The Zen X-Fi2 uses pin B1P29 for power */ | 113 | /* The Zen X-Fi2 uses pin B1P29 for power */ |
107 | { | 114 | { |
108 | .name = "microSD", | 115 | .name = "microSD", |
@@ -866,7 +873,16 @@ int sd_init(void) | |||
866 | _sd_num_drives = 0; | 873 | _sd_num_drives = 0; |
867 | for(unsigned drive = 0; drive < SDMMC_NUM_DRIVES; drive++) | 874 | for(unsigned drive = 0; drive < SDMMC_NUM_DRIVES; drive++) |
868 | if(SDMMC_MODE(drive) == SD_MODE) | 875 | if(SDMMC_MODE(drive) == SD_MODE) |
876 | { | ||
877 | /* if asked to probe, try to init it and ignore it if it fails */ | ||
878 | if(SDMMC_FLAGS(drive) & PROBE) | ||
879 | { | ||
880 | int ret = init_drive(drive); | ||
881 | if(ret < 0) | ||
882 | continue; | ||
883 | } | ||
869 | sd_map[_sd_num_drives++] = drive; | 884 | sd_map[_sd_num_drives++] = drive; |
885 | } | ||
870 | return 0; | 886 | return 0; |
871 | } | 887 | } |
872 | 888 | ||
@@ -931,8 +947,16 @@ int mmc_init(void) | |||
931 | for(unsigned drive = 0; drive < SDMMC_NUM_DRIVES; drive++) | 947 | for(unsigned drive = 0; drive < SDMMC_NUM_DRIVES; drive++) |
932 | if(SDMMC_MODE(drive) == MMC_MODE) | 948 | if(SDMMC_MODE(drive) == MMC_MODE) |
933 | { | 949 | { |
950 | /* try to init drive, panic on failure or skip if probing */ | ||
951 | int ret = init_drive(drive); | ||
952 | if(ret < 0) | ||
953 | { | ||
954 | if(SDMMC_FLAGS(drive) & PROBE) | ||
955 | continue; | ||
956 | else | ||
957 | panicf("init_drive(%d) failed: %d (mmc)", ret); | ||
958 | } | ||
934 | mmc_map[_mmc_num_drives++] = drive; | 959 | mmc_map[_mmc_num_drives++] = drive; |
935 | init_drive(drive); | ||
936 | } | 960 | } |
937 | return 0; | 961 | return 0; |
938 | } | 962 | } |