娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年10月11日(星期五)

正在發生

2018年10月11日 | OK6410之USB設備驅動程序

發布者:sokaku 來源: eefocus關鍵字:OK6410  USB設備  驅動程序 手機看文章 掃描二維碼
隨時隨地手機看文章

usb.c源碼:

// 參考drivers/hid/usbhid/usbmouse.c

#include "linux/kernel.h"

#include "linux/slab.h"

#include "linux/module.h"

#include "linux/init.h"

#include "linux/usb/input.h"

#include "linux/hid.h"

#include "linux/input.h" 

static struct input_dev *mk_dev;

static int len;

static char *buf;

static dma_addr_t buf_phys;

static struct urb *mk_urb;

static struct usb_device_id usb_mk_id_table [] = {

    { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,

        USB_INTERFACE_PROTOCOL_MOUSE) },

    //{USB_DEVICE(0x46d, 0xc52f)},

    { }    // Terminating entry 

};

// 當USB主機控制器獲得鼠標數據后,

// 會調用這個函數

static void uk_callback(struct urb *urb)

{

    int i;

    static char pre_val;

#if 0    

    printk("Get datas:\n");

    for (i = 0; i < len; i++)

    {

        printk("x ", buf[i]);

    }

    printk("\n");

#endif

    // 鼠標數據含義:

    // buf[0]: bit0-左鍵, 0-松開, 1-按下

    //         bit1-右鍵, 0-松開, 1-按下

    //         bit2-中鍵, 0-松開, 1-按下

    // buf[1],buf[2]構成一個整數, 表示X方向的相對位移

    //         >0 : 右移

    //         <0 : 左移

    // buf[3],buf[4]構成一個整數, 表示Y方向的相對位移

    //         >0 : 下移

    //         <0 : 上移

    // buf[6]: 滾輪

    // 確定按鍵值 

    // 上報數據 

    if ((pre_val & (1<<0)) != (buf[0] & (1<<0)))

    {

        // 左鍵按下或松開 

        input_event(mk_dev, EV_KEY, KEY_L, (buf[0] & (1<<0)) ? 1 : 0);

        input_sync(mk_dev);

    }

    if ((pre_val & (1<<1)) != (buf[0] & (1<<1)))

    {

        // 右鍵按下或松開 

        input_event(mk_dev, EV_KEY, KEY_S, (buf[0] & (1<<1)) ? 1 : 0);

        input_sync(mk_dev);

    }

    if ((pre_val & (1<<2)) != (buf[0] & (1<<2)))

    {

        // 中鍵按下或松開 

        input_event(mk_dev, EV_KEY, KEY_ENTER, (buf[0] & (1<<2)) ? 1 : 0);

        input_sync(mk_dev);

    }

    pre_val = buf[0];

    // 重新提交URB 

    usb_submit_urb(mk_urb, GFP_KERNEL);

}

static int usb_mk_probe(struct usb_interface *intf, const struct usb_device_id *id)

{

    struct usb_device *dev = interface_to_usbdev(intf);

    struct usb_host_interface *interface;

    struct usb_endpoint_descriptor *endpoint;

    int pipe;

    static int first = 1;

    if (!first)

        return -EIO;

    first = 0;

    // 每一個設備都有端點0

    // interface->endpoint[]數組里放"除了端點0外的其他端點"

    // interface->endpoint[0]表示"除端點0外的第1個端點"

    // interface->endpoint[1]表示"除端點0外的第2個端點"

     

    interface = intf->cur_altsetting;

    endpoint = &interface->endpoint[0].desc;

    // 1. 分配inputd_dev 

    mk_dev = input_allocate_device();

    

    // 2. 設置 

    // 2.1 能產生哪類事件 

    set_bit(EV_KEY, mk_dev->evbit);

    set_bit(EV_REP, mk_dev->evbit);

    

    // 2.2 能產生這類事件里的哪些事件 

    set_bit(KEY_L, mk_dev->keybit);

    set_bit(KEY_S, mk_dev->keybit);

    set_bit(KEY_ENTER, mk_dev->keybit);

    

    // 3. 注冊 

    input_register_device(mk_dev);

    // 4. 硬件相關的操作: 

    //    對于GPIO按鍵, 是request_irq, 在中斷處理函數里上報按鍵

    //    對于USB設備, 是使用"USB主機驅動程序提供的函數"發起USB傳輸獲得數據

     

    // 數據傳輸3要素: 源, 目的, 長度 

    

    // A. 源: USB設備的某個端點 

    // ((PIPE_INTERRUPT << 30) | (dev->devnum << 8) | (endpoint << 15) | USB_DIR_IN) 

    pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);

    

    // C. 長度: 這個端點描述符的wMaxPacketSize 

    len = endpoint->wMaxPacketSize;

    // B. 目的: 分配buffer 

    buf = usb_buffer_alloc(dev, len, GFP_ATOMIC, &buf_phys);

    // D. 怎么使用這3要素 ? 

    // 分配URB: USB Reqeust Block 

    mk_urb = usb_alloc_urb(0, GFP_KERNEL);

    // 用3要素填充URB 

    usb_fill_int_urb(mk_urb, dev, pipe, buf, len, uk_callback, NULL, endpoint->bInterval);

    mk_urb->transfer_dma = buf_phys;

    mk_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

    

    // 使用URB 

    usb_submit_urb(mk_urb, GFP_KERNEL);

    return 0;

}

static void usb_mk_disconnect(struct usb_interface *intf)

{

    struct usb_device *dev = interface_to_usbdev(intf);

    

    printk("disconnect usb mouse!!!!!\n");

    usb_kill_urb(mk_urb);

    usb_free_urb(mk_urb);

    usb_buffer_free(dev,len, buf, buf_phys);

    

    input_unregister_device(mk_dev);

    input_free_device(mk_dev);

}

// 1. 分配usb_driver 

// 2. 設置 

static struct usb_driver usb_mk_driver = {

    .name        = "usbmk",

    .probe       = usb_mk_probe,

    .disconnect  = usb_mk_disconnect,

    .id_table    = usb_mk_id_table,

};

static int usb_mk_init(void)

{

    // 3. 注冊 

    usb_register(&usb_mk_driver);

    return 0;

}

static void usb_mk_exit(void)

{

    usb_deregister(&usb_mk_driver);

}

module_init(usb_mk_init);

module_exit(usb_mk_exit);

MODULE_LICENSE("GPL");

=====================================================================

Makefile文件:

KERN_DIR = /home/linux/linux-3.0.1

all:

    make -C $(KERN_DIR) M=`pwd` modules 

clean:

    make -C $(KERN_DIR) M=`pwd` modules clean

    rm -rf modules.order

obj-m += usb.o

=====================================================================

測試部分參考:JZ2440的USB設備驅動程序


關鍵字:OK6410  USB設備  驅動程序 引用地址:OK6410之USB設備驅動程序

上一篇:OK6410塊設備驅動之用內存模擬磁盤
下一篇:OK6410分層分離(總線-驅動-設備模型)

推薦閱讀

statr.S文件:.globl _start_start: // 0 地址 b reset // 復位時,cpu跳到0地址 ldr pc, =undefined_instruction // cpu遇到不能識別的指令時 ldr pc, _vector_swi // 當執行swi指令時, 進入swi模 式 b halt @ldr ...
在STM32F4系列中DMA增加了個FIFO;這個FIFO的作用是什么?當我使能這個FIFO時(DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;),進仿真模式查看接收數組,他只更新16個字節(我在外邊發進去20個字節);讀取DMA接收數據個數寄存器顯示DMA接收到了20個字節,我 第二次發送數據,接收緩沖又只更新了16個字節(包含上一次未更新的字節);當我把...
國慶前,realme官方曾“暗示”國慶后會宣布關于新機的消息。不過沒想到,國慶一來,10月9日,realme副總裁、全球營銷總裁徐起就直接放出了realme真我Q2系列的真機圖,可謂十分爽快!根據放出的真機圖,我們可以看出realme真我Q2系列后置四攝像頭,采用了當下流行的矩陣設計,位于機身后背左上角位置,攝像頭下方靠近機身底部的位置有“realme”的標識,并...
網絡分析儀是測量網絡參數的一種新型儀器,可直接測量有源或無源、可逆或不可逆的雙口和單口網絡的復數散射參數,并以掃頻方式給出各散射參數的幅度、相位頻率特性。網絡分析儀在射頻領域使用頻次非常的高,一臺儀器的價格也是不菲的,小編一年的工資還比不上一臺網分價格呢。近期,安泰測試維修中心接修了好幾臺網絡分析儀,其中有2臺故障都是出現通道超...

史海拾趣

問答坊 | AI 解惑

Agilent Fundamentals of RF and Microwave

Modern receiving systems must often process veryweak signals, but the noise added by the systemcomponents tends to obscure those very weak signals.Sensitivity, bit error ratio (BER) and noise figure aresystem parameters that chara ...…

查看全部問答∨

長期供應頻譜分析儀HP8563E/E4402B/E4403B/MS2665C/MS

一、 綜合測試儀 R&S CMU200(可測GSM900/1800);Agilent8960 E5515B(可測GSM900/1800/1900/GPRS);Agilnet8960 E5515C(OPT:002、003,可測GSM、CDMA);R&S CMD55(可測900/1800);R&S CMD60(DECT測試儀);MT8801B(PHS測試儀); ...…

查看全部問答∨

evc 對話框中顯示jpg圖片的問題

我現在在對話框中添加了按鈕 void xxxDlg::OnButton1() 想實現的功能有兩個,點擊按鈕后首先能獲取要顯示圖片的路徑,現在已經實現了并把路徑保存在CString pathname 中。第二個功能 想接著把對應路徑的這個圖片顯示到對話框中。(這個按鈕是程序 ...…

查看全部問答∨

求助各位大俠

AT89C51出來接ULN2003驅動繼電器,繼電器再接變頻器控制油田注水泵,電路圖如何連接?…

查看全部問答∨

如何將一個文件夾(里邊有幾個文件)放在桌面上?

在platform。bib下,添加某個文件,系統啟動后默認會在windows下找到。 如果我想將一個文件夾放在桌面,文件夾里有幾個文件,系統啟動后,自動運行的程序可以對這個文件夾里的文件進行操作。 在制作nk的時候應該怎么做?…

查看全部問答∨

界面的一個問題,謝謝!

請問WINCE中怎樣通過程序自由隱藏和顯示windows mobile的任務欄(是指帶開始按鈕的那一欄) 謝謝大家了:)…

查看全部問答∨

嵌入式的問題

大家好,我是一名大學生,這個學期要選專業。我想問一下,如果剛學嵌入式的話要很多硬件知識嗎? 謝謝了…

查看全部問答∨

尋有無線條碼數據終端Symbol PDT8146編程經驗的高手

想做一個固定資產清查軟件: 通過無線終端可以實現對粘有條碼的設備進行清查,并能夠與服務器數據進行互連 PC端的程序不需要實現,只要實現無線終端查詢和報表功能.請有興趣的朋友與我聯系,有償服務 QQ 30107562 暗號 無線終端…

查看全部問答∨

一個關于ADS的問題?

在使用ADS Debug uC/OS系統和一個簡單的讓蜂鳴器響的應用程序時,AXD loading image后,沒有進入StartUP函數而是進入Disassembly,Go后不停的running image ,蜂鳴器不響,也不知道是不是下到板子里了。 請問是怎么回事?…

查看全部問答∨

流明學習筆記之二流明庫徹底研究

本來這次我想搞點硬件,但我那光盤單位和家里串來串去地,在家找不到,在單位放到光驅里,明天再說吧。   我想要想編好程序,必須得攝及一個東東------庫,提起這個庫我以前搞過STM32哈,那個庫我是百分之百反對地,但我越反它越大,還把CMS ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 秭归县| 永德县| 庆元县| 铜川市| 汝州市| 永年县| 扶沟县| 金门县| 聂荣县| 津市市| 平乐县| 临海市| 武夷山市| 成都市| 南皮县| 新建县| 宁武县| 翁源县| 沁源县| 东方市| 延长县| 永吉县| 额济纳旗| 海林市| 黄石市| 大渡口区| 孟津县| 云安县| 藁城市| 民县| 罗田县| 康平县| 布拖县| 桑日县| 古浪县| 庄河市| 伊吾县| 甘谷县| 盐亭县| 麟游县| 金乡县|