USB设备驱动及测试1

来源:互联网 发布:excel怎么做数据统计图 编辑:程序博客网 时间:2024/04/29 15:26

看这本《LINUX内核源代码情景分析》,上面讲USB很全

怎么写USB设备驱动程序?
1. 分配/设置usb_driver结构体
.id_table
.probe
.disconnect
2. 注册

测试1th/2th:
1. make menuconfig去掉原来的USB鼠标驱动
-> Device Drivers
-> HID Devices
<> USB Human Interface Device (full HID) support

  1. make uImage 并使用新的内核启动
    cp arch/arm/boot/uImage /work/nfs_root/uImage_nohid
    make 生成.ko文件
    cp usbmouse_as_key.ko /work/nfs_root/first_fs

进入uboot
nfs 30000000 192.168.31.105:/work/nfs_root/uImage_nohid
bootm 30000000

挂接网络根文件系统
mount -t nfs -o nolock,vers=2 192.168.31.105:/work/nfs_root/first_fs /mnt
3. insmod usbmouse_as_key.ko
4. 在开发板上接入、拔出USB鼠标
这里写图片描述

代码Usbmouse_as_key.c 1th

/* * 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>static struct usb_device_id usbmouse_as_key_id_table [] = {  //设置接口类是HID,子类BOOT,协议MOUSE。    { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,        USB_INTERFACE_PROTOCOL_MOUSE) },    //{USB_DEVICE(0x1234,0x5678)},    //usb的厂家id、设备id.完全可以指定USB的设备驱动程序支持某个产家生产的某款产品    { } /* Terminating entry */};static int usbmouse_as_key_probe(struct usb_interface *intf, const struct usb_device_id *id){    printk("found usbmouse!\n");    //接上鼠标打印这句话    return 0;}static void usbmouse_as_key_disconnect(struct usb_interface *intf){    printk("disconnect usbmouse!\n");  //拔出鼠标打印这句话}/*1,2 两步完成usb总线设备驱动的机制*//* 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");

我们想把厂家的id ,设备id打印出来,能不能做到?
答: 在prob函数里面想把厂家id,设备id打印出来,这些都在设备描述符里面,当我们接入USB设备后, USB总线驱动程序已经把这些设备符通通读出来,我们只要用就可以了。
通过接口得usb_device结构体,usb_device结构体里面有设备描述符descriptor,descriptor里面有厂家id,USB版本号等

将prob函数改为

static int usbmouse_as_key_probe(struct usb_interface *intf, const struct usb_device_id *id){        /* 在prob函数里面想把厂家id,设备id打印出来,这些都在设备描述符里面,当我们接入USB设备后,      USB总线驱动程序已经把这些设备符通通读出来,我们只要用就可以了*/        /*通过接口得usb_device结构体,usb_device结构体里面有设备描述符descriptor,descriptor里面有厂家id,USB版本号等*/    struct usb_device *dev = interface_to_usbdev(intf);    printk("found usbmouse!\n");    printk("bcdUSB = %x\n", dev->descriptor.bcdUSB);    printk("VID    = 0x%x\n", dev->descriptor.idVendor);    printk("PID    = 0x%x\n", dev->descriptor.idProduct);    return 0;}

这里写图片描述

原创粉丝点击