设为首页 加入收藏

TOP

Linux驱动开发:USB驱动之usb_skel分析(五)
2014-11-24 13:33:54 来源: 作者: 【 】 浏览:8
Tags:Linux 驱动 开发 USB usb_skel分析
if (!dev->bulk_in_endpointAddr && usb_endpoint_is_bulk_in(endpoint)) {


/* 找到一个批量IN类型的端点 */


buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);


dev->bulk_in_size = buffer_size;


dev->bulk_in_endpointAddr = endpoint->bEndpointAddress;


dev->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);


if (!dev->bulk_in_buffer) {


err("Could not allocate bulk_in_buffer");


goto error;


}


}


if (!dev->bulk_out_endpointAddr && usb_endpoint_is_bulk_out(endpoint)) {


/* we found a bulk out endpoint */


dev->bulk_out_endpointAddr = endpoint->bEndpointAddress;


}


}


if (!(dev->bulk_in_endpointAddr && dev->bulk_out_endpointAddr)) {


err("Could not find both bulk-in and bulk-out endpoints");


goto error;


}


/*因为USB驱动程序要在设备的生命周期的稍后时间获取和接口相关联的局部数据结构体,所以调用了usb_set_intfdata函数,把它保存到struct usb_interface结构体中以便后面的访问*/


/* 把数据指针保存到这个接口设备中 */


usb_set_intfdata(interface, dev);


/*我们以后调用usb_set_intfdata函数来获取数据。当这一切都完成后,USB驱动程序必须在探测函数中调用usb_register_dev函数来把该设备注册到USB核心里*/


/* 注册设 到USB核心 */


retval = usb_register_dev(interface, &skel_class);


if (retval) {


/* 有些情况下是不允许注册驱动程序的 */
err("Not able to get a minor for this device.");


usb_set_intfdata(interface, NULL);


goto error;


}


/* let the user know what node this device is now attached to */


info("USB Skeleton device now attached to USBSkel-%d", interface->minor);


return 0;


error:


if (dev)


/* this frees allocated memory */


kref_put(&dev->kref, skel_delete);


return retval;


}



//9、骨架驱动断开函数


static void skel_disconnect(struct usb_interface *interface)


{


struct usb_skel *dev;


int minor = interface->minor;


/* prevent skel_open() from racing skel_disconnect() */


mutex_lock(&skel_open_lock);


dev = usb_get_intfdata(interface);


usb_set_intfdata(interface, NULL);


/* give back our minor */


usb_deregister_dev(interface, &skel_class);


mutex_unlock(&skel_open_lock);


/* prevent more I/O from starting */


mutex_lock(&dev->io_mutex);


dev->interface = NULL;


mutex_unlock(&dev->io_mutex);


/* decrement our usage count */


kref_put(&dev->kref, skel_delete);


info("USB Skeleton #%d now disconnected", minor);


}



//6、对USB骨架驱动结构体对象进行初始化


static struct usb_driver skel_driver = {


.owner = THIS_MODULE, //指向该驱动程序的模块所有者的批针。USB核心使用它来正确地对该USB驱动程序进行引用计数,使它不会在不合适的时刻被卸载掉,这个变量应该被设置为THIS_MODULE宏。


.name = "skeleton", //指向驱动程序名字的指针,在内核的所有USB驱动程序中它必须是唯一的,通常被设置为和驱动程序模块名相同的名字。


.probe = skel_probe, //这个是指向USB驱动程序中的探测函数的指针。当USB核心认为它有一个接口(usb_interface)可以由该驱动程序处理时,这个函数被调用。


.disconnect = skel_disconnect, //指向USB驱动程序中的断开函数的指针,当一个USB接口(usb_interface)被从系统中移除或者驱动程序正在从USB核心中卸载时,USB核心将调用这个函数。


.id_tabl

首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux驱动开发:Nand Flash时序图.. 下一篇Linux驱动开发:网络设备之虚拟网..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言中如何将结构体 (2025-12-24 22:20:09)
·纯C语言结构体成员变 (2025-12-24 22:20:06)
·C语言中,指针函数和 (2025-12-24 22:20:03)
·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)