blob: 1cf8ec67d558732303585aaa2ef04efa086ad29a [file] [log] [blame]
/********************************************************************************
* Marvell GPL License Option
*
* If you received this File from Marvell, you may opt to use, redistribute and/or
* modify this File in accordance with the terms and conditions of the General
* Public License Version 2, June 1991 (the "GPL License"), a copy of which is
* available along with the File in the license.txt file or by writing to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
* on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
*
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
* WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
* DISCLAIMED. The GPL License provides additional details about this warranty
* disclaimer.
******************************************************************************/
#ifndef __SDIO_CONTROLLER_H
#define __SDIO_CONTROLLER_H
// DMA or PIO mode
#define SDIO_DMA 1
#define MULTI_SDIO 1
#define __SDIO_INT_MODE___
typedef volatile unsigned long VUINT32_T;
typedef unsigned long UINT32_T, ULONG;
typedef volatile unsigned int VUINT_T;
typedef unsigned int UINT_T;
typedef int INT_T;
//typedef unsigned short UINT16_T, USHORT;
//typedef volatile unsigned short VUINT16_T;
//typedef unsigned char UINT8_T;
//typedef char INT8_T;
#define TRUE 1
#define FALSE 0
// MMC controller registers definition
typedef struct
{
VUINT32_T mm4_sysaddr; // DMA system address 0x0
VUINT32_T mm4_blk_cntl; // Block size control register 0x4
VUINT32_T mm4_arg; // Command argument 0x8
VUINT32_T mm4_cmd_xfrmd; // Command and transfer mode 0xC
VUINT32_T mm4_resp0; // cmd response 0 0x10
VUINT32_T mm4_resp1; // cmd response 1 0x14
VUINT32_T mm4_resp2; // cmd response 2 0x18
VUINT32_T mm4_resp3; // cmd response 3 0x1C
VUINT32_T mm4_dp; // buffer data port 0x20
VUINT32_T mm4_state; // mm4 state 0x24
VUINT32_T mm4_cntl1; // host control 1 0x28
VUINT32_T mm4_cntl2; // host control 2 0x2C
VUINT32_T mm4_i_stat; // status of current command 0x30
VUINT32_T mm4_i_stat_en; // interrupt status enable 0x34
VUINT32_T mm4_i_sig_en; // interrupt signal enable 0x38
VUINT32_T mm4_acmd12_er; // auto cmd12 error status 0x3C
VUINT32_T mm4_cap1_2; // capabilities 1,2 0x40
VUINT32_T mm4_cap3_4; // capabilities 3,4 0x44
VUINT32_T mm4_sd_max_current1_2; // max current capabilities 0x48
VUINT32_T mm4_sd_max_current3_4; // max current capabilities 0x4C
VUINT32_T mm4_force_event; // force event for AutoCMD12 Error Status 0x50
VUINT32_T mm4_adma_err_stat; // ADMA Error Status 0x54
VUINT32_T mm4_adma_system_address[2]; // ADMA Address 63:0 0x58
VUINT32_T mm4_preset_value_for_init_ds; // 0x60
VUINT32_T mm4_preset_value_for_hs_sdr12; // 0x64
VUINT32_T mm4_preset_value_for_hs_sdr25_50; // 0x68
VUINT32_T mm4_preset_value_for_hs_sdr104_50; // 0x6C
VUINT32_T reserved_X1[28]; // reserved fields 0x70
VUINT32_T mm4_shared_bus_control; // Shared Bus Control Register 0xE0
VUINT32_T reserved_X2[6]; // reserved 0xE4
VUINT32_T mm4_sd_slot_int_stat_ctrl_ver; // SD Interrupt Line and Version Support 0xFC
VUINT32_T mm4_sd_cfg_fifo_param; // SD Extra Parameters register 0x100
VUINT32_T mm4_sd_fifo_param; // SD_FIFO_PARAM register 0x104
VUINT32_T mm4_sd_spi_mode_clk_brst_size; // SD_SIP_MODE register 0x108
VUINT32_T mm4_sd_ce_ata_1_2; // SD_CE_ATA_1 and SD_CE_ATA_2 0x10C
VUINT32_T mm4_sd_pad_io_setup; // MM4_SD_PAD_IO_SETUP 0x110
VUINT32_T mm4_rx_cfg ; // RX_CFG_REG 0x114
VUINT32_T mm4_tx_cfg ; // TX_CFG_REG 0x118
} MM4_SDMMC_T, *P_MM4_SDMMC_T;
/*************************** Register Masks ********************************/
/**************************************************************************/
// ******************** MM4_BLK_CNTL **********************************
typedef struct
{
unsigned int xfr_blksz : 12; // Transfer Block Size
unsigned int dma_bufsz : 4; // Host DMA buffer size
unsigned int blk_cnt : 16; // Block Count for Current Transfer
} MM4_BLK_CNTL, *P_MM4_BLK_CNTL;
#define MM4_512_HOST_DMA_BDRY 0x7
// ********************* MM4_CMD_XFRMD ********************************
// 3/8: Xiufeng update according sdh_register.xls
typedef struct
{
unsigned int dma_en : 1; // DMA enable 0
unsigned int blkcbten : 1; // Block Count Enable 1
unsigned int autocmd12 : 2; // AutoCMD12 2
// xiufeng From APSE's code there is one reserved1 bit here because
// autocmd12 is 1 bit
// unsigned int reserved1 : 1; // 3
unsigned int dxfrdir : 1; // Data Transfer Direction Select 4
unsigned int ms_blksel : 1; // Multi Block Select 5
unsigned int reserved2 : 10; // 6
unsigned int res_type : 2; // Response Type 16
unsigned int reserved3 : 1; // 18
unsigned int crcchken : 1; // CRC check enable 19
unsigned int idxchken : 1; // Command Index Check Enable 20
unsigned int dpsel : 1; // Data present select 21
unsigned int cmd_type : 2; // Cmd Type 22
unsigned int cmd_idx : 6; // Cmd Index 24
unsigned int reserved4 : 2; // 30
} MM4_CMD_XFRMD, *P_MM4_CMD_XFRMD;
typedef union
{
MM4_CMD_XFRMD mm4_cmd_xfrmd_bits;
unsigned int mm4_cmd_xfrmd_value;
} MM4_CMD_XFRMD_UNION, *P_MM4_CMD_XFRMD_UNION;
#define NO_ARGUMENT 0xffffffff
#define MM4_CMD_TYPE_NORMAL 0
#define MM4_CMD_TYPE_SUSPEND 1
#define MM4_CMD_TYPE_RESUME 2
#define MM4_CMD_TYPE_ABORT 3
#define MM4_CMD_DATA 1
#define MM4_CMD_NODATA 0
#define MM4_NO_RES 0
#define MM4_136_RES 1
#define MM4_48_RES 2
#define MM4_48_RES_WITH_BUSY 3
#define MM4_MULTI_BLOCK_TRAN 1
#define MM4_SINGLE_BLOCK_TRAN 0
#define MM4_HOST_TO_CARD_DATA 0
#define MM4_CARD_TO_HOST_DATA 1
// Add by xiufeng
// this information will be included in the response type argument of relevant apis.
// it will occupy bits 15:8 of the RespType parameter.
#define MM4_RT_MASK 0x7f00
#define MM4_RT_NONE 0x0000
#define MM4_RT_R1 0x0100
#define MM4_RT_R2 0x0200
#define MM4_RT_R3 0x0300
#define MM4_RT_R4 0x0400
#define MM4_RT_R5 0x0500
#define MM4_RT_R6 0x0600
#define MM4_RT_R7 0x0700 // sd card interface condition
#define MM4_RT_BUSYMASK 0x8000
#define MM4_RT_BUSY 0x8000
// ********************* MM4_STATE ********************************
typedef struct
{
unsigned int ccmdinhbt : 1;
unsigned int dcmdinhbt : 1;
unsigned int datactv : 1;
unsigned int retuning_req : 1;
unsigned int reserved0 : 4;
unsigned int wractv : 1;
unsigned int rdactv : 1;
unsigned int bufwren : 1;
unsigned int bufrden : 1;
unsigned int reserved1 : 4;
unsigned int cdinstd : 1;
unsigned int cdstbl : 1;
unsigned int cddetlvl : 1;
unsigned int wpswlvl : 1;
unsigned int lwrdatlvl : 4;
unsigned int cmdlvl : 1;
// 3/12: Xiufeng
// From APSE's code, there is one param uprdatlvl which is 4 bits. our controller
// does not have this parameter and reservers the following 7 bits
// unsigned int uprdatlvl : 4;
unsigned int reserved2 : 7;
} MM4_STATE, *P_MM4_STATE;
typedef union
{
MM4_STATE mm4_state_bits;
unsigned int mm4_state_value;
} MM4_STATE_UNION, *P_MM4_STATE_UNION;
// ********************* MM4_CNTL1 ********************************
typedef struct
{
unsigned int ledcntl : 1; // 0
unsigned int datawidth : 1; // 1
unsigned int hispeed : 1; // 2
unsigned int dma_sel : 2; // 3
unsigned int ex_data_width : 1; // 5
unsigned int card_det_l : 1; // 6
unsigned int card_det_s : 1; // 7
unsigned int buspwr : 1; // 8
unsigned int vltgsel : 3; // 9
unsigned int reserved2 : 4; // 12
unsigned int bgreqstp : 1; // 16
unsigned int contreq : 1; // 17
unsigned int rdwcntl : 1; // 18
unsigned int bgirqen : 1; // 19
unsigned int reserved3 : 4;
unsigned int card_int_wake : 1; // 24
unsigned int card_ins_wake : 1; // 25
unsigned int card_rem_wake : 1; // 26
unsigned int reserved4 : 5;
} MM4_CNTL1, *P_MM4_CNTL1;
typedef union
{
MM4_CNTL1 mm4_cntl1_bits;
unsigned int mm4_cntl1_value;
} MM4_CNTL1_UNION, *P_MM4_CNTL1_UNION;
#define MM4_VLTGSEL_1_8 0x5
#define MM4_VLTGSEL_3_0 0x6
#define MM4_VLTGSEL_3_3 0x7
// ********************* MM4_CNTL2 ********************************
typedef struct
{
unsigned int inter_clk_en : 1; // Internal Clock Enable
unsigned int inter_clk_stable : 1; // Internal Clock Stable
unsigned int mm4clken : 1; // Clock Enable
unsigned int reserved1 : 2; // bits 3,4
unsigned int clk_gen_sel : 1; // bit 5
unsigned int sd_freq_sel_hi : 2; // 6
unsigned int sd_freq_sel_lo : 8; // 8
unsigned int dtocntr : 4; // bit 0 Data Timeout Counter Value
unsigned int reserved2 : 4; //
unsigned int mswrst : 1; // bit 8 Software Reset for All
unsigned int cmdswrst : 1; // bit 9 Software Reset for MM4CMD Line
unsigned int datswrst : 1; // bit 10 Software Reset for MM4DATx Lines
unsigned int reserved3 : 5; // bits 11-15
} MM4_CNTL2, *P_MM4_CNTL2;
#define MM4CLKEN_EN_CLOCK 1
#define MM4CLOCK200KHZRATE 0x1FF // Set also additional SD_FREQ_HI bit. So SD_FREQ_SEL = 0x1FF = 511 * 2 = 1022 (clock divider)
#define MM4CLOCK50MHZRATE 2
#define MM4CLOCK25MHZRATE 4
#define MM4CLOCK13MHZRATE 8
#define MM4CLOCK6MHZRATE 16
#define MM4CLOCK187KHZRATE 0x80
#define MM4CLOCK48MHZRATE 0x0
#define CLOCK_27_MULT 0xE
#define SDCLK_SEL_DIV_1024 0x200
#define SDCLK_SEL_DIV_512 0x100
#define SDCLK_SEL_DIV_256 0x80
#define SDCLK_SEL_DIV_128 0x40
#define SDCLK_SEL_DIV_64 0x20
#define SDCLK_SEL_DIV_32 0x10
#define SDCLK_SEL_DIV_16 0x08
#define SDCLK_SEL_DIV_8 0x04
#define SDCLK_SEL_DIV_4 0x02
#define SDCLK_SEL_DIV_2 0x01
#define SDCLK_SEL_DIV_1 0x00
#define SDBUS_4BIT 0x01
typedef union
{
MM4_CNTL2 mm4_cntl2_bits;
unsigned int mm4_cntl2_value;
} MM4_CNTL2_UNION, *P_MM4_CNTL2_UNION;
// ********************* MM4_I_STAT, MM4_I_STAT_EN, MM4_I_SIGN_EN ************
typedef struct
{
unsigned int cmdcomp : 1; //0
unsigned int xfrcomp : 1; //1
unsigned int bgevnt : 1; //2
unsigned int dmaint : 1; //3
unsigned int bufwrrdy : 1; //4
unsigned int bufrdrdy : 1; //5
unsigned int cdins : 1; //6
unsigned int cdrem : 1; //7
unsigned int cdint : 1; //8
unsigned int int_a : 1; //9
unsigned int int_b : 1; //10
unsigned int int_c : 1; //11
unsigned int retuninig_int : 1; //12
unsigned int reserved0 : 2; //13
unsigned int errint : 1; //15
unsigned int ctoerr : 1; //16
unsigned int ccrcerr : 1; //17
unsigned int cenderr : 1; //18
unsigned int cidxerr : 1; //19
unsigned int dtoerr : 1; //20
unsigned int dcrcerr : 1; //21
unsigned int denderr : 1; //22
unsigned int ilmterr : 1; //23
unsigned int ac12err : 1; //24
unsigned int admaerr : 1; //25
unsigned int tune_err : 1; //26
unsigned int reserved1 : 1; //27
unsigned int spierr : 1; //28
unsigned int axi_resp_err : 1; //29
unsigned int cpl_tout_err : 1; //30
unsigned int crc_stat_err : 1; //31
} MM4_I_STAT, *P_MM4_I_STAT, MM4_I_STAT_EN, *P_MM4_I_STAT_EN, MM4_I_SIGN_EN, *P_MM4_I_SIGN_EN;
#define DISABLE_INTS 0
#define ENABLE_INTS 1
typedef union
{
MM4_I_STAT mm4_i_stat_bits;
unsigned int mm4_i_stat_value;
} MM4_I_STAT_UNION, *P_MM4_I_STAT_UNION;
#define CLEAR_INTS_MASK 0xFFFF7EFF
// ********************* MM4_ACMD12_ER *******************************************
typedef struct
{
unsigned int ac12nexe : 1; // 0
unsigned int ac12toer : 1; // 1
unsigned int ac12crcer : 1; // 2
unsigned int ac12ender : 1; // 3
unsigned int ac12idxer : 1; // 4
unsigned int reserved0 : 2; // 5
unsigned int cmdnisud : 1; // 7
unsigned int reserved1 : 8; // 8
unsigned int uhs_mode_sel : 3; // 16
unsigned int sgh_v18_en : 1; // 19
unsigned int drv_strength_sel : 2; // 20
unsigned int exe_tuning : 1; // 22
unsigned int sampling_clk_sel : 1; // 23
unsigned int reserved2 : 6; // 24
unsigned int async_int_en : 1; // 30
unsigned int pre_val_en : 1; // 31
} MM4_ACMD12_ER, *P_MM4_ACMD12_ER;
// ********************* MM4_CAP0 *******************************************
typedef struct
{
unsigned int toclkfreq : 6;
unsigned int reserved0 : 1;
unsigned int toclkunit : 1;
unsigned int bsclkfreq : 8;
// 3/12 Xiufeng
// the following is not same with ASPE's code
unsigned int max_blk_len : 2;
unsigned int ex_data_width_support : 1;
// 3/12 Xiufeng
// no reserved bit here
//unsigned int reserved1 : 1;
unsigned int adma2_support : 1;
unsigned int adma1_support : 1;
unsigned int hi_speed_support : 1;
unsigned int sdma_support : 1;
unsigned int sus_res_support : 1;
unsigned int vlg_33_support : 1;
unsigned int vlg_30_support : 1;
unsigned int vlg_18_support : 1;
unsigned int reserved2 : 1;
unsigned int sys_bus_64_support : 1;
unsigned int async_int_support : 1;
// 3/12 Xiufeng
// cfg_slot_type is 2 bits now
unsigned int cfg_slot_type : 1;
} MM4_CAP1_2, *P_MM4_CAP1_2;
typedef union
{
MM4_CAP1_2 mm4_cap1_2_bits;
UINT_T mm4_cap1_2_value;
} MM4_CAP1_2_UNION, *P_MM4_CAP1_2_UNION;
// ********************* MM4_SD_MAX_CURRENT1_2 *******************************************
typedef struct
{
unsigned int v3_3vmaxi : 8;
unsigned int v3_0vmaxi : 8;
unsigned int v1_8vmaxi : 8;
unsigned int reserved0 : 8;
} MM4_SD_MAX_CURRENT1_2, *P_MM4_SD_MAX_CURRENT1_2;
typedef union
{
MM4_SD_MAX_CURRENT1_2 mm4_sd_max_current1_2_bits;
UINT_T mm4_sd_max_current1_2_value;
} MM4_SD_MAX_CURRENT1_2_UNION, *P_MM4_SD_MAX_CURRENT1_2_UNION;
// ********************* MM4_SD_CFG_FIFO_PARAM *******************************************
typedef struct
{
unsigned int reserved0 : 3; // Bits 0-2
unsigned int boot_ack : 1; // Bit 3
unsigned int squ_empty_check : 1; // Bit 4
unsigned int squ_full_check : 1; // Bit 5
unsigned int gen_pad_clk_on : 1; // Bit 6
unsigned int reserved2 : 17; // Bits 7-23
unsigned int gen_pad_clk_cnt : 8; // Bits 24-31
} MM4_SD_CFG_FIFO_PARAM, *P_MM4_SD_CFG_FIFO_PARAM;
typedef union
{
MM4_SD_CFG_FIFO_PARAM MM4_SD_CFG_FIFO_PARAM_bits;
UINT_T MM4_SD_CFG_FIFO_PARAM_value;
} MM4_SD_CFG_FIFO_PARAM_UNION, *P_MM4_SD_CFG_FIFO_PARAM_UNION;
// ********************* MM4_SD_FIFO_PARAM *******************************************
typedef struct
{
unsigned int rtc : 2; // Bits 1:0
unsigned int wtc : 2; // Bit 3:2
unsigned int fifo_clock : 1; // Bit 4
unsigned int fifo_cs : 1; // Bit 5
unsigned int power_down : 1; // Bit 6
unsigned int reserver0 : 1; // Bit 7
unsigned int clk_gate_ctl : 1; // bit 8
unsigned int clk_gate_on : 1; // bit 9
unsigned int reserver1 : 1; // bit 10
unsigned int ovrrd_clk_oen : 1; // bit 11
unsigned int force_clk_on : 1; // bit 12
unsigned int reserved2 : 19; // Bits 13:31
} MM4_SD_FIFO_PARAM, *P_MM4_SD_FIFO_PARAM;
typedef union
{
MM4_SD_FIFO_PARAM MM4_SD_FIFO_PARAM_bits;
UINT_T MM4_SD_FIFO_PARAM_value;
} MM4_SD_FIFO_PARAM_UNION, *P_MM4_SD_FIFO_PARAM_UNION;
// ********************* MM4_SD_CE_ATA_1_2 *******************************************
typedef struct
{
unsigned int cpl_timeout : 14; // Bits 0-13
unsigned int reserved0 : 2; // Bit 14,15
unsigned int misc_int_int_en : 1; // Bit 0
unsigned int misc_int_en : 1; // Bit 1
unsigned int misc_int : 1; // Bit 2
unsigned int reserved1 : 1; // Bit 3
unsigned int cpl_complete_int_en : 1; // Bit 4
unsigned int cpl_complete_en : 1; // Bit 5
unsigned int cpl_complete : 1; // Bit 6
// 3/12 Xiufeng
// for BG2 SDIO controller, reserved 4 bits here and the left
// one bits is used as mms_resetn.the mmc_resetn controls the value
// of the pin MMC_RESETN going to eMMC device.
//unsigned int reserved2 : 5; // Bit 7
unsigned int reserved2 : 4; // Bit 7
unsigned int mmc_resetn : 1; // Bit 11
unsigned int mmc_card : 1; // Bit 12
unsigned int ceata_card : 1; // Bit 13
unsigned int snd_cpl : 1; // Bit 14
unsigned int chk_cpl : 1; // Bit 15
} MM4_SD_CE_ATA_1_2, *P_MM4_SD_CE_ATA_1_2;
typedef union
{
MM4_SD_CE_ATA_1_2 MM4_SD_CE_ATA_1_2_bits;
UINT_T MM4_SD_CE_ATA_1_2_value;
} MM4_SD_CE_ATA_1_2_UNION, *PMM4_SD_CE_ATA_1_2_UNION;
typedef struct
{
unsigned int tx_hold_delay0 : 9; // bit 8:0
unsigned int reserved1 : 7; // bit 15:9
unsigned int tx_hold_delay1 : 9; // bit 24:16
unsigned int reserved2 : 7; // bit 31:25
}MM4_TX_CFG, *P_MM4_TX_CFG ;
typedef union
{
MM4_TX_CFG MM4_TX_CFG_bits ;
UINT_T MM4_TX_CFG_value ;
}MM4_TX_CFG_UNION, *PMM4_TX_CFG_UNION ;
/*********** End MM4 Register Def's **************************************/
// response types
enum {
MMC_RESPONSE_NONE = 1L<<8,
MMC_RESPONSE_R1 = 2L<<8,
MMC_RESPONSE_R1B = 3L<<8,
MMC_RESPONSE_R2 = 4L<<8,
MMC_RESPONSE_R3 = 5L<<8,
MMC_RESPONSE_R4 = 6L<<8,
MMC_RESPONSE_R5 = 7L<<8,
MMC_RESPONSE_R5B = 8L<<8,
MMC_RESPONSE_R6 = 9L<<8,
MMC_RESPONSE_R7 = 0xAL<<8,
MMC_RESPONSE_MASK = 0x0000FF00
};
#define SD_OCR_VOLTAGE_3_3_TO_3_6 0xE00000
#define SD_OCR_VOLTAGE_1_8_TO_3_3 0x1F8000
#define SD_OCR_VOLTAGE_1_8 0x80
#define MMC_OCR_VOLTAGE_ALL 0xFF8000
#define MM4FIFOWORDSIZE 0x80
// device context for MMC API, containing anything needed to operate on
// this API. It is always first parameter for all APIs.
typedef struct
{
P_MM4_SDMMC_T pMMC4Reg; // MMC1 register base
} MM4_SDMMC_CONTEXT_T, *P_MM4_SDMMC_CONTEXT_T;
#ifdef IO_CARD_SUPPORT
#define SDIO_OCR_VOLTAGE_2_0_TO_2_1 0x000100
#define SDIO_OCR_VOLTAGE_2_1_TO_2_2 0x000200
#define SDIO_OCR_VOLTAGE_2_2_TO_2_3 0x000400
#define SDIO_OCR_VOLTAGE_2_3_TO_2_4 0x000800
#define SDIO_OCR_VOLTAGE_2_4_TO_2_5 0x001000
#define SDIO_OCR_VOLTAGE_2_5_TO_2_6 0x002000
#define SDIO_OCR_VOLTAGE_2_6_TO_2_7 0x004000
#define SDIO_OCR_VOLTAGE_2_7_TO_2_8 0x008000
#define SDIO_OCR_VOLTAGE_2_8_TO_2_9 0x010000
#define SDIO_OCR_VOLTAGE_2_9_TO_3_0 0x020000
#define SDIO_OCR_VOLTAGE_3_0_TO_3_1 0x040000
#define SDIO_OCR_VOLTAGE_3_1_TO_3_2 0x080000
#define SDIO_OCR_VOLTAGE_3_2_TO_3_3 0x100000
#define SDIO_OCR_VOLTAGE_3_3_TO_3_4 0x200000
#define SDIO_OCR_VOLTAGE_3_4_TO_3_5 0x400000
#define SDIO_OCR_VOLTAGE_3_5_TO_3_6 0x800000
#define SDIO_OCR_ALL_VOLTAGES 0xFFFFFF
#endif
#define SD_OCR_VOLTAGE_3_3_TO_3_6 0xE00000
#define SD_OCR_VOLTAGE_1_8_TO_3_3 0x1F8000
#define SD_OCR_VOLTAGE_1_8 0x80
#define MMC_OCR_VOLTAGE_ALL 0xFF8000
#define MM4FIFOWORDSIZE 0x80
// ADMA descriptor
typedef struct sdio_adma_desc
{
unsigned int valid :1;
unsigned int end :1;
unsigned int interrupt :1;
unsigned int zero :1;
unsigned int act1 :1;
unsigned int act2 :1;
unsigned int resvered :10;
unsigned int length :16;
unsigned int addr;
} SDIO_ADMA_DESC, *SDIO_ADMA_DESC_PTR;
#endif