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;
    }
  • 相关阅读:
    统一身份认证部署ca 问题
    用组件beanutils,dbutils简化JDBC操作
    java 几种远程服务调用协议的比较
    让Tomcat支持路径、中文文件名(浏览器的get方式) .
    Spring 2.5中JdbcTemplate类query方法的三种回调接口
    tomcat 支持文件下载
    Eclipse 插件开发遇到问题心得总结
    eclipse user library的创建
    SCSI>SAS磁盘与FC磁盘的比较说明
    关于properties文件的字符编码
  • 原文地址:https://www.cnblogs.com/-glb/p/11569788.html
Copyright © 2011-2022 走看看