亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mmc.c

?? 這個是我調通的在2410下運行文件系統的程序. 用2410驅動sd卡來實現fat文件系統. 歡迎大家來測試. 用法很簡單, 如下 FILE *fp // 文件指針
?? C
?? 第 1 頁 / 共 2 頁
字號:
//////////////////////////////////////////////////////
//  2410 for MMC & SD
// 
//
//
//  ldqmoon
//  2008-6-10
//

#include "def.h"
#include "2410lib.h"
#include "file_sys_cfg.h"
#include "2410addr.h"

#include "mmc.h"

#define INICLK	400000   //400000
#define NORCLK	5000000  //5000000

#define POL	0
#define INT	1
#define DMA	2

int Wide=0; // 0:1bit, 1:4bit
int MMC=0;  // 0:SD  , 1:MMC

int  Maker_ID;
char Product_Name[7]; 
int  Serial_Num;

volatile int RCA;
volatile unsigned int rd_cnt;
volatile unsigned int wt_cnt;
//#define SD_INFO


#ifdef _ALL_SD_CMDS_
uHILO32 OCR_REG;
#endif
uchar _FF_buff[512];
#ifndef _BytsPerSec_512_
uHILO16 BPB_BytsPerSec;
#endif
uchar BPB_SecPerClus;
uHILO16 BPB_RsvdSecCnt;
uHILO16 BPB_RootEntCnt;
uHILO16 BPB_FATSz16;
uchar BPB_FATType;
uHILO32 BS_VolSerial;
uchar BS_VolLab[12];
uint _FF_PART_ADDR;
U32  _FF_ROOT_ADDR;
#ifdef _DIRECTORIES_SUPPORTED_
ulong _FF_DIR_ADDR;
#endif
uint _FF_FAT1_ADDR;
U32 _FF_FAT2_ADDR;
uint FirstDataSector;
uchar _FF_error;
ulong _FF_buff_addr;
uint clus_0_addr, _FF_n_temp;
uint c_counter;
U8 _FF_FULL_PATH[_FF_PATH_LENGTH];

U32 DataClusTot;



// 準備系統fat
uchar initialize_media(void)
{
	//uchar data_temp;
	uchar n;
	ulong _FF_RootDirSectors;
	uHILO16 PT_SecStart;
	uchar BPB_NumFATs;
	uHILO32 BPB_TotSec;


  #ifndef _BytsPerSec_512_
	BPB_BytsPerSec.ival = 512;	// Initialize sector size to 512 (all SD cards have a 512 sector size)
  #endif
    _FF_n_temp = 0;

         
    if(!Mmc_Init())
    {
        return 0;
    }
    

	if (_FF_read(0x0, _FF_buff)==0)
	{
	  #ifdef _DEBUG_ON_
		printf(_FF_RErr_str);
	  #endif
		//_FF_error = INIT_ERR;
		return (0);
	}

	if (!((_FF_buff[510]==0x55)&&(_FF_buff[511]==0xAA)))
	{
	  #ifdef _DEBUG_ON_
		printf(_FF_InvParTbl_str);
	  #endif
		//_FF_error = INV_PARTTABLE_ERR;
		Uart_Printf("INV_PARTTABLE_ERR; wrong\n");
		return (0);
	}
	if (((_FF_buff[0]==0xEB)&&(_FF_buff[2]==0x90))||(_FF_buff[0]==0xE9))
		PT_SecStart.ival = 0;
	else if (_FF_buff[0x1BF])
	{
		PT_SecStart.cval.HI = _FF_buff[0x1C7];
		PT_SecStart.cval.LO = _FF_buff[0x1C6];
	}
	else if (_FF_buff[0x1CF])
	{
		PT_SecStart.cval.HI = _FF_buff[0x1D7];
		PT_SecStart.cval.LO = _FF_buff[0x1D6];
	}
	else if (_FF_buff[0x1DF])
	{
		PT_SecStart.cval.HI = _FF_buff[0x1E7];
		PT_SecStart.cval.LO = _FF_buff[0x1E6];
	}
	else if (_FF_buff[0x1EF])
	{
		PT_SecStart.cval.HI = _FF_buff[0x1F7];
		PT_SecStart.cval.LO = _FF_buff[0x1F6];
	}
	else
	{
	  #ifdef _DEBUG_ON_
		printf(_FF_InvParTbl_str);
	  #endif
		//_FF_error = INV_PARTENTRY_ERR;
		Uart_Printf("INV_PARTTABLE_ERR; wrong 2\n");
		return (0);
	}

 	_FF_PART_ADDR = (ulong) PT_SecStart.ival;
	if (PT_SecStart.ival)
	{
		if (_FF_read(_FF_PART_ADDR, _FF_buff)==0)
		{
		  #ifdef _DEBUG_ON_
			printf(_FF_RErr_str);
		  #endif
			//_FF_error = INIT_ERR;
			Uart_Printf("INIT_ERR wrong   22 \n");
			return (0);
		}
	}

  #ifdef _DEBUG_ON_
	printf(_FF_BSec_str, _FF_buff[0],_FF_buff[1],_FF_buff[2],_FF_buff[510],_FF_buff[511]);
  #endif

    // Get the number of Bytes per Sector (should be 512)
  #ifdef _BytsPerSec_512_
	if((_FF_buff[0xC] != 0x2) || (_FF_buff[0xB]))
		return (0);
  #else
	BPB_BytsPerSec.cval.LO = _FF_buff[0xB];
	BPB_BytsPerSec.cval.HI = _FF_buff[0xC];
  #endif
    // Get the number of Sectors per Cluster
    BPB_SecPerClus = _FF_buff[0xD];
    // Get the number of Reserved Sectors
	BPB_RsvdSecCnt.cval.LO = _FF_buff[0xE];
    BPB_RsvdSecCnt.cval.HI = _FF_buff[0xF];
    // Get the number of FATs (should be 2)
	BPB_NumFATs = _FF_buff[0x10];
	// Get the number of Root Directory entries (should be 512)
	BPB_RootEntCnt.cval.LO = _FF_buff[0x11];
	BPB_RootEntCnt.cval.HI = _FF_buff[0x12];
	// Get the FATSz16 value
	BPB_FATSz16.cval.LO = _FF_buff[0x16];
	BPB_FATSz16.cval.HI = _FF_buff[0x17];
	// Get the number of Total Sectors available
	BPB_TotSec.ival.HI = 0;
	BPB_TotSec.cval.LO = _FF_buff[0x13];
	BPB_TotSec.cval.ML = _FF_buff[0x14];
	if (BPB_TotSec.lval==0)
	{	// If the read value is 0, stored in a different location, read from other location
		BPB_TotSec.cval.LO = _FF_buff[0x20];
		BPB_TotSec.cval.ML = _FF_buff[0x21];
		BPB_TotSec.cval.MH = _FF_buff[0x22];
		BPB_TotSec.cval.HI = _FF_buff[0x23];
	}
	// Get the volume's Serial number
	BS_VolSerial.cval.LO = _FF_buff[0x27];
	BS_VolSerial.cval.ML = _FF_buff[0x28];
	BS_VolSerial.cval.MH = _FF_buff[0x29];
	BS_VolSerial.cval.HI = _FF_buff[0x2A];
	// Store the Volume's label
	for (n=0; n<11; n++)
		BS_VolLab[n] = _FF_buff[0x2B+n];
	BS_VolLab[11] = 0;		// Terminate the string
	// Calculate the Primary FAT table's Address
	_FF_FAT1_ADDR = _FF_PART_ADDR + BPB_RsvdSecCnt.ival;
	// Calculate the Secondary FAT table's Address
	_FF_FAT2_ADDR = _FF_FAT1_ADDR + BPB_FATSz16.ival;
	// Calculate the Address of the Root Directory
	_FF_ROOT_ADDR = ((ulong) BPB_NumFATs * (ulong) BPB_FATSz16.ival) + (ulong) BPB_RsvdSecCnt.ival;
	_FF_ROOT_ADDR += _FF_PART_ADDR;

	// Calculate the number of Total data Clusters
  #ifdef _BytsPerSec_512_
	_FF_RootDirSectors = (((ulong) BPB_RootEntCnt.ival << 5) + 511) >> 9;
  #else
	_FF_RootDirSectors = (((ulong) BPB_RootEntCnt.ival << 5) + BPB_BytsPerSec.ival - 1) / BPB_BytsPerSec.ival;
  #endif
	FirstDataSector = (BPB_NumFATs * BPB_FATSz16.ival) + BPB_RsvdSecCnt.ival + _FF_RootDirSectors;
	DataClusTot = (BPB_TotSec.lval - FirstDataSector) / BPB_SecPerClus;
	clus_0_addr = 0;		// Reset Empty Cluster table location
	c_counter = 1;
	_FF_buff_addr = 0;
#ifdef SD_INFO	
Uart_Printf("DataClusTot=%d\n", DataClusTot);
#endif
	if (DataClusTot < 4085)				// FAT12
		BPB_FATType = 0x32;
	else if (DataClusTot < 65525)		// FAT16
		BPB_FATType = 0x36;
	else
	{
		BPB_FATType = 0;
		//_FF_error = FAT_ERR;
		Uart_Printf("FAT_ERR wrong\n");
		return (0);
	}
  #ifdef _DIRECTORIES_SUPPORTED_
	_FF_DIR_ADDR = _FF_ROOT_ADDR;		// Set current directory to root address
  #endif
	_FF_FULL_PATH[0] = 0x5C;	// a '\'
	_FF_FULL_PATH[1] = 0;

  #ifdef _DEBUG_ON_
   #ifdef _BytsPerSec_512_
	printf(_FF_BS_PA_str, (_FF_PART_ADDR<<9));
	printf(_FF_BPB_BPS_str, 0x200);
   #else
	printf(_FF_BS_PA_str, (_FF_PART_ADDR*BPB_BytsPerSec.ival));
	printf(_FF_BPB_BPS_str, BPB_BytsPerSec.ival);
   #endif
	printf(_FF_BPB_SPC_str, BPB_SecPerClus);
	printf(_FF_BPB_RSC_str, BPB_RsvdSecCnt.ival);
	printf(_FF_BPB_NFAT_str, BPB_NumFATs);
	printf(_FF_BPB_REC_str, BPB_RootEntCnt.ival);
	printf(_FF_BPB_Fz16_str, BPB_FATSz16.ival);
	printf(_FF_BPB_TS16_str, BPB_TotSec.lval);
	printf(_FF_BPB_FT_str);
  #endif
	if ((BPB_FATType != 0x32) && (BPB_FATType != 0x36))
	{
  #ifdef _DEBUG_ON_
		printf(_FF_ERR_str);
  #endif
		return(0);
	}
  #ifdef _DEBUG_ON_
	else
		printf(_FF_1C_str, BPB_FATType);
	printf(_FF_CCnt_str, DataClusTot);
   #ifdef _BytsPerSec_512_
	printf(_FF_RAddr_str, _FF_ROOT_ADDR<<9);
	printf(_FF_F2Addr_str, _FF_FAT2_ADDR<<9);
   #else
	printf(_FF_RAddr_str, _FF_ROOT_ADDR*BPB_BytsPerSec.ival);
	printf(_FF_F2Addr_str, _FF_FAT2_ADDR*BPB_BytsPerSec.ival);
   #endif
	printf(_FF_RDSec_str, _FF_RootDirSectors);
	printf(_FF_FDSec_str, FirstDataSector);
  #endif

	return (1);
}



// 初始化 mmc
S8 Mmc_Init(void)
{
//-- SD controller & card initialize 
    int i;

    RCA=0;
    MMC=0;

    rGPEUP  = 0xf83f;     // The pull up
    rGPECON = 0xaaaaaaaa;
    
    /* Important notice for MMC test condition */
    /* Cmd & Data lines must be enabled pull up resister */

    rSDIPRE=PCLK/(2*INICLK)-1;	// 400KHz
    rSDICON=(1<<4)|(1<<1)|1;	// Type B, FIFO reset, clk enable
    rSDIBSIZE=0x200;		// 512byte(128word)
    rSDIDTIMER=0xffff;		// Set timeout count

    for(i=0;i<0x1000;i++);  // Wait 74SDCLK for MMC card

    //Uart_Printf("rSDIRSP0=0x%x\n",rSDIRSP0);
    CMD0();
  #ifdef SD_INFO
    Uart_Printf("\nIn idle\n");
  #endif

    //-- Check MMC card OCR
    if(Chk_MMC_OCR()) 
    {
	Uart_Printf("\nIn MMC ready\n");
	MMC=1;
	goto RECMD2;
    }

    //Uart_Printf("MMC check end!!\n");
    //-- Check SD card OCR
    if(Chk_SD_OCR()) 
    {
       #ifdef SD_INFO
        Uart_Printf("\nIn SD ready\n");
       #endif
    }
    else
    {
       #ifdef SD_INFO
	    Uart_Printf("\nInitialize fail\nNo Card assertion\n");
	   #endif
        return 0;
    }

RECMD2:
    //-- Check attaced cards, it makes card identification state
    rSDICARG=0x0;   // CMD2(stuff bit)
    rSDICCON=(0x1<<10)|(0x1<<9)|(0x1<<8)|0x42; //lng_resp, wait_resp, start, CMD2

    //-- Check end of CMD2
    if(!Chk_CMDend(2, 1)) 
	goto RECMD2;
    //rSDICSTA=0xa00;	// Clear cmd_end(with rsp)

    #ifdef SD_INFO
    Uart_Printf("\nEnd id\n");
    #endif

RECMD3:
    //--Send RCA
    rSDICARG=MMC<<16;	    // CMD3(MMC:Set RCA, SD:Ask RCA-->SBZ)
    rSDICCON=(0x1<<9)|(0x1<<8)|0x43;	// sht_resp, wait_resp, start, CMD3

    //-- Check end of CMD3
    if(!Chk_CMDend(3, 1)) 
	goto RECMD3;
    //rSDICSTA=0xa00;	// Clear cmd_end(with rsp)

    //--Publish RCA
    if(MMC) 
	RCA=1;
    else 
	RCA=( rSDIRSP0 & 0xffff0000 )>>16;
#ifdef SD_INFO
    Uart_Printf("RCA=0x%x\n",RCA);
#endif

    //--State(stand-by) check
    if( rSDIRSP0 & 0x1e00!=0x600 )  // CURRENT_STATE check
	goto RECMD3;
    #ifdef SD_INFO
    Uart_Printf("\nIn stand-by\n");
    #endif
    
  //  rSDIPRE=PCLK/(2*NORCLK)-1;	// Normal clock=25MHz
rSDIPRE=PCLK/(3*NORCLK)-1;
    Card_sel_desel(1);	// Select

    if(!MMC)
	Set_4bit_bus();
    else
	Set_1bit_bus();

    return 1;
    
}


S8 Mmc_Read_Sector(U32 addr,U8 *Buffer)
{
    int status;
    int i;
    U32 Rx_buffer[128];	
    rd_cnt=0;    
#ifdef SD_INFO
Uart_Printf("addr is 0x%x", addr);
#endif

    rSDICON |= rSDICON|(1<<1);	// FIFO reset

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲另类色综合网站| 激情文学综合网| 久久91精品国产91久久小草 | 一本到高清视频免费精品| 欧美性猛交xxxxxx富婆| 国产精品午夜免费| 久久er99精品| 欧美精品三级日韩久久| 亚洲人成小说网站色在线 | 国产精品蜜臀av| 秋霞午夜鲁丝一区二区老狼| 在线免费视频一区二区| 中文在线一区二区| 国产在线播放一区二区三区| 这里只有精品视频在线观看| 一区二区在线观看免费| 福利一区在线观看| 久久视频一区二区| 精品综合久久久久久8888| 欧美丰满美乳xxx高潮www| 亚洲欧美另类久久久精品2019| 国产精品99久久久久久有的能看 | 欧美性受xxxx黑人xyx性爽| 国产精品护士白丝一区av| 国产成人日日夜夜| 久久这里只精品最新地址| 美女尤物国产一区| 欧美精品自拍偷拍| 婷婷六月综合亚洲| 欧美丰满嫩嫩电影| 日本欧美在线观看| 日韩视频免费观看高清完整版 | 亚洲精品在线观| 久久精品免费观看| 日韩视频一区在线观看| 精品一区二区在线看| 欧美成人精品二区三区99精品| 美女视频一区二区三区| 精品成人免费观看| 久久99精品久久久| 久久久亚洲午夜电影| 国产精品综合二区| 中文字幕欧美三区| 91丝袜国产在线播放| 依依成人综合视频| 在线成人av影院| 欧美一级欧美一级在线播放| 亚洲国产成人自拍| 日本丰满少妇一区二区三区| 3d动漫精品啪啪一区二区竹菊 | 蜜桃av一区二区在线观看| 综合激情成人伊人| 国产婷婷色一区二区三区在线| 亚洲欧美另类久久久精品| xvideos.蜜桃一区二区| 91精品国产91热久久久做人人| 国产欧美1区2区3区| 精品少妇一区二区三区| 国产一区欧美二区| 欧美经典一区二区| 色哟哟一区二区在线观看 | 一区二区三区**美女毛片| 欧美男生操女生| 国产精品69毛片高清亚洲| 亚洲人亚洲人成电影网站色| 欧美美女一区二区三区| 国产一区二区免费看| 亚洲精品videosex极品| 欧美一区二区三区免费视频| 成人午夜免费视频| 午夜精品123| 国产精品丝袜久久久久久app| 91福利社在线观看| 国产盗摄视频一区二区三区| 亚洲最新视频在线观看| 久久人人97超碰com| 91久久人澡人人添人人爽欧美 | 日韩高清一级片| 国产精品天干天干在观线| 91精品欧美一区二区三区综合在 | 在线视频一区二区三| 美女mm1313爽爽久久久蜜臀| 亚洲三级免费观看| 亚洲精品一区二区三区福利| 欧美午夜精品一区二区三区| 国产福利一区二区三区视频在线| 午夜日韩在线观看| 亚洲精品高清在线| 中文字幕高清不卡| 日韩一区二区三区视频在线| 在线日韩国产精品| 99精品热视频| 国产成人免费av在线| 奇米影视在线99精品| 亚洲一区在线观看免费观看电影高清| 国产精品午夜在线| 久久久亚洲午夜电影| 欧美成人综合网站| 欧美一区午夜视频在线观看| 日本电影亚洲天堂一区| 91碰在线视频| 99精品视频在线观看| 国产69精品久久99不卡| 国产中文字幕精品| 极品瑜伽女神91| 久久激情五月婷婷| 蜜臀av性久久久久av蜜臀妖精| 舔着乳尖日韩一区| 亚洲国产美国国产综合一区二区| 亚洲人成精品久久久久久| 国产精品沙发午睡系列990531| 国产亚洲女人久久久久毛片| 久久夜色精品一区| 国产婷婷一区二区| 中文幕一区二区三区久久蜜桃| 国产三级一区二区| 日本一区二区成人在线| 中文幕一区二区三区久久蜜桃| 国产精品污网站| ●精品国产综合乱码久久久久| 国产精品乱码妇女bbbb| 国产精品成人一区二区艾草| 日韩一区中文字幕| 中文字幕中文在线不卡住| 亚洲天天做日日做天天谢日日欢 | 成人精品在线视频观看| 成人不卡免费av| 91在线无精精品入口| 日本韩国欧美国产| 欧美日韩大陆一区二区| 日韩女优视频免费观看| 久久综合久久99| 国产精品免费人成网站| 亚洲男同性视频| 奇米四色…亚洲| 国产激情视频一区二区在线观看| 97成人超碰视| 欧美蜜桃一区二区三区| 精品精品国产高清一毛片一天堂| 国产精品视频麻豆| 亚洲成人综合视频| 国内精品伊人久久久久av影院| 国产成人av一区二区三区在线 | 一区二区三区在线视频播放| 亚洲最大的成人av| 麻豆精品久久精品色综合| 波多野结衣精品在线| 欧美日韩一区视频| 久久亚洲免费视频| 又紧又大又爽精品一区二区| 久久精品国产一区二区| 972aa.com艺术欧美| 51精品秘密在线观看| 中文字幕一区二区不卡| 日韩电影在线一区| 97se亚洲国产综合自在线观| 日韩你懂的电影在线观看| 中文字幕中文字幕中文字幕亚洲无线| 午夜久久久影院| 成人听书哪个软件好| 日韩欧美在线123| 亚洲欧美成aⅴ人在线观看| 久久99精品久久久久久国产越南| 一本久道久久综合中文字幕| 精品国产乱码久久久久久图片| 一区二区三区中文在线观看| 国产成人免费在线观看| 日韩一区二区免费视频| 亚洲一区在线观看免费观看电影高清| 国内精品国产成人| 欧美一区二区视频在线观看2022 | 久久精品久久综合| 欧美午夜免费电影| 国产精品第四页| 国内精品嫩模私拍在线| 91精品福利在线一区二区三区| 中文字幕综合网| 国产精品一区二区久激情瑜伽| 在线成人免费观看| 一区二区三区中文免费| 成人app网站| 久久精品欧美一区二区三区不卡| 日韩精品一区第一页| 91久久一区二区| 亚洲少妇中出一区| av男人天堂一区| 国产精品美女一区二区在线观看| 国产精品亚洲成人| 久久久亚洲精品一区二区三区| 精品一区二区久久| 91精品国产色综合久久不卡电影| 亚洲国产欧美在线| 91国在线观看| 亚洲一区二区三区四区在线观看 | 欧美少妇bbb| 亚洲一区二区三区美女| 91色乱码一区二区三区| 亚洲欧美日韩国产成人精品影院| 99久久精品免费看| 亚洲色图欧美偷拍|