linux中LCD设备驱动(4)——基于s3c6410平台

发布者:不染尘埃最新更新时间:2022-06-13 来源: eefocus关键字:linux 手机看文章 扫描二维码
随时随地手机看文章

我们这一篇来说与具体的TFT显示器有关的部分,当遇到具体的显示器是我们应该设置什么参数,怎样设置这些参数。


1、在s3cfb_WXCAT43.c (linux2.6.28driversvideosamsung)文件中是有关具体显示器的设置。我们一段一段来看。


#include

#include

#include

#include

#include

#include

#include "s3cfb.h"


#define S3CFB_HFP 2/* front porch */

#define S3CFB_HSW 41/* hsync width */

#define S3CFB_HBP 2/* back porch */



#define S3CFB_VFP 2/* front porch */

#define S3CFB_VSW 10/* vsync width */

#define S3CFB_VBP 2/* back porch */



#define S3CFB_HRES 480/* horizon pixel  x resolition */

#define S3CFB_VRES 272/* line cnt       y resolution */



#define S3CFB_HRES_VIRTUAL 480/* horizon pixel  x resolition */

#define S3CFB_VRES_VIRTUAL 544/* line cnt       y resolution */



#define S3CFB_HRES_OSD 480/* horizon pixel  x resolition */

#define S3CFB_VRES_OSD 272/* line cnt       y resolution */



#define S3CFB_VFRAME_FREQ     60/* frame rate freq */



#define S3CFB_PIXEL_CLOCK (S3CFB_VFRAME_FREQ * (S3CFB_HFP + S3CFB_HSW + S3CFB_HBP + S3CFB_HRES) * (S3CFB_VFP + S3CFB_VSW + S3CFB_VBP + S3CFB_VRES))这个不太明白是干嘛用的?


那么上面这些参数的值是在那里得到的呢?那就要看具体的显示器的手册了。如下所示:

2、在这个文件中,还有两个函数,源码如下:


void s3cfb_init_hw(void)

{

printk(KERN_INFO "LCD TYPE :: LTE480WV will be initializedn");



s3cfb_set_fimd_info();

s3cfb_set_gpio();

}


这个函数在s3cfb_init_fbinfo函数中被调用,其实就是在LCD对应的probe函数中被调用。


static void s3cfb_init_fbinfo(s3cfb_info_t *finfo, char *drv_name, int index)

{

int i = 0;

if (index == 0)

s3cfb_init_hw();


.........



2.1、现在来分析s3cfb_set_fimd_info函数,源码如下:


static void s3cfb_set_fimd_info(void)

{

s3cfb_fimd.vidcon1 = S3C_VIDCON1_IHSYNC_INVERT | S3C_VIDCON1_IVSYNC_INVERT | S3C_VIDCON1_IVDEN_NORMAL;


其中有#define S3C_VIDCON1_IHSYNC_INVERT(1<<6)


      #define S3C_VIDCON1_IVSYNC_INVERT(1 << 5)


      #define S3C_VIDCON1_IVDEN_NORMAL(0<<4)


看下图:


         

        s3cfb_fimd.vidtcon0 = S3C_VIDTCON0_VBPD(S3CFB_VBP - 1) | S3C_VIDTCON0_VFPD(S3CFB_VFP - 1) | S3C_VIDTCON0_VSPW(S3CFB_VSW - 1);


        其中有: /*  VIDEO Time Control 0 register - VIDTCON0 */

 #define S3C_VIDTCON0_VBPDE(x) (((x)&0xFF)<<24)

 #define S3C_VIDTCON0_VBPD(x) (((x)&0xFF)<<16)

 #define S3C_VIDTCON0_VFPD(x) (((x)&0xFF)<<8)

 #define S3C_VIDTCON0_VSPW(x) (((x)&0xFF)<<0)


        s3cfb_fimd.vidtcon1 = S3C_VIDTCON1_HBPD(S3CFB_HBP - 1) | S3C_VIDTCON1_HFPD(S3CFB_HFP - 1) | S3C_VIDTCON1_HSPW(S3CFB_HSW - 1);

s3cfb_fimd.vidtcon2 = S3C_VIDTCON2_LINEVAL(S3CFB_VRES - 1) | S3C_VIDTCON2_HOZVAL(S3CFB_HRES - 1);



s3cfb_fimd.vidosd0a = S3C_VIDOSDxA_OSD_LTX_F(0) | S3C_VIDOSDxA_OSD_LTY_F(0);

s3cfb_fimd.vidosd0b = S3C_VIDOSDxB_OSD_RBX_F(S3CFB_HRES - 1) | S3C_VIDOSDxB_OSD_RBY_F(S3CFB_VRES - 1);



s3cfb_fimd.vidosd1a = S3C_VIDOSDxA_OSD_LTX_F(0) | S3C_VIDOSDxA_OSD_LTY_F(0);

s3cfb_fimd.vidosd1b = S3C_VIDOSDxB_OSD_RBX_F(S3CFB_HRES_OSD - 1) | S3C_VIDOSDxB_OSD_RBY_F(S3CFB_VRES_OSD - 1);


这些也和上面一样的,对照手册,设置就可以了。



s3cfb_fimd.width = S3CFB_HRES;  屏幕的大小信息

s3cfb_fimd.height = S3CFB_VRES;

s3cfb_fimd.xres = S3CFB_HRES;

s3cfb_fimd.yres = S3CFB_VRES;



#if defined(CONFIG_FB_S3C_VIRTUAL_SCREEN)  与虚拟屏有关

s3cfb_fimd.xres_virtual = S3CFB_HRES_VIRTUAL;

s3cfb_fimd.yres_virtual = S3CFB_VRES_VIRTUAL;

#else

s3cfb_fimd.xres_virtual = S3CFB_HRES;

s3cfb_fimd.yres_virtual = S3CFB_VRES;

#endif



s3cfb_fimd.osd_width = S3CFB_HRES_OSD; 还记得上一篇中OSD的含义吗?

s3cfb_fimd.osd_height = S3CFB_VRES_OSD;

s3cfb_fimd.osd_xres = S3CFB_HRES_OSD;

s3cfb_fimd.osd_yres = S3CFB_VRES_OSD;



s3cfb_fimd.osd_xres_virtual = S3CFB_HRES_OSD;

s3cfb_fimd.osd_yres_virtual = S3CFB_VRES_OSD;



s3cfb_fimd.pixclock = S3CFB_PIXEL_CLOCK;



s3cfb_fimd.hsync_len = S3CFB_HSW;

s3cfb_fimd.vsync_len = S3CFB_VSW;

s3cfb_fimd.left_margin = S3CFB_HFP;

s3cfb_fimd.upper_margin = S3CFB_VFP;

s3cfb_fimd.right_margin = S3CFB_HBP;

s3cfb_fimd.lower_margin = S3CFB_VBP;

}


2.2、接着分析另外一个函数s3cfb_set_gpio(),这个函数的源码如下:



int s3cfb_set_gpio(void)

{

unsigned long val;

int i, err;



/* Must be '0' for Normal-path instead of By-pass */

writel(0x0, S3C_HOSTIFB_MIFPCON);


其中有:#define S3C_HOSTIFB_MIFPCONS3C_HOSTIFBREG(0x800C)


       #define S3C_HOSTIFAREG(x)((x) + S3C64XX_VA_HOSTIFA)


同时在s3c6410的手册上有这么一句话:


Caution 1: In normal display mode, SEL_BYPASS@ MIFPCON (0x7410_800C) register must be set “0”.



/* enable clock to LCD */使能LCD的时钟

val = readl(S3C_HCLK_GATE);

val |= S3C_CLKCON_HCLK_LCD;

writel(val, S3C_HCLK_GATE);



/* phantom */也和时钟有关

val = readl(S3C_SCLK_GATE);

val |= (1<<14);

writel(val, S3C_SCLK_GATE);

/* ------- */



/* select TFT LCD type (RGB I/F) */设置RGB的数据格式

val = readl(S3C64XX_SPC_BASE);

val &= ~0x3;

val |= (1 << 0);

writel(val, S3C64XX_SPC_BASE);


其中有:#define S3C64XX_SPC_BASE(S3C64XX_VA_GPIO + 0x01A0)


这个参数的设置,和具体的TFT屏有关,在TFT屏的手册中有:24bit RGB Interface


/* VD */主要是芯片引脚的设置,看下图:不过你可能对s3c_gpio_cfgpin函数不明白,它是怎样实现的,我在以前的写的一篇博客中有说明,你可以去查看,本篇后面我会给出链接地址。

for (i = 0; i < 16; i++)

s3c_gpio_cfgpin(S3C64XX_GPI(i), S3C_GPIO_SFN(2));



for (i = 0; i < 12; i++)

s3c_gpio_cfgpin(S3C64XX_GPJ(i), S3C_GPIO_SFN(2));


#ifndef CONFIG_BACKLIGHT_PWM  

/* backlight ON */

//printk("oPEN LCD BACKLIGHT1.n");   和LCD背光灯有关,看下面的图:

 
 

        if (gpio_is_valid(S3C64XX_GPF(14))) {              //NOTE: orign GPF15 here

err = gpio_request(S3C64XX_GPF(14), "GPF");



if (err) {

printk(KERN_ERR "failed to request GPF for "

"lcd backlight controln");

return err;

}



gpio_direction_output(S3C64XX_GPF(14), 1);

gpio_set_value(S3C64XX_GPF(14), 1);

}

#endif

//printk("oPEN LCD BACKLIGHT2.n");

         if (gpio_is_valid(S3C64XX_GPE(0))) {

err = gpio_request(S3C64XX_GPE(0), "GPE");



if (err) {

printk(KERN_ERR "failed to request GPE for "

"lcd reset controln");

return err;

}



gpio_direction_output(S3C64XX_GPE(0), 1);

}

gpio_set_value(S3C64XX_GPE(0), 1);

gpio_free(S3C64XX_GPE(0));



/* module reset */

/*if (gpio_is_valid(S3C64XX_GPN(5))) {

err = gpio_request(S3C64XX_GPN(5), "GPN");



if (err) {

printk(KERN_ERR "failed to request GPN for "

"lcd reset controln");

return err;

}



gpio_direction_output(S3C64XX_GPN(5), 1);

}



mdelay(100);



gpio_set_value(S3C64XX_GPN(5), 0);

mdelay(10);



gpio_set_value(S3C64XX_GPN(5), 1);

mdelay(10);

*/

#ifndef CONFIG_BACKLIGHT_PWM

gpio_free(S3C64XX_GPF(14));

#endif


//gpio_free(S3C64XX_GPN(5));



return 0;

}


在这个函数出现了许多对GPIO操作的函数,如:s3c_gpio_cfgpin,gpio_direction_output等等,你可能不熟悉这些,下面这个地址链接对这些讲解的很详细。


关键字:linux 引用地址:linux中LCD设备驱动(4)——基于s3c6410平台

上一篇:linux中LCD设备驱动(6)——Fbmem.c文件
下一篇:linux中LCD设备驱动(1)——framebuffer(帧缓冲)

推荐阅读最新更新时间:2024-11-06 11:57

Sierra Wireless 推出基于 Linux 的强大平台 Legato™,
加拿大,温哥华 – 2014 年 2 月 24 日 – Sierra Wireless(纳斯达克交易代码:SWIR;多伦多证交所交易代码:SW)今日宣布推出 Legato™ 平台,这是一款基于 Linux 的开源嵌入式平台,旨在简化“设备到云端”的机对机 (M2M) 应用程序的开发。 Sierra Wireless 首席技术官 Philippe Guillemette 表示:“未来几年内有望实现数百万台设备的互联,但是要开启物联网的全新世界,仍然要面对很大的挑战。其中的一大挑战便是,要开发新的 M2M 应用程序,从设计到部署及后续阶段需要大量的时间和巨额的投资。在构建 Legato 期间,我们的目标是为开发商提供完整的‘
[嵌入式]
中国首个接入大模型的Linux操作系统来了
近日,开源国产操作系统deepin宣布正式接入大模型,多款自研应用迎来智能化升级,据悉,这是中国首个接入大模型的操作系统。 据deepin社区介绍,目前UOS AI实现了国内外主流大模型的能力接入,并封装成deepin的AI底层公共能力;同时,将把UOS AI逐步开源给第三方应用,让更多应用可以在deepin上直接调用大模型。 据悉,deepin选择了用户常用的智能全局搜索、邮件、浏览器三大应用,率先开启了AI能力。 其中,智能全局搜索支持三大核心能力,包括自然语言搜索、图片内容搜索、文档内容搜索,可实现“一键搜索,一键直达”的便捷体验。 官方表示,不管是关键词文件名查找,还是文件内容查找、图片OCR查
[嵌入式]
中国首个接入大模型的<font color='red'>Linux</font>操作系统来了
ARM集成开发环境eclipse的安装(for Linux
环境:ubuntu 16.04 64bit 1、安装JDK 下载:jdk-8u221-linux-x64.tar tar -zxvf 文件名 解压移动到/opt/目录下,并且更改目录名为jdk。 加入环境变量 vi /root/.bashrc export PATH=$PATH:/opt/jdk/bin 执行source ~/.bashrc 使环境变量生效 2、安装eclipse 下载 eclipse-cpp-helios-SR2-linux-gtk.tat.gz 点击下载 。 启动eclipse tar -zxvf 文件名 解压移动到/opt/目录下,并且更改目录名为eclipse。 加入环境变量 vi
[单片机]
ARM集成开发环境eclipse的安装(for <font color='red'>Linux</font>)
The Linux Foundation AI & Data基金会推出企业AI开放平台项目,英特尔携手伙伴共助AI创新发展
The Linux Foundation AI & Data基金会推出企业AI开放平台项目,英特尔携手伙伴共助AI创新发展 摘要:英特尔计划联合开发者社区,共同推动生成式AI系统发展。 北京时间2024年4月17日, The Linux Foundation AI & Data基金会公布了其最新的沙箱项目——企业AI开放平台(OPEA)。 OPEA旨在通过驱动多样且异构的生态系统的互操作性,并在检索增强生成(RAG)技术的支持下加速安全、高效的生成式AI部署。 在Intel Vision 2024大会上,英特尔公司首席执行官帕特·基辛格介绍了目前行业所面临的种种挑战,并宣布将创建一个面向全行业的企业AI开放平台。现在
[网络通信]
The <font color='red'>Linux</font> Foundation AI & Data基金会推出企业AI开放<font color='red'>平台</font>项目,英特尔携手伙伴共助AI创新发展
Linux系统下搭建C/C++开发的IDE环境
  RedHat Linux上面没有提供Anjuta软件包,上面提供了一个Glade应用程序界面设计工具。Linux上面使用Anjuta和Glade以及 Glademm软件包可以搭建一个Linux下面进行C/C++软件开发的IDE环境,可以进行GTK+/Gnome的应用程序开发。   以前开发 Linux 程序时写出好的图形化用户界面比较难。 在 GIMP 工具包 (GTK)诞生之后,这件事就变得比较容易了。当 Damon Chaplin 写出 GLADE 这个用于在 GTK 环境下生成图形化用户界面的工具后,就更容易了。但是 GLADE 仍然不能算是一个“集成开发环境”(如 Visual Basic 等等。), 因为程序员不能
[嵌入式]
arm linux内核移植裁剪过程概览
微处理器的产生为价格低廉、结构小巧的CPU和外设的连接提供了稳定可靠的硬件架构,这样,限制嵌入式系统发展的瓶颈就突出表现在了软件方面。尽管从八十年代末开始,已经陆续出现了一些嵌入式操作系统(比较著名的有Vxwork、pSOS、Neculeus和Windows CE)。但这些专用操作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;而且,源代码封闭性也大大限制了开发者的积极性。而Linux的开放性,使得许多人都认为Linux非常适合多数Intemet设备。Linux操作系统可以支持不同的设备和不同的配置。Linux对厂商不偏不倚,而且成本极低,因而很快成为用于各种设备的操作系统。嵌入式linux是大势所趋,其巨大的市场潜
[单片机]
OK6410A 开发板 (八) 117 linux-5.11 OK6410A Prefetch Abort 实例分析
流程 vector_pabt vector_stub pabt, ABT_MODE, 4 __pabt_usr usr_entry pabt_helper bl CPU_PABORT_HANDLER // v6_pabort do_PrefetchAbort const struct fsr_info *inf = ifsr_info + fsr_fs(ifsr); inf- fn(addr, ifsr | FSR_LNX_PF, regs); pr_alert( Unhandled prefetch abort: %s (0x%03x) at 0x%08lxn , inf-
[单片机]
Linux2.4与Linux2.6内核调度器的比较研究
Linux的内核开发是一个漫长的过程,自2001年11月开发出2.5.0以来,Linux内核的发展十分迅速,作了很多重大的改进,性能也有了很大的提高。内核调度器的改进是最主要的进步之一,本文对比研究了Linux2.4和Linux2.6的调度器,全面剖析了Linux2.6对调度器的改进。 一个成功的调度器的基本要求可以概括为以下三点: (1)减少花在调度上的时间,以增加花在执行程序上的时间; (2)在多处理器系统上,保持处理器的负载平衡; (3)对交互式应用有良好的响应速度。 但是,一个成功的调度器是很难设计好的,因为一个真正投入运行的系统受到很多因素的制约。相对于Linux2.6,Linux2.4的调度器有很多的不足之处,
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved