USB骨架(一)

    技术2022-05-19  25

    USB骨架(一):      在linux kernel源码中,有一个文件usb-skeleton.c,展现了最基础的usb驱动程序,称之为usb骨架。 生产厂商生产的特定的产品都有一个自己的协议,每个新的协议都会有一个新的驱动程序,所以就有了这个usb驱动骨架程序。关于usb specification,以后会一一总结介绍。

          linux 中usb的驱动程序首先需要向usb子系统注册驱动程序,并提供该驱动程序的相关信息,如该驱动程序名字,支持什么类型的usb设备(通常是通过厂商提供的usb产品ID),以及usb设备插入或拔出usb端口时会产生什么样的动作,如调用的一些函数,如probe,disconnect等。对于骨架驱动程序,具体如下:

    ----------------------------------------------------------------------------------------------------------------------static int __init usb_skel_init(void){ int result;

    /* register this driver with the USB subsystem */ result = usb_register(&skel_driver); if (result) err("usb_register failed. Error number %d", result);

    return result;}

    static void __exit usb_skel_exit(void){ /* deregister this driver with the USB subsystem */ usb_deregister(&skel_driver);}----------------------------------------------------------------------------------------------------------------------      其中,usb_skel_init和usb_skel_exit分别想USB子系统注册或注销该usb驱动,通过调用usb_register(&skel_driver)以及usb_register(&skel_register)。

          这里要注意到__init,__exit这样的标记,其实是GNU C的扩展,linux内核使用很多GNU C扩展属性,正因为linux内核中使用很多GNU C扩展,使得GNU C是唯一能够编译内核的编译器,这些属性对代码优化,目标代码布局以及安全检查方面提供很强的支持。此处的__init表明这个函数仅在初始化阶段期间使用,在模块被装载后,所占用的资源将被释放掉并用作它用(真正理解还需另开话题-_-)。接下来,看看register中的skel_driver是什么样:----------------------------------------------------------------------------------------------------------------------/*skel driver*/static struct usb_driver skel_driver = {

    /*驱动的名字*/ .name = "skeleton",

    /*向Linux系统中插入该skel设备时,该驱动会想usb core注册,系统就会调用skel_probe来确认插入的设备是否与驱动相匹配,skel_disconnect同理 */ .probe = skel_probe, .disconnect = skel_disconnect,

    .fops = &skel_fops,.minor = USB_SKEL_MINOR_BASE,

    /*该驱动支持的设备*/ .id_table = skel_table,};----------------------------------------------------------------------------------------------------------------------

          大多usb驱动程序钩住另外一个驱动系统,例如SCSI,网络或者tty子系统。这些驱动程序在其他驱动系统中注册,同时任何用户空间的交互操作通过那些接口提供,比如把SCSI设备驱动作为USB驱动所钩住的另外一个驱动系统,那么此USB设备的read、write等操作,就调用SCSI设备相应的read、write函数。但是对于另外一些驱动程序来说,如果没有匹配的驱动系统,就要自己描述与用户空间的read、write等函数。Usb子系统提供一种方法去注册一个次设备号fops和minor函数指针,这样就可以与用户空间实现方便地交互。(此段参考赵明的解释)

    skel_table:该设备驱动支持的设备,支持的设备是通过宏USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID)实现的.----------------------------------------------------------------------------------------------------------------------

    static struct usb_device_id skel_table[] = { { USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) }, { } /* Terminating entry */};

    /* 厂商定义的USB设备ID,此处设为0xfff0*/#define USB_SKEL_VENDOR_ID 0xfff0#define USB_SKEL_PRODUCT_ID 0xfff0----------------------------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------------------------MODULE_DEVICE_TABLE(usb, skel_table);----------------------------------------------------------------------------------------------------------------------MODULE_DEVICE_TABLE:用于当usb设备插入设备端口时,系统自动的加载相应ID的设备驱动。

     

    --我们之间不是谁说了就算-_- --2011/03/05

     


    最新回复(0)