Linux的LCD驱动源码分析及移植
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux的LCD驱动源码分析及移植(三部曲)
第一部分:
基于ARM9处理器的linux-2.6.32.2操作系统内核移植手记part5.1(LCD驱动源码分析及移植之platform device)
1.与LCD控制器硬件相关的寄存器内容请参照三星S3C2440A技术手册中的第15章。
2. LCD Controller的平台设备定义如下(文件位于linux/arch/arm/plat-s3c24xx/devs.c):
1./* LCD Controller */
2.
3.static struct resource s3c_lcd_resource[] = {
4. [0] = {
5. .start = S3C24XX_PA_LCD,
6. .end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,
7. .flags = IORESOURCE_MEM,
8. },
9. [1] = {
10. .start = IRQ_LCD,
11. .end = IRQ_LCD,
12. .flags = IORESOURCE_IRQ,
13. }
14.
15.};
16.
17.static u64 s3c_device_lcd_dmamask = 0xffffffffUL;
18.
19.struct platform_device s3c_device_lcd = {
20. .name = "s3c2410-lcd",
21. .id = -1,
22. .num_resources = ARRAY_SIZE(s3c_lcd_resource),
23. .resource = s3c_lcd_resource,
24. .dev = {
25. .dma_mask = &s3c_device_lcd_dmamask,
26. .coherent_dma_mask = 0xffffffffUL
27. }
28.};
29.
30.EXPORT_SYMBOL(s3c_device_lcd);
平台设备的结构体定义为s3c_device_lcd,该设备在平台总线中的名字取为s3c2410-lcd,该平台设备申请的两个板级资源为以S3C24XX_PA_LCD为起始的IORESOURCE_MEM资源和一个定义为IRQ_LCD的IORESOURCE_IRQ资源。
其中,
1.#define S3C24XX_PA_LCD S3C2410_PA_LCD
1./* LCD controller */
2.#define S3C2410_PA_LCD (0x4D000000)
3.#define S3C24XX_SZ_LCD SZ_1M
0x4D000000为LCDCON1寄存器的地址。
3. LCD Controller的平台设备的注册如下(文件位于linux/arch/arm/mach-s3c2440/mach-smdk24 40.c):
1.static struct platform_device *smdk2440_devices[] __initdata = {
2. &s3c_device_usb,
3.
4. &s3c_device_lcd,
5.
6. &s3c_device_wdt,
7. &s3c_device_i2c0,
8. &s3c_device_iis,
9. &s3c_device_rtc,
10.};
以上第4行代码将lcd平台设备注册进内核。
4.在系统初始化时将smdk2440_fb_info结构体添加进平台设备的私有结构中。具体流程如下:
4.1
1.MACHINE_START(S3C2440, "SMDK2440")
2. /* Maintainer: Ben Dooks
3. .phys_io = S3C2410_PA_UART,
4. .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
5. .boot_params = S3C2410_SDRAM_PA + 0x100,
6.
7. .init_irq = s3c24xx_init_irq,
8. .map_io = smdk2440_map_io,
9. .init_machine = smdk2440_machine_init,
10. .timer = &s3c24xx_timer,
11.MACHINE_END
启动S3C2440机器,系统将通过“.init_machine = smdk2440_machine_init,”调用smdk2440_machine_init()函数。
4.2
1.static void __init smdk2440_machine_init(void)
2.{
3. s3c24xx_fb_set_platdata(&smdk2440_fb_info);
4. s3c_i2c0_set_platdata(NULL);
5.
6. platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));
7. smdk_machine_init();
8.}
在 smdk2440_machine_init函数中,通过“s3c24xx_fb_set_platdata(&smdk2440_fb_info);”将smdk2440_fb_info添加进平台设备的私有结构中。
4.3