驱动代码:

/*************************************************************************
> File Name: lcd.c
> Author:
> Mail:
> Created Time: 2016年11月02日 星期三 15时21分59秒
************************************************************************/
#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/workqueue.h>
#include <linux/wait.h>
#include <linux/platform_device.h>
#include <linux/clk.h> #include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/div64.h> #include <asm/mach/map.h>
#include <asm/arch/regs-lcd.h>
#include <asm/arch/regs-gpio.h>
#include <asm/arch/fb.h> static volatile unsigned long *gpbcon;
static volatile unsigned long *gpbdat; static volatile unsigned long *gpccon;
static volatile unsigned long *gpdcon;
static volatile unsigned long *gpgcon; struct lcd_regs {
unsigned long lcdcon1;
unsigned long lcdcon2;
unsigned long lcdcon3;
unsigned long lcdcon4;
unsigned long lcdcon5;
unsigned long lcdsaddr1;
unsigned long lcdsaddr2;
unsigned long lcdsaddr3;
unsigned long redlut;
unsigned long greenlut;
unsigned long bluelut;
unsigned long reserved[];
unsigned long dithmode;
unsigned long tpal;
unsigned long lcdintpnd;
unsigned long lcdsrcpnd;
unsigned long lcdintmsk;
unsigned long lpcsel;
}; static int s3c_lcdfb_setcolreg( unsigned int regno, unsigned int red, unsigned int green, unsigned int blue, unsigned int transp, struct fb_info *info );
static u32 pseudo_palette[];
static volatile struct lcd_regs *lcd_reg; static struct fb_info *s3c_fb; static struct fb_ops s3c_fb_ops = {
.owner= THIS_MODULE,
.fb_setcolreg= s3c_lcdfb_setcolreg,
.fb_fillrect= cfb_fillrect, /* Needed !!! */
.fb_copyarea= cfb_copyarea,/* Needed !!! */
.fb_imageblit= cfb_imageblit,/* Needed !!! */
}; static unsigned int chan_to_field(unsigned int chan, const struct fb_bitfield *bf)
{
chan &= 0xffff;
chan >>= - bf->length;
return chan << bf->offset;
} /*调色板*/
static int s3c_lcdfb_setcolreg( unsigned int regno, unsigned int red, unsigned int green, unsigned int blue, unsigned int transp, struct fb_info *info )
{
unsigned int val;
if(regno > )
return ;
/* 用红绿蓝构造出调色板 */
val = chan_to_field( red, &info->var.red );
val |= chan_to_field( green, &info->var.green );
val |= chan_to_field( blue, &info->var.blue );
((u32 *)(info->pseudo_palette))[regno] = val;
return ;
} static int lcd_init( void )
{
/* 分配一个fb_info结构体 */
s3c_fb = framebuffer_alloc(,NULL); //分配的空间为fb_info + 0 (0为私有空间) /* 设置 */
/* 设置固定的参数 */
strcpy( s3c_fb->fix.id, "mylcd" );
s3c_fb->fix.smem_len = **/;
s3c_fb->fix.type = FB_TYPE_PACKED_PIXELS;
s3c_fb->fix.visual = FB_VISUAL_TRUECOLOR; /* TFT*/
s3c_fb->fix.line_length = *; /* 设置可变的参数 */
s3c_fb->var.xres = ;
s3c_fb->var.yres = ;
s3c_fb->var.xres_virtual = ;
s3c_fb->var.yres_virtual = ;
s3c_fb->var.xres_virtual = ;
s3c_fb->var.yres_virtual = ;
s3c_fb->var.bits_per_pixel = ; s3c_fb->var.red.offset = ;
s3c_fb->var.red.length = ; s3c_fb->var.green.offset = ;
s3c_fb->var.green.length = ; s3c_fb->var.blue.offset = ;
s3c_fb->var.blue.length = ; s3c_fb->var.activate = FB_ACTIVATE_NOW; /* 设置操作函数 */
s3c_fb->fbops = &s3c_fb_ops; /* 其他设置 */
s3c_fb->pseudo_palette = pseudo_palette;
//s3c_fb->screen_base = ; //显存的虚拟地址
s3c_fb->screen_size = **; //显存的大小 /* 配置GPIO */
gpbcon = ioremap(0x56000010,);
gpbdat = gpbcon + ;
gpccon = ioremap(0x56000020,);
gpdcon = ioremap(0x56000030,);
gpgcon = ioremap(0x56000060,); *gpccon = 0xaaaaaaaa;
*gpdcon = 0xaaaaaaaa;
*gpbcon &= ~();
*gpbcon |= ;
*gpbdat &= ~; //关闭背光
*gpgcon |= (<<); /* 根据lcd手册 配置lcd控制器 */
lcd_reg = ioremap(0x4d000000, sizeof(struct lcd_regs));
/*
* VCLK = HCLK / ((CLKVAL+1)*2)
*
* */
lcd_reg->lcdcon1 = (<<)|(<<)|(0x0c<<);
/*
* 垂直方向的时间参数
* VBPD 是VSYNC之后再过多长时间才能发出第一行数据
* LINEVAL 多少行数据 320
* VFPD 发出最后一行数据之后过多久才发出VSYNC信号
* VSPW VSYNC信号的脉冲宽度
* */
lcd_reg->lcdcon2 = (<<)|(<<)|(<<)|(); /*
* 水平方向的时间参数
* HBPD 是HSYNC之后再过多长时间才能发出第一个像素数据
* HOZVAL 有多少列
* HFPD 发出一行的最后一个数据后再过多长时间发出HSYNC信号
* HSPW HSYNC信号的脉冲宽度
* */
lcd_reg->lcdcon3 = (<<) | (<<) | (<<);
lcd_reg->lcdcon4 = ; /*
* 信号的极性
* bits[11] format for 565
* bits[10] 上升沿有效
* bits[9] HSYNC信号反转
* bits[8] VSYNC信号反转
* bits[7] 数据
* bits[6] VDEN
* bits[3] PWREN
* */
lcd_reg->lcdcon5 = (<<) | (<<) | (<<) | (<<); /* 分配显存 */
s3c_fb->screen_base = dma_alloc_writecombine(NULL, s3c_fb->fix.smem_len, &s3c_fb->fix.smem_start,GFP_KERNEL );
lcd_reg->lcdsaddr1 = (s3c_fb->fix.smem_start >> ) & ~(<<);
lcd_reg->lcdsaddr2 = ((s3c_fb->fix.smem_start + s3c_fb->fix.smem_len)>>) & 0x1fffff;
lcd_reg->lcdsaddr3 = (*/); /* 1行的长度 单位是2字节*/ /**/
lcd_reg->lcdcon1 |= ; /*使能LCD控制器*/
lcd_reg->lcdcon5 |= (<<); /* 使能LCD */
*gpbdat |= ; /*使能背光*/
/* 注册 */
register_framebuffer(s3c_fb); return ;
} static void lcd_exit( void )
{
unregister_framebuffer(s3c_fb);
lcd_reg->lcdcon1 &= ~;
*gpbdat &= ~;
dma_free_writecombine(NULL,s3c_fb->fix.smem_len,s3c_fb->screen_base,s3c_fb->fix.smem_start);
iounmap(lcd_reg);
iounmap(gpbcon);
iounmap(gpccon);
iounmap(gpdcon);
iounmap(gpgcon);
framebuffer_release(s3c_fb);
} module_init(lcd_init);
module_exit(lcd_exit);
MODULE_LICENSE("GPL");

注:这是240*320寸的屏幕。

需要在配置内核的时候不要把lcd驱动编译到内核中。

在安装驱动时会提示某些函数找不到。需要安装cfg*.ko等驱动模块。

也可以将触摸屏和按键做为控制终端。需要在 /etc/inittab中添加

tty1::askfirst:-/bin/sh
即可!

sd

嵌入式Linux驱动学习之路(十八)LCD驱动的更多相关文章

  1. 嵌入式Linux驱动学习之路(十五)按键驱动-定时器防抖

    在之前的定时器驱动程序中,我们发现在连续按下按键的时候,正常情况下应该是一次按下对应一次松开.而程序有时候会显示是两次按下,一次松开.这个问题是因为在按下的时候,因为是机械按键,所以电压信号会产生一定 ...

  2. 嵌入式Linux驱动学习之路(十四)按键驱动-同步、互斥、阻塞

    目的:同一个时刻,只能有一个应用程序打开我们的驱动程序. ①原子操作: v = ATOMIC_INIT( i )  定义原子变量v并初始化为i atomic_read(v)        返回原子变量 ...

  3. 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制

    实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...

  4. 嵌入式Linux驱动学习之路(十)字符设备驱动-my_led

    首先贴上代码: 字符设备驱动代码: /** *file name: led.c */#include <linux/sched.h> #include <linux/signal.h ...

  5. 嵌入式Linux驱动学习之路(十九)触摸屏驱动、tslib测试

    触摸屏使用流程: 1. 按下产生中断. 2.在中断处理程序中启动AD转换XY坐标. 3.AD转换结束并产生AD中断. 4. 在AD的中断处理函数中上报信息,启动定时器. 5. 定时器时间到后进入中断, ...

  6. 嵌入式Linux驱动学习之路(十六)输入子系统

    以前写的一些输入设备的驱动都是采用字符设备处理的.问题由此而来,Linux开源社区的大神们看到了这大量输入设备如此分散不堪,有木有可以实现一种机制,可以对分散的.不同类别的输入设备进行统一的驱动,所以 ...

  7. 嵌入式linux的学习之路[转]

    我认为的一条学习嵌入式Linux的路: 1)学习 Linux系统安装. 常用命令.应用程序安装. 2) 学习 Linux 下的 C 编程.这本书必学<UNIX 环境高级编程>.<UN ...

  8. IOS学习之路十八(通过 NSURLConnection 发送 HTTP 各种请求)

    你想通过 Http 协议向服务器发送一个 Get 的包装请求,并在这个请求中添加了一些请 求参数. 向远程服务器发送一个 GET 请求,然后解析返回的数据.通常一个 GET 请求是添加了 一些参数的, ...

  9. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

随机推荐

  1. EC笔记:第二部分:12、复制对象时勿忘其每一个成分

    EC笔记:第二部分:12.复制对象时勿忘其每一个成分 1.场景 某些时候,我们不想使用编译器提供的默认拷贝函数(包括拷贝构造函数和赋值运算符),考虑以下类定义: 代码1: class Point{ p ...

  2. windows 下使用Nginx替代apache作为服务器

    说实话, 在windows下使用Nginx 着实有点不太方便, 但因项目需求, 又不想换系统(虽然可以搞个虚拟机玩), 只能用Nginx了 好了, 不多说了. 开始... 首先我用的是xampp包(A ...

  3. Integer.valueof(String s)和Integer.parseInt(String s)的具体区别是什么?

    Integer.valueof(String s)和Integer.parseInt(String s)的具体区别是什么? Integer.valueof(String s)是将一个包装类是将一个实际 ...

  4. 【夯实PHP基础】PHP发送邮件(PHPMailer)

    本文地址 参考地址 分享提纲: 1. 概述 2. 编写代码发送邮件 3. 参考文档 1. 概述 本文是讲利用邮件类库 PHPMailer来发送邮件方法. 我们在做project的时候常常需要邮件的功能 ...

  5. CS.动态加载DLL.动态生成.运行代码.BS.AutoFac管理实现类

    以英雄联盟为例.界面上经常有Load....xxxx.dll.一般都是加载子系统.比如装备系统.英雄系统等.在实际开发中很多项目非常庞大.都会分割成独立子解决方案开发.后期就需要加载回来.一般都是利用 ...

  6. 20个编写现代 CSS 代码的建议

    明白何谓Margin Collapse 不同于其他很多属性,盒模型中垂直方向上的Margin会在相遇时发生崩塌,也就是说当某个元素的底部Margin与另一个元素的顶部Margin相邻时,只有二者中的较 ...

  7. iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)

    从2月14日开始,上传程序的同学可能会遇到提示上传失败的提示. 并且打开自己的钥匙串,发现所有的证书全部都显示此证书签发者无效. 出现以下情况: Failed to locate or generat ...

  8. “不要抄代码!自己的代码也不要抄!”

    在 Adventure 位于深圳的电子设备组装厂(SZE)里,小朱狠狠的对自己说. 他刚刚在调试 STM32F407VG 的 SPI 功能.就在昨天,他刚刚调试好了 STM32F407VG 的 USA ...

  9. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q138-Q140)

    Question  138 You are designing a SharePoint 2010 application that will deploy a Web Part assembly. ...

  10. 如何将github上的 lib fork之后通过podfile 改变更新源到自己fork的地址

    解决办法: http://stackoverflow.com/questions/20936885/cocoapods-and-github-forks 就是fork完后,提交更改到自己的github ...