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

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

?? mci_lpc23xx.c

?? LP236X的教程里面有許多源碼例程。我當初可是花錢買來的。希望能幫得上忙。
?? 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.21
 *----------------------------------------------------------------------------
 *      This code is part of the RealView Run-Time Library.
 *      Copyright (c) 2004-2008 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, U32 cnt)
 *   - BOOL mci_write_sect (U32 sect, U8 *buf, U32 cnt)
 *   - 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, U32 cnt);
static BOOL mci_cmd_write_block (U32 block, U32 cnt);
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;

   /* MCIPWR pin is active high. */
   /* Required for the silicon rev. 'B' and later. */
   SCS |= 0x08;

   /* 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. 25 MBit used for Data Transfer. */
      clkdiv = 0;
   }
   else {
      /* Max. 400 kBit used in Card Initialization. */
      clkdiv = 240;
   }
   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;
   }

   for (i = 0; i < 20; i++) {
      rstat = mci_command (SELECT_CARD, arg, RESP_SHORT, &rval);
      if (rstat == 0 && (rval & 0x0F00) == 0x0700) {
         /* Should be in STBY state now and ready. */
         return (__TRUE);
      }
   }
   return (__FALSE);
}


/*--------------------------- mci_set_bus_4bit ------------------------------*/

static BOOL mci_set_bus_4bit (void) {
   /* Select 4-bit bus width for SD Card. */
   U32 i,rstat,rval;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合999| 国产精品另类一区| 成人午夜电影小说| 天天色综合天天| 亚洲色图视频免费播放| 久久免费视频色| 91精品免费在线| 色婷婷综合久久久久中文| 国产激情视频一区二区在线观看 | 琪琪久久久久日韩精品| 中文字幕日本乱码精品影院| 精品入口麻豆88视频| 欧美色图激情小说| 99精品在线免费| 高清beeg欧美| 国模套图日韩精品一区二区 | 精品对白一区国产伦| 欧美三日本三级三级在线播放| 成年人国产精品| 国产成人激情av| 国产综合一区二区| 麻豆精品一区二区| 奇米色一区二区| 亚洲va国产va欧美va观看| 亚洲人午夜精品天堂一二香蕉| 国产日产亚洲精品系列| 久久蜜臀中文字幕| 久久综合精品国产一区二区三区| 91精品国产综合久久福利软件 | 国产欧美精品一区| 久久亚洲精品小早川怜子| 日韩欧美不卡一区| 欧美mv和日韩mv国产网站| 日韩欧美国产系列| 日韩免费观看高清完整版| 91精品福利在线一区二区三区| 欧美欧美午夜aⅴ在线观看| 欧美三级在线视频| 欧美乱妇15p| 欧美一卡二卡在线观看| 日韩午夜激情视频| 日韩亚洲欧美成人一区| 亚洲精品在线观看网站| 久久这里都是精品| 欧美国产日韩a欧美在线观看| 国产免费观看久久| 日韩理论片中文av| 一区二区久久久| 香蕉乱码成人久久天堂爱免费| 天堂影院一区二区| 蜜臀av性久久久久蜜臀aⅴ流畅 | 日韩一区国产二区欧美三区| 日韩欧美国产一区二区在线播放| 欧美成人精品1314www| 久久亚洲二区三区| 国产精品高潮久久久久无| 亚洲美女区一区| 性久久久久久久久久久久| 捆绑调教一区二区三区| 国产成人8x视频一区二区| 91网站最新网址| 欧美日韩成人在线| 精品va天堂亚洲国产| 国产精品电影院| 日韩影院精彩在线| 国产精品一区二区视频| 色综合咪咪久久| 91精品国产欧美日韩| 久久久99久久| 亚洲免费伊人电影| 久久精品72免费观看| 成人免费观看男女羞羞视频| 欧美性色黄大片| 久久精品夜色噜噜亚洲a∨| 亚洲青青青在线视频| 免费人成黄页网站在线一区二区| 国产成人免费av在线| 欧美三电影在线| 欧美经典一区二区| 午夜精品久久久久久久| 国产不卡高清在线观看视频| 欧美色图12p| 国产农村妇女精品| 日本欧洲一区二区| 99久久精品国产一区| 欧美一级二级在线观看| 亚洲区小说区图片区qvod| 欧美aaa在线| 91一区二区在线| 精品久久久久久最新网址| 亚洲综合成人在线| 国产高清久久久| 91精品国产色综合久久| 一色桃子久久精品亚洲| 久久99精品久久久| 欧美午夜片在线观看| 国产精品国产三级国产aⅴ入口| 男人的天堂久久精品| 91久久精品一区二区| 日本一二三四高清不卡| 毛片基地黄久久久久久天堂| 在线中文字幕一区二区| 国产精品久久国产精麻豆99网站| 九色|91porny| 欧美日韩1区2区| 一区二区三区不卡视频| 成人精品国产一区二区4080| 日韩午夜精品电影| 日韩成人一级片| 欧洲精品一区二区三区在线观看| 欧美国产一区在线| 国产精品一二三四| 26uuu色噜噜精品一区二区| 日韩高清一区在线| 欧洲精品视频在线观看| 亚洲精品免费播放| 99riav一区二区三区| 中文字幕不卡的av| 国产成人精品亚洲777人妖| 欧美本精品男人aⅴ天堂| 日本美女视频一区二区| 欧美久久久一区| 亚洲福利一二三区| 欧美在线小视频| 亚洲黄一区二区三区| 91免费精品国自产拍在线不卡| 国产精品视频yy9299一区| 国产91精品久久久久久久网曝门| 久久婷婷成人综合色| 国产一区二区三区黄视频| 精品剧情在线观看| 韩国一区二区在线观看| 337p日本欧洲亚洲大胆精品| 久久99精品国产.久久久久久| 欧美电视剧免费观看| 久久成人免费网站| 久久久亚洲精华液精华液精华液| 国产中文字幕一区| 国产午夜精品一区二区三区四区| 国产福利91精品| 国产精品免费视频一区| www.爱久久.com| 一区二区三区精密机械公司| 在线看国产一区二区| 五月天亚洲精品| 日韩一级免费一区| 国产成人在线观看免费网站| 国产精品麻豆网站| 91国偷自产一区二区三区成为亚洲经典| 亚洲精品成人天堂一二三| 欧美日韩一区二区三区四区五区 | 亚洲欧美自拍偷拍色图| 一本一道综合狠狠老| 无吗不卡中文字幕| 久久综合色播五月| 高清成人在线观看| 亚洲黄色录像片| 欧美一级搡bbbb搡bbbb| 国产激情视频一区二区三区欧美| 欧美激情综合在线| 欧洲色大大久久| 美女一区二区久久| 国产精品国产精品国产专区不片| 在线欧美一区二区| 日本sm残虐另类| 中文字幕第一区| 欧美日韩国产成人在线免费| 精品亚洲porn| 亚洲精品一卡二卡| 日韩欧美视频在线| 99久久精品一区| 日韩**一区毛片| 中文字幕av不卡| 欧美浪妇xxxx高跟鞋交| 国产精品一区二区男女羞羞无遮挡 | 男男视频亚洲欧美| 中文字幕欧美日本乱码一线二线 | 91精品国产美女浴室洗澡无遮挡| 国产精品一区二区91| 亚洲国产精品一区二区久久| 久久色在线观看| 欧美色综合天天久久综合精品| 国产一区二区主播在线| 一区二区三区精品视频在线| 欧美美女一区二区三区| 亚洲色图另类专区| 99久久精品国产毛片| 中文字幕不卡在线播放| 91免费版在线| 蜜桃视频在线观看一区二区| 亚洲人成小说网站色在线| 日韩美女主播在线视频一区二区三区| av中文字幕一区| 国产一区二区三区视频在线播放| 亚洲一区二区不卡免费| 欧美激情在线一区二区三区| 欧美一区二区日韩一区二区| 91黄色在线观看| 成人晚上爱看视频| 精品一区在线看|