《Linux驱动:s3c2440 lcd 驱动分析--终结篇》

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

    .probe      = s3c2410fb_probe,

    .remove     = s3c2410fb_remove,

    .suspend    = s3c2410fb_suspend,

    .resume     = s3c2410fb_resume,

    .driver     = {

        .name   = 's3c2410-lcd',

        .owner  = THIS_MODULE,

    },

};

3.3.2 lcd驱动注册时的匹配

platform_driver_register->

    driver_register->

        bus_add_driver->

            driver_attach->

                bus_for_each_dev-> // 从平台总线的的设备链表中,取出每一项设备进行匹配

                    __driver_attach->

                        driver_probe_device->

                            if (drv->bus->match && !drv->bus->match(dev, drv)) // 此总线类型为平台总线,其存在match函数,即调用platform_match进行匹配

                            // 之后的执行和上一小节分析的一样

3.3.3 匹配成功后 driver_probe_device 调用驱动层的probe

driver_probe_device-> // 在此函数中匹配成功的话,就会去调用驱动的probe函数

    really_probe->

        drv->probe(dev)

四,probe函数分析(s3c2410fb_probe)

4.1 注册framebuffer

4.1.1 申请struct fb_info

struct fb_info     *fbinfo;

...

fbinfo = framebuffer_alloc(sizeof(struct s3c2410fb_info), &pdev->dev);

if (!fbinfo) {

    return -ENOMEM;

}

...

4.1.2 参数设置

见4.2 LCD参数设置

4.1.3 注册

...

ret = register_framebuffer(fbinfo);

if (ret < 0) {

    printk(KERN_ERR 'Failed to register framebuffer device: %dn', ret);

    goto free_video_memory;

}

...

4.2 LCD 参数设置

获取平台设备数据,即smdk2440_lcd_cfg结构体内数据


// 获取平台数据即 linux-2.6.22.6/arch/arm/mach-s3c2440/mach-smdk2440.c中配置的smdk2440_lcd_cfg 

    mach_info = pdev->dev.platform_data;

    if (mach_info == NULL) {

        dev_err(&pdev->dev,'no platform data for lcd, cannot attachn');

        return -EINVAL;

    }

4.2.1 固定参数设置

struct fb_fix_screeninfo {

    char id[16];            /* identification string eg 'TT Builtin' */

    unsigned long smem_start;   /* Start of frame buffer mem */

                    /* (physical address) */

    __u32 smem_len;         /* Length of frame buffer mem */

    __u32 type;         /* see FB_TYPE_*        */

    __u32 type_aux;         /* Interleave for interleaved Planes */

    __u32 visual;           /* see FB_VISUAL_*      */ 

    __u16 xpanstep;         /* zero if no hardware panning  */

    __u16 ypanstep;         /* zero if no hardware panning  */

    __u16 ywrapstep;        /* zero if no hardware ywrap    */

    __u32 line_length;      /* length of a line in bytes    */

    unsigned long mmio_start;   /* Start of Memory Mapped I/O   */

                    /* (physical address) */

    __u32 mmio_len;         /* Length of Memory Mapped I/O  */

    __u32 accel;            /* Indicate to driver which */

                    /*  specific chip/card we have  */

    __u16 reserved[3];      /* Reserved for future compatibility */

};

...

id:driver 标识

    strcpy(fbinfo->fix.id, driver_name);


smem_start:frame buffer 的起始地址

        fbi->map_cpu  = dma_alloc_writecombine(fbi->dev, fbi->map_size,

                               &fbi->map_dma, GFP_KERNEL);

        ...

            fbi->screen_dma     = fbi->map_dma;

            fbi->fb->fix.smem_start  = fbi->screen_dma;

        ...


smem_len:frame buffer 的长度字节为单位 = 480*272*16/8   屏宽*屏高*一个像素的数据位数/一个字节的位数

    fbinfo->fix.smem_len        =   mach_info->xres.max *

                        mach_info->yres.max *

                        mach_info->bpp.max / 8;


type、type_aux:fb数据类型为像素类型,还有平面模式等

fbinfo->fix.type        = FB_TYPE_PACKED_PIXELS;

fbinfo->fix.type_aux        = 0;


visual:设置为真彩色,还有单色模式,黑/白

fbi->fb->fix.visual = FB_VISUAL_TRUECOLOR;


默认设置为0,简单理解为边框宽度

fbinfo->fix.xpanstep        = 0;

fbinfo->fix.ypanstep        = 0;

fbinfo->fix.ywrapstep       = 0;


line_length:一行fb数据的字节数 480*16/8

fbi->fb->fix.line_length     = (var->width*var->bits_per_pixel)/8;

4.2.2 可变参数设置

struct fb_var_screeninfo {

    __u32 xres;         /* visible resolution       */

    __u32 yres;

    __u32 xres_virtual;     /* virtual resolution       */

    __u32 yres_virtual;

    __u32 xoffset;          /* offset from virtual to visible */

    __u32 yoffset;          /* resolution           */


    __u32 bits_per_pixel;       /* guess what           */

    __u32 grayscale;        /* != 0 Graylevels instead of colors */


    struct fb_bitfield red;     /* bitfield in fb mem if true color, */

    struct fb_bitfield green;   /* else only length is significant */

    struct fb_bitfield blue;

    struct fb_bitfield transp;  /* transparency         */  


    __u32 nonstd;           /* != 0 Non standard pixel format */


    __u32 activate;         /* see FB_ACTIVATE_*        */


    __u32 height;           /* height of picture in mm    */

    __u32 width;            /* width of picture in mm     */


    __u32 accel_flags;      /* (OBSOLETE) see fb_info.flags */


    /* Timing: All values in pixclocks, except pixclock (of course) */

    __u32 pixclock;         /* pixel clock in ps (pico seconds) */

    __u32 left_margin;      /* time from sync to picture    */

    __u32 right_margin;     /* time from picture to sync    */

    __u32 upper_margin;     /* time from sync to picture    */

    __u32 lower_margin;

    __u32 hsync_len;        /* length of horizontal sync    */

    __u32 vsync_len;        /* length of vertical sync  */

    __u32 sync;         /* see FB_SYNC_*        */

    __u32 vmode;            /* see FB_VMODE_*       */

    __u32 rotate;           /* angle we rotate counter clockwise */

    __u32 reserved[5];      /* Reserved for future compatibility */

};

屏幕分辨率和单个像素点的数据位数

fbinfo->var.xres        = mach_info->xres.defval;       480

fbinfo->var.xres_virtual    = mach_info->xres.defval;   480

fbinfo->var.yres        = mach_info->yres.defval;       272

fbinfo->var.yres_virtual    = mach_info->yres.defval;   272

fbinfo->var.bits_per_pixel  = mach_info->bpp.defval;    16


设置一个像素点的位数分配,rgb+透明度 rrrrrggggggbbbbb 位数从左边为第0位算

fbinfo->var.red.offset      = 11;

fbinfo->var.green.offset    = 5;

fbinfo->var.blue.offset     = 0;

fbinfo->var.transp.offset   = 0;

fbinfo->var.red.length      = 5;

fbinfo->var.green.length    = 6;

fbinfo->var.blue.length     = 5;

fbinfo->var.transp.length   = 0;


fbinfo->var.nonstd      = 0;   // 标准像素格式

fbinfo->var.activate        = FB_ACTIVATE_NOW;

// 真实分辨率,设置480*272就行了,影响不大

fbinfo->var.height      = mach_info->height;

fbinfo->var.width       = mach_info->width;

fbinfo->var.accel_flags     = 0;

fbinfo->var.vmode       = FB_VMODE_NONINTERLACED;


// VBPD:一个VSYNC信号到来之后,多才时间才开始输出数据(显示图像)。会造成上边黑框

// VFPD:一帧(场)数据结束后多长时间,才来一个VSYNC信号。会造成下边黑框

// VSPW: 一个VSYNC信号的时间宽度

fbinfo->var.upper_margin    = S3C2410_LCDCON2_GET_VBPD(mregs->lcdcon2) + 1;

fbinfo->var.lower_margin    = S3C2410_LCDCON2_GET_VFPD(mregs->lcdcon2) + 1;

fbinfo->var.vsync_len       = S3C2410_LCDCON2_GET_VSPW(mregs->lcdcon2) + 1;


// HFPD:一行数据结束多长时间才来一个HSYNC信号。会造成左边黑框

// HBPD:一个HSYNC信号到来之后,多长时间才开始输出数据(显示图像)。会造成右边黑框

[1] [2] [3] [4]
关键字:Linux驱动  s3c2440  lcd  驱动 引用地址:《Linux驱动:s3c2440 lcd 驱动分析--终结篇》

上一篇:s3c2440裸机-时钟编程-1-2440时钟体系介绍
下一篇:《Linux驱动:s3c2440 lcd 驱动分析》

推荐阅读最新更新时间:2026-03-20 09:36

Linux驱动之内核自带的S3C2440LCD驱动分析
先来看一下应用程序是怎么操作屏幕的:Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。FrameBuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由Framebuffer设备驱动来完成的。 文字说明可能不是很明白,下
[单片机]
S3C2440 Linux驱动移植——LCD
PC主机:Ubuntu 10.4 和redhat 9.0 目标板:TQ2440开发板 Linux内核:2.6.30 屏幕型号:WXCAT35-TG3#001F 分辨率: 320X240 本文将介绍如何移植LCD设备。 在移植前,先配置下内核,将LCD设备编译进内核。 1.移植 移植LCD设置只须修改位于arch/arm/mach-s3c2440/mach-smdk2440.c中的两个结构体的数据。 1.1 s3c2410fb_display结构 修改后的内容如下: /* LCD driver info */ static struct s3c2410fb_display smdk2440_lcd_
[单片机]
<font color='red'>S3C2440</font> <font color='red'>Linux</font><font color='red'>驱动</font>移植——<font color='red'>LCD</font>
S3C2440LinuxLCD驱动
到了神秘的LCD驱动了,信息还真有点胆怯,但是还是不得不走下去。对刚刚学习的linux驱动坐一下总结,毕竟是Linux内核当中的东东,而且是那么的繁琐。做一总结,等用笔记把学过东西几下来,这样就不会忘了。哈哈! 那就开始!!! 在编写裸机LCD程序的时候,首先就是硬件初始化操作。有一个寄存器当中存放了帧缓冲的起始地址。这个参数是非常重要的。当配置好硬件后,帧缓冲中的数据能够脱离CPU不停地将真缓冲当中的数据写入到LCD屏。如果我们要现实一个图片的话只需要将图片数据放到帧缓冲当中,这样就非常的方便了。 在linux当中,把整个LCD驱动分为两层:LCD帧缓冲区层和LCD硬件驱动层。LCD帧缓冲区层其实就是将内核中的一部分空间当作一个
[单片机]
s3c2440 linux lcd驱动解读
s3c2440 linux lcd驱动解读 驱动层即s3c2410fb.c定义platform_driver 如下面文件定义了s3c2410fb_driver: \linux\linux-2.6.29\drivers\video\S3c2410fb.c static struct platform_driver s3c2410fb_driver = { .probe = s3c2410fb_probe, .remove = s3c2410fb_remove, .suspend = s3c2410fb_suspend, .resume = s3c2410fb_resume, .driver = { .name = s3c2410-
[单片机]
基于S3C2440linux-3.6.6移植——LED驱动
目前的linux版本的许多驱动都是基于设备模型,LED也不例外。 简单地说,设备模型就是系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动。设备模型会产生一个虚拟的文件系统——sysfs,它给用户提供了一个从用户空间去访问内核设备的方法,它在linux里的路径是/sys。如果要写程序访问sysfs,可以像读写普通文件一样来操作/sys目录下的文件。 对于基于s3c2440的开发板来说,linux-3.6.6自动的LED驱动只需改变连接LED的IO端口,及高、低电平响应即可。我的开发板的四个LED连接在了B口的5到8引脚上,当输出低电平时被点亮,与linux自带的LED驱动一致,因此无需做任何改动。
[单片机]
linux2.6.32 内核移植s3c2440 - DM9000网卡驱动移植
参考: http://caiming1987612.blog.163.com/blog/static/118556676200961752714307/ http://blog.chinaunix.net/u1/34474/showart_401078.html http://hi.baidu.com/%D3%F3%C4%E0%C4%EA%B8%E2/blog/item/6256fea7bfceac98d0435819.html 时序图和引脚连接 :http://blog.chinaunix.net/u1/57901/showart_2023852.html (一)打开arch/arm/mach-s3c2440/mach-test
[单片机]
S3C2440驱动篇—Linux平台设备驱动
在设备驱动程序中经常会见到和platform相关的字段,分布在驱动程序的多个角落,这也是2.6内核中比较重要的一种机制,把它原理弄懂,对以后分析驱动程序很有帮助:在linux2.6设备模型中,关心总线,设备,驱动这三个实体,总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动。相反,在系统每注册一个驱动的时候,寻找与之匹配的设备,匹配是由总线来完成的。 一个现实的Linux 设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2C、SPI 等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC 系统中集成的独立的外设控制器、挂接在SoC 内存空间的外设等确不依附于此类总线。基于这一背景,Li
[单片机]
Linux驱动:s3c2410/s3c2440 ts驱动分析
前言 前面结合“平台总线-设备-驱动”模型分析了ts(触摸)驱动的加载过程,现在进入驱动程序分析下其具体的实现。涉及到输入子系统、s3c2440的ADC转换和触摸控制器。 涉及的寄存器 image.png 调用probe函数 根据上一篇的分析,驱动层通过platform_driver_register注册后,会调用到该驱动层的probe函数。 s3c2410ts_probe函数分析 1. 硬件寄存器设置 获取设备参数 struct s3c2410_ts_mach_info *info; info = ( struct s3c2410_ts_mach_info *)pdev- dev.platform_data;
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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