📄 sdio_drv.c
字号:
cmd52.rw = SDIO_READ;
cmd52.func = 0;
cmd52.raw = KAL_FALSE;
cmd52.stop = KAL_FALSE;
cmd52.adrs = 5;
status = SDIO_Cmd52(&cmd52);
*pending=(cmd52.data&(1<<function))>>function;
SDIO_resume_IO(SDIO_FUCN_0);
return status;
}
/*************************************************************************
* FUNCTION
* SDIO_configure_BLK_size
*
* DESCRIPTION
* This function is to configure block size
*
* PARAMETERS
* function: function id
* size: block size
*
* RETURNS
* SDC_CMD_STATUS
*
* GLOBALS AFFECTED
*
*************************************************************************/
SDC_CMD_STATUS SDIO_configure_BLK_size(SDIO_function_id_enum function, kal_uint32 size)
{
SDC_CMD_STATUS status;
cmd52_config_struct cmd52;
SDIO_dispatch_IO(SDIO_FUCN_0);
cmd52.rw = SDIO_WRITE;
cmd52.func = 0;
cmd52.raw = KAL_FALSE;
cmd52.stop = KAL_FALSE;
cmd52.adrs = 0x10+0x100*function;
cmd52.data = size&0xff;
status = SDIO_Cmd52(&cmd52);
if(size>=256)
{
cmd52.adrs = 0x11+0x100*function;
cmd52.data = (size&0xff00)>>8;
status = SDIO_Cmd52(&cmd52);
}
if(status==NO_ERROR)
{
gSDIO.block_size[function]=size;
/*set block length as size*/
BitFieldWrite32((kal_uint32*)SDC_CFG,(kal_uint32)size,SDC_CFG_BLKLEN);
}
SDIO_resume_IO(SDIO_FUCN_0);
return status;
}
/*************************************************************************
* FUNCTION
* SDIO_query_BLK_size
*
* DESCRIPTION
* This function is to query function's maximum block size
*
* PARAMETERS
* function: function id
*
* RETURNS
* size: block size
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint32 SDIO_query_BLK_size(SDIO_function_id_enum function)
{
kal_uint32 max_block_size;
kal_uint32 i;
for(i=0;i<SDIO_TUPLE_SIZE;i++)
{
if(sdio_tuple[function][i]==0x22)
{
if(function==SDIO_FUCN_0)
max_block_size=(sdio_tuple[function][i+3])|(sdio_tuple[function][i+4]<<8);
else
max_block_size=(sdio_tuple[function][i+14])|(sdio_tuple[function][i+15]<<8);
return max_block_size;
}
}
return 0;
}
/*************************************************************************
* FUNCTION
* SDIO_query_IO_id
*
* DESCRIPTION
* This function is to query application function id
*
* PARAMETERS
* ap: application type
*
* RETURNS
* function: function id
*
* GLOBALS AFFECTED
*
*************************************************************************/
SDIO_function_id_enum SDIO_query_IO_id(SDIO_interface_code_enum ap)
{
switch(ap)
{
case SDIO_INTERFACE_NULL:
break;
case SDIO_INTERFACE_UART:
break;
case SDIO_INTERFACE_A_BT:
break;
case SDIO_INTERFACE_B_BT:
break;
case SDIO_INTERFACE_GPS:
break;
case SDIO_INTERFACE_CAMERA:
break;
case SDIO_INTERFACE_PHS:
break;
case SDIO_INTERFACE_WLAN:
return 1;
break;
default:
break;
}
return 0;
}
/*************************************************************************
* FUNCTION
* SDIO_SW_reset
*
* DESCRIPTION
* This function is to reset all I/O function
*
* PARAMETERS
* None
*
* RETURNS
* SDC_CMD_STATUS
*
* GLOBALS AFFECTED
*
*************************************************************************/
SDC_CMD_STATUS SDIO_SW_reset(void)
{
cmd52_config_struct cmd52;
SDC_CMD_STATUS status;
/*use CMD52 to reset card*/
cmd52.rw = SDIO_WRITE;
cmd52.func = 0;
cmd52.raw = KAL_FALSE;
cmd52.stop = KAL_FALSE;
cmd52.adrs = 6;
cmd52.data = 0xff;
status=SDIO_Cmd52(&cmd52);
return status;
}
/*************************************************************************
* FUNCTION
* SDIO_abort_IO
*
* DESCRIPTION
* This function is to abort function
*
* PARAMETERS
* function:function id
*
* RETURNS
* SDC_CMD_STATUS
*
* GLOBALS AFFECTED
*
*************************************************************************/
SDC_CMD_STATUS SDIO_abort_IO(SDIO_function_id_enum function)
{
SDC_CMD_STATUS status;
cmd52_config_struct cmd52;
SDIO_dispatch_IO(SDIO_FUCN_0);
cmd52.rw = SDIO_WRITE;
cmd52.func = 0;
cmd52.raw = KAL_FALSE;
cmd52.stop = KAL_FALSE;
cmd52.adrs = 6;
cmd52.data = function&0x7;
status = SDIO_Cmd52(&cmd52);
SDIO_resume_IO(SDIO_FUCN_0);
return status;
}
/*Function for WiFi */
/*************************************************************************
* FUNCTION
* SDIO_Register_Write
*
* DESCRIPTION
* This function is to write register
*
* PARAMETERS
* function:function id
* addr: address
* data: write data
* op: fixed or incrementing address
* RETURNS
* success or not
*
* GLOBALS AFFECTED
*
*************************************************************************/
/*Write Register*/
kal_bool SDIO_Register_Write(SDIO_function_id_enum function,
kal_uint32 addr,
kal_uint32 data,
cmd53_op_enum op)
{
kal_uint32 tmp = data;
cmd53_config_struct cmd53;
SDIO_dispatch_IO(function);
cmd53.rw = SDIO_WRITE;
cmd53.func = function;
cmd53.block = KAL_FALSE;
cmd53.buffer = (kal_uint32)&tmp;
cmd53.count = 4;
cmd53.op = op;
cmd53.adrs = (kal_uint32)addr;
if((SDIO_Cmd53(&cmd53)!=NO_ERROR))
{
SDIO_resume_IO(function);
return KAL_FALSE;
}
else
{
SDIO_resume_IO(function);
return KAL_TRUE;
}
}
kal_bool SDIO_Register_Write_isr(SDIO_function_id_enum function,
kal_uint32 addr,
kal_uint32 data,
cmd53_op_enum op)
{
kal_uint32 tmp = data;
cmd53_config_struct cmd53;
cmd53.rw = SDIO_WRITE;
cmd53.func = function;
cmd53.block = KAL_FALSE;
cmd53.buffer = (kal_uint32)&tmp;
cmd53.count = 4;
cmd53.op = op;
cmd53.adrs = (kal_uint32)addr;
if((SDIO_Cmd53_isr(&cmd53)!=NO_ERROR))
{
return KAL_FALSE;
}
else
{
return KAL_TRUE;
}
}
/*Write Data */
/*************************************************************************
* FUNCTION
* SDIO_Data_Write
*
* DESCRIPTION
* This function is to write memory
*
* PARAMETERS
* function:function id
* addr: address
* data: write data
* op: fixed or incrementing address
* count: transfer count
* block: block/byte mode
*
* RETURNS
* success or not
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_bool SDIO_Data_Write(SDIO_function_id_enum function,
kal_uint32 addr,
kal_uint8 *data,
cmd53_op_enum op,
kal_uint32 count,
kal_bool block)
{
cmd53_config_struct cmd53;
//kal_uint32 size, i;
//kal_uint32 sdio_buffer[256];
SDIO_dispatch_IO(function);
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
cmd53.rw = SDIO_WRITE;
cmd53.func = function;
cmd53.block = block;
cmd53.buffer = (kal_uint32)data;//(kal_uint32)&sdio_buffer[0];
cmd53.count = count;
cmd53.op = op;
cmd53.adrs = (kal_uint32)addr;
if((SDIO_Cmd53(&cmd53)!=NO_ERROR))
{
SDIO_resume_IO(function);
return KAL_FALSE;
}
else
{
SDIO_resume_IO(function);
return KAL_TRUE;
}
}
/*************************************************************************
* FUNCTION
* SDIO_Register_Read
*
* DESCRIPTION
* This function is to Read register
*
* PARAMETERS
* function:function id
* addr: address
* data: write data
* op: fixed or incrementing address
*
* RETURNS
* success or not
*
* GLOBALS AFFECTED
*
*************************************************************************/
/*Read Register*/
kal_bool SDIO_Register_Read(SDIO_function_id_enum function,
kal_uint32 addr,
kal_uint32 *data,
cmd53_op_enum op)
{
cmd53_config_struct cmd53;
SDIO_dispatch_IO(function);
cmd53.rw = SDIO_READ;
cmd53.func = function;
cmd53.block = KAL_FALSE;
cmd53.buffer = (kal_uint32)data;
cmd53.count = 4;
cmd53.op = op;;
cmd53.adrs = (kal_uint32)addr;
if((SDIO_Cmd53(&cmd53)!=NO_ERROR))
{
SDIO_resume_IO(function);
return KAL_FALSE;
}
else
{
SDIO_resume_IO(function);
return KAL_TRUE;
}
}
/*************************************************************************
* FUNCTION
* SDIO_Register_Read_poll
*
* DESCRIPTION
* This function is to Read register by SDIO bus driver
*
* PARAMETERS
* function:function id
* addr: address
* data: write data
* op: fixed or incrementing address
*
* RETURNS
* success or not
*
* GLOBALS AFFECTED
* only for SDIO bus driver
*************************************************************************/
kal_bool SDIO_Register_Read_poll(SDIO_function_id_enum function,
kal_uint32 addr,
kal_uint32 *data,
cmd53_op_enum op)
{
cmd53_config_struct cmd53;
cmd53.rw = SDIO_READ;
cmd53.func = function;
cmd53.block = KAL_FALSE;
cmd53.buffer = (kal_uint32)data;
cmd53.count = 4;
cmd53.op = op;;
cmd53.adrs = (kal_uint32)addr;
if((SDIO_Cmd53_isr(&cmd53)!=NO_ERROR))
{
return KAL_FALSE;
}
else
{
return KAL_TRUE;
}
}
/*************************************************************************
* FUNCTION
* SDIO_Data_Read
*
* DESCRIPTION
* This function is to read memory
*
* PARAMETERS
* function:function id
* addr: address
* data: write data
* op: fixed or incrementing address
* count: transfer count
* block: block/byte mode
*
* RETURNS
* success or not
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_bool SDIO_Data_Read(SDIO_function_id_enum function,
kal_uint32 addr,
kal_uint8 *data,
cmd53_op_enum op,
kal_uint32 count,
kal_bool block)
{
cmd53_config_struct cmd53;
SDIO_dispatch_IO(function);
cmd53.rw = SDIO_READ;
cmd53.func = function;
cmd53.block = block;
cmd53.buffer = (kal_uint32)data;
cmd53.count = count;
cmd53.op = op;
cmd53.adrs = (kal_uint32)addr;
if((SDIO_Cmd53(&cmd53)!=NO_ERROR))
{
SDIO_resume_IO(function);
return KAL_FALSE;
}
else
{
SDIO_resume_IO(function);
return KAL_TRUE;
}
}
/*not support in MT6228 and MT6229*/
#ifdef __SDIO_SRW_SRW__
/*************************************************************************
* FUNCTION
* SDIO_suspend_IO
*
* DESCRIPTION
* This function is to suspend function
*
* PARAMETERS
* bus_status: bus status
*
* RETURNS
* SDC_CMD_STATUS
*
* GLOBALS AFFECTED
*
*************************************************************************/
SDC_CMD_STATUS SDIO_suspend_IO(SDIO_bus_status_enum *bus_status)
{
SDC_CMD_STATUS status;
cmd52_config_struct cmd52;
cmd52.rw = SDIO_WRITE;
cmd52.func = 0;
cmd52.raw = KAL_TRUE;
cmd52.stop = KAL_FALSE;
cmd52.adrs = 0xc;
cmd52.data = 1;
if((status = SDIO_Cmd52(&cmd52))!=NO_ERROR)
return status;
*bus_status=(cmd52.data&0x2)>>1;
return NO_ERROR;
}
/*************************************************************************
* FUNCTION
* SDIO_select_IO
*
* DESCRIPTION
* This function is to resume function
*
* PARAMETERS
* bus_status: bus status
*
* RETURNS
* SDC_CMD_STATUS
*
* GLOBALS AFFECTED
*
*************************************************************************/
SDC_CMD_STATUS SDIO_select_IO(SDIO_function_id_enum function, kal_bool *resume_data)
{
SDC_CMD_STATUS status;
cmd52_config_struct cmd52;
cmd52.rw = SDIO_WRITE;
cmd52.func = 0;
cmd52.raw = KAL_TRUE;
cmd52.stop = KAL_FALSE;
cmd52.adrs = 0xd;
cmd52.data = function&0xf;
if((status = SDIO_Cmd52(&cmd52))!=NO_ERROR)
return status;
*resume_data=(cmd52.data&0x80)>>7;
return NO_ERROR;
}
/*************************************************************************
* FUNCTION
* SDIO_check_IO_exec
*
* DESCRIPTION
* This function is to check function execution status
*
* PARAMETERS
* execute_status: execute status
*
* RETURNS
* SDC_CMD_STATUS
*
* GLOBALS AFFECTED
*
*************************************************************************/
SDC_CMD_STATUS SDIO_check_IO_exec(SDIO_function_id_enum function, kal_bool *execution)
{
SDC_CMD_STATUS status;
cmd52_config_struct cmd52;
cmd52.rw = SDIO_READ;
cmd52.func = 0;
cmd52.raw = KAL_FALSE;
cmd52.stop = KAL_FALSE;
cmd52.adrs = 0xe;
if((status = SDIO_Cmd52(&cmd52))!=NO_ERROR)
return status;
if(function!=SDIO_FUCN_MEM)
*execution=(cmd52.data&(1<<function))>>function ;
else
*execution=cmd52.data&0x1;
return NO_ERROR;
}
/*************************************************************************
* FUNCTION
* SDIO_check_IO_ready_flag
*
* DESCRIPTION
* This function is to check function execution status
*
* PARAMETERS
* bus_status: bus status
*
* RETURNS
* SDC_CMD_STATUS
*
* GLOBALS AFFECTED
*
*************************************************************************/
SDC_CMD_STATUS SDIO_check_IO_ready_flag(SDIO_function_id_enum function, kal_bool *ready)
{
SDC_CMD_STATUS status;
cmd52_config_struct cmd52;
cmd52.rw = SDIO_READ;
cmd52.func = 0;
cmd52.raw = KAL_FALSE;
cmd52.stop = KAL_FALSE;
cmd52.adrs = 0xf;
if((status = SDIO_Cmd52(&cmd52))!=NO_ERROR)
return status;
if(function!=SDIO_FUCN_MEM)
*ready=(cmd52.data&(1<<function))>>function ;
else
*ready=cmd52.data&0x1;
return NO_ERROR;
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -