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函数
分享到:
相关推荐
标题为《气压驱动软体机器人运动研究》的这篇文献主要探讨了利用气压驱动机制实现软体机器人的运动控制。软体机器人是机器人技术中的一类特殊机器人,它由柔性材料构成,可以改变自身的形状和尺寸,在许多领域具有...
在Linux环境下,驱动程序通常遵循统一的模块化结构,包括初始化函数、设备探测函数、中断处理函数等。这些函数定义在头文件中,并在对应的.c文件中实现。 1. **初始化函数**:这是驱动程序启动时调用的函数,用于...
- `probe`: 探测函数,用于检测设备是否可用。 - `remove`: 清理函数,用于释放资源。 #### MTD函数介绍 - **get_mtd_device**: 用于获取指定索引的MTD设备。 - **put_mtd_device**: 用于释放之前通过`get_mtd_...
Linux下USB设备驱动程序的一般结构包含USB驱动程序的初始化与卸载函数、设备的探测与断开函数、以及文件操作函数等。驱动程序的编写通常包括以下几个步骤: a. 定义USB设备的ID表:用于匹配特定的USB设备,告诉USB...
2. **探测函数(Probe)**:在Linux内核中,驱动的探测函数(如 `probe()`)是设备匹配的关键。当内核检测到一个与驱动描述符相匹配的硬件时,它会调用此函数。在这个实例中,描述符可能包含了GT9113的相关信息,...
"暴力枚举驱动"是网络安全领域中的一种技术,通常用于系统漏洞探测或逆向工程分析。在易语言中实现暴力枚举驱动,意味着开发者使用易语言编写了能够遍历和检测系统驱动的程序。 驱动程序是操作系统与硬件设备之间...
这个过程可以通过延时函数或定时器中断来实现。 - 接收回波:配置GPIO为输入捕获模式,当回波信号到来时,定时器会记录下信号上升沿和下降沿的时间差,从而计算距离。 - 数据处理:根据捕获到的时间差,计算出超声波...
2. **PCI设备探测函数probe** - `probe`函数是当PCI设备被识别后由内核自动调用的一个函数,目的是对设备进行初始化。在这个函数中,通常需要执行诸如使I/O和内存资源可用、唤醒设备、申请并配置网卡的I/O和内存...
探测函数负责在I2C总线上查找设备,操作函数集定义了驱动程序如何与设备交互,而断开函数则在设备被移除时清理资源。 在移植 ili2511 的Linux I2C驱动时,我们首先需要在硬件层面对dts(Device Tree Source)文件...
设备驱动的作用包括探测设备和初始化设备、从设备接收数据并提交给内核、从内核接收数据送到设备、检测和处理设备错误等。 二、设备文件 设备文件是应用程序访问设备的接口,包括设备名、设备类型、主设备号、次...
首先,该方法利用模糊逻辑系统逼近月球探测车驱动控制系统的未知非线性动态和未知故障函数。模糊逻辑系统具有良好的非线性逼近能力,能够通过定义一系列的模糊规则来逼近复杂系统的行为。这在系统动态和故障函数未知...
1. **探测函数**:这是驱动启动时执行的代码,用于检测硬件是否存在并初始化必要的寄存器。 2. **中断处理程序**:当硬件接收到数据或发生事件时,中断处理程序会响应并处理这些事件。 3. **I/O操作函数**:驱动...
探测函数负责在内核加载驱动时识别和连接GT9xx设备;初始化函数则对设备进行设置,如配置寄存器;中断处理函数处理来自触控芯片的事件,将用户的触摸动作转化为系统可理解的输入;最后,数据读写函数用于与设备进行...
2. 探测与断开:`probe`函数在设备插入并与驱动匹配时被调用,用于初始化设备和建立数据传输路径。`disconnect`函数则在设备拔出时执行,负责清理资源。 3. 用户空间交互:USB驱动可以通过`file_operations`结构体...
- **探测函数** (`rtl8139initone`):当系统检测到与`rtl8139pcitbl`列表匹配的PCI设备时,将调用此函数来初始化该设备。探测函数主要负责为设备分配所需的资源(如内存映射地址、中断等)、设置设备的寄存器以及...
内核会调用驱动的probe函数,此函数负责识别特定的PCI设备,分配资源,设置中断处理等。探测过程包括读取设备的配置空间,识别设备的类型和功能。 4. **中断处理**: PCI设备通常使用中断来通知CPU有数据传输完成...
1. 设备探测:驱动在系统启动时扫描总线(如PCI、PCIe),发现并初始化LAN9215设备。 2. 请求内存资源:驱动会申请内核内存,用以存储数据缓冲区和设备状态信息。 3. 注册网络设备:驱动会调用`register_netdev()`...