device drivers part 12

Upload: ksenthil77

Post on 02-Apr-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/27/2019 Device Drivers Part 12

    1/7

    8/13/13 Device Drivers, Part 12: USB Drivers in Linux Continued - LINUX For You

    www.linuxforu.com/2011/11/usb-drivers-in-linux-2/ 1/7

    Device Drivers, Part 12: USB Drivers inLinux ContinuedByAnil Kumar Pugalia on November 1, 2011 in Coding, Developers 11 Comments

    The 1 2th part of the series on

    Linux device drivers takes you

    further along the path to

    writing your first USB driver in

    Linux a continuation from theprevious article.

    Pugs continued, Lets build upon the

    USB device driver coded in our

    previous session, using the same

    handy JetFlash pen drive from

    Transcend, with the vendor ID 0x058f

    and product ID 06387. For that, lets

    dig further into the USB protocol, and

    then convert ourlearning into code.

    USB endpoints and theirtypesDepending on the type and attributes of information to be transferred, a USB device may have

    one or more endpoints, each belonging to one of the following four categories:

    Control to transfer control information. Examples include resetting the device, querying

    information about the device, etc. All USB devices always have the default control endpoint

    point as zero.

    Interrupt for small and fast data transfers, typically of up to 8 bytes. Examples include data

    transfer for serial ports, human interface devices (HIDs) like keyboards, mouse, etc.

    Bulk for big but comparatively slower data transfers. A typical example is data transfers for

    mass-storage devices.

    Isochronous for big data transfers with a bandwidth guarantee, though data integrity may

    not be guaranteed. Typical practical usage examples include transfers of time-sensitive datalike audio, video, etc.

    Additionally, all but control endpoints could be in or out, indicating the direction of data

    transfer; in indicates data flow from the USB device to the host machine, and out, the other

    way.

    Technically, an endpoint is identified using an 8-bit number, the most significant bit (MSB) of

    which indicates the direction 0 means out, and 1 means in. Control endpoints are bi-

    directional, and the MSB is ignored.

    Figure 1 shows a typical snippet of USB device specifications for devices connected on a system.

    RSS Feed Twitter

    Search for: Search

    Get Connected

    LINUX For You on

    +2,490

    Follow

    Search

    HOME REVIEWS HOW-TOS CODING INTERVIEWS FEATURES OVERVIEW BLOGS SERIES IT ADMIN

    Wri te For Us Subm it Tips Subs cribe to Prin t Editio n

    http://www.fleminggulf.com/conferenceview/2nd-Annual-Cloud-Computing-Summit/464http://www.linuxforu.com/tag/linux-device-drivers-series/http://www.linuxforu.com/http://www.linuxforu.com/category/reviews/http://www.linuxforu.com/category/how-tos/http://www.linuxforu.com/category/coding/http://www.linuxforu.com/category/interviews/http://www.linuxforu.com/http://osidays.com/http://electronicsforu.com/electronicsforu/subscription/subsc2scheme.asphttp://www.linuxforu.com/submit-your-tips-tricks/http://www.linuxforu.com/write-for-linux-for-you/http://www.linuxforu.com/category/sysadmins/http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/category/blogs/http://www.linuxforu.com/category/overview/http://www.linuxforu.com/category/features/http://www.linuxforu.com/category/interviews/http://www.linuxforu.com/category/coding/http://www.linuxforu.com/category/how-tos/http://www.linuxforu.com/category/reviews/http://www.linuxforu.com/http://www.linuxforu.com/http://www.fleminggulf.com/conferenceview/2nd-Annual-Cloud-Computing-Summit/464http://rchostingsummit.com/register/?cp_code=OSFYhttp://electronicsforu.com/electronicsforu/subscription/subsc2scheme.asphttps://plus.google.com/110152211622615274910https://plus.google.com/109472979402338498176https://plus.google.com/108540943155986110451https://plus.google.com/117003009004817886820https://plus.google.com/114351092187382287584https://twitter.com/#!/linuxforyouhttp://feeds.feedburner.com/LinuxForYouhttp://www.linuxforu.com/2011/10/usb-drivers-in-linux-1/http://www.linuxforu.com/tag/linux-device-drivers-series/http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#disqus_threadhttp://www.linuxforu.com/category/developers/http://www.linuxforu.com/category/coding/http://www.linuxforu.com/author/anil-kumar-pugalia/http://osidays.com/
  • 7/27/2019 Device Drivers Part 12

    2/7

    8/13/13 Device Drivers, Part 12: USB Drivers in Linux Continued - LINUX For You

    www.linuxforu.com/2011/11/usb-drivers-in-linux-2/ 2/7

    Figure 1: USB's proc w indow snippet (click for larger view )

    To be specific, the E: lines in the figure show examples of an interrupt endpoint of a UHCI Host

    Controller, and two bulk endpoints of the pen drive under consideration. Also, the endpoint

    numbers (in hex) are, respectively, 0x81, 0x01 and 0x82 the MSB of the first and third being

    1, indicating in endpoints, represented by (I) in the figure; the second is an (O) or out

    endpoint. MxPS specifies the maximum packet size, i.e., the data size that can be transferred in a

    single go. Again, as expected, for the interrupt endpoint, it is 2 (

  • 7/27/2019 Device Drivers Part 12

    3/7

    8/13/13 Device Drivers, Part 12: USB Drivers in Linux Continued - LINUX For You

    www.linuxforu.com/2011/11/usb-drivers-in-linux-2/ 3/7

    Yes, definitely; thats what I am going to tell you about, next. Do you remember that as soon as a

    USB device is plugged into the system, the USB host controller driver populates its information

    into the generic USB core layer? To be precise, it puts that into a set of structures embedded

    into one another, exactly as per the USB specifications, Pugs replied.

    The following are the exact data structures defined in , ordered here in reverse,

    for flow clarity:

    So, with access to the struct usb_device handle for a specific device, all the USB-specific

    information about the device can be decoded, as shown through the /proc window. But how

    does one get the device handle?

    In fact, the device handle is not available directly in a driver; rather, the per-interface handles

    (pointers to struct usb_interface) are available, as USB drivers are written for device

    interfaces rather than the device as a whole.

    Recall that the probe and disconnect callbacks, which are invoked by the USB core for every

    interface of the registered device, have the corresponding interface handle as their first

    parameter. Refer to the prototypes below:

    So, with the interface pointer, all information about the corresponding interface can be accessed

    and to get the container device handle, the following macro comes to the rescue:

    Adding this new learning into last months registration-only dr iver gets the following code listing

    (pen_info.c):

    1234

    56789

    10111213141516171819202122232425

    2627282930

    structusb_device{ structusb_device_descriptor descriptor;

    structusb_host_config *config, *actconfig; };structusb_host_config{ structusb_config_descriptor desc; structusb_interface *interface[USB_MAXINTERFACES]; };structusb_interface{ structusb_host_interface *altsetting /* array */, *cur_altsetting; };structusb_host_interface{ structusb_interface_descriptor desc; structusb_host_endpoint *endpoint /* array */; };

    structusb_host_endpoint{ structusb_endpoint_descriptor desc; };

    int(*probe)(structusb_interface *interface, conststructusb_device_id *id);void(*disconnect)(structusb_interface *interface);

    structusb_device device = interface_to_usbdev(interface);

    12

    3456789

    1011121314151617181920212223

    24252627282930313233

    #include #include

    #include staticstructusb_device *device;staticintpen_probe(structusb_interface *interface, conststructusb_device_id{ structusb_host_interface *iface_desc; structusb_endpoint_descriptor *endpoint; inti;

    iface_desc = interface->cur_altsetting; printk(KERN_INFO "Pen i/f %d now probed: (%04X:%04X)\n", iface_desc->desc.bInterfaceNumber, id->idVendor, id->idProduct); printk(KERN_INFO "ID->bNumEndpoints: %02X\n", iface_desc->desc.bNumEndpoints); printk(KERN_INFO "ID->bInterfaceClass: %02X\n", iface_desc->desc.bInterfaceClass);

    for(i = 0; i < iface_desc->desc.bNumEndpoints; i++) { endpoint = &iface_desc->endpoint[i].desc;

    printk(KERN_INFO "ED[%d]->bEndpointAddress: 0x%02X\n",

    i, endpoint->bEndpointAddress); printk(KERN_INFO "ED[%d]->bmAttributes: 0x%02X\n", i, endpoint->bmAttributes); printk(KERN_INFO "ED[%d]->wMaxPacketSize: 0x%04X (%d)\n", i, endpoint->wMaxPacketSize, endpoint->wMaxPacketSize); }

    device = interface_to_usbdev(interface);

  • 7/27/2019 Device Drivers Part 12

    4/7

    8/13/13 Device Drivers, Part 12: USB Drivers in Linux Continued - LINUX For You

    www.linuxforu.com/2011/11/usb-drivers-in-linux-2/ 4/7

    Then, the usual steps for any Linux device driver may be repeated, along with the pen drive

    steps:

    Build the driver (pen_info.ko file) by running make.

    Load the driver using insmod pen_info.ko.

    Plug in the pen drive (after making sure that the usb-storage driver is not already loaded).

    Unplug the pen drive.

    Check the output ofdmesg for the logs.

    Unload the driver using rmmod pen_info.

    Figure 2 shows a snippet of the above steps on Pugs system. Remember to ensure (in the

    output ofcat /proc/bus/usb/devices) that the usual usb-storage driver is not the one

    associated with the pen drive interface, but rather the pen_info driver.

    Figure 2: Output of dmesg

    Summing up

    Before taking another break, Pugs shared two of the many mechanisms for a driver to specify its

    34353637383940414243444546474849

    505152535455565758596061626364656667686970

    717273

    return0;}staticvoidpen_disconnect(structusb_interface *interface){ printk(KERN_INFO "Pen i/f %d now disconnected\n", interface->cur_altsetting->desc.bInterfaceNumber);}staticstructusb_device_id pen_table[] ={ { USB_DEVICE(0x058F, 0x6387) }, {} /* Terminating entry */};MODULE_DEVICE_TABLE (usb, pen_table);

    staticstructusb_driver pen_driver ={ .name = "pen_driver", .probe = pen_probe, .disconnect = pen_disconnect, .id_table = pen_table,};staticint__init pen_init(void){ returnusb_register(&pen_driver);}staticvoid__exit pen_exit(void){ usb_deregister(&pen_driver);}module_init(pen_init);module_exit(pen_exit);

    MODULE_LICENSE("GPL");MODULE_AUTHOR("Anil Kumar Pugalia ");MODULE_DESCRIPTION("USB Pen Info Driver");

    http://www.linuxforu.com/wp-content/uploads/2011/11/figure_22_dmesg_log.png
  • 7/27/2019 Device Drivers Part 12

    5/7

    8/13/13 Device Drivers, Part 12: USB Drivers in Linux Continued - LINUX For You

    www.linuxforu.com/2011/11/usb-drivers-in-linux-2/ 5/7

    Anil Kumar Pugalia

    The author is a freelance trainer in Linux internals, Linux device drivers,

    embedded Linux and related topics. Prior to this, he had worked at Intel

    and Nvidia. He has been exploring Linux since 1994. A gold medallis t

    from the Indian Institute of Science, Linux and knowledge-sharing are two

    of his many passions.

    Connect with him: Website - Twitter- Facebook - Google+

    device to the USB core, using the struct usb_device_id table. The first one is by specifying

    the pair using the USB_DEVICE() macro (as done above). The

    second one is by specifying the device class/category using the USB_DEVICE_INFO() macro. In

    fact, many more macros are available in for various combinations. Moreover,

    multiple of these macros could be specified in the usb_device_id table (terminated by a null

    entry), for matching with any one of the criteria, enabling to write a single driver for possibly

    many devices.

    Earlier, you mentioned writing multiple drivers for a single device, as well. Basically, how do we

    selectively register or not register a particular interface of a USB device?, queried Shweta.

    Sure. Thats next in line of our discussion, along with the ultimate task in any device driver the data-transfer mechanisms, replied Pugs.

    Related Posts:

    Device Drivers, Part 11: USB Drivers in Linux

    Device Drivers, Part 13: Data Transfer to and from USB Devices

    Device Drivers, Part 6: Decoding Character Device File Operations

    Device Drivers, Part 5: Character Device Files Creation & Operations

    Device Drivers, Part 4: Linux Character Drivers

    Tags: LFY November 2011, linux device drivers, Linux Device Drivers Series, mass storage devices, serial ports, usb device driver,

    usb devices, USB host controller driver, usb protocol

    Article written by:

    11 comments

    Leave a message...

    NewestNewest CommunityCommunity ShareShare

    anil kumar

    how to know the functions

    pen_probe,pen_disconnect (where these functions available and how to find theheadder files)

    aadhirai

    I have tried the code in Part 11 which was working for me.

    Here I am not getting the /dev/pen0 listed on my system (Linux Ubuntu 12.04), even

    when I copy paste the code from here....

    compiled & followed all your steps accordingly..

    Will you please help me in completing this ?

    1

    David

    Its Fantastic ! !

    Thank you for your valuable Linux device driver articles.

    Could you please start the same for BSP also.

    0

    Previous Post

    Agile Software Development Made Faster, More

    Secure

    Next Post

    Lisp: Tears of Joy, Part 6

    http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/agile-software-development-made-faster-more-secure/http://www.linuxforu.com/tag/usb-devices/http://www.linuxforu.com/tag/usb-host-controller-driver/http://www.linuxforu.com/tag/usb-protocol/http://www.linuxforu.com/2011/05/decoding-character-device-file-operations/http://www.linuxforu.com/2011/11/lisp-tears-of-joy-part-6/http://www.linuxforu.com/2011/11/agile-software-development-made-faster-more-secure/http://www.linuxforu.com/tag/usb-protocol/http://www.linuxforu.com/tag/usb-host-controller-driver/http://www.linuxforu.com/tag/usb-devices/http://www.linuxforu.com/tag/usb-device-driver/http://www.linuxforu.com/tag/serial-ports/http://www.linuxforu.com/tag/mass-storage-devices/http://www.linuxforu.com/tag/linux-device-drivers-series/http://www.linuxforu.com/tag/linux-device-drivers/http://www.linuxforu.com/tag/lfy-november-2011/http://www.linuxforu.com/2011/02/linux-character-drivers/http://www.linuxforu.com/2011/04/character-device-files-creation-operations/http://www.linuxforu.com/2011/05/decoding-character-device-file-operations/http://www.linuxforu.com/2011/12/data-transfers-to-from-usb-devices/http://www.linuxforu.com/2011/10/usb-drivers-in-linux-1/http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-900120920http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-934158359http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-976934009http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://plus.google.com/103727326491474549031http://facebook.com/anil.pugaliahttp://twitter.com/anil_pugaliahttp://profession.sarika-pugs.com/http://www.linuxforu.com/author/anil-kumar-pugalia/
  • 7/27/2019 Device Drivers Part 12

    6/7

    8/13/13 Device Drivers, Part 12: USB Drivers in Linux Continued - LINUX For You

    www.linuxforu.com/2011/11/usb-drivers-in-linux-2/ 6/7

    anil_pugalia >

    I doubt, if it would be possible, as currently doing the same for mathematics in

    open source.

    ME LWIN JOS E

    I got an error when i tried to remove the "usb_storage"

    melwin-Satellite-L640 USB_2 # rmmod usb_storage

    ERROR: Module usb_storage is in use by ums_realtek

    Here is the output for "lsusb"

    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

    Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub

    Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub

    Bus 002 Device 005: ID 0930:0214 Toshiba Corp.

    Bus 002 Device 006: ID 04f2:b1d6 Chicony Electronics Co., Ltd

    MELWIN JOSE >

    solved :)

    ums_realtk is a module that depends in usb_storage.just "rmmod ums_realtk"

    see more

    MenDuong

    Dear, When I pug and unplug my USB driver. I can't see message in dmesg as above.

    My dmesg as follow:

    SELinux: initialized (dev sdd1, type vfat), uses genfs_contexts

    usb 2-1: USB disconnect, address 5

    SELinux: initialized (dev sdb4, type fuseblk), uses genfs_contexts

    lo: Disabled Privacy Extensions

    SELinux: initialized (dev proc, type proc), uses genfs_contexts

    lo: Disabled Privacy Extensions

    SELinux: initialized (dev proc, type proc), uses genfs_contexts

    lo: Disabled Privacy Extensions

    SELinux: initialized dev roc t e roc uses enfs contexts

    anil_pugalia >

    Because the usb-storage driver is loaded. You need to make sure that is

    unloaded, as mentioned in the article.

    MenDuong >

    Thank you. Please, how to unload usb-storage?

    micheal >

    go drivers path and then type rmmod usb-storage

    anil_pugalia >

    If it is listed in lsmod, just do a "rmmod usb-storage". Otherwise,

    you'd have to recompile your kernel, by making usb-storage as a

    module.

    2

    http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-746878107http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-746959955http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-746878107http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-773716775http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-746779112http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-746878107http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-746766934http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-746779112http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-746766934http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-768750383http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-772347496http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-768750383http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-900120920http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#comment-922215630http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#
  • 7/27/2019 Device Drivers Part 12

    7/7

    8/13/13 Device Drivers, Part 12: USB Drivers in Linux Continued - LINUX For You

    www.linuxforu.com/2011/11/usb-drivers-in-linux-2/ 7/7

    r

    Reviews How-Tos Coding Interviews Features Overview Blogs

    Search

    Popular tags

    Linux, ubuntu, Java, MySQL, Google, python, Fedora,Android, PHP, C, html,

    w eb applications, India, Microsoft, unix, Window s, Red Hat, Oracle, Security,

    Apache , xml, LFY April 2012, FOSS, GNOME, http, JavaScript, LFY June

    2011, open source, RAM, operating systems

    For You & Me

    DevelopersSysadmins

    Open Gurus

    CXOs

    Columns

    All published articles are released underCreative Commons Attribution-NonCommercial 3.0 Unported License, unless otherw ise noted.

    LINUX For You is powered by WordPress, which gladly sits on top of a CentOS-based LEMP stack..

    http://creativecommons.org/licenses/by-nc/3.0/http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29http://www.centos.org/http://wordpress.org/http://www.linuxforu.com/http://creativecommons.org/licenses/by-nc/3.0/http://www.linuxforu.com/category/columns/http://www.linuxforu.com/category/cxo/http://www.linuxforu.com/category/power-users/http://www.linuxforu.com/category/sysadmins/http://www.linuxforu.com/category/developers/http://www.linuxforu.com/category/everyone/http://www.linuxforu.com/tag/operating-systems/http://www.linuxforu.com/tag/ram/http://www.linuxforu.com/tag/open-source/http://www.linuxforu.com/tag/lfy-june-2011/http://www.linuxforu.com/tag/javascript/http://www.linuxforu.com/tag/http/http://www.linuxforu.com/tag/gnome/http://www.linuxforu.com/tag/foss/http://www.linuxforu.com/tag/lfy-april-2012/http://www.linuxforu.com/tag/xml/http://www.linuxforu.com/tag/apache/http://www.linuxforu.com/tag/security/http://www.linuxforu.com/tag/oracle/http://www.linuxforu.com/tag/red-hat/http://www.linuxforu.com/tag/windows/http://www.linuxforu.com/tag/unix/http://www.linuxforu.com/tag/microsoft/http://www.linuxforu.com/tag/india/http://www.linuxforu.com/tag/web-applications/http://www.linuxforu.com/tag/html/http://www.linuxforu.com/tag/c/http://www.linuxforu.com/tag/php/http://www.linuxforu.com/tag/android/http://www.linuxforu.com/tag/fedora/http://www.linuxforu.com/tag/python/http://www.linuxforu.com/tag/google/http://www.linuxforu.com/tag/mysql/http://www.linuxforu.com/tag/java/http://www.linuxforu.com/tag/ubuntu/http://www.linuxforu.com/tag/linux/http://www.linuxforu.com/http://www.linuxforu.com/category/blogs/http://www.linuxforu.com/category/overview/http://www.linuxforu.com/category/features/http://www.linuxforu.com/category/interviews/http://www.linuxforu.com/category/coding/http://www.linuxforu.com/category/how-tos/http://www.linuxforu.com/category/reviews/http://www.linuxforu.com/2011/11/usb-drivers-in-linux-2/#http://linuxforyou.disqus.com/device_drivers_part_12_usb_drivers_in_linux_continued/latest.rsshttp://disqus.com/