2 #define SUBPARTITION_PER_PARTITION 4 /* 4 sub partitions per partition */
3 #define PARTITONS_PER_DISK 4 /* 4 partitions per disk */
4 #define MINOR_PER_DISK 1 /* one additional minor to point to */
7 * We can have multiple MMC host controller present on the hardware. The MINIX
8 * approach to handle this is to run a driver for each instance. Every driver
9 * will therefore be stated with an "instance" id and the rest of the code here
10 * will assume a single host controller to be present.
12 * The SD specification allows multiple cards to be attached to a single host
13 * controller using the same lines. I recommend reading SD Specifications Part 1
14 * Physical layer Simplified Specification chapter 3 about SD Memory Card system
15 * concepts if you want to get a better understanding of this.
17 * In practice an MMC host will usually have a single slot attached to it and that
18 * Slot may or may not contain a card. On sudden card removal we might want to
19 * keep track of the last inserted card and we might therefore at later stage
20 * add an additional "last_card" attribute to the card.
22 * The following diagram shows the structure that will be used to modulate the
23 * hardware written in umlwiki syntax.
26 * +instance:int] 1 --- 0..4 [ /slot/
27 * +card_detect:func ] 1 --- 0..1 [ /card/ ]
31 #define MAX_SD_SLOTS 4
35 //TODO Add more modes like INACTIVE STATE and such
36 #define SD_MODE_UNINITIALIZED 0
37 #define SD_MODE_CARD_IDENTIFICATION 1
38 #define SD_MODE_DATA_TRANSFER_MODE 2
42 uint32_t cid
[4]; /* Card Identification */
43 uint32_t rca
; /* Relative card address */
44 uint32_t dsr
; /* Driver stage register */
45 uint32_t csd
[4]; /* Card specific data */
46 uint32_t scr
[2]; /* SD configuration */
47 uint32_t ocr
; /* Operation conditions */
48 uint32_t ssr
[5]; /* SD Status */
49 uint32_t csr
; /* Card status */
52 #define RESP_LEN_48_CHK_BUSY (3<<0)
53 #define RESP_LEN_48 (2<<0)
54 #define RESP_LEN_136 (1<<0)
55 #define RESP_NO_RESPONSE (0<<0)
59 #define DATA_WRITE (2)
61 /* struct representing an mmc command */
73 /* structure representing an SD card */
76 /* pointer back to the SD slot for convenience */
79 struct sd_card_regs regs
;
81 /* some helpers (data comming from the csd) */
85 /* drive state: deaf, initialized, dead */
88 /* MINIX/block driver related things */
89 int open_ct
; /* in-use count */
91 /* 1 disks + 4 partitions and 16 possible sub partitions */
92 struct device part
[MINOR_PER_DISK
+ PARTITONS_PER_DISK
];
93 struct device subpart
[PARTITONS_PER_DISK
* SUBPARTITION_PER_PARTITION
];
96 /* structure representing an SD slot */
99 /* pointer back to the host for convenience */
100 struct mmc_host
*host
;
106 /* structure for the host controller */
109 /* MMC host configuration */
110 int (*host_set_instance
) (struct mmc_host
* host
, int instance
);
111 /* MMC host configuration */
112 int (*host_init
) (struct mmc_host
* host
);
114 void (*set_log_level
) (int level
);
115 /* Host controller reset */
116 int (*host_reset
) (struct mmc_host
* host
);
117 /* Card detection (binary yes/no) */
118 int (*card_detect
) (struct sd_slot
* slot
);
119 /* Perform card detection e.g. card type */
120 struct sd_card
*(*card_initialize
) (struct sd_slot
* slot
);
121 /* Release the card */
122 int (*card_release
) (struct sd_card
* card
);
124 /* Additional hardware interrupts */
125 void (*hw_intr
) (unsigned int irqs
);
127 /* read count blocks into existing buf */
128 int (*read
) (struct sd_card
* card
,
129 uint32_t blknr
, uint32_t count
, unsigned char *buf
);
131 /* write count blocks */
132 int (*write
) (struct sd_card
* card
,
133 uint32_t blknr
, uint32_t count
, unsigned char *buf
);
135 /* up to 4 slots with 4 SD cards */
136 struct sd_slot slot
[MAX_SD_SLOTS
];
140 /* Command execution */
141 int (*send_cmd
) (struct sd_card
* card
, struct mmc_command
*);
143 /* struct representing an mmc command */
154 /* Hack done for driver registration */
155 void host_initialize_host_structure_mmchs(struct mmc_host
*host
);
156 void host_initialize_host_structure_dummy(struct mmc_host
*host
);