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

📄 mmc_io.c

📁 MMC 0.4.0驱动 龙珠 MOTO板子
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * Copyright (C) 2002 Motorola Semiconductors HK Ltd * *//****************************************************************************** *  * Copyright (C) 2001, Motorola All Rights Reserved *  * File Name:   mmcsd.c *  * Date of Creations:   30  DEC,2001 * * Synopsis: * * Modification History: * 30 DEC, 2001 * *****************************************************************************//* Functions List:       * * * *//*  * Implementation of the MMCSD Driver. */#include <linux/config.h>#include "mmc_def.h"#include "mmc_main.h"static u32 cur_perclk2;//pd25void _mmcsd_socket1_irq_set(){#ifdef  CONFIG_ARCH_MX1ADS    	*(u32 *)DBMX1_GIUS_B |= 0x00020000;	*(u32 *)DBMX1_DDIR_B &= ~0x00020000;	*(u32 *)DBMX1_IMR_B |= 0x00020000;//enable	*(u32 *)DBMX1_ICR2_B |= 0x0000000C;//negative level trigger	*(u32 *)DBMX1_PUEN_B &= ~0x00020000;//pull up enable interrupt#endif#ifdef 	CONFIG_ARCH_MX2ADS	_reg_GPIO_IMR(GPIOD)  &= ~0x02000000;//disable	_reg_GPIO_GIUS(GPIOD) |= 0x02000000;	_reg_GPIO_DDIR(GPIOD) &= ~0x02000000;	_reg_GPIO_ICR2(GPIOD) |= 0x000c0000;//negative level trigger	_reg_GPIO_PUEN(GPIOD) &= ~0x02000000;  // pull up  enable interrupt	_reg_GPIO_ISR(GPIOD)  = 0x02000000;//enable	_reg_GPIO_IMR(GPIOD)  |= 0x02000000;//enable#endif}void _mmcsd_socket1_disable_irq(){#ifdef 	CONFIG_ARCH_MX2ADS	_reg_GPIO_IMR(GPIOD)  &= ~0x02000000;//enable#endif	}void _mmcsd_socket1_clear_irq(){  #ifdef 	CONFIG_ARCH_MX1ADS    	*(u32 *)DBMX1_ISR_B = 0x00020000;#endif#ifdef 	CONFIG_ARCH_MX2ADS	_reg_GPIO_ISR(GPIOD) = 0x02000000;#endif}/****************************************************************************** * Function Name: _MMCSD_CheckHardwareRevision  * * Input:        * 	 * Value Returned:  * * Description:  *      *Modification History: ******************************************************************************/u32	 _MMCSD_CheckHardwareRevision(int port){	u32 HardwareID;#ifdef CONFIG_ARCH_MX1ADS	HardwareID = mmcsdr_rev_no;	TRACE("rev_no = %x \n",mmcsdr_rev_no);	if(HardwareID!=0x0390)	{		TRACE("HardwareID = 0x%x, return = %d", HardwareID,1);		return 1;               //Hardware Revision Error;	}#endif#ifdef CONFIG_ARCH_MX2ADS	if(port == 0)	{		HardwareID = mmcsdr_rev_no;	}	else if(port == 1)	{		HardwareID = mmcsdr_rev_no_2;	}	if(HardwareID!=0x0400)	{		TRACE("HardwareID = 0x%x, return = %d", HardwareID,1);		return 1;               //Hardware Revision Error;	}#endif	return 0;}/****************************************************************************** * Function Name: _MMCSD_SoftReset  * * Input:        * 	 * Value Returned:  * * Description:  *      *Modification History: ******************************************************************************/u32	 _MMCSD_SoftReset(int port){	#ifdef CONFIG_ARCH_MX1ADS	// System Reset	Start_Stop_Clk(0x8,0);	// System Reset, MMC core enable & Stop CLk	Start_Stop_Clk(0xD,0);	// MMC Core enable & Stop Clk	Start_Stop_Clk(0x5,0);	Start_Stop_Clk(0x5,0);	Start_Stop_Clk(0x5,0);	Start_Stop_Clk(0x5,0);	Start_Stop_Clk(0x5,0);	Start_Stop_Clk(0x5,0);	Start_Stop_Clk(0x5,0);	Start_Stop_Clk(0x5,0);	#ifdef MMCSD_DMA_ENDIAN_ERR	// PLAM -- choose big endian FIFO mode	mmcsdr_str_stp_clk |= 0x00000020;	// end PLAM#else	mmcsdr_str_stp_clk &= ~0x00000020;#endif	//Set MMC Response Time-Out Register	mmcsdr_res_to=0xffff;  		//Set Block length register	mmcsdr_blk_len=MMCSD_MINIMUM_BLK_SIZE ;//2002/04/19		//Set MMC Number of Blocks Register	mmcsdr_nob=1;//2002/04/19#endif#ifdef CONFIG_ARCH_MX2ADS	// System Reset	Start_Stop_Clk(0x8,port);	// System Reset, MMC core enable & Stop CLk	Start_Stop_Clk(0x9,port);	// MMC Core enable & Stop Clk	Start_Stop_Clk(0x1,port);	Start_Stop_Clk(0x1,port);	Start_Stop_Clk(0x1,port);	Start_Stop_Clk(0x1,port);	Start_Stop_Clk(0x1,port);	Start_Stop_Clk(0x1,port);	Start_Stop_Clk(0x1,port);	Start_Stop_Clk(0x1,port);		if(port == 0)	{		mmcsdr_str_stp_clk &= ~0x00000020;	//Set MMC Response Time-Out Register		mmcsdr_res_to=0xffff;  		//Set Block length register		mmcsdr_blk_len=MMCSD_MINIMUM_BLK_SIZE ;		//Set MMC Number of Blocks Register		mmcsdr_nob=1;	}	else if(port == 1)	{		mmcsdr_str_stp_clk_2 &= ~0x00000020;	//Set MMC Response Time-Out Register		mmcsdr_res_to_2=0xffff;  		//Set Block length register		mmcsdr_blk_len_2=MMCSD_MINIMUM_BLK_SIZE ;		//Set MMC Number of Blocks Register		mmcsdr_nob_2=1;	}	#endif		return 0;	}void _MMCSD_ReadTimeOut(u32 arg,int port){	arg = 0x2db4;#ifdef CONFIG_ARCH_MX2ADS	if(port == 1)		mmcsdr_read_to_2=0x2db4;	else		mmcsdr_read_to=0x2db4;#endif#ifdef CONFIG_ARCH_MX1ADS	mmcsdr_read_to=0x2db4;#endif}/****************************************************************************** * Function Name: _MMCSD_SetCmd  * * Input:        * 	 * Value Returned:  * * Description:  *      *Modification History: ******************************************************************************/void _MMCSD_SetCmd(u8 cmd,u32 arg,u32 ctrl,int port){#ifdef MMCSD_CMD	TRACE("	----------------------------------------");	TRACE("	CMD%02d  Arg: 0x%08lX  Ctrl: 0x%04lX\n",cmd,arg,ctrl);#endif#ifdef CONFIG_ARCH_MX2ADS	if(port == 1)	{		mmcsdr_cmd_2=cmd;		mmcsdr_argumenth_2=arg>>16;		mmcsdr_argumentl_2=arg&0xFFFF;		mmcsdr_cmd_dat_cont_2=ctrl;	}	else	{		mmcsdr_cmd=cmd;		mmcsdr_argumenth=arg>>16;		mmcsdr_argumentl=arg&0xFFFF;		mmcsdr_cmd_dat_cont=ctrl;	}#endif#ifdef 	CONFIG_ARCH_MX1ADS	mmcsdr_cmd=cmd;	mmcsdr_argumenth=arg>>16;	mmcsdr_argumentl=arg&0xFFFF;	mmcsdr_cmd_dat_cont=ctrl;#endif}/****************************************************************************** * Function Name: _MMCSD_IsRun  * * Input:        * 	 * Value Returned:  * * Description:  *      *Modification History: ******************************************************************************/u32 _MMCSD_IsRun(int port){#ifdef CONFIG_ARCH_MX2ADS	if(port == 1)		return (mmcsdr_status_2)&0x100;	else		return (mmcsdr_status)&0x100;#endif#ifdef CONFIG_ARCH_MX1ADS	return (mmcsdr_status)&0x100;#endif}/****************************************************************************** * Function Name: _MMCSD_StartClk  * * Input:        * 	 * Value Returned:  * * Description:  *      *Modification History: ******************************************************************************/void _MMCSD_StartClk(int port){	unsigned short count = 0;	do	{		if (count++ == 0)		{			// do this every 256 loops#ifdef CONFIG_ARCH_MX2ADS			if(port == 1)				mmcsdr_str_stp_clk_2 |= 0x06;			else				mmcsdr_str_stp_clk |= 0x06;#endif#ifdef CONFIG_ARCH_MX1ADS			mmcsdr_str_stp_clk |= 0x06;#endif		}	}	while(!_MMCSD_IsRun(port));}/****************************************************************************** * Function Name: _MMCSD_StopClk  * * Input:        * 	 * Value Returned:  * * Description:  *      *Modification History: ******************************************************************************/void _MMCSD_StopClk(int port){	unsigned short count = 0;	do	{		if (count++ == 0)		{			// do this every 256 loops#ifdef CONFIG_ARCH_MX2ADS			if(port == 1)				mmcsdr_str_stp_clk_2 |= 0x05;			else				mmcsdr_str_stp_clk |= 0x05;			#endif#ifdef CONFIG_ARCH_MX1ADS			mmcsdr_str_stp_clk |= 0x05;#endif		}	}while(_MMCSD_IsRun(port));}/****************************************************************************** * Function Name: _MMCSD_GetResponses  * * Input:        * 	 * Value Returned:  * * Description:  *      *Modification History: ******************************************************************************/void _MMCSD_GetResponses(MMCSD_Responses *pRS, u8  rsType,int port){	int i;	u16 rs;    	u32 temp = 0;	if(rsType==MMCSDB_R1)	{			pRS->status=0;#ifdef CONFIG_ARCH_MX2ADS		if(port == 1)			temp=(u32)mmcsdr_res_fifo_2;		else			temp=(u32)mmcsdr_res_fifo;#endif#ifdef CONFIG_ARCH_MX1ADS		temp=(u32)mmcsdr_res_fifo;#endif			

⌨️ 快捷键说明

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