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

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

?? mci_lpc23xx.c

?? LPC2368 SD卡控制程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*----------------------------------------------------------------------------
 *      R T L  -  F l a s h   F i l e   S y s t e m
 *----------------------------------------------------------------------------
 *      Name:    MCI_LPC23XX.C 
 *      Purpose: Multimedia Card Interface Driver for LPC23xx
 *      Rev.:    V3.12
 *----------------------------------------------------------------------------
 *      This code is part of the RealView Run-Time Library.
 *      Copyright (c) 2004-2007 KEIL - An ARM Company. All rights reserved.
 *---------------------------------------------------------------------------*/

#include <File_Config.h>
#include <LPC23xx.h>                 /* LPC23xx/24xx definitions             */
#include "MCI_LPC23xx.h"

/* Local variables */
static U8  CardType;
static U16 CardRCA;
static MMCFG mmc_cfg;

/*----------------------------------------------------------------------------
 *      MMC Driver Functions
 *----------------------------------------------------------------------------
 *  Required functions for MMC driver module:
 *   - BOOL mci_init ()
 *   - BOOL mci_read_sect (U32 sect, U8 *buf)
 *   - BOOL mci_write_sect (U32 sect, U8 *buf)
 *   - BOOL mmc_read_config (MMCFG *cfg)
 *---------------------------------------------------------------------------*/

/* Local Function Prototypes */
static void mci_set_speed (U32 speed);
static void mci_bus_mode (U32 mode);
static BOOL mci_send_acmd (void);
static BOOL mci_set_address (void);
static BOOL mci_read_cid (void);
static BOOL mci_read_csd (void);
static BOOL mci_select_card (void);
static BOOL mci_set_bus_4bit (void);
static BOOL mci_set_block_len (void);
static BOOL mci_cmd_read_block (U32 block);
static BOOL mci_cmd_write_block (U32 block);
static U32  mci_read_status (void);
static BOOL mci_send_stop (void);
static U32  mci_command (U8 cmd, U32 arg, U32 resp,  U32 *rp);
static void mci_dma_start (U32 mode, U8 *buf);

/*--------------------------- mci_init --------------------------------------*/

BOOL mci_init (void) {
   /* Initialize and enable the Flash Card. */
   U32 i,rstat,rval[4];

   /* Power Up the MCI and DMA controller. */
   PCONP |= 0x30000000;

   /* Enable MCI Pins on P0,P2. */
   PINSEL1 &= ~0x00003FC0;
   PINSEL1 |=  0x00002A80;
   PINSEL4 &= ~0x0FC00000;
   PINSEL4 |=  0x0A800000;

   /* Clear all pending interrupts. */
   MCI_COMMAND   = 0;
   MCI_DATA_CTRL = 0;
   MCI_CLEAR     = 0x7FF;

   /* Power up, switch on VCC for the Flash Card. */
   MCI_POWER  = 0x02;
   for (i = 0; i < 50000; i++);

   mci_set_speed (LOW_SPEED);

   /* Power on the Flash Card. */
   MCI_POWER |= 0x01;
   for (i = 0; i < 50000; i++);

   /* Reset the card, send CMD0. */
   mci_command (GO_IDLE_STATE, 0, RESP_NONE, NULL);

   /* Set Open Drain output control for MMC */
   mci_bus_mode (OPEN_DRAIN_MODE);

   CardType = CARD_NONE;
   /* First try MMC, send CMD1. */
   for (i = 0; i < 100; i++) {
      rstat = mci_command (SEND_OP_COND, OCR_INDEX, RESP_SHORT, &rval[0]);
      if (!(rstat & MCI_CMD_TIMEOUT) && rval[0] & 0x80000000) {
         CardType = CARD_MMC;
         break;
      }
   }

   if (CardType == CARD_NONE) {
      /* Check for SD card, clear Open Drain output control. */
      mci_bus_mode (PUSH_PULL_MODE);
      for (i = 0; i < 500; i++) {
         if (mci_send_acmd () == __TRUE) {
            rstat = mci_command (SEND_APP_OP_COND, 
                                 OCR_INDEX, RESP_SHORT, &rval[0]);
            if (!(rstat & MCI_CMD_TIMEOUT) && rval[0] & 0x80000000) {
               /* OK, SD card initialized. */
               CardType = CARD_SD;
               break;
            }
         }
      }
   }
   if (CardType == CARD_NONE) {
      /* Failed, no card found. */
      goto fail;
   }

   /* Initialize the Card to SD/MMC mode. */
   if (mci_read_cid () == __FALSE) {
      goto fail;
   }
   if (mci_set_address () == __FALSE) {
      goto fail;
   }

   /* Disable Open Drain mode for MMC. */
   if (CardType == CARD_MMC) {
      mci_bus_mode (PUSH_PULL_MODE);
   }

   /* Data Transfer Mode, end of Card-Identification Mode. */
   mci_set_speed (HIGH_SPEED);

   if (mci_read_csd () == __FALSE) {
      goto fail;
   }
   if (mci_select_card () == __FALSE) {
      goto fail;
   }

   if (CardType == CARD_SD) {
      /* Use wide 4-bit bus for SD */
      MCI_CLOCK |= 0x0800;
      for (i = 0; i < 100; i++);
      if (mci_set_bus_4bit () == __FALSE) {
         /* Failed to enable 4-bit bus. */
         goto fail;
      }
   }
   /* Set block length to 512 bytes. */
   if (mci_set_block_len () == __FALSE) {
fail: MCI_POWER = 0x00;
      return (__FALSE);
   }

   /* Success, card initialized. */
   return (__TRUE);
}


/*--------------------------- mci_set_speed ---------------------------------*/

static void mci_set_speed (U32 speed) {
   /* Set a MCI clock speed to desired value. */
   U32 i,clkdiv;

   if (speed == HIGH_SPEED) {
      /* Max. 20 MBit used for Data Transfer. */
      clkdiv = 1;
   }
   else {
      /* Max. 400 kBit used in Card Initialization. */
      clkdiv = 120;
   }
   MCI_CLOCK = (MCI_CLOCK & ~0xFF) | 0x300 | clkdiv;

   /* delay 3MCLK + 2PCLK before next write */
   for ( i = 0; i < 100; i++ );
}


/*--------------------------- mci_bus_mode ----------------------------------*/

static void mci_bus_mode (U32 mode) {
   /* Set MCI Bus mode to Open Drain or Push Pull. */
   U32 i;

   if (mode == OPEN_DRAIN_MODE) {
      MCI_POWER |= 0x40;
   }
   else {
      MCI_POWER &= ~0x40;
   }
   /* A small delay after switching mode. */
   for (i = 0; i < 100; i++);
}


/*--------------------------- mci_send_acmd ---------------------------------*/

static BOOL mci_send_acmd (void) {
   /* Send CMD55 to enable ACMD */
   U32 arg,rstat,rval;

   arg = 0;
   if (CardType == CARD_SD) {
      /* Use address from SET_RELATIVE_ADDR. */
      arg = CardRCA << 16;
   }
   rstat = mci_command (APP_CMD, arg, RESP_SHORT, &rval);
   if (rstat == 0 && (rval & STAT_ACMD_ENABLE)) {
      return (__TRUE);
   }
   return (__FALSE);
}


/*--------------------------- mci_set_address -------------------------------*/

static BOOL mci_set_address (void) {
   /* Set Relative Address, send CMD3 after CMD2. */
   U32 i,arg,rstat,rval;

   arg = 0;
   if (CardType == CARD_MMC) {
      /* Fix the RCA address for MMC card. */
      arg = 0x00010000;
   }

   for (i = 0; i < 20; i++) {
      rstat = mci_command (SET_RELATIVE_ADDR, arg, RESP_SHORT, &rval);
      if (!(rstat & MCI_CMD_TIMEOUT) && (rval & 0x0F00) == 0x0500) {
         /* Response is back and correct. */
         CardRCA = rval >> 16;
         return (__TRUE);
      }
   }
   return (__FALSE);
}


/*--------------------------- mci_read_cid ----------------------------------*/

static BOOL mci_read_cid (void) {
   /* Check CID, send CMD2 after CMD1 (MMC) or ACMD41 (SD). */
   U32 i,rstat,v,rval[4];

   for (i = 0; i < 20; i++) {
      rstat = mci_command (ALL_SEND_CID, 0, RESP_LONG, &rval[0]);
      if (!(rstat & MCI_CMD_TIMEOUT)) {
         /* Response is back and correct. */
         if (CardType == CARD_SD) {
            /* Serial Number for SD Card. */
            v = (rval[2] << 8)  | (rval[3] >> 24);
         }
         else {
            /* Serial Number for MMC Card. */
            v = (rval[2] << 16) | (rval[3] >> 16);
         }
         mmc_cfg.sernum = v;
         return (__TRUE);
      }
   }
   mmc_cfg.sernum = 0;
   return (__FALSE);
}


/*--------------------------- mci_read_csd ----------------------------------*/

static BOOL mci_read_csd (void) {
   /* Send Card Specific Data, send CMD9 after CMD3. */
   U32 i,arg,rstat,v,m,rval[4];

   arg = 0x00010000;
   if (CardType == CARD_SD) {
      /* Use address from SET_RELATIVE_ADDR. */
      arg = CardRCA << 16;
   }

   for (i = 0; i < 20; i++) {
      rstat = mci_command (SEND_CSD, arg, RESP_LONG, &rval[0]);
      if (rstat == 0) {
         /* Response is back and correct, Read Block length */
         v = (rval[1] >> 16) & 0x0F;
         mmc_cfg.read_blen = 1 << v;

         /* Write Block length */
         v = (rval[3] >> 22) & 0x0F;
         mmc_cfg.write_blen = 1 << v;

         /* Total Number of blocks */
         v = ((rval[1] << 2) | (rval[2] >> 30)) & 0x0FFF;
         m =  (rval[2] >> 15) & 0x07;
         mmc_cfg.blocknr = (v + 1) << (m + 2);

         /* File Format information */
         v = (rval[3] >> 8) & 0x83;
         switch (v) {
            case 0x00:
            case 0x03:
               mmc_cfg.format = HDD_TYPE;
               break;
            case 0x01:
               mmc_cfg.format = FLOPPY_TYPE;
               break;
            default:
               mmc_cfg.format = UNKNOWN_TYPE;
               break;
         }
         return (__TRUE);
      }
   }
   return (__FALSE);
}


/*--------------------------- mci_select_card -------------------------------*/

static BOOL mci_select_card (void) {
   /* Select the Card, send CMD7 after CMD9, inter-change state */
   /* between STBY and TRANS after this command. */
   U32 i,arg,rstat,rval;

   arg = 0x00010000;
   if (CardType == CARD_SD) {
      /* Use address from SET_RELATIVE_ADDR. */
      arg = CardRCA << 16;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美www| 久久精品噜噜噜成人88aⅴ| 亚洲www啪成人一区二区麻豆| 蜜臀国产一区二区三区在线播放 | 4438成人网| 中文字幕一区日韩精品欧美| 老鸭窝一区二区久久精品| 91蝌蚪国产九色| 久久久亚洲精品一区二区三区| 亚州成人在线电影| 91激情五月电影| 国产精品视频免费| 精彩视频一区二区| 欧美卡1卡2卡| 亚洲综合免费观看高清完整版 | 精品久久久久久久久久久久包黑料 | 国产成人在线视频免费播放| 99久久99久久精品免费看蜜桃| 日韩精品一区二区三区蜜臀| 亚洲第一会所有码转帖| 在线欧美一区二区| 日韩美女视频一区二区| 成人性生交大片免费| 精品国偷自产国产一区| 成人综合日日夜夜| 日韩三区在线观看| 日一区二区三区| 欧美色精品在线视频| 亚洲一区二区视频在线| 色婷婷av一区二区三区软件 | 亚洲免费资源在线播放| aaa欧美日韩| 综合久久久久久| 97精品电影院| 亚洲男人天堂av网| 欧美在线你懂得| 一区二区欧美精品| 欧美精品久久天天躁| 日本午夜一本久久久综合| 欧美一区二区精品久久911| 日韩va亚洲va欧美va久久| 欧美一区在线视频| 国产一区免费电影| 欧美国产欧美综合| 91麻豆精东视频| 亚洲综合色视频| 在线成人午夜影院| 麻豆国产精品一区二区三区| 久久亚洲影视婷婷| 国产99精品国产| 1000精品久久久久久久久| 在线视频国内自拍亚洲视频| 三级一区在线视频先锋| 日韩精品一区二区三区中文精品| 狠狠色狠狠色综合系列| 国产精品久久久久久户外露出| 成人h动漫精品| 亚洲午夜在线电影| 欧美成人精品3d动漫h| 成人午夜精品在线| 亚洲综合色婷婷| 欧美电影免费提供在线观看| 从欧美一区二区三区| 亚洲一二三四在线观看| 欧美精品一区二区三区在线| av激情成人网| 美国一区二区三区在线播放| 国产欧美一区二区精品久导航| 99久久精品免费观看| 首页国产丝袜综合| 国产精品丝袜黑色高跟| 欧美日韩一区二区三区在线看| 精品亚洲aⅴ乱码一区二区三区| 中文字幕一区二区三区视频| 欧美一区二区三区色| 99re热视频精品| 久久99国产精品久久99果冻传媒| 中文字幕一区二区三区在线观看| 欧美精品一卡二卡| 91在线国产福利| 国产真实精品久久二三区| 亚洲愉拍自拍另类高清精品| 久久尤物电影视频在线观看| 精品视频一区三区九区| 成人h动漫精品| 国产在线精品免费av| 亚洲成va人在线观看| 国产精品午夜免费| 欧美tickling网站挠脚心| 欧美视频三区在线播放| 粉嫩av亚洲一区二区图片| 日本vs亚洲vs韩国一区三区二区| 亚洲日本成人在线观看| 久久久久免费观看| 精品欧美一区二区三区精品久久| 欧美亚洲国产一区二区三区| 99在线热播精品免费| 国产一区美女在线| 久久精品国产第一区二区三区| 亚洲高清一区二区三区| 亚洲免费在线看| 国产精品久久久久一区二区三区共 | 粉嫩13p一区二区三区| 日韩av一区二区在线影视| 亚洲综合清纯丝袜自拍| 中文字幕第一页久久| 久久精品一区二区三区不卡| 日韩精品一区二区三区视频播放 | 日韩三区在线观看| 91精品麻豆日日躁夜夜躁| 日本韩国一区二区| 91蝌蚪国产九色| 91香蕉视频mp4| 成人av在线资源网| 成人app下载| 91在线免费看| 91久久一区二区| 91久久国产最好的精华液| 欧美亚洲动漫另类| 欧美日韩免费电影| 欧美群妇大交群的观看方式| 欧美日韩一区二区在线观看视频| 色视频欧美一区二区三区| 一本一道综合狠狠老| 欧美视频精品在线观看| 欧美色图激情小说| 51精品视频一区二区三区| 91精品国产入口| 欧美va亚洲va| 国产日产欧产精品推荐色 | 粉嫩在线一区二区三区视频| 成人免费毛片a| 色8久久精品久久久久久蜜| 欧美日韩中文字幕一区二区| 在线成人av影院| www激情久久| 亚洲免费av网站| 日韩黄色小视频| 国产suv精品一区二区883| 欧美男人的天堂一二区| 337p亚洲精品色噜噜狠狠| 欧美电影免费观看高清完整版在| 久久嫩草精品久久久精品一| 中文字幕 久热精品 视频在线| 亚洲日本一区二区| 蜜桃91丨九色丨蝌蚪91桃色| 国产成人精品免费网站| 色噜噜狠狠色综合中国| 欧美一区二区三区视频在线| 中文字幕乱码久久午夜不卡| 亚洲欧美日韩国产中文在线| 日本网站在线观看一区二区三区 | 精品国产91乱码一区二区三区| 国产日韩欧美高清在线| 一区2区3区在线看| 国产伦精品一区二区三区视频青涩| 成人蜜臀av电影| 日韩一区和二区| 国产精品久久久久桃色tv| 亚洲国产成人高清精品| 岛国av在线一区| 欧美一区二区三区啪啪| 亚洲人成网站在线| 精品在线观看免费| 欧美综合一区二区| 久久精品夜色噜噜亚洲a∨| 香蕉加勒比综合久久| 懂色av一区二区三区免费观看| 欧美日本乱大交xxxxx| 国产精品日产欧美久久久久| 日韩精品一二三四| 在线观看一区二区精品视频| 国产偷国产偷精品高清尤物| 天涯成人国产亚洲精品一区av| 国产69精品一区二区亚洲孕妇| 欧美精品欧美精品系列| 亚洲视频一二三区| 国产精品一区在线| 日韩精品专区在线影院观看| 亚洲综合久久久| 99re8在线精品视频免费播放| 久久久国产一区二区三区四区小说 | 国产精品麻豆久久久| 免费看日韩精品| 欧美日本国产视频| 亚洲精品成人少妇| 99在线视频精品| 久久噜噜亚洲综合| 国产一区二区三区在线看麻豆| 91精品久久久久久久久99蜜臂| 亚洲夂夂婷婷色拍ww47| 91美女视频网站| 亚洲欧洲韩国日本视频| 成人av电影免费在线播放| 亚洲国产精品成人久久综合一区| 极品少妇xxxx精品少妇偷拍| 欧美电影免费观看高清完整版| 青娱乐精品视频在线| 日韩片之四级片| 久久精品国产色蜜蜜麻豆|