LCD驱动

 

视频卡的各个属性保存在struct fb_var_screeninfo

struct fb_var_screeninfo {
	__u32 xres;			/* visible resolution 可视分辨率*/
	__u32 yres;
	__u32 xres_virtual;		/* virtual resolution 虚拟分辨率*/
	__u32 yres_virtual;
	__u32 xoffset;			/* 从虚拟到可见区X偏移 */
	__u32 yoffset;			/* 从虚拟到可见区Y偏移*/

	__u32 bits_per_pixel;		/* 每像素比特			*/
	__u32 grayscale;		/* != 0 表示灰度图 */

	struct fb_bitfield red;		/* bitfield in fb mem if true color, */
	struct fb_bitfield green;	/* else only length is significant */
	struct fb_bitfield blue;
	struct fb_bitfield transp;	/* transparency	透明度		*/	

	__u32 nonstd;			/* != 0 Non standard pixel format 非标准像素格式 */

	__u32 activate;			/* see FB_ACTIVATE_*标志*/

	__u32 height;			/* height of picture in mm 图片以毫米为单位高度 */
	__u32 width;			/* width of picture in mm    图片以毫米为单位宽度  */

	__u32 accel_flags;		/* (OBSOLETE) see fb_info.flags */

	/* Timing: All values in pixclocks, except pixclock (of course) */
	__u32 pixclock;			/* pixel clock in ps (pico seconds) 像素时钟 */
	__u32 left_margin;		/* time from sync to picture 左同步到图片的时间(行同步信号到像素的时钟数)*/
	__u32 right_margin;		/* time from picture to sync  图片到右同步的时间(图像到同步信号的时钟数)*/
	__u32 upper_margin;		/* time from sync to picture 上同步到图片的时间(帧同步信号到图像的时钟数)*/
	__u32 lower_margin;
	__u32 hsync_len;		/* length of horizontal sync 水平同步信号的长度*/
	__u32 vsync_len;		/* length of vertical sync	垂直同步信号的长度*/
	__u32 sync;			/* see FB_SYNC_*标志*/
	__u32 vmode;			/* see FB_VMODE_*标志*/
	__u32 rotate;			/* angle we rotate counter clockwise  角度逆时针旋转*/
	__u32 reserved[5];		/* Reserved for future compatibility */
};


视频硬件的固定信息

struct fb_fix_screeninfo {
	char id[16];			/* identification string eg "TT Builtin" */
	unsigned long smem_start;	/* framebuffer物理地址开始*/
					 
	__u32 smem_len;			/* framebuffer 物理内存长度*/
	__u32 type;			/* see FB_TYPE_*		*/
	__u32 type_aux;			/* Interleave for interleaved Planes */
	__u32 visual;			/* 视频模式	*/ 
	__u16 xpanstep;			/* zero if no hardware panning  */
	__u16 ypanstep;			/* zero if no hardware panning  */
	__u16 ywrapstep;		/* zero if no hardware ywrap    */
	__u32 line_length;		/* length of a line in bytes  行字节数  */
	unsigned long mmio_start;	/* I/O映射内存起点   */
					/* (physical address) */
	__u32 mmio_len;			/* I/O映射内存长度  */
	__u32 accel;			/* Indicate to driver which	*/
					/*  specific chip/card we have	*/
	__u16 reserved[3];		/* Reserved for future compatibility */
};


fb_cmap规定了颜色映射

struct fb_cmap {
	__u32 start;			/* First entry	*/
	__u32 len;			/* Number of entries */
	__u16 *red;			/* Red values	*/
	__u16 *green;
	__u16 *blue;
	__u16 *transp;			/* transparency, can be NULL  透明度,可以为NULL*/
};

 

帧缓冲关键数据结构

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 事件队列 */
	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;	/* 当前视频模式 */

#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 私有sysfs标志*/
#ifdef CONFIG_FB_TILEBLITTING
	struct fb_tile_ops *tileops;    /* Tile Blitting */
#endif
	char __iomem *screen_base;	/* Virtual address 虚拟地址*/
	unsigned long screen_size;	/* Amount of ioremapped VRAM or 0 */ 
	void *pseudo_palette;		/* Fake palette of 16 colors 16位颜色表*/ 
#define FBINFO_STATE_RUNNING	0
#define FBINFO_STATE_SUSPENDED	1
	u32 state;			/* 硬件状态 */
	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 {
		unsigned int count;
		struct aperture {
			resource_size_t base;
			resource_size_t size;
		} ranges[0];
	} *apertures;
};

 

 帧缓冲操作

struct fb_ops {
	/* open/release and usage marking */
	struct module *owner;
	int (*fb_open)(struct fb_info *info, int user);//打开
	int (*fb_release)(struct fb_info *info, int user);//释放
	/*读接口*/
	ssize_t (*fb_read)(struct fb_info *info, char __user *buf,
			   size_t count, loff_t *ppos);
	/*写接口*/
	ssize_t (*fb_write)(struct fb_info *info, const char __user *buf,
			    size_t count, loff_t *ppos);

	/*sanity check on video parameters*/ //视频参数的合法性检查
	int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);

	/* configure the video controller registers */ 
	int (*fb_set_par)(struct fb_info *info);//配置视频参数

	//配置颜色寄存器
	int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,
			    unsigned blue, unsigned transp, struct fb_info *info);

	//批量配置颜色寄存器
	int (*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info);

	/* blank display */ //清空显示
	int (*fb_blank)(int blank, struct fb_info *info);

	/* pan display */ //虚拟屏的游动显示
	int (*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info);

	/* Draws a rectangle */ //填充区域
	void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);

	/* Copy data from area to another */ //复制区域
	void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);

	/* Draws a image to the display */ //显示图像
	void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);

	/* Draws cursor */  //光标接口
	int (*fb_cursor) (struct fb_info *info, struct fb_cursor *cursor);

	/* Rotates the display */ //旋转显示
	void (*fb_rotate)(struct fb_info *info, int angle);

	/* wait for blit idle, optional */ //等待了位图的闲置,可选
	int (*fb_sync)(struct fb_info *info);

	/* 特定的ioctl */
	int (*fb_ioctl)(struct fb_info *info, unsigned int cmd,
			unsigned long arg);

	/* 32位兼容的ioctl*/
	int (*fb_compat_ioctl)(struct fb_info *info, unsigned cmd,
			unsigned long arg);

	/* 内存映射 */ 
	int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);

	/* 获取屏幕参数 */
	void (*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps,
			    struct fb_var_screeninfo *var);

	/* 释放资源*/
	void (*fb_destroy)(struct fb_info *info);

	/* called at KDB enter and leave time to prepare the console */
	int (*fb_debug_enter)(struct fb_info *info);
	int (*fb_debug_leave)(struct fb_info *info);
};

 


 

### LCD 驱动开发指南及错误解决 在开发 LCD 驱动时,通常需要遵循一系列步骤来确保驱动的正确性和功能性。以下是对 LCD 驱动开发的基本指南和可能遇到的问题解决方案。 #### 1. LCD 驱动开发流程 LCD 驱动开发主要涉及以下几个方面: - **初始化 LCD 控制器**:设置屏幕宽度、高度以及像素时钟等参数[^2]。 - **配置显存**:为 LCD 分配并初始化显存区域[^3]。 - **实现平台驱动接口**:包括 `probe`、`remove`、`suspend` 和 `resume` 等函数的实现[^3]。 - **注册驱动**:通过调用 `platform_driver_register` 注册驱动程序,并在退出时使用 `platform_driver_unregister` 卸载驱动。 示例代码展示了如何初始化 LCD 控制器并显示欢迎信息[^1]: ```c void lcd_initialize(void) { lcd_controller_init(); // 初始化 LCD 控制器 lcd_set_display_params(800, 480, 24); // 设置显示参数 lcd_clear_screen(); // 清除屏幕 lcd_display_string("Welcome to the LCD"); // 显示欢迎信息 } ``` #### 2. 常见问题及解决方案 ##### 编译错误 当编译内核驱动时,可能会遇到类似以下错误: ``` Makefile:632: include/config/auto.conf: No such file or directory ERROR: Kernel configuration is invalid. ``` 这种错误通常是由于内核配置文件缺失或未正确生成导致的。解决方案如下[^4]: - 确保运行了 `make oldconfig && make prepare` 来生成必要的配置文件。 - 检查内核源码路径是否正确。 - 确保内核配置工具(如 `menuconfig`)已正确配置。 ##### 驱动卸载问题 在驱动退出时,需要正确释放资源以避免内存泄漏或其他问题。具体操作包括: - 卸载内核中的 `fb_info` 结构体。 - 关闭背光信号(例如通过控制寄存器关闭 `PWREN` 信号)。 - 使用 `dma_free_writecombine()` 释放 DMA 缓存地址。 - 调用 `unregister_framebuffer()` 释放已注册的 `fb_info`[^5]。 #### 3. 示例代码 以下是一个简单的 LCD 驱动注册和注销代码示例[^3]: ```c static int __init lcd_init(void) { return platform_driver_register(&lcd_fb_driver); } static void __exit lcd_exit(void) { platform_driver_unregister(&lcd_fb_driver); } module_init(lcd_init); module_exit(lcd_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Huang Gang"); MODULE_DESCRIPTION("My2440 LCD FrameBuffer Driver"); ``` #### 4. 注意事项 - 在开发 LCD 驱动时,确保所有硬件参数(如分辨率、刷新率等)与实际硬件一致[^2]。 - 使用调试工具(如 `printk` 或日志工具)捕获驱动运行过程中的关键信息。 - 测试驱动时,逐步验证每个功能模块的正确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值