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

s3c6410硬件DISPLAY CONTROLLER(显示控制器)的链接地址

linux中LCD设备驱动(1)——framebuffer(帧缓冲)的链接地址

linux中LCD设备驱动(2)——基于s3c6410平台的链接地址


linux中LCD设备驱动(3)——基于s3c6410平台的链接地址


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

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

#include <linux/wait.h>
#include <linux/fb.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <plat/regs-gpio.h>
#include <plat/regs-lcd.h>
#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 initialized\n");


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 control\n");
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 control\n");
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 control\n");
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下s3c6410的GPIO操作(1)的链接地址


linux中LCD设备驱动(5)——基于s3c6410平台的链接地址




  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
S3C6410 是一款由三星公司推出的嵌入式微处理器,广泛应用于各种移动设备。该处理器的驱动程序用于与操作系统进行通信,确保设备和操作系统能够正常协同工作。 在 S3C6410 处理器上安装 Windows 7 64 位操作系统后,需要相应的驱动程序来识别和管理处理器上的硬件设备驱动程序通常是由设备制造商开发并提供的,以确保设备能够与操作系统相互匹配,实现最佳的兼容性和性能。 要获取适用于 S3C6410 处理器的 Windows 7 64 位驱动程序,您可以按照以下步骤操作: 1. 确定您的设备型号和规格。搜索三星官方网站或其他可靠的驱动下载网站,以查找适用于 S3C6410 处理器的 Windows 7 64 位驱动程序。 2. 在驱动程序下载页面,选择与您的操作系统和设备型号相匹配的驱动程序版本。 3. 下载驱动程序并保存在计算机的任意位置。 4. 双击驱动程序安装文件,按照提示进行安装。在安装过程可能需要提供管理员权限。 5. 安装完成后,重新启动计算机以使驱动程序生效。 请注意,驱动程序的安装可能因设备型号和供应商而有所不同。在任何情况下,请确保从官方渠道下载驱动程序以确保其正版和可信赖。 总结:安装 S3C6410 处理器的 Windows 7 64 位驱动程序是为了设备和操作系统之间的兼容性和协同工作。通过按照设备型号,在官方网站或其他可靠的驱动下载网站搜索并下载适用的驱动程序,然后按照提示进行安装和配置,即可实现设备和操作系统的正常工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值