static int skel_probe(struct usb_interface *interface, const struct usb_device_id *id)
{
struct usb_skel *dev;
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);
sema_init(&dev->limit_sem, WRITES_IN_FLIGHT);
mutex_init(&dev->io_mutex);
spin_lock_init(&dev->err_lock);
init_usb_anchor(&dev->submitted);
dev->udev = usb_get_dev(interface_to_usbdev(interface));
dev->interface = interface;
/* set up the endpoint information */
/* use only the first bulk-in and bulk-out endpoints */
iface_desc = interface->cur_altsetting;
for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
endpoint = &iface_desc->endpoint[i].desc;
if (!dev->bulk_in_endpointAddr &&
usb_endpoint_is_bulk_in(endpoint)) {
/* we found a bulk in endpoint */
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;
}
/* save our data pointer in this interface device */
usb_set_intfdata(interface, dev);
/* we can register the device now, as it is ready */
retval = usb_register_dev(interface, &skel_class);
if (retval) {
/* something prevented us from registering this driver */
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 */
dev_info(&interface->dev,
"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;
}
kref_init 函数
sema_init 函数
mutex_init 函数
spin_lock_init函数
init_usb_anchor函数
usb_get_dev函数
分享到:
相关推荐
针对直流伺服电机和减速齿轮驱动下的移动机器人驱动系统,利用Hamiltonian函数与最小值原理求解出驱动系统的最优速度函数和最优控制电流函数,建立了非线性摩擦条件下的最小能耗模型。通过MATLAB仿真,分析了减速器...
函数执行上下文正确性是操作...应用表明,PRPF 能够自动探测程序中所有执行路径,有效地检查函数执行上下文的正确性.实验发现了Linux 内核的23 处编程错误,另有5 处误报.该技术对提高内核代码编写的质量可起到重要作用.
271 第13章 音频驱动程序 273 13.1 音频架构 273 13.2 linux声音子系统 275 13.3 设备实例:mp3播放器 277 13.3.1 驱动程序函数和结构体 278 13.3.2 alsa编程 287 13.4 调试 288 13.5 查看源代码 289 第14章...
基于重尾函数推导目标回波方程, 建立磁探测系统磁偶极子等效模型, 采用峰值和阈值检测法分别解算光磁信号; 建立水下近程目标捕获模型和方位探测精度等效模型, 研究激光发射功率、脉宽、阈值和噪声对测量精度的影响...
.disconnect = skel_disconnect,//USB驱动程序中的断开处理函数 .id_table = skel_table, //指向ID设备表的指针 }; : //usb 入口(安装)(使用usb平台总线) static int __init usb_skel_init(void) { /* ...
泵浦探测场下单分子体系荧光光子的统计性质,韩百萍,郑雨军,利用最近所发展的产生函数(Generating Function)理论方法,研究了泵浦和探测场共同驱动下单分子二能级体系发射荧光光子的统计性质。�
13.3.1 驱动程序函数和结构体278 13.3.2 alsa编程287 13.4 调试288 13.5 查看源代码289 第14章 块设备驱动程序291 14.1 存储技术291 14.2 linux块i/o层295 14.3 i/o调度器295 14.4 块驱动程序数据...
针对航迹探测领域中探测器获得的目标地理位置通常是同一帧下无法区分的多目标场景,需要利用目标位置信息还原各航迹并区分各目标的问题进行研究,提出采用深度强化学习复原目标航迹的方法。依据目标航迹的物理特点,...
(4)哈希函数用除留余数法构造,采用二次探测再散列法解决冲突; (5)查找并显示给定电话号码的记录; (6)通讯录信息保存。 测试数据 取周围熟悉的30个人的姓名及相关信息。 实现提示 人名长度均不超过19个...
NI 使用LabVIEW仪器控制应用演示zip,了解LabVIEW如何在几分钟内控制仪器,仪器驱动探测器是如何自动监测附带的仪器以及从仪器驱动网络上下载下来的驱动和例程,这些都是在LabVIEW环境里完成的。
首先,根据标注语料库,通过基于错误驱动的学习思想,获取交集型歧义消歧规则库,同时,利用统计工具,构建N-Gram统计语言模型;然后,采用正向/逆向最大匹配方法和消歧规则库探测发现交集型歧义字段;最后,通过消...
利用电感电容(LC)低通滤波电路及InGaAs/InP雪崩二极管(APD)研制了200 MHz工作频率的近红外高速单光子探测器,LC低通滤波器采用简单的7阶椭圆函数滤波电路设计,探测器驱动采用脉冲门控电路及880 MHz、175 MHz低通...
通过点灯科技输入框(输入内容)控制esp8266驱动的0.96寸oled显示屏;可实时远程修改屏幕内容。
我们探索N = 1 0 $$ \ mathcal {N} = \ left(1,0 \ right)$$超共形六维理论,该理论是由M5黄铜探测横向A k奇点引起的。 在将圆压缩到5维后,我们用五个脑的双pq-web描述了该系统,并提出了驱动全局对称性增强的...
阐述了以CCD为光电探测器件,采用步进电机驱动,集工作台自动扫描、自动调焦和图像的自动采集为一体的显微镜系统自动调焦机理,改进了均方差评价函数,完成了自动调焦,为显微图像的采集和处理提供了强有力的手段。
常用的方法有分类 及回归树法、 双方自动交互探测法等。 其中 分类树主要用于数据记录的标记和归类, 回归树主要用于估计目标变量的数值[2]。 1.2 关联规则 关联规则分析发现大量数据中项集之 间有价值的关联或相关...
用 64个子孔径的哈特曼波前传感器对畸变波前进行仿真探测,按照变形镜面形为影响函数加权叠加的假设,可以求解出加在各个驱动器上的电压值,进而可以对仿真的 32单元变形镜进行控制,校正波前。仿真的结果显示,直接...
与基于值函数逼近(VFA)的方法不同,事实证明,在满足持久激励(PE)条件的探测噪声下,Q学习方案不会带来Q函数Bellman方程解的偏差,因此,收敛到名义折扣GARE解决方案。 而且,所提出的输出数据驱动方法比状态...
11.3.3 块设备驱动程序的几个函数 11.3.4 RAM 盘驱动程序的实现 11.3.5 硬盘驱动程序的实现 11.4 字符设备驱动程序 11.4.1 简单字符设备驱动程序 11.4.2 字符设备驱动程序的注册 11.4.3 一个字符设备驱动程序...