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

📄 mmcprotoal.c

📁 最近在國外網站抓到的作業系統 以Arm為基礎去開發的
💻 C
字号:
/*
 * Header for MultiMediaCard (MMC)
 *
 * Copyright (c) 2004 ASIC of SOUTHEAST UNIVERSITY
 *
 * Many thanks to PESIA!
 *
 * Based strongly on code by:
 *
 * Author: Yong-iL Joh <tolkien@mizi.com>
 *
 * Date  : $Date: 2004/12/22 10:02:10 $ 
 *
 * Versation : 1.0 $
 *          
 */
#include "mmcprotocal.h"
#include "mmccore.h"


static int rca =0x10000;
unsigned long gptcount1 = 0;
unsigned long gptcount2 = 0;
int mmcioretval;
extern g_busy;
#define MMCINIT 0x1FFF0000

#define PARSE_U32(_buf,_index)  (((U32)_buf[_index]) << 24) |\
    						    (((U32)_buf[_index+1]) << 16) |\
								(((U32)_buf[_index+2]) << 8) | ((U32)_buf[_index+3])

#define PARSE_U16(_buf,_index)	(((U16)_buf[_index]) << 8) | ((U16)_buf[_index+1]) 


int send_cmd_wait_idle(U32 cmd,U32 arg,U32 com_dat_cont,U32 int_mask )
{
      int i;

	*(RP)MMCC_STR_STP_CLK=0X5;        //stop the  card clock
	*(RP)MMCC_CLK_RATE=0X7;
	*(RP)MMCC_STR_STP_CLK=0XE;            //begin the clock

	*(RP)MMCC_ARG=arg;  	 	  	
	*(RP)MMCC_CMD_DAT_CONT= com_dat_cont;  
	*(RP)MMCC_CMD=cmd;        
	*(RP)MMCC_INT_MASK=int_mask;
	for(i=0;i<1000;i++)
	;     
	return 0;  
} 

int send_cmd_wait_ocr(U32 cmd,U32 arg,U32 com_dat_cont,U32 int_mask)
{            
	U32 i;

	*(RP)MMCC_ARG = arg;  
	*(RP)MMCC_CMD_DAT_CONT = com_dat_cont;  	
	//*(RP)MMCC_RES_TO = 0XFF;              // if  not config ,use default value 
	//*(RP)MMCC_READ_TO =0XFFFF;                   
	*(RP)MMCC_CMD = cmd;
	*(RP)MMCC_INT_MASK = int_mask;
	for(i =0; i < 10000; i++)
	;    
	return E_OK;
}
int send_cmd_wait_resp(U32 cmd,U32 arg,U32 com_dat_cont,U32 blk_len,U32 nob,U32 int_mask)
{            
       U32 i;
       U32 status;
	*(RP)MMCC_ARG=arg;  
	*(RP)MMCC_BLK_LEN = blk_len;
  	*(RP)MMCC_NOB = nob;
	*(RP)MMCC_CMD_DAT_CONT= com_dat_cont;  	
	//*(RP)MMCC_RES_TO =0XFF;              // if  not config ,use default value 
	//*(RP)MMCC_READ_TO=0XFFFF;                   
	*(RP)MMCC_CMD=cmd;  
	*(RP)MMCC_DAT_COUNT = (nob*blk_len);  
	*(RP)MMCC_INT_MASK=int_mask;

	for(i =0; i < 100000; i++);	
	do{
		status = *(RP)MMCC_STATUS;
		if(status & 0x00000800)
			break;
		}
	while(1);	       	             
	return E_OK;
}

int send_cmd_wait_stat(U32 cmd,U32 arg,U32 com_dat_cont,U32 blk_len,U32 nob,U32 int_mask)
{            
       U32 i;
       U32 status;
	U32 COUNT =0;
	   
	*(RP)MMCC_ARG=arg;  
	*(RP)MMCC_BLK_LEN = blk_len;
  	*(RP)MMCC_NOB = nob;
	*(RP)MMCC_CMD_DAT_CONT= com_dat_cont;  	
	//*(RP)MMCC_RES_TO =0XFF;              // if  not config ,use default value 
	//*(RP)MMCC_READ_TO=0XFFFF;                   
	*(RP)MMCC_CMD=cmd;  
	*(RP)MMCC_DAT_COUNT = (nob*blk_len);  
	*(RP)MMCC_INT_MASK=int_mask;

	
	do{
	    for(i =0; i < 10; i++);	
		COUNT++;
		status = *(RP)MMCC_STATUS;
		if(status & 0x00000800)
			break;
		}
	while(1);	  
	//printf("COUNT=:%d\n",COUNT);
	return E_OK;
}
        
int check_ocr_reg( )
{
	U32  retval;

	do{
		retval = send_cmd_wait_ocr(MMC_SEND_OP_COND,0X80ff8000,0X85,0XF);
	}while( ( retval !=E_OK )||(  *(RP)MMCC_RESPONSE3<0X80008000) );
	return 0;

}

int card_registry()
{              
                
    send_cmd_wait_resp(MMC_ALL_SEND_CID,0X0,0X87,0x0,0x0,0XF);
          
    send_cmd_wait_resp(MMC_SET_RELATIVE_ADDR,rca,0X85,0x0,0x0,0XF);
           
    send_cmd_wait_resp(MMC_SELECT_CARD,0X10000,0X85,0x0,0x0,0XF);
     
    return 0;
}



void  mmc_cim_init_stack( void)
{
	int retval;
	send_cmd_wait_idle(MMC_GO_IDLE_STATE,0x0,0x81,0xF);
	check_ocr_reg( );
	card_registry( );
	g_busy = 0;

		
}



void gpt_count(void)
{
	U32 control; 
	#define write_reg(reg, data) \
	*(RP)reg = data

    #define read_reg(reg) \
	*(RP)reg 
	
	#define 	s1 		0xffffff00//0x186a0          
	
	write_reg(GPT1_COMP,s1);
	init_gpt1();


}
int init_gpt1(void)
{	
    U32 control; 
	//control = GPT_EN|GPT_NOM|GPT_IEN;
	control = GPT_EN|GPT_FRU;
	write_reg(GPT1_CNTL,control);
	return	E_OK;
	
}

gpt_begin_count()
{
        gptcount1 = 0;
		printf("count begin:%x\n",gptcount1);
		gpt_count();
}

gpt_end_count()
{
	U32 control;
	U32 gptcount3;
	gptcount2 = 0;
	gptcount2 = *(volatile unsigned int *)GPT1_CNT;
	gptcount3 = gptcount2;
	control = 0;
	write_reg(GPT1_CNTL,control);
	printf("count end:%x\n",gptcount3);

}


⌨️ 快捷键说明

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