📄 mmcprotoal.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 + -