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

📄 atasd.c

📁 vxworks下SD卡及DOS文件系统驱动
💻 C
📖 第 1 页 / 共 2 页
字号:

    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 + -