| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- /*
- * File : stm32_sdio.h
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Change Logs:
- * Date Author Notes
- * 2018-6-22 tyx first
- */
- #ifndef __STM32_SDIO_H__
- #define __STM32_SDIO_H__
- #include <rtthread.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- #ifndef SDIO_BASE_ADDRESS
- #define SDIO_BASE_ADDRESS (0x40012800U)
- #endif
- #ifndef SDIO_CLOCK_FREQ
- #define SDIO_CLOCK_FREQ (48U * 1000 * 1000)
- #endif
- #ifndef SDIO_BUFF_SIZE
- #define SDIO_BUFF_SIZE (4096)
- #endif
- #ifndef SDIO_ALIGN
- #define SDIO_ALIGN (32)
- #endif
- #ifndef SDIO_MAX_FREQ
- #define SDIO_MAX_FREQ (24 * 1000 * 1000)
- #endif
- #define HW_SDIO_IT_CCRCFAIL (0x01U << 0)
- #define HW_SDIO_IT_DCRCFAIL (0x01U << 1)
- #define HW_SDIO_IT_CTIMEOUT (0x01U << 2)
- #define HW_SDIO_IT_DTIMEOUT (0x01U << 3)
- #define HW_SDIO_IT_TXUNDERR (0x01U << 4)
- #define HW_SDIO_IT_RXOVERR (0x01U << 5)
- #define HW_SDIO_IT_CMDREND (0x01U << 6)
- #define HW_SDIO_IT_CMDSENT (0x01U << 7)
- #define HW_SDIO_IT_DATAEND (0x01U << 8)
- #define HW_SDIO_IT_STBITERR (0x01U << 9)
- #define HW_SDIO_IT_DBCKEND (0x01U << 10)
- #define HW_SDIO_IT_CMDACT (0x01U << 11)
- #define HW_SDIO_IT_TXACT (0x01U << 12)
- #define HW_SDIO_IT_RXACT (0x01U << 13)
- #define HW_SDIO_IT_TXFIFOHE (0x01U << 14)
- #define HW_SDIO_IT_RXFIFOHF (0x01U << 15)
- #define HW_SDIO_IT_TXFIFOF (0x01U << 16)
- #define HW_SDIO_IT_RXFIFOF (0x01U << 17)
- #define HW_SDIO_IT_TXFIFOE (0x01U << 18)
- #define HW_SDIO_IT_RXFIFOE (0x01U << 19)
- #define HW_SDIO_IT_TXDAVL (0x01U << 20)
- #define HW_SDIO_IT_RXDAVL (0x01U << 21)
- #define HW_SDIO_IT_SDIOIT (0x01U << 22)
- #define HW_SDIO_ERRORS \
- (HW_SDIO_IT_CCRCFAIL | HW_SDIO_IT_CTIMEOUT | \
- HW_SDIO_IT_DCRCFAIL | HW_SDIO_IT_DTIMEOUT | \
- HW_SDIO_IT_RXOVERR | HW_SDIO_IT_TXUNDERR)
- #define HW_SDIO_POWER_OFF (0x00U)
- #define HW_SDIO_POWER_UP (0x02U)
- #define HW_SDIO_POWER_ON (0x03U)
- #define HW_SDIO_FLOW_ENABLE (0x01U << 14)
- #define HW_SDIO_BUSWIDE_1B (0x00U << 11)
- #define HW_SDIO_BUSWIDE_4B (0x01U << 11)
- #define HW_SDIO_BUSWIDE_8B (0x02U << 11)
- #define HW_SDIO_BYPASS_ENABLE (0x01U << 10)
- #define HW_SDIO_IDLE_ENABLE (0x01U << 9)
- #define HW_SDIO_CLK_ENABLE (0x01U << 8)
- #define HW_SDIO_SUSPEND_CMD (0x01U << 11)
- #define HW_SDIO_CPSM_ENABLE (0x01U << 10)
- #define HW_SDIO_WAIT_END (0x01U << 9)
- #define HW_SDIO_WAIT_INT (0x01U << 8)
- #define HW_SDIO_RESPONSE_NO (0x00U << 6)
- #define HW_SDIO_RESPONSE_SHORT (0x01U << 6)
- #define HW_SDIO_RESPONSE_LONG (0x03U << 6)
- #define HW_SDIO_DATA_LEN_MASK (0x01FFFFFFU)
- #define HW_SDIO_IO_ENABLE (0x01U << 11)
- #define HW_SDIO_RWMOD_CK (0x01U << 10)
- #define HW_SDIO_RWSTOP_ENABLE (0x01U << 9)
- #define HW_SDIO_RWSTART_ENABLE (0x01U << 8)
- #define HW_SDIO_DBLOCKSIZE_1 (0x00U << 4)
- #define HW_SDIO_DBLOCKSIZE_2 (0x01U << 4)
- #define HW_SDIO_DBLOCKSIZE_4 (0x02U << 4)
- #define HW_SDIO_DBLOCKSIZE_8 (0x03U << 4)
- #define HW_SDIO_DBLOCKSIZE_16 (0x04U << 4)
- #define HW_SDIO_DBLOCKSIZE_32 (0x05U << 4)
- #define HW_SDIO_DBLOCKSIZE_64 (0x06U << 4)
- #define HW_SDIO_DBLOCKSIZE_128 (0x07U << 4)
- #define HW_SDIO_DBLOCKSIZE_256 (0x08U << 4)
- #define HW_SDIO_DBLOCKSIZE_512 (0x09U << 4)
- #define HW_SDIO_DBLOCKSIZE_1024 (0x0AU << 4)
- #define HW_SDIO_DBLOCKSIZE_2048 (0x0BU << 4)
- #define HW_SDIO_DBLOCKSIZE_4096 (0x0CU << 4)
- #define HW_SDIO_DBLOCKSIZE_8192 (0x0DU << 4)
- #define HW_SDIO_DBLOCKSIZE_16384 (0x0EU << 4)
- #define HW_SDIO_DMA_ENABLE (0x01U << 3)
- #define HW_SDIO_STREAM_ENABLE (0x01U << 2)
- #define HW_SDIO_TO_HOST (0x01U << 1)
- #define HW_SDIO_DPSM_ENABLE (0x01U << 0)
- #define HW_SDIO_DATATIMEOUT (0xF0000000U)
- struct stm32_sdio
- {
- volatile rt_uint32_t power;
- volatile rt_uint32_t clkcr;
- volatile rt_uint32_t arg;
- volatile rt_uint32_t cmd;
- volatile rt_uint32_t respcmd;
- volatile rt_uint32_t resp1;
- volatile rt_uint32_t resp2;
- volatile rt_uint32_t resp3;
- volatile rt_uint32_t resp4;
- volatile rt_uint32_t dtimer;
- volatile rt_uint32_t dlen;
- volatile rt_uint32_t dctrl;
- volatile rt_uint32_t dcount;
- volatile rt_uint32_t sta;
- volatile rt_uint32_t icr;
- volatile rt_uint32_t mask;
- volatile rt_uint32_t reserved0[2];
- volatile rt_uint32_t fifocnt;
- volatile rt_uint32_t reserved1[13];
- volatile rt_uint32_t fifo;
- };
- typedef rt_err_t (*dma_txconfig)(rt_uint32_t *src, rt_uint32_t *dst, int size);
- typedef rt_err_t (*dma_rxconfig)(rt_uint32_t *src, rt_uint32_t *dst, int size);
- typedef rt_uint32_t (*sdio_clk_get)(struct stm32_sdio *hw_sdio);
- struct stm32_sdio_des
- {
- struct stm32_sdio *hw_sdio;
- dma_txconfig txconfig;
- dma_rxconfig rxconfig;
- sdio_clk_get clk_get;
- };
- struct rt_mmcsd_host *sdio_host_create(struct stm32_sdio_des *sdio_des);
- void rthw_sdio_irq_process(struct rt_mmcsd_host *host);
- #ifdef __cplusplus
- }
- #endif
- #endif
|