|   当前位置: 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; } | 
         
    
 
  在网络设备驱动的编写中,我们特别关心的就是数据的收、发及中断。网络设备驱动程序的层次如下:
  
 
		    
                       
		      
		      
		   | 
		 
               
	     | 
	   
	  
	    | 
	      ↑返回顶部
	       
	      打印本页
	       
	      关闭窗口↓
	       
	     | 
	   
	  
	    
	       
	      
	      
	      
             | 
           
         
        | 
       
        
	  
	  
          
          
         
         
         
         
         
         
         
         
         
         
         
         
	  
        |