displaylink
时间:2010-06-10 来源:49305054
DisplayLink Driver 分析
$(KERNENL)/drivers/staging/ udlfb/udlfb.c
一、概述:
udlfb是usb接口显示器的驱动,从用户使用角度来看,它是一个frame buffer驱动,其中显存虚拟的,是内核空间的一片内存(用vmalloc分配的),然后通过usb总线将数据发送的usb显示器上,刷新屏幕的内容。
二、程序分析:
首先,它是一个典型的usb驱动程序,在模块初始化时usb driver被注册:
static struct usb_driver dlfb_driver = {
.name = "udlfb",
.probe = dlfb_probe,
.disconnect = dlfb_disconnect,
.id_table = id_table,
};
res = usb_register(&dlfb_driver);
当usb显示器连接时,usb核心根据id_table表发现dlfb_driver可以驱动该设备,调用probe
函数。同样,当设备断开时候调用disconnect函数。
在probe中主要做以下几件事情:
1.典型usb驱动程序的做法,为该驱动数据结构(struct dlfb_data)分配空间,并设置相应字段,最后调用usb_set_intfdata(interface, dev_info)将私有数据设置到usb接口中;
2.创建urb:usb_alloc_urb(0, GFP_KERNEL);
初始化该urb:usb_fill_bulk_urb();
3.准备注册frame buffer,首先发送请求到该接口的控制端点,获取一些显示器信息;
典型的frame buffer驱动的做法,调用framebuffer_alloc()分配一个frame buffer对象(struct fb_info);初始化各种参数,分配显存等等;最终调用register_framebuffer()注册frame buffer驱动;
其中最为核心的是.fbops字段,它是对该frame buffer设备操作方法的集合;
static struct fb_ops dlfb_ops = {
.fb_setcolreg = dlfb_setcolreg,
.fb_fillrect = dlfb_fillrect,
.fb_copyarea = dlfb_copyarea,
.fb_imageblit = dlfb_imageblit,
.fb_mmap = dlfb_mmap,
.fb_ioctl = dlfb_ioctl,
.fb_release = dlfb_release,
.fb_blank = dlfb_blank,
};
4.将显存全部涂成绿色,刷新到屏幕;
dlfb_ops很多方法都是对显存的操作,修改完显存储后再通过urb发送到usb显示器设备上去,刷新屏幕。
三、总结:
这个驱动是udlfb最简单的一个实现,我们暂时用的是一个优化后的版本。这个驱动结构上包含usb驱动和frame buffer驱动,比较清晰。其余代码便是主机与usb显示器的一些通信协议的细节,以及frame buffer的一些细节问题。
$(KERNENL)/drivers/staging/ udlfb/udlfb.c
一、概述:
udlfb是usb接口显示器的驱动,从用户使用角度来看,它是一个frame buffer驱动,其中显存虚拟的,是内核空间的一片内存(用vmalloc分配的),然后通过usb总线将数据发送的usb显示器上,刷新屏幕的内容。
二、程序分析:
首先,它是一个典型的usb驱动程序,在模块初始化时usb driver被注册:
static struct usb_driver dlfb_driver = {
.name = "udlfb",
.probe = dlfb_probe,
.disconnect = dlfb_disconnect,
.id_table = id_table,
};
res = usb_register(&dlfb_driver);
当usb显示器连接时,usb核心根据id_table表发现dlfb_driver可以驱动该设备,调用probe
函数。同样,当设备断开时候调用disconnect函数。
在probe中主要做以下几件事情:
1.典型usb驱动程序的做法,为该驱动数据结构(struct dlfb_data)分配空间,并设置相应字段,最后调用usb_set_intfdata(interface, dev_info)将私有数据设置到usb接口中;
2.创建urb:usb_alloc_urb(0, GFP_KERNEL);
初始化该urb:usb_fill_bulk_urb();
3.准备注册frame buffer,首先发送请求到该接口的控制端点,获取一些显示器信息;
典型的frame buffer驱动的做法,调用framebuffer_alloc()分配一个frame buffer对象(struct fb_info);初始化各种参数,分配显存等等;最终调用register_framebuffer()注册frame buffer驱动;
其中最为核心的是.fbops字段,它是对该frame buffer设备操作方法的集合;
static struct fb_ops dlfb_ops = {
.fb_setcolreg = dlfb_setcolreg,
.fb_fillrect = dlfb_fillrect,
.fb_copyarea = dlfb_copyarea,
.fb_imageblit = dlfb_imageblit,
.fb_mmap = dlfb_mmap,
.fb_ioctl = dlfb_ioctl,
.fb_release = dlfb_release,
.fb_blank = dlfb_blank,
};
4.将显存全部涂成绿色,刷新到屏幕;
dlfb_ops很多方法都是对显存的操作,修改完显存储后再通过urb发送到usb显示器设备上去,刷新屏幕。
三、总结:
这个驱动是udlfb最简单的一个实现,我们暂时用的是一个优化后的版本。这个驱动结构上包含usb驱动和frame buffer驱动,比较清晰。其余代码便是主机与usb显示器的一些通信协议的细节,以及frame buffer的一些细节问题。
相关阅读 更多 +
排行榜 更多 +