📄 atasd.c
字号:
v_pSDMMCregs->rSDICMDSTA=0xffff;
v_pSDMMCregs->rSDIDATSTA=0xffff;
v_pSDMMCregs->rSDIPRE=PCLK/(2*INICLK)-1; /*400KHz*/
v_pSDMMCregs->rSDICON=(1<<1)|1; /*Type A,FIFO reset,clk enable*/
v_pSDMMCregs->rSDIBSIZE=0x200; /*512byte(128word)*/
v_pSDMMCregs->rSDIDTIMER=0xffff; /*Set timeout count*/
for(i=0;i<0x200;i++); /*Wait 74SDCLK for MMC card*/
CMD0();
printf("\nIn idle.\n");
/*Check MMC card OCR*/
if(Chk_MMC_OCR())
{
printf("\nIn MMC ready.\n");
gMMC=1;
goto RECMD2;
}
if(Chk_SD_OCR())
printf("\nIn SD ready.\n");
else
{
printf("\nInitialize fail\nNo Card assertion.\n");
return 0;
}
RECMD2:
/*Check attaced cards,it makes card identification state*/
v_pSDMMCregs->rSDICMDARG=0x0; /*CMD2(stuff bit)*/
v_pSDMMCregs->rSDICMDCON=(0x1<<10)|(0x1<<9)|(0x1<<8)|0x42; /*lng_resp,wait_resp,start,CMD2*/
/*Check end of CMD2*/
if(!Chk_CMDend(2,1))
{
goto RECMD2;
}
printf("\nEnd id.\n");
RECMD3:
/*Send RCA*/
v_pSDMMCregs->rSDICMDARG=gMMC<<16; /*CMD3(MMC:Set RCA,SD:Ask RCA-->SBZ)*/
v_pSDMMCregs->rSDICMDCON=(0x1<<9)|(0x1<<8)|0x43; /*sht_resp,wait_resp,start,CMD3*/
/*Check end of CMD3*/
if(!Chk_CMDend(3,1))
goto RECMD3;
/*Publish RCA*/
if(gMMC)
RCA=1;
else
RCA=(v_pSDMMCregs->rSDIRSP0&0xffff0000)>>16;
printf("\nRCA=0x%x\n",RCA);
SD_Size=Get_SD_Capacity();
/*State(stand-by) check*/
if(v_pSDMMCregs->rSDIRSP0&0x1e00!=0x600) /*CURRENT_STATE check*/
goto RECMD3;
printf("\nIn stand-by\n");
v_pSDMMCregs->rSDIPRE=PCLK/(2*NORCLK)-1; /*Normal clock=25MHz*/
Card_sel_desel(1); /*Select*/
if(!gMMC)
Set_4bit_bus();
else
Set_1bit_bus();
if(mmc_card_init())
{
g_bSDMMCIsExist=TRUE;
printf("sd/mmc_card_init OK.\n");
return SD_Size;
/*return 1;*/
}
else
{
g_bSDMMCIsExist=FALSE;
printf("sd/mmc_card_init ERROR.\n");
return 0;
}
}
/***************************************************************/
/*dosFs*/
/****************************************************************/
STATUS sdf_read_sector(SD_DEV *pSDDev,U32 secaddrno,U8 *buf)
{
U32 addr;
U32 rd_data;
int status,i;
int rd_cnt=0;
if(v_pSDMMCregs==NULL)
return ERROR;
if((pSDDev->startBlkNum+pSDDev->sd_blkOffset+secaddrno)>pSDDev->sd_blkdev.bd_nBlocks)
return ERROR;
addr=(pSDDev->startBlkNum+pSDDev->sd_blkOffset+secaddrno)*pSDDev->sd_blkdev.bd_bytesPerBlk;
v_pSDMMCregs->rSDICON|=v_pSDMMCregs->rSDICON|(1<<1);
v_pSDMMCregs->rSDIDATCON=(1<<19)|(1<<17)|(Wide<<16)|(2<<12)|(1<<0);
v_pSDMMCregs->rSDICMDARG=addr;
RERDCMD:
v_pSDMMCregs->rSDICMDCON=(0x1<<9)|(0x1<<8)|0x51;
if(!Chk_CMDend(17,1))
goto RERDCMD;
while(rd_cnt<(512/4))
{
if((v_pSDMMCregs->rSDIDATSTA&0x20)==0x20)
{
printf("\nRd_Block timeout:%d!\n",secaddrno);
v_pSDMMCregs->rSDIDATSTA=0x1<<0x5;
return 0;
}
status=v_pSDMMCregs->rSDIFSTA;
if((status&0x1000)==0x1000)
{
rd_data=rSDIDAT;
buf[rd_cnt*4] =rd_data>>0 &0xff;
buf[rd_cnt*4+1]=rd_data>>8 &0xff;
buf[rd_cnt*4+2]=rd_data>>16&0xff;
buf[rd_cnt*4+3]=rd_data>>24&0xff;
rd_cnt++;
}
}
if(!Chk_DATend())
printf("\ndat error\n");
v_pSDMMCregs->rSDIDATSTA=0x10;
return (OK);
}
STATUS sdf_multiread(SD_DEV *pSDDev,U32 startblock,U32 blocknum,U8 *buf)
{
int status,i;
semTake(pSDDev->sd_semMutex,WAIT_FOREVER);
while(blocknum>0)
{
status=sdf_read_sector(pSDDev,startblock,buf);
semGive(pSDDev->sd_semMutex);
if(status==ERROR) return ERROR;
/* printf("\nrdblocknum=0x%x,blocknum=0x%x",startblock,blocknum);*/
startblock++;
buf+=pSDDev->sd_blkdev.bd_bytesPerBlk;
blocknum--;
}
return status;
}
STATUS sdf_write_sector(SD_DEV *pSDDev,U32 secaddrno,U8 *buf)
{
int status;
int wt_cnt=0;
U32 addr;
U32 *wdata=(U32 *)buf;
if(v_pSDMMCregs==NULL)
return ERROR;
if((pSDDev->startBlkNum+pSDDev->sd_blkOffset+secaddrno)>pSDDev->sd_blkdev.bd_nBlocks)
return ERROR;
addr=(pSDDev->startBlkNum+pSDDev->sd_blkOffset+secaddrno)*pSDDev->sd_blkdev.bd_bytesPerBlk;
v_pSDMMCregs->rSDICON|=v_pSDMMCregs->rSDICON|(1<<1);
v_pSDMMCregs->rSDIDATCON=(1<<20)|(1<<17)|(Wide<<16)|(3<<12)|(1<<0);
v_pSDMMCregs->rSDICMDARG=addr;
REWTCMD:
v_pSDMMCregs->rSDICMDCON=(0x1<<9)|(0x1<<8)|0x58;
if(!Chk_CMDend(24,1))
goto REWTCMD;
while(wt_cnt<512/4)
{
status=v_pSDMMCregs->rSDIFSTA;
if((status&0x2000)==0x2000)
{
rSDIDAT=*wdata++;
/* printf("\ndata=0x%x,wcount=%d\n",*wdata,wt_cnt);*/
wt_cnt++;
}
}
if(!Chk_DATend())
printf("\ndat error\n");
v_pSDMMCregs->rSDIDATSTA=0x10;
return (OK);
}
STATUS sdf_multiwrite(SD_DEV *pSDDev,U32 startblock,U32 blocknum,U8 *buf)
{
int status;
/* printf("write now");*/
semTake(pSDDev->sd_semMutex,WAIT_FOREVER);
while(blocknum>0)
{
status=sdf_write_sector(pSDDev,startblock,buf);
semGive(pSDDev->sd_semMutex);
if(status==ERROR)return ERROR;
/* printf("\nwrblocknum=0x%x,blocknum=0x%x",startblock,blocknum);*/
startblock++;
buf+=pSDDev->sd_blkdev.bd_bytesPerBlk;
blocknum--;
}
return status;
}
LOCAL STATUS sdIoctl(SD_DEV psdDev,int function,int arg)
{
FAST int status;
switch (function)
{
case FIODISKFORMAT:
status=OK;
break;
default:
errnoSet(S_ioLib_UNKNOWN_REQUEST);
status=ERROR;
}
return (status);
}
LOCAL STATUS sd_Reset(void)
{
return (OK);
}
BLK_DEV *sdDevCreate(unsigned int startBlk,unsigned int bytesPerBlk,unsigned int blksPerTrack, unsigned int nBlocks,unsigned int blkOffset,unsigned int disk_size)
{
FAST SD_DEV *psdDev;
FAST BLK_DEV *pBlkDev;
if(bytesPerBlk==0)bytesPerBlk=MMC_SECTOR_SIZE;
if(nBlocks==0) nBlocks=disk_size;/*MMC_MAX_SECTOR;*/
if(blksPerTrack==0)blksPerTrack=nBlocks;
psdDev=(SD_DEV*)malloc(sizeof(SD_DEV));
if(psdDev==NULL)return(NULL);
psdDev->sd_semMutex=semBCreate(SEM_Q_PRIORITY,SEM_FULL);
pBlkDev=&psdDev->sd_blkdev;
pBlkDev->bd_nBlocks =nBlocks;
pBlkDev->bd_bytesPerBlk =bytesPerBlk;
pBlkDev->bd_blksPerTrack=blksPerTrack;
pBlkDev->bd_nHeads=1;
pBlkDev->bd_removable=FALSE;
pBlkDev->bd_retry=1;
pBlkDev->bd_mode=O_RDWR;
pBlkDev->bd_readyChanged=TRUE;
pBlkDev->bd_blkRd=sdf_multiread;
pBlkDev->bd_blkWrt=sdf_multiwrite;
pBlkDev->bd_ioctl=sdIoctl;
pBlkDev->bd_reset=sd_Reset;
pBlkDev->bd_statusChk=NULL;
psdDev->startBlkNum=startBlk;
psdDev->sd_blkOffset=blkOffset;
return (&psdDev->sd_blkdev);
}
STATUS usrPartDiskFsInit(BLK_DEV *blkDevID)
{
int dcacheSize=0x10000;
CBIO_DEV_ID cbio,cbio1;
if((cbio=dcacheDevCreate((CBIO_DEV_ID)blkDevID,NULL,dcacheSize,"/sd0"))==NULL)return ERROR;
if(usrFdiskPartCreate(cbio,1,0,0,0)==ERROR) return ERROR;
if((cbio1=dpartDevCreate(cbio,1,usrFdiskPartRead))==NULL)return ERROR;
if(dosFsDevCreate("/sd0a",dpartPartGet(cbio1,0),8,0)==ERROR)return ERROR;
/*if(dosFsVolFormat("/sd0a",2,0)==ERROR)return ERROR;can be done on PC*/
return OK;
}
UINT32 sdDev(void)
{
UINT32 num;
num=InitSDMMC();
return num;/*(OK);*/
}
void sdDosFs(void)
{
BLK_DEV *pDev;
unsigned int num;
num=sdDev();
/*printf("d_size=0x%x.\n",num);*/
pDev=sdDevCreate(0,0,0,0,0,num);
usrPartDiskFsInit(pDev);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -