S3C6410裸機(jī)SD卡驅(qū)動(SDIO模式)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
花了幾天寫了SD卡裸機(jī)驅(qū)動,現(xiàn)在還不完善,只支持4G以內(nèi)的卡,以后再加上;現(xiàn)在經(jīng)過修改可以寫入數(shù)據(jù)了,親測沒問題.
S3C6410_SDIO.C
#include"s3c6410_system.h"
#include"s3c6410_sdio.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//配置
//塊大小寄存器(0通道)BLKSIZE0
#defineBLKSIZE0_BLKSIZE0x0200//塊大小為512字節(jié)
//傳輸模式寄存器(0通道)TRNMOD0
#defineTRNMOD0_CCSCON0//正常模式
#defineTRNMOD0_MUL1SIN0(0<<5)//默認(rèn)為單區(qū)段操作模式
#defineTRNMOD0_RD1WT0(1<<4)//默認(rèn)為讀操作模式
#defineTRNMOD0_ENACMD12(0<<2)//自動CMD12禁止,多區(qū)段操作完成后主機(jī)自動發(fā)出停止命令
#defineTRNMOD0_ENBLKCNT(0<<1)//塊計(jì)數(shù)器無效
#defineTRNMOD0_ENDMA(0<<0)//DMA無效
//主機(jī)控制寄存器(0通道)HOSTCTL0
#defineHOSTCTL0_WIDE8(0<<5)//這個(gè)為寬度被位1指定(數(shù)據(jù)傳輸寬度)
#defineHOSTCTL0_DMASEL(0<<3)//SDMA
#defineHOSTCTL0_OUTEDGEINV(0<<2)//時(shí)鐘上升沿沿?cái)?shù)據(jù)有效//這個(gè)寄存器有歧義,不知道到底是干啥用的
#defineHOSTCTL0_WIDE4(0<<4)//數(shù)據(jù)傳輸寬度。1BIT模式
//電源控制寄存器(0通道)PWRCON0
#definePWRCON0_SELPWRLVL(7<<1)//3.3V電源模式
#definePWRCON0_PWRON(1<<0)//電源打開
//容限寄存器(0通道)CAPAREG0
#defineCAPAREG0_V18(1<<26)//電壓支持1.8V
#defineCAPAREG0_V30(0<<25)//電壓不支持3v
#defineCAPAREG0_V33(1<<24)//電壓支持3.3V
#defineCAPAREG0_SUSRES(1<<23)//支持暫停/恢復(fù)操作
#defineCAPAREG0_DMA(1<<22)//支持DMA
#defineCAPAREG0_HSPD(1<<21)//支持高速模式
#defineCAPAREG0_ADMA2(0<<19)//不支持DMA2
#defineCAPAREG0_MAXBLKLEN(0<<16)//最大塊大小為512B
#defineCAPAREG0_BASECLK(25<<8)//SD基礎(chǔ)始終25MHz
#defineCAPAREG0_TOUTUNIT(0<<7)//超時(shí)時(shí)鐘單位KHZ
#defineCAPAREG0_TOUTCLK(10<<0)//超時(shí)時(shí)鐘頻率為10KHZ
//最大電流容限寄存器(0通道)MAXCURR0
#defineMAXCURR0_MAXCURR18(10<<16)//對于1.8V,最大電流為40MA
#defineMAXCURR0_MAXCURR30(10<<8)//對于3.0V,最大電流為40MA
#defineMAXCURR0_MAXCURR33(10<<0)//對于3.3V,最大電流為40MA
//控制寄存器2CONTROL2_0
#defineCONTROL2_0_ENSTAASYNCCLR(0<<31)//該位可以使正常和錯(cuò)誤中斷的異步明確啟用狀態(tài)位
#defineCONTROL2_0_ENCMDCNFMSK(0<<30)//不屏蔽指令沖突
#defineCONTROL2_0_CDINVRXD3(0<<29)//卡檢測信號倒置對于RX_DAT[3]。禁止
#defineCONTROL2_0_SELCARDOUT(0<<28)//卡移除條件是“無卡插入”狀態(tài)。
#defineCONTROL2_0_FLTCLKSEL(8<<24)//濾波器時(shí)鐘(iFLTCLK)選擇。
#defineCONTROL2_0_ENFBCLKTX(0<<15)//反饋時(shí)鐘禁止,對于發(fā)送數(shù)據(jù)時(shí)鐘
#defineCONTROL2_0_ENFBCLKRX(0<<14)//反饋時(shí)鐘禁止,對于接收數(shù)據(jù)時(shí)鐘
#defineCONTROL2_0_SDCDSEL(0<<13)//nSDCD用于SD卡檢測信號
#defineCONTROL2_0_SDSIGPC(0<<12)//同步控制輸出有效信號
#defineCONTROL2_0_ENBUSYCHKTXSTART(0<<11)//發(fā)送數(shù)據(jù)啟動狀態(tài)前忙碌狀態(tài)檢測。
#defineCONTROL2_0_DFCNT(0<<9)//反跳濾波器計(jì)數(shù)16iSDCLK
#defineCONTROL2_0_ENCLKOUTHOLD(1<<8)//SDCLK操作有效。
#defineCONTROL2_0_RWAITMODE(0<<7)//主機(jī)控制器釋放讀等待狀態(tài)(自動)
#defineCONTROL2_0_DISBUFRD(0<<6)//正常模式,用0x20寄存器使用者可以讀緩沖區(qū)(FIFO)數(shù)據(jù)
//HCLK=128MHZEPLL=24MHZ
#defineCONTROL2_0_SELBASECLK(2<<4)//基礎(chǔ)時(shí)鐘源選擇。00或01=HCLK,10=EPLL輸出時(shí)鐘(來自系統(tǒng))11=外部時(shí)鐘源(XTI或XEXTCLk)
#defineCONTROL2_0_PWRSYNC(0<<3)//不同步,控制輸入有效信號(指令,數(shù)據(jù))
#defineCONTROL2_0_ENCLKOUTMSKCON(0<<1)//當(dāng)卡插入被清除時(shí),SDCLK輸出時(shí)鐘屏蔽。當(dāng)處于無卡狀態(tài)時(shí),設(shè)置該區(qū)域?yàn)楦呶粊硗V筍DCLK。
#defineCONTROL2_0_HWINITFIN(1<<0)//SD主機(jī)控制器硬件初始化完成。
//時(shí)鐘控制寄存器(0通道)CLKCON0
#defineCLKCON0_SELFREQ(0x80<<8)//SDCLK頻率最低
#defineCLKCON0_ENSDCLK(1<<2)//SD時(shí)鐘啟動。
#defineCLKCON0_ENINTCLK(1<<0)//中斷時(shí)鐘啟動。
//超時(shí)控制寄存器(0通道)TIMEOUTCON0
/*******************************************************************************
*FunctionName:SDIO_DeInit
* Description : Dein