Root/package/uboot-xburst/files/drivers/mmc/jz_mmc.h

1/*
2 * linux/drivers/mmc/jz_mmc.h
3 *
4 * Author: Vladimir Shebordaev, Igor Oblakov
5 * Copyright: MontaVista Software Inc.
6 *
7 * $Id: jz_mmc.h,v 1.3 2007-06-15 08:04:20 jlwei Exp $
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13#ifndef __MMC_JZMMC_H__
14#define __MMC_JZMMC_H__
15
16#define ID_TO_RCA(x) ((x)+1)
17#define MMC_OCR_ARG 0x00ff8000 /* Argument of OCR */
18
19/* Standard MMC/SD clock speeds */
20#define MMC_CLOCK_SLOW 400000 /* 400 kHz for initial setup */
21#define MMC_CLOCK_FAST 20000000 /* 20 MHz for maximum for normal operation */
22#define SD_CLOCK_FAST 24000000 /* 24 MHz for SD Cards */
23
24/* Use negative numbers to disambiguate */
25#define MMC_CIM_RESET -1
26#define SET_BUS_WIDTH 6 /* ac [1:0] bus width R1 */
27
28#define R1_OUT_OF_RANGE (1 << 31) /* er, c */
29#define R1_ADDRESS_ERROR (1 << 30) /* erx, c */
30#define R1_BLOCK_LEN_ERROR (1 << 29) /* er, c */
31#define R1_ERASE_SEQ_ERROR (1 << 28) /* er, c */
32#define R1_ERASE_PARAM (1 << 27) /* ex, c */
33#define R1_WP_VIOLATION (1 << 26) /* erx, c */
34#define R1_CARD_IS_LOCKED (1 << 25) /* sx, a */
35#define R1_LOCK_UNLOCK_FAILED (1 << 24) /* erx, c */
36#define R1_COM_CRC_ERROR (1 << 23) /* er, b */
37#define R1_ILLEGAL_COMMAND (1 << 22) /* er, b */
38#define R1_CARD_ECC_FAILED (1 << 21) /* ex, c */
39#define R1_CC_ERROR (1 << 20) /* erx, c */
40#define R1_ERROR (1 << 19) /* erx, c */
41#define R1_UNDERRUN (1 << 18) /* ex, c */
42#define R1_OVERRUN (1 << 17) /* ex, c */
43#define R1_CID_CSD_OVERWRITE (1 << 16) /* erx, c, CID/CSD overwrite */
44#define R1_WP_ERASE_SKIP (1 << 15) /* sx, c */
45#define R1_CARD_ECC_DISABLED (1 << 14) /* sx, a */
46#define R1_ERASE_RESET (1 << 13) /* sr, c */
47#define R1_STATUS(x) (x & 0xFFFFE000)
48
49#define MMC_CARD_BUSY 0x80000000 /* Card Power up status bit */
50
51#define MMC_PROGRAM_CID 26 /* adtc R1 */
52#define MMC_PROGRAM_CSD 27 /* adtc R1 */
53
54#define MMC_GO_IRQ_STATE 40 /* bcr R5 */
55#define MMC_GEN_CMD 56 /* adtc [0] RD/WR R1b */
56#define MMC_LOCK_UNLOCK 42 /* adtc R1b */
57#define MMC_WRITE_DAT_UNTIL_STOP 20 /* adtc [31:0] data addr R1 */
58#define MMC_READ_DAT_UNTIL_STOP 11 /* adtc [31:0] dadr R1 */
59#define MMC_SEND_WRITE_PROT 30 /* adtc [31:0] wpdata addr R1 */
60
61
62enum mmc_result_t {
63    MMC_NO_RESPONSE = -1,
64    MMC_NO_ERROR = 0,
65    MMC_ERROR_OUT_OF_RANGE,
66    MMC_ERROR_ADDRESS,
67    MMC_ERROR_BLOCK_LEN,
68    MMC_ERROR_ERASE_SEQ,
69    MMC_ERROR_ERASE_PARAM,
70    MMC_ERROR_WP_VIOLATION,
71    MMC_ERROR_CARD_IS_LOCKED,
72    MMC_ERROR_LOCK_UNLOCK_FAILED,
73    MMC_ERROR_COM_CRC,
74    MMC_ERROR_ILLEGAL_COMMAND,
75    MMC_ERROR_CARD_ECC_FAILED,
76    MMC_ERROR_CC,
77    MMC_ERROR_GENERAL,
78    MMC_ERROR_UNDERRUN,
79    MMC_ERROR_OVERRUN,
80    MMC_ERROR_CID_CSD_OVERWRITE,
81    MMC_ERROR_STATE_MISMATCH,
82    MMC_ERROR_HEADER_MISMATCH,
83    MMC_ERROR_TIMEOUT,
84    MMC_ERROR_CRC,
85    MMC_ERROR_DRIVER_FAILURE,
86};
87
88enum card_state {
89    CARD_STATE_EMPTY = -1,
90    CARD_STATE_IDLE = 0,
91    CARD_STATE_READY = 1,
92    CARD_STATE_IDENT = 2,
93    CARD_STATE_STBY = 3,
94    CARD_STATE_TRAN = 4,
95    CARD_STATE_DATA = 5,
96    CARD_STATE_RCV = 6,
97    CARD_STATE_PRG = 7,
98    CARD_STATE_DIS = 8,
99};
100
101enum mmc_rsp_t {
102    RESPONSE_NONE = 0,
103    RESPONSE_R1 = 1,
104    RESPONSE_R1B = 2,
105    RESPONSE_R2_CID = 3,
106    RESPONSE_R2_CSD = 4,
107    RESPONSE_R3 = 5,
108    RESPONSE_R4 = 6,
109    RESPONSE_R5 = 7,
110        RESPONSE_R6 = 8,
111};
112
113struct mmc_response_r1 {
114    u8 cmd;
115    u32 status;
116};
117
118struct mmc_response_r3 {
119    u32 ocr;
120};
121
122/* the information structure of MMC/SD Card */
123struct mmc_info {
124    int id; /* Card index */
125        int sd; /* MMC or SD card */
126        int rca; /* RCA */
127        u32 scr; /* SCR 63:32*/
128    int flags; /* Ejected, inserted */
129    enum card_state state; /* empty, ident, ready, whatever */
130
131    /* Card specific information */
132    struct mmc_cid cid;
133    struct mmc_csd csd;
134    u32 block_num;
135    u32 block_len;
136    u32 erase_unit;
137};
138
139struct mmc_info mmcinfo;
140
141struct mmc_request {
142    int index; /* Slot index - used for CS lines */
143    int cmd; /* Command to send */
144    u32 arg; /* Argument to send */
145    enum mmc_rsp_t rtype; /* Response type expected */
146
147    /* Data transfer (these may be modified at the low level) */
148    u16 nob; /* Number of blocks to transfer*/
149    u16 block_len; /* Block length */
150    u8 *buffer; /* Data buffer */
151    u32 cnt; /* Data length, for PIO */
152
153    /* Results */
154    u8 response[18]; /* Buffer to store response - CRC is optional */
155    enum mmc_result_t result;
156};
157
158char * mmc_result_to_string(int);
159int mmc_unpack_csd(struct mmc_request *request, struct mmc_csd *csd);
160int mmc_unpack_r1(struct mmc_request *request, struct mmc_response_r1 *r1, enum card_state state);
161int mmc_unpack_r6(struct mmc_request *request, struct mmc_response_r1 *r1, enum card_state state, int *rca);
162int mmc_unpack_scr(struct mmc_request *request, struct mmc_response_r1 *r1, enum card_state state, u32 *scr);
163int mmc_unpack_cid(struct mmc_request *request, struct mmc_cid *cid);
164int mmc_unpack_r3(struct mmc_request *request, struct mmc_response_r3 *r3);
165
166void mmc_send_cmd(struct mmc_request *request, int cmd, u32 arg,
167             u16 nob, u16 block_len, enum mmc_rsp_t rtype, u8 *buffer);
168u32 mmc_tran_speed(u8 ts);
169void jz_mmc_set_clock(int sd, u32 rate);
170
171static inline void mmc_simple_cmd(struct mmc_request *request, int cmd, u32 arg, enum mmc_rsp_t rtype)
172{
173    mmc_send_cmd( request, cmd, arg, 0, 0, rtype, 0);
174}
175
176#endif /* __MMC_JZMMC_H__ */
177

Archive Download this file



interactive