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

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

?? hiddkeyboarddriver.c

?? IAR5.2下 AT91SAM9260 ARM 對 MCP2515 控制源化碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* ----------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2008, 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.
 *
 * 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 "HIDDKeyboardDriver.h"
#include "HIDDKeyboardDriverDescriptors.h"
#include "HIDDKeyboardCallbacks.h"
#include "HIDDKeyboardInputReport.h"
#include "HIDDKeyboardOutputReport.h"
#include <utility/trace.h>
#include <usb/common/core/USBGetDescriptorRequest.h>
#include <usb/common/hid/HIDGenericDescriptor.h>
#include <usb/common/hid/HIDDescriptor.h>
#include <usb/common/hid/HIDGenericRequest.h>
#include <usb/common/hid/HIDReportRequest.h>
#include <usb/common/hid/HIDIdleRequest.h>
#include <usb/common/hid/HIDKeypad.h>
#include <usb/device/core/USBD.h>
#include <usb/device/core/USBDDriver.h>

//------------------------------------------------------------------------------
//         Internal types
//------------------------------------------------------------------------------
/*
    Type: HIDDKeyboardDriver
        Driver structure for an HID device implementing keyboard functionalities.

    Variables:
        usbdDriver - Standard USB device driver instance.
        inputReportIdleRate - Idle rate (in milliseconds) of the input report.
        inputReport - Input report instance.
        outputReport - Output report instance.
*/
typedef struct {

    USBDDriver usbdDriver;
    unsigned char inputReportIdleRate;
    HIDDKeyboardInputReport inputReport;
    HIDDKeyboardOutputReport outputReport;

} HIDDKeyboardDriver;

//------------------------------------------------------------------------------
//         Internal variables
//------------------------------------------------------------------------------
/*
    Variable: hiddKeyboardDriver
        Static instance of the HID keyboard device driver.
*/
static HIDDKeyboardDriver hiddKeyboardDriver;

//------------------------------------------------------------------------------
//         Internal functions
//------------------------------------------------------------------------------
/*
    Function: HIDDKeyboardDriver_GetDescriptor
        Returns the descriptor requested by the host.

    Parameters:
        type - Descriptor type.
        length - Maximum number of bytes to send.

    Returns:
        1 if the request has been handled by this function, otherwise 0.
*/
static unsigned char HIDDKeyboardDriver_GetDescriptor(unsigned char type,
                                                      unsigned char length)
{
    const USBConfigurationDescriptor *pConfiguration;
    HIDDescriptor *hidDescriptor;

    switch (type) {

        case HIDGenericDescriptor_REPORT:
            trace_LOG(trace_INFO, "Report ");

            // Adjust length and send report descriptor
            if (length > HIDDKeyboardDriverDescriptors_REPORTSIZE) {

                length = HIDDKeyboardDriverDescriptors_REPORTSIZE;
            }
            USBD_Write(0, &hiddReportDescriptor, length, 0, 0);
            break;

        case HIDGenericDescriptor_HID:
            trace_LOG(trace_INFO, "HID ");

            // Configuration descriptor is different depending on configuration
            if (USBD_IsHighSpeed()) {

                pConfiguration = hiddKeyboardDriver.usbdDriver.pDescriptors->pHsConfiguration;
            }
            else {

                pConfiguration = hiddKeyboardDriver.usbdDriver.pDescriptors->pFsConfiguration;
            }

            // Parse the device configuration to get the HID descriptor
            USBConfigurationDescriptor_Parse(pConfiguration, 0, 0, (USBGenericDescriptor **) &hidDescriptor);

            // Adjust length and send HID descriptor
            if (length > sizeof(HIDDescriptor)) {

                length = sizeof(HIDDescriptor);
            }
            USBD_Write(0, hidDescriptor, length, 0, 0);
            break;

        default:
            return 0;
    }

    return 1;
}

/*
    Function: HIDDKeyboardDriver_GetIdle
        Sends the current Idle rate of the input report to the host.

*/
static void HIDDKeyboardDriver_GetIdle()
{
    trace_LOG(trace_INFO, "gIdle ");

    USBD_Write(0, &(hiddKeyboardDriver.inputReportIdleRate), 1, 0, 0);
}

/*
    Function: HIDDKeyboardDriver_SetIdle
        Retrieves the new idle rate of the input report from the USB host.

    Parameters:
        idleRate - New input report idle rate.
*/
static void HIDDKeyboardDriver_SetIdle(unsigned char idleRate)
{
    trace_LOG(trace_INFO, "sIdle(%d) ", idleRate);

    hiddKeyboardDriver.inputReportIdleRate = idleRate;
    USBD_Write(0, 0, 0, 0, 0);
}

/*
    Function: HIDDKeyboardDriver_GetReport
        Sends the requested report to the host.

    Parameters:
        type - Report type.
        length - Maximum number of bytes to send.
*/
static void HIDDKeyboardDriver_GetReport(unsigned char type,
                                         unsigned short length)
{
    trace_LOG(trace_INFO, "gReport ");

    // Check report type
    switch (type) {

        case HIDReportRequest_INPUT:
            trace_LOG(trace_INFO, "In ");

            // Adjust size and send report
            if (length > sizeof(HIDDKeyboardInputReport)) {

                length = sizeof(HIDDKeyboardInputReport);
            }
            USBD_Write(0, // Endpoint #0
                       &(hiddKeyboardDriver.inputReport),
                       length,
                       0, // No callback
                       0);
            break;

        case HIDReportRequest_OUTPUT:
            trace_LOG(trace_INFO, "Out ");

            // Adjust size and send report
            if (length > sizeof(HIDDKeyboardOutputReport)) {

                length = sizeof(HIDDKeyboardOutputReport);
            }
            USBD_Write(0, // Endpoint #0
                       &(hiddKeyboardDriver.outputReport),
                       length,
                       0, // No callback
                       0);
            break;

        default:
            USBD_Stall(0);
    }
}

/*
    Function: HIDDKeyboardDriver_ReportReceived
        Callback invoked when an output report has been received from the host.
        Forward the new status of the LEDs to the user program via the
        <HIDDKeyboardCallbacks_LedsChanged> callback.
*/
static void HIDDKeyboardDriver_ReportReceived()
{
    trace_LOG(trace_INFO, "oReport ");

    // Trigger callback
    HIDDKeyboardCallbacks_LedsChanged(
        HIDDKeyboardOutputReport_GetNumLockStatus(&(hiddKeyboardDriver.outputReport)),
        HIDDKeyboardOutputReport_GetCapsLockStatus(&(hiddKeyboardDriver.outputReport)),
        HIDDKeyboardOutputReport_GetScrollLockStatus(&(hiddKeyboardDriver.outputReport)));

    // Restart transfer
    USBD_Read(HIDDKeyboardDriverDescriptors_INTERRUPTOUT,
              &(hiddKeyboardDriver.outputReport),
              sizeof(HIDDKeyboardOutputReport),
              (TransferCallback) HIDDKeyboardDriver_ReportReceived,
              0); // No argument for callback function
}

/*
    Function: HIDDKeyboardDriver_SetReport

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
风流少妇一区二区| 91精品福利视频| 亚洲电影你懂得| 欧美激情自拍偷拍| 欧美一级二级在线观看| 91视视频在线观看入口直接观看www | 精品中文av资源站在线观看| 亚洲欧洲综合另类在线| 久久久午夜精品理论片中文字幕| 欧美三级蜜桃2在线观看| 粉嫩蜜臀av国产精品网站| 免费不卡在线视频| 亚洲不卡一区二区三区| 亚洲精品视频在线| √…a在线天堂一区| 国产亚洲婷婷免费| 精品国一区二区三区| 欧美老肥妇做.爰bbww视频| 色欧美片视频在线观看| 99久久久国产精品| 国产不卡一区视频| 国产黄色91视频| 韩日av一区二区| 免费xxxx性欧美18vr| 人人爽香蕉精品| 日本午夜一区二区| 亚洲第一综合色| 亚洲国产一区视频| 一区二区三区成人| 亚洲乱码国产乱码精品精小说 | 成人午夜av影视| av不卡免费在线观看| 一区二区三区成人在线视频| 欧美中文字幕一区二区三区亚洲| 日韩精品国产精品| 天天操天天干天天综合网| 亚洲一区二区欧美激情| 亚洲黄一区二区三区| 亚洲男人电影天堂| 亚洲精品成人少妇| 一区二区在线看| 亚洲大型综合色站| 日本亚洲视频在线| 精品亚洲成av人在线观看| 精品一区二区三区蜜桃| 久草精品在线观看| 国产精品一区二区你懂的| 国产激情91久久精品导航| www.日韩精品| 91精品福利在线| 777精品伊人久久久久大香线蕉| 欧美日韩国产综合久久| 日韩免费一区二区| 国产亚洲美州欧州综合国| 国产清纯白嫩初高生在线观看91 | 日本一区二区三区在线观看| 国产精品国模大尺度视频| 日韩美女精品在线| 亚洲国产综合色| 久久国产免费看| 国产成人久久精品77777最新版本| 不卡的电影网站| 日本道色综合久久| 日韩欧美亚洲国产精品字幕久久久| 精品国产电影一区二区| 国产精品国产自产拍高清av王其| 亚洲精品少妇30p| 蜜桃视频一区二区三区 | 国产福利精品导航| 一本一本大道香蕉久在线精品| 欧美日韩亚洲另类| 久久久久久久久岛国免费| 最新高清无码专区| 免费人成精品欧美精品| 国产大陆a不卡| 欧美视频在线播放| 久久蜜臀中文字幕| 一区二区三区不卡视频在线观看| 免费久久精品视频| 99精品国产视频| 欧美一级欧美三级在线观看| 中文字幕免费不卡| 日韩高清在线不卡| 97se亚洲国产综合自在线| 欧美一区二区大片| 亚洲欧美激情小说另类| 黄色精品一二区| 欧美亚一区二区| 国产精品福利一区二区| 美美哒免费高清在线观看视频一区二区| 国产成人免费视频| 91精品国产综合久久精品图片| 中文欧美字幕免费| 久久精品国产成人一区二区三区| 在线国产电影不卡| 中文字幕免费不卡| 美女精品一区二区| 欧美日韩国产影片| 中文字幕一区日韩精品欧美| 国产资源精品在线观看| 欧美理论电影在线| 综合中文字幕亚洲| 国产成人免费在线| 欧美成人国产一区二区| 香蕉久久一区二区不卡无毒影院 | 欧美一区二区性放荡片| 亚洲免费观看高清完整版在线观看熊 | 色狠狠综合天天综合综合| 久久久www成人免费无遮挡大片| 亚洲成a天堂v人片| 色噜噜狠狠色综合中国| 成人免费一区二区三区在线观看| 国产中文一区二区三区| 欧美大片在线观看一区二区| 日韩成人一区二区| 欧美日韩精品免费| 一区二区三区中文在线观看| av中文字幕不卡| 欧美国产精品久久| 国产乱码精品一区二区三区忘忧草 | 亚洲国产精品久久久男人的天堂| 成人app在线| 中文字幕欧美日韩一区| 粉嫩蜜臀av国产精品网站| 久久蜜桃香蕉精品一区二区三区| 久久99最新地址| 精品国产一区二区三区久久影院| 日韩国产精品久久久| 欧美片在线播放| 午夜激情久久久| 69精品人人人人| 蜜乳av一区二区| 精品国产网站在线观看| 国产一区二区日韩精品| 久久夜色精品国产噜噜av| 国产主播一区二区| 国产视频一区二区在线观看| 不卡的av网站| 亚洲欧美另类综合偷拍| 欧美午夜片在线观看| 亚洲国产日韩a在线播放性色| 欧美日免费三级在线| 免费精品视频最新在线| 欧美成人精品二区三区99精品| 韩国av一区二区三区| 国产欧美日韩另类一区| 99久久99精品久久久久久| 一区二区三区在线高清| 欧美日韩免费一区二区三区视频| 日本人妖一区二区| 精品国产99国产精品| 国产91丝袜在线18| 亚洲日本韩国一区| 欧美日韩亚洲综合一区二区三区| 蜜桃视频一区二区三区在线观看 | 国产精品免费久久久久| 日韩av不卡在线观看| 精品国产亚洲一区二区三区在线观看| 国产福利电影一区二区三区| 亚洲人成网站影音先锋播放| 欧美精品久久一区二区三区| 麻豆精品一二三| 国产精品进线69影院| 欧美三级电影在线看| 精品在线免费观看| 亚洲你懂的在线视频| 日韩一级高清毛片| jlzzjlzz欧美大全| 青青青伊人色综合久久| 国产欧美一区二区三区在线看蜜臀 | 有码一区二区三区| 日韩一区二区视频| 成人精品免费网站| 亚洲亚洲精品在线观看| 久久久久久久精| 日本黄色一区二区| 久久国内精品视频| 亚洲免费观看高清完整版在线观看 | 国产精品中文欧美| 亚洲午夜日本在线观看| 久久久亚洲精品石原莉奈| 欧美亚洲愉拍一区二区| 国产一区二区影院| 亚洲国产一区视频| 国产精品天美传媒沈樵| 91精品综合久久久久久| 成人激情av网| 蜜臀精品一区二区三区在线观看 | 成人av在线网| 奇米精品一区二区三区四区 | 午夜伊人狠狠久久| 国产精品卡一卡二| 欧美一区二区视频在线观看| 91一区二区三区在线播放| 久久不见久久见免费视频1| 亚洲国产一二三| 青青草国产精品亚洲专区无| 亚洲四区在线观看| 久久亚洲一区二区三区四区| 91精品国产91久久久久久最新毛片|