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

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

?? f320_usb_common.c

?? USB_Audio c8051Fxxx
?? C
?? 第 1 頁 / 共 2 頁
字號:
//-----------------------------------------------------------------------------
// F320_USB_Common.c
//-----------------------------------------------------------------------------
// Copyright 2005 Silicon Laboratories, Inc.
// http://www.silabs.com
//
// Program Description:
//
// This is the module that handles common USB functions, including primary USB
// interrupt service routine, an endpoint zero handler, and fifo read and write
// routines.
//
//
// FID:            32X000070
// Target:         C8051F320
// Tool chain:     KEIL C51 7.0.0.1 / KEIL A51 7.0.0.1
//                 Silicon Laboratories IDE version 2.3
// Command Line:   See Readme.txt
// Project Name:   F320_TONE_GENERATOR
//
// Release 1.0
//    -Initial Revision (PD)
//    -05 JUL 2006
//
//

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------

#include "c8051f320.h"                 // SFR declarations
#include "F320_Tone_Generator_Main.h"  // Main project header
#include "F320_USB_Register.h"         // USB core register header
#include "F320_USB_Common.h"           // USB protocol header
#include "F320_USB_Descriptor.h"       // USB descriptor definitions
#include "F320_SineWaveGenerator.h"



//-----------------------------------------------------------------------------
// Variable Declaration
//-----------------------------------------------------------------------------

idata setup_buffer Setup;              // Buffer for device request
idata BYTE USB_State;                  // Holds the USB State
idata unsigned int DataSize;           // Size of data to return
idata unsigned int DataSent;           // Amount of data sent
idata BYTE* DataPtr;                   // Pointer to data
// Endpoint status array
idata BYTE Ep_Status[4] = { EP_IDLE, EP_IDLE, EP_IDLE, EP_IDLE };

sbit LED1 = P2^3;
sbit LED2 = P2^2;


//-----------------------------------------------------------------------------
// Local Functions
//-----------------------------------------------------------------------------
void IsochronousTimer_Start(void);
void IsochronousTimer_Reset(void);
void IsochronousTimer_Stop(void);


//-----------------------------------------------------------------------------
// Usb_ISR
//
// Return Value : None
// Parameters   : None
//
// Called after any USB type interrupt, this handler determines which type of
// interrupt occurred, and calls the specific routine to handle it.
//
//-----------------------------------------------------------------------------
void Usb_ISR (void) interrupt 8 using USB_REGISTER_BANK
{
   data BYTE bCommon, bIn, bOut, ControlReg;
   POLL_READ_BYTE (CMINT, bCommon);    // Read all interrupt registers   POLL_READ_BYTE (IN1INT, bIn);       // this read also clears the register
   POLL_READ_BYTE (OUT1INT, bOut);

   LED1 = 0;

   if (bCommon)
   {
      if (bCommon & rbSOF)
      {
         POLL_WRITE_BYTE (INDEX, 3);
         POLL_READ_BYTE (EINCSR1, ControlReg);


         if (ControlReg & rbInUNDRUN)
         {
            // Clear under run bit
            POLL_WRITE_BYTE (EINCSR1, 0x00);
            Turn_On_Stream ();
            IsochronousTimer_Start();
         }
      }


      if (bCommon & rbRSTINT) Usb_Reset ();
      if (bCommon & rbSUSINT) Usb_Suspend ();
   }
   if (bIn & rbEP0)
   {
      // Handle Setup packet received or transmitted
      Handle_Setup ();
   }

   if (bIn & rbIN3)
   {
      IsochronousTimer_Reset();
      Handle_In3 ();     // Handle In Packet sent
   }

   if (bOut & rbOUT2)
   {
      bOut++;
   }
}

//-----------------------------------------------------------------------------
// Usb_Reset
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// Clears USB inhibit bit and sets endpoint states to default.
//
//-----------------------------------------------------------------------------
void Usb_Reset (void) using USB_REGISTER_BANK
{
   USB_State = DEV_DEFAULT;            // Set device state to default

   // Clear USB inhibit bit, enable suspend detection, turn off ISO update
   POLL_WRITE_BYTE (POWER, 0x01);

   Ep_Status[0] = EP_IDLE;             // Set default Endpoint Status
   Ep_Status[1] = EP_HALT;
   Ep_Status[2] = EP_HALT;
   Ep_Status[3] = EP_HALT;
}

//-----------------------------------------------------------------------------
// Handle_Setup
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// Decodes incoming setup requests, loads data packets on fifo in transmit
// mode, and retrieves data from fifo in receive mode.
//
//-----------------------------------------------------------------------------
void Handle_Setup (void) using USB_REGISTER_BANK
{
   data BYTE ControlReg;               // Storage for EP control register

   POLL_WRITE_BYTE (INDEX, 0);         // Set Index to Endpoint Zero
   POLL_READ_BYTE (E0CSR, ControlReg); // Read control register

   // Handle Status Phase of Set Address command
   if (Ep_Status[0] == EP_ADDRESS)
   {
      POLL_WRITE_BYTE (FADDR, Setup.wValue.c[LSB]);
      Ep_Status[0] = EP_IDLE;
   }

   // If last packet was a sent stall, reset STSTL bit and return EP0 to idle
   if (ControlReg & rbSTSTL)
   {
      POLL_WRITE_BYTE (E0CSR, 0);
      Ep_Status[0] = EP_IDLE;
      return;
   }

   // If last setup transaction was ended prematurely set Serviced Setup End
   // bit and return EP0 to idle state
   if (ControlReg & rbSUEND)
   {
      POLL_WRITE_BYTE (E0CSR, rbSSUEND);
      Ep_Status[0] = EP_IDLE;
   }

   if (Ep_Status[0] == EP_IDLE)        // If Endpoint 0 is in idle mode
   {
      // Make sure that EP 0 has an Out Packet ready from host although if EP0
      // is idle, this should always be the case
      if (ControlReg & rbOPRDY)
      {
         // Get Setup Packet off of Fifo, it is currently Big-Endian
         FIFO_Read (FIFO_EP0, 8, (BYTE *)&Setup);

         Setup.wValue.i = Setup.wValue.c[MSB] + 256*Setup.wValue.c[LSB];
         Setup.wIndex.i = Setup.wIndex.c[MSB] + 256*Setup.wIndex.c[LSB];
         Setup.wLength.i = Setup.wLength.c[MSB] + 256*Setup.wLength.c[LSB];

         if ((Setup.bmRequestType & TYPE_MASK) == CLASS_TYPE)
		   {
            // Call correct subroutine to handle each kind of
            // class-specific request
            switch (Setup.bRequest)
            {
               case GET_CUR:           Get_Cur ();           break;
               case SET_IDLE:          Set_Idle ();          break;

               // The Get Report HID command type has an overlap
               // with Set Cur in audio driver, the request type
               // can be used to tell the difference.
               case GET_REPORT:
                  if (Setup.bmRequestType & 0x80)
                  {
                     Get_Report ();
                  }
                  else Set_Cur ();
                  break;
               case SET_REPORT:        Set_Report ();        break;

               // Send stall to host if invalid request
               default:                Force_Stall ();       break;

            }
         }
   		else
   		{
            // Call correct subroutine to handle each kind of
            // standard request
            switch (Setup.bRequest)
            {
               case GET_STATUS:        Get_Status ();        break;
               case CLEAR_FEATURE:     Clear_Feature ();     break;
               case SET_FEATURE:       Set_Feature ();       break;
               case SET_ADDRESS:       Set_Address ();       break;
               case GET_DESCRIPTOR:    Get_Descriptor ();    break;
               case GET_CONFIGURATION: Get_Configuration (); break;
               case SET_CONFIGURATION: Set_Configuration (); break;
               case GET_INTERFACE:     Get_Interface ();     break;
               case SET_INTERFACE:     Set_Interface ();     break;

               // Send stall to host if invalid request
               default:                Force_Stall ();       break;
            }
         }
      }
   }

   if (Ep_Status[0] == EP_TX)          // See if endpoint should transmit
   {
      if (!(ControlReg & rbINPRDY))    // Don't overwrite last packet
      {
         POLL_READ_BYTE (E0CSR, ControlReg);

         // Check to see if Setup End or Out Packet received, if so do not put
         // any new data on FIFO
         if ((!(ControlReg & rbSUEND)) || (!(ControlReg & rbOPRDY)))
         {
            // Add In Packet ready flag to E0CSR bitmask
            ControlReg = rbINPRDY;
            if (DataSize >= EP0_PACKET_SIZE)
            {
               // Break Data into multiple packets if larger than Max Packet
               FIFO_Write (FIFO_EP0, EP0_PACKET_SIZE, (BYTE *)DataPtr);
               DataPtr  += EP0_PACKET_SIZE;
               DataSize -= EP0_PACKET_SIZE;
               DataSent += EP0_PACKET_SIZE;
            }
            else
            {
               // If data is less than Max Packet size or zero
               FIFO_Write (FIFO_EP0, DataSize, (BYTE *)DataPtr);
               ControlReg |= rbDATAEND;
               Ep_Status[0] = EP_IDLE;
            }
            if (DataSent == Setup.wLength.i)
            {
               // This case exists when the host requests an even multiple of
               // your endpoint zero max packet size, and you need to exit

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一级特黄大欧美久久久| 国产精品国产馆在线真实露脸 | 中文字幕日本乱码精品影院| 福利电影一区二区| 亚洲欧洲韩国日本视频| 日本乱人伦aⅴ精品| 天堂久久一区二区三区| 日韩精品一区二区三区视频| 国产精品一区二区果冻传媒| 亚洲国产成人一区二区三区| 一本到不卡精品视频在线观看| 丝袜美腿成人在线| 久久久久久电影| 91麻豆高清视频| 亚洲综合精品自拍| 欧美成人aa大片| 97久久精品人人做人人爽| 亚洲成a人在线观看| 精品剧情在线观看| 99久久久无码国产精品| 五月天精品一区二区三区| 久久亚洲精品国产精品紫薇| 色婷婷国产精品久久包臀| 日本网站在线观看一区二区三区| 精品国产一区二区精华 | 成人h版在线观看| 亚洲一区二区三区在线| 精品国产一区二区国模嫣然| 色综合久久精品| 国产专区欧美精品| 综合激情成人伊人| 欧美精品一区二区高清在线观看 | 2014亚洲片线观看视频免费| 99在线精品一区二区三区| 天天色综合成人网| 国产精品久久久久7777按摩| 欧美女孩性生活视频| 成人精品视频一区二区三区尤物| 日韩黄色片在线观看| 亚洲欧洲三级电影| 精品国产一区二区三区久久影院| 欧美在线免费视屏| 国产高清亚洲一区| 日韩av电影免费观看高清完整版 | 视频一区视频二区中文字幕| 国产精品久久久久久久久久久免费看 | 中文字幕中文字幕在线一区| 日韩精品一区在线| 欧美性淫爽ww久久久久无| 成人午夜av电影| 六月丁香婷婷色狠狠久久| 一区二区三区欧美亚洲| 国产精品色婷婷| 精品国产91亚洲一区二区三区婷婷| 欧美综合视频在线观看| av一本久道久久综合久久鬼色| 国产在线日韩欧美| 另类小说色综合网站| 日韩在线卡一卡二| 午夜亚洲国产au精品一区二区| 亚洲美女在线一区| 亚洲色欲色欲www| 国产精品国产a级| 中文字幕不卡在线| 欧美激情综合五月色丁香小说| 精品美女一区二区三区| 精品国内片67194| 日韩欧美一区二区免费| 欧美一区二区黄| 日韩欧美中文一区| 日韩欧美在线不卡| 精品久久久久久久久久久院品网| 日韩欧美一级二级三级久久久| 日韩一二三四区| 精品久久久久香蕉网| 精品国产精品一区二区夜夜嗨| 精品久久久网站| 久久久久成人黄色影片| 日本一区二区三区久久久久久久久不 | 欧美群妇大交群中文字幕| 在线免费不卡电影| 在线播放亚洲一区| 91精品一区二区三区在线观看| 欧美精品一卡两卡| 精品粉嫩超白一线天av| 久久精品在线观看| 中文字幕日韩欧美一区二区三区| 亚洲人成影院在线观看| 亚洲一区在线电影| 人人狠狠综合久久亚洲| 国产精品自拍在线| 91一区二区三区在线播放| 欧美性大战xxxxx久久久| 欧美顶级少妇做爰| 国产三级精品视频| 一区二区三区精密机械公司| 天天影视网天天综合色在线播放| 久久国产乱子精品免费女| 国产成人午夜精品影院观看视频| 成人国产精品视频| 欧美精品欧美精品系列| 久久蜜桃一区二区| 亚洲乱码中文字幕综合| 日韩精彩视频在线观看| 国产a区久久久| 欧美日韩精品一区二区天天拍小说| 制服.丝袜.亚洲.中文.综合| 久久久亚洲精华液精华液精华液| 国产精品日日摸夜夜摸av| 亚洲一区二区三区在线看| 国产一区二区三区免费看 | 91精品婷婷国产综合久久性色| 日韩精品一区二区三区视频播放| 国产精品久久久久久久第一福利 | 日韩美女在线视频| 国产精品国产三级国产aⅴ入口| 亚洲第一在线综合网站| 国产成人精品一区二区三区四区| 在线观看视频91| 国产日韩欧美综合在线| 亚洲成人av一区二区| 丁香激情综合五月| 日韩美女视频在线| 亚洲精品中文字幕在线观看| 精品一区二区三区在线观看 | 欧美高清视频一二三区| 中文字幕 久热精品 视频在线| 日韩经典中文字幕一区| 91日韩一区二区三区| 久久久精品免费网站| 日韩av二区在线播放| 色狠狠av一区二区三区| 欧美国产日本韩| 精品一区二区三区蜜桃| 精品1区2区3区| 国产精品视频yy9299一区| 激情综合色综合久久| 88在线观看91蜜桃国自产| 亚洲欧美电影院| 成人黄色网址在线观看| 精品国产乱码久久久久久蜜臀| 亚洲成av人片在www色猫咪| 91蜜桃网址入口| 国产欧美综合色| 激情综合五月天| 日韩欧美一级二级三级| 日韩成人精品视频| 欧美日韩aaa| 亚洲狠狠爱一区二区三区| 91丨porny丨蝌蚪视频| 国产欧美日韩精品一区| 国产一区三区三区| 精品国产一区二区三区久久影院| 欧美a一区二区| 69av一区二区三区| 亚洲第一电影网| 欧美日韩国产一级二级| 一区二区视频在线| 色诱亚洲精品久久久久久| 成人欧美一区二区三区视频网页 | 亚洲一二三四久久| 成人黄色软件下载| 国产精品电影院| 99热在这里有精品免费| 亚洲日本韩国一区| 91小宝寻花一区二区三区| 亚洲免费观看高清完整版在线观看熊| 成人激情图片网| 亚洲日本电影在线| 在线看日本不卡| 午夜视频在线观看一区二区| 欧美日韩一区久久| 日韩国产在线一| 日韩精品一区二区三区三区免费 | 亚洲欧洲韩国日本视频| 91亚洲精品一区二区乱码| 夜夜操天天操亚洲| 欧美日本高清视频在线观看| 奇米综合一区二区三区精品视频| 日韩午夜在线观看视频| 国内精品嫩模私拍在线| 国产欧美va欧美不卡在线 | 欧美片网站yy| 久久激情五月婷婷| 国产亚洲精品aa| 91麻豆免费视频| 五月激情综合色| 欧美不卡激情三级在线观看| 国产成a人亚洲精品| 亚洲精品欧美激情| 欧美一三区三区四区免费在线看| 美腿丝袜亚洲一区| 国产欧美日本一区二区三区| 色婷婷亚洲精品| 九色|91porny| 亚洲蜜臀av乱码久久精品| 欧美一级欧美一级在线播放| 国产宾馆实践打屁股91| 亚洲国产乱码最新视频| 久久九九国产精品|