驱动框架总览
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驱动时,resgisterframebuffer 填充fbinfo。
驱动分析
fbmlinux删除文件命令em 层:抽象出来通用的字符设备框架。用户直接操作的驱动linux必学的60个命令。
-
- 创建一个字符设备驱动
- 填充 fb_ops
平台驱动
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语言中是干嘛用的,不同屏幕厂家也略有差异。希望本文对你有所帮助!
发表评论