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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? usbd_udphs.c

?? AT91SAM9263的USB Device端口驅(qū)動
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* ----------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2007, Atmel Corporation
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * - Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the disclaimer below in the documentation and/or
 * other materials provided with the distribution.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ----------------------------------------------------------------------------
 */ 

//------------------------------------------------------------------------------
//         Headers
//------------------------------------------------------------------------------

#include "USBD.h"
#include "USBDCallbacks.h"
#include "USBDDriver.h"
#include <board.h>
#include <pio/pio.h>
#include <utility/trace.h>
#include <utility/led.h>
#include <usb/common/core/USBEndpointDescriptor.h>
#include <usb/common/core/USBGenericRequest.h>
#include <usb/common/core/USBFeatureRequest.h>

#include <stdio.h>

#ifdef BOARD_USB_UDPHS

//------------------------------------------------------------------------------
//         Definitions
//------------------------------------------------------------------------------
#define NUM_IT_MAX       (AT91C_BASE_UDPHS->UDPHS_IPFEATURES & AT91C_UDPHS_EPT_NBR_MAX)
#define NUM_IT_MAX_DMA   ((AT91C_BASE_UDPHS->UDPHS_IPFEATURES & AT91C_UDPHS_DMA_CHANNEL_NBR)>>4)

#define SHIFT_DMA        24
#define SHIFT_INTERUPT    8


#define DMA

/// Max size of the FMA FIFO
#define DMA_MAX_FIFO_SIZE 65536

// Constants: Endpoint states
//   UDP_ENDPOINT_DISABLED - Endpoint is disabled.
//   UDP_ENDPOINT_HALTED - Endpoint is halted (i.e. STALLs every request).
//   UDP_ENDPOINT_IDLE - Endpoint is idle (i.e. ready for transmission).
//   UDP_ENDPOINT_SENDING - Endpoint is sending data.
//   UDP_ENDPOINT_RECEIVING - Endpoint is receiving data.
#define UDP_ENDPOINT_DISABLED       0
#define UDP_ENDPOINT_HALTED         1
#define UDP_ENDPOINT_IDLE           2
#define UDP_ENDPOINT_SENDING        3
#define UDP_ENDPOINT_RECEIVING      4

//------------------------------------------------------------------------------
//      Structures
//------------------------------------------------------------------------------

// Type: UDP transfer
//   Describes an ongoing transfer on a UDP endpoint.
//
// Variables:
//   data - Pointer to a data buffer used for emission/reception.
//   buffered - Number of bytes which have been written into the UDP internal
//              FIFO buffers.
//   transferred - Number of bytes which have been sent/received.
//   remaining - Number of bytes which have not been buffered/transferred yet.
//   callback - Optional callback to invoke when the transfer completes.
//   argument - Optional argument to the callback function.
typedef struct
{
    char             *pData;
    volatile int     buffered;
    volatile int     transferred;
    volatile int     remaining;
    TransferCallback fCallback;
    void             *pArgument;
} Transfer;

// Type: UDP endpoint
//   Describes the state of an endpoint of the UDP controller.
//
// Variables:
//   state - Current endpoint state.
//   bank - Current reception bank (0 or 1).
//   size - Maximum packet size for the endpoint.
//   transfer - Describes an ongoing transfer (if current state is either
//              <UDP_ENDPOINT_SENDING> or <UDP_ENDPOINT_RECEIVING>).
typedef struct
{
    unsigned char  state;
    unsigned char  bank;
    unsigned short size;
    Transfer       transfer;
} Endpoint;

//------------------------------------------------------------------------------
//         Internal variables
//------------------------------------------------------------------------------

// Variables: 
//   endpoints - Holds the internal state for each endpoint of the UDP.
//   deviceState - Device current state.
//   suspended - Indicates if device is currently suspended.
static Endpoint      endpoints[BOARD_USB_NUMENDPOINTS];
static unsigned char deviceState;
static unsigned char previousDeviceState;

// 7.1.20 Test Mode Support
static const char test_packet_buffer[] = {
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,                // JKJKJKJK * 9
    0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,                     // JJKKJJKK * 8
    0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,                     // JJJJKKKK * 8
    0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // JJJJJJJKKKKKKK * 8
    0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,                          // JJJJJJJK * 8
    0xFC,0x7E,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0x7E                 // {JKKKKKKK * 10}, JK
};

//------------------------------------------------------------------------------
//      Internal Functions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Disables the BIAS of the USB controller
//------------------------------------------------------------------------------
static inline void UDPHS_DisableBIAS( void )
{
    // For CAP9, SAM9RL, HS
#if !defined (BOARD_USB_NO_BIAS_COMMAND)
    AT91C_BASE_PMC->PMC_UCKR &= ~AT91C_CKGR_BIASEN_ENABLED;
#endif
}

//------------------------------------------------------------------------------
// Enables the BIAS of the USB controller
//------------------------------------------------------------------------------
static inline void UDPHS_EnableBIAS( void )
{
    // For CAP9, SAM9RL, HS
#if !defined (BOARD_USB_NO_BIAS_COMMAND)
    UDPHS_DisableBIAS();
    AT91C_BASE_PMC->PMC_UCKR |= AT91C_CKGR_BIASEN_ENABLED;
#endif
}

//------------------------------------------------------------------------------
// Enable UDPHS clock
// pUsb Pointer to a S_usb instance
//------------------------------------------------------------------------------
static inline void UDPHS_EnableUsbClock( void )
{
#if !defined (PMC_BY_HARD)
    AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDPHS);
    // Enable 480MHZ
    AT91C_BASE_CKGR->CKGR_UCKR |= (AT91C_CKGR_PLLCOUNT & (3 << 20)) | AT91C_CKGR_UPLLEN;
    // Wait until UTMI PLL is locked
    while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKU) == 0);
#endif
}

//------------------------------------------------------------------------------
// Disable UDPHS clock
// pUsb Pointer to a S_usb instance
//------------------------------------------------------------------------------
static inline void UDPHS_DisableUsbClock( void )
{
#if !defined (PMC_BY_HARD)
    AT91C_BASE_PMC->PMC_PCDR = (1 << AT91C_ID_UDPHS);
    // 480MHZ
    AT91C_BASE_CKGR->CKGR_UCKR &= ~AT91C_CKGR_UPLLEN;
#endif
}

//------------------------------------------------------------------------------
// Invokes the callback associated with a finished transfer on an
//         endpoint
// pEndpoint Pointer to a S_usb_endpoint instance
// bStatus   Status code returned by the transfer operation
//------------------------------------------------------------------------------
static void UDPHS_EndOfTransfer( unsigned char bEndpoint, char bStatus )
{
    Endpoint *pEndpoint = &(endpoints[bEndpoint]);
    Transfer *pTransfer = &(pEndpoint->transfer);

    // Check that endpoint was sending or receiving data
    if( (pEndpoint->state == UDP_ENDPOINT_RECEIVING)
     || (pEndpoint->state == UDP_ENDPOINT_SENDING) ) {

        trace_LOG(trace_DEBUG, "Eo");

        // Endpoint returns in Idle state
        pEndpoint->state = UDP_ENDPOINT_IDLE;

        // Invoke callback is present
        if (pTransfer->fCallback != 0) {

            ((TransferCallback) pTransfer->fCallback)
                (pTransfer->pArgument,
                 bStatus,
                 pTransfer->transferred,
                 pTransfer->remaining + pTransfer->buffered);
        }
    }
}

//------------------------------------------------------------------------------
// Clears the correct RX flag in an endpoint status register
// bEndpoint Index of endpoint
//------------------------------------------------------------------------------
static void UDPHS_ClearRxFlag( unsigned char bEndpoint )
{
    AT91C_BASE_UDPHS->UDPHS_EPT[bEndpoint].UDPHS_EPTCLRSTA = AT91C_UDPHS_RX_BK_RDY;
}

//------------------------------------------------------------------------------
// Transfers a data payload from the current tranfer buffer to the endpoint FIFO
// bEndpoint Index of endpoint
//------------------------------------------------------------------------------
static void UDPHS_WritePayload( unsigned char bEndpoint )
{
    Endpoint *pEndpoint = &(endpoints[bEndpoint]);
    Transfer *pTransfer = &(pEndpoint->transfer);
    char     *pFifo;
    signed int   size;
    unsigned int dCtr;

    pFifo = (char*)&(AT91C_BASE_UDPHS_EPTFIFO->UDPHS_READEPT0[bEndpoint*16384]);

    // Get the number of bytes to send
    size = pEndpoint->size;
    if (size > pTransfer->remaining) {

        size = pTransfer->remaining;
    }

    // Update transfer descriptor information
    pTransfer->buffered += size;
    pTransfer->remaining -= size;

    // Write packet in the FIFO buffer
    dCtr = 0;
    while (size > 0) {

        pFifo[dCtr] = *(pTransfer->pData);
        pTransfer->pData++;
        size--;
        dCtr++;
    }
}

//------------------------------------------------------------------------------
// Transfers a data payload from an endpoint FIFO to the current transfer buffer
// bEndpoint   Index of endpoint
// wPacketSize Size of received data packet
//------------------------------------------------------------------------------
static void UDPHS_ReadPayload( unsigned char bEndpoint, int wPacketSize )
{
    Endpoint *pEndpoint = &(endpoints[bEndpoint]);
    Transfer *pTransfer = &(pEndpoint->transfer);
    char     *pFifo;
    unsigned char dBytes=0;

    pFifo = (char*)&(AT91C_BASE_UDPHS_EPTFIFO->UDPHS_READEPT0[bEndpoint*16384]);

    // Check that the requested size is not bigger than the remaining transfer
    if (wPacketSize > pTransfer->remaining) {

        pTransfer->buffered += wPacketSize - pTransfer->remaining;
        wPacketSize = pTransfer->remaining;
    }

    // Update transfer descriptor information
    pTransfer->remaining -= wPacketSize;
    pTransfer->transferred += wPacketSize;

    // Retrieve packet
    while (wPacketSize > 0) {

        *(pTransfer->pData) = pFifo[dBytes];
        pTransfer->pData++;
        wPacketSize--;
        dBytes++;
    }
}


//------------------------------------------------------------------------------
// Transfers a received SETUP packet from endpoint 0 FIFO to the S_usb_request
// structure of an USB driver
//------------------------------------------------------------------------------
static void UDPHS_ReadRequest( USBGenericRequest *pRequest )
{
    unsigned int *pData = (unsigned int *)pRequest;
    unsigned int fifo;

    fifo = (AT91C_BASE_UDPHS_EPTFIFO->UDPHS_READEPT0[0]);
    *pData = fifo;
    fifo = (AT91C_BASE_UDPHS_EPTFIFO->UDPHS_READEPT0[0]);
    pData++;
    *pData = fifo;
    //trace_LOG(trace_ERROR, "SETUP: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n\r", pData[0],pData[1],pData[2],pData[3],pData[4],pData[5],pData[6],pData[7]);
}

//------------------------------------------------------------------------------
// This function reset all endpoint transfer descriptors
//------------------------------------------------------------------------------
static void UDPHS_ResetEndpoints( void )
{
    Endpoint *pEndpoint;
    Transfer *pTransfer;
    unsigned char bEndpoint;

    // Reset the transfer descriptor of every endpoint
    for( bEndpoint = 0; bEndpoint < BOARD_USB_NUMENDPOINTS; bEndpoint++ ) {

        pEndpoint = &(endpoints[bEndpoint]);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久你懂得1024| 国产成人精品免费| 亚洲国产视频直播| 亚洲国产精品自拍| 男人的j进女人的j一区| 蜜桃一区二区三区在线| 免费成人小视频| 欧美日韩午夜在线视频| 欧美一卡二卡三卡| 亚洲午夜久久久久| 国产一区二区不卡| 91老师国产黑色丝袜在线| 欧美日韩免费观看一区三区| 欧美一区在线视频| 中文一区一区三区高中清不卡| 中文字幕一区二区三区精华液| 一区二区久久久久久| 欧美激情一区二区三区蜜桃视频 | 国产精品午夜免费| 亚洲mv在线观看| 成人av电影在线| 精品播放一区二区| 亚洲mv大片欧洲mv大片精品| 成人午夜视频在线| 欧美一区二区在线免费观看| 国产精品污污网站在线观看| 亚洲综合丁香婷婷六月香| 风间由美性色一区二区三区| 国产91综合网| 日韩精品一区二| 日韩精品电影一区亚洲| 色成人在线视频| 国产调教视频一区| 亚洲综合精品久久| 一本到高清视频免费精品| 欧美激情一区二区三区全黄| 久久99国产精品久久| 欧美三级三级三级| 亚洲成人动漫在线观看| 91亚洲大成网污www| 国产精品乱码一区二三区小蝌蚪| 国产成人午夜精品影院观看视频| 精品久久久久久无| 国产一区在线观看视频| 国产日韩欧美精品一区| av综合在线播放| 一区二区三区在线视频免费观看| 欧美日韩免费观看一区二区三区 | 日本伊人色综合网| 欧美成人一区二区三区| 热久久国产精品| 亚洲精品一区二区精华| 成人视屏免费看| 亚洲一区二区三区四区不卡| 欧美日本免费一区二区三区| 国产在线播放一区三区四| 中文字幕中文字幕在线一区 | 中文字幕日本不卡| 欧美日韩高清在线播放| 国产一区二区女| 中文字幕日韩精品一区| 日韩精品一区二区三区视频| www.亚洲免费av| 蜜臀久久99精品久久久久久9| 亚洲色图清纯唯美| 日韩三级在线免费观看| 精品一二线国产| 欧美一级生活片| 在线不卡一区二区| 色综合天天综合给合国产| 亚洲成人精品在线观看| 国产精品乱码人人做人人爱| 777午夜精品免费视频| 99视频精品免费视频| 蜜桃视频在线观看一区| 亚洲精品免费播放| 国产精品白丝在线| 亚洲欧洲日韩av| 国产亚洲欧美色| 亚洲精品一区二区三区影院| 欧美一个色资源| 色综合网色综合| 在线观看视频91| 欧美性淫爽ww久久久久无| 色八戒一区二区三区| 96av麻豆蜜桃一区二区| 精品在线观看视频| 青青草91视频| 1024国产精品| 亚洲国产精品精华液ab| 欧美激情中文字幕一区二区| 国产精品黄色在线观看| 最新日韩av在线| 亚洲九九爱视频| 亚洲成人在线观看视频| 国内一区二区在线| 成人免费va视频| 色噜噜夜夜夜综合网| 亚洲免费观看高清| 夜夜操天天操亚洲| 看国产成人h片视频| 成人黄色在线看| 91精品国产欧美一区二区| 国产婷婷一区二区| 中文字幕的久久| 丝袜美腿高跟呻吟高潮一区| 日韩中文字幕91| 成人免费看片app下载| 欧美丝袜丝交足nylons图片| 久久久久久久久久久久电影 | 激情综合色综合久久综合| 日韩国产精品久久久久久亚洲| 国产成人精品午夜视频免费| 在线观看一区二区视频| 国产欧美日本一区二区三区| 久久不见久久见中文字幕免费| 色哟哟欧美精品| 国产精品女主播av| 国产综合色视频| 欧美电影在哪看比较好| 亚洲最新视频在线观看| 色综合咪咪久久| 国产精品网站一区| 99这里都是精品| 亚洲国产精品ⅴa在线观看| 蜜桃视频一区二区三区在线观看 | 中文字幕av一区 二区| 麻豆一区二区三| 久久精品一区二区三区四区| 韩国v欧美v日本v亚洲v| 久久久久亚洲综合| 国产成人午夜电影网| 久久精品一区二区三区av| 美女mm1313爽爽久久久蜜臀| 精品国产乱码久久久久久夜甘婷婷| 亚洲自拍偷拍欧美| 国产精品二三区| 欧美老肥妇做.爰bbww| 另类的小说在线视频另类成人小视频在线| 色狠狠桃花综合| 五月激情综合色| 精品国一区二区三区| 不卡的电视剧免费网站有什么| 亚洲在线视频网站| 精品国产凹凸成av人网站| a美女胸又www黄视频久久| 天天操天天色综合| 国产片一区二区| 欧美三区在线观看| 国产一区二区美女诱惑| 午夜av电影一区| 亚洲国产精品激情在线观看| 欧美日韩国产bt| 国产成人午夜高潮毛片| 亚洲综合在线免费观看| 欧美一区三区四区| 色成人在线视频| 国产综合色产在线精品| 亚洲一区二区三区四区五区中文| 国产无人区一区二区三区| 在线播放中文字幕一区| 不卡电影免费在线播放一区| 精一区二区三区| 一本一道久久a久久精品综合蜜臀| 国产亚洲欧美激情| 日韩一二在线观看| 日韩一区二区三区在线| 91精品国产欧美一区二区| 在线观看av一区| 91久久精品一区二区二区| 不卡电影免费在线播放一区| 蜜桃视频免费观看一区| 美女视频黄 久久| 久久成人免费电影| 国产成人av影院| 97精品国产露脸对白| 色婷婷av久久久久久久| 欧美日韩高清影院| 欧美精品v国产精品v日韩精品| 欧美午夜精品一区二区蜜桃| 精品1区2区3区| 日韩欧美成人激情| 国产精品福利一区二区三区| 亚洲人精品午夜| 美女www一区二区| 粉嫩在线一区二区三区视频| 99麻豆久久久国产精品免费| 欧美自拍丝袜亚洲| 精品国产伦一区二区三区免费| 国产日韩欧美a| 日日夜夜免费精品视频| 国产一区欧美二区| 欧美午夜寂寞影院| 日本一区二区视频在线| 中文字幕精品一区二区精品绿巨人| 中文字幕一区不卡| 国产精品福利电影一区二区三区四区| 久久蜜桃av一区精品变态类天堂| 国产精品欧美一区二区三区| 国产精品视频在线看|