📄 mspro.c
字号:
/*****************************************************************************
* 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(®int)) != MSP_NOERROR)
{
// time out => set parallel mode
MSDC_SET_BIT32(MSC_CFG,MSC_CFG_PMODE);
status = MSP_TPC_GetInt(®int);
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, §ors);
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 + -