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

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

?? mmc.c

?? ATMEL 89c51sndc mp3外接硬盤源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*C**************************************************************************
* NAME:         mmc.c
*----------------------------------------------------------------------------
* Copyright (c) 2002 Atmel.
*----------------------------------------------------------------------------
* RELEASE:      snd1c-demo-hdd-0_2_0      
* REVISION:     1.15     
*----------------------------------------------------------------------------
* PURPOSE:
* This file contains the high level MMC routines
*
* NOTES:
* Global Variables:
*   - gl_ptr_mem:   long in data space
*
* - The functions are written to handle a 2-card MMC stack
* - Only MMC cards with block size = 512 bytes are accepted
*****************************************************************************/

/*_____ I N C L U D E S ____________________________________________________*/

#include "config.h"                         /* system configuration */
#include "lib\usb\usb_drv.h"                /* usb driver definition */
#include "mmc.h"                            /* MMC definition */


/*_____ M A C R O S ________________________________________________________*/


/*_____ D E F I N I T I O N ________________________________________________*/

extern  data    Uint32  gl_ptr_mem;         /* memory data pointer */
extern  data    Byte    gl_mem_tick;        /* memory tick counter */
extern  bdata   bit     gl_mem_failure;     /* memory hardware failure */

static  Byte    mmc_state;
static  bit     mmc_mem_busy;               /* memory in busy state */
idata   Uint32  mmc_mem_size;               /* memory disk size in pages */


/*_____ D E C L A R A T I O N ______________________________________________*/


/*F**************************************************************************
* NAME: mmc_init
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   MMC initialisation
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void mmc_init (void)
{
  gl_mem_failure = FALSE;
  mmc_state = MMC_FUNCT_START;
  mmc_mem_busy = FALSE;                     /* memory ready */
}


/*F**************************************************************************
* NAME: mmc_init_csd
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*   check status  - OK: card supported by software
*                 - KO: card not supported by software
*----------------------------------------------------------------------------
* PURPOSE: 
*   Card validity checking, memory variable initialisation and
*   controller data transfer mode initialisation
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   Card with block size != 512 are rejected
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
bit mmc_init_csd (void)
{
Byte  tmp;

  ACC = Mmc_rd_cmd();                       /* dummy read of header */
  ACC = Mmc_rd_cmd();                       /* dummy read of CSD[0] */
  ACC = Mmc_rd_cmd();                       /* dummy read */
  ACC = Mmc_rd_cmd();                       /* dummy read */
  ACC = Mmc_rd_cmd();                       /* dummy read */
  ACC = Mmc_rd_cmd();                       /* dummy read */

  if ((Mmc_rd_cmd() & CSD_MSK_RBL) != CSD_BLEN_512) /* check block length */
  { /* block size != 512 bytes not supported by firmware */
    Mmc_reset_cmd_fifos();                  /* reset pointers */
    return KO;
  }
  else
  {
    Mmc_set_block_size(CSD_BLEN_512);       /* init controller */
  }
  /* compute card size in number of block (block size = 512) */
  /* read C_SIZE */
  ((Byte*)&mmc_mem_size)[0] = 0;
  ((Byte*)&mmc_mem_size)[1] = 0;
  ((Byte*)&mmc_mem_size)[2] = Mmc_rd_cmd() & CSD_MSK_CSH;
  ((Byte*)&mmc_mem_size)[3] = Mmc_rd_cmd();
  mmc_mem_size = mmc_mem_size << 2;
  ((Byte*)&mmc_mem_size)[3] |= ((Mmc_rd_cmd() & CSD_MSK_CSL) >> 6);
  /* read C_SIZE_MULT */
  tmp = Mmc_rd_cmd() << 1;
  tmp = (tmp | (Mmc_rd_cmd() >> 7)) & CSD_MSK_CSM;
  mmc_mem_size = ((mmc_mem_size + 1) << (tmp + 2));
  mmc_mem_size--;
  Mmc_set_single_block();                   /* single block mode transfer */
  Mmc_enable_flow_ctrl();                   /* start flow control */
  Mmc_reset_cmd_fifos();                    /* reset pointers */
  return OK;
}


/*F**************************************************************************
* NAME: mmc_init_stack
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   Initialize MMC controller and reset all cards to idle state
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   This function is called when initializing stack for first time
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void mmc_init_stack (void)
{
  gl_mem_failure = FALSE;
  Mmc_set_read();                           /* dir from card to uc */
  Mmc_set_clock(MMC_CLK_INIT);              /* set MMC clock to 400 KHz */
  Mmc_enable();
  Mmc_reset();
  Mmc_reset_cmd_fifos();
  Mmc_reset_data_fifos();
  mmc_send_scmd(MMC_GO_IDLE_STATE, MMC_NO_RESP);
}


/*F**************************************************************************
* NAME: mmc_init_next
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   Initialize MMC controller
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   This function is called when stack has already been initialized
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void mmc_init_next (void)
{
  gl_mem_failure = FALSE;
  Mmc_set_read();                           /* dir from card to uc */
  Mmc_set_clock(MMC_CLK_INIT);              /* set MMC clock to 400 KHz */
  Mmc_enable();
  Mmc_reset();
  Mmc_reset_cmd_fifos();
  Mmc_reset_data_fifos();
}


/*F**************************************************************************
* NAME: mmc_single_acq
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*   MMC_OK:     state result OK
*   MMC_ERROR:  state result KO
*   MMC_END:    end of card acquisition
*----------------------------------------------------------------------------
* PURPOSE: 
*   Single card acquisition
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   - This function must be called 5 or 6 times for completion depending on
*     the busy card
*   - Each call must be delayed enough to leave time for command
*     transmission and response reception
*   - It does not take care of the DSR
*   - At the end of this function CSD is in buffer
*
*   STATES: MMC_SINGLE_OP_COND  send operating condition
*           MMC_SINGLE_CID      check busy and send CID or op cond again
*           MMC_SINGLE_SRA      check CID response and set relative address
*           MMC_SINGLE_CSD      send CSD request
*           MMC_SINGLE_END      check CSD reception
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
Byte mmc_single_acq (void)
{
Uint32  response;

  switch (mmc_state)
  {
    case MMC_SINGLE_OP_COND:
    {
      mmc_send_cmd(MMC_SEND_OP_COND, MMC_OCR_INIT, MMC_RESP_R3);
      mmc_state = MMC_SINGLE_CID;
      return (MMC_OK);
    }

    case MMC_SINGLE_CID:
    {
      if (mmc_check_response() == MMC_ERR_RESP)
      {
        mmc_state = MMC_FUNCT_START;
        return (MMC_ERROR);                 /* no response */
      }
      else
      {
        response = mmc_read_response();
        if ((((Byte*)&response)[0] & MMC_BUSY_OCR) != MMC_BUSY_OCR)
        {   /* at least one card is busy */
          mmc_send_cmd(MMC_SEND_OP_COND, MMC_OCR_INIT, MMC_RESP_R3);
        }
        else
        {
          mmc_send_scmd(MMC_ALL_SEND_CID, MMC_RESP_R2);
          mmc_state = MMC_SINGLE_SRA;
        }
        return (MMC_OK);
      }
    }

    case MMC_SINGLE_SRA:
    {
      if (mmc_check_response() == MMC_ERR_RESP)
      {
        mmc_state = MMC_FUNCT_START;
        return (MMC_ERROR);                 /* no response */
      }
      else
      {
        mmc_send_cmd(MMC_SET_RELATIVE_ADDRESS, MMC_RCA_1, MMC_RESP_R1);
        mmc_state = MMC_SINGLE_CSD;
        return (MMC_OK);
      }
    }

    case MMC_SINGLE_CSD:
    {
      if (mmc_check_response() == MMC_ERR_RESP)
      {
        mmc_state = MMC_FUNCT_START;
        return (MMC_ERROR);                 /* no response */
      }
      else
      {
        mmc_send_cmd(MMC_SEND_CSD, MMC_RCA_1, MMC_RESP_R2);
        mmc_state = MMC_SINGLE_END;
        return (MMC_OK);
      }
    }

    case MMC_SINGLE_END:
    {
      if (mmc_check_response() == MMC_ERR_RESP)
      {
        mmc_state = MMC_FUNCT_START;
        return (MMC_ERROR);                 /* no response */
      }
      else
      {
        Mmc_set_clock(MMC_CLK_TRANS);       /* set MMC clock to transfer */
        mmc_state = MMC_FUNCT_START;
        Mmc_set_single_block();             /* single block transfer */
        return (MMC_END);
      }
    }
  }
}


/*F**************************************************************************
* NAME: mmc_update_acq
*----------------------------------------------------------------------------
* PARAMS:   
*
* return:
*   MMC_OK:     state result OK
*   MMC_ERROR:  state result KO
*   MMC_END:    end of new card acquisition
*----------------------------------------------------------------------------
* PURPOSE: 
*   New card acquisition
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   - This function must be called 5 or 6 times for completion
*     depending on busy card
*   - Each call must be delayed enough to leave time for command
*     transmission and response reception
*   - It does not take care of the DSR
*
*   STATES: MMC_STACK_OP_COND   send operating condition
*           MMC_STACK_CID       check busy and send CID or op cond again
*           MMC_STACK_SRA       check CID response and set relative address
*           MMC_STACK_CSD       send CSD request
*           MMC_STACK_END       check CSD reception
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
Byte mmc_update_acq (void)
{
Uint32  response;

  switch (mmc_state)
  {
    case MMC_STACK_OP_COND:
    {
      mmc_send_cmd(MMC_SEND_OP_COND, MMC_OCR_INIT, MMC_RESP_R3);
      mmc_state = MMC_STACK_CID;
      return (MMC_OK);
    }

    case MMC_STACK_CID:
    {
      if (mmc_check_response() == MMC_ERR_RESP)
      {
        mmc_send_scmd(MMC_ALL_SEND_CID, MMC_RESP_R2);
        mmc_state = MMC_STACK_SRA;          /* card already in stack ? */
      }
      else
      {
        response = mmc_read_response();
        if ((((Byte*)&response)[0] & MMC_BUSY_OCR) != MMC_BUSY_OCR)
        {   /* at least one card is busy */
          mmc_send_cmd(MMC_SEND_OP_COND, MMC_OCR_INIT, MMC_RESP_R3);
        }
        else
        {
          mmc_send_scmd(MMC_ALL_SEND_CID, MMC_RESP_R2);
          mmc_state = MMC_STACK_SRA;
        }
      }
      return (MMC_OK);
    }

    case MMC_STACK_SRA:
    {
      if (mmc_check_response() == MMC_ERR_RESP)
      {
        mmc_state = MMC_FUNCT_START;
        return (MMC_ERROR);                 /* no response: no new card */
      }
      else
      {
        mmc_send_cmd(MMC_SET_RELATIVE_ADDRESS, MMC_RCA_2, MMC_RESP_R1);
        mmc_state = MMC_STACK_CSD;
        return (MMC_OK);
      }
    }

    case MMC_STACK_CSD:
    {
      if (mmc_check_response() == MMC_ERR_RESP)
      {
        mmc_state = MMC_FUNCT_START;
        return (MMC_ERROR);                 /* no response */
      }
      else
      {
        mmc_send_cmd(MMC_SEND_CSD, MMC_RCA_2, MMC_RESP_R2);
        mmc_state = MMC_STACK_END;
        return (MMC_OK);
      }
    }

    case MMC_STACK_END:
    {
      if (mmc_check_response() == MMC_ERR_RESP)
      {
        mmc_state = MMC_FUNCT_START;
        return (MMC_ERROR);                 /* no response */
      }
      else
      {
        Mmc_set_clock(MMC_CLK_TRANS);       /* set MMC clock to max */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区av在线播放| 国产精品无遮挡| 欧美在线你懂得| 91女神在线视频| 91亚洲资源网| 日本乱人伦一区| 91激情五月电影| 欧美久久一二三四区| 日韩三级.com| 国产亚洲欧美一级| 国产精品欧美久久久久一区二区| 久久久精品黄色| 中文字幕亚洲精品在线观看 | 国产精品毛片a∨一区二区三区| 精品国产电影一区二区| 久久一区二区三区四区| 亚洲三级电影网站| 欧美日韩一区二区电影| 欧美日韩一区久久| 欧美mv日韩mv国产网站app| 久久久精品tv| 亚洲午夜精品在线| 麻豆精品久久久| 国产成人午夜精品影院观看视频| 99riav久久精品riav| 欧美亚洲免费在线一区| 欧美激情中文不卡| 欧美精品一区二区蜜臀亚洲| 国产精品天天看| 亚洲一二三级电影| 国产亚洲欧洲一区高清在线观看| 亚洲欧洲综合另类| 蜜臀av亚洲一区中文字幕| 成人91在线观看| 欧美亚洲一区二区在线观看| 国产精品免费久久| 亚洲精品视频观看| 久久99精品久久久久婷婷| 99久久精品免费看| 精品日产卡一卡二卡麻豆| 国产精品色噜噜| 美女mm1313爽爽久久久蜜臀| www.久久久久久久久| 欧美一区二区三区免费观看视频| 日本一区二区在线不卡| 日韩高清在线观看| 成人免费毛片高清视频| 欧美日韩国产一二三| 国产精品美女久久久久久久久久久| 亚洲国产日韩a在线播放| 国产精品国产三级国产aⅴ入口| 亚洲另类在线一区| 国产盗摄女厕一区二区三区| 91麻豆精品国产无毒不卡在线观看 | 亚洲国产精品视频| 国产91精品一区二区麻豆网站 | 五月天久久比比资源色| 国产iv一区二区三区| 日韩欧美一二区| 午夜视频久久久久久| 91在线视频在线| 欧美国产日韩a欧美在线观看| 美女性感视频久久| 欧美精品乱人伦久久久久久| 国产精品人妖ts系列视频| 国产成人精品www牛牛影视| 日韩女优av电影| 首页综合国产亚洲丝袜| 欧美日韩国产天堂| 五月天国产精品| 这里只有精品免费| 日韩不卡一区二区| 欧美一区中文字幕| 美国十次了思思久久精品导航| 欧美精品tushy高清| 日韩av一级片| 欧美成人一区二区三区在线观看| 天天综合日日夜夜精品| 欧美一区二区在线免费播放| 日韩影院精彩在线| 日韩视频一区二区在线观看| 日本中文字幕一区| 亚洲精品一区二区精华| 欧美日本在线观看| 日本在线观看不卡视频| 国产综合久久久久久鬼色| 欧美精品三级在线观看| 日韩av成人高清| 久久久久久久精| 国产精品自在欧美一区| 亚洲国产精品二十页| 91在线观看免费视频| 在线影视一区二区三区| 成人av免费在线| 国产乱码精品一区二区三区五月婷| 亚洲成a人片在线不卡一二三区 | 亚洲国产日韩在线一区模特| 国产精品全国免费观看高清| 久久久噜噜噜久噜久久综合| 欧美电视剧在线看免费| 91精品国产一区二区三区香蕉| 欧美中文字幕久久| 一本一道波多野结衣一区二区| 成人在线视频首页| 成人黄色综合网站| 成人国产免费视频| thepron国产精品| 成人av网址在线| 成人看片黄a免费看在线| 国产一区二区视频在线| 精品一区二区免费在线观看| 毛片一区二区三区| 日韩国产高清在线| 美日韩一区二区三区| 麻豆91小视频| 蜜桃视频第一区免费观看| 美女视频一区二区三区| 蜜乳av一区二区三区| 精品夜夜嗨av一区二区三区| 国模套图日韩精品一区二区| 国模大尺度一区二区三区| 国产精品亚洲专一区二区三区| 国产一区二区视频在线播放| 懂色av中文一区二区三区| 成人av电影免费在线播放| 色婷婷亚洲综合| 欧美精品久久久久久久多人混战 | 欧美日韩亚洲综合一区| 欧美日韩一区不卡| 精品剧情v国产在线观看在线| 日韩欧美资源站| 国产日韩精品一区二区三区在线| 欧美国产亚洲另类动漫| 亚洲精品视频在线看| 视频一区视频二区中文字幕| 精品亚洲porn| 99视频超级精品| 欧美日韩大陆在线| 久久夜色精品国产噜噜av| 1024成人网色www| 亚洲福利国产精品| 国产综合色精品一区二区三区| 高清在线观看日韩| 欧日韩精品视频| 精品国产免费一区二区三区四区 | 国产欧美日韩亚州综合| 亚洲日本韩国一区| 麻豆中文一区二区| 色综合久久久久久久久| 日韩一区二区在线看| 国产午夜精品一区二区三区视频| 一区二区在线免费| 精品无人区卡一卡二卡三乱码免费卡 | 欧美综合欧美视频| 日韩欧美成人激情| 一区二区在线免费观看| 国内精品视频666| 欧美久久一二三四区| 中文字幕中文在线不卡住| 婷婷中文字幕综合| 91欧美激情一区二区三区成人| 日韩视频一区二区| 一区二区激情视频| 国产精选一区二区三区| 欧美精品1区2区3区| 中文字幕中文字幕一区二区| 国产一区二区三区综合| 欧美精品 日韩| 一区二区三区在线观看国产| 国产suv精品一区二区883| 欧美日韩国产一级| 亚洲综合视频在线| 暴力调教一区二区三区| 久久久久久毛片| 精品亚洲成a人| 日韩欧美国产成人一区二区| 亚洲国产精品久久久男人的天堂 | 亚洲精品中文在线影院| 成人一区二区在线观看| 久久视频一区二区| 韩国女主播成人在线| 欧美一区二区三区婷婷月色| 亚洲精品菠萝久久久久久久| 99久久精品久久久久久清纯| 国产香蕉久久精品综合网| 国产综合色精品一区二区三区| 欧美一卡二卡在线观看| 亚洲国产精品欧美一二99| 欧美特级限制片免费在线观看| 亚洲欧美一区二区久久 | 国产不卡一区视频| 久久免费电影网| 国产精品99久久久久久久vr| 精品不卡在线视频| 国产伦精品一区二区三区视频青涩| 欧美白人最猛性xxxxx69交| 美国三级日本三级久久99| 欧美电视剧在线看免费| 韩国一区二区三区| 日本一区二区免费在线|