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 data\n");

} else {

printk(KERN_ERR "no memory for LCDplatform data\n");

}

}

#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);

补充:  lcd驱动分析: http://blog.csdn.net/jmq_0000/article/details/7104793

struct device结构体:http://blog.csdn.net/abo8888882006/article/details/5424363

lcd原理和驱动:http://blog.csdn.net/luoamforever/article/details/5515564

FL2440驱动添加(3)LCD驱动添加学习笔记的更多相关文章

  1. PHP 数据库驱动、连接数据不同方式学习笔记

    相关学习资料 http://www.php.net/manual/zh/refs.database.php http://www.php.net/manual/zh/internals2.pdo.ph ...

  2. TQ210--UBOOT移植笔记--添加自己的单板【学习笔记】

    在uboot的源码的根目录下的readme中有介绍如何在uboot中添加自己的单板: 一.在boards.cfg中添加自己的单板的信息,可以模仿smdkc100去添加自己的单板的信息 二.复制单板的配 ...

  3. LCD驱动应该怎么写?–基于stm32F407 [复制链接]

    够用的硬件能用的代码使用的教程 (拷贝过来的代码有点乱,请下载附件查看文档) 资料下载地址:https://pan.baidu.com/s/1bHUVe6X6tymktUHk_z91cA 网络上配套S ...

  4. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  5. MongoDB学习笔记系列~目录

    MongoDB学习笔记~环境搭建 (2015-03-30 10:34) MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00) MongoDB学习笔 ...

  6. [学习笔记]设计模式之Abstract Factory

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 在上篇笔记Builder设计模式中,时の魔导士祭出了自己的WorldCreator.尽管它因此能创造出一个有山有树有房子的世界,但是白 ...

  7. [学习笔记]设计模式之Builder

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 作为一个新入职的魔导士呢,哦不,是程序员,我以为并没有太多机会去设计项目的软件架构.但是,工作一段时间之后,自己渐渐意识到,哪怕是自己 ...

  8. [学习笔记]设计模式之Adapter

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Adapter(适配器)模式主要解决接口不匹配的问题.为此,让我们要回到最初Builder模式创建平行世界时,白雪公主和小霍比特人的谜 ...

  9. [学习笔记]设计模式之Bridge

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 “魔镜啊魔镜,谁是这个世界上最美丽的人?”月光中,一个低沉的声音回荡在女王的卧室.“是美丽的白雪公主,她正和小霍比特人们幸福快乐地生活 ...

  10. [学习笔记]设计模式之Prototype

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 在笔记Builder模式中,我们曾见到了最初用于创建平行世界的函数createWorld,并且它是Mage类的成员函数(毕竟是专属于魔 ...

随机推荐

  1. gitignore for vs

    */**/bin/Debug*/**/bin/Release*/**/obj/Debug*/**/obj/Release*/**/x86/Debug*/**/x86/Release*/**/x64/D ...

  2. 利用nodejs+phantomjs+casperjs采集淘宝商品的价格

    因为一些业务需求需要采集淘宝店铺商品的销售价格,但是淘宝详情页面的价格显示是通过js动态调用显示的.所以就没法通过普通的获取页面html然后通过正则或者xpath的方式获取到想到的信息了. 所幸我们现 ...

  3. 延迟渲染 deferred Shading

    流程: 1.先渲染一遍物体的位置,法线  和颜色  到三张纹理 2.在根据这三张纹理渲染一遍灯光 3.合成颜色图和灯光图  (ssao图) 看上去好像灯光不多,其实我在这里加了200个灯, 每个球代表 ...

  4. winedt设置自动显示行号[latex]

    options--preferences--appearance 在show line numbers for modes下面的文本框里添加;Tex 这样新建或者打开tex文件的时候就自动显示行号了( ...

  5. Ubuntu中QT使用FFmpeg的奇怪问题

    FFmpeg都已经编译安装好了,QT的程序中调用av_register_all却总是在链接阶段报错,经过长时间的摸索,发现时静态链接库的问题,网上给出的答案都只能解决部分问题,所需的全部链接库如下: ...

  6. 最近新装系统windows8.1+Mac。。。还没装驱动就遇到一堆问题。。。

    ---恢复内容开始--- 1,刚开始装好了,后来莫名看不到磁盘了,原因:64位mac盘会丢失盘符,所以macdrive也看不到...解决:(将AF改为06,修改内容后改回AF,早知道这么简单就不用重新 ...

  7. 2013年Linux周刊读者投票出炉 Ubuntu、Android榜上有名

    摘要:一年一度的Linux周刊读者投票结果已经登于2013第12期.这是Linux爱好者们自己的“奥斯卡”: Linux周刊的小编们列出一系列Linux相关的“最佳项目”进行面向读者的投票.竞选项目包 ...

  8. MyBatis知多少(16)MyBatis映射

    之前我们详细地讨论了MyBatis背后的设计理念以及iBATIS框架是如何产生的.也说明了MyBatis是一个混合型解决方案,它从处理关系数据库的其他不同方法那里借鉴了许多思想.那么MyBatis到底 ...

  9. Java知多少(111)数据库之修改记录

    修改数据表记录也有3种方案. 一.使用Statement对象 实现修改数据表记录的SQL语句的语法是:    update表名 set 字段名1 = 字段值1,字段名2 = 字段值2,……where特 ...

  10. MongoDB 安装记录

    之前使用一直没记录,防再次掉坑,记录下 echo 开始 D: cd D:\Program Files\MongoDB\Server\3.2\bin mongod --install --service ...