新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux下USB驅動程序的設計

        嵌入式Linux下USB驅動程序的設計

        作者: 時間:2013-10-08 來源:網絡 收藏

          else

          { handle_scancode(0xe0,1);

          handle_scancode(0x4d,1);

          handle_scancode(0xe0,0);

          handle_scancode(0x4d,0);

          }

          }

          printk("new=%x %x %x %x %x %x %x %x", kbd->new[0],kbd->new[1],kbd->new[2],kbd->new[3],

          kbd->new[4],kbd->new[5],kbd->new[6],kbd->new[7]);

          }

          static void *usb_kbd_probe(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id)

          {

          struct usb_interface *iface;

          struct usb_interface_descriptor *interface;

          struct usb_endpoint_descriptor *endpoint;

          struct usb_kbd *kbd;

          int pipe, maxp;

          iface = dev->actconfig->interface[ifnum];

          interface = iface->altsetting[iface->act_altsetting];

          if ((dev->descriptor.idVendor != _HOTKEY_VENDOR_ID) || (dev->descriptor.idProduct != _HOTKEY_PRODUCT_ID) || (ifnum != 1))

          {

          return NULL;

          }

          if (dev->actconfig->bNumInterfaces != 2)

          {

          return NULL;

          }

          if (interface->bNumEndpoints != 1) return NULL;

          endpoint = interface->endpoint + 0;

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

          maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));

          usb_set_protocol(dev, interface->bInterfaceNumber, 0);

          usb_set_idle(dev, interface->bInterfaceNumber, 0, 0);

          printk(KERN_INFO "GUO: Vid = %.4x, Pid = %.4x, Device = %.2x, ifnum = %.2x, bufCount = %.8x", dev->descriptor.idVendor,dev->descriptor.idProduct,dev->descriptor.bcdDevice, ifnum, maxp);

          if (!(kbd = kmalloc(sizeof(struct usb_kbd), GFP_KERNEL))) return NULL;

          memset(kbd, 0, sizeof(struct usb_kbd));

          kbd->usbdev = dev;

          FILL_INT_URB(kbd->irq, dev, pipe, kbd->new, maxp > 8 ? 8 : maxp, usb_kbd_irq,kbd, endpoint->bInterval); kbd->irq.dev = kbd->usbdev;

          if (dev->descriptor.iManufacturer) usb_string(dev, dev->descriptor.iManufacturer, kbd->name, 63);

          if (usb_submit_urb(kbd->irq)) {

          kfree(kbd); return NULL; }

          printk(KERN_INFO "input%d: %s on usb%d:%d.%d", kbd->dev.number, kbd->name, dev->bus->busnum, dev->devnum, ifnum);

          return kbd; }

          static void usb_kbd_disconnect(struct usb_device *dev, void *ptr)

          {

          struct usb_kbd *kbd = ptr;

          usb_unlink_urb(kbd->irq);

          kfree(kbd);

          }

          static struct usb_device_id usb_kbd_id_table [] = {

          { _DEVICE(USB_HOTKEY_VENDOR_ID, USB_HOTKEY_PRODUCT_ID) },

          { } /* Terminating entry */

          };

          MODULE_DEVICE_TABLE (usb, usb_kbd_id_table);

          static struct usb_driver usb_kbd_driver = {

          name: "Hotkey",

          probe: usb_kbd_probe,

          disconnect: usb_kbd_disconnect,

          id_table: usb_kbd_id_table,

          NULL,

          };

          static int __init usb_kbd_init(void)

          {

          usb_register(usb_kbd_driver);

          info(DRIVER_VERSION ":" DRIVER_DESC);

          return 0;

          }

          static void __exit usb_kbd_exit(void)

          {

          usb_deregister(usb_kbd_driver);

          }

          module_init(usb_kbd_init);

          module_exit(usb_kbd_exit);

          三、結語

          USB規范是一門比較新的技術,接口使用方便,但是的設計較復雜。上面介紹了USB設備的設計,主要分析了主機端的設計,并且給出了一個編寫USB驅動程序的實例。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux相關文章:linux教程



        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宁国市| 清新县| 阿城市| 海南省| 瑞金市| 来凤县| 荣昌县| 县级市| 盘山县| 肃宁县| 洛南县| 田林县| 永新县| 廊坊市| 子长县| 伊吾县| 闽清县| 碌曲县| 定南县| 亚东县| 柏乡县| 修水县| 崇阳县| 读书| 瑞安市| 汝城县| 浪卡子县| 林西县| 龙山县| 德庆县| 保康县| 马鞍山市| 安陆市| 黄浦区| 东山县| 昔阳县| 图木舒克市| 泰兴市| 馆陶县| 六枝特区| 驻马店市|