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

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

?? ftdi-elan.c

?? linux 內核源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/** USB FTDI client driver for Elan Digital Systems's Uxxx adapters** Copyright(C) 2006 Elan Digital Systems Limited* http://www.elandigitalsystems.com** Author and Maintainer - Tony Olech - Elan Digital Systems* tony.olech@elandigitalsystems.com** This program is free software;you can redistribute it and/or* modify it under the terms of the GNU General Public License as* published by the Free Software Foundation, version 2.*** This driver was written by Tony Olech(tony.olech@elandigitalsystems.com)* based on various USB client drivers in the 2.6.15 linux kernel* with constant reference to the 3rd Edition of Linux Device Drivers* published by O'Reilly** The U132 adapter is a USB to CardBus adapter specifically designed* for PC cards that contain an OHCI host controller. Typical PC cards* are the Orange Mobile 3G Option GlobeTrotter Fusion card.** The U132 adapter will *NOT *work with PC cards that do not contain* an OHCI controller. A simple way to test whether a PC card has an* OHCI controller as an interface is to insert the PC card directly* into a laptop(or desktop) with a CardBus slot and if "lspci" shows* a new USB controller and "lsusb -v" shows a new OHCI Host Controller* then there is a good chance that the U132 adapter will support the* PC card.(you also need the specific client driver for the PC card)** Please inform the Author and Maintainer about any PC cards that* contain OHCI Host Controller and work when directly connected to* an embedded CardBus slot but do not work when they are connected* via an ELAN U132 adapter.**/#include <linux/kernel.h>#include <linux/errno.h>#include <linux/init.h>#include <linux/list.h>#include <linux/ioctl.h>#include <linux/pci_ids.h>#include <linux/slab.h>#include <linux/module.h>#include <linux/kref.h>#include <linux/mutex.h>#include <asm/uaccess.h>#include <linux/usb.h>#include <linux/workqueue.h>#include <linux/platform_device.h>MODULE_AUTHOR("Tony Olech");MODULE_DESCRIPTION("FTDI ELAN driver");MODULE_LICENSE("GPL");#define INT_MODULE_PARM(n, v) static int n = v;module_param(n, int, 0444)static int distrust_firmware = 1;module_param(distrust_firmware, bool, 0);MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurren"        "t setup");extern struct platform_driver u132_platform_driver;static struct workqueue_struct *status_queue;static struct workqueue_struct *command_queue;static struct workqueue_struct *respond_queue;/** ftdi_module_lock exists to protect access to global variables**/static struct mutex ftdi_module_lock;static int ftdi_instances = 0;static struct list_head ftdi_static_list;/** end of the global variables protected by ftdi_module_lock*/#include "usb_u132.h"#include <asm/io.h>#include "../core/hcd.h"	/* FIXME ohci.h is ONLY for internal use by the OHCI driver.	 * If you're going to try stuff like this, you need to split	 * out shareable stuff (register declarations?) into its own	 * file, maybe name <linux/usb/ohci.h>	 */#include "../host/ohci.h"/* Define these values to match your devices*/#define USB_FTDI_ELAN_VENDOR_ID 0x0403#define USB_FTDI_ELAN_PRODUCT_ID 0xd6ea/* table of devices that work with this driver*/static struct usb_device_id ftdi_elan_table[] = {        {USB_DEVICE(USB_FTDI_ELAN_VENDOR_ID, USB_FTDI_ELAN_PRODUCT_ID)},        { /* Terminating entry */ }};MODULE_DEVICE_TABLE(usb, ftdi_elan_table);/* only the jtag(firmware upgrade device) interface requires* a device file and corresponding minor number, but the* interface is created unconditionally - I suppose it could* be configured or not according to a module parameter.* But since we(now) require one interface per device,* and since it unlikely that a normal installation would* require more than a couple of elan-ftdi devices, 8 seems* like a reasonable limit to have here, and if someone* really requires more than 8 devices, then they can frig the* code and recompile*/#define USB_FTDI_ELAN_MINOR_BASE 192#define COMMAND_BITS 5#define COMMAND_SIZE (1<<COMMAND_BITS)#define COMMAND_MASK (COMMAND_SIZE-1)struct u132_command {        u8 header;        u16 length;        u8 address;        u8 width;        u32 value;        int follows;        void *buffer;};#define RESPOND_BITS 5#define RESPOND_SIZE (1<<RESPOND_BITS)#define RESPOND_MASK (RESPOND_SIZE-1)struct u132_respond {        u8 header;        u8 address;        u32 *value;        int *result;        struct completion wait_completion;};struct u132_target {        void *endp;        struct urb *urb;        int toggle_bits;        int error_count;        int condition_code;        int repeat_number;        int halted;        int skipped;        int actual;        int non_null;        int active;        int abandoning;        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,                int toggle_bits, int error_count, int condition_code,                int repeat_number, int halted, int skipped, int actual,                int non_null);};/* Structure to hold all of our device specific stuff*/struct usb_ftdi {        struct list_head ftdi_list;        struct mutex u132_lock;        int command_next;        int command_head;        struct u132_command command[COMMAND_SIZE];        int respond_next;        int respond_head;        struct u132_respond respond[RESPOND_SIZE];        struct u132_target target[4];        char device_name[16];        unsigned synchronized:1;        unsigned enumerated:1;        unsigned registered:1;        unsigned initialized:1;        unsigned card_ejected:1;        int function;        int sequence_num;        int disconnected;        int gone_away;        int stuck_status;        int status_queue_delay;        struct semaphore sw_lock;        struct usb_device *udev;        struct usb_interface *interface;        struct usb_class_driver *class;        struct delayed_work status_work;        struct delayed_work command_work;        struct delayed_work respond_work;        struct u132_platform_data platform_data;        struct resource resources[0];        struct platform_device platform_dev;        unsigned char *bulk_in_buffer;        size_t bulk_in_size;        size_t bulk_in_last;        size_t bulk_in_left;        __u8 bulk_in_endpointAddr;        __u8 bulk_out_endpointAddr;        struct kref kref;        u32 controlreg;        u8 response[4 + 1024];        int expected;        int recieved;        int ed_found;};#define kref_to_usb_ftdi(d) container_of(d, struct usb_ftdi, kref)#define platform_device_to_usb_ftdi(d) container_of(d, struct usb_ftdi, \        platform_dev)static struct usb_driver ftdi_elan_driver;static void ftdi_elan_delete(struct kref *kref){        struct usb_ftdi *ftdi = kref_to_usb_ftdi(kref);        dev_warn(&ftdi->udev->dev, "FREEING ftdi=%p\n", ftdi);        usb_put_dev(ftdi->udev);        ftdi->disconnected += 1;        mutex_lock(&ftdi_module_lock);        list_del_init(&ftdi->ftdi_list);        ftdi_instances -= 1;        mutex_unlock(&ftdi_module_lock);        kfree(ftdi->bulk_in_buffer);        ftdi->bulk_in_buffer = NULL;}static void ftdi_elan_put_kref(struct usb_ftdi *ftdi){        kref_put(&ftdi->kref, ftdi_elan_delete);}static void ftdi_elan_get_kref(struct usb_ftdi *ftdi){        kref_get(&ftdi->kref);}static void ftdi_elan_init_kref(struct usb_ftdi *ftdi){        kref_init(&ftdi->kref);}static void ftdi_status_requeue_work(struct usb_ftdi *ftdi, unsigned int delta){	if (!queue_delayed_work(status_queue, &ftdi->status_work, delta))		kref_put(&ftdi->kref, ftdi_elan_delete);}static void ftdi_status_queue_work(struct usb_ftdi *ftdi, unsigned int delta){	if (queue_delayed_work(status_queue, &ftdi->status_work, delta))		kref_get(&ftdi->kref);}static void ftdi_status_cancel_work(struct usb_ftdi *ftdi){        if (cancel_delayed_work(&ftdi->status_work))                kref_put(&ftdi->kref, ftdi_elan_delete);}static void ftdi_command_requeue_work(struct usb_ftdi *ftdi, unsigned int delta){	if (!queue_delayed_work(command_queue, &ftdi->command_work, delta))		kref_put(&ftdi->kref, ftdi_elan_delete);}static void ftdi_command_queue_work(struct usb_ftdi *ftdi, unsigned int delta){	if (queue_delayed_work(command_queue, &ftdi->command_work, delta))		kref_get(&ftdi->kref);}static void ftdi_command_cancel_work(struct usb_ftdi *ftdi){        if (cancel_delayed_work(&ftdi->command_work))                kref_put(&ftdi->kref, ftdi_elan_delete);}static void ftdi_response_requeue_work(struct usb_ftdi *ftdi,        unsigned int delta){	if (!queue_delayed_work(respond_queue, &ftdi->respond_work, delta))		kref_put(&ftdi->kref, ftdi_elan_delete);}static void ftdi_respond_queue_work(struct usb_ftdi *ftdi, unsigned int delta){	if (queue_delayed_work(respond_queue, &ftdi->respond_work, delta))		kref_get(&ftdi->kref);}static void ftdi_response_cancel_work(struct usb_ftdi *ftdi){        if (cancel_delayed_work(&ftdi->respond_work))                kref_put(&ftdi->kref, ftdi_elan_delete);}void ftdi_elan_gone_away(struct platform_device *pdev){        struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);        ftdi->gone_away += 1;        ftdi_elan_put_kref(ftdi);}EXPORT_SYMBOL_GPL(ftdi_elan_gone_away);static void ftdi_release_platform_dev(struct device *dev){        dev->parent = NULL;}static void ftdi_elan_do_callback(struct usb_ftdi *ftdi,        struct u132_target *target, u8 *buffer, int length);static void ftdi_elan_kick_command_queue(struct usb_ftdi *ftdi);static void ftdi_elan_kick_respond_queue(struct usb_ftdi *ftdi);static int ftdi_elan_setupOHCI(struct usb_ftdi *ftdi);static int ftdi_elan_checkingPCI(struct usb_ftdi *ftdi);static int ftdi_elan_enumeratePCI(struct usb_ftdi *ftdi);static int ftdi_elan_synchronize(struct usb_ftdi *ftdi);static int ftdi_elan_stuck_waiting(struct usb_ftdi *ftdi);static int ftdi_elan_command_engine(struct usb_ftdi *ftdi);static int ftdi_elan_respond_engine(struct usb_ftdi *ftdi);static int ftdi_elan_hcd_init(struct usb_ftdi *ftdi){        int result;        if (ftdi->platform_dev.dev.parent)                return -EBUSY;        ftdi_elan_get_kref(ftdi);        ftdi->platform_data.potpg = 100;        ftdi->platform_data.reset = NULL;        ftdi->platform_dev.id = ftdi->sequence_num;        ftdi->platform_dev.resource = ftdi->resources;        ftdi->platform_dev.num_resources = ARRAY_SIZE(ftdi->resources);        ftdi->platform_dev.dev.platform_data = &ftdi->platform_data;        ftdi->platform_dev.dev.parent = NULL;        ftdi->platform_dev.dev.release = ftdi_release_platform_dev;        ftdi->platform_dev.dev.dma_mask = NULL;        snprintf(ftdi->device_name, sizeof(ftdi->device_name), "u132_hcd");        ftdi->platform_dev.name = ftdi->device_name;        dev_info(&ftdi->udev->dev, "requesting module '%s'\n", "u132_hcd");        request_module("u132_hcd");        dev_info(&ftdi->udev->dev, "registering '%s'\n",                ftdi->platform_dev.name);        result = platform_device_register(&ftdi->platform_dev);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性受xxxx黑人xyx性爽| 久久亚洲精精品中文字幕早川悠里 | 日韩福利视频网| 国产一区二区三区电影在线观看 | 久久精品国产精品亚洲精品| 成人av在线影院| 91精品国产91久久综合桃花| 国产精品久久久久久户外露出 | 欧美精品 国产精品| 中文一区二区在线观看| 蜜臀久久久久久久| 91蜜桃网址入口| 亚洲国产精品国自产拍av| 日韩精品亚洲一区二区三区免费| 波波电影院一区二区三区| 精品免费国产二区三区| 亚洲五码中文字幕| 色悠久久久久综合欧美99| 国产视频一区二区在线| 韩国av一区二区三区在线观看| 欧美日韩视频专区在线播放| 亚洲乱码国产乱码精品精可以看| 国产不卡在线一区| 久久―日本道色综合久久| 美女爽到高潮91| 欧美一级片免费看| 视频一区在线视频| 欧美一区二区私人影院日本| 亚洲v中文字幕| 欧美午夜一区二区三区免费大片| 樱桃国产成人精品视频| 色综合久久天天综合网| 亚洲乱码中文字幕综合| 色天使久久综合网天天| 亚洲自拍都市欧美小说| 色爱区综合激月婷婷| 亚洲一区中文日韩| 欧美三级中文字幕在线观看| 亚洲成年人网站在线观看| 欧美午夜一区二区三区| 五月天中文字幕一区二区| 欧美日韩精品一区二区三区| 亚洲国产精品一区二区www| 欧美色综合网站| 奇米在线7777在线精品 | 久久国内精品自在自线400部| 欧美高清视频在线高清观看mv色露露十八| 一区二区三区.www| 欧美三级电影一区| 久久精品国产999大香线蕉| 精品欧美乱码久久久久久1区2区| 精品亚洲成av人在线观看| 久久精品人人做人人爽人人| 91亚洲永久精品| 亚洲国产aⅴ成人精品无吗| 欧美精品在线视频| 国产乱码精品一区二区三区av| 亚洲国产精品高清| 欧美亚洲国产一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 久久五月婷婷丁香社区| 色综合久久久久综合体| 免费日韩伦理电影| 国产精品久久久久久久岛一牛影视 | 69精品人人人人| 国产在线日韩欧美| 亚洲三级免费电影| 日韩免费高清电影| 99精品国产热久久91蜜凸| 日韩**一区毛片| 国产精品国产三级国产专播品爱网 | 亚洲第一在线综合网站| 精品对白一区国产伦| 色哟哟国产精品| 久久国产精品一区二区| 亚洲精品视频在线观看网站| 欧美zozozo| 一本色道综合亚洲| 国产在线精品一区二区| 亚洲一区二区影院| 国产丝袜欧美中文另类| 欧美二区三区的天堂| av在线综合网| 精品在线免费观看| 亚洲成人av中文| 国产精品视频九色porn| 日韩欧美国产精品一区| 欧美在线啊v一区| 成人av电影在线网| 国产精品一二三四| 久久狠狠亚洲综合| 日韩在线一区二区| 亚洲一区二区三区在线看| 亚洲国产精品v| 国产亚洲一区二区三区四区 | 国产精品色一区二区三区| 日韩免费性生活视频播放| 欧美色爱综合网| 色94色欧美sute亚洲13| 99久久99久久精品国产片果冻 | 奇米精品一区二区三区四区 | 狠狠色狠狠色综合系列| 日韩中文欧美在线| 香蕉成人啪国产精品视频综合网| 亚洲精品视频在线| 亚洲欧美一区二区久久| 中文字幕在线不卡一区| 国产精品久久夜| 中文字幕乱码日本亚洲一区二区| 精品久久久久一区| 欧美精品一区二| 欧美成人a在线| 精品国产乱码久久久久久1区2区 | 欧美色中文字幕| 欧美性大战xxxxx久久久| 欧美性猛片xxxx免费看久爱| 欧美日韩亚洲丝袜制服| 欧美三级视频在线| 欧美一区中文字幕| 日韩欧美国产一区在线观看| 日韩欧美久久久| 久久精品视频免费观看| 国产精品视频看| 一区二区高清免费观看影视大全 | 欧美亚洲综合另类| 欧美日韩电影在线播放| 欧美一区二区三区免费大片| 精品蜜桃在线看| 中文字幕av在线一区二区三区| 亚洲国产精品成人综合 | 久久美女高清视频| 国产精品午夜在线观看| 综合婷婷亚洲小说| 国产成人av福利| 国产91精品精华液一区二区三区| 不卡视频在线看| 欧美色综合久久| 精品国产乱码久久| 国产精品美女久久久久久久| 亚洲综合色婷婷| 免费国产亚洲视频| 成人免费毛片高清视频| 欧美视频精品在线观看| 久久无码av三级| 一区二区三区成人| 国产一区视频在线看| 99久久99久久久精品齐齐| 91麻豆精品91久久久久同性| 久久久久久一二三区| 一区二区三区高清在线| 精品一区二区三区欧美| av在线一区二区三区| 欧美一级二级三级蜜桃| 欧美高清在线一区二区| 日韩电影一区二区三区四区| 成人午夜免费电影| 69p69国产精品| 国产精品白丝在线| 极品美女销魂一区二区三区免费| 99re亚洲国产精品| 久久综合狠狠综合久久激情| 亚洲影院久久精品| 成人性色生活片| 欧美一级久久久| 亚洲一区二区在线观看视频| 国产精品乡下勾搭老头1| 67194成人在线观看| 综合av第一页| 国产精品一区二区三区网站| 欧美色图第一页| 综合久久久久综合| 国产精品资源网站| 在线电影院国产精品| 亚洲欧美经典视频| 国产精品99久久久久| 日韩西西人体444www| 亚洲国产中文字幕| 91视频免费播放| 国产精品乱码人人做人人爱| 久久99精品国产麻豆不卡| 777奇米成人网| 亚洲影视资源网| 色成人在线视频| 亚洲男人的天堂av| 北条麻妃国产九九精品视频| 久久久三级国产网站| 久久av中文字幕片| 欧美不卡在线视频| 久久激情综合网| 精品久久久久久无| 久久精品99国产精品| 欧美成人高清电影在线| 日韩成人一区二区| 日韩亚洲欧美综合| 裸体健美xxxx欧美裸体表演| 日韩欧美视频在线| 看电视剧不卡顿的网站| 日韩一区二区精品葵司在线| 美洲天堂一区二卡三卡四卡视频| 91麻豆精品国产91久久久久|