Linux开发十五

lcd驱动

象棋小子    1048272975

lcd能够支持彩色图像的显示和视频的播放,是一种很重要的输出设备,在一些嵌入式人机交互系统中,也往往需要lcd进行显示。Linux内核已经支持了s3c2416的lcd控制器。

1. lcd设备

lcd设备包含了名字、独有的资源等等一些驱动程序的硬件或自定义信息。通过platform_add_devices(platform_device_register)函数将定义的平台设备注册到内核中,用于匹配设备驱动。

内核在drivers\video\fbdev\s3c-fb.c中实现了s3c2416 lcd驱动,lcd设备平台代码如下。

static struct s3c_fb_pd_winhome2416_fb_win[] = {

[0]= {

.default_bpp  = 16,

.max_bpp      = 32,

.xres           = 800,

.yres           = 480,

},

};

static struct fb_videomodehome2416_lcd_timing = {

.pixclock = 41094,

.left_margin   = 19,

.right_margin       = 37,

.upper_margin     = 10,

.lower_margin      = 26,

.hsync_len     = 27,

.vsync_len     = 13,

.xres           = 800,

.yres           = 480,

};

static voids3c2416_fb_gpio_setup_24bpp(void)

{

unsignedint gpio;

for(gpio = S3C2410_GPC(1); gpio <= S3C2410_GPC(4); gpio++) {

s3c_gpio_cfgpin(gpio,S3C_GPIO_SFN(2));

s3c_gpio_setpull(gpio,S3C_GPIO_PULL_NONE);

}

for(gpio = S3C2410_GPC(8); gpio <= S3C2410_GPC(15); gpio++) {

s3c_gpio_cfgpin(gpio,S3C_GPIO_SFN(2));

s3c_gpio_setpull(gpio,S3C_GPIO_PULL_NONE);

}

for(gpio = S3C2410_GPD(0); gpio <= S3C2410_GPD(15); gpio++) {

s3c_gpio_cfgpin(gpio,S3C_GPIO_SFN(2));

s3c_gpio_setpull(gpio,S3C_GPIO_PULL_NONE);

}

}

static struct s3c_fb_platdatahome2416_fb_platdata = {

.win[0]          = &home2416_fb_win[0],

.vtiming  = &home2416_lcd_timing,

.setup_gpio   = s3c2416_fb_gpio_setup_24bpp,

.vidcon0 = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,

.vidcon1 = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,

};

static struct resource s3c_fb_resource[]= {

[0]= DEFINE_RES_MEM(S3C_PA_FB, SZ_16K),

[1]= DEFINE_RES_IRQ(IRQ_LCD_VSYNC),

[2]= DEFINE_RES_IRQ(IRQ_LCD_FIFO),

[3]= DEFINE_RES_IRQ(IRQ_LCD_SYSTEM),

};

struct platform_device s3c_device_fb = {

.name            = "s3c-fb",

.id          = -1,

.num_resources    = ARRAY_SIZE(s3c_fb_resource),

.resource       = s3c_fb_resource,

.dev        = {

.dma_mask          = &samsung_device_dma_mask,

.coherent_dma_mask  = DMA_BIT_MASK(32),

},

};

void __init s3c_fb_set_platdata(structs3c_fb_platdata *pd)

{

s3c_set_platdata(pd,sizeof(struct s3c_fb_platdata),

&s3c_device_fb);

}

在板级初始化函数home2416_machine_init()中加入lcd平台数据s3c_fb_set_platdata(&home2416_fb_platdata),在static struct platform_device *home2416_devices[]板级平台设备列表中加入&s3c_device_fb,使lcd设备能够注册到内核中。

内核在drivers\video\backlight\ pwm_bl.c中实现了基于pwm方式的lcd背光驱动,背光设备平台代码如下。

static int s3c2416_backlight_init(structdevice *dev)

{

gpio_request(S3C2410_GPB(0),"Backlight");

gpio_direction_output(S3C2410_GPB(0),0);

s3c_gpio_setpull(S3C2410_GPB(0),S3C_GPIO_PULL_NONE);

s3c_gpio_cfgpin(S3C2410_GPB(0),S3C2410_GPB0_TOUT0);

return0;

}

static ints3c2416_backlight_notify(struct device *dev, int brightness)

{

if(!brightness) {

gpio_direction_output(S3C2410_GPB(0),0);

}else {

gpio_direction_output(S3C2410_GPB(0),0);

s3c_gpio_setpull(S3C2410_GPB(0),S3C_GPIO_PULL_NONE);

s3c_gpio_cfgpin(S3C2410_GPB(0),S3C2410_GPB0_TOUT0);

}

returnbrightness;

}

static voids3c2416_backlight_exit(struct device *dev)

{

gpio_direction_output(S3C2410_GPB(0),0);

}

static structplatform_pwm_backlight_data backlight_data = {

.max_brightness= 100,

.dft_brightness= 50,

.enable_gpio    = -1,

.init           = s3c2416_backlight_init,

.notify           = s3c2416_backlight_notify,

.exit           = s3c2416_backlight_exit,

};

static struct platform_devices3c2416_backlight = {

.name= "pwm-backlight",

.dev  = {

.parent= &samsung_device_pwm.dev,

.platform_data= &backlight_data,

},

.id   = -1,

};

static struct pwm_lookups3c2416_pwm_lookup[] = {

PWM_LOOKUP("samsung-pwm",0, "pwm-backlight", NULL, 36296,

PWM_POLARITY_NORMAL),

};

在板级初始化函数home2416_machine_init ()中把pwm背光映射到pwm设备表中pwm_add_table(s3c2416_pwm_lookup, ARRAY_SIZE(s3c2416_pwm_lookup)),在static struct platform_device *home2416_devices[]板级平台设备列表中加入&s3c2416_backlight,使背光设备能够注册到内核中。

修改drivers\tty\vt\vt.c,禁止lcd开机一段时间后自动关屏。

static int blankinterval = 0;

修改drivers/video/console/fbcon.c,禁止光标闪烁。

static int fbcon_cursor_noblink = 1;

2. 内核配置

Linux配置支持lcd设备驱动,选中Device Drivers->Graphics support->Framebuffer Devices->Samsumg S3C framebuffer support 。

Linux配置支持lcd背光驱动,选中DeviceDrivers->Graphics support->Backlight & LCD device support->GenericPWM based Backlight Driver。

Linux配置开机logo,DeviceDrivers->Graphics support->Bootup logo->Standard 224-color Linux logo。

3. lcd测试

cat /proc/devices可以知道lcd主设备号为29,次设备号为0,在/dev目录中创建fb0设备文件。

mknod  /dev/fb0  c  29  0

lcd显示黑屏。

mknod  /dev/zero  c  1  5

dd if=/dev/zero of=/dev/fb0

4. 应用编程

应用程序可以通过设备文件访问lcd,lcd纯色显示应用测试代码lcd_test.c如下。

#include "fcntl.h"

#include "unistd.h"

#include "stdio.h"

#include "stdlib.h"

#include "sys/mman.h"

void screen_clear(unsigned short*ppixel, unsigned short color)

{

inti;

for(i=0; i<800*480; i++)

ppixel[i]= color;

}

int main(void)

{

unsignedshort colors[] = {0xffff, 0x0000, 0xf800,

0x07e0,0x001f, 0xffe0, 0xf81f, 0x7ff};

intscreen_size;

intfd;

intindex;

unsignedshort *ppixel;

fd= open("/dev/fb0", O_RDWR);

if(fd == -1) {

printf("Openframebuffer failed\n");

exit(1);

}

screen_size= 800*480*2;

ppixel=(unsigned short *)mmap(0, screen_size,

PROT_READ|PROT_WRITE,MAP_SHARED, fd,0);

if(ppixel == (unsigned short *)-1) {

printf("Mapframebuffer failed\n");

exit(1);

}

while(1) {

screen_clear(ppixel,colors[index]);

index++;

if(index >= sizeof(colors)/sizeof(colors[0]))

index= 0;

sleep(2);

}

umap(ppixel,screen_size);

close(fd);

return0;

}

用arm-linux-gcc静态编译,使之生成arm cpu可执行的指令,并且可脱离任何库独立运行,arm-linux-gcc -static -o lcd_test lcd_test.c,生成lcd_test可执行文件。复制可执行文件到根文件系统,目标板启动后在目录输入./lcd_test即可执行。

5. 附录

https://pan.baidu.com/s/1slczwhJ

bootloader源码以及使用说明

https://pan.baidu.com/s/1eRDJtNs

Qt5.8官网源码

https://pan.baidu.com/s/1nuGmSqt

本系列例程的根文件系统

https://pan.baidu.com/s/1i5btLGT

opev3.2.0官网源码

https://pan.baidu.com/s/1pLpuHw3

yaffs官网源码

https://pan.baidu.com/s/1bpkZynt

busybox-1.26.2官网源码

https://pan.baidu.com/s/1i4EtjfR

tslib官网源码

https://pan.baidu.com/s/1i5MGRhb

mplayer-1.3.0官网源码

https://pan.baidu.com/s/1sl0fXlr

基于S3C2416修改的linux-4.10.10源码

Linux开发十五_lcd驱动相关推荐

  1. STC8H开发(十五): GPIO驱动Ci24R1无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  2. STC8H开发(十六): GPIO驱动XL2400无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  3. linux 第十五天 linuxprobe

    linux 第十五天 linuxprobe 课程概况 今天学习了samba服务.nfs服务. 课堂体会 Samba服务可以很方便的与window共享文件. 课堂笔记

  4. 正点原子Linux开发板 spi内核驱动 0.96寸ips屏教程

    正点原子Linux开发板 spi内核驱动 0.96寸ips屏教程 首先选择模块 设备树配置 spi驱动程序(用的spi_driver) app 最近做下底层SPI驱动来驱动IPS屏,本来想实现这种效果 ...

  5. Linux学习十五 DNS基础服务

    Linux学习十五 DNS基础服务 DNS服务基础 BIND 伯利克Internet 域名服务 主要执行程序:/usr/sbin/named 系统服务:named 默认端口: TCP/UDP 53 主 ...

  6. 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...

  7. SQL2K数据库开发十五之表操作查看表中的数据

    1.可以使用SELECT语句查询表中的数据.如在查询分析器中执行SELECT * FROM Products语句就可以查询Products表中的数据,如下图: 2.如在企业管理器中查询表中数据,则要展 ...

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

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

  9. 嵌入式Linux开发板_WIFI无线网卡驱动移植

    在线课堂:https://www.100ask.net/index(课程观看) 论  坛:http://bbs.100ask.net/(学术答疑) 开 发 板:https://100ask.taoba ...

最新文章

  1. 水痘痊愈就能终生免疫?其实病毒仍潜伏在神经,随时以更可怕的形式爆发......
  2. Dev c++中{ }不能自动缩进
  3. 2.7万字还原行业面貌,《2019 AI金融风控行业研究报告》正式上线!...
  4. java byte 判断相等_你真的了解Java中quot;==quot;和equals()的区别?
  5. 第二步_安装samba服务器
  6. 高校图书馆管理系统 php 漏洞,Libsys图书管理系统 V5.5 变量覆盖漏洞
  7. 第九章 虚拟内存 第八节 内存映射
  8. gdt描述_GDT形位公差详解.ppt
  9. iOS逆向及逆向防护相关资料
  10. AUTOCAD——比例缩放
  11. ubuntu 20.04 修改文件夹默认图标
  12. druiddatasource 方法_DruidDataSource详解(一)
  13. reboot Linux 命令使用,linux中的reboot命令的详细解释
  14. 阿里云机器的JVM内存调优经历(菜鸟必看,大神请绕道)
  15. 质量团队在VUCA时代如何走?
  16. 如何使用Python还原村上春树笔下经典的那句“我爱你像爱春天的小熊”
  17. 联想拯救者r7000p安装Linux双系统(二)
  18. Unity ILRuntime Debugger使用及常见问题
  19. 嵌入式C/C++面试题
  20. .NET Core 和 .NET Framework 中的 MEF2

热门文章

  1. 纯html+css实现点击显示再次点击隐藏并且不联动的多个下拉菜单
  2. 打桥位lisp_通用打印函数,可指定参数,可打印pdf
  3. 大数据专业好找工作么
  4. 利用浏览器F12排查前端(JSP)页面错误
  5. 做UG模具设计师需会哪些技能?
  6. 软工第二次作业——软件案例分析
  7. NLP中的关系抽取方法归纳
  8. C#WebApi上传文件和下载文件
  9. e站app里站hosts_“科普e站”启用 让科学触手可及
  10. 删除手机图片后保持图库不会出现黑图的方法。