mini2440_LCD_x35移植

从linux 2.6起引入了新一套的驱动管理和注册机制:platform_device 和piatform_driver. (platform代表平台);设备用platform_device表示,驱动用piatform_driver进行注册。

Linuxplatformdriver机制和传统的devicedriver机制(通过driver_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platformdevice提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。

Platform机制的本身使用并不复杂,由两部分组成:platform_device和platfrom_driver。

通过Platform机制开发底层驱动的大致流程为:定义resoucre->定义platform_device->定义platform_driver->注册platform_driver。

内核里已经有很完善的lcd驱动了,我们只要根据所用的LCD进行简单的修改。 首先要确认的就是设备的资源信息,例如设备的地址,中断号等。

在2.6内核中platform设备用结构体platform_device来描述,该结构体定义在

kernel\include\linux\platform_device.h

中。

Struct platform_device{

const char *name; u32 id;

struct device dev; u32 num_resources;

struct resource  *resource;

};

该结构一个重要的元素是resource,该元素存入了最为重要的设备资源信息,定义在

kernel\include\linux\ioport.h中。 struct resource{

resource_size_tstart; //描述设备实体在cpu总线上的线性起始物理地址;

resource_size_tend; // 描述设备实体在cpu总线上的线性结尾物理地址;

const char  *name; // 描述这个设备实体的名称,这个名字开发人员可以随意起;

unsigned long flags; //描述这个设备实体的一些共性和特性的标志位;      (标示为LCD控制器IO端口,在驱动中引用这个就表示

引用IO端口)

struct resource *parent, *sibling, *child;// 指针parent、sibling和child:分别为

指向父亲、兄弟和子资源的指针。

};

例如:

1、修改linux-2.6.32.2\arch\arm\palt-s3c24xx\devs.c文件:添加平台设备LCD占用的资源。 打开devs.c

/* LCD Controller */

static struct resource s3c_lcd_resource[ ] = {

[0] = {   .start = S3C24XX_PA_LCD, //(控制器IO端口开始地址)

.end   = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,//(控制器IO端口结束地址)

.flags = IORESOURCE_MEM, //(标示为LCD控制器IO端口,在驱动中引用这个

就表示引用IO端口)

},  [1] = {   .start = IRQ_LCD,   .end   = IRQ_LCD,   .flags = IORESOURCE_IRQ,  } };

有了resource信息,就可以定义platform_device了:

2、修改linux-2.6.32.2\arch\arm\plat-s3c24xx\devs.c文件:添加平台设备s3c_devce_lcd。如下所示,如果已经有则不用添加。

static u64 s3c_device_lcd_dmamask = 0xffffffffUL;

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  } };

这里是定义一个自己的设备的一些信息。定义好了platform_device结构体后就可以调用函数platform_add_devices向系统中添加该设备了,之后可以调用platform_device_register()进行设备注册。当注册成功时会调用platform_driver结构元素probe函数指针,这里

就是s3c24xx_i2c_probe,当进入probe函数后,需要获取设备的资源信息,常用获取资源的函数主要是:

struct resource *platform_get_resource ( struct platform_device *dev, unsigned int type, unsigned int num);

根据参数type所指定类型,例如IORESOURCE_MEM,来获取指定的资源。

struct int platform_get_irq (struct platform_device *dev,unsigned int num);//获取资源中的中断号。(这里可以不看)导出定义的LCD平台设备,好在mach-smdk2440.c的smdk2440_devices[]中添加到平台设备列表。

EXPORT_SYMBOL(s3c_device_lcd);

(linux还在/arch/arm/mach-s3c2410/include/mach/fb.h)中为LCD平台设备定义了一个s3c2410fb_mach_info结构体,该结构体主要是记录LCD的硬件参数信息(比如该结构体的s3c2410fb_display成员结构中就用于记录LCD的屏幕尺寸、屏幕信息、可变的屏幕参数、LCD配置寄存器等),这样在写驱动的时候就直接使用这个结构体。下面,我们来看一下内

核是如何使用这个结构体的。在/arch/arm/mach-s3c2440/mach-smdk2440.c(这里看自己定义的文件我的为mach-mini2440.c以后我就用mini2440);

3. 修改arch\arm\mach-s3c2440\mach-smdk2440.c:配置s3c2440_devices平台设备数据,注册s3c2440_devices平台设备。

static struct platform_device *mini2440_devices[] __initdata = {                           &s3c_device_usb,                           &s3c_device_lcd,(前面第二步已经定义了这个结构体了)                           &s3c_device_wdt,                           &s3c_device_i2c0,                           &s3c_device_iis,                              &s3c_device_nand,                               &mini2440_device_eth,

};

4. 修改arch\arm\mach-s3c2440\mach-mini2440.c:配置mini2440_devices_lcd平台设备数据。 /* LCD driver info */

static struct s3c2410fb_display mini2440_lcd_cfg __initdata = { #if !defined (LCD_CON5)  .lcdcon5 = S3C2410_LCDCON5_FRM565 |      S3C2410_LCDCON5_INVVLINE |      S3C2410_LCDCON5_INVVFRAME |      S3C2410_LCDCON5_PWREN |      S3C2410_LCDCON5_HWSWP,  #else   .lcdcon5 = LCD_CON5,  #endif  .type  = S3C2410_LCDCON1_TFT,  .width  = LCD_WIDTH,  .height  = LCD_HEIGHT,  .pixclock =LCD_PIXCLOCK, /* HCLK 60 MHz, divisor 10 */  .xres  = LCD_WIDTH,  .yres  =LCD_HEIGHT,  .bpp  = 16,  .left_margin = LCD_LEFT_MARGIN +1,  .right_margin =LCD_RIGHT_MARGIN +1,  .hsync_len = LCD_HSYNC_LEN+1,  .upper_margin = LCD_UPPER_MARGIN+1,  .lower_margin =  LCD_LOWER_MARGIN+1,  .vsync_len =LCD_VSYNC_LEN+1 , };

5. 修改mach-mini2440.c添加X35屏支持。(这一部分要放在第四步的前面) #define LCD_WIDTH 240  //屏宽 #define LCD_HEIGHT 320  //屏高

#define LCD_PIXCLOCK 170000  //时钟 #define LCD_RIGHT_MARGIN 25  //左边界

#define LCD_LEFT_MARGIN 0  //右边界 #define LCD_HSYNC_LEN 4  //行同步 #define LCD_UPPER_MARGIN 0  //上边界 #define LCD_LOWER_MARGIN 4  //下边界 #define LCD_VSYNC_LEN 9 //帧同步

#define LCD_CON5 (S3C2410_LCDCON5_FRM565 | \      S3C2410_LCDCON5_INVVFRAME | \      S3C2410_LCDCON5_INVVLINE | \      S3C2410_LCDCON5_INVVFRAME | \      S3C2410_LCDCON5_INVVDEN | \      S3C2410_LCDCON5_PWREN | \      S3C2410_LCDCON5_BSWP )

6. 修改arch\arm\mach-s3c2440\mach-mini2440.c:配置s3c2440_devices平台设备数据,注册s3c2440_devices平台设备,加LCD背光

(因为mini2440的3.5英寸液晶显示屏的背光是由s3c2440的GPG4引脚来控制的,) static struct s3c2410fb_mach_info  mini2440_fb_info __initdata ={    .displays = &mini2440_lcd_cfg,// (第5步已经设置过mini2440_lcd_cfg)          .num_displays = 1,    .default_display = 0,//(注释:default为未履行的)    .gpccon= 0xaa955699,    .gpccon_mask= 0xffc003cc,    .gpcup= 0x0000ffff,    .gpcup_mask= 0xffffffff,    .gpdcon= 0xaa95aaa1,    .gpdcon_mask= 0xffc0fff0,    .gpdup= 0x0000faff,    .gpdup_mask= 0xffffffff,    .lpcsel =0xf82,  };

static void __init mini2440_machine_init(void) {

s3c24xx_fb_set_platdata(&mini2440_fb_info); (设置s3c2440_devices平台设备数据)

s3c_i2c0_set_platdata(NULL);

s3c2410_gpio_cfgpin(S3C2410_GPG(4),S3C2410_GPIO_OUTPUT);(配置lcd管脚)(要添加  #include<linux/gpio.h> )

s3c2410_gpio_setpin(S3C2410_GPG(4),1);

s3c_device_nand.dev.platform_data = &mini2440_nand_info;

//s3c_device_sdi.dev.platform_data=&s3c2410_mmc_cfg;

platform_add_devices (mini2440_devices, ARRAY_SIZE(mini2440_devices));(将LCD平台设备注册到内核)

//s3c_pm_init();

//mini2440_machine_init();(这些用不到的可以屏蔽掉) }

7. 修改inux-2.6.32.2/drivers/video/Kconfig文件. config  FB_S3C2410_X240320

boolean"3.5 inch 240X320 SONY LCD (X35-ACX502BMU) "   depends on FB_S3C2410   help

3.5 inch 240X320 SONY LCD (X35-ACX502BMU)  8.make menuconfig  Device Driver:

<*>support for frame buffer devices -?    [* ] Enable frameware EDID

[* ] Enable Vidoe Mode Handling Helpers  <*>S3C24X0 LCD framebuffer support Console display driver support --?  <*> Framebuffer Console Support [* ] Bootup Logo --?

<*> Standard 224-color Linux logo 最后启动内核后就可以看见企鹅了。

时间: 2024-10-13 17:17:29

mini2440_LCD_x35移植的相关文章

【Windows10&nbsp;IoT开发系列】API&nbsp;移植工具

原文:[Windows10 IoT开发系列]API 移植工具 Windows 10 IoT Core 中是否提供你的当前 Win32 应用程序或库所依赖的 API? 如果不提供,是否存在可使用的等效 API? 此工具可以为你回答这些问题,并协助你将你的当前 Win32 应用程序和库迁移到 Windows IoT Core. Windows 10 IoT 核心版 API 移植工具可在 ms-iot/iot-utilities github 存储库中找到.下载存储库 zip 并将 IoTAPIPor

LEDAPS1.3.0版本移植到windows平台----HuCsm云掩膜模块

这个是2012年左右放在百度空间的,谁知百度空间关闭...转移到博客园. 最近项目用到3.1.2版本的LEDAPS,新版本的使用情况会在后续文章中慢慢丰富. HuCsm是将LEDAPS项目中的TM/ETM+大气校正流程系列算法中的云掩膜模块由linux系统移植到windows下的产物,代码本身改动不大,使用接口不变. 包含文件: HuCsm.exe hd423m.dll hm423m.dll 编译程序需要包含的静态库有: gctp.lib hdfeos.lib hd423m.lib hm423m

学习者移植NES

http://blog.csdn.net/zerokkqq/article/details/52964249 http://bbs.eeworld.com.cn/thread-415692-1-1.html 上面这个是我移植参考他人的文件.手把手教你移植XXX,多牛逼. 作为承前启后的一件事,你要搞清楚接下来要做什么.别傻了,我们不可能知道之后每一个细节会怎样,所以这里的搞清楚也不是面面俱到,记得,不要总是急着一口气完成任务,之后我们的道路应该是一步一个脚印 1.我总是三分钟热度,希望这次不要断

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

基于tiny4412的Linux内核移植 -- PWM子系统学习(八)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

Cocos移植到Android的一些问题-SQLite3数据库移植问题

首选我们讨论一下SQLite3数据库移植问题.我们在第14章节介绍了在Win32平台使用SQLite3数据库,我们介绍了两种配置环境的方法:一种是使用Cocos2d-x提供的SQLite3库配置,另一种是从SQLite官网下载源代码拷贝的工程中.第一种方法配置起来比较麻烦,关键是Cocos2d-x提供的SQLite3库只是Win32没有其它平台的,目录结构如下所示.<游戏工程目录>\cocos2d\external\sqlite3│  Android.mk│├─include│      sq

ARM板ok6410移植qt4.84+opencv2.4.9初步成功

先上图,有图有真相,当课题重新回归到嵌入式搭载的老问题上时,我还一度各种担心,发现最新的A9板4412能用Android了,还想着偷懒买块现成的只做最顶层开发就好,结果找遍工业相机厂家没见到有提供Android驱动的,一了解才明白,Android驱动是基于linux驱动的貌似,于是乎,又尝试着回归到移植opencv到嵌入式linux的老路上来. 想当初,零linux基础的我对着借来的6410各种被蹂躏,历时1个月仅仅是搭建了能用板子自带的qt4.7.1库编写界面程序而已.那次各种编译错误,各种零

1.将cocos2d-x项目移植到Linux环境下,将cocos2d-x项目移植到手机上

 1.将cocos2d-x相关的软件包拷贝到Linux下. 2 对上面的安装包进行解压 3 执行cocos2dx-2.2.3/install-deps-linux.sh(执行这个命令需要有网络) 4 安装QT,命令:sudoapt-get install qt-sdk 5 在cocos2dx-2.2.3目录下,执行./make-all-linux-project.sh 6 要让64位的linux能运行32位的adb,aapt工具,需要安装以下软件 sudo apt-get install g

cocos2d-x 移植android横竖横屏设置

AndroidManifest.xml中android:screenOrientation字段控制屏幕方向,默认情况是横屏 android:screenOrientation="landscape" //横屏 android:screenOrientation="portrait"//坚屏 cocos2d-x 移植android横竖横屏设置,布布扣,bubuko.com