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

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

?? usb_task.c

?? Atmel單片機的原理圖啊
?? C
字號:
/*C**************************************************************************
* NAME:         usb_task.c
*----------------------------------------------------------------------------
* Copyright (c) 2003 Atmel.
*----------------------------------------------------------------------------
* RELEASE:      snd1c-refd-nf-4_0_3
* REVISION:     1.16
*----------------------------------------------------------------------------
* PURPOSE: 
* This file contains the USB task and attached routines
*
* NOTES:
* Global Variables:
*   - gl_sbc_wr_protect:  write protect flag for SCSI disk
*****************************************************************************/

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

#include "config.h"                         /* system configuration */
#include "lib_mcu\usb\usb_drv.h"            /* usb driver definition */
#include "lib_mcu\kbd\kbd_drv.h"            /* Keyboard driver definition */
#include "lib_mcu\clock\clock.h"            /* clock definition */
#include "lib_mcu\wdt\wdt_drv.h"
#include "modules\display\disp.h"           /* display definition */
#include "modules\mode\mode_task.h"         /* mode task definition */
#include "modules\mem\hard.h"               /* low level function definition */
#include "lib_storage\sbc.h"                /* SBC commands definition */
#include "usb_task.h"                       /* usb task definition */


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


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

extern  bdata   bit     gl_sbc_wr_protect;  /* mass storage write protected */

static  bdata   bit     disconnected;
static  idata   Byte    dCBWTag[4];

static  bdata   bit     no_data_phase;

static  bdata   bit     ms_multiple_drive;  /* TRUE: multiple drive support */

static  idata   Byte    usb_resume_counter;

bdata   bit     bmCBWFlag7;                 /* Data OUT (0) or Data In (1) */
bdata   bit     status_ready;
data    Byte    status;
data    Uint32  dCBWDataTransferLength;     /* usb data message length */
bdata   bit     rx_bank;


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

#if MEM_CHIP_TYPE != CHIP_NONE
  extern  void    Sbc_chip_init (void);     /* chip memory SCSI driver init */
  extern  void    Sbc_command_chip (void);  /* chip memory SCSI command browser */
#endif
#if MEM_CARD_TYPE != CARD_NONE
  extern  void    Sbc_card_init (void);     /* card memory SCSI driver init */
  extern  void    Sbc_command_card (void);  /* card memory SCSI command browser */
#endif

static  void usb_mass_storage_cbw (void);
static  void usb_mass_storage_csw (void);


/*F**************************************************************************
* NAME: usb_task_init
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   USB task initialization
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE: 
*----------------------------------------------------------------------------
* REQUIREMENTS: 
*****************************************************************************/
void usb_task_init (void)
{
  disconnected = 0;
  clock_usb_init();                         /* for suspend detection */
  usb_init();
}


/*F**************************************************************************
* NAME: usb_task
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   USB task
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   In order to avoid spurious connection, resume is done after the resume
*   event has been detected at least #USB_WAIT_NB_RESUME times.
*----------------------------------------------------------------------------
* REQUIREMENTS: 
*****************************************************************************/
void usb_task (void)
{
  if (Usb_suspend())                        /* -- if suspend flag -- */
  {
    if (disconnected == 0)
    {
      disconnected = 1;
      clock_disable();
      mode_exit_download();
      usb_resume_counter = USB_WAIT_NB_RESUME;
    }

    if (Usb_resume())                       /* check if resume */
    {
      if (usb_resume_counter == 0)
      {
        mode_set_download();
        clock_usb_init();
        print_mode_mass();                    /* display mass storage icon */
        print_screen(MASS_SCREEN);            /* display storage screen */
        disconnected = 0;
        Usb_clear_SPINT();
        Usb_clear_WUPCPU();
        Usb_clear_SOFINT();
      }
      else
      {
        Usb_clear_WUPCPU();
        Usb_clear_SOFINT();
        usb_resume_counter--;
      }
    }
  }
  else
  {
    if (Usb_reset())                        /* if end of reset */
    {
      Usb_enable_SPINT();                   /* Suspend interrupt enable */
      disconnected = 0;
      Usb_clear_rx_bank();
      Usb_clear_WUPCPU();
      Usb_clear_SPINT();
      Usb_clear_EORINT();
      ms_multiple_drive = FALSE;            /* multiple disk support init */
      gl_sbc_wr_protect = Kbd_key_locked(); /* set write protect flag */
      Sbc_chip_init();                      /* on-board memory SCSI driver init */
      Sbc_card_init();                      /* card memory SCSI driver init */


    }

    if (UEPINT != 0)                        /* new command */
    {
      Usb_select_ep(EP_CONTROL);
      if (Usb_setup_received())
      {
        usb_enumeration_process();
      }
      Usb_select_ep(EP_OUT);
      if (Usb_rx_complete())
      { 
        gl_sbc_wr_protect = Kbd_key_locked(); /* set write protect flag */
        Usb_enable_int();
        usb_mass_storage_cbw();
        usb_mass_storage_csw();
        Usb_disable_int();
      }
    }
  }
}


/*F**************************************************************************
* NAME: usb_mass_storage_cbw
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   Command Block Wrapper management
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS: 
*****************************************************************************/
void usb_mass_storage_cbw (void)
{
bit cbw_error;

  cbw_error = FALSE;
  Usb_select_ep(EP_OUT);
  if (0x55 != Usb_read_byte()) 
  {
    cbw_error = TRUE;
  }
  if (0x53 != Usb_read_byte()) 
  {
    cbw_error = TRUE;
  }
  if (0x42 != Usb_read_byte()) 
  {
    cbw_error = TRUE;
  }
  if (0x43 != Usb_read_byte())              /* check if dCBWSignature is correct */
  {
    cbw_error = TRUE;
  }
            
  dCBWTag[0] = Usb_read_byte();             /* Store Tag to be repeated in CSW */
  dCBWTag[1] = Usb_read_byte();
  dCBWTag[2] = Usb_read_byte();
  dCBWTag[3] = Usb_read_byte();
  ((Byte*)&dCBWDataTransferLength)[3] = Usb_read_byte();
  ((Byte*)&dCBWDataTransferLength)[2] = Usb_read_byte();
  ((Byte*)&dCBWDataTransferLength)[1] = Usb_read_byte();
  ((Byte*)&dCBWDataTransferLength)[0] = Usb_read_byte();
  if (Usb_read_byte() != 0x00)              /* store bmCBWFlags.bit7 */
  {
    Usb_CBWFlag_in();
    if (cbw_error)
    {
      Usb_clear_RXOUT_PP();
      Usb_select_ep(EP_IN);
      Usb_set_STALLRQ();
      return;
    }
  }
  else
  {
    Usb_CBWFlag_out();
    if (cbw_error)
    {
      Usb_clear_RXOUT_PP();
      Usb_set_STALLRQ();
      return;
    }
  }

  if (ms_multiple_drive)
  { /* multiple drive supported */
    if (Usb_read_byte() == 0)
    { /* LUN = 0 */
      ACC = Usb_read_byte();                /* dummy CBWCBLength read */
      Usb_clear_no_data_phase();
      Sbc_command_chip();
    }
    else
    { /* LUN = 1 */
      ACC = Usb_read_byte();                /* dummy CBWCBLength read */
      Usb_clear_no_data_phase();
      Sbc_command_card();
    }
  }
  else
  { /* only 1 drive supported */
    ACC = Usb_read_byte();                  /* dummy LUN read */
    ACC = Usb_read_byte();                  /* dummy CBWCBLength read */
    Usb_clear_no_data_phase();

    if (gl_memory == MEM_CHIP)
    { /* on-board memory */
      Sbc_command_chip();
    }
    else
    { /* memory card */
      Sbc_command_card();
    }
  }
}


/*F**************************************************************************
* NAME: usb_mass_storage_csw
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   Command Status Wrapper management
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*
* REQUIREMENTS: 
*****************************************************************************/
void usb_mass_storage_csw (void)
{
  Usb_select_ep(EP_IN);
  while (Usb_STALL_requested())
  {
    Usb_select_ep(EP_CONTROL);
    if (Usb_setup_received())
    {
      usb_enumeration_process();
    }
    Usb_select_ep(EP_IN);
  }

  Usb_select_ep(EP_OUT);
  while (Usb_STALL_requested())
  {
    Usb_select_ep(EP_CONTROL);
    if (Usb_setup_received())
    {
      usb_enumeration_process();
    }
    Usb_select_ep(EP_OUT);
  }

  Usb_clear_no_data_phase();
  Usb_clear_status_ready();
  Usb_select_ep(EP_IN);
  Usb_write_byte(0x55);
  Usb_write_byte(0x53);
  Usb_write_byte(0x42);
  Usb_write_byte(0x53);

  Usb_write_byte(dCBWTag[0]);
  Usb_write_byte(dCBWTag[1]);
  Usb_write_byte(dCBWTag[2]);
  Usb_write_byte(dCBWTag[3]);
  Usb_write_byte(((Byte*)&dCBWDataTransferLength)[3]);
  Usb_write_byte(((Byte*)&dCBWDataTransferLength)[2]);
  Usb_write_byte(((Byte*)&dCBWDataTransferLength)[1]);
  Usb_write_byte(((Byte*)&dCBWDataTransferLength)[0]);
  Usb_write_byte(status);
  Usb_set_TXRDY();

  Usb_select_ep(EP_IN);
  while (!Usb_tx_complete());
  Usb_clear_TXCMPL();
}


/*F**************************************************************************
* NAME: usb_mass_storage_reset
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   This function handles the mass storage reset command
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS: 
*****************************************************************************/
void usb_mass_storage_reset (void)
{
  Usb_clear_RXSETUP();
  Usb_set_TXRDY();
  while (!(Usb_tx_complete()));
  Usb_clear_TXCMPL();
}


/*F**************************************************************************
* NAME: usb_mass_storage_get_lun
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE: 
*   This function returns the mass storage class specific Logical Unit Number.
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS: 
*****************************************************************************/
void usb_mass_storage_get_lun (void)
{
  Usb_clear_RXSETUP();
  Usb_set_DIR();
  Usb_write_byte(MS_MAX_LUN);
  Usb_set_TXRDY();
  while (!(Usb_tx_complete()));
  Usb_clear_TXCMPL();
  while (!(Usb_rx_complete()));
  Usb_clear_RXOUT();
  Usb_clear_DIR();
#if (MS_MAX_LUN != 0)
  ms_multiple_drive = TRUE;                 /* multiple disk support */
  print_screen(MASS_SCREEN_NO_MEM);         /* memory icon off */
#endif
}


/*F**************************************************************************
* NAME: usb_it_suspend
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
*   USB suspend interrupt function -> reset
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   IRQ_USB defined in extsnd1.h
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
Interrupt (usb_it_suspend(void), IRQ_USB) 
{
  if (Usb_suspend())
  {
    Wdt_enable(0);
    while (1);
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩不卡一区二区| 中文字幕av资源一区| 日韩精品在线一区| 中文字幕乱码一区二区免费| 亚洲风情在线资源站| 国产一区二区不卡| 欧美日精品一区视频| 日本一区二区三级电影在线观看 | 91偷拍与自偷拍精品| 日韩欧美成人一区二区| 亚洲欧美偷拍卡通变态| 国内欧美视频一区二区| 欧美一级免费观看| 国产精品 日产精品 欧美精品| 成人激情文学综合网| 欧美变态tickling挠脚心| 波多野结衣在线一区| 午夜不卡在线视频| 成人av在线播放网址| 久久先锋影音av鲁色资源网| 午夜精品久久久久久久久| 亚洲午夜激情av| 亚洲三级在线观看| 久久久国产一区二区三区四区小说 | 偷窥少妇高潮呻吟av久久免费| 欧美大片日本大片免费观看| 亚洲免费高清视频在线| 国产麻豆午夜三级精品| 欧美一级在线观看| 一区二区三区美女| 91无套直看片红桃| 国产精品三级av在线播放| 狠狠色丁香婷婷综合久久片| 欧美一卡二卡三卡四卡| 日韩国产高清在线| 欧美一级电影网站| 麻豆精品一区二区av白丝在线| 欧美美女黄视频| 日韩专区中文字幕一区二区| 6080亚洲精品一区二区| 日韩中文字幕麻豆| 8v天堂国产在线一区二区| 午夜婷婷国产麻豆精品| 欧美乱妇20p| 日本三级韩国三级欧美三级| 日韩一区二区三区在线视频| 国产一区二区三区免费播放| 久久久亚洲精品一区二区三区| 国产九九视频一区二区三区| 亚洲国产成人在线| 色哟哟精品一区| 亚洲va中文字幕| 欧美videofree性高清杂交| 激情久久五月天| 国产精品久久久久久久久晋中| 99re亚洲国产精品| 一区二区三区国产| 91麻豆精品久久久久蜜臀 | 色哟哟亚洲精品| 亚洲国产精品一区二区久久| 制服丝袜亚洲网站| 九九九久久久精品| 日本一区二区三区免费乱视频| 99久久精品情趣| 久久久久国产免费免费| 亚洲国产欧美另类丝袜| 成人av影视在线观看| 欧美优质美女网站| 久久久高清一区二区三区| 亚洲综合色视频| 成人av综合一区| 欧美一级免费大片| 亚洲国产综合视频在线观看| 国产一区二区久久| 欧美日韩国产免费| 亚洲成人动漫在线免费观看| 久久不见久久见中文字幕免费| 欧美激情一区二区三区在线| 欧美在线观看一区二区| 国产在线国偷精品产拍免费yy| 日韩高清不卡在线| 国产精品久久毛片| 日韩一级精品视频在线观看| av在线一区二区| 国内一区二区视频| 亚洲国产精品人人做人人爽| 欧美国产1区2区| 精品国产乱码久久久久久蜜臀| 色丁香久综合在线久综合在线观看 | 一区二区三区免费| 久久天堂av综合合色蜜桃网| 欧美视频一区二区三区在线观看| 国产精品系列在线观看| 日韩精品欧美精品| 亚洲视频电影在线| 国产精品无人区| 久久九九全国免费| 精品国产乱码久久久久久久| 欧美一区午夜视频在线观看| 欧美综合久久久| 99久久久久免费精品国产| 国产精品88av| 国产一区二区三区国产| 美女网站在线免费欧美精品| 婷婷中文字幕一区三区| 亚洲精品五月天| 亚洲欧美日韩中文播放 | 中文字幕av一区二区三区高| 精品免费一区二区三区| 日韩区在线观看| 欧美精选在线播放| 欧美猛男gaygay网站| 在线观看视频一区二区| 欧美伊人久久久久久久久影院 | 亚洲一区二区在线视频| 亚洲人一二三区| 亚洲视频你懂的| 一区二区三区加勒比av| 一区二区三区视频在线观看| 玉米视频成人免费看| 一区二区三区中文在线| 夜夜揉揉日日人人青青一国产精品| 亚洲人成影院在线观看| 亚洲综合丁香婷婷六月香| 亚洲免费看黄网站| 亚洲综合网站在线观看| 午夜一区二区三区在线观看| 日本精品免费观看高清观看| 色婷婷久久99综合精品jk白丝| 色琪琪一区二区三区亚洲区| 欧美在线观看视频在线| 欧美日韩国产首页| 欧美一区二区高清| 亚洲精品一区二区三区99| 国产午夜精品在线观看| 中文字幕在线一区二区三区| 一区二区三区91| 蜜臂av日日欢夜夜爽一区| 久久精品国产在热久久| 国产馆精品极品| 色综合久久88色综合天天6 | 一本一道综合狠狠老| 在线观看网站黄不卡| 日韩欧美一区在线| 国产午夜亚洲精品理论片色戒| 亚洲免费在线视频| 蜜桃视频在线观看一区二区| 国产99精品视频| 欧美综合久久久| 国产三级三级三级精品8ⅰ区| 亚洲免费在线观看| 精品综合免费视频观看| 91在线国产福利| 欧美不卡在线视频| 亚洲欧美日韩成人高清在线一区| 蜜桃av一区二区在线观看| 99re66热这里只有精品3直播 | 国产一区二区视频在线| www.欧美.com| 亚洲精品一区二区在线观看| 亚洲免费观看视频| 国产一区二区成人久久免费影院| 欧美性色aⅴ视频一区日韩精品| 欧美精品一区二区三区四区 | 国产成人av一区| 欧美裸体一区二区三区| 国产精品乱人伦中文| 日日夜夜免费精品| 91亚洲精品久久久蜜桃网站| 精品国产区一区| 午夜日韩在线电影| 99久久99久久免费精品蜜臀| 精品日韩av一区二区| 亚洲高清在线视频| 91美女在线视频| 国产片一区二区| 久久99九九99精品| 欧美一级理论片| 亚洲成在人线免费| 91麻豆国产香蕉久久精品| 国产无一区二区| 国产综合久久久久久鬼色| 在线不卡欧美精品一区二区三区| 亚洲女人****多毛耸耸8| 国产盗摄女厕一区二区三区| 欧美电视剧免费观看| 午夜精品久久久久久久| 91视视频在线观看入口直接观看www| 久久亚洲一级片| 久久精品国产77777蜜臀| 欧美日韩国产综合视频在线观看 | 中文字幕亚洲成人| 国产精品正在播放| 图片区小说区国产精品视频| 日本精品一级二级| 玉米视频成人免费看| 色激情天天射综合网| 一区二区三区**美女毛片| 日本韩国欧美在线| 亚洲另类在线视频|