Skip to content

Commit c3e2f6a

Browse files
committed
add csd support for mini2440 sdio driver.
1 parent 8988d64 commit c3e2f6a

File tree

1 file changed

+110
-10
lines changed

1 file changed

+110
-10
lines changed

bsp/mini2440/drivers/sdcard.c

Lines changed: 110 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,26 @@
88
* http://www.rt-thread.org/license/LICENSE
99
*
1010
* Change Logs:
11-
* Date Author Notes
12-
* 2007-12-02 Yi.Qiu the first version
13-
* 2010-01-01 Bernard Modify for mini2440
14-
* 2012-12-15 amr168 support SDHC
11+
* Date Author Notes
12+
* 2007-12-02 Yi.Qiu the first version
13+
* 2010-01-01 Bernard Modify for mini2440
14+
* 2012-12-15 amr168 support SDHC
15+
* 2017-11-20 kuangdazzidd add csd cmd support
1516
*/
1617

1718
#include "sdcard.h"
19+
#include "rtdef.h"
1820

19-
extern rt_uint32_t PCLK;
20-
volatile rt_uint32_t rd_cnt;
21-
volatile rt_uint32_t wt_cnt;
22-
volatile rt_int32_t RCA;
23-
volatile rt_int32_t sd_type;
21+
extern rt_uint32_t PCLK;
22+
volatile rt_uint32_t rd_cnt;
23+
volatile rt_uint32_t wt_cnt;
24+
volatile rt_int32_t RCA;
25+
volatile rt_int32_t sd_type;
26+
27+
struct sd_csd {
28+
rt_uint16_t bsize;
29+
rt_uint32_t nblks;
30+
}g_sd_csd;
2431

2532
static void sd_delay(rt_uint32_t ms)
2633
{
@@ -118,9 +125,25 @@ static int sd_cmd55(void)
118125

119126
SDICSTA = 0xa00;
120127

128+
121129
return RT_EOK;
122130
}
123131

132+
static int sd_cmd9(void *p_rsp)
133+
{
134+
SDICARG = RCA << 16;
135+
SDICCON = (1 << 10) | (1 << 9) | (0x1<<8) | (0x40 | 0x09);
136+
137+
sd_cmd_end(9, 1);
138+
139+
((rt_uint32_t *)p_rsp)[0] = SDIRSP3;
140+
((rt_uint32_t *)p_rsp)[1] = SDIRSP2;
141+
((rt_uint32_t *)p_rsp)[2] = SDIRSP1;
142+
((rt_uint32_t *)p_rsp)[3] = SDIRSP0;
143+
144+
return RT_EOK;
145+
}
146+
124147
static void sd_sel_desel(char sel_desel)
125148
{
126149
if (sel_desel)
@@ -161,6 +184,75 @@ static void sd_setbus(void)
161184
SDICSTA=0xa00; /* Clear cmd_end(with rsp) */
162185
}
163186

187+
188+
static rt_uint32_t bits_str (rt_uint32_t *str, rt_uint32_t start, rt_uint8_t len)
189+
{
190+
rt_uint32_t mask;
191+
rt_uint32_t index;
192+
rt_uint8_t shift;
193+
rt_uint32_t value;
194+
195+
mask = (int)((len < 32) ? (1 << len) : 0) - 1;
196+
index = start / 32;
197+
shift = start & 31;
198+
value = str[index] >> shift;
199+
200+
if ((len + shift) > 32) {
201+
value |= str[index + 1] << (32 - shift);
202+
}
203+
value &= mask;
204+
return value;
205+
}
206+
207+
208+
static int sd_decode_csd (rt_uint32_t *p_csd)
209+
{
210+
rt_uint32_t e, m, r;
211+
rt_uint8_t structure;
212+
213+
structure = bits_str(p_csd, 126, 2);
214+
215+
switch (structure) {
216+
case 0:
217+
m = bits_str(p_csd, 99, 4);
218+
e = bits_str(p_csd, 96, 3);
219+
g_sd_csd.bsize = 512;
220+
m = bits_str(p_csd, 62, 12);
221+
e = bits_str(p_csd, 47, 3);
222+
r = bits_str(p_csd, 80, 4);
223+
g_sd_csd.nblks = ((1 + m) << (e + r - 7));
224+
break;
225+
226+
case 1:
227+
m = bits_str(p_csd, 99, 4);
228+
e = bits_str(p_csd, 96, 3);
229+
g_sd_csd.bsize = 512;
230+
m = bits_str(p_csd, 48, 22);
231+
g_sd_csd.nblks = (1 + m) << 10;
232+
break;
233+
234+
default:
235+
return RT_ERROR;
236+
}
237+
return RT_EOK;
238+
}
239+
240+
241+
static int sd_send_csd(rt_uint32_t *p_csd)
242+
{
243+
int ret;
244+
rt_uint32_t rsp[4];
245+
246+
ret = sd_cmd9((void*)&rsp);
247+
248+
if (ret != 0) {
249+
return ret;
250+
}
251+
252+
rt_memcpy((void*)p_csd, (void*)rsp, 16);
253+
return RT_EOK;
254+
}
255+
164256
static int sd_ocr(void)
165257
{
166258
int i, ver=0;
@@ -213,7 +305,8 @@ rt_err_t sd_cmd8(void)
213305
static rt_uint8_t sd_init(void)
214306
{
215307
//-- SD controller & card initialize
216-
int i;
308+
int i;
309+
rt_uint32_t csd[4];
217310
/* Important notice for MMC test condition */
218311
/* Cmd & Data lines must be enabled by pull up resister */
219312
SDIPRE = PCLK / (INICLK) - 1;
@@ -256,6 +349,9 @@ static rt_uint8_t sd_init(void)
256349
goto RECMD3;
257350
SDICSTA=0xa00; /* Clear cmd_end(with rsp) */
258351

352+
sd_send_csd(csd);
353+
sd_decode_csd(csd);
354+
259355
RCA = (SDIRSP0 & 0xffff0000) >> 16;
260356
SDIPRE = PCLK / (SDCLK) - 1; /* Normal clock=25MHz */
261357
if (SDIRSP0 & 0x1e00 != 0x600)
@@ -385,6 +481,10 @@ static rt_err_t rt_sdcard_close(rt_device_t dev)
385481

386482
static rt_err_t rt_sdcard_control(rt_device_t dev, int cmd, void *args)
387483
{
484+
struct rt_device_blk_geometry *p_geometry = (struct rt_device_blk_geometry *)args;
485+
p_geometry->block_size = g_sd_csd.bsize;
486+
p_geometry->sector_count = g_sd_csd.nblks;
487+
p_geometry->bytes_per_sector = 512;
388488
return RT_EOK;
389489
}
390490

0 commit comments

Comments
 (0)