mini2440简单的lcd显示驱动程序

本文介绍了作者学习LCD显示原理和Linux内核framebuffer驱动框架的过程。重点在于理解内核如何通过fbmem.c抽象framebuffer的共性,以及如何为Mini2440的LCD驱动填充fb_info结构体并注册。通过设置LCD控制器参数,利用内核提供的函数进行显存操作。需要注意LCD控制信号极性、LCD亮度控制以及时序设置等细节。
摘要由CSDN通过智能技术生成

这几天学习了一下lcd显示原理和Linux内核的framebuffer类型的设备驱动框架,值得学习的是内核中对驱动的分层概念,fbmem.c中实现了对framebuffer的共性的抽象,lcd驱动其实就是设置lcd控制器的工作方式,然后对显存进行读写,对显存的操作其实不管什么lcd,都是差不多的,所以这些相似的操作都抽取到了内核的fbmem.c里面,实现驱动的时候只需要填充fb_info结构体,把lcd硬件相关的参数填入该结构体中,然后用register_framebuffer函数进行注册,该函数会根据自动生成设备节点,就是/dev/fb0, /dev/fb1等等,对于显存的读写函数就用内核已经实现的默认的cfb_fillrect, cfb_copyarea, cfb_imageblit即可,其实不用自己去做实现,对于简单的lcd显示操作而言已经足够了。值得注意的是lcd控制芯片的信号极性和2440的lcd控制器的信号极性有可能是反相的,在设置lcd控制器工作模式的时候要注意,另外注意mini2440里面gpb1是控制lcd亮度的,要设置成pwm引脚,看清楚lcd控制芯片的时序图,搞清楚时序里面哪一段时间是多长,保险起见,全部用手册上面的typical的建议数值就行了,根据这些数值对LCDCONn中的字段进行设置,其他的就不多说了,需要注意的地方都在注释里面了。


驱动代码:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/fb.h>
#include <linux/init.h>
#include <linux/dma-mapping.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/cpufreq.h>

#include <asm/io.h>
#include <asm/div64.h>

#include <asm/mach/map.h>
#include <mach/regs-lcd.h>
#include <mach/regs-gpio.h>
#include <mach/fb.h>

static struct fb_info *lcd_fb_info;
static volatile unsigned long *gpccon;
static volatile unsigned long *gpdcon;
static volatile unsigned long *gpgcon;
static volatile unsigned long *gpgdat;
static volatile unsigned long *gpbcon;
static volatile unsigned long *gpbdat;


static str
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值