sdhcd.h
3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#ifndef __SD_HCD_H__
#define __SD_HCD_H__
#define RESP_WORDS 4
typedef struct {
U32 reset;
U32 cmd;
U32 argument;
U32 blk;
U32 resp[RESP_WORDS];
U32 control;
U32 status;
U32 intEna;
U32 intStat;
U32 version;
} SD_REGISTERS;
#define SD_REGISTER_SIZE (13*4)
// reset
#define RST_RESET (1 << 0)
#define RST_MODE_MS (1 << 1)
#define RST_MODE_SDn (1 << 1)
#define RST_RUN (1 << 2)
// cmd
#define CMD_INDX_MASK 0x3F
#define CMD_DATA_PRESENT (1 << 6)
#define CMD_DATA_TX (1 << 7)
#define CMD_MULTI_BLK (1 << 8)
#define CMD_RESP_TYPE_MASK (3 << 10)
#define CMD_RESP_TYPE_NO_RESP (0 << 10)
#define CMD_RESP_TYPE_136 (1 << 10)
#define CMD_RESP_TYPE_48 (2 << 10)
#define CMD_RESP_TYPE_48B (3 << 10)
#define CMD_RESP_CHK_INDX (1 << 12)
#define CMD_RESP_CHK_CRC (1 << 13)
// blk
#define BLK_CNT_SHIFT (12)
// control
#define CTL_4BIT (1 << 0)
#define CTL_CLK_SHIFT 1
#define CTL_CLK_MASK ( 0x7FF << 1 )
#define CTL_TOUT_READ_SHIFT 12
#define CTL_TOUT_WRITE_SHIFT 16
#define CTL_TOUT_RESP_BUSY_SHIFT 20
#define CTL_FIFO_RESET (1 << 24)
#define CTL_ENDIAN_SWITCH (1 << 25)
// status
#define STAT_WP_PIN (1 << 5)
#define STAT_CARD_INSERT (1 << 8)
// intEna/intStat
#define INT_CARD_INSERT (1 << 0)
#define INT_CARD_REMOVE (1 << 1)
#define INT_CMD_COMPLETE (1 << 3)
#define INT_TRANS_COMPLETE (1 << 4)
#define INT_ERR_CMD_INDX (1 << 5)
#define INT_ERR_CMD_CRC (1 << 6)
#define INT_ERR_CMD_ENDB (1 << 7)
#define INT_ERR_CMD_TOUT (1 << 8)
#define INT_ERR_DATA_CRC (1 << 9)
#define INT_ERR_DATA_ENDB (1 << 10)
#define INT_ERR_DATA_TOUT (1 << 11)
#define INT_FIFO_EMPTY (1 << 12)
#define INT_FIFO_HALF_EMPTY (1 << 13)
#define INT_FIFO_UNDERRUN (1 << 14)
#define INT_FIFO_FULL (1 << 15)
#define INT_FIFO_HALF_FULL (1 << 16)
#define INT_FIFO_OVERRUN (1 << 17)
#define INT_CMD_ERROR (0x0F << 5)
#define INT_DATA_ERROR (0x07 << 9)
#define INT_FIFO_ERROR (INT_FIFO_UNDERRUN | INT_FIFO_OVERRUN )
#define INT_ERROR ( INT_CMD_ERROR | INT_DATA_ERROR | INT_FIFO_ERROR )
#define INT_CMD_ENABLE_MASK ( INT_CARD_INSERT | INT_CARD_REMOVE | INT_CMD_COMPLETE | INT_TRANS_COMPLETE \
| INT_CMD_ERROR )
#define INT_TXD_ENABLE_MASK ( INT_CARD_INSERT | INT_CARD_REMOVE | INT_CMD_COMPLETE | INT_TRANS_COMPLETE \
| INT_DATA_ERROR | INT_FIFO_HALF_EMPTY )
#define INT_RXD_ENABLE_MASK ( INT_CARD_INSERT | INT_CARD_REMOVE | INT_CMD_COMPLETE | INT_TRANS_COMPLETE \
| INT_DATA_ERROR | INT_FIFO_HALF_FULL )
#define INT_FIFO_HALF_STAT ( INT_FIFO_HALF_EMPTY | INT_FIFO_HALF_FULL )
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define SD_BLOCK_SIZE 512
#define HC_FIFO_SIZE 64
#define HC_HALF_FIFO_SIZE (HC_FIFO_SIZE/2)
#define HC_HALF_FIFO_WORDS (HC_HALF_FIFO_SIZE/4)
int sdhcd_preinit( void );
int sdhcd_init( int pnp );
int sdhcd_open( int clk, int sysclk, int buswidth );
int sdhcd_close( void );
int sdhcd_fini( void );
void sdhcd_setPnP( int ena );
int sdhcd_isCardPresent( void );
int sdhcd_isCardMechWP( void );
int sdhcd_setCardInt( int ena );
int sdhcd_setBusWidth( int width );
#define SD_FDO_MIN 100 //khz
#define SD_FDO_MAX 400
#define SD_FDO_DEFAULT 300
#define SD_FPP_MIN 12500
#define SD_FPP_MAX 25*1000
//#define SD_FPP_DEFAULT (4*1000)
#define SD_FPP_DEFAULT (8*1000)
//#define SD_FPP_DEFAULT (10*1000)
#define SD_FPP_TYPICAL 20*1000
#define SD_FPP_TEST 2*1000
#define SD_FPP_HISPEED 50*1000
int sdhcd_setClk( int khz, int sysclk );
typedef enum {
enTM_PIO,
enTM_PIO_DMA
} enTRANS_MODE;
void sdhcd_setTransMode( U8 mode );
typedef enum {
enTRANS_OK,
enTRANS_TIMEOUT,
enTRANS_FAIL,
enTRANS_CARD_REMOVED,
enTRANS_RESP_ERR
} enSDHCD_TRANS_RESULT;
int sdhcd_transferProtocol
(
const CARD_CMD *pcmd, U32 argu, //cmd
U32 *resp, //response
U8 *buffer, U32 *blks, U32 *bytes, //data
U32 *intstat
);
#endif