linux LCD 驱动框架分析

驱动框架总览

lcd 驱动框架总览图如图get="_blank">所示,本质上是一个字符设备驱动。应用程序通过open函数打开设备驱动,通过read/write进行读写。

app : open(/dev/f0)
kernel:
fb_open
fb_info = get_fb_info(fbidx);
fb_info->fb_ops->fb_open

最关linux必学的60个命令键的地方在于fb_info:fb_ops 里面的接口函数最终实际上是调用fb_info-&系统运维工资一般多少gt;fbops填充的函数。fb_meif的反义词m是linux 内核抽象的一层通用的fb 框架。对于不同的芯片平台,lcd 驱动真正实现是在xxxfb.c。在不同的平台加载自己的lcd驱动时,resgister​framebuffer 填充fb​info。

驱动分析

fbmlinux删除文件命令em 层​:抽象出来通用的字符设备框架。用户直接操作的驱动linux必学的60个命令

平台驱动

fb_probe
framebuffer_alloc
fb_info 填充
register_framebuffer
//其他硬件相关设置

fb_info​:关键结构体介绍

struct fb_info {

atomic_t count;

int node;

int flags;

struct mutex lock; /* Lock for open/release/ioctl funcs */

struct mutex mm_lock; /* Lock for fb_mmap and smem_* fields */

struct fb_var_screeninfo var; /* 可变参数*/

struct fb_fix_screeninfo fix; /* 固定参数 */

struct fb_monspecs monspecs; /* Current Monitor specs */

struct work_struct queue; /* Framebuffer event queue */

struct fb_pixmap pixmap; /* Image hardware mapper */

struct fb_pixmap sprite; /* Cursor hardware mapper */

struct fb_cmap cmap; /* Current cmap */

struct list_head modelist; /* mode list */

struct fb_videomode *mode; /* current mode */



#ifdef CONFIG_FB_BACKLIGHT

/* assigned backlight device */

/* set before framebuffer registration,

remove after unregister */

struct backlight_device *bl_dev;



/* Backlight level curve */

struct mutex bl_curve_mutex;

u8 bl_curve[FB_BACKLIGHT_LEVELS];

#endif



#ifdef CONFIG_FB_DEFERRED_IO

struct delayed_work deferred_work;

struct fb_deferred_io *fbdefio;

#endif



struct fb_ops *fbops;

struct device *device; /* This is the parent */

struct device *dev; /* This is this fb device */

int class_flag; /* private sysfs flags */



#ifdef CONFIG_FB_TILEBLITTING

struct fb_tile_ops *tileops; /* Tile Blitting */

#endif

char __iomem *screen_base; /* Virtual address */

unsignedlong screen_size; /* Amount of ioremapped VRAM or 0 */

void*pseudo_palette; /* Fake palette of 16 colors */

#define FBINFO_STATE_RUNNING 0

#define FBINFO_STATE_SUSPENDED 1

u32 state; /* Hardware state i.e suspend */

void*fbcon_par; /* fbcon use-only private area */

/* From here on everything is device dependent */

void*par;

/* we need the PCI or similar aperture base/size not

smem_start/size as smem_start may just be an object

allocated inside the aperture so may not actually overlap */

struct apertures_struct {

unsignedint count;

struct aperture {

resource_size_t base;

resource_size_t size;

} ranges[0];

} *apertures;



bool skip_vt_switch; /* no VT switch on suspend/resume required */

};

主要参数:

  • fb_varscreeninfo:可变参数。记录屏幕分辨率endif在c语言中是什么意思,屏幕endif是什么意思色域等
  • fb_fixscreeninfo:固定参数ifdef在c语言中是什么意思。记录屏幕缓冲区的物理地址和endif是什么编程语言物理长度等。
  • fbops:记录了对底层硬件操作的函数指针,充当file_linux是什么操作系统operations 角色。

整个调用过程大体如下:

应用层:open(/dev/fb0)            ioctl
驱动:-> fb_open -> fb_ioctl
-> fb_info->fbops->open -> fb_info->fbops->ioctl
... ...

总结

本文主要介绍了linux lcd 驱动整体框架,梳理 linux lcd 通用框架和设备平台之间的关系,关于LCD 具体硬件部分的驱动介绍暂未介绍endif在c语言中是干嘛用的,不同屏幕厂家也略有差异。希望本文对你有所帮助!