Linux USB 驱动开发实例(一) —— USB摄像头驱动实现源码分析

本文深入剖析Linux环境下USB摄像头驱动的实现,涵盖模块初始化、系统调用接口、数据传输和USB CORE支持。通过模块初始化和卸载,利用file_operations结构实现V4L协议的Open、Close、Read、Mmap和Ioctl功能。数据传输借助tasklet同步,配合软件解码模块解析图形信息。同时,依赖USB CORE层提供的函数接口进行硬件交互。
摘要由CSDN通过智能技术生成

       Spac5xx的实现是按照标准的USB VIDEO设备的驱动框架编写(其具体的驱动框架可参照/usr/src/linux/drivers/usb/usbvideo.c文件),整个源程序由四个主体部分组成:

设备模块的初始化模块和卸载模块,上层软件接口模块,数据传输模块


具体的模块分析如下:

 一、初始化设备模块

        该驱动采用了显式的模块初始化和消除函数,即调用module_init来初始化一个模块,并在卸载时调用moduel-exit函数

        其具体实现如下: 

1、模块初始化:

module_init (usb_spca5xx_init); 

static int __init  usb_spca5xx_init (void) 
{  
#ifdef CONFIG_PROC_FS                     
	proc_spca50x_create ();//建立PROC设备文件 
#endif /* CONFIG_PROC_FS */    
	if (usb_register (&spca5xx_driver) < 0) //注册USB设备驱动    
		return -1;    
	info ("spca5xx driver %s registered", version);   
	return 0; 
}

2、模块卸载:

module_exit (usb_spca5xx_exit); 

static void __exit  usb_spca5xx_exit (void) 
{    
	usb_deregister (&spca5xx_driver); //注销USB设备驱动   
	info ("driver spca5xx deregistered"); 
#ifdef CONFIG_PROC_FS    
	proc_spca50x_destroy ();//撤消PROC设备文件 
#endif /* CONFIG_PROC_FS */ 
} 


关键数据结构 USB驱动结构,即插即用功能的实现 

static struct usb_driver spca5xx_driver = {        
	"spca5xx",         
	spca5xx_probe, //注册设备自我侦测功能        
	spca5xx_disconnect,//注册设备自我断开功能        
	{NULL,NULL} 
};

用两个函数调用spca5xx_probe 和spca5xx_disconnect来支持USB设备的即插即用功能:

a -- spca5xx_probe具体实现如下:
static void * spca5xx_probe (struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id) 
{    
	struct usb_interface_descriptor *interface;          //USB设备接口描述符 
	struct usb_spca50x *spca50x;                    //物理设备数据结构   
	int err_probe;   
	int i;    
	if (dev->descriptor.bNumConfigurations != 1)        //探测设备是不是可配置     
		goto nodevice;   
	if (ifnum > 0)     
		goto nodevice;    
	interface = &dev->actconfig->interface[ifnum].altsetting[0];  
	MOD_INC_USE_COUNT;    
	interface = &intf->altsetting[0].desc;   
	if (interface->bInterfaceNumber > 0)     
		goto nodevice;    
	if ((spca50x = kmalloc (sizeof (struct usb_spca50x), GFP_KERNEL)) == NULL) //分配物理地址空间     
	{        
		err ("couldn't kmalloc spca50x struct");       
		goto error;     
	}    

	memset (spca50x, 0, sizeof (struct usb_spca50x));   
	spca50x->dev = dev;    
	spca50x->iface = interface->bInterfaceNumber;    
	if ((err_probe = spcaDetectCamera (spca50x)) < 0)       //具体物理设备查找,匹配厂商号,设备号(在子程序中)       
	{        
		err (" Devices not found !! ");       
		goto error;     
	}    
	PDEBUG (0, "Camera type %s ", Plist[spca50x->cameratype].name)
	for (i = 0; i < SPCA50X_NUMFRAMES; i++)      
		init_waitqueue_head (&spca50x->frame[i].wq);     //初始化帧等待队列     
		init_waitqueue_head (&spca50x->wq);            //初始化驱动等待队列   

	if (!spca50x_configure (spca50x))                  //物理设备配置(主要完成传感器侦测和图形参数配置),主要思想是给控制寄存器写值,读回其返回值,以此判断具体的传感器型号     
	{        
		spca50x->user = 0;        
		init_MUTEX (&spca50x->lock);        
  • 13
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值