Linux驱动开发:USB驱动之usb(2)

探测和断开:当一个设备被安装而USB核心认为该驱动程序应该处理时,探测函数被调用,探测函数检查传递给它的设备信息,确定驱动程序是否真的适合该设备。当驱动程序因为某种原因不应该控制设备时,断开函数被调用,它可以做一些清理工作。探测回调函数中,USB驱动程序初始化任何可能用于控制USB设备的局部结构体,它还把所需的任何设备相关信息保存到一个局部结构体中

static int skel_probe(struct usb_interface *interface, const struct usb_device_id *id)

{

struct usb_skel *dev;     //usb_skel设备

struct usb_host_interface *iface_desc;  

struct usb_endpoint_descriptor *endpoint;  //端点描述符

size_t buffer_size;

int i;

int retval = -ENOMEM;

/* allocate memory for our device state and initialize it */

dev = kzalloc(sizeof(*dev), GFP_KERNEL);  //分配设备状态的内存并初始化

if (!dev) {

err("Out of memory");

goto error;

}

kref_init(&dev->kref);   //初始化引用计数,设置为1

sema_init(&dev->limit_sem, WRITES_IN_FLIGHT);   //

mutex_init(&dev->io_mutex);

dev->udev = usb_get_dev(interface_to_usbdev(interface));

dev->interface = interface;

/* 设置端点信息 */
     /* 只使用第一个批量IN和批量OUT端点 */

iface_desc = interface->cur_altsetting;

/*在探测函数里,这个循环首先访问该接口中存在的每一个端点,给该端点一个局部指针以便以后访问*/

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

endpoint = &iface_desc->endpoint[i].desc;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wywgsz.html