努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2011/05/29/6452689.aspx
下面详细分析一下framebuffer的驱动源码,framebuffer作为一个平台驱动注册进内核:
在arch/arm/plat-s3c24xx/devs.c中定义了framebuffer的平台设备:
devs.c中的这个函数把s3c2410fb_mach_info存放到s3c_device_lcd.dev.platform_data,probe函数中会用到的。
这个函数是在arch/arm/mach-s3c2440/mach-smdk2440.c中的smdk2440_machine_init中调用的,所以在系统启动后会自动调用。
s3c2410fb_display表示屏的显示参数,这个结构体在我们移植LCD驱动的时候需要根据我们屏的参数重新设置。
将s3c2410fb_display结构体存于s3c2410fb_mach_info的displays域。
下面来看看当lcd驱动和设备匹配成功后会调用的探测函数:
这里调用了s3c24xxfb_probe(pdev, DRV_S3C2410),进行了一层封装,因为这样这部分代码可以与s3c2412进行复用。
总结一下探测函数完成的任务:
1)申请fb_info结构体的内存空间,初始化fb_info结构中固定和可变的内存参数,即填充fb_info中的fb_var_screeninfo var和struct fb_fix_screeninfo fix成员。
2)申请帧缓冲设备的显示缓冲区空间
3)注册帧缓冲设备
中断处理函数:
填充调色板:
申请帧缓冲设备fb_info的缓冲区空间:
初始化相关寄存器:
设置fb_info中的可变参数:
注册帧缓冲设备:
设置参数,根据可变参数设置固定参数:
激活设置:
显示空白:blank_mode有5中模式,是一个枚举,定义在include/linux/fb.h中:
设置颜色表:
修改调色板: