⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdio_drv.c

📁 SDIO实现底层驱动文件.非常有用.经典!
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -