关闭

Linux设备驱动--LCD平台设备与驱动(smdk2440)

765人阅读 评论(0) 收藏 举报
分类:

1 环境与简介

    Host:Ubuntu14.04(64bit)

    Target:smdk2440

    Kernel:linux-2.6.39.4

    类似于《Linux设备驱动--WDT平台设备与驱动》,本文再以LCD为例进行说明。本文的源码均来自Linux内核(linux-2.6.39.4貌似对mini2440 LCD移植还不完善,因此本文以smdk2440为例,在源码中已经完美支持该开发板的LCD)。

2 平台设备

2.1 定义

(1)平台设备

    定义全局变量s3c_device_lcd,并且通过EXPORT_SYMBOL(s3c_device_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
    }   
};
EXPORT_SYMBOL(s3c_device_lcd);
源文件:arch/arm/plat-s3c24xx/devs.c

(2)平台资源

    上述LCD设备所引用的平台设备资源如下所定义:

static struct resource s3c_lcd_resource[] = {
    [0] = {
        .start = S3C24XX_PA_LCD, /* 0x4D000000 */
        .end   = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,/* S3C24XX_SZ_LCD=0x00100000(1M) */                                                                                                                         
        .flags = IORESOURCE_MEM, /* 0x00000200 */                                                                                                                                              
    },                                                                                                                                                                        
    [1] = {                                                                                                                                                                   
        .start = IRQ_LCD, /* 32 */                                                                                                                                                    
        .end   = IRQ_LCD,                                                                                                                                                     
        .flags = IORESOURCE_IRQ, /* 0x00000400 */                                                                                                                                              
    }                                                                                                                                                                                                                                                                                                                                                  
}; 

源文件:arch/arm/plat-s3c24xx/devs.c

2.2 引用

    定义一个平台设备数组smdk2440_devices,该数组包含了smdk2440开发板的所有平台设备,其中当然包括上述s3c_device_lcd,如下第3行所示:

static struct platform_device *smdk2440_devices[] __initdata = {
    &s3c_device_ohci,
    &s3c_device_lcd,
    &s3c_device_wdt,
    &s3c_device_i2c0,
    &s3c_device_iis,
};
源文件:arch/arm/mach-s3c2440/mach-smdk2440.c

2.3 注册

(1)注册函数    

    在smdk2440_machine_init()函数中调用platform_add_devices()函数将上述smdk2440_devices注册到系统,即可完成平台设备的注册,如下第4行所示:

static void __init smdk2440_machine_init(void)
{
    s3c24xx_fb_set_platdata(&smdk2440_fb_info);
    s3c_i2c0_set_platdata(NULL);

    platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));
    smdk_machine_init();
}

源文件:arch/arm/mach-s3c2440/mach-smdk2440.c

(2)注册时机

    上述smdk2440_machine_init()函数是何时被调用的呢?答案是在内核初始化设备的时候,如下第6行所示:

MACHINE_START(S3C2440, "SMDK2440")
    /* Maintainer: Ben Dooks <ben-linux@fluff.org> */
    .boot_params    = S3C2410_SDRAM_PA + 0x100, /* 0x30000100 */
    .init_irq   = s3c24xx_init_irq,
    .map_io     = smdk2440_map_io,
    .init_machine   = smdk2440_machine_init,
    .timer      = &s3c24xx_timer,
MACHINE_END   

源文件:arch/arm/mach-s3c2440/mach-smdk2440.c

3 平台驱动

3.1 定义

    为了和平台设备匹配,平台驱动的name要与平台设备的name一致:

static struct platform_driver s3c2410fb_driver = {
    .probe      = s3c2410fb_probe, 
    .remove     = __devexit_p(s3c2410fb_remove),
    .suspend    = s3c2410fb_suspend,
    .resume     = s3c2410fb_resume,
    .driver     = {  
        .name   = "s3c2410-lcd",                                                                                                                                       
        .owner  = THIS_MODULE,
    },   
};

源文件:drivers/video/s3c2410fb.c

    上述s3c2410fb_probes3c2410fb_removes3c2410fb_shutdowns3c2410fb_suspend以及s3c2410fb_resume都在同一个源文件中定义,详见源文件drivers/video/s3c2410fb.c。

    上述s3c2410fb_probe()调用s3c24xxfb_probe(),并且在s3c24xxfb_probe()中实现framebuffer的创建,初始化与注册,详见《Linux设备驱动--framebuffer》。

3.2 注册

     在模块加载函数s3c2410fb_init()中调用platform_driver_register()函数注册上述平台驱动s3c2410fb_driver

int __init s3c2410fb_init(void)                                                                                                                                               
{                                                                                                                                                                             
    int ret = platform_driver_register(&s3c2410fb_driver);                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                   
    if (ret == 0)                                                                                                                                                             
        ret = platform_driver_register(&s3c2412fb_driver);                                                                                                                    
                                                                                                                                                                              
    return ret;                                                                                                                                                               
}  
源文件:drivers/video/s3c2410fb.c

4 设备与驱动匹配

    同《Linux设备驱动--WDT平台设备与驱动》第4节。

参考资料

[1]Linux下LCD驱动详细分析(一)

[2]Linux LCD驱动参数的配置与编译(完全)

[3]Linux的LCD驱动 

[4]Linux下LCD编程

[5]Tiny 4412 lcd 驱动分析

[6]tiny4412LCD驱动加字符显示

[7]平台设备的识别

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

S3C2440 LCD驱动详解

环境: 硬件平台 TQ2440            东华3.5 inch  TFT LCD       ...
  • tiangwan2011
  • tiangwan2011
  • 2012-05-09 13:57
  • 1338

移植最新的内核linux-4.9到开发板JZ2440全过程笔记

移植最新的内核linux-4.9到开发板JZ2440全过程笔记
  • mengzhuicanyang
  • mengzhuicanyang
  • 2016-12-24 23:20
  • 3340

S3C2440上LCD驱动(FrameBuffer)实例开发讲解

转自 (http://www.cnblogs.com/armlinux/archive/2010/08/30/2396931.html) 一、开发环境 主  机:VMWare--Fedora 9...
  • yu704645129
  • yu704645129
  • 2016-05-31 17:27
  • 845

S3C2440LCD驱动详解

  • 2014-10-15 14:59
  • 580KB
  • 下载

基于JZ2440移植Linux3.4.2内核版本完整搭建笔记

关键词 :内核,bootload:   ①:把内核读入内存   ②:设置TAG参数   ③:启动      1、R0 = 0;      2、R1 = 机器ID      3、R...
  • ljmiaw
  • ljmiaw
  • 2017-05-28 19:08
  • 527

i2c子系统之platfor_device初始化——smdk2440_machine_init()

调用完函数i2c_init后,系统将成功创建i2c总线。初始化完毕总线后还需要接着初始化i2c设备和i2c驱动(一般是先初始化device), 对于2440来说,linux内核中的device初始化...
  • rockrockwu
  • rockrockwu
  • 2012-04-07 14:56
  • 3758

s3c2440 LCD ——驱动程序

mini2440驱动分析之LCD         mini2440集成了lcd控制器的接口,板子上接的lcd硬件是统宝240*320,TFT型lcd。lcd驱动对应的文件为s3c2410fb.c。要...
  • manchestermi
  • manchestermi
  • 2015-09-25 10:39
  • 348

s3c2440 lcd驱动移植

一.lcd简介:        LCD ( Liquid Crystal Display 的简称)液晶显示器。        LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT...
  • LYX_WIN
  • LYX_WIN
  • 2016-08-15 13:48
  • 611

Linux设备驱动--LCD平台设备与驱动(tiny4412)

参考资料 [1]Tiny 4412 lcd 驱动分析 [2]FIMD架构分析
  • Q1302182594
  • Q1302182594
  • 2016-09-09 09:43
  • 2073

设备树学习之(十二)LCD驱动

开发板:tiny4412SDK + S702 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boo...
  • lizuobin2
  • lizuobin2
  • 2017-01-26 10:16
  • 1284
    个人资料
    • 访问:1260582次
    • 积分:18603
    • 等级:
    • 排名:第571名
    • 原创:641篇
    • 转载:2篇
    • 译文:11篇
    • 评论:123条
    文章分类
    最新评论