预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共30页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux的LCD驱动源码分析及移植(三部曲) 第一部分: 基于ARM9处理器的linux-2.6.32.2操作系统内核移植手记part5.1(LCD驱动源码分析及移植之platformdevice) 1.与LCD控制器硬件相关的寄存器内容请参照三星S3C2440A技术手册中的第15章。 2.LCDController的平台设备定义如下(文件位于linux/arch/arm/plat-s3c24xx/devs.c): /*LCDController*/ staticstructresources3c_lcd_resource[]={ [0]={ .start=S3C24XX_PA_LCD, .end=S3C24XX_PA_LCD+S3C24XX_SZ_LCD-1, .flags=IORESOURCE_MEM, }, [1]={ .start=IRQ_LCD, .end=IRQ_LCD, .flags=IORESOURCE_IRQ, } }; staticu64s3c_device_lcd_dmamask=0xffffffffUL; structplatform_devices3c_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); 平台设备的结构体定义为s3c_device_lcd,该设备在平台总线中的名字取为s3c2410-lcd,该平台设备申请的两个板级资源为以S3C24XX_PA_LCD为起始的IORESOURCE_MEM资源和一个定义为IRQ_LCD的IORESOURCE_IRQ资源。 其中, #defineS3C24XX_PA_LCDS3C2410_PA_LCD /*LCDcontroller*/ #defineS3C2410_PA_LCD(0x4D000000) #defineS3C24XX_SZ_LCDSZ_1M 0x4D000000为LCDCON1寄存器的地址。 3.LCDController的平台设备的注册如下(文件位于linux/arch/arm/mach-s3c2440/mach-smdk2440.c): staticstructplatform_device*smdk2440_devices[]__initdata={ &s3c_device_usb, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_iis, &s3c_device_rtc, }; 以上第4行代码将lcd平台设备注册进内核。 4.在系统初始化时将smdk2440_fb_info结构体添加进平台设备的私有结构中。具体流程如下: 4.1 MACHINE_START(S3C2440,"SMDK2440") /*Maintainer:BenDooks<ben@fluff.org>*/ .phys_io=S3C2410_PA_UART, .io_pg_offst=(((u32)S3C24XX_VA_UART)>>18)&0xfffc, .boot_params=S3C2410_SDRAM_PA+0x100, .init_irq=s3c24xx_init_irq, .map_io=smdk2440_map_io, .init_machine=smdk2440_machine_init, .timer=&s3c24xx_timer, MACHINE_END 启动S3C2440机器,系统将通过“.init_machine=smdk2440_machine_init,”调用smdk2440_machine_init()函数。 4.2 staticvoid__initsmdk2440_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(); } 在smdk2440_machine_init函数中,通过“s3c24xx_fb_set_platda