1 /* 2 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. 3 * 4 * HDF is dual licensed: you can use it either under the terms of 5 * the GPL, or the BSD license, at your option. 6 * See the LICENSE file in the root of this repository for complete details. 7 */ 8 9 #ifndef MMC_SDIO_H 10 #define MMC_SDIO_H 11 12 #include "mmc_sd.h" 13 #include "osal_thread.h" 14 #include "sdio_if.h" 15 16 #ifdef __cplusplus 17 #if __cplusplus 18 extern "C" { 19 #endif 20 #endif /* __cplusplus */ 21 22 struct SdioFunction { 23 struct SdioDevice *dev; 24 uint32_t maxBlkSize; 25 uint32_t curBlkSize; 26 uint32_t funcNum; 27 uint8_t funcClass; 28 uint16_t vendorId; 29 uint16_t deviceId; 30 uint32_t timeOut; 31 SdioIrqHandler *irqHandler; 32 }; 33 34 struct SdioRegister { 35 struct SdioCccr cccr; 36 struct SdioCis cis; 37 }; 38 39 struct SdioDevice { 40 struct SdDevice sd; 41 struct SdioDeviceOps *sdioOps; 42 struct SdioRegister sdioReg; 43 uint32_t functions; 44 struct SdioFunction *sdioFunc[SDIO_MAX_FUNCTION_NUMBER]; 45 struct SdioFunction *curFunction; 46 struct OsalThread thread; /* irq thread */ 47 struct OsalSem sem; 48 bool irqPending; 49 bool threadRunning; 50 }; 51 52 struct SdioDeviceOps { 53 int32_t (*incrAddrReadBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t); 54 int32_t (*incrAddrWriteBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t); 55 int32_t (*fixedAddrReadBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t, uint32_t); 56 int32_t (*fixedAddrWriteBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t, uint32_t); 57 int32_t (*func0ReadBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t); 58 int32_t (*func0WriteBytes)(struct SdioDevice *, uint8_t *, uint32_t, uint32_t); 59 int32_t (*setBlockSize)(struct SdioDevice *, uint32_t); 60 int32_t (*getCommonInfo)(struct SdioDevice *, SdioCommonInfo *, uint32_t); 61 int32_t (*setCommonInfo)(struct SdioDevice *, SdioCommonInfo *, uint32_t); 62 int32_t (*flushData)(struct SdioDevice *); 63 int32_t (*enableFunc)(struct SdioDevice *); 64 int32_t (*disableFunc)(struct SdioDevice *); 65 int32_t (*claimIrq)(struct SdioDevice *, SdioIrqHandler *); 66 int32_t (*releaseIrq)(struct SdioDevice *); 67 int32_t (*findFunc)(struct SdioDevice *, struct SdioFunctionConfig *); 68 int32_t (*claimHost)(struct SdioDevice *); 69 int32_t (*releaseHost)(struct SdioDevice *); 70 }; 71 72 int32_t SdioDeviceFindFunction(struct SdioDevice *sdio, struct SdioFunctionConfig *config); 73 int32_t SdioDeviceIncrAddrReadBytes(struct SdioDevice *sdio, 74 uint8_t *data, uint32_t addr, uint32_t size); 75 int32_t SdioDeviceIncrAddrWriteBytes(struct SdioDevice *sdio, 76 uint8_t *data, uint32_t addr, uint32_t size); 77 int32_t SdioDeviceFixedAddrReadBytes(struct SdioDevice *sdio, 78 uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen); 79 int32_t SdioDeviceFixedAddrWriteBytes(struct SdioDevice *sdio, 80 uint8_t *data, uint32_t addr, uint32_t size, uint32_t scatterLen); 81 int32_t SdioDeviceFunc0ReadBytes(struct SdioDevice *sdio, 82 uint8_t *data, uint32_t addr, uint32_t size); 83 int32_t SdioDeviceFunc0WriteBytes(struct SdioDevice *sdio, 84 uint8_t *data, uint32_t addr, uint32_t size); 85 int32_t SdioDeviceSetBlockSize(struct SdioDevice *sdio, uint32_t blockSize); 86 int32_t SdioDeviceGetCommonInfo(struct SdioDevice *sdio, 87 SdioCommonInfo *info, SdioCommonInfoType infoType); 88 int32_t SdioDeviceSetCommonInfo(struct SdioDevice *sdio, 89 SdioCommonInfo *info, SdioCommonInfoType infoType); 90 int32_t SdioDeviceFlushData(struct SdioDevice *sdio); 91 int32_t SdioDeviceClaimHost(struct SdioDevice *sdio); 92 int32_t SdioDeviceReleaseHost(struct SdioDevice *sdio); 93 int32_t SdioDeviceEnableFunc(struct SdioDevice *sdio); 94 int32_t SdioDeviceDisableFunc(struct SdioDevice *sdio); 95 int32_t SdioDeviceClaimIrq(struct SdioDevice *sdio, SdioIrqHandler *irqHandler); 96 int32_t SdioDeviceReleaseIrq(struct SdioDevice *sdio); 97 98 void SdioDeviceAddOps(struct SdioDevice *sdio, void *ops); 99 100 #ifdef __cplusplus 101 #if __cplusplus 102 } 103 #endif 104 #endif /* __cplusplus */ 105 106 #endif /* MMC_SDIO_H */ 107