在“linux lcd设备驱动剖析二”文章中,我们详细分析了s3c24xxfb_probe函数。
文章链接:http://blog.youkuaiyun.com/lwj103862095/article/details/18189765
s3c2410fb.c中s3c24xxfb_probe是非常重要的函数之一,但仅仅分析probe函数,貌似感觉有点不够过瘾,貌似缺少分析了一个非常重要的成员。在probe函数中有一句:fbinfo->fbops = &s3c2410fb_ops;
static struct fb_ops s3c2410fb_ops = {
.owner = THIS_MODULE,
.fb_check_var = s3c2410fb_check_var, //设置可变参数
.fb_set_par = s3c2410fb_set_par, //设置固定参数及lcdcon寄存器
.fb_blank = s3c2410fb_blank, //设置是否使能LCD控制器
.fb_setcolreg = s3c2410fb_setcolreg, //设置RGB颜色,实现伪颜色表
.fb_fillrect = cfb_fillrect, //画一个矩形
.fb_copyarea = cfb_copyarea, //Copy data from area to another
.fb_imageblit = cfb_imageblit, //Draws a image to the display
};
一、s3c2410fb_check_var函数主要根据tq2440_lcd_cfg实例来设置fb_info结构体的可变参数
fb_var_screeninfo结构体各个成员,如xres、yres、bits_per_pixel、height、width 等等,具体分析如下:
/* 此函数的主要功能是设置可变参数var */
static int s3c2410fb_check_var(struct fb_var_screeninfo *var,
struct fb_info *info)
{
struct s3c2410fb_info *fbi = info->par;
/* platform_data就是tq2440_fb_info结构体实例 */
struct s3c2410fb_mach_info *mach_info = fbi->dev->platform_data;
struct s3c2410fb_display *display = NULL;
/* 在tq2440_fb_info实例里,displays = tq2440_lcd_cfg,default_display = 0 */
struct s3c2410fb_display *default_display = mach_info->displays +
mach_info->default_display;
/* 在tq2440_fb_info实例里,type = S3C2410_LCDCON1_TFT */
int type = default_display->type;
unsigned i;
dprintk("check_var(var=%p, info=%p)\n", var, info);
/* validate x/y resolution */
/* choose default mode if possible */
/* 如果参数都等于tq2440_fb_info实例里的参数
* 那么赋值给display,此时display指向tq2440_fb_info实例
*/
if (var->yres == default_display->yres &&
var->xres == default_display->xres &&
var->bits_per_pixel == default_display->bpp)
display = default_display;
/* 否则从tq2440_fb_info结构体实例中循环匹配,num_displays = 1 */
else
for (i = 0; i < mach_info->num_displays; i++)