|
楼主 |
发表于 2004-3-2 20:59:39
|
显示全部楼层
//我也来了
程序入口函数
USB驱动程序框架增加了两个入口函数:
void *probe(struct usb_device *dev,unsighed int interface,const struct usb_device_id *id_table);当你开始使用USB接口上的设备时你需要使用这个函数,然后系统就会为这个设备创建位置。
dev指出了相关的设备,interface标识出接口的序号,如果一个USB驱动程序需要某个硬件接口联系起来的话就需要返回一个与某个设备相关的结构变量。
设备辨认阶段一般在检测厂商标识和设备相关信息后结束,然后将检测到的信息和驱动程序提供的标识相比较,然后驱动程序将进一步收集设备的信息。
下面是一个普通的设备检测程序:
void *probe(struct usb_device *dev,unsighed int interface,const struct usb_device_id *id_table)
{
struct driver_context *context;
if (dev->descriptor.idVendor==0x0547 && dev->descriptor.idProduct==0x2131 && interface==1){
MOD_INC_USE_COUNT;
//开始分配资源
context=allocate_driver_resources();
//返回相关信息
return context;
}
void disconnect(struct usb_device *dev,void *drv_context);这个函数在断开设备连接时使用
dev指定了设备关联的信息,driver_context会返回probe函数中driver_context的量。当这个函数被运行后USB的子系统会收回为这个设备分配的变量存储空间,同时驱动程序也会停止使用usb_device结构变量。
一个disconnect函数例子:
static void dabusb_disconnect(struct usb_device *usbdev,void *drv_context)
{
struct driver_context *s=drv_context;
//将移除标记设为1
s->remove_pending=1;
//唤醒驱动程序的所有部分
wake_up(&s->wait);
//等待清除变量空间前的准备工作
sleeep_on(&s->remove_ok);
//清除占用的内存空间
free_driver_resources(s);
MOD_DEC_USE_COUNT;
}
主要函数
int usb_register(struct usb_driver *drv);
此函数用来向USB子系统注册新的USB设备。指针drv应指向一个预先初始化的usb_driver结构变量,在返回值零时说明注册成功,其他值表示注册失败。
void usb_deregister(struct usb_driver *drv);
这个函数用来从USB子系统注销设备。
void usb_driver_claim_interface(struct usb_driver *driver,struct usb_interface *iface,void *driver_context);
这个函数用来为设备在检测期间为驱动程序申请一个或者多个接口,参数driver需要指向一个预先初始化的usb_driver型结构变量。iface参数需要指向usb_config_descriptor结构中的usb_interface结构变量(包含在probe函数中),drv_context通常指向驱动程序的相关结构(请参看probe函数的返回值)。
int usb_interface_claimed(struct usb_interface *iface);
这个函数用来检测是否其他的驱动程序占用了所要申请的接口。返回0代表没有被占用。
void usb_driver_release_interface(struct usb_driver *driver,struct usb_interface *iface);
用来释放已经占用的接口,但你不必去释放probe函数中申请的接口。
const struct usb_device_id *usb_match_id(struct usb_device *dev,struct usb_interface *interface,const struct usb_device_id *id);
配置USB设备
数据描述符
USB子系统提供了许多扩展参数用来配置USB设备,请参阅usb.h
struct usb_device
{
struct usb_config_descriptor *actconfig;/*激活控制*/
....
struct usb_device_descriptor descriptor;/*描述符*/
struct usb_config_descriptor *config; /*所有的设置*/
}
usb_device结构是所有描述符中最重要的,有时为了正常传输数据需要调整它和其他描述符。
你可以使用下面方法访问所有的可用配置信息的描述符:
for (i=0;i<dev->descriptor.bNumConfigurations;i++)
{
struct usb_config_descriptor *cfg=&dev->config;
}
你也可以用下面的方法访问一个配置信息作用域中的所有接口:
for(k=0;k<ifp->num_altsetting;k++)
{
struct usb_interface_descriptor *as=&ifp->altsetting[k];
}
访问某项设置中所有的端点描述符可以用下面的方法:
for(l=0;l<as->bNumEndpoints;l++)
{
struct usb_endpoint_descriptor *ep=&as->endpoint[k];
} |
|