USB骨架(一)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值