亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
麻豆91精品视频| 国产在线看一区| 综合欧美一区二区三区| 国产蜜臀97一区二区三区 | 午夜精品福利一区二区蜜股av | 日本va欧美va瓶| 青青草国产成人99久久| 久久成人免费网| 久久er精品视频| 国产精品一区在线| 成人动漫一区二区在线| 色综合天天综合色综合av| 97精品电影院| 欧美肥妇毛茸茸| 久久精品人人做人人综合| 国产精品国产自产拍高清av| 亚洲视频 欧洲视频| 亚洲成av人综合在线观看| 精品一区二区在线观看| 成人午夜在线播放| 欧美视频三区在线播放| 欧美乱妇20p| 国产欧美一区二区在线观看| 亚洲永久精品国产| 久久电影网站中文字幕| 色综合久久精品| 欧美mv日韩mv亚洲| 亚洲欧美日韩电影| 黄色资源网久久资源365| 99国产欧美另类久久久精品| 3atv在线一区二区三区| 中文字幕国产一区二区| 亚洲一区二区精品视频| 国产美女精品在线| 欧美亚洲日本一区| 久久久久一区二区三区四区| 亚洲在线观看免费| 成人理论电影网| 91精品黄色片免费大全| 亚洲天堂成人网| 国产一区中文字幕| 欧美三级一区二区| 国产精品美女久久久久久| 视频精品一区二区| 91在线观看视频| 欧美xxxxx裸体时装秀| 樱桃视频在线观看一区| 成人动漫在线一区| 欧美精品一区二区三区很污很色的 | a级精品国产片在线观看| 91精品国产综合久久小美女 | 在线视频国产一区| 中文字幕中文在线不卡住| 免费人成黄页网站在线一区二区| 91蝌蚪porny成人天涯| 国产亚洲福利社区一区| 久久国产尿小便嘘嘘尿| 51午夜精品国产| 亚洲成a人v欧美综合天堂| 色狠狠色噜噜噜综合网| 成人免费小视频| 成人性色生活片免费看爆迷你毛片| 日韩亚洲国产中文字幕欧美| 亚洲成人黄色影院| 欧美日韩一级二级| 亚洲动漫第一页| 欧美三级视频在线播放| 亚洲一区在线视频观看| 日本韩国欧美三级| 一区二区三区中文在线观看| 97se亚洲国产综合自在线| 国产精品超碰97尤物18| 91一区二区在线| 亚洲视频1区2区| 欧美亚洲高清一区二区三区不卡| 亚洲精选视频免费看| 日本福利一区二区| 午夜欧美在线一二页| 欧美日本韩国一区二区三区视频 | 国产一区啦啦啦在线观看| 在线不卡免费欧美| 亚洲一区二区三区四区在线| 欧美在线一区二区| 亚洲h精品动漫在线观看| 欧美午夜影院一区| 日本在线不卡视频一二三区| 日韩精品一区在线观看| 国产精品1区2区3区| 国产精品欧美综合在线| 一本色道久久综合亚洲91| 亚洲一区二区视频| 91精品国产色综合久久久蜜香臀| 日日夜夜精品视频免费| 精品对白一区国产伦| 丁香亚洲综合激情啪啪综合| 亚洲免费色视频| 日韩一区二区三区视频| 丁香五精品蜜臀久久久久99网站| 亚洲欧美日韩国产中文在线| 91精品国产入口| 国产精品一区在线观看乱码| 亚洲男人电影天堂| 日韩一区二区精品葵司在线 | 91免费视频大全| 亚洲v日本v欧美v久久精品| 欧美一级免费大片| av在线这里只有精品| 天堂在线一区二区| 中文字幕国产一区| 欧美精品aⅴ在线视频| 风间由美一区二区av101| 亚洲一区免费视频| 中文幕一区二区三区久久蜜桃| 在线免费观看一区| 国产乱码字幕精品高清av| 亚洲一区二区成人在线观看| 国产亚洲成av人在线观看导航 | 久久av资源站| 亚洲综合激情另类小说区| 久久久99精品久久| 日韩一区二区在线播放| 91行情网站电视在线观看高清版| 紧缚捆绑精品一区二区| 午夜精品123| 亚洲人成网站色在线观看| 国产视频一区二区三区在线观看| 欧美性欧美巨大黑白大战| 大白屁股一区二区视频| 蜜臀av一级做a爰片久久| 伊人色综合久久天天人手人婷| 26uuu国产在线精品一区二区| 欧美在线免费播放| 91玉足脚交白嫩脚丫在线播放| 国产美女视频一区| 国内成人自拍视频| 日本麻豆一区二区三区视频| 一级中文字幕一区二区| 亚洲区小说区图片区qvod| 中文字幕欧美三区| 国产欧美一二三区| 久久久久国产精品人| 久久久三级国产网站| 欧美草草影院在线视频| 日韩欧美高清一区| 日韩一区二区三区视频在线观看| 欧美日韩精品系列| 欧美日韩亚洲丝袜制服| 欧美日韩在线播放三区四区| 色成人在线视频| 欧美综合一区二区三区| 欧美性视频一区二区三区| 欧美综合一区二区| 欧美日韩一区二区三区高清| 欧美日韩精品一区视频| 欧美日韩精品电影| 欧美一区二区在线免费播放 | 狠狠色丁香久久婷婷综| 久久99精品一区二区三区三区| 麻豆国产精品777777在线| 免费在线看一区| 国内久久婷婷综合| 高清av一区二区| 在线亚洲精品福利网址导航| 欧美日韩一区视频| 日韩欧美二区三区| 中文幕一区二区三区久久蜜桃| 亚洲色图清纯唯美| 亚洲第一会所有码转帖| 美日韩一区二区| 国产一级精品在线| 一本在线高清不卡dvd| 欧美日韩五月天| 久久久午夜精品理论片中文字幕| 国产精品美女久久久久aⅴ| 一区二区三区四区国产精品| 日韩高清不卡一区二区三区| 狠狠色丁香九九婷婷综合五月| 99久久婷婷国产精品综合| 欧美色偷偷大香| 久久精品一区蜜桃臀影院| 亚洲黄一区二区三区| 久88久久88久久久| 91蜜桃免费观看视频| 777久久久精品| 亚洲欧美在线另类| 偷窥国产亚洲免费视频| 国产不卡一区视频| 欧美日韩在线精品一区二区三区激情 | 亚洲午夜在线电影| 韩国女主播一区| 欧美色综合网站| 国产欧美一区二区精品性色| 婷婷成人综合网| 91丨九色丨蝌蚪富婆spa| 日韩欧美成人激情| 亚洲永久免费视频| av不卡免费电影| 欧美精品一区在线观看| 丝袜美腿亚洲色图| 色综合久久88色综合天天|