📄 mmc_io.c
字号:
/* * 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 + -