`
kula
  • 浏览: 57664 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • highill: 在baidu上看了 HTML5与FLASH的斗争和前景分析.d ...
    html5和flash
  • interjc: 问题是html5的标准如何才能完全同意,不要到时候搞得群雄割据 ...
    html5和flash
  • evanmeng: 谷歌地图上早就可以利用点评网的数据显示某地周围的餐饮信息。但我 ...
    openapi 简介

驱动探测函数研究

    博客分类:
  • soft
UP 
阅读更多
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函数
分享到:
评论

相关推荐

    气压驱动软体机器人运动研究.pdf

    标题为《气压驱动软体机器人运动研究》的这篇文献主要探讨了利用气压驱动机制实现软体机器人的运动控制。软体机器人是机器人技术中的一类特殊机器人,它由柔性材料构成,可以改变自身的形状和尺寸,在许多领域具有...

    linux下的rtl8139网卡驱动程序源代码

    在Linux环境下,驱动程序通常遵循统一的模块化结构,包括初始化函数、设备探测函数、中断处理函数等。这些函数定义在头文件中,并在对应的.c文件中实现。 1. **初始化函数**:这是驱动程序启动时调用的函数,用于...

    MTD驱动 数据结构及函数介绍

    - `probe`: 探测函数,用于检测设备是否可用。 - `remove`: 清理函数,用于释放资源。 #### MTD函数介绍 - **get_mtd_device**: 用于获取指定索引的MTD设备。 - **put_mtd_device**: 用于释放之前通过`get_mtd_...

    论文研究-Linux中USB设备驱动程序研究.pdf

    Linux下USB设备驱动程序的一般结构包含USB驱动程序的初始化与卸载函数、设备的探测与断开函数、以及文件操作函数等。驱动程序的编写通常包括以下几个步骤: a. 定义USB设备的ID表:用于匹配特定的USB设备,告诉USB...

    触屏驱动实例

    2. **探测函数(Probe)**:在Linux内核中,驱动的探测函数(如 `probe()`)是设备匹配的关键。当内核检测到一个与驱动描述符相匹配的硬件时,它会调用此函数。在这个实例中,描述符可能包含了GT9113的相关信息,...

    易语言暴力枚举驱动

    "暴力枚举驱动"是网络安全领域中的一种技术,通常用于系统漏洞探测或逆向工程分析。在易语言中实现暴力枚举驱动,意味着开发者使用易语言编写了能够遍历和检测系统驱动的程序。 驱动程序是操作系统与硬件设备之间...

    stm32驱动超声波

    这个过程可以通过延时函数或定时器中断来实现。 - 接收回波:配置GPIO为输入捕获模式,当回波信号到来时,定时器会记录下信号上升沿和下降沿的时间差,从而计算距离。 - 数据处理:根据捕获到的时间差,计算出超声波...

    Linux网络设备驱动编程.pdf

    2. **PCI设备探测函数probe** - `probe`函数是当PCI设备被识别后由内核自动调用的一个函数,目的是对设备进行初始化。在这个函数中,通常需要执行诸如使I/O和内存资源可用、唤醒设备、申请并配置网卡的I/O和内存...

    ili2511 Linux I2C驱动

    探测函数负责在I2C总线上查找设备,操作函数集定义了驱动程序如何与设备交互,而断开函数则在设备被移除时清理资源。 在移植 ili2511 的Linux I2C驱动时,我们首先需要在硬件层面对dts(Device Tree Source)文件...

    字符设备驱动程序实现读写功能

    设备驱动的作用包括探测设备和初始化设备、从设备接收数据并提交给内核、从内核接收数据送到设备、检测和处理设备错误等。 二、设备文件 设备文件是应用程序访问设备的接口,包括设备名、设备类型、主设备号、次...

    六轮摇臂式月球探测车协调驱动自适应模糊容错控制.pdf

    首先,该方法利用模糊逻辑系统逼近月球探测车驱动控制系统的未知非线性动态和未知故障函数。模糊逻辑系统具有良好的非线性逼近能力,能够通过定义一系列的模糊规则来逼近复杂系统的行为。这在系统动态和故障函数未知...

    Netgear-A6210 linux驱动源码

    1. **探测函数**:这是驱动启动时执行的代码,用于检测硬件是否存在并初始化必要的寄存器。 2. **中断处理程序**:当硬件接收到数据或发生事件时,中断处理程序会响应并处理这些事件。 3. **I/O操作函数**:驱动...

    Android平台上的gt9xx系列触摸屏驱动程序带设备树和移植文档

    探测函数负责在内核加载驱动时识别和连接GT9xx设备;初始化函数则对设备进行设置,如配置寄存器;中断处理函数处理来自触控芯片的事件,将用户的触摸动作转化为系统可理解的输入;最后,数据读写函数用于与设备进行...

    Linux下的硬件驱动——USB设备(下)

    2. 探测与断开:`probe`函数在设备插入并与驱动匹配时被调用,用于初始化设备和建立数据传输路径。`disconnect`函数则在设备拔出时执行,负责清理资源。 3. 用户空间交互:USB驱动可以通过`file_operations`结构体...

    RTL8139网卡驱动程序分析

    - **探测函数** (`rtl8139initone`):当系统检测到与`rtl8139pcitbl`列表匹配的PCI设备时,将调用此函数来初始化该设备。探测函数主要负责为设备分配所需的资源(如内存映射地址、中断等)、设置设备的寄存器以及...

    PIC_driver_.rar_PCI 的linux驱动_PCI驱动_linux PCI_linux下pci_pci

    内核会调用驱动的probe函数,此函数负责识别特定的PCI设备,分配资源,设置中断处理等。探测过程包括读取设备的配置空间,识别设备的类型和功能。 4. **中断处理**: PCI设备通常使用中断来通知CPU有数据传输完成...

    linux下的lan9215驱动

    1. 设备探测:驱动在系统启动时扫描总线(如PCI、PCIe),发现并初始化LAN9215设备。 2. 请求内存资源:驱动会申请内核内存,用以存储数据缓冲区和设备状态信息。 3. 注册网络设备:驱动会调用`register_netdev()`...

Global site tag (gtag.js) - Google Analytics