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根文件系统制作总结

推荐阅读最新更新时间:2026-02-04 17:07

U-Boot在FL2440上移植(一)----修改系统时钟
一 U-boot源码结构 图片来自韦东山的《嵌入式linux应用开发完全手册》 U-boot下载地址: ftp://ftp.denx.de/pub/u-boot/ 交叉编译工具链 3.3.2 二 U-boot移植 1.新建一个fl2440开发板目录和文件 ①在board目录下新建fl2440目录,讲smdk2410目录下的文件复制到fl2440目录下,并将board/fl2440/smdk2410.c重命名为fl2440.c ②修改u-boot-1.1.6目录下Makefile文件 smdk2410_config : unconfig @$(MKCONFIG) $(@:_config
[单片机]
U-Boot在<font color='red'>FL2440</font>上移植(一)----修改系统时钟
U-Boot在FL2440上移植(二)----支持NOR Flash
一 选择NOR flash型号 我的开发板上的nor flash芯片是Intel的JS28F320(4MB)(1device=32blocks,1block=128MB fl2440默认是nandflash启动,norflash启动只需将跳线帽J5拔掉就可以了 1. 把开发板的配置文件fl2440.h(/include/configs/fl2440.h)中关于flash的配置部分都删掉,换成下面的配置: #define CONFIG_NR_DRAM_BANKS 1 #define PHYS_SDRAM_1 0x30000000 #define PHYS_SDRAM_1_SIZE 0x040
[单片机]
U-Boot在FL2440上移植(四)----支持网卡DM9000和烧写yaffs文件系统
一 支持网卡芯片DM9000 在driver下,有网卡驱动DM9000x.c 和 DM9000x.h DM9000接在BANK4,位宽16 在include/configs/TX2440.h中设置网卡基地址: 在56行处,将CS8900的定义改成: #define CONFIG_DRIVER_DM9000 1 #define CONFIG_DM9000_BASE 0x20000300 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE + 4) #define CONFIG_DM9000_USE_16BIT
[单片机]
U-Boot在FL2440上移植(三)----支持NAND Flash
一 支持NAND Flash 1. 首先在配置文件 include/config/fl2440.h 的宏 CONFIG_COMMANDS 中增加 CFG_CMD_NAND, #define CONFIG_COMMANDS (CONFIG_CMD_DFL | CFG_CMD_CACHE | CFG_CMD_NAND | 2.在配置文件 include/configs/fl2440.h 中增加如下3个宏 #define CFG_NAND_BASE 0 //无实际意义:基地址,在board_nand_init中重新定义 #define CFG_MAX_NAND_DEVICE 1 //NAND Flash设备数目为1
[单片机]
linux-3.0内核移植到fl2440开发板(以s3c2410为模板)
1.新建kernel文件夹,用于存放内核文件 $ mkdir kernel 2.进入kernel,上传压并解压压缩文件 $cd kernel $ tar -xjf linux-3.0.tar.bz2 3.进入linux-3.0 cd linux-3.0 4.修改makefile,配置CPU类型和交叉编译器(195,196行) ARCH ?=arm CROSS_COMPILE ?=/opt/buildroot-2012.08/arm926t/usr/bin/arm-linux- 交叉编译器路径每个人不太一样,大家把路径都换成自己的,另外在配置交叉编译器路径的时候,不要多加多余的空格,否则编译器不会被找到。 在同一
[单片机]
linux-3.0移植到FL2440(只做基本的移植)
首先补丁包来自凌云实验室: 1.先打补丁: patch -p1 ../linux-3.0-s3c2440.patch 2.修改 Makefile: ARCH ?= arm CROSS_COMPILE ?= arm-linux- 3.修改补丁的错误: 在/arch/arm/plat-s3c24xx/devs.c //#ifdef CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X /* UDA1341 add by guowenxue, 2012.03.30 */ //注释掉 . . . //#endif 4.make s3c2410_defconfig 5.裁剪
[单片机]
opencv在fl2440上的移植
linux2.6.28 arm-linux4.3.2 1.安装opencv2.0 下载地址http://sourceforge.net/projects/opencvlibrary/ 解压OpenCV-2.0.0.tar.bz2 tar xvf OpenCV-2.0.0.tar.bz2 配置 ./configure --host=arm-linux --without-carbon --without-quicktime--without-1394libs --without-ffmpeg --without-python --without-swig--without-gtk --enable-static --enable-
[单片机]
串口控制FL2440(S3C2440)的LED
开发板:FL2440 芯片:S3C2440 功能:程序运行时点亮一个LED,然后利用PC机通过串口发送一个数,开发板读到这个数后点亮另外一个LED。最基本的串口控制。 代码: Init.s AREA |DATA|,CODE,READONLY ENTRY ldr r13, =0x1000 IMPORT WuqiMain b WuqiMain END include.h 1 #define rUTRSTAT0 (*(volatile unsigned *)0x50000010) //UART 0 Tx/Rx status 2 #define rULCON0 (*(volatile uns
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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