source: azure_iot_hub_f767zi/trunk/asp_baseplatform/pdic/stm32f7xx/sdmmc.h@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 12.3 KB
RevLine 
[457]1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2015-2016 by TOPPERS PROJECT Educational Working Group.
9 *
10 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation
11 * によって公表されている GNU General Public License の Version 2 に記
12 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
13 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * 利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * と.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * 報告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 *
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
34 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
35 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
36 *
37 * @(#) $Id$
38 */
39/*
40 * STM32F746用 SDMMCドライバインクルードファイル
41 */
42
43#ifndef _SDMMC_H_
44#define _SDMMC_H_
45
46#ifdef __cplusplus
47 extern "C" {
48#endif
49
50
51/*
52 * SDカード設定
53 */
54#ifdef TOPPERS_STM32F769_DISCOVERY
55#define INHNO_SDMMC IRQ_VECTOR_SDMMC2 /* 割込みハンドラ番号 */
56#define INTNO_SDMMC IRQ_VECTOR_SDMMC2 /* 割込み番号 */
57#define INTPRI_SDMMC -5 /* 割込み優先度 */
58#define INTATR_SDMMC TA_EDGE /* 割込み属性 */
59
60#define INHNO_DMARX IRQ_VECTOR_DMA2_STREAM0 /* 割込みハンドラ番号 */
61#define INTNO_DMARX IRQ_VECTOR_DMA2_STREAM0 /* 割込み番号 */
62#define INTPRI_DMARX -6 /* 割込み優先度 */
63#define INTATR_DMARX TA_EDGE /* 割込み属性 */
64#define DMARX_SID DMA2STM0_SID
65
66#define INHNO_DMATX IRQ_VECTOR_DMA2_STREAM5 /* 割込みハンドラ番号 */
67#define INTNO_DMATX IRQ_VECTOR_DMA2_STREAM5 /* 割込み番号 */
68#define INTPRI_DMATX -6 /* 割込み優先度 */
69#define INTATR_DMATX TA_EDGE /* 割込み属性 */
70#define DMATX_SID DMA2STM5_SID
71#else
72#define INHNO_SDMMC IRQ_VECTOR_SDMMC /* 割込みハンドラ番号 */
73#define INTNO_SDMMC IRQ_VECTOR_SDMMC /* 割込み番号 */
74#define INTPRI_SDMMC -5 /* 割込み優先度 */
75#define INTATR_SDMMC TA_EDGE /* 割込み属性 */
76
77#define INHNO_DMARX IRQ_VECTOR_DMA2_STREAM3 /* 割込みハンドラ番号 */
78#define INTNO_DMARX IRQ_VECTOR_DMA2_STREAM3 /* 割込み番号 */
79#define INTPRI_DMARX -6 /* 割込み優先度 */
80#define INTATR_DMARX TA_EDGE /* 割込み属性 */
81#define DMARX_SID DMA2STM3_SID
82
83#define INHNO_DMATX IRQ_VECTOR_DMA2_STREAM6 /* 割込みハンドラ番号 */
84#define INTNO_DMATX IRQ_VECTOR_DMA2_STREAM6 /* 割込み番号 */
85#define INTPRI_DMATX -6 /* 割込み優先度 */
86#define INTATR_DMATX TA_EDGE /* 割込み属性 */
87#define DMATX_SID DMA2STM6_SID
88#endif
89
90
91#define CMD_SHORTRESP (1<<6) /* short response */
92#define CMD_LONGRESP (1<<7) /* long response */
93#define CMD_SLONGRESP (CMD_SHORTRESP|CMD_LONGRESP)
94#define CMD_TIMEOUT (1<<8) /* timeout request bit */
95#define CMD_SETLAST (1<<10)
96#define CMD_MASK 0xFFFF
97#define CMD_IGNOREIRES (1<<16)
98#define CMD_INDEX 0x003F
99
100/*
101 * SD/MMC コマンドリスト
102 */
103#define MCI_CMD0 (0x0000) /* GO_IDLE_STATE(MMC) or RESET(SD) */
104#define MCI_CMD1 (0x0001|CMD_SHORTRESP|CMD_IGNOREIRES) /* SEND_OP_COND(MMC) or CMD1(SD) */
105#define MCI_CMD2 (0x0002|CMD_SLONGRESP|CMD_IGNOREIRES) /* ALL SEND_CID */
106#define MCI_CMD3 (0x0003|CMD_SHORTRESP) /* SET_RELATE_ADDR */
107#define MCI_CMD6 (0x0006|CMD_SHORTRESP)
108#define MCI_CMD7 (0x0007|CMD_SHORTRESP) /* SELECT/DESELECT_CARD */
109#define MCI_CMD8 (0x0008|CMD_SHORTRESP) /* HS_SEND_EXT_CSD */
110#define MCI_CMD9 (0x0009|CMD_SLONGRESP|CMD_IGNOREIRES) /* SEND_CSD */
111#define MCI_CMD12 (0x000C|CMD_SHORTRESP) /* Stop either READ or WRITE operation */
112#define MCI_CMD13 (0x000D|CMD_SHORTRESP) /* SEND_STATUS */
113#define MCI_CMD16 (0x0010|CMD_SHORTRESP) /* SET_BLOCK_LEN */
114#define MCI_CMD17 (0x0011|CMD_SHORTRESP) /* READ_SINGLE_BLOCK */
115#define MCI_CMD18 (0x0012|CMD_SHORTRESP) /* READ_MULTI_BLOCK */
116#define MCI_CMD24 (0x0018|CMD_SHORTRESP) /* WRITE_SINGLE_BLOCK */
117#define MCI_CMD25 (0x0019|CMD_SHORTRESP) /* WRITE_MULTI_BLOCK */
118#define MCI_CMD32 (0x0020|CMD_SHORTRESP) /* ERASE_GRP_START */
119#define MCI_CMD33 (0x0021|CMD_SHORTRESP) /* ERASE_GRP_END */
120#define MCI_CMD38 (0x0026|CMD_SHORTRESP) /* ERASE */
121#define MCI_CMD55 (0x0037|CMD_SHORTRESP) /* APP_CMD, the following will a ACMD */
122
123#define MCI_ACMD6 (0x0006|CMD_SHORTRESP) /* ACMD6 for SD card BUSWIDTH */
124#define MCI_ACMD13 (0x000D|CMD_SHORTRESP) /* ACMD23 for SD card status */
125#define MCI_ACMD41 (0x0029|CMD_SHORTRESP|CMD_IGNOREIRES) /* ACMD41 for SD card */
126#define MCI_ACMD51 (0x0033|CMD_SHORTRESP) /* ACMD41 for SD SCR */
127
128#define RES_CMD1 (MCI_CMD1 & CMD_INDEX)
129#define RES_CMD12 (MCI_CMD12 & CMD_INDEX)
130#define RES_ACMD41 (MCI_ACMD41 & CMD_INDEX)
131
132#define OCR_INDEX 0x00FF8000
133
134#define CARD_STATUS_ACMD_ENABLE (1<<5)
135#define CARD_STATUS_RDY_DATA (1<<8)
136#define CARD_STATUS_CURRENT_STATE (0x0F<<9)
137#define CARD_STATUS_ERASE_RESET (1<<13)
138
139#define SLOW_RATE 1
140#define NORMAL_RATE 2
141
142#define SD_1_BIT 0
143#define SD_4_BIT 1
144
145#define SD_CARD_V11 0
146#define SD_CARD_V20 1
147#define SD_CARD_HC 2
148#define MMC_CARD 3
149#define SD_IO_CARD 4
150#define HS_MM_CARD 5
151#define SD_IO_COMBO_CARD 6
152#define MMC_CARD_HC 7
153
154
155#define MCI_NOTEND 0
156#define MCI_END 1
157#define MCI_ERREND 2
158
159#define SDMODE_PROTECT (1<<5)
160
161/*
162 * SDMMC拡張エラー定義
163 */
164#define E_SDCOM (-80) /* コマンドエラー */
165#define E_SDCRC (-81) /* CRCエラー */
166#define E_SDECMD (-82) /* コマンドインデックスエラー */
167#define E_SDVOL (-83) /* 電圧エラー */
168#define E_SDTRS (-84) /* 通信エラー */
169
170/*
171 * カード転送状態定義
172 */
173#define SD_TRANSFER_OK 0 /* 転送成功 */
174#define SD_TRANSFER_BUSY 1 /* 転送中 */
175#define SD_TRANSFER_ERROR 2 /* 転送エラー */
176
177
178/*
179 * バス幅定義
180 */
181#define SDMMC_BUS_WIDE_1B 0x00000000
182#define SDMMC_BUS_WIDE_4B SDMMC_CLKCR_WIDBUS_0
183#define SDMMC_BUS_WIDE_8B SDMMC_CLKCR_WIDBUS_1
184
185
186/*
187 * SDMMC用データブロックサイズ定義
188 */
189#define SDMMC_DBSIZE_1B 0x00000000
190#define SDMMC_DBSIZE_2B SDMMC_DCTRL_DBLOCKSIZE_0
191#define SDMMC_DBSIZE_4B SDMMC_DCTRL_DBLOCKSIZE_1
192#define SDMMC_DBSIZE_8B (SDMMC_DCTRL_DBLOCKSIZE_0|SDMMC_DCTRL_DBLOCKSIZE_1)
193#define SDMMC_DBSIZE_16B SDMMC_DCTRL_DBLOCKSIZE_2
194#define SDMMC_DBSIZE_32B (SDMMC_DCTRL_DBLOCKSIZE_0|SDMMC_DCTRL_DBLOCKSIZE_2)
195#define SDMMC_DBSIZE_64B (SDMMC_DCTRL_DBLOCKSIZE_1|SDMMC_DCTRL_DBLOCKSIZE_2)
196#define SDMMC_DBSIZE_128B (SDMMC_DCTRL_DBLOCKSIZE_0|SDMMC_DCTRL_DBLOCKSIZE_1|SDMMC_DCTRL_DBLOCKSIZE_2)
197#define SDMMC_DBSIZE_256B SDMMC_DCTRL_DBLOCKSIZE_3
198#define SDMMC_DBSIZE_512B (SDMMC_DCTRL_DBLOCKSIZE_0|SDMMC_DCTRL_DBLOCKSIZE_3)
199#define SDMMC_DBSIZE_1024B (SDMMC_DCTRL_DBLOCKSIZE_1|SDMMC_DCTRL_DBLOCKSIZE_3)
200#define SDMMC_DBSIZE_2048B (SDMMC_DCTRL_DBLOCKSIZE_0|SDMMC_DCTRL_DBLOCKSIZE_1|SDMMC_DCTRL_DBLOCKSIZE_3)
201#define SDMMC_DBSIZE_4096B (SDMMC_DCTRL_DBLOCKSIZE_2|SDMMC_DCTRL_DBLOCKSIZE_3)
202#define SDMMC_DBSIZE_8192B (SDMMC_DCTRL_DBLOCKSIZE_0|SDMMC_DCTRL_DBLOCKSIZE_2|SDMMC_DCTRL_DBLOCKSIZE_3)
203#define SDMMC_DBSIZE_16384B (SDMMC_DCTRL_DBLOCKSIZE_1|SDMMC_DCTRL_DBLOCKSIZE_2|SDMMC_DCTRL_DBLOCKSIZE_3)
204
205/*
206 * SDMMC初期設定周波数
207 */
208#define SDMMC_INIT_CLK_DIV 0x76
209
210/*
211 * SDMMCデータ転送用周波数
212 */
213#define SDMMC_TRANSFER_CLK_DIV 0x0
214
215
216/*
217 * SDMMCハンドラ構造体定義
218 */
219
220typedef struct
221{
222 uint32_t base; /* SDMMCレジスタベースアドレス */
223 uint32_t ClockMode; /* 指定クロックモード */
224 uint32_t BusWide; /* 指定バス幅 */
225 uint32_t RetryCount; /* リトライ回数 */
226 uint32_t cardtype; /* カードタイプ */
227 uint32_t RCA; /* RCA値 */
228 uint32_t CSD[4]; /* CSD値 */
229 uint32_t CID[4]; /* CID値 */
230 volatile uint32_t status; /* 転送状態 */
231 volatile uint32_t SdCmd; /* 転送指定コマンド */
232 DMA_Handle_t *hdmarx; /* 受信用DMAハンドラ */
233 DMA_Handle_t *hdmatx; /* 送信用DMAハンドラ */
234}SDMMC_Handle_t;
235
236/*
237 * SDMMCカード情報構造体
238 */
239typedef struct
240{
241 uint64_t capacity; /* 容量(バイト) */
242 uint32_t blocksize; /* ブロックサイズ */
243 uint32_t maxsector; /* 最大セクタ数 */
244 uint16_t RCA; /* SD RCA */
245 uint8_t cardtype; /* カード種類 */
246 uint8_t status; /* ステータス */
247
248}SDMMC_CardInfo_t;
249
250
251/*
252 * CMD13カード状態
253 */
254#define SD_CARD_READY 0x00000001 /* カードレディ状態 */
255#define SD_CARD_IDENTIFICATION 0x00000002 /* カードアイデンティフィケーション状態 */
256#define SD_CARD_STANDBY 0x00000003 /* カードスタンバィ状態 */
257#define SD_CARD_TRANSFER 0x00000004 /* カード転送状態 */
258#define SD_CARD_SENDING 0x00000005 /* カード送信状態 */
259#define SD_CARD_RECEIVING 0x00000006 /* カード受信状態 */
260#define SD_CARD_PROGRAMMING 0x00000007 /* カードプログラミング状態 */
261#define SD_CARD_DISCONNECTED 0x00000008 /* カードディスコネクト状態 */
262#define SD_CARD_ERROR 0x000000FF /* カードエラー状態 */
263
264
265extern void sdmmc_init(intptr_t exinf);
266extern bool_t sdmmc_sense(int id);
267extern SDMMC_Handle_t *sdmmc_open(int id);
268extern ER sdmmc_close(SDMMC_Handle_t *hsd);
269extern ER sdmmc_erase(SDMMC_Handle_t *hsd, uint64_t startaddr, uint64_t endaddr);
270extern ER sdmmc_blockread(SDMMC_Handle_t *hsd, uint32_t *pbuf, uint64_t ReadAddr, uint32_t blocksize, uint32_t num);
271extern ER sdmmc_blockwrite(SDMMC_Handle_t *hsd, uint32_t *pbuf, uint64_t WriteAddr, uint32_t blocksize, uint32_t num);
272extern ER sdmmc_wait_transfar(SDMMC_Handle_t *hsd, uint32_t Timeout);
273extern void sdmmc_checkint(SDMMC_Handle_t *hsd);
274
275extern ER sdmmc_getcardinfo(SDMMC_Handle_t *hsd, SDMMC_CardInfo_t *pCardInfo);
276extern ER sdmmc_checkCID(SDMMC_Handle_t *hsd);
277extern ER sdmmc_setaddress(SDMMC_Handle_t *hsd);
278extern ER sdmmc_sendCSD(SDMMC_Handle_t *hsd);
279extern ER sdmmc_select_card(SDMMC_Handle_t *hsd, uint64_t addr);
280extern ER sdmmc_configuration(SDMMC_Handle_t *hsd);
281extern ER sdmmc_set_widebus(SDMMC_Handle_t *hsd);
282extern uint32_t sdmmc_getstatus(SDMMC_Handle_t *hsd);
283
284
285#ifdef __cplusplus
286}
287#endif
288
289
290#endif /* _SDMMC_H_ */
291
Note: See TracBrowser for help on using the repository browser.