FL2440驱动添加(3)LCD驱动添加学习笔记

发布者:心灵之舞最新更新时间:2024-07-24 来源: elecfans关键字:FL2440  LCD驱动 手机看文章 扫描二维码
随时随地手机看文章

FL2440 LCD内置控制器,320*240 TFT型LCD。


自我理解总结的两种添加驱动模式:

非platform方式添加驱动:


加载驱动:

1,硬件初始化,申请内存,并作地址映射

2,分配设备号,分配结构体

3,注册设备

卸载驱动:

1,释放内存

2,释放结构体,返还设备号

3,注销设备

platform总线方式添加驱动(主流方式):

1.编写设备链 


struct platform_device

{

       const chat *name;

       u32 id;

       struct device dev;

       u32 num_resources;

       struct resources * resources;

};


2,编写驱动链


static struct platform_driver

{

      int (*probe)( struct platform_device*),//探测函数

      int (*remove)( structplatform_device*),//删除函数

       ……

       struct device_driver driver;

};


3,在设备链注册设备和在驱动链注册驱动


int __init xxx_init()

{

.....

platform_device_register();

platform_driver_register();

.....

}


4,反向在驱动链注销驱动,在设备链注销设备


void __exit  xxx_exit()

{

.....

platform_driver_unregister();

platform_device_unregister();

.....

}



开始添加LCD驱动:内核版本linux-3.8.0


1,在arch/arm/mach-s3c24xx/mach-smdk2440.c中修改相关信息平台数据

/* LCD driver info */

static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {

 

    .lcdcon5   = S3C2410_LCDCON5_FRM565|

              S3C2410_LCDCON5_INVVLINE |

              S3C2410_LCDCON5_INVVFRAME |

              S3C2410_LCDCON5_PWREN |

              S3C2410_LCDCON5_HWSWP,

 

    .type      = S3C2410_LCDCON1_TFT,

    .width     = 320,

    .height    = 240,

    .pixclock  = 111111, /* HCLK 60 MHz, divisor 10 */

    .xres      = 480,

    .yres      = 272,

    .bpp       = 16,

    .left_margin    = 38,

    .right_margin   = 20,

    .hsync_len = 30,

    .upper_margin   = 15,

    .lower_margin   = 12,

    .vsync_len = 3,

};

 

static struct s3c2410fb_mach_info smdk2440_fb_info  __initdata = {

    .displays  = &smdk2440_lcd_cfg,

    .num_displays   = 1,

    .default_display = 0,

#if 0
    /* currently setup by downloader */
    .gpccon     = 0xaa940659,
    .gpccon_mask    = 0xffffffff,
    .gpcup      = 0x0000ffff,
    .gpcup_mask = 0xffffffff,
    .gpdcon     = 0xaa84aaa0,
    .gpdcon_mask    = 0xffffffff,
    .gpdup      = 0x0000faff,
    .gpdup_mask = 0xffffffff,
#endif

    .lpcsel    = ((0xCE6) & ~7) | 1<<1,

};



2,由于在arch/arm/plat-samsung/devs.c已经定义了LCD的设备以及平台添加函数,如下

/* LCD Controller */

#ifdef CONFIG_PLAT_S3C24XX

static struct resource s3c_lcd_resource[]= {

    [0] = DEFINE_RES_MEM(S3C24XX_PA_LCD, S3C24XX_SZ_LCD),

    [1] = DEFINE_RES_IRQ(IRQ_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       = &samsung_device_dma_mask,

        .coherent_dma_mask  = DMA_BIT_MASK(32),

    }

};


//平台添加函数

void __init s3c24xx_fb_set_platdata(structs3c2410fb_mach_info *pd)

{  

    struct s3c2410fb_mach_info *npd;

 

    npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_lcd);

    if (npd) {

        npd->displays =kmemdup(pd->displays,

            sizeof(struct s3c2410fb_display) * npd->num_displays,

            GFP_KERNEL);

        if (!npd->displays)

            printk(KERN_ERR 'no memory forLCD display datan');

    } else {

        printk(KERN_ERR 'no memory for LCDplatform datan');

    }

}

#endif /*CONFIG_PLAT_S3C24XX */

 

 

所以在arch/arm/mach-s3c24xx/mach-smdk2440.c只需注册设备:

static struct platform_device *smdk2440_devices[] __initdata = {

    &s3c_device_ohci,

    &s3c_device_lcd,

    &s3c_device_wdt,

    &s3c_device_i2c0,

    &s3c_device_iis,

    &s3c_device_dm9000,

    &s3c_device_adc,   

    &s3c_device_ts,

    &s3c_device_rtc,

    &globalfifo_device

};

 

通过调用smdk2440_machine_init添加到设备链,

static void __init smdk2440_machine_init(void)

{

    //调用该函数将上面定义的LCD硬件信息保存到平台数据中

    s3c24xx_fb_set_platdata(&smdk2440_fb_info); 

    s3c_i2c0_set_platdata(NULL);

   

    platform_add_devices(smdk2440_devices,ARRAY_SIZE(smdk2440_devices));

    smdk_machine_init();

}

 

跟踪platform_add_devices函数,其实际调用了platform_device_register和platform_device_unregister函数,如下:

在drivers/base/platform.c下定义:

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;
}
EXPORT_SYMBOL_GPL(platform_add_devices);


关键字:FL2440  LCD驱动 引用地址:FL2440驱动添加(3)LCD驱动添加学习笔记

上一篇:模块在insmod之后无法rmmod问题
下一篇:内核移植和文件系统制作(4):UBIFS根文件系统制作总结

推荐阅读最新更新时间:2024-11-03 15:13

STM8L052C6T6液晶LCD驱动过程
使用的液晶屏 单片机引脚 液晶的COM1-COM4分别对应单片机LCD_COM0-LCD_COM3 默认LSI(内部低速时钟)是打开的,一般不操作,如果被关闭了,要先打开LSI。 所以先看看程序 void LCD_GLASS_Init(void) { /* Enable LCD/RTC clock */ CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);//打开RTC时钟 CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE);//打开LCD时钟 CLK_RTCClockConfig(CLK_RTC
[单片机]
STM8L052C6T6液晶<font color='red'>LCD驱动</font>过程
采用PXA27x的智能手机LCD驱动电路的设计
   液晶屏设计的好坏直接关系到智能手机的整体性能表现,然而液晶显示屏种类繁多,工程师需要针对各种显示屏的时序匹配、电源要求以及控制器的不同特点进行设计。本文介绍了PXA27x内部集成LCD控制器的特点、驱动实现方法以及相关的电源设计,并提出了电磁兼容设计建议。   全球智能手机市场正处于高速增长时期,市场研究公司Gartner预测,随着掌上电脑需求的下降,全球智能手机销售量2004年将增长到1400万部,增长率达140%,预期到2007年将大幅成长至4500万。面对日益成长的智能手机市场,各家芯片厂商都相继推出具有各自特色的芯片方案:如Freescale公司的i。MX21处理器嵌入了多媒体加速技术,支持MPEG4和H。26
[单片机]
采用PXA27x的智能手机<font color='red'>LCD驱动</font>电路的设计
OK6410之LCD驱动
lcd.c驱动源码: #include linux/module.h #include linux/kernel.h #include linux/errno.h #include linux/string.h #include linux/mm.h #include linux/slab.h #include linux/vmalloc.h #include linux/delay.h #include linux/interrupt.h #include asm/uaccess.h #include linux/fb.h #include linux/init.h #includ
[单片机]
客户订单5月份回流 台系LCD驱动IC 倒吃甘蔗
近期台系LCD驱动IC设计业者营运表现并不理想,甚至联咏交出低于财测目标的成绩单,然随着两岸面板厂出货量开始回稳,加上LCM模组厂已捎来5月后订单将升温的好消息,台系LCD驱动IC供应商纷预期第2季营运表现有机会呈现倒吃甘蔗走势,由于第3季有传统旺季效应加持,加上届时包括液晶电视、PC及智能型手机等库存问题已消化大半,业绩可望再走高。 联咏第1季营收未达成原先财测目标,让业界吓了一跳,由于智能型手机、电视、平板电脑及PC市场需求都明显疲软,加上两岸面板厂出货量不如预期,拖累联咏营运表现,至于终端市场需求何时会起来,目前台系LCD驱动IC供应商多预期客户订单应会在5月中旬过后陆续回笼,但订单规模有多大仍需要再观察。 由于第
[手机便携]
嵌入式系统中LCD驱动的实现原理
结合三星公司ARM9系列嵌入式处理器S3C2410,讲解如何进行LCD驱动程序模块化编程及如何将驱动程序静态加载进系统内核。 LCD(液晶显示)模块满足了嵌入式系统日益提高的要求,它可以显示汉字、字符和图形,同时还具有低压、低功耗、体积小、重量轻和超薄等很多优点。随着嵌入式系统的应用越来越广泛,功能也越来越强大,对系统中的人机界面的要求也越来越高,在应用需求的驱使下,许多工作在Linux下的图形界面软件包的开发和移植工作中都涉及到底层LCD驱动的开发问题。因此在嵌入式系统中开发LCD驱动得以广泛运用。 本文以三星公司ARM9内核芯片S3C2410的LCD接口为基础,介绍了在Linux平台上开发嵌入式LCD驱动程序的一
[应用]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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