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

📄 mspro.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------
 *   mspro.c
 *
 * Project:
 * --------
 *   Maui_Software
 *
 * Description:
 * ------------
 *   MS-Pro driver file.
 *
 * Author:
 * -------
 * -------
 *
 ****************************************************************************
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================ 
 ****************************************************************************/
#include "kal_release.h"
#include "msdc_def.h"
#include "mspro_def.h"
#include "gpt_sw.h"
#include "intrCtrl.h"
#include "reg_base.h"
#include "drv_comm.h"

#if defined(__MSDC_MSPRO__)
// global variables
MSP_HANDLE		gMSP = {0};

// function declaration
static MSP_STATUS MSP_TPCs(kal_uint32* buffer, kal_uint16 size, kal_uint8 tpc);
static MSP_STATUS MSP_TPC_ReadLongData(kal_uint32* rxbuffer);
static MSP_STATUS MSP_TPC_ReadReg(kal_uint32* buffer, kal_uint8 length);
static MSP_STATUS MSP_TPC_WriteReg(kal_uint32* buffer, kal_uint8 length);
static MSP_STATUS MSP_TPC_SetRWAdrs(kal_uint8 r_adrs, kal_uint8 r_len, kal_uint8 w_adrs, kal_uint8 w_len);
static MSP_STATUS MSP_TPC_GetInt(kal_uint32* intreg);
static MSP_STATUS MSP_TPC_ReadShortData(kal_uint32* buffer, ms_ShortData_enum length);
static MSP_STATUS MSP_TPC_ExSetCmd(kal_uint32 adrs, kal_uint16 count, kal_uint8 cmd,kal_uint16* msc_sta);
extern void GPTI_BusyWait(kal_uint16 len);

/*************************************************************************
* FUNCTION
*  detect_parallel_mode
*
* DESCRIPTION
*	Detect if ms-pro is at parallel mode of serial mode.
*
* PARAMETERS
*	
*
* RETURNS
*  
*
* GLOBALS AFFECTED
*	
*
*************************************************************************/
static void detect_parallel_mode(void)
{
	MSP_STATUS status;
	kal_uint32 regint;
	
	// disable parallel mode for controller 	
	MSDC_CLR_BIT32(MSC_CFG,MSC_CFG_PMODE);
   if((status = MSP_TPC_GetInt(&regint)) != MSP_NOERROR)
   {
      // time out => set parallel mode
      MSDC_SET_BIT32(MSC_CFG,MSC_CFG_PMODE);
      status = MSP_TPC_GetInt(&regint);
      gMSP.mode = MSP_PARALLEL;
   }
   else
   	gMSP.mode = MSP_SERIAL;
   
}
/*************************************************************************
* FUNCTION
*  MSP_Confirm_CPU
*
* DESCRIPTION
*	Check if MS-PRO controller is ready	
*
* PARAMETERS
*
* RETURNS
*
* GLOBALS AFFECTED
*
*************************************************************************/
static MSP_STATUS MSP_Confirm_CPU(void)
{
	kal_uint32 t1;
	kal_uint8 reg[4] = {0};
	MSP_STATUS status;

	t1 = drv_get_current_time();
	while(1)
	{
		if((status = MSP_TPC_GetInt((kal_uint32*)reg)) != MSP_NOERROR)
			return MSP_ERRORS;
		if(reg[0] & INT_CED)
		{
			if((status = MSP_TPC_GetInt((kal_uint32*)reg)) != MSP_NOERROR)
				return MSP_ERRORS;
			if(reg[0] & INT_ERR)
			{
				if(reg[0] & INT_CMDNK)
				{
					gMSP.is_wp = KAL_TRUE;
					return MSP_NOERROR;					
				}
				else
				{
					return  MSP_ERRORS;// meida error			
				}
			}
			else
				return MSP_NOERROR;
		}
		if(drv_get_duration_ms(t1) > 1000)
			return MSP_ERRORS;		
	}
	return MSP_NOERROR;
}
/*************************************************************************
* FUNCTION
*  MSP_Confirm_Atrb
*
* DESCRIPTION
*	Read the attribute of MS-PRO card
*
* PARAMETERS
*
* RETURNS
*	MSP_STATUS
*
* GLOBALS AFFECTED
*	gMSP
*
*************************************************************************/
static MSP_STATUS MSP_Confirm_Atrb(void)
{
	MSP_STATUS status;
	kal_uint8 *p = (kal_uint8*)MSDC_Sector;
	kal_uint16 sectors;
	kal_uint32 tmp, adrs;

	status = MSP_CMD_ReadAtrb(0, 1, MSDC_Sector, &sectors);
	if(status != MSP_NOERROR)
		return status;
	// confirmation area
	MSDC_InvertN((kal_uint8*)&tmp, &p[0], 2);
	gMSP.signature = (kal_uint16)tmp;
	MSDC_InvertN((kal_uint8*)&tmp, &p[2], 2);
	gMSP.version = (kal_uint16)tmp;	
	gMSP.di_count = p[4];
   MSDC_InvertN((kal_uint8*)&tmp, &p[16], 4);
   adrs = tmp;

	if(gMSP.signature != 0xA5C3)
		return MSP_ERR_SIG;
	// retreive device information
	p = (kal_uint8*)MSDC_Sector + adrs;
   MSDC_InvertN((kal_uint8*)&tmp, &p[2], 2);
   gMSP.block_size = (kal_uint16)tmp;
   MSDC_InvertN((kal_uint8*)&tmp, &p[4], 2);
   gMSP.total_block = (kal_uint16)tmp;
   MSDC_InvertN((kal_uint8*)&tmp, &p[6], 2);
   gMSP.user_block = (kal_uint16)tmp;
   MSDC_InvertN((kal_uint8*)&tmp, &p[8], 2);
   gMSP.page_size = (kal_uint16)tmp;
   MSDC_InvertN((kal_uint8*)&tmp, &p[44], 2);
   gMSP.unit_size = (kal_uint16)tmp;

	
	return MSP_NOERROR;
}
/*************************************************************************
* FUNCTION
*  MS_Switch_Interface
*
* DESCRIPTION
*	switch the serial mode or parallel mode
*
* PARAMETERS
*	MSP_PARALLEL : parallel mode
*	MSP_SERIAL : serial mode
*
* RETURNS
*  MSP_STATUS
*
* GLOBALS AFFECTED
*	gMSP
*
*************************************************************************/
static MSP_STATUS MSP_Switch_Interface(msp_mode_enum srac)
{
	// clear SRAC 0: parallel, 1: serial to enable parallel interface 	
	MSP_STATUS status;
	kal_uint8 retry = 0;

	if((status = MSP_TPC_SetRWAdrs(MSP_SYS_REG,1,MSP_SYS_REG,1)) != MSP_NOERROR)
		return status;
	while(retry++ < 5)
	{
		status = MSP_TPC_WriteReg((kal_uint32*)&srac,1);
		if(status == MSP_NOERROR)
		{
			if(srac == MSP_PARALLEL)
			{
				MSDC_SetClock(26000);
				gMSP.mode = MSP_PARALLEL;
				MSDC_SET_BIT32(MSC_CFG,MSC_CFG_PMODE);
			}
			else
			{
				MSDC_SetClock(13000);
				MSDC_CLR_BIT32(MSC_CFG,MSC_CFG_PMODE);
				gMSP.mode = MSP_SERIAL;
			}
			if(kal_query_systemInit()==KAL_TRUE)
				GPTI_BusyWait(8);
			else
				kal_sleep_task(2);					
			
			return MSP_NOERROR;			
		}
	}
	if(retry >= 5)
		return MSP_ERR_SWITCH_MODE;	
	
	
	return MSP_ERR_SWITCH_MODE;
}
/*************************************************************************
* FUNCTION
*  MSP_Initialize
*
* DESCRIPTION
*	Initialize the driver and MSDC controller for MS-PRO
*
* PARAMETERS
*	
*
* RETURNS
*  MSP_STATUS
*
* GLOBALS AFFECTED
*	gMSP
*
*************************************************************************/
MSP_STATUS MSP_Initialize(void)
{
	kal_uint8 buffer[8];
	MSP_STATUS status;
	
	#ifdef MSDC_USE_INT
	// reset the events
	kal_set_eg_events(MSDC_Events, 0, KAL_AND);
	#endif
			
	// reset msdc
	if(*(volatile kal_uint32*)MSDC_CFG & MSDC_CFG_RST)
	{
		MSDC_CLR_BIT32(MSDC_CFG, MSDC_CFG_RST);
	}
	else
	{
		RESET_MSDC();
	}
			
	// pull down for MS and MS-PRO
	BitFieldWrite32((kal_uint32*)MSDC_CFG,(kal_uint32)1,MSDC_CFG_PRCFG1);
	BitFieldWrite32((kal_uint32*)MSDC_CFG,(kal_uint32)1,MSDC_CFG_PRCFG2);
	SET_FIFO_THRESHOLD(1);
	if(kal_query_systemInit()==KAL_TRUE)
		GPTI_BusyWait(8);
	else
		kal_sleep_task(2);

	// tuning the signal
	//MSDC_SET_BIT32(MSDC_CFG,MSDC_CFG_CRED);
	//MSDC_SET_BIT32(MSDC_CFG,MSDC_CFG_RED);
	//MSDC_SET_BIT32(MSC_CFG,MSC_CFG_PRED);	
	// tuning the driving capability
	// MSDC_WriteReg32(MSDC_IOCON,0xC0);	
	
	//set clock of serial clcok
	gMSDC_Handle.msdc_clock = MSDC_CLOCK;;
	MSDC_SetClock(13000);
	// set ready time out value
	BitFieldWrite32((kal_uint32*)MSC_CFG,(kal_uint32)7,MSC_CFG_BUSYCNT);	
	// enable the serial interface
	MSDC_SET_BIT32(MSC_CFG,MSC_CFG_SIEN);

   detect_parallel_mode();
   
	// read status registers
	// ms pro has default value 0h,8h,10h,10h
	if((status = MSP_TPC_SetRWAdrs(0,8,MSP_SYS_REG,1)) != MSP_NOERROR)
		return status;	
	if ((status = MSP_TPC_ReadReg((kal_uint32*)buffer,8)) != MSP_NOERROR)
		return status;

	// media identification procedure
	// type:1, Category:0, Class:0 for mspro
	gMSP.mType = buffer[MSP_TYPE_REG];
	gMSP.mCategory = buffer[MSP_CATEGORY_REG];
	gMSP.mClass = buffer[MSP_CLASS_REG];
	if(gMSP.mType != TYPE_MSPRO_CARD || gMSP.mCategory != 0 )
		return MSP_ERR_NOT_MSP;
	 if(gMSP.mClass > 0 || gMSP.mClass < 4)
	 	gMSP.is_wp = KAL_TRUE;
	 else if(gMSP.mClass != 0)
	 	return MSP_ERR_NOT_MSP;
	
	// check write protect status
	gMSP.is_wp = buffer[MSP_STA_REG] & STA_WP;
#if defined(MSP_USE_PARALLEL_MODE)
	if(!gMSP.is_failed)
	{
		if((status = MSP_Switch_Interface(MSP_PARALLEL))!= MSP_NOERROR)
			return status;
	}
	else
	{
		if((status = MSP_Switch_Interface(MSP_SERIAL))!= MSP_NOERROR)
			return status;
	}
#endif
	// Confirm CPU startup
	if(MSP_Confirm_CPU() != MSP_NOERROR)
		return MSP_ERR_INIT;	

	status = MSP_Confirm_Atrb();
	if(status == MSP_NOERROR)
		gMSDC_Handle.mIsInitialized = KAL_TRUE;

	#if 0// format the MS-PRO
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
	#endif
	return status;
}

/*************************************************************************
* FUNCTION
*  MSP_SendTPC
*
* DESCRIPTION
*	Send TPC to MS-PRO card 
*
* PARAMETERS
*	cmd: TPC commands
*	size: size of the data for this command
*
* RETURNS
*  none
*
* GLOBALS AFFECTED
*	none
*
*************************************************************************/
static void MSP_SendTPC(kal_uint8 cmd, kal_uint16 size)
{
	kal_uint16 arg = 0;

	ASSERT(!MSDC_IS_BUSY);
	arg = cmd << 12;
	arg |= size;
	MSDC_WriteReg16(MSC_CMD,arg);
}
/*************************************************************************
* FUNCTION
*  MSP_WaitCmdRdyOrTo
*
* DESCRIPTION
*	wait for TPC transaction complete(end of BS3 or timeout,crc occurs)
*
* PARAMETERS
*
* RETURNS
*  MSP_STATUS
*
* GLOBALS AFFECTED
*
*************************************************************************/
MSP_STATUS MSP_WaitCmdRdyOrTo(void)
{
	kal_uint16 msc_sta;

#ifdef MSDC_USE_INT	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -