?? sddriver.c
字號(hào):
ret = SD_JudgeResult(tmp); /* 響應(yīng)指示寫(xiě)失敗 response indicate write fail */ if (ret != SD_NO_ERR) return ret; } ret = SD_ReadCard_Status(sds->RCA, 4, tmp); if (ret != SD_NO_ERR) return ret; ret = SD_DeSelectCard(); /* CMD7, 退出傳輸狀態(tài) */ return ret; /* 返回寫(xiě)入結(jié)果 return the result of writing */ }/********************************************************************************************************************* 函數(shù)名稱(chēng): INT8U SD_GetCardInfo() Name: INT8U SD_GetCardInfo()** 功能描述: 獲得SD卡的信息 Function: get the information of SD card** 輸 入: sd_struct *sds: SD卡信息結(jié)構(gòu)體 Input: sd_struct *sds: the information structure of SD Card** 輸 出: 0: 成功 > 0: 錯(cuò)誤碼 Output: 0: sucessfully > 0: error code*******************************************************************************************************************/INT8U SD_GetCardInfo(sd_struct *sds){ INT32U tmp; INT8U time_u,time_v,fator; INT8U recbuf[16],ret; ret = SD_ReadCSD(sds->RCA, 16, recbuf); /* 讀CSD寄存器 read CSD register */ if (ret != SD_NO_ERR) return ret; /* 計(jì)算塊的最大長(zhǎng)度 calculate the size of a sector */ sds->block_len = 1 << (recbuf[READ_BL_LEN_POS] & READ_BL_LEN_MSK); /* (2 ^ READ_BL_LEN) */ /* 計(jì)算卡中塊的個(gè)數(shù) calculate the sector numbers of the SD Card */ sds->block_num = ((recbuf[C_SIZE_POS1] & C_SIZE_MSK1) << 10) + (recbuf[C_SIZE_POS2] << 2) + ((recbuf[C_SIZE_POS3] & C_SIZE_MSK3) >> 6) + 1; /* 計(jì)算(C_SIZE + 1)*/ tmp = ((recbuf[C_SIZE_MULT_POS1] & C_SIZE_MULT_MSK1) << 1) + ((recbuf[C_SIZE_MULT_POS2] & C_SIZE_MULT_MSK2) >> 7) + 2; /* 計(jì)算(C_SIZE_MULT + 2) */ sds->block_num = sds->block_num * (1 << tmp); /* 獲得卡中塊的數(shù)量: (C_SIZE + 1) * 2 ^ (C_SIZE_MULT + 2) */ /* get the block numbers in card: (C_SIZE + 1) * 2 ^ (C_SIZE_MULT + 2) */ /* 計(jì)算扇區(qū)大小 calculate the size of sector */ tmp = ((recbuf[SECTOR_SIZE_POS1] & SECTOR_SIZE_MSK1) << 1) + ((recbuf[SECTOR_SIZE_POS2] & SECTOR_SIZE_MSK2) >> 7) + 1; /* 計(jì)算(SECTOR_SIZE + 1)*/ sds->sector_size = tmp; /* 保存在sds中 save into sds */ return SD_NO_ERR; /* 返回執(zhí)行成功 return perform sucessfully */}/*********************************************************************************************************** Function name: Card_Indentify** Descriptions: identify card type: SD or MMC card** 判別卡的型號(hào):SD或MMC卡 ** Input: sd_struct *sds : SD/MMC卡信息結(jié)構(gòu)體 sd_struct *sds : the information structure of SD/MMC ** Output: CARDTYPE_SD -- SD card CARDTYPE_MMC -- MMC card ** Created by: MingYuan Zheng 鄭明遠(yuǎn) ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U Card_Indentify(void){ INT32U param = 0; INT8U response[6],ret; ret = SD_SendCommand(CMD55, param, CMD55_R, response); if (ret == SD_NO_ERR) return CARDTYPE_SD; else return CARDTYPE_MMC;} /*********************************************************************************************************** Function name: SD_ActiveCard** Descriptions: active card** 激活卡 ** Input: NULL** Output: 0: 成功 > 0: 錯(cuò)誤碼 0: sucessfully > 0: error code ** Created by: MingYuan Zheng 鄭明遠(yuǎn) ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/INT8U SD_ActiveCard(sd_struct *sds){ INT8U ret,resp[4]; INT32U count = 0; do { if (sds->card_type == CARDTYPE_SD) /* 讀OCR寄存器 read OCR register */ ret = SD_ReadOCR(4, resp); else ret = MMC_ReadOCR(4, resp); if (ret != SD_NO_ERR) return ret; if (count >= SD_IDLE_WAIT_MAX) return SD_ERR_TIMEOUT_WAITIDLE; /* 超時(shí),返回錯(cuò)誤碼 timeout,return error code */ count ++; }while ((resp[3] & MSK_READY) == 0x00); if ((resp[2] & MSK_OCR_33) != MSK_OCR_33) return SD_ERR_VOL_NOTSUSP; /* 卡不支3.3V電壓 card don't support 3.3V voltage */ return SD_NO_ERR;}/*********************************************************************************************************** Function name: sdmmc_interrupt** Descriptions: SD/MMC card interrupt handler ** SD/MMC 卡中斷處理程序 ** Input: input parameter of linux interrupt handler** Output: NULL ** Created by: MingYuan Zheng 鄭明遠(yuǎn) ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/#if SD_INTERRUPT_ENvoid sdmmc_interrupt(int irq, void *dev_id, struct pt_regs *regs){ INT32U stat; INT32U cnt; INT32U tmp; if (reading == 1) { stat = SDIFSTA; /* 讀FIFO狀態(tài)寄存器 */ /* FIFO 中的數(shù)據(jù)不足64個(gè)字節(jié) */ if (stat & SDIFSTA_RX_LAST) { /* 最后數(shù)據(jù)就緒 */ cnt = (stat & SDIFSTA_CNT) / sizeof(INT32U); /* 取得FIFO中的“字”數(shù) */ while (cnt) { tmp = SDIDAT; /* 從FIFO中讀出數(shù)據(jù) */ buffer[bufcnt] = (INT8U)(tmp); buffer[bufcnt + 1] = (INT8U)(tmp >> 8); buffer[bufcnt + 2] = (INT8U)(tmp >> 16); buffer[bufcnt + 3] = (INT8U)(tmp >> 24); bufcnt += sizeof(INT32U); cnt--; } /* Rx FIFO為滿,那么讀64個(gè)字節(jié) */ } else if (stat & SDIFSTA_RX_FULL) { cnt = SDI_MAX_RX_FIFO / sizeof(INT32U); while (cnt && bufcnt < datalen) { tmp = SDIDAT; /* 從FIFO中讀出數(shù)據(jù) */ buffer[bufcnt] = (INT8U)(tmp); buffer[bufcnt + 1] = (INT8U)(tmp >> 8); buffer[bufcnt + 2] = (INT8U)(tmp >> 16); buffer[bufcnt + 3] = (INT8U)(tmp >> 24); bufcnt += sizeof(INT32U); cnt--; } } stat = SDIDSTA; if (stat & SDIDSTA_DFIN) { /* 數(shù)據(jù)傳輸完成 */ SDIDSTA = stat; error = SD_NO_ERR; wake_up_interruptible(&wq); } else if (stat & SDIDSTA_TOUT) { /* 數(shù)據(jù)/忙接收超時(shí) */ SDIDSTA = stat; error = SD_ERR_TIMEOUT_READ; wake_up_interruptible(&wq); } } /* 下面為寫(xiě)狀態(tài) */ else { stat = SDIFSTA; if (stat & SDIFSTA_TX_EMP) { /* TX FIFO 為空 */ cnt = SDI_MAX_TX_FIFO / sizeof(INT32U); while (cnt && bufcnt < datalen) { /* 往FIFO里寫(xiě)入數(shù)據(jù) */ SDIDAT = (buffer[bufcnt + 3] << 24) + (buffer[bufcnt + 2] << 16) + (buffer[bufcnt + 1] << 8) + buffer[bufcnt]; bufcnt += sizeof(INT32U); cnt--; } } stat = SDIDSTA; if (stat & SDIDSTA_DFIN) { /* 數(shù)據(jù)傳輸完成,使能等待任務(wù) */ SDIDSTA = stat; error = SD_NO_ERR; wake_up_interruptible(&wq); } else if (stat & SDIDSTA_TOUT) { /* 數(shù)據(jù)傳輸超時(shí) */ SDIDSTA = stat; error = SD_ERR_TIMEOUT_WRITE; wake_up_interruptible(&wq); } } /* clear the interrupt of mcu */ SRCPND = 1 << 21; /* 清除相關(guān)中斷標(biāo)志 */ INTPND = 1 << 21; }#endif/*********************************************************************************************************** Function name: card_detect_interrupt** Descriptions: the interrupt handler of card insert detect** 卡插入檢測(cè)中斷處理函數(shù) ** Input: input parameter of linux interrupt handler** Output: NULL ** Created by: MingYuan Zheng 鄭明遠(yuǎn) ** Created Date: 2006-01-09 **-------------------------------------------------------------------------------------------------------** Modified by:** Modified Date: **------------------------------------------------------------------------------------------------------********************************************************************************************************/void card_detect_interrupt(int irq, void *dev_id, struct pt_regs *regs){ int bempty;#ifdef SD_CD_LEVEL_LOW /* 如果是低電平表示插入 */ bempty = read_gpio_bit(SD_GPIO_CD);#else bempty = !read_gpio_bit(SD_GPIO_CD);#endif if ((!card_insert) && (!bempty)) { /* card inserted 卡插入 */ card_insert = 1; card_change = 1; printk("SD/MMC card insert!\n"); } else if (card_insert && bempty) { /* card ejected 卡拔出 */ card_insert = 0; card_change = 1;#if SD_INTERRUPT_EN error = SD_ERR_NO_CARD; /* no card error code */ wake_up_interruptible(&wq);#endif printk("SD/MMC card ejected!\n"); } }/*********************************************************************************************************** End Of File**********************************************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -