| 
	     
	      | 当前位置: Home > Linux > 设备驱动 >  文章 |  |   
	      | Linux设备驱动编程之复杂设备驱动 |   
              | 文章来源: 天极开发 
		文章作者: 宋宝华 
		发布时间: 2006-11-01
		  
		字体: 
		  [大
		  中
		  小] |   
	      |   
		  
		    |  | 
 
    
        
            | static void *sample_probe(struct usb_device *udev, unsigned int ifnum, const struct usb_device_id *id)
 {
 /*
 * The probe procedure is pretty standard. Device matching has already
 * been performed based on the id_table structure (defined later)
 */
 struct usb_interface *iface;
 struct usb_interface_descriptor *interface;
 struct usb_endpoint_descriptor *endpoint;
 struct sample_device *sample;
 
 printk(KERN_INFO "usbsample: probe called for %s device\n",(char *)id->driver_info /* "mouse" or "keyboard" */ );
 
 iface = &udev->actconfig->interface[ifnum];
 interface = &iface->altsetting[iface->act_altsetting];
 
 if (interface->bNumEndpoints != 1) return NULL;
 
 endpoint = interface->endpoint + 0;
 if (!(endpoint->bEndpointAddress & 0x80)) return NULL;
 if ((endpoint->bmAttributes & 3) != 3) return NULL;
 
 usb_set_protocol(udev, interface->bInterfaceNumber, 0);
 usb_set_idle(udev, interface->bInterfaceNumber, 0, 0);
 
 /* allocate and zero a new data structure for the new device */
 sample = kmalloc(sizeof(struct sample_device), GFP_KERNEL);
 if (!sample) return NULL; /* failure */
 memset(sample, 0, sizeof(*sample));
 sample->name = (char *)id->driver_info;
 
 /* fill the URB data structure using the FILL_INT_URB macro */
 {
 int pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
 int maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
 
 if (maxp > 8) maxp = 8; sample->maxp = maxp; /* remember for later */
 FILL_INT_URB(&sample->urb, udev, pipe, sample->data, maxp,
 sample_irq, sample, endpoint->bInterval);
 }
 
 /* register the URB within the USB subsystem */
 if (usb_submit_urb(&sample->urb)) {
 kfree(sample);
 return NULL;
 }
 /* announce yourself */
 printk(KERN_INFO "usbsample: probe successful for %s (maxp is %i)\n",sample->name, sample->maxp);
 
 /*
 * here you might MOD_INC_USE_COUNT; if you do, you'll need to unplug
 * the device or the devices before being able to unload the module
 */
 
 /* and return the new structure */
 return sample;
 }
 |    在网络设备驱动的编写中,我们特别关心的就是数据的收、发及中断。网络设备驱动程序的层次如下:
 
 
		    
                         |  |  
	    | ↑返回顶部
	       
	      打印本页
	       
	      关闭窗口↓ |  
	    | 
 |  |  |