《Linux驱动:s3c2440 lcd 驱动分析》

发布者:BlossomWhisper最新更新时间:2024-07-09 来源: elecfans关键字:Linux驱动  s3c2440  lcd  驱动 手机看文章 扫描二维码
随时随地手机看文章

一,前言

s3c2440 lcd 驱动分析,涉及到的内容有,LCD图像显示原理、s3c2440的LCD控制器的操作、LCD驱动使用平台总线-设备-驱动模型的实例、LCD相关参数的设置、fb字符设备驱动实例、framebuffer的注册和管理、以及一次LCD显示的完整过程分析。

二,LCD原理和硬件分析

2.1 LCD原理解析

SDRAM:在SDRAM中申请了一块连续的内存作为LCD显示数据的存储,叫做显存(framebuffer)。
LCD控制器:LCD控制器通过硬件电路和LCD屏连接。
LCD屏:作为一个外设通过硬件电路和MCU(引脚配置为LCD引脚)连接。


图像在LCD屏上显示,可以看成是LCD控制器先从显存中取出一帧图像数据,然后输入到LCD屏上。480*272的屏,所显示的一帧有480*272个像素点、272行、480列。对于每一行的像素点,LCD控制器有一个VCLK信号控制,每来一个VCLK,显示的像素点就向右移动一个,当移动到这一行中的最后一个像素点时,LCD控制器有一个HSYNC信号,控制像素点跳到下一行的第一个像素显示。对于一帧图像(也叫一场),即当像素点移动到最后一行的最后一个位置显示完后,LCD控制器有一个VSYNC信号,控制像素点重新移动到第一行的第一个像素显示下一帧图像。

2.2 硬件电路

2.2.1 LCD背光电路

开启LCD显示,需要使能KEYBOARD(一般EN表示高电平有效,EN上面画一横表示低电平有效)开启背光。


2.2.2 LCD屏

VLINE:HSYNC信号输出引脚(由LCD控制器操作)
VFRAME:VSYNC信号输出引脚(由LCD控制器操作)
VCLK:VCLK信号输出引脚(由LCD控制器操作)
VD3~VD7:RGB(565)中B数据输出引脚
VD10~VD15:RGB(565)中G数据输出引脚
VD19~VD23:RGB(565)中R数据输出引脚 TS*:供ts触摸屏连接


2.2.3 S3c2440主控

涉及 GPG、GPD、GPC引脚。
VM:LCD控制器使能引脚(由LCD控制器的寄存器配置),开启LCD显示需要配置相关寄存器的相应位使能。 LCD_PWREN:LCD电源使能引脚(由LCD控制器的寄存器配置),开启LCD显示需要配置相关寄存器的相应位使能。


三,LCD应用平台总线-设备-驱动模型

3.1 lcd 设备的加载和注册

MACHINE_START(S3C2440, 'SMDK2440')

/* Maintainer: Ben Dooks */

.phys_io    = S3C2410_PA_UART,

.io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

.boot_params    = S3C2410_SDRAM_PA + 0x100,


.init_irq   = s3c24xx_init_irq,

.map_io     = smdk2440_map_io,

.init_machine   = smdk2440_machine_init,

.timer      = &s3c24xx_timer,

MACHINE_END

将上面的宏展开


static const struct machine_desc __mach_desc_SMDK2440

 __attribute_used__

 __attribute__((__section__('.arch.info.init'))) = {

 .nr = MACH_TYPE_SMDK2410, /* architecture number */

 .name = 'SMDK2440', /* architecture name */

 /* Maintainer: Jonas Dietsche */

 .phys_io = S3C2410_PA_UART, /* start of physical io */

 .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

 .boot_params = S3C2410_SDRAM_PA + 0x100, /* tagged list */

 .map_io = smdk2440_map_io, /* IO mapping function */

 .init_irq = s3c24xx_init_irq,

 .init_machine = smdk2440_machine_init,

 .timer = &s3c24xx_timer,

}

MACHINE_START主要是定义了'struct machine_desc'的类型,放在 section('.arch.info.init'),是初始化数据,Kernel 起来之后将被丢弃。 各个成员函数在不同时期被调用:

1.init_machine 在 arch/arm/kernel/setup.c 中被 customize_machine 调用,放在 arch_initcall() 段里面,会自动按顺序被调用。

2. init_irq在start_kernel() -> init_IRQ() -> init_arch_irq() 被调用 。

3. map_io 在 setup_arch() -> paging_init() -> devicemaps_init()被调用 其他主要都在 setup_arch() 中用到。

系统初始化时,会调用smdk2440_machine_init


static void __init smdk2440_machine_init(void)

{

    // 这里设置LCD的参数,和驱动分离。这样要修改LCD时,驱动层程序可以不需要改动,只需修改设备层参数就行了,方便移植。

    s3c24xx_fb_set_platdata(&smdk2440_lcd_cfg);


    // 将smdk2440_devices数组中的设备注册到平台总线

    platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));

    smdk_machine_init();

}


// smdk2440_devices数组

static struct platform_device *smdk2440_devices[] __initdata = {

    &s3c_device_usb,

    &s3c_device_lcd,

    &s3c_device_wdt,

    &s3c_device_i2c,

    &s3c_device_iis,

    &s3c2440_device_sdi,

};


// lcd设备

struct platform_device s3c_device_lcd = {

    .name         = 's3c2410-lcd',

    .id       = -1,

    .num_resources    = ARRAY_SIZE(s3c_lcd_resource),

    .resource     = s3c_lcd_resource,

    .dev              = {

        .dma_mask       = &s3c_device_lcd_dmamask,

        .coherent_dma_mask  = 0xffffffffUL

    }

};


// 设置lcd设备参数 smdk2440_lcd_cfg。各参数含义后面在probe分析时解析

/* 480x272 */ 

static struct s3c2410fb_mach_info smdk2440_lcd_cfg __initdata = {

    .regs   = {

        .lcdcon1 =  S3C2410_LCDCON1_TFT16BPP |

                S3C2410_LCDCON1_TFT |

                  S3C2410_LCDCON1_CLKVAL(0x04),


        .lcdcon2 =  S3C2410_LCDCON2_VBPD(1) |

                S3C2410_LCDCON2_LINEVAL(271) |

                S3C2410_LCDCON2_VFPD(1) |

                S3C2410_LCDCON2_VSPW(9),


        .lcdcon3 =  S3C2410_LCDCON3_HBPD(1) |

                S3C2410_LCDCON3_HOZVAL(479) |

                S3C2410_LCDCON3_HFPD(1),


        .lcdcon4 =  S3C2410_LCDCON4_HSPW(40),


        .lcdcon5    = S3C2410_LCDCON5_FRM565 |

                  S3C2410_LCDCON5_INVVLINE |

                  S3C2410_LCDCON5_INVVFRAME |

                  S3C2410_LCDCON5_PWREN |

                  S3C2410_LCDCON5_HWSWP,

    },


    .gpccon      =  0xaaaaaaaa,

    .gpccon_mask    = 0xffffffff,

    .gpcup       =  0xffffffff,

    .gpcup_mask = 0xffffffff,


    .gpdcon      =  0xaaaaaaaa,

    .gpdcon_mask    = 0xffffffff,

    .gpdup       =  0xffffffff,

    .gpdup_mask = 0xffffffff,


    .fixed_syncs =  1,

    .type        =  S3C2410_LCDCON1_TFT, 

    .width      = 480,

    .height     = 272,


    .xres       = {

        .min    = 480,

        .max    = 480,

        .defval = 480,

    },


    .yres       = {

        .max    =   272,

        .min    =   272,

        .defval =   272,

    },


    .bpp    = {

        .min    =   16,

        .max    =   16,

        .defval =   16,

    },

};

调用platform_device_register注册平台设备


int platform_add_devices(struct platform_device **devs, int num)

{

    int i, ret = 0;


    for (i = 0; i < num; i++) {

        ret = platform_device_register(devs[i]);

        if (ret) {

            while (--i >= 0)

                platform_device_unregister(devs[i]);

            break;

        }

    }


    return ret;

}

3.2 lcd 驱动的加载和注册

3.2.1 编译进内核,加载驱动

编译内核设置,make menuconfig

-> Device Drivers

  -> Graphics support

    <*> Support for frame buffer devices

linux-2.6.22.6/.config


CONFIG_FB_S3C2410=y


linux-2.6.22.6/drivers/video/Makefile


obj-$(CONFIG_FB_S3C2410) += s3c2410fb.o


然后make uImage,将s3c2410fb驱动编译进内核,系统启动便会加载,即调用驱动的s3c2410fb_init函数。

int __devinit s3c2410fb_init(void)

{

    // 注册到平台总线驱动

    return platform_driver_register(&s3c2410fb_driver);

}

3.3 lcd 设备和驱动的匹配

platform_driver_register->

    driver_register->

        bus_add_driver->

            driver_attach->

                bus_for_each_dev->

                    __driver_attach

__driver_attach(kernel 2.6.22)

static int __driver_attach(struct device * dev, void * data)

{

    struct device_driver * drv = data;


    /*

     * Lock device and try to bind to it. We drop the error

     * here and always return 0, because we need to keep trying

     * to bind to devices and some drivers will return an error

     * simply if it didn't support the device.

     *

     * driver_probe_device() will spit a warning if there

     * is an error.

     */


    if (dev->parent)    /* Needed for USB */

        down(&dev->parent->sem);

    down(&dev->sem);

    if (!dev->driver)

        driver_probe_device(drv, dev); // 调用驱动层程序的 probe函数

    up(&dev->sem);

    if (dev->parent)

        up(&dev->parent->sem);


    return 0;

}

__driver_attach(kernel 3.4)

static int __driver_attach(struct device *dev, void *data)

{

    struct device_driver *drv = data;


    /*

     * Lock device and try to bind to it. We drop the error

     * here and always return 0, because we need to keep trying

     * to bind to devices and some drivers will return an error

     * simply if it didn't support the device.

     *

     * driver_probe_device() will spit a warning if there

     * is an error.

     */


    // 匹配驱动和设备

    if (!driver_match_device(drv, dev))

        return 0;


    if (dev->parent)    /* Needed for USB */

        device_lock(dev->parent);

    device_lock(dev);

    if (!dev->driver)

        driver_probe_device(drv, dev);

    device_unlock(dev);

    if (dev->parent)

        device_unlock(dev->parent);


    return 0;

}

driver_probe_device 调用驱动层的probe

[1] [2]
关键字:Linux驱动  s3c2440  lcd  驱动 引用地址:《Linux驱动:s3c2440 lcd 驱动分析》

上一篇:《Linux驱动:s3c2440 lcd 驱动分析--终结篇》
下一篇:《Linux驱动:s3c2410/s3c2440 ts驱动分析--终结篇》

推荐阅读最新更新时间:2024-11-02 08:10

东芝推出 IGBT/MOSFET栅极驱动的薄型封装高峰值输出电流光耦
东芝推出用于IGBT/MOSFET栅极驱动的薄型封装高峰值输出电流光耦 中国上海,2021年11月30日——东芝电子元件及存储装置株式会社(“东芝”)今日宣布,推出采用薄型SO6L封装的两款光耦---“TLP5705H”和“TLP5702H”,可在小型IGBT/MOSFET中用作绝缘栅极驱动IC。这两款器件于今日开始支持批量出货。 TLP5705H是东芝首款采用厚度仅有2.3毫米(最大值)的薄性封装(SO6L)可提供±5.0A峰值输出电流额定值的产品。传统采用缓冲电路进行电流放大的中小型逆变器与伺服放大器等设备,现在可直接通过该光耦驱动其IGBT/MOSFET而无需任何缓冲器。这将有助于减少部件数量并实现设计小型化。
[电源管理]
东芝推出 IGBT/MOSFET栅极<font color='red'>驱动</font>的薄型封装高峰值输出电流光耦
S3C2416替代S3C2440项目数据比对
S3C2440芯片已经停产,多年累积下来基于S3C2440而设计的产品定不在少数。为了使广大2440用户摆脱该mcu停产带来的麻烦,完美过渡升级,飞凌特推出FL2416开发板。该板采用核心板加底板的架构设计,方便学习的同时也方便产品开发。在这里笔者先就2416开发板和2440开发板,从芯片级、核心板级、底板级对两种开发板进行一下比对,使大家对FL2416开发板有一个初步的了解。 一、 S3C2416芯片与S3C2440芯片对比 S3C2416与S3C2440芯片对比 比对项目 S3C2416芯片 S3C2440芯片 备注 A RM
[单片机]
液晶面板价跌 友达08年营收衰退逾一成
液晶面板供应大厂友达光电(AUO)公布2008年12月份合并营业额及单一营业额,分别达新台币147亿3,600万元及新台币146亿8,400万元,两项营业额分别较2008年11月份减少17.0%及16.7%,与2007年同期相比均分别减少69.9%。 2008年全年合并营业额达4,239亿2,900万元,比2007年下滑11.7%。至于台湾单一营业额部份,累计2008年全年为新台币4,219亿5,700万元,亦比2007年同期减少12.0%。 以出货状况来看,友达12月份整体大尺寸面板(10吋或10吋以上)出货量,包括桌上型显示器、笔记型计算机、液晶电视及通用显示器等,约达422万片,比2008年11月份减少
[焦点新闻]
聚积强攻mini LED背光驱动IC市场,进军多元市场
据台媒经济日报报道,聚积科技积极抢攻mini LED背光驱动芯片市场,目前已推出平板计算机、笔记本电脑、VR、电视及车用显示等应用产品。 发光二极管(LED)驱动芯片厂聚积表示,以miniLED作为背光驱动的发光源,可以有效改善LCD常见亮度不足的问题,并带来高对比度,显著提升画面质量。 聚积指出,旗下mini LED背光驱动芯片MBI6322最高可支持16扫设计,使用2颗驱动芯片便可实现百万对比度,有助精简器件数,符合消费性产品对高画质与轻薄化的设计需求。 聚积同时表示,MBI5268为目前公司可支持最高扫数达128扫的驱动芯片,主要锁定LED显示屏商用显示应用市场,可符合多数室内商用显示应用需求。
[手机便携]
基于WINCE的CAN总线设备驱动研究
    目前嵌入式车载网络系统一般采用LINUX嵌入式操作系统,以ARM7s3c44Bo为微控制器,SJAl000为CAN控制器的解决方案,实现LINUX下的CAN通信.在WINCE平台下,CAN卡的研究已经有很多。也取得了不错的应用效果,但以ARM9s3c2440为嵌入式系统硬件核心,外围扩展CAN控制器SJA1000,嵌入式操作系统采用WINCE的应用方案几乎没有,所以值得研究. 1 嵌入式车载网络的构成     嵌人式车载网络由若干个子节点控制器和主控制单元组成,其中主控单元对子节点进行监视与控制,实现不同的CAN数据总线系统问的数据交换,网络的拓朴结构如图1所示. 图1系统网络拓扑结构 2系统采用
[嵌入式]
下桥臂IGBT驱动电路图-原理图
在利用下臂驱动器驱动比150 A/1 200 V更大的IGBT时,可外接电流缓冲器,以扩大其驱动能力。由图2的工作时序可知,当DESAT端电压超过7 V时,产生过流。IGBT下桥臂的驱动电路图如图3所示。 图3中电源+5 V、VB+、VB-(VB+与VB-的电压均为25 V)为器件提供工作电压。与16引脚相连的电位符号IGBTBE和IGBT模块下桥臂的发射极相连,与11引脚相连的IGBTBG1~3分别和下桥臂的门极相接,控制IGBT的导通和关断。当14引脚DESAT的电压高于7 V检测到过流信号或VCC欠压时,6引脚FAULT为低电平,器件自动闭锁所有输出,用于保护IGBT模块,同时向微处理器发出一个报警信号。
[模拟电子]
下桥臂IGBT<font color='red'>驱动</font>电路图-原理图
LED驱动电路简介
  LED 驱动电路除了要满足安全要求外,另外的基本功能应有两个方面,一是尽可能保持恒流特性,尤其在电源电压发生±15%的变动时,仍应能保持输出电流在±10%的范围内变动。二是驱动电路应保持较低的自身功耗,这样才能使LED 的系统效率保持在较高水平。   传统的低效率电路: 图1   图1 是传统的低效率电路,电网电源通过降压变压器降压;桥式整流滤波后,通过电阻限流来使3 个LED 稳定工作,这种电路的致命缺点是:电阻R 的存在是必须的,R 上的有功损耗直接影响了系统的效率,当R 分压较小时,R 的压降占总输出电压的40%,输出电路在R 上的有功损耗已经占40%,再加上变压器损耗,系统效率小于50%。当电源电压在±10%的范围
[电源管理]
LED<font color='red'>驱动</font>电路简介
创新驱动多元市场拓展,MPS 2024 Q3营收再创新高
在2024年10月30日的第三季度财报电话会议中,Monolithic Power Systems (NASDAQ: MPWR,以下简称MPS) 披露了足够亮眼的财务表现,展示了其多元化市场策略和技术创新的显著成效。公司宣布第三季度收入创下6.201亿美元的新高,环比增长22%,同比增长30%,主要受益于汽车、通信、存储与计算等领域的需求提升,同时MPS还强调之前赢得的设计合同正在逐步转化为收入。 电动汽车和ADAS应用成亮点 MPS的汽车市场收入在第三季度实现了28%的环比增长,主要得益于车载信息娱乐系统、照明、ADAS(高级驾驶辅助系统)以及车身控制系统的需求增加。CEO Michael Hsing提到,MPS在汽车
[半导体设计/制造]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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