zoukankan      html  css  js  c++  java
  • USB设备驱动程序1

    目的:USB鼠标用作按键,左键相当于字母L,右键相当于字母S,中键相当于Enter。
    如何来实现?
    用到输入子系统:
    1)分配input_dev
    2)设置
    3)注册
    4)硬件相关操作
    对于USB鼠标来说,硬件操作应该怎么做呢?
    使用USB总线驱动程序提供的读写函数来收发数据,主要针对于硬件相关的这一部分。
    怎么写USB设备驱动程序?
    1)分配/设置usb_drv结构体
    .id_table
    .probe
    .disconnect
    2)注册
    首先来看一个例子:usbmouse.c

    1.史上最简单的USB设备驱动程序

    /*
     * drivershidusbhidusbmouse.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>
    
    static struct usb_device_id usbmouse_as_key_id_table [] = {
    	{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
    		USB_INTERFACE_PROTOCOL_MOUSE) },
    	//{USB_DEVICE(0x1234,0x5678)},
    	{ }	/* Terminating entry */
    };
    
    
    static int usbmouse_as_key_probe(struct usb_interface *intf, const struct usb_device_id *id)
    {
    	printk("found usbmouse!
    ");
    	return 0;
    }
    
    static void usbmouse_as_key_disconnect(struct usb_interface *intf)
    {
    	printk("disconnect usbmouse!
    ");
    }
    
    /* 1. 分配/设置usb_driver */
    static struct usb_driver usbmouse_as_key_driver = {
    	.name		= "usbmouse_as_key_",
    	.probe		= usbmouse_as_key_probe,
    	.disconnect	= usbmouse_as_key_disconnect,
    	.id_table	= usbmouse_as_key_id_table,
    };
    
    
    static int usbmouse_as_key_init(void)
    {
    	/* 2. 注册 */
    	usb_register(&usbmouse_as_key_driver);
    	return 0;
    }
    
    static void usbmouse_as_key_exit(void)
    {
    	usb_deregister(&usbmouse_as_key_driver);	
    }
    
    module_init(usbmouse_as_key_init);
    module_exit(usbmouse_as_key_exit);
    
    MODULE_LICENSE("GPL");
    

    2. 在probe函数里可以将bcdUSB、VID、PID打印出来,看看

    static int usbmouse_as_key_probe(struct usb_interface *intf, const struct usb_device_id *id)
    {
    	struct usb_device *dev = interface_to_usbdev(intf);
    
    	printk("found usbmouse!
    ");
    
    	printk("bcdUSB = %x
    ", dev->descriptor.bcdUSB);
    	printk("VID    = 0x%x
    ", dev->descriptor.idVendor);
    	printk("PID    = 0x%x
    ", dev->descriptor.idProduct);
    	
    	return 0;
    }
  • 相关阅读:
    CCF_2014_09_2_画图
    计蒜课_等和分隔子集
    计蒜客_合法分数的组合
    读构建之法的读书笔记
    四则运算及感想
    psp 第二周
    第二周 词频统计
    历年作品点评
    四人小组项目
    品读《构建之法》及几个问题的提出
  • 原文地址:https://www.cnblogs.com/-glb/p/11569788.html
Copyright © 2011-2022 走看看