mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
198 lines
8.3 KiB
C
198 lines
8.3 KiB
C
/* Copyright (C) 2023 Alif Semiconductor - All Rights Reserved.
|
|
* Use, distribution and modification of this code is permitted under the
|
|
* terms stated in the Alif Semiconductor Software License Agreement
|
|
*
|
|
* You should have received a copy of the Alif Semiconductor Software
|
|
* License Agreement with this file. If not, please write to:
|
|
* contact@alifsemi.com, or visit: https://alifsemi.com/license
|
|
*
|
|
*/
|
|
|
|
/**************************************************************************//**
|
|
* @file sd.h
|
|
* @author Deepak Kumar
|
|
* @email deepak@alifsemi.com
|
|
* @version V0.0.1
|
|
* @date 28-Nov-2022
|
|
* @brief exposed SD Driver variables and APIs.
|
|
* @bug None.
|
|
* @Note None
|
|
******************************************************************************/
|
|
#ifndef _SD_H_
|
|
#define _SD_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "sd_host.h"
|
|
#include "sdio.h"
|
|
|
|
//#define SDMMC_PRINTF_DEBUG
|
|
//#define SDMMC_PRINTF_SD_STATE_DEBUG
|
|
//#define SDMMC_PRINT_SEC_DATA
|
|
#define SDMMC_IRQ_MODE
|
|
|
|
/**
|
|
* @brief SD driver status enum definition
|
|
*/
|
|
typedef enum _SD_DRV_STATUS{
|
|
SD_DRV_STATUS_OK,
|
|
SD_DRV_STATUS_ERR,
|
|
SD_DRV_STATUS_HOST_INIT_ERR,
|
|
SD_DRV_STATUS_CARD_INIT_ERR,
|
|
SD_DRV_STATUS_RD_ERR,
|
|
SD_DRV_STATUS_WR_ERR,
|
|
SD_DRV_STATUS_TIMEOUT_ERR
|
|
}SD_DRV_STATUS;
|
|
|
|
/**
|
|
* @brief SD Card status enum definition
|
|
*/
|
|
typedef enum _SD_CARD_STATE{
|
|
SD_CARD_STATE_INIT = -1,
|
|
SD_CARD_STATE_IDLE,
|
|
SD_CARD_STATE_READY,
|
|
SD_CARD_STATE_IDENT,
|
|
SD_CARD_STATE_STBY,
|
|
SD_CARD_STATE_TRAN,
|
|
SD_CARD_STATE_DATA,
|
|
SD_CARD_STATE_RCV,
|
|
SD_CARD_STATE_PRG,
|
|
SD_CARD_STATE_DIS,
|
|
SD_CARD_STATE_RESV
|
|
}SD_CARD_STATE;
|
|
|
|
/**
|
|
* @brief SD Card Information Structure definition
|
|
*/
|
|
typedef struct _sd_cardinfo_t{
|
|
uint32_t cardtype; /*!< Specifies the card Type */
|
|
uint32_t cardversion; /*!< Specifies the card version */
|
|
uint32_t relcardadd; /*!< Specifies the Relative Card Address */
|
|
uint32_t sectorcount; /*!< Specifies the Card Capacity in blocks */
|
|
uint32_t sectorsize; /*!< Specifies one block size in bytes */
|
|
uint32_t logblocknbr; /*!< Specifies the Card logical Capacity in blocks */
|
|
uint32_t logblocksize; /*!< Specifies logical block size in bytes */
|
|
uint32_t busspeed; /*!< Clock */
|
|
uint16_t card_class; /*!< Specifies the class of the card class */
|
|
uint8_t iscardpresent; /*!< is card present flag */
|
|
uint8_t f8flag; /*!< CMD8 support flag, set after good resp of CMD8 */
|
|
uint8_t sdio_mode; /*!< sdio only mode flag */
|
|
sdio_t sdio; /*!< sdio card information */
|
|
}sd_cardinfo_t;
|
|
|
|
/**
|
|
* @brief SD command structure definition
|
|
*/
|
|
typedef struct _sd_cmd_t{
|
|
uint32_t arg; /*!< SD Command Argument */
|
|
uint16_t xfer_mode; /*!< SD Command transfer mode */
|
|
uint8_t cmdidx; /*!< SD Command index */
|
|
uint8_t data_present; /*!< SD Command uses Data lines */
|
|
}sd_cmd_t;
|
|
|
|
|
|
/**
|
|
* @brief SD Default init Parameters
|
|
*/
|
|
typedef struct _sd_param_t{
|
|
uint8_t dev_id; /*!< SD Device ID */
|
|
uint8_t clock_id; /*!< SD Clock id 0: 12.5MHz 1: 25MHz 2: 50MHz */
|
|
uint8_t bus_width; /*!< SD Bus Width 0: 1 Bit 1: 4Bit */
|
|
uint8_t dma_mode; /*!< SD DMA Mode 0: SDMA 1: ADMA2 */
|
|
uint8_t operation_mode; /*!< SD operation mode 0: Polling 1: Interrupt */
|
|
void (*app_callback)(uint32_t); /*!< SD Application Callback function pointer */
|
|
}sd_param_t;
|
|
|
|
/**
|
|
* @brief Global SD Handle Information Structure definition
|
|
*/
|
|
typedef struct _sd_handle_t{
|
|
SDMMC_Type *regs; /*!< SD controller registers base address */
|
|
sd_cmd_t sd_cmd; /*!< SD Command info */
|
|
sd_cardinfo_t sd_card; /*!< SD Card information */
|
|
uint32_t hc_caps; /*!< Host Controller capabilities */
|
|
__IO uint32_t context; /*!< SD transfer context */
|
|
__IO uint32_t error_code; /*!< SD Card Error codes */
|
|
uint32_t csd[4]; /*!< SD card specific data table */
|
|
uint32_t cid[4]; /*!< SD card identification number table */
|
|
uint32_t scr[2]; /*!< SD card Configuration Register */
|
|
SD_CARD_STATE state; /*!< SD card State */
|
|
uint16_t hc_version; /*!< Host controller version */
|
|
sd_param_t sd_param; /*!< SD Default Config Parameters */
|
|
}sd_handle_t;
|
|
|
|
/**
|
|
* @brief Disk IO Driver structure definition
|
|
*/
|
|
typedef struct _diskio_t{
|
|
SD_DRV_STATUS (*disk_initialize) (sd_param_t *); /*!< Initialize Disk Drive */
|
|
SD_DRV_STATUS (*disk_uninitialize) (uint8_t); /*!< Un-initialize Disk Drive */
|
|
SD_CARD_STATE (*disk_status) (void); /*!< Get Disk Status */
|
|
SD_DRV_STATUS (*disk_info) (sd_cardinfo_t *); /*!< Get Disk information */
|
|
SD_DRV_STATUS (*disk_read) (uint32_t, uint16_t, volatile uint8_t *); /*!< Read Sector(s) */
|
|
SD_DRV_STATUS (*disk_write) (uint32_t, uint32_t, volatile uint8_t *); /*!< Write Sector(s) */
|
|
#ifdef SDMMC_IRQ_MODE
|
|
void (*disk_cb)(uint32_t);
|
|
#endif
|
|
}diskio_t;
|
|
|
|
extern const diskio_t SD_Driver;
|
|
|
|
/* SD Driver function forward declaration */
|
|
SD_CARD_STATE sd_state(void);
|
|
SD_DRV_STATUS sd_init(sd_param_t *);
|
|
SD_DRV_STATUS sd_info(sd_cardinfo_t *);
|
|
SD_DRV_STATUS sd_uninit(uint8_t);
|
|
SD_DRV_STATUS sd_io_init(sd_handle_t *);
|
|
SD_DRV_STATUS sdio_read_cia(uint8_t *pcia, uint8_t fn, uint8_t offset);
|
|
SD_DRV_STATUS sd_host_init(sd_handle_t *, sd_param_t *);
|
|
SD_DRV_STATUS sd_card_init(sd_handle_t *, sd_param_t *);
|
|
SD_DRV_STATUS sd_write(uint32_t, uint32_t, volatile unsigned char *);
|
|
SD_DRV_STATUS sd_read(uint32_t, uint16_t, volatile unsigned char *);
|
|
SD_DRV_STATUS sd_error_handler();
|
|
#ifdef SDMMC_IRQ_MODE
|
|
void sd_cb(uint32_t);
|
|
#endif
|
|
SDMMC_HC_STATUS hc_send_cmd(sd_handle_t *, sd_cmd_t *);
|
|
SDMMC_HC_STATUS hc_reset(sd_handle_t *, uint8_t);
|
|
void hc_set_bus_power(sd_handle_t *, uint8_t);
|
|
SDMMC_HC_STATUS hc_set_clk_freq(sd_handle_t *, uint16_t);
|
|
void hc_set_tout(sd_handle_t *, uint8_t);
|
|
SDMMC_HC_STATUS hc_identify_card(sd_handle_t *);
|
|
SDMMC_HC_STATUS hc_get_card_ifcond(sd_handle_t *);
|
|
SDMMC_HC_STATUS hc_get_card_opcond(sd_handle_t *);
|
|
SDMMC_HC_STATUS hc_get_emmc_card_opcond(sd_handle_t *);
|
|
SDMMC_HC_STATUS hc_get_card_cid(sd_handle_t *);
|
|
SDMMC_HC_STATUS hc_get_card_csd(sd_handle_t *);
|
|
SDMMC_HC_STATUS hc_config_dma(sd_handle_t *, uint8_t);
|
|
SDMMC_HC_STATUS hc_set_bus_width(sd_handle_t *, uint8_t);
|
|
SDMMC_HC_STATUS hc_switch_1v8(sd_handle_t *);
|
|
SDMMC_HC_STATUS hc_go_idle(sd_handle_t *);
|
|
SDMMC_HC_STATUS hc_sel_card(sd_handle_t *, uint32_t);
|
|
SDMMC_HC_STATUS hc_set_blk_size(sd_handle_t *, uint32_t);
|
|
SDMMC_HC_STATUS hc_set_blk_cnt(sd_handle_t *, uint32_t);
|
|
SDMMC_HC_STATUS hc_read_setup(sd_handle_t *, uint32_t , uint32_t , uint16_t);
|
|
SDMMC_HC_STATUS hc_write_setup(sd_handle_t *, uint32_t , uint32_t , uint16_t);
|
|
SDMMC_HC_STATUS hc_check_xfer_done(sd_handle_t *, uint32_t);
|
|
SDMMC_HC_STATUS hc_get_rca(sd_handle_t *, uint32_t *);
|
|
SDMMC_HC_STATUS hc_get_card_status(sd_handle_t *pHsd, uint32_t *);
|
|
SDMMC_HC_STATUS hc_get_capabilities(sd_handle_t *, uint32_t *);
|
|
uint32_t hc_get_response1(sd_handle_t *);
|
|
uint32_t hc_get_response2(sd_handle_t *);
|
|
uint32_t hc_get_response3(sd_handle_t *);
|
|
uint32_t hc_get_response4(sd_handle_t *);
|
|
void hc_config_interrupt(sd_handle_t *);
|
|
SDMMC_HC_STATUS hc_io_reset(sd_handle_t *);
|
|
SDMMC_HC_STATUS hc_check_bus_idle(sd_handle_t *);
|
|
SDMMC_HC_STATUS hc_get_io_opcond(sd_handle_t *, uint32_t, uint32_t *);
|
|
SDMMC_HC_STATUS hc_io_rw_direct(sd_handle_t *pHsd, uint32_t rwFlag, uint32_t fn, \
|
|
uint32_t addr, uint8_t writeData, uint8_t *readPtr);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|