11bd4fe43Sopenharmony_ci/* 21bd4fe43Sopenharmony_ci * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 31bd4fe43Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41bd4fe43Sopenharmony_ci * you may not use this file except in compliance with the License. 51bd4fe43Sopenharmony_ci * You may obtain a copy of the License at 61bd4fe43Sopenharmony_ci * 71bd4fe43Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81bd4fe43Sopenharmony_ci * 91bd4fe43Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101bd4fe43Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111bd4fe43Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121bd4fe43Sopenharmony_ci * See the License for the specific language governing permissions and 131bd4fe43Sopenharmony_ci * limitations under the License. 141bd4fe43Sopenharmony_ci */ 151bd4fe43Sopenharmony_ci 161bd4fe43Sopenharmony_ci#ifndef SDHCI_H 171bd4fe43Sopenharmony_ci#define SDHCI_H 181bd4fe43Sopenharmony_ci 191bd4fe43Sopenharmony_ci#include "asm/dma.h" 201bd4fe43Sopenharmony_ci#include "asm/io.h" 211bd4fe43Sopenharmony_ci#include "asm/platform.h" 221bd4fe43Sopenharmony_ci#include "device_resource_if.h" 231bd4fe43Sopenharmony_ci#include "linux/scatterlist.h" 241bd4fe43Sopenharmony_ci#include "los_bitmap.h" 251bd4fe43Sopenharmony_ci#include "los_event.h" 261bd4fe43Sopenharmony_ci#include "los_vm_zone.h" 271bd4fe43Sopenharmony_ci#include "mmc_corex.h" 281bd4fe43Sopenharmony_ci#include "osal_io.h" 291bd4fe43Sopenharmony_ci#include "osal_irq.h" 301bd4fe43Sopenharmony_ci#include "osal_time.h" 311bd4fe43Sopenharmony_ci 321bd4fe43Sopenharmony_ci#ifdef __cplusplus 331bd4fe43Sopenharmony_ci#if __cplusplus 341bd4fe43Sopenharmony_ciextern "C" { 351bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 361bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 371bd4fe43Sopenharmony_ci 381bd4fe43Sopenharmony_ci#define REG_CTRL_SD_CLK IO_DEVICE_ADDR(0x100C0040) 391bd4fe43Sopenharmony_ci#define REG_CTRL_SD_CMD IO_DEVICE_ADDR(0x100C0044) 401bd4fe43Sopenharmony_ci#define REG_CTRL_SD_DATA0 IO_DEVICE_ADDR(0x100C0048) 411bd4fe43Sopenharmony_ci#define REG_CTRL_SD_DATA1 IO_DEVICE_ADDR(0x100C004C) 421bd4fe43Sopenharmony_ci#define REG_CTRL_SD_DATA2 IO_DEVICE_ADDR(0x100C0050) 431bd4fe43Sopenharmony_ci#define REG_CTRL_SD_DATA3 IO_DEVICE_ADDR(0x100C0054) 441bd4fe43Sopenharmony_ci 451bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_CLK IO_DEVICE_ADDR(0x100C0014) 461bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_CMD IO_DEVICE_ADDR(0x100C0018) 471bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA0 IO_DEVICE_ADDR(0x100C0020) 481bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA1 IO_DEVICE_ADDR(0x100C001c) 491bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA2 IO_DEVICE_ADDR(0x100C0028) 501bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA3 IO_DEVICE_ADDR(0x100C0024) 511bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA4 IO_DEVICE_ADDR(0x100C0030) 521bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA5 IO_DEVICE_ADDR(0x100C0034) 531bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA6 IO_DEVICE_ADDR(0x100C0038) 541bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DATA7 IO_DEVICE_ADDR(0x100C003c) 551bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_DS IO_DEVICE_ADDR(0x100C0058) 561bd4fe43Sopenharmony_ci#define REG_CTRL_EMMC_RST IO_DEVICE_ADDR(0x100C005C) 571bd4fe43Sopenharmony_ci 581bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_CLK IO_DEVICE_ADDR(0x112C0048) 591bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_CMD IO_DEVICE_ADDR(0x112C004C) 601bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_DATA0 IO_DEVICE_ADDR(0x112C0064) 611bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_DATA1 IO_DEVICE_ADDR(0x112C0060) 621bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_DATA2 IO_DEVICE_ADDR(0x112C005C) 631bd4fe43Sopenharmony_ci#define REG_CTRL_SDIO_DATA3 IO_DEVICE_ADDR(0x112C0058) 641bd4fe43Sopenharmony_ci 651bd4fe43Sopenharmony_ci/* macro for io_mux. */ 661bd4fe43Sopenharmony_ci#define IO_CFG_SR (1 << 10) 671bd4fe43Sopenharmony_ci#define IO_CFG_PULL_DOWN (1 << 9) 681bd4fe43Sopenharmony_ci#define IO_CFG_PULL_UP (1 << 8) 691bd4fe43Sopenharmony_ci#define IO_CFG_DRV_STR_MASK (0xfU << 4) 701bd4fe43Sopenharmony_ci#define IO_DRV_MASK 0x7f0 711bd4fe43Sopenharmony_ci 721bd4fe43Sopenharmony_ci#define IO_DRV_STR_SEL(str) ((str) << 4) 731bd4fe43Sopenharmony_ci 741bd4fe43Sopenharmony_ci#define IO_MUX_CLK_TYPE_EMMC 0x0 751bd4fe43Sopenharmony_ci#define IO_MUX_CLK_TYPE_SD 0x1 761bd4fe43Sopenharmony_ci#define IO_MUX_SHIFT(type) ((type) << 0) 771bd4fe43Sopenharmony_ci#define IO_MUX_MASK (0xfU << 0) 781bd4fe43Sopenharmony_ci 791bd4fe43Sopenharmony_ci#define IO_DRV_SDIO_CLK 0x3 801bd4fe43Sopenharmony_ci#define IO_DRV_SDIO_CMD 0x6 811bd4fe43Sopenharmony_ci#define IO_DRV_SDIO_DATA 0x6 821bd4fe43Sopenharmony_ci 831bd4fe43Sopenharmony_ci#define IO_DRV_SD_SDHS_CLK 0x5 841bd4fe43Sopenharmony_ci#define IO_DRV_SD_SDHS_CMD 0x7 851bd4fe43Sopenharmony_ci#define IO_DRV_SD_SDHS_DATA 0x7 861bd4fe43Sopenharmony_ci 871bd4fe43Sopenharmony_ci#define IO_DRV_SD_OTHER_CLK 0x7 881bd4fe43Sopenharmony_ci#define IO_DRV_SD_OTHER_CMD IO_DRV_SD_OTHER_CLK 891bd4fe43Sopenharmony_ci#define IO_DRV_SD_OTHER_DATA IO_DRV_SD_OTHER_CLK 901bd4fe43Sopenharmony_ci 911bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS400_CLK 0x3 921bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS400_CMD 0x4 931bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS400_DATA 0x4 941bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS400_DS 0x3 951bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS400_RST 0x3 961bd4fe43Sopenharmony_ci 971bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS200_CLK 0x2 981bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS200_CMD 0x4 991bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS200_DATA 0x4 1001bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS200_RST 0x3 1011bd4fe43Sopenharmony_ci 1021bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS_CLK 0x4 1031bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS_CMD 0x6 1041bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS_DATA 0x6 1051bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_HS_RST 0x3 1061bd4fe43Sopenharmony_ci 1071bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_OTHER_CLK 0x5 1081bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_OTHER_CMD 0x6 1091bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_OTHER_DATA 0x6 1101bd4fe43Sopenharmony_ci#define IO_DRV_EMMC_OTHER_RST 0x3 1111bd4fe43Sopenharmony_ci 1121bd4fe43Sopenharmony_ci#define PERI_CRG125 (CRG_REG_BASE + 0x01F4) 1131bd4fe43Sopenharmony_ci#define PERI_CRG126 (CRG_REG_BASE + 0x01F8) 1141bd4fe43Sopenharmony_ci#define PERI_CRG127 (CRG_REG_BASE + 0x01FC) 1151bd4fe43Sopenharmony_ci#define PERI_CRG135 (CRG_REG_BASE + 0x021C) 1161bd4fe43Sopenharmony_ci#define PERI_CRG136 (CRG_REG_BASE + 0x0220) 1171bd4fe43Sopenharmony_ci#define PERI_CRG139 (CRG_REG_BASE + 0x022C) 1181bd4fe43Sopenharmony_ci#define PERI_SD_DRV_DLL_CTRL (CRG_REG_BASE + 0x210) 1191bd4fe43Sopenharmony_ci#define PERI_SDIO_DRV_DLL_CTRL (CRG_REG_BASE + 0x228) 1201bd4fe43Sopenharmony_ci#define PERI_SD_SAMPL_DLL_STATUS (CRG_REG_BASE + 0x208) 1211bd4fe43Sopenharmony_ci#define PERI_SDIO_SAMPL_DLL_STATUS (CRG_REG_BASE + 0x224) 1221bd4fe43Sopenharmony_ci 1231bd4fe43Sopenharmony_ci/* 1241bd4fe43Sopenharmony_ci * PERI_CRG125/PERI_CRG139 details. 1251bd4fe43Sopenharmony_ci * [28]Clock gating configuration. 0: disabled; 1: enabled. 1261bd4fe43Sopenharmony_ci * [27]Soft reset request. 0: reset deasserted; 1: reset. 1271bd4fe43Sopenharmony_ci * [26:24]Working clock selection. 000: 100KHz; 001: 400KHz; 010: 25MHz; 011: 50MKz; 1281bd4fe43Sopenharmony_ci * 100: 90MKz(Supported only in eMMC mode); 101: 112.5MKz(Supported only in eMMC mode); 1291bd4fe43Sopenharmony_ci * 110: 150MKz(Supported only in eMMC mode); others: reserved. 1301bd4fe43Sopenharmony_ci */ 1311bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_MASK 0x7 1321bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_SHIFT 24 1331bd4fe43Sopenharmony_ci#define SDHCI_CKEN (1U << 28) 1341bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_100K 0 1351bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_400K 1 1361bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_25M 2 1371bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_50M 3 1381bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_90M 4 1391bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_112P5M 5 1401bd4fe43Sopenharmony_ci#define SDHCI_CLK_SEL_150M 6 1411bd4fe43Sopenharmony_ci#define SDHCI_EMMC_CRG_REQ (1U << 27) 1421bd4fe43Sopenharmony_ci#define SDHCI_EMMC_CKEN (1U << 28) 1431bd4fe43Sopenharmony_ci#define SDHCI_EMMC_DLL_RST (1U << 29) 1441bd4fe43Sopenharmony_ci 1451bd4fe43Sopenharmony_ci/* 1461bd4fe43Sopenharmony_ci * PERI_CRG126/PERI_CRG135 details. 1471bd4fe43Sopenharmony_ci * [4:0]Clock phase configuration for B clock debugging during edge detection. The default value is 90 degrees. 1481bd4fe43Sopenharmony_ci * 0x00: 0; 0x01: 11.25; 0x02: 22.5; ... 0x1E: 337.5; 0x1F: 348.75; others: reserved. 1491bd4fe43Sopenharmony_ci */ 1501bd4fe43Sopenharmony_ci#define SDHCI_SAMPLB_DLL_CLK_MASK (0x1fU << 0) 1511bd4fe43Sopenharmony_ci#define SDHCI_SAMPLB_DLL_CLK 8 1521bd4fe43Sopenharmony_ci#define SDHCI_SAMPLB_SEL(phase) ((phase) << 0) 1531bd4fe43Sopenharmony_ci 1541bd4fe43Sopenharmony_ci/* 1551bd4fe43Sopenharmony_ci * PERI_CRG127/PERI_CRG136 details. 1561bd4fe43Sopenharmony_ci * [28:24]Clock phase configuration. Default value: 180. 1571bd4fe43Sopenharmony_ci * 0x00: 0; 0x01: 11.25; 0x02: 22.5; ... 0x1E: 337.5; 0x1F: 348.75; others: reserved. 1581bd4fe43Sopenharmony_ci */ 1591bd4fe43Sopenharmony_ci#define SDHCI_DRV_CLK_PHASE_SHFT 24 1601bd4fe43Sopenharmony_ci#define SDHCI_DRV_CLK_PHASE_MASK (0x1f << 24) 1611bd4fe43Sopenharmony_ci#define SDHCI_PHASE_112P5_DEGREE 10 /* 112.5 degree */ 1621bd4fe43Sopenharmony_ci#define SDHCI_PHASE_258P75_DEGREE 23 /* 258.75 degree */ 1631bd4fe43Sopenharmony_ci#define SDHCI_PHASE_225_DEGREE 20 /* 225 degree */ 1641bd4fe43Sopenharmony_ci#define SDHCI_PHASE_180_DEGREE 16 /* 180 degree */ 1651bd4fe43Sopenharmony_ci 1661bd4fe43Sopenharmony_ci/* 1671bd4fe43Sopenharmony_ci * PERI_SD_DRV_DLL_CTRL/PERI_SDIO_DRV_DLL_CTRL details. 1681bd4fe43Sopenharmony_ci */ 1691bd4fe43Sopenharmony_ci#define SDHCI_DRV_DLL_LOCK (1U << 15) 1701bd4fe43Sopenharmony_ci 1711bd4fe43Sopenharmony_ci/* 1721bd4fe43Sopenharmony_ci * PERI_SD_SAMPL_DLL_STATUS/PERI_SDIO_SAMPL_DLL_STATUS details. 1731bd4fe43Sopenharmony_ci */ 1741bd4fe43Sopenharmony_ci#define SDHCI_SAMPL_DLL_DEV_READY 1 1751bd4fe43Sopenharmony_ci#define SDHCI_SAMPL_DLL_DEV_EN (1U << 16) 1761bd4fe43Sopenharmony_ci 1771bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_100K 100000 1781bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_400K 400000 1791bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_25M 25000000 1801bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_50M 50000000 1811bd4fe43Sopenharmony_ci/* only support for EMMC chip */ 1821bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_90M 90000000 1831bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_112P5M 112500000 1841bd4fe43Sopenharmony_ci#define SDHCI_MMC_FREQ_150M 150000000 1851bd4fe43Sopenharmony_ci 1861bd4fe43Sopenharmony_ci#define SDHCI_CMD_DATA_REQ_TIMEOUT (LOSCFG_BASE_CORE_TICK_PER_SECOND * 10) /* 30 s */ 1871bd4fe43Sopenharmony_ci#define SDHCI_CMD_REQ_TIMEOUT (LOSCFG_BASE_CORE_TICK_PER_SECOND * 1) /* 1s */ 1881bd4fe43Sopenharmony_ci 1891bd4fe43Sopenharmony_ci/* define event lock */ 1901bd4fe43Sopenharmony_citypedef EVENT_CB_S SDHCI_EVENT; 1911bd4fe43Sopenharmony_ci#define SDHCI_EVENT_INIT(event) LOS_EventInit(event) 1921bd4fe43Sopenharmony_ci#define SDHCI_EVENT_SIGNAL(event, bit) LOS_EventWrite(event, bit) 1931bd4fe43Sopenharmony_ci#define SDHCI_EVENT_WAIT(event, bit, timeout) LOS_EventRead(event, bit, (LOS_WAITMODE_OR + LOS_WAITMODE_CLR), timeout) 1941bd4fe43Sopenharmony_ci#define SDHCI_EVENT_DELETE(event) LOS_EventDestroy(event) 1951bd4fe43Sopenharmony_ci 1961bd4fe43Sopenharmony_ci/* define irq lock */ 1971bd4fe43Sopenharmony_ci#define SDHCI_IRQ_LOCK(flags) do { (*(flags)) = LOS_IntLock(); } while (0) 1981bd4fe43Sopenharmony_ci#define SDHCI_IRQ_UNLOCK(flags) do { LOS_IntRestore(flags); } while (0) 1991bd4fe43Sopenharmony_ci 2001bd4fe43Sopenharmony_ci#define SDHCI_SG_DMA_ADDRESS(sg) ((sg)->dma_address) 2011bd4fe43Sopenharmony_ci#ifdef CONFIG_NEED_SG_DMA_LENGTH 2021bd4fe43Sopenharmony_ci#define SDHCI_SG_DMA_LEN(sg) ((sg)->dma_length) 2031bd4fe43Sopenharmony_ci#else 2041bd4fe43Sopenharmony_ci#define SDHCI_SG_DMA_LEN(sg) ((sg)->length) 2051bd4fe43Sopenharmony_ci#endif 2061bd4fe43Sopenharmony_ci 2071bd4fe43Sopenharmony_ci/* 2081bd4fe43Sopenharmony_ci * Host SDMA buffer boundary. Valid values from 4K to 512K in powers of 2. 2091bd4fe43Sopenharmony_ci */ 2101bd4fe43Sopenharmony_ci#define SDHCI_DEFAULT_BOUNDARY_SIZE (512 * 1024) 2111bd4fe43Sopenharmony_ci#define SDHCI_DEFAULT_BOUNDARY 19 2121bd4fe43Sopenharmony_ci#define SDHCI_DEFAULT_BOUNDARY_ARG (SDHCI_DEFAULT_BOUNDARY - 12) 2131bd4fe43Sopenharmony_ci 2141bd4fe43Sopenharmony_cienum SdhciDmaDataDirection { 2151bd4fe43Sopenharmony_ci DMA_BIDIRECTIONAL = 0, 2161bd4fe43Sopenharmony_ci DMA_TO_DEVICE = 1, 2171bd4fe43Sopenharmony_ci DMA_FROM_DEVICE = 2, 2181bd4fe43Sopenharmony_ci DMA_NONE = 3, 2191bd4fe43Sopenharmony_ci}; 2201bd4fe43Sopenharmony_ci 2211bd4fe43Sopenharmony_cienum SdhciHostRegister { 2221bd4fe43Sopenharmony_ci SDMASA_R = 0x0000, 2231bd4fe43Sopenharmony_ci BLOCKSIZE_R = 0x0004, 2241bd4fe43Sopenharmony_ci BLOCKCOUNT_R = 0x0006, 2251bd4fe43Sopenharmony_ci ARGUMENT_R = 0x0008, 2261bd4fe43Sopenharmony_ci XFER_MODE_R = 0x000c, 2271bd4fe43Sopenharmony_ci CMD_R = 0x000e, 2281bd4fe43Sopenharmony_ci RESP01_R = 0x0010, 2291bd4fe43Sopenharmony_ci RESP23_R = 0x0014, 2301bd4fe43Sopenharmony_ci RESP45_R = 0x0018, 2311bd4fe43Sopenharmony_ci RESP67_R = 0x001c, 2321bd4fe43Sopenharmony_ci BUF_DATA_R = 0x0020, 2331bd4fe43Sopenharmony_ci PSTATE_R = 0x0024, 2341bd4fe43Sopenharmony_ci HOST_CTRL1_R = 0x0028, 2351bd4fe43Sopenharmony_ci PWR_CTRL_R = 0x0029, 2361bd4fe43Sopenharmony_ci BLOCK_GAP_CTRL_R = 0x002a, 2371bd4fe43Sopenharmony_ci WUP_CTRL_R = 0x002b, 2381bd4fe43Sopenharmony_ci CLK_CTRL_R = 0x002c, 2391bd4fe43Sopenharmony_ci TOUT_CTRL_R = 0x002e, 2401bd4fe43Sopenharmony_ci SW_RST_R = 0x002f, 2411bd4fe43Sopenharmony_ci NORMAL_INT_STAT_R = 0x0030, 2421bd4fe43Sopenharmony_ci ERROR_INT_STAT_R = 0x0032, 2431bd4fe43Sopenharmony_ci NORMAL_INT_STAT_EN_R = 0x0034, 2441bd4fe43Sopenharmony_ci ERROR_INT_STAT_EN_R = 0x0036, 2451bd4fe43Sopenharmony_ci NORMAL_INT_SIGNAL_EN_R = 0x0038, 2461bd4fe43Sopenharmony_ci ERROR_INT_SIGNAL_EN_R = 0x003a, 2471bd4fe43Sopenharmony_ci AUTO_CMD_STAT_R = 0x003c, 2481bd4fe43Sopenharmony_ci HOST_CTRL2_R = 0x003e, 2491bd4fe43Sopenharmony_ci CAPABILITIES1_R = 0x0040, 2501bd4fe43Sopenharmony_ci CAPABILITIES2_R = 0x0044, 2511bd4fe43Sopenharmony_ci CURR_CAPBILITIES1_R = 0x0048, 2521bd4fe43Sopenharmony_ci ADMA_ERR_STAT_R = 0x0054, 2531bd4fe43Sopenharmony_ci ADMA_SA_LOW_R = 0x0058, 2541bd4fe43Sopenharmony_ci ADMA_SA_HIGH_R = 0x005c, 2551bd4fe43Sopenharmony_ci ADMA_ID_LOW_R = 0x0078, 2561bd4fe43Sopenharmony_ci ADMA_ID_HIGH_R = 0x007c, 2571bd4fe43Sopenharmony_ci SLOT_INT_STATUS_R = 0x00FC, 2581bd4fe43Sopenharmony_ci HOST_VERSION_R = 0x00FE, 2591bd4fe43Sopenharmony_ci MSHC_VER_ID_R = 0x0500, 2601bd4fe43Sopenharmony_ci MSHC_VER_TYPE_R = 0x0504, 2611bd4fe43Sopenharmony_ci MSHC_CTRL_R = 0x0508, 2621bd4fe43Sopenharmony_ci MBIU_CTRL_R = 0x0510, 2631bd4fe43Sopenharmony_ci EMMC_CTRL_R = 0x052c, 2641bd4fe43Sopenharmony_ci BOOT_CTRL_R = 0x052e, 2651bd4fe43Sopenharmony_ci EMMC_HW_RESET_R = 0x0534, 2661bd4fe43Sopenharmony_ci AT_CTRL_R = 0x0540, 2671bd4fe43Sopenharmony_ci AT_STAT_R = 0x0544, 2681bd4fe43Sopenharmony_ci MULTI_CYCLE_R = 0x054c 2691bd4fe43Sopenharmony_ci}; 2701bd4fe43Sopenharmony_ci 2711bd4fe43Sopenharmony_ci/* 2721bd4fe43Sopenharmony_ci * SDMASA_R(0x0000) details. 2731bd4fe43Sopenharmony_ci * [31:0]Whether to use the built-in DMA to transfer data. 2741bd4fe43Sopenharmony_ci * If Host Version Enable is set to 0, it indicates the SDMA system address. 2751bd4fe43Sopenharmony_ci * If Host Version Enable is set to 1, it indicates the block count. 1 indicates a block. 2761bd4fe43Sopenharmony_ci */ 2771bd4fe43Sopenharmony_ci#define SDHCI_DMA_ADDRESS 0x00 2781bd4fe43Sopenharmony_ci#define SDHCI_ARGUMENT2 SDHCI_DMA_ADDRESS 2791bd4fe43Sopenharmony_ci 2801bd4fe43Sopenharmony_ci/* 2811bd4fe43Sopenharmony_ci * BLOCKSIZE_R(0x0004) details. 2821bd4fe43Sopenharmony_ci * [14:12]Boundary value of an SDMA data block. 000: 4K bytes; 001: 8K bytes; ... 111: 512K bytes. 2831bd4fe43Sopenharmony_ci * [11:0]Transfer block zise. 0x800: 2048bytes. 2841bd4fe43Sopenharmony_ci */ 2851bd4fe43Sopenharmony_ci#define SDHCI_MAKE_BLKSZ(dma, blksz) (((dma & 0x7) << 12) | (blksz & 0xFFF)) 2861bd4fe43Sopenharmony_ci 2871bd4fe43Sopenharmony_ci/* 2881bd4fe43Sopenharmony_ci * XFER_MODE_R(0x000c) details. 2891bd4fe43Sopenharmony_ci * [15:9]reserved. 2901bd4fe43Sopenharmony_ci * [8]Disable the response interrupt. 0: enable; 1: disable. 2911bd4fe43Sopenharmony_ci * [7]Response error check enable. 0: disable; 1: enable. 2921bd4fe43Sopenharmony_ci * [6]Response R1/R5 Type. 0: R1; 1: R5. 2931bd4fe43Sopenharmony_ci * [5]Multiple/single block select. 0: single block; 1: multiple block. 2941bd4fe43Sopenharmony_ci * [4]Data transfer direction. 0: Controller-to-card; 1: card-to-Controller. 2951bd4fe43Sopenharmony_ci * [3:2]Auto Command Enable. 00: close; 01: Auto CMD12 Enable; 10: Auto CMD23 Enable; 11: Auto CMD Auto Select.(sdio 00) 2961bd4fe43Sopenharmony_ci * [1]Block count Enable. 0: disable; 1: enable. 2971bd4fe43Sopenharmony_ci * [0]DMA Enable. 0: No data is transmitted or non-DMA data is transmitted; 1: DMA data transfer. 2981bd4fe43Sopenharmony_ci */ 2991bd4fe43Sopenharmony_ci#define SDHCI_TRNS_DMA (1 << 0) 3001bd4fe43Sopenharmony_ci#define SDHCI_TRNS_BLK_CNT_EN (1 << 1) 3011bd4fe43Sopenharmony_ci#define SDHCI_TRNS_AUTO_CMD12 (1 << 2) 3021bd4fe43Sopenharmony_ci#define SDHCI_TRNS_AUTO_CMD23 (1 << 3) 3031bd4fe43Sopenharmony_ci#define SDHCI_TRNS_READ (1 << 4) 3041bd4fe43Sopenharmony_ci#define SDHCI_TRNS_MULTI (1 << 5) 3051bd4fe43Sopenharmony_ci 3061bd4fe43Sopenharmony_ci/* 3071bd4fe43Sopenharmony_ci * CMD_R(0x000e) details. 3081bd4fe43Sopenharmony_ci * [15:14]reserved. 3091bd4fe43Sopenharmony_ci * [13:8]cmd index. 3101bd4fe43Sopenharmony_ci * [7:6]cmd type. 00: Normal cmd; 01: Suspend cmd; 10: Resume cmd; 11: Abort cmd. 3111bd4fe43Sopenharmony_ci * [5]Whether data is being transmitted. 0: No data is transmitted. 1: Data is being transmitted. 3121bd4fe43Sopenharmony_ci * [4]Command ID check enable. 0: disable; 1: enable. 3131bd4fe43Sopenharmony_ci * [3]Command CRC check enable. 0: disable; 1: enable. 3141bd4fe43Sopenharmony_ci * [2]Subcommand ID. 0: Main; 1: Sub Command. 3151bd4fe43Sopenharmony_ci * [1:0]Response type. 00: no response; 01: response Length 136; 10: response length 48; 11: response length 48 check. 3161bd4fe43Sopenharmony_ci */ 3171bd4fe43Sopenharmony_ci#define SDHCI_CMD_CRC_CHECK_ENABLE 0x08 3181bd4fe43Sopenharmony_ci#define SDHCI_CMD_INDEX_CHECK_ENABLE 0x10 3191bd4fe43Sopenharmony_ci#define SDHCI_CMD_DATA_TX 0x20 3201bd4fe43Sopenharmony_ci 3211bd4fe43Sopenharmony_ci#define SDHCI_CMD_NONE_RESP 0x00 3221bd4fe43Sopenharmony_ci#define SDHCI_CMD_LONG_RESP 0x01 3231bd4fe43Sopenharmony_ci#define SDHCI_CMD_SHORT_RESP 0x02 3241bd4fe43Sopenharmony_ci#define SDHCI_CMD_SHORT_RESP_BUSY 0x03 3251bd4fe43Sopenharmony_ci 3261bd4fe43Sopenharmony_ci#define SDHCI_GEN_CMD(c, f) (((c & 0xff) << 8) | (f & 0xff)) 3271bd4fe43Sopenharmony_ci#define SDHCI_PARSE_CMD(c) ((c >> 8) & 0x3f) 3281bd4fe43Sopenharmony_ci 3291bd4fe43Sopenharmony_ci/* 3301bd4fe43Sopenharmony_ci * PSTATE_R(0x0024) details. 3311bd4fe43Sopenharmony_ci * [31:28]reserved. 3321bd4fe43Sopenharmony_ci * [27]Command sending error status. 0: No error occurs in the sent command. 1: The command cannot be sent. 3331bd4fe43Sopenharmony_ci * [26:25]reserved. 3341bd4fe43Sopenharmony_ci * [24]CMD pin status. 0: The cmd pin is at low level. 1: The cmd pin is at high level. 3351bd4fe43Sopenharmony_ci * [23:20]Data[3:0] pin status, meaning of each bit. 0: low level; 1: high level. 3361bd4fe43Sopenharmony_ci * [18]Card_detect_n pin status. 0: low level; 1: high level. 3371bd4fe43Sopenharmony_ci * [11]Buffer read enable. 0 : disable; 1: enable. 3381bd4fe43Sopenharmony_ci * [10]Buffer write enable. 0 : disable; 1: enable. 3391bd4fe43Sopenharmony_ci * [9]Read transfer valid. 0: idle; 1: Data is being read. 3401bd4fe43Sopenharmony_ci * [8]Write transfer valid. 0: idle; 1: Data is being written. 3411bd4fe43Sopenharmony_ci * [7:4]Data[7:4] pin status, meaning of each bit. 0: low level; 1: high level. 3421bd4fe43Sopenharmony_ci * [3]reserved. 3431bd4fe43Sopenharmony_ci * [2]The data line is valid. 0: idle; 1: Data is being transmitted. 3441bd4fe43Sopenharmony_ci * [1]The command with data is valid. 0: idle state, Commands with data can be sent. 3451bd4fe43Sopenharmony_ci * 1: The data line is being transferred or the read operation is valid. 3461bd4fe43Sopenharmony_ci * [0]The command line is valid. 0: idle state. The controller can send commands. 3471bd4fe43Sopenharmony_ci * 1: busy. The controller cannot send commands. 3481bd4fe43Sopenharmony_ci */ 3491bd4fe43Sopenharmony_ci#define SDHCI_CMD_INVALID 0x00000001 3501bd4fe43Sopenharmony_ci#define SDHCI_DATA_INVALID 0x00000002 3511bd4fe43Sopenharmony_ci#define SDHCI_CARD_PRESENT 0x00010000 3521bd4fe43Sopenharmony_ci#define SDHCI_WRITE_PROTECT 0x00080000 3531bd4fe43Sopenharmony_ci#define SDHCI_DATA_0_LEVEL_MASK 0x00100000 3541bd4fe43Sopenharmony_ci 3551bd4fe43Sopenharmony_ci/* 3561bd4fe43Sopenharmony_ci * HOST_CTRL1_R(0x0028) details. 3571bd4fe43Sopenharmony_ci * [7]Card detection signal select. 0: card detection signal card_detect_n (common use); 1: card detection test level. 3581bd4fe43Sopenharmony_ci * [6]Card detection test level. 0: no card; 1: a card is inserted. 3591bd4fe43Sopenharmony_ci * [5]reserved. 3601bd4fe43Sopenharmony_ci * [4:3]DMA select. When Host Version 4 Enable in HOST_CTRL2_R is 1: 00: SDMA; 01: ADMA1; 10: ADMA2; 3611bd4fe43Sopenharmony_ci * 11: ADMA2 or ADMA3. When Host Version 4 Enable in HOST_CTRL2_R is 0: 00: SDMA; 01: reserved; 3621bd4fe43Sopenharmony_ci * 10: 32-bit address ADMA2; 11: 64-bit address ADMA2. 3631bd4fe43Sopenharmony_ci * [2]High-speed enable. 0: Normal Speed; 1: High Speed. 3641bd4fe43Sopenharmony_ci * [1]Bit width of the data transfer. 0: 1bit; 1: 4bit. 3651bd4fe43Sopenharmony_ci * [0]reserved. 3661bd4fe43Sopenharmony_ci */ 3671bd4fe43Sopenharmony_ci#define SDHCI_CTRL_4_BIT_BUS 0x02 3681bd4fe43Sopenharmony_ci#define SDHCI_CTRL_HIGH_SPEED 0x04 3691bd4fe43Sopenharmony_ci#define SDHCI_CTRL_DMA_ENABLE_MASK 0x18 3701bd4fe43Sopenharmony_ci#define SDHCI_CTRL_SDMA_ENABLE 0x00 3711bd4fe43Sopenharmony_ci#define SDHCI_CTRL_ADMA1_ENABLE 0x08 3721bd4fe43Sopenharmony_ci#define SDHCI_CTRL_ADMA32_ENABLE 0x10 3731bd4fe43Sopenharmony_ci#define SDHCI_CTRL_ADMA64_ENABLE 0x18 3741bd4fe43Sopenharmony_ci#define SDHCI_CTRL_8_BIT_BUS 0x20 3751bd4fe43Sopenharmony_ci 3761bd4fe43Sopenharmony_ci/* 3771bd4fe43Sopenharmony_ci * PWR_CTRL_R(0x0029) details. 3781bd4fe43Sopenharmony_ci * [0]VDD2 Power enable. 0: power off; 1: power on. 3791bd4fe43Sopenharmony_ci */ 3801bd4fe43Sopenharmony_ci#define SDHCI_POWER_ON 0x01 3811bd4fe43Sopenharmony_ci#define SDHCI_POWER_180 0x0A 3821bd4fe43Sopenharmony_ci#define SDHCI_POWER_300 0x0C 3831bd4fe43Sopenharmony_ci#define SDHCI_POWER_330 0x0E 3841bd4fe43Sopenharmony_ci 3851bd4fe43Sopenharmony_ci/* 3861bd4fe43Sopenharmony_ci * CLK_CTRL_R(0x002c) details. 3871bd4fe43Sopenharmony_ci * [15:4]reserved. 3881bd4fe43Sopenharmony_ci * [3]PLL enable. 0: The PLL is in low power mode. 1: enabled. 3891bd4fe43Sopenharmony_ci * [2]SD/eMMC clock enable. 0: disabled; 1: enabled. 3901bd4fe43Sopenharmony_ci * [1]Internal clock status. 0: unstable; 1: stable. 3911bd4fe43Sopenharmony_ci * [0]Internal clock enable. 0: disabled; 1: enabled. 3921bd4fe43Sopenharmony_ci */ 3931bd4fe43Sopenharmony_ci#define SDHCI_CLK_CTRL_PLL_EN (1 << 3) 3941bd4fe43Sopenharmony_ci#define SDHCI_CLK_CTRL_CLK_EN (1 << 2) 3951bd4fe43Sopenharmony_ci#define SDHCI_CLK_CTRL_INT_STABLE (1 << 1) 3961bd4fe43Sopenharmony_ci#define SDHCI_CLK_CTRL_INT_CLK_EN (1 << 0) 3971bd4fe43Sopenharmony_ci 3981bd4fe43Sopenharmony_ci/* 3991bd4fe43Sopenharmony_ci * TOUT_CTRL_R(0x002e) details. 4001bd4fe43Sopenharmony_ci * [3:0]Data timeout count. 0x0: TMCLK x 2^13; 0xe: TMCLK x 2^27; others: reserved. 4011bd4fe43Sopenharmony_ci */ 4021bd4fe43Sopenharmony_ci#define SDHCI_DEFINE_TIMEOUT 0xE 4031bd4fe43Sopenharmony_ci 4041bd4fe43Sopenharmony_ci/* 4051bd4fe43Sopenharmony_ci * SW_RST_R(0x002f) details. 4061bd4fe43Sopenharmony_ci * [7:3]reserved. 4071bd4fe43Sopenharmony_ci * [2]Data line soft reset request. 0: not reset; 1: reset. 4081bd4fe43Sopenharmony_ci * [1]Command line soft reset request. 0: not reset; 1: reset. 4091bd4fe43Sopenharmony_ci * [0]Soft reset request of the controller. 0: not reset; 1: reset. 4101bd4fe43Sopenharmony_ci */ 4111bd4fe43Sopenharmony_ci#define SDHCI_RESET_ALL 0x01 4121bd4fe43Sopenharmony_ci#define SDHCI_RESET_CMD 0x02 4131bd4fe43Sopenharmony_ci#define SDHCI_RESET_DATA 0x04 4141bd4fe43Sopenharmony_ci 4151bd4fe43Sopenharmony_ci/* 4161bd4fe43Sopenharmony_ci * NORMAL_INT_STAT_R(0x0030) details. 4171bd4fe43Sopenharmony_ci * [15]Summary error interrupt status. [14]reserved. [13]TX event interrupt status. 4181bd4fe43Sopenharmony_ci * [12]Retuning event interrupt status. [11]INT_C interrupt status. [10]INT_B interrupt status. 4191bd4fe43Sopenharmony_ci * [9]INT_A interrupt status. [8]Card interrupt status. [7]Card removal interrupt status. 4201bd4fe43Sopenharmony_ci * [6]Card insertion interrupt status. [5]Buffer read ready interrupt status. [4]Buffer write ready interrupt status. 4211bd4fe43Sopenharmony_ci * [3]DMA interrupt status. [2]Block gap event interrupt status due to a stop request. 4221bd4fe43Sopenharmony_ci * [1]Read/write transfer completion interrupt status. [0]Command completion interrupt status. 4231bd4fe43Sopenharmony_ci */ 4241bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_RESPONSE 0x00000001 4251bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DATA_END 0x00000002 4261bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_BLK_GAP 0x00000004 4271bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DMA_END 0x00000008 4281bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_SPACE_AVAIL 0x00000010 4291bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DATA_AVAIL 0x00000020 4301bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_CARD_INSERT 0x00000040 4311bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_CARD_REMOVE 0x00000080 4321bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_CARD_INT 0x00000100 4331bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_ERROR 0x00008000 4341bd4fe43Sopenharmony_ci 4351bd4fe43Sopenharmony_ci/* 4361bd4fe43Sopenharmony_ci * NORMAL_INT_SIGNAL_EN_R(0x0038) details. 4371bd4fe43Sopenharmony_ci */ 4381bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_TIMEOUT 0x00010000 4391bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_CRC 0x00020000 4401bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_END_BIT 0x00040000 4411bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_INDEX 0x00080000 4421bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DATA_TIMEOUT 0x00100000 4431bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DATA_CRC 0x00200000 4441bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_DATA_END_BIT 0x00400000 4451bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_BUS_POWER 0x00800000 4461bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_AUTO_CMD_ERR 0x01000000 4471bd4fe43Sopenharmony_ci#define SDHCI_INTERRUPT_ADMA_ERROR 0x02000000 4481bd4fe43Sopenharmony_ci 4491bd4fe43Sopenharmony_ci#define SDHCI_INT_CMD_MASK (SDHCI_INTERRUPT_RESPONSE | SDHCI_INTERRUPT_TIMEOUT | SDHCI_INTERRUPT_CRC | \ 4501bd4fe43Sopenharmony_ci SDHCI_INTERRUPT_END_BIT | SDHCI_INTERRUPT_INDEX | SDHCI_INTERRUPT_AUTO_CMD_ERR) 4511bd4fe43Sopenharmony_ci 4521bd4fe43Sopenharmony_ci#define SDHCI_INT_DATA_MASK (SDHCI_INTERRUPT_DATA_END | SDHCI_INTERRUPT_DMA_END | SDHCI_INTERRUPT_DATA_AVAIL | \ 4531bd4fe43Sopenharmony_ci SDHCI_INTERRUPT_SPACE_AVAIL | SDHCI_INTERRUPT_DATA_TIMEOUT | SDHCI_INTERRUPT_DATA_CRC | \ 4541bd4fe43Sopenharmony_ci SDHCI_INTERRUPT_DATA_END_BIT | SDHCI_INTERRUPT_ADMA_ERROR | SDHCI_INTERRUPT_BLK_GAP) 4551bd4fe43Sopenharmony_ci 4561bd4fe43Sopenharmony_ci/* 4571bd4fe43Sopenharmony_ci * HOST_CTRL2_R(0x003e) details. 4581bd4fe43Sopenharmony_ci * [9:8]reserved; [3]reserved. 4591bd4fe43Sopenharmony_ci * [15]Automatic selection enable of the preset value. 0: disabled, 1: enabled. 4601bd4fe43Sopenharmony_ci * [14]Async interrupt enable. 0: disabled; 1: enabled. 4611bd4fe43Sopenharmony_ci * [13]Bus 64-bit address enable. 0: disabled; 1: enabled. 4621bd4fe43Sopenharmony_ci * [12]Controller version 4 enable. 0: 3.0; 1: 4.0. 4631bd4fe43Sopenharmony_ci * [11]CMD23 enable. 0: disabled; 1: enabled. 4641bd4fe43Sopenharmony_ci * [10]ADMA2 length. 0:16-bit data length; 1:26-bit data length. 4651bd4fe43Sopenharmony_ci * [7]Sample clock select. 0: Select the fixed clock to collect data. 1: tuned clock. 4661bd4fe43Sopenharmony_ci * [6]Run the tuning command. The value is automatically cleared after the tuning operation is complete. 4671bd4fe43Sopenharmony_ci * 0: Tuning is not performed or tuning is complete. 1: tuning. 4681bd4fe43Sopenharmony_ci * [5:4]Drive capability select. 00: typeB; 01: typeA; 10: typeC; 11: typeD. 4691bd4fe43Sopenharmony_ci * [2:0]emmc mode. 000: Legacy; 001: High Speed SDR; 010: HS200; others: reserved. 4701bd4fe43Sopenharmony_ci */ 4711bd4fe43Sopenharmony_ci#define SDHCI_UHS_MASK 0x0007 4721bd4fe43Sopenharmony_ci#define SDHCI_UHS_SDR12 0x0000 4731bd4fe43Sopenharmony_ci#define SDHCI_UHS_SDR25 0x0001 4741bd4fe43Sopenharmony_ci#define SDHCI_UHS_SDR50 0x0002 4751bd4fe43Sopenharmony_ci#define SDHCI_UHS_SDR104 0x0003 4761bd4fe43Sopenharmony_ci#define SDHCI_UHS_DDR50 0x0004 4771bd4fe43Sopenharmony_ci#define SDHCI_HS_SDR200 0x0005 /* reserved value in SDIO spec */ 4781bd4fe43Sopenharmony_ci#define SDHCI_HS400 0x0007 4791bd4fe43Sopenharmony_ci#define SDHCI_VDD_180 0x0008 4801bd4fe43Sopenharmony_ci#define SDHCI_DRV_TYPE_MASK 0x0030 4811bd4fe43Sopenharmony_ci#define SDHCI_DRV_TYPE_B 0x0000 4821bd4fe43Sopenharmony_ci#define SDHCI_DRV_TYPE_A 0x0010 4831bd4fe43Sopenharmony_ci#define SDHCI_DRV_TYPE_C 0x0020 4841bd4fe43Sopenharmony_ci#define SDHCI_DRV_TYPE_D 0x0030 4851bd4fe43Sopenharmony_ci#define SDHCI_EXEC_TUNING 0x0040 4861bd4fe43Sopenharmony_ci#define SDHCI_TUNED_CLK 0x0080 4871bd4fe43Sopenharmony_ci#define SDHCI_ASYNC_INT_ENABLE 0x4000 4881bd4fe43Sopenharmony_ci#define SDHCI_PRESET_VAL_ENABLE 0x8000 4891bd4fe43Sopenharmony_ci 4901bd4fe43Sopenharmony_ci/* 4911bd4fe43Sopenharmony_ci * CAPABILITIES1_R(0x0040) details. 4921bd4fe43Sopenharmony_ci * [31:30]Slot type. 00: Removable card slot; 01: Embedded Slot; 4931bd4fe43Sopenharmony_ci * 10: Shared bus slot (used in SD mode); 11:UHS2 (not supported currently). 4941bd4fe43Sopenharmony_ci * [29]Whether the sync interrupt is supported. 0: not supported; 1: supported. 4951bd4fe43Sopenharmony_ci * [28]The 64-bit system address is used for V3. 0: not supported; 1: supported. 4961bd4fe43Sopenharmony_ci * [27]The 64-bit system address is used for V4. 0: not supported; 1: supported. 4971bd4fe43Sopenharmony_ci * [26]The voltage is 1.8 V. 0: not supported; 1: supported. 4981bd4fe43Sopenharmony_ci * [25]The voltage is 3.0 V. 0: not supported; 1: supported. 4991bd4fe43Sopenharmony_ci * [24]The voltage is 3.3 V. 0: not supported; 1: supported. 5001bd4fe43Sopenharmony_ci * [23]Suspending and Resuming Support. 0: not supported; 1: supported. 5011bd4fe43Sopenharmony_ci * [22]SDMA Support. 0: not supported; 1: supported. 5021bd4fe43Sopenharmony_ci * [21]Indicates whether to support high speed. 0: not supported; 1: supported. 5031bd4fe43Sopenharmony_ci * [19]Indicates whether to support ADMA2. 0: not supported; 1: supported. 5041bd4fe43Sopenharmony_ci * [18]Whether the 8-bit embedded component is supported. 0: not supported; 1: supported. 5051bd4fe43Sopenharmony_ci * [17:16]Maximum block length. 0x0: 512Byte; 0x1: 1024Byte; 0x2: 2048Byte; 0x3: reserved. 5061bd4fe43Sopenharmony_ci * [15:8]Basic frequency of the clock. 0x0: 1MHz; 0x3F: 63MHz; 0x40~0xFF: not supported. 5071bd4fe43Sopenharmony_ci * [7]Timeout clock unit. 0: KHz; 1: MHz. 5081bd4fe43Sopenharmony_ci * [5:0]Timeout interval. 0x1: 1KHz/1MHz; 0x2: 2KHz/2MHz; ... 0x3F: 63KHz/63MHz 5091bd4fe43Sopenharmony_ci */ 5101bd4fe43Sopenharmony_ci#define SDHCI_TIMEOUT_CLK_UNIT 0x00000080 5111bd4fe43Sopenharmony_ci#define SDHCI_CLK_BASE_MASK 0x00003F00 5121bd4fe43Sopenharmony_ci#define SDHCI_BASIC_FREQ_OF_CLK_MASK 0x0000FF00 5131bd4fe43Sopenharmony_ci#define SDHCI_BASIC_FREQ_OF_CLK_SHIFT 8 5141bd4fe43Sopenharmony_ci#define SDHCI_MAX_BLOCK_SIZE_MASK 0x00030000 5151bd4fe43Sopenharmony_ci#define SDHCI_MAX_BLOCK_SIZE_SHIFT 16 5161bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_8BIT 0x00040000 5171bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_ADMA2 0x00080000 5181bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_HISPD 0x00200000 5191bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_SDMA 0x00400000 5201bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_VDD_330 0x01000000 5211bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_VDD_300 0x02000000 5221bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_VDD_180 0x04000000 5231bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_64BIT 0x10000000 5241bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_ASYNC_INT 0x20000000 5251bd4fe43Sopenharmony_ci 5261bd4fe43Sopenharmony_ci/* 5271bd4fe43Sopenharmony_ci * CAPABILITIES2_R(0x0044) details. 5281bd4fe43Sopenharmony_ci * [28]Whether the 1.8V VDDR is supported. 0: not supported; 1: supported. 5291bd4fe43Sopenharmony_ci * [27]Whether the ADMA3 is supported. 0: not supported; 1: supported. 5301bd4fe43Sopenharmony_ci * [15:14]Retuning mode. 00: MODE1, Timer; 01: MODE2, Timer and ReTuning request; 5311bd4fe43Sopenharmony_ci * 10: MODE3, Auto retuning Timer and ReTuning request; 11: reserved. 5321bd4fe43Sopenharmony_ci * [13]SDR50 uses Tuning. 0: not use; 1: use. 5331bd4fe43Sopenharmony_ci * [11:8]Retuning count. 0x1: 1s; 0x3: 4s; others: reserved. 5341bd4fe43Sopenharmony_ci * [6]Support TYPED. 0: not supported; 1: supported. 5351bd4fe43Sopenharmony_ci * [5]Support TYPEC. 0: not supported; 1: supported. 5361bd4fe43Sopenharmony_ci * [4]Support TYPEA. 0: not supported; 1: supported. 5371bd4fe43Sopenharmony_ci * [3]Support UHS2. 0: not supported; 1: supported. 5381bd4fe43Sopenharmony_ci * [2]Support DDR50. 0: not supported; 1: supported. 5391bd4fe43Sopenharmony_ci * [1]Support SDR104. 0: not supported; 1: supported. 5401bd4fe43Sopenharmony_ci * [0]Support SDR50. 0: not supported; 1: supported. 5411bd4fe43Sopenharmony_ci */ 5421bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_SDR50 0x00000001 5431bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_SDR104 0x00000002 5441bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_DDR50 0x00000004 5451bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_DRIVER_TYPE_A 0x00000010 5461bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_DRIVER_TYPE_C 0x00000020 5471bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_DRIVER_TYPE_D 0x00000040 5481bd4fe43Sopenharmony_ci#define SDHCI_RETUNING_TIMER_COUNT_MASK 0x00000F00 5491bd4fe43Sopenharmony_ci#define SDHCI_RETUNING_TIMER_COUNT_SHIFT 8 5501bd4fe43Sopenharmony_ci#define SDHCI_USE_SDR50_TUNING 0x00002000 5511bd4fe43Sopenharmony_ci#define SDHCI_RETUNING_MODE_MASK 0x0000C000 5521bd4fe43Sopenharmony_ci#define SDHCI_RETUNING_MODE_SHIFT 14 5531bd4fe43Sopenharmony_ci#define SDHCI_CLK_MUL_MASK 0x00FF0000 5541bd4fe43Sopenharmony_ci#define SDHCI_CLK_MUL_SHIFT 16 5551bd4fe43Sopenharmony_ci#define SDHCI_SUPPORT_ADMA3 0x8000000 5561bd4fe43Sopenharmony_ci 5571bd4fe43Sopenharmony_ci/* 5581bd4fe43Sopenharmony_ci * HOST_VERSION_R(0x00FE) details. 5591bd4fe43Sopenharmony_ci */ 5601bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_VER_MASK 0x00FF 5611bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_100 0 5621bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_200 1 5631bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_300 2 5641bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_400 3 5651bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_410 4 5661bd4fe43Sopenharmony_ci#define SDHCI_HOST_SPEC_420 5 5671bd4fe43Sopenharmony_ci 5681bd4fe43Sopenharmony_ci/* 5691bd4fe43Sopenharmony_ci * EMMC_CTRL_R(0x0508) details. 5701bd4fe43Sopenharmony_ci */ 5711bd4fe43Sopenharmony_ci#define SDHC_CMD_CONFLIT_CHECK 0x01 5721bd4fe43Sopenharmony_ci 5731bd4fe43Sopenharmony_ci/* 5741bd4fe43Sopenharmony_ci * MBIU_CTRL_R(0x0510) details. 5751bd4fe43Sopenharmony_ci * [3]16 burst enable. 0: disable 16 burst; 1: enable 16 burst. 5761bd4fe43Sopenharmony_ci * [2]8 burst enable. 0: disable 8 burst; 1: enable 8 burst. 5771bd4fe43Sopenharmony_ci * [1]4 burst enable. 0: disable 4 burst; 1: enable 4 burst. 5781bd4fe43Sopenharmony_ci * [0]Burst configuration validation enable. 5791bd4fe43Sopenharmony_ci * 0: Generate fixed bursts by configuring gm_enburst4, gm_enburst8, gm_enburst16; 5801bd4fe43Sopenharmony_ci * 1: Generate bursts based on the actual data length. 5811bd4fe43Sopenharmony_ci */ 5821bd4fe43Sopenharmony_ci#define SDHCI_GM_WR_OSRC_LMT_MASK (0x7 << 24) 5831bd4fe43Sopenharmony_ci#define SDHCI_GM_RD_OSRC_LMT_MASK (0x7 << 16) 5841bd4fe43Sopenharmony_ci#define SDHCI_GM_WR_OSRC_LMT_VAL (7 << 24) 5851bd4fe43Sopenharmony_ci#define SDHCI_GM_RD_OSRC_LMT_VAL (7 << 16) 5861bd4fe43Sopenharmony_ci#define SDHCI_UNDEFL_INCR_EN 0x1 5871bd4fe43Sopenharmony_ci 5881bd4fe43Sopenharmony_ci/* 5891bd4fe43Sopenharmony_ci * EMMC_CTRL_R(0x052c) details. 5901bd4fe43Sopenharmony_ci * [15:10]reserved; [8:2]reserved. 5911bd4fe43Sopenharmony_ci * [9]Algorithm for sorting tasks. 0: Tasks with a higher priority are executed first. 5921bd4fe43Sopenharmony_ci * Tasks with the same priority are executed first in first. 1: first come first execute. 5931bd4fe43Sopenharmony_ci * [1]Disable the CRC check. 0: Data CRC check is enabled. 1: The CRC check is disabled. 5941bd4fe43Sopenharmony_ci * [0]Type of the connected card. 0: non-eMMC card; 1: eMMC card. 5951bd4fe43Sopenharmony_ci */ 5961bd4fe43Sopenharmony_ci#define SDHCI_EMMC_CTRL_EMMC (1 << 0) 5971bd4fe43Sopenharmony_ci#define SDHCI_EMMC_CTRL_ENH_STROBE_EN (1 << 8) 5981bd4fe43Sopenharmony_ci 5991bd4fe43Sopenharmony_ci/* 6001bd4fe43Sopenharmony_ci * AT_CTRL_R(0x0540) details. 6011bd4fe43Sopenharmony_ci * [4]Software configuration tuning enable. 0: disable; 1: enable. 6021bd4fe43Sopenharmony_ci */ 6031bd4fe43Sopenharmony_ci#define SDHCI_SW_TUNING_EN 0x00000010 6041bd4fe43Sopenharmony_ci 6051bd4fe43Sopenharmony_ci/* 6061bd4fe43Sopenharmony_ci * AT_STAT_R(0x0544) details. 6071bd4fe43Sopenharmony_ci * [7:0]Phase value configured by software. 6081bd4fe43Sopenharmony_ci */ 6091bd4fe43Sopenharmony_ci#define SDHCI_CENTER_PH_CODE_MASK 0x000000ff 6101bd4fe43Sopenharmony_ci#define SDHCI_SAMPLE_PHASE 4 6111bd4fe43Sopenharmony_ci#define SDHCI_PHASE_SCALE 32 6121bd4fe43Sopenharmony_ci#define SDHCI_PHASE_SCALE_TIMES 4 6131bd4fe43Sopenharmony_ci 6141bd4fe43Sopenharmony_ci/* 6151bd4fe43Sopenharmony_ci * MULTI_CYCLE_R(0x054C) details. 6161bd4fe43Sopenharmony_ci */ 6171bd4fe43Sopenharmony_ci#define SDHCI_FOUND_EDGE (0x1 << 11) 6181bd4fe43Sopenharmony_ci#define SDHCI_EDGE_DETECT_EN (0x1 << 8) 6191bd4fe43Sopenharmony_ci#define SDHCI_DOUT_EN_F_EDGE (0x1 << 6) 6201bd4fe43Sopenharmony_ci#define SDHCI_DATA_DLY_EN (0x1 << 3) 6211bd4fe43Sopenharmony_ci#define SDHCI_CMD_DLY_EN (0x1 << 2) 6221bd4fe43Sopenharmony_ci 6231bd4fe43Sopenharmony_ci/* 6241bd4fe43Sopenharmony_ci * End of controller registers. 6251bd4fe43Sopenharmony_ci */ 6261bd4fe43Sopenharmony_ci#define ADMA2_END 0x2 6271bd4fe43Sopenharmony_ci 6281bd4fe43Sopenharmony_ci#define SDHCI_USE_SDMA (1 << 0) 6291bd4fe43Sopenharmony_ci#define SDHCI_USE_ADMA (1 << 1) 6301bd4fe43Sopenharmony_ci#define SDHCI_REQ_USE_DMA (1 << 2) 6311bd4fe43Sopenharmony_ci#define SDHCI_DEVICE_DEAD (1 << 3) 6321bd4fe43Sopenharmony_ci#define SDHCI_SDR50_NEEDS_TUNING (1 << 4) 6331bd4fe43Sopenharmony_ci#define SDHCI_NEEDS_RETUNING (1 << 5) 6341bd4fe43Sopenharmony_ci#define SDHCI_AUTO_CMD12 (1 << 6) 6351bd4fe43Sopenharmony_ci#define SDHCI_AUTO_CMD23 (1 << 7) 6361bd4fe43Sopenharmony_ci#define SDHCI_PV_ENABLED (1 << 8) 6371bd4fe43Sopenharmony_ci#define SDHCI_SDIO_IRQ_ENABLED (1 << 9) 6381bd4fe43Sopenharmony_ci#define SDHCI_SDR104_NEEDS_TUNING (1 << 10) 6391bd4fe43Sopenharmony_ci#define SDHCI_USING_RETUNING_TIMER (1 << 11) 6401bd4fe43Sopenharmony_ci#define SDHCI_USE_64BIT_ADMA (1 << 12) 6411bd4fe43Sopenharmony_ci#define SDHCI_HOST_IRQ_STATUS (1 << 13) 6421bd4fe43Sopenharmony_ci 6431bd4fe43Sopenharmony_ci#define SDHCI_ADMA_MAX_DESC 128 6441bd4fe43Sopenharmony_ci#define SDHCI_ADMA_DEF_SIZE ((SDHCI_ADMA_MAX_DESC * 2 + 1) * 4) 6451bd4fe43Sopenharmony_ci#define SDHCI_ADMA_LINE_SIZE 8 6461bd4fe43Sopenharmony_ci#define SDHCI_ADMA_64BIT_LINE_SIZE 12 6471bd4fe43Sopenharmony_ci#define SDHCI_MAX_DIV_SPEC_200 256 6481bd4fe43Sopenharmony_ci#define SDHCI_MAX_DIV_SPEC_300 2046 6491bd4fe43Sopenharmony_ci 6501bd4fe43Sopenharmony_ciunion SdhciHostQuirks { 6511bd4fe43Sopenharmony_ci uint32_t quirksData; 6521bd4fe43Sopenharmony_ci struct QuirksBitData { 6531bd4fe43Sopenharmony_ci uint32_t brokenCardDetection : 1; 6541bd4fe43Sopenharmony_ci uint32_t forceSWDetect : 1; /* custom requirement: use the SD protocol to detect rather then the interrupt. */ 6551bd4fe43Sopenharmony_ci uint32_t invertedWriteProtect : 1; 6561bd4fe43Sopenharmony_ci uint32_t noEndattrInNopdesc : 1; 6571bd4fe43Sopenharmony_ci uint32_t reserved : 28; 6581bd4fe43Sopenharmony_ci }bits; 6591bd4fe43Sopenharmony_ci}; 6601bd4fe43Sopenharmony_ci 6611bd4fe43Sopenharmony_ci#define SDHCI_PEND_REQUEST_DONE (1 << 0) 6621bd4fe43Sopenharmony_ci#define SDHCI_PEND_ACCIDENT (1 << 1) 6631bd4fe43Sopenharmony_cistruct SdhciHost { 6641bd4fe43Sopenharmony_ci struct MmcCntlr *mmc; 6651bd4fe43Sopenharmony_ci struct MmcCmd *cmd; 6661bd4fe43Sopenharmony_ci void *base; 6671bd4fe43Sopenharmony_ci uint32_t irqNum; 6681bd4fe43Sopenharmony_ci uint32_t irqEnable; 6691bd4fe43Sopenharmony_ci uint32_t hostId; 6701bd4fe43Sopenharmony_ci union SdhciHostQuirks quirks; 6711bd4fe43Sopenharmony_ci uint32_t flags; 6721bd4fe43Sopenharmony_ci uint16_t version; 6731bd4fe43Sopenharmony_ci uint32_t maxClk; 6741bd4fe43Sopenharmony_ci uint32_t clkMul; 6751bd4fe43Sopenharmony_ci uint32_t clock; 6761bd4fe43Sopenharmony_ci uint8_t pwr; 6771bd4fe43Sopenharmony_ci bool presetEnabled; 6781bd4fe43Sopenharmony_ci struct OsalMutex mutex; 6791bd4fe43Sopenharmony_ci SDHCI_EVENT sdhciEvent; 6801bd4fe43Sopenharmony_ci bool waitForEvent; 6811bd4fe43Sopenharmony_ci uint8_t *alignedBuff; 6821bd4fe43Sopenharmony_ci uint32_t buffLen; 6831bd4fe43Sopenharmony_ci struct scatterlist dmaSg; 6841bd4fe43Sopenharmony_ci struct scatterlist *sg; 6851bd4fe43Sopenharmony_ci uint32_t dmaSgCount; 6861bd4fe43Sopenharmony_ci char *admaDesc; 6871bd4fe43Sopenharmony_ci uint32_t admaDescSize; 6881bd4fe43Sopenharmony_ci uint32_t admaDescLineSize; 6891bd4fe43Sopenharmony_ci uint32_t admaMaxDesc; 6901bd4fe43Sopenharmony_ci uint32_t tuningPhase; 6911bd4fe43Sopenharmony_ci}; 6921bd4fe43Sopenharmony_ci 6931bd4fe43Sopenharmony_cistatic inline void SdhciWritel(struct SdhciHost *host, uint32_t val, int reg) 6941bd4fe43Sopenharmony_ci{ 6951bd4fe43Sopenharmony_ci OSAL_WRITEL(val, (uintptr_t)host->base + reg); 6961bd4fe43Sopenharmony_ci} 6971bd4fe43Sopenharmony_ci 6981bd4fe43Sopenharmony_cistatic inline void SdhciWritew(struct SdhciHost *host, uint16_t val, int reg) 6991bd4fe43Sopenharmony_ci{ 7001bd4fe43Sopenharmony_ci OSAL_WRITEW(val, (uintptr_t)host->base + reg); 7011bd4fe43Sopenharmony_ci} 7021bd4fe43Sopenharmony_ci 7031bd4fe43Sopenharmony_cistatic inline void SdhciWriteb(struct SdhciHost *host, uint8_t val, int reg) 7041bd4fe43Sopenharmony_ci{ 7051bd4fe43Sopenharmony_ci OSAL_WRITEB(val, (uintptr_t)host->base + reg); 7061bd4fe43Sopenharmony_ci} 7071bd4fe43Sopenharmony_ci 7081bd4fe43Sopenharmony_cistatic inline uint32_t SdhciReadl(struct SdhciHost *host, int reg) 7091bd4fe43Sopenharmony_ci{ 7101bd4fe43Sopenharmony_ci return OSAL_READL((uintptr_t)host->base + reg); 7111bd4fe43Sopenharmony_ci} 7121bd4fe43Sopenharmony_ci 7131bd4fe43Sopenharmony_cistatic inline uint16_t SdhciReadw(struct SdhciHost *host, int reg) 7141bd4fe43Sopenharmony_ci{ 7151bd4fe43Sopenharmony_ci return OSAL_READW((uintptr_t)host->base + reg); 7161bd4fe43Sopenharmony_ci} 7171bd4fe43Sopenharmony_ci 7181bd4fe43Sopenharmony_cistatic inline uint8_t SdhciReadb(struct SdhciHost *host, int reg) 7191bd4fe43Sopenharmony_ci{ 7201bd4fe43Sopenharmony_ci return OSAL_READB((uintptr_t)host->base + reg); 7211bd4fe43Sopenharmony_ci} 7221bd4fe43Sopenharmony_ci 7231bd4fe43Sopenharmony_ci#ifdef __cplusplus 7241bd4fe43Sopenharmony_ci#if __cplusplus 7251bd4fe43Sopenharmony_ci} 7261bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 7271bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 7281bd4fe43Sopenharmony_ci 7291bd4fe43Sopenharmony_ci#endif /* SDHCI_H */ 730