Linux驱动之内核自带的S3C2440的LCD驱动分析

发布者:JoyfulExplorer最新更新时间:2024-08-19 来源: cnblogs关键字:Linux驱动  S3C2440  LCD驱动 手机看文章 扫描二维码
随时随地手机看文章


    memcpy(&info->regs, &mach_info->regs, sizeof(info->regs));


    /* Stop the video and unset ENVID if set */

    info->regs.lcdcon1 &= ~S3C2410_LCDCON1_ENVID;

    lcdcon1 = readl(S3C2410_LCDCON1);

    writel(lcdcon1 & ~S3C2410_LCDCON1_ENVID, S3C2410_LCDCON1);


    // add by thisway.diy@163.com, for eBlocks

    s3c2410_gpio_setpin(S3C2410_GPB0, 0);    // back light control


    info->mach_info            = pdev->dev.platform_data;


    fbinfo->fix.type        = FB_TYPE_PACKED_PIXELS;

    fbinfo->fix.type_aux        = 0;

    fbinfo->fix.xpanstep        = 0;

    fbinfo->fix.ypanstep        = 0;

    fbinfo->fix.ywrapstep        = 0;

    fbinfo->fix.accel        = FB_ACCEL_NONE;


    fbinfo->var.nonstd        = 0;

    fbinfo->var.activate        = FB_ACTIVATE_NOW;

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

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

    fbinfo->var.accel_flags     = 0;

    fbinfo->var.vmode        = FB_VMODE_NONINTERLACED;


    fbinfo->fbops            = &s3c2410fb_ops;

    fbinfo->flags            = FBINFO_FLAG_DEFAULT;

    fbinfo->pseudo_palette      = &info->pseudo_pal;


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

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

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

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

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


    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;


    fbinfo->var.left_margin        = S3C2410_LCDCON3_GET_HFPD(mregs->lcdcon3) + 1;

    fbinfo->var.right_margin    = S3C2410_LCDCON3_GET_HBPD(mregs->lcdcon3) + 1;

    fbinfo->var.hsync_len        = S3C2410_LCDCON4_GET_HSPW(mregs->lcdcon4) + 1;


    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->fix.smem_len        =    mach_info->xres.max *

                    mach_info->yres.max *

                    mach_info->bpp.max / 8;//


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

        info->palette_buffer[i] = PALETTE_BUFF_CLEAR;


    if (!request_mem_region((unsigned long)S3C24XX_VA_LCD, SZ_1M, 's3c2410-lcd')) {

        ret = -EBUSY;

        goto dealloc_fb;

    }



    dprintk('got LCD regionn');


    ret = request_irq(irq, s3c2410fb_irq, IRQF_DISABLED, pdev->name, info);

    if (ret) {

        dev_err(&pdev->dev, 'cannot get irq %d - err %dn', irq, ret);

        ret = -EBUSY;

        goto release_mem;

    }


    info->clk = clk_get(NULL, 'lcd');

    if (!info->clk || IS_ERR(info->clk)) {

        printk(KERN_ERR 'failed to get lcd clock sourcen');

        ret = -ENOENT;

        goto release_irq;

    }


    clk_enable(info->clk);//使能LCD时钟

    dprintk('got and enabled clockn');


    msleep(1);


    /* Initialize video memory */

    ret = s3c2410fb_map_video_memory(info);//分配显存

    if (ret) {

        printk( KERN_ERR 'Failed to allocate video RAM: %dn', ret);

        ret = -ENOMEM;

        goto release_clock;

    }

    dprintk('got video memoryn');


    ret = s3c2410fb_init_registers(info);/*3、硬件相关的设备,配置LCD寄存器*/


    ret = s3c2410fb_check_var(&fbinfo->var, fbinfo);


    ret = register_framebuffer(fbinfo);/*4、注册fbinfo结构到registered_fb数组*/

    if (ret < 0) {

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

        goto free_video_memory;

    }


    /* create device files */

    device_create_file(&pdev->dev, &dev_attr_debug);


    printk(KERN_INFO 'fb%d: %s frame buffer devicen',

        fbinfo->node, fbinfo->fix.id);


    return 0;


free_video_memory:

    s3c2410fb_unmap_video_memory(info);

release_clock:

    clk_disable(info->clk);

    clk_put(info->clk);

release_irq:

    free_irq(irq,info);

release_mem:

     release_mem_region((unsigned long)S3C24XX_VA_LCD, S3C24XX_SZ_LCD);

dealloc_fb:

    framebuffer_release(fbinfo);

    return ret;

}


可以看到这个函数最终是注册了fbinfo结构体到帧缓存驱动的registered_fb数组。


大概总结一下这个函数的功能:


1、分配一个fb_info结构


2、设置fb_info结构


3、硬件相关的操作,配置LCD时钟、配置IO端口、配置LCD寄存器。


4、最终注册fbinfo结构到registered_fb数组


 s3c2410fb_remove函数的过程与s3c2410fb_probe函数相反


[1] [2]
关键字:Linux驱动  S3C2440  LCD驱动 引用地址:Linux驱动之内核自带的S3C2440的LCD驱动分析

上一篇:ok6410的madplay配置
下一篇:Linux驱动之LCD驱动编写

推荐阅读最新更新时间:2026-03-21 18:47

Linux-2.6.32.2内核在mini2440上的移植(七)---LCD驱动移植
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】LCD 驱动基础知识 Linux-2.6.32.2 内核已经支持S3C2440
[单片机]
<font color='red'>Linux</font>-2.6.32.2<font color='red'>内核</font>在mini2440上的移植(七)---<font color='red'>LCD驱动</font>移植
S3C2440驱动篇—Linux平台设备驱动
在设备驱动程序中经常会见到和platform相关的字段,分布在驱动程序的多个角落,这也是2.6内核中比较重要的一种机制,把它原理弄懂,对以后分析驱动程序很有帮助:在linux2.6设备模型中,关心总线,设备,驱动这三个实体,总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动。相反,在系统每注册一个驱动的时候,寻找与之匹配的设备,匹配是由总线来完成的。 一个现实的Linux 设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2C、SPI 等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC 系统中集成的独立的外设控制器、挂接在SoC 内存空间的外设等确不依附于此类总线。基于这一背景,Li
[单片机]
ARM Linux S3C2440之ADC驱动实现
硬件描述: S3c2440有一个10-bit的CMOS ADC 模数转换器,支持8个模拟通道输入,10位的分辨率,最高速度可达500KSPS(500 千次/每秒)。 从图中可知:模拟ADC,包含了2部分功能,一部分是触屏功能,另一部分就是普通ADC功能,分别可以产生INT_TC和INT_ADC 两个中断。8个AIN模拟输入(A ,YM,YP,XM,XP)通过一个8路模拟开关MUX进行通道片选。 ADC模块共有20个寄存器。对于普通ADC转换,使用ADCCON 和 ADCDAT0即可完成控制。ADCCON用于控制设置,ADCDAT0保存了转换结果。 驱动程序ADC_DEV.ko: #include linux/err
[单片机]
ARM <font color='red'>Linux</font> <font color='red'>S3C2440</font>之ADC<font color='red'>驱动</font>实现
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;
[单片机]
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控制器先从显存中取出一帧
[单片机]
linux 2.6.32 在arm9(s3c2440)平台的移植 - LCD背光驱动
LCD背光是通过 CPU的 LCD_PWR引脚来控制的, 当LCD_PWR输出1, 亮 , 输出0则灭. 以下的代码均参考mini2440的移植手册 (1)新建/drivers/video/mini2440_backlight.c #include linux/errno.h #include linux/kernel.h #include linux/module.h #include linux/slab.h #include linux/input.h #include linux/init.h #include linux/serio.h #include linux/delay.h #include
[单片机]
S3C2440 Linux驱动移植——按键
开发板:TQ2440 内核版本:2.6.32 1. 硬件链接图 四个输入引脚: EINT0-----( GPF0 )----INPUT---K4 EINT2-----( GPF2 )----INPUT---K3 EINT4-----( GPF4 )----INPUT---K2 EINT1-----( GPF1 )----INPUT---K1 2. 相关的数据结构 移植所需要的数据结构位于include/linux/gpio_keys.h中。 #ifndef _GPIO_KEYS_H #define
[单片机]
<font color='red'>S3C2440</font> <font color='red'>Linux</font><font color='red'>驱动</font>移植——按键
S3C2440 Linux驱动移植——SPI
1. 配置内核 首先,修改arch/arm/plat-s3c24xx/Kconfig,这一步的目的是为了可以在内核中使能SPI0的配置函数。 修改后的内容如下: config S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13 bool S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13 help SPI GPIO configuration code for BUS0 when connected to GPE11, GPE12 and GPE13. 接着配置内核,首先打开S3C24XX_SPI_BUS0_GPE11_GPE12_GPE13选项,这样编译的时候会将 ar
[单片机]
<font color='red'>S3C2440</font> <font color='red'>Linux</font><font color='red'>驱动</font>移植——SPI
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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