Linux的LCD驱动源码分析及移植

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档