video for linux,video for linux-----v4l

Linux内核用C语言编写,所以基本从面向对象和结构化的角度来实现。

定义的结构体 包含了驱动程序所有资源,即属性和成员。

我们所关心的 usb驱动或者规范是linux内核中的一部分,包括两个部分:一部分由Linux内核来实现,指的是当USB设备连接后,usb_core监测到设备的信息并确定调用什么驱动处理该设备。另一部分由我们实现,usb设备驱动,指的是当usb_core调用到我们写的驱动时,驱动开始工作。

这篇文章分成三个部分来叙述,1)usb的协议规范细节2)驱动框架3)源代码分析

2)驱动框架:

usb的设备驱动会被编译成模块,需要时被挂载到内核。

一个linux模块的例子:

#include

#include

MODULE_LICENSE("GPL")                                                    //向linux内核告知该模块的版权信息

static int hello_init(void)                                        //初始化函数本身

{

printk(KERN_ALERT "hello world.\n");

return 0;

}

static int hello_exit(void)                                        //退出函数本身

{//never feel it this way.maybe ever have,but that's long ago.

printk(KERN_ALERT "GOODBYE\n");

}

module_init(hello_init);                                    //向内核注册模块的初始化函数

module_exit(hello_exit);                                  //向内核注册模块的退出函数

这个简单的例子说明了模块的写法。

要编译一个模块,需要用到内核源码树中的makefileMakefile是用来进行项目配置和管理的。我们要把Linux编译、链接最后生成可执行的内核映像,Makefile文件是必不可少的。

一般的内核开发者只需要知道如何使用配置系统(除非是配置系统的维护者)无须了解配置系统的原理,只需要知道如何编写 Makefile 和配置文件。

1)USB的协议规范细节

从面向对象(OO)的角度,我们注意封装、继承等概念,同时要注重c语言中的结构化思想。

usb_skeleton

struct  usb_skel{

struct  usb_device* udev;

struct  usb_interface* interface;

struct semaphore limit_sem;

unsigned char*  bulk_in_buffer;

size_t    bulk_in_size;

_u8      bulk_in_endpointAddr;

_u8      bulk_out_endpointAddr;

struct kref     kref;

}

这个结构体描述的是该驱动所拥有的资源及状态。

结构体udev用来描述usb设备,semaphore limit_sem用于访问控制,kref是一个内核使用的引用计数器。

据前面所述,usb设备有若干配置(configuration),每个配置又有多个接口(interface),接口本身可以没有端点或者有不止一个端点(endpoint)。

linux用结构体 usb_host_endpoint来描述USB端点(endpoint)

3)源码分析

static int_init usb_skel_init(void)                                //初始化函数

{

int result;

result=usb_register(&skel_driver)

if(result)

err("usb_register failed.Error number %d",result);

return result;

}

static void_exit usb_skel_exit(void)                            //退出函数

{

usb_deregister(&skel_driver);

}

module_init(usb_skel_init);                         //模块向内核注册初始化函数

module_exit(usb_skel_exit);                       //模块向内核注册退出函数

MODULE_LICENSE("GPL");                          //版权信息

在这段程序中,有两三处关键字:usb_register(struct *usb_driver),usb_deregister(struct *usb_driver),skel_driver;

其中,skel_driver是结构体usb_driver的一个实现。

前面提到的两个函数是用来注册和注销驱动程序

而结构体的作用是向系统提供函数入口、驱动的名字。

这个结构体是:

static struct usb_driverskel_driver={

.name="skeleton",

.probe=skel_probe,

.disconnect=skel_disconnect,

.id_table=skel_table,

};

------id_table 用来告诉内核 该模块支持的设备

#define USB_SKEL_VENDOR_ID oxfff0

#define USB_SKEL_PRODUCT_ID oxfff0

static struct usb_device_id skel_table[]={

{USB_DEVICE(USB_SKEL_VENDOR_ID,USB_SKEL_PRODUCT_ID)},

{}                                                                                               //设备表的最后一个元素

};

MODULE_DEVICE_TABLE{usb,skel_table};

其中,最后一个函数的两个参数分别是:设备类型和设备表,而且设备表的最后一个元素是空的,用于表示结束。

------probe是usb子系统自动调用的一个函数,当有usb设备接到硬件集线器时。

有待补充。

得到usb_device之后,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值