summaryrefslogtreecommitdiff
path: root/firmware/target/mips/ingenic_x1000/msc-x1000.h
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/mips/ingenic_x1000/msc-x1000.h')
-rw-r--r--firmware/target/mips/ingenic_x1000/msc-x1000.h186
1 files changed, 186 insertions, 0 deletions
diff --git a/firmware/target/mips/ingenic_x1000/msc-x1000.h b/firmware/target/mips/ingenic_x1000/msc-x1000.h
new file mode 100644
index 0000000000..53a5b301f0
--- /dev/null
+++ b/firmware/target/mips/ingenic_x1000/msc-x1000.h
@@ -0,0 +1,186 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2021 Aidan MacDonald
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#ifndef __MSC_X1000_H__
23#define __MSC_X1000_H__
24
25#include "kernel.h"
26#include "sdmmc.h"
27#include <stdbool.h>
28
29/* Number of MSC controllers */
30#define MSC_COUNT 2
31
32/* Media types */
33#define MSC_TYPE_SD 0
34#define MSC_TYPE_MMC 1
35#define MSC_TYPE_ATA 2
36#define MSC_TYPE_ANY 3
37
38/* Clock modes */
39#define MSC_CLK_MANUAL 0
40#define MSC_CLK_AUTOMATIC 1
41
42/* Clock status bits */
43#define MSC_CLKST_ENABLE (1 << 0)
44#define MSC_CLKST_AUTO (1 << 1)
45
46/* Driver flags */
47#define MSC_DF_ERRSTATE (1 << 0)
48#define MSC_DF_READY (1 << 1)
49#define MSC_DF_HCS_CARD (1 << 2)
50#define MSC_DF_V2_CARD (1 << 3)
51
52/* Request status codes */
53#define MSC_REQ_SUCCESS 0
54#define MSC_REQ_CRC_ERR 1
55#define MSC_REQ_CARD_ERR 2
56#define MSC_REQ_TIMEOUT 3
57#define MSC_REQ_EXTRACTED 4
58#define MSC_REQ_LOCKUP 5
59#define MSC_REQ_ERROR 6
60#define MSC_REQ_INCOMPLETE (-1)
61
62/* Response types */
63#define MSC_RESP_NONE 0
64#define MSC_RESP_BUSY (1 << 7)
65#define MSC_RESP_R1 1
66#define MSC_RESP_R1B (MSC_RESP_R1|MSC_RESP_BUSY)
67#define MSC_RESP_R2 2
68#define MSC_RESP_R3 3
69#define MSC_RESP_R6 6
70#define MSC_RESP_R7 7
71
72/* Request flags */
73#define MSC_RF_INIT (1 << 0)
74#define MSC_RF_ERR_CMD12 (1 << 1)
75#define MSC_RF_AUTO_CMD12 (1 << 2)
76#define MSC_RF_PROG (1 << 3)
77#define MSC_RF_DATA (1 << 4)
78#define MSC_RF_WRITE (1 << 5)
79#define MSC_RF_ABORT (1 << 6)
80
81/* Clock speeds */
82#define MSC_SPEED_INIT 400000
83#define MSC_SPEED_FAST 25000000
84#define MSC_SPEED_HIGH 50000000
85
86typedef struct msc_gpio_data {
87 int port;
88 int pin;
89 int active_level;
90} msc_gpio_data;
91
92typedef struct msc_config {
93 int msc_nr;
94 int msc_type;
95 int bus_width;
96 const char* label;
97 struct msc_gpio_data cd_gpio;
98} msc_config;
99
100typedef struct msc_req {
101 /* Filled by caller */
102 int command;
103 unsigned argument;
104 int resptype;
105 int flags;
106 void* data;
107 unsigned nr_blocks;
108 unsigned block_len;
109
110 /* Filled by driver */
111 volatile unsigned response[4];
112 volatile int status;
113} msc_req;
114
115struct sd_dma_desc {
116 unsigned nda;
117 unsigned mem;
118 unsigned len;
119 unsigned cmd;
120} __attribute__((aligned(16)));
121
122typedef struct msc_drv {
123 int msc_nr;
124 int drive_nr;
125 const msc_config* config;
126
127 int driver_flags;
128 int clk_status;
129 unsigned cmdat_def;
130 msc_req* req;
131 unsigned iflag_done;
132
133 volatile int req_running;
134 volatile int card_present;
135
136 struct mutex lock;
137 struct semaphore cmd_done;
138 struct timeout cmd_tmo;
139 struct timeout cd_tmo;
140 struct sd_dma_desc dma_desc;
141
142 tCardInfo cardinfo;
143} msc_drv;
144
145/* Driver initialization, etc */
146extern void msc_init(void);
147extern msc_drv* msc_get(int type, int index);
148extern msc_drv* msc_get_by_drive(int drive_nr);
149
150extern void msc_lock(msc_drv* d);
151extern void msc_unlock(msc_drv* d);
152extern void msc_full_reset(msc_drv* d);
153extern bool msc_card_detect(msc_drv* d);
154
155/* Controller API */
156extern void msc_ctl_reset(msc_drv* d);
157extern void msc_set_clock_mode(msc_drv* d, int mode);
158extern void msc_enable_clock(msc_drv* d, bool enable);
159extern void msc_set_speed(msc_drv* d, int rate);
160extern void msc_set_width(msc_drv* d, int width);
161
162/* Request API */
163extern void msc_async_start(msc_drv* d, msc_req* r);
164extern void msc_async_abort(msc_drv* d, int status);
165extern int msc_async_wait(msc_drv* d, int timeout);
166extern int msc_request(msc_drv* d, msc_req* r);
167
168/* Command helpers; note these are written with SD in mind
169 * and should be reviewed before using them for MMC / CE-ATA
170 */
171extern int msc_cmd_exec(msc_drv* d, msc_req* r);
172extern int msc_app_cmd_exec(msc_drv* d, msc_req* r);
173extern int msc_cmd_go_idle_state(msc_drv* d);
174extern int msc_cmd_send_if_cond(msc_drv* d);
175extern int msc_cmd_app_op_cond(msc_drv* d);
176extern int msc_cmd_all_send_cid(msc_drv* d);
177extern int msc_cmd_send_rca(msc_drv* d);
178extern int msc_cmd_send_csd(msc_drv* d);
179extern int msc_cmd_select_card(msc_drv* d);
180extern int msc_cmd_set_bus_width(msc_drv* d, int width);
181extern int msc_cmd_set_clr_card_detect(msc_drv* d, int arg);
182extern int msc_cmd_switch_freq(msc_drv* d);
183extern int msc_cmd_send_status(msc_drv* d);
184extern int msc_cmd_set_block_len(msc_drv* d, unsigned len);
185
186#endif /* __MSC_X1000_H__ */