Linux设备驱动--LCD平台设备与驱动(smdk2440)
2016-08-30 12:04
531 查看
1 环境与简介
Host:Ubuntu14.04(64bit)
Target:smdk2440
Kernel:linux-2.6.39.4
类似于《Linux设备驱动--WDT平台设备与驱动》,本文再以LCD为例进行说明。本文的源码均来自Linux内核(linux-2.6.39.4貌似对mini2440 LCD移植还不完善,因此本文以smdk2440为例,在源码中已经完美支持该开发板的LCD)。
2 平台设备
2.1 定义
(1)平台设备
定义全局变量s3c_device_lcd,并且通过EXPORT_SYMBOL(s3c_device_lcd)使其在别的源文件可见:
(2)平台资源
上述LCD设备所引用的平台设备资源如下所定义:
源文件:arch/arm/plat-s3c24xx/devs.c
2.2 引用
定义一个平台设备数组smdk2440_devices,该数组包含了smdk2440开发板的所有平台设备,其中当然包括上述s3c_device_lcd,如下第3行所示:
2.3 注册
(1)注册函数
在smdk2440_machine_init()函数中调用platform_add_devices()函数将上述smdk2440_devices注册到系统,即可完成平台设备的注册,如下第4行所示:
源文件:arch/arm/mach-s3c2440/mach-smdk2440.c
(2)注册时机
上述smdk2440_machine_init()函数是何时被调用的呢?答案是在内核初始化设备的时候,如下第6行所示:
源文件:arch/arm/mach-s3c2440/mach-smdk2440.c
3 平台驱动
3.1 定义
为了和平台设备匹配,平台驱动的name要与平台设备的name一致:
源文件:drivers/video/s3c2410fb.c
上述s3c2410fb_probe、s3c2410fb_remove、s3c2410fb_shutdown、s3c2410fb_suspend以及s3c2410fb_resume都在同一个源文件中定义,详见源文件drivers/video/s3c2410fb.c。
上述s3c2410fb_probe()调用s3c24xxfb_probe(),并且在s3c24xxfb_probe()中实现framebuffer的创建,初始化与注册,详见《Linux设备驱动--framebuffer》。
3.2 注册
在模块加载函数s3c2410fb_init()中调用platform_driver_register()函数注册上述平台驱动s3c2410fb_driver:
4 设备与驱动匹配
同《Linux设备驱动--WDT平台设备与驱动》第4节。
参考资料
[1]Linux下LCD驱动详细分析(一)
[2]Linux LCD驱动参数的配置与编译(完全)
[3]Linux的LCD驱动
[4]Linux下LCD编程
[5]Tiny 4412 lcd 驱动分析
[6]tiny4412LCD驱动加字符显示
[7]平台设备的识别
Host:Ubuntu14.04(64bit)
Target:smdk2440
Kernel:linux-2.6.39.4
类似于《Linux设备驱动--WDT平台设备与驱动》,本文再以LCD为例进行说明。本文的源码均来自Linux内核(linux-2.6.39.4貌似对mini2440 LCD移植还不完善,因此本文以smdk2440为例,在源码中已经完美支持该开发板的LCD)。
2 平台设备
2.1 定义
(1)平台设备
定义全局变量s3c_device_lcd,并且通过EXPORT_SYMBOL(s3c_device_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 = &s3c_device_lcd_dmamask, .coherent_dma_mask = 0xffffffffUL } }; EXPORT_SYMBOL(s3c_device_lcd);源文件:arch/arm/plat-s3c24xx/devs.c
(2)平台资源
上述LCD设备所引用的平台设备资源如下所定义:
static struct resource s3c_lcd_resource[] = { [0] = { .start = S3C24XX_PA_LCD, /* 0x4D000000 */ .end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,/* S3C24XX_SZ_LCD=0x00100000(1M) */ .flags = IORESOURCE_MEM, /* 0x00000200 */ }, [1] = { .start = IRQ_LCD, /* 32 */ .end = IRQ_LCD, .flags = IORESOURCE_IRQ, /* 0x00000400 */ } };
源文件:arch/arm/plat-s3c24xx/devs.c
2.2 引用
定义一个平台设备数组smdk2440_devices,该数组包含了smdk2440开发板的所有平台设备,其中当然包括上述s3c_device_lcd,如下第3行所示:
static struct platform_device *smdk2440_devices[] __initdata = { &s3c_device_ohci, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_iis, };源文件:arch/arm/mach-s3c2440/mach-smdk2440.c
2.3 注册
(1)注册函数
在smdk2440_machine_init()函数中调用platform_add_devices()函数将上述smdk2440_devices注册到系统,即可完成平台设备的注册,如下第4行所示:
static void __init smdk2440_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(); }
源文件:arch/arm/mach-s3c2440/mach-smdk2440.c
(2)注册时机
上述smdk2440_machine_init()函数是何时被调用的呢?答案是在内核初始化设备的时候,如下第6行所示:
MACHINE_START(S3C2440, "SMDK2440") /* Maintainer: Ben Dooks <ben-linux@fluff.org> */ .boot_params = S3C2410_SDRAM_PA + 0x100, /* 0x30000100 */ .init_irq = s3c24xx_init_irq, .map_io = smdk2440_map_io, .init_machine = smdk2440_machine_init, .timer = &s3c24xx_timer, MACHINE_END
源文件:arch/arm/mach-s3c2440/mach-smdk2440.c
3 平台驱动
3.1 定义
为了和平台设备匹配,平台驱动的name要与平台设备的name一致:
static struct platform_driver s3c2410fb_driver = { .probe = s3c2410fb_probe, .remove = __devexit_p(s3c2410fb_remove), .suspend = s3c2410fb_suspend, .resume = s3c2410fb_resume, .driver = { .name = "s3c2410-lcd", .owner = THIS_MODULE, }, };
源文件:drivers/video/s3c2410fb.c
上述s3c2410fb_probe、s3c2410fb_remove、s3c2410fb_shutdown、s3c2410fb_suspend以及s3c2410fb_resume都在同一个源文件中定义,详见源文件drivers/video/s3c2410fb.c。
上述s3c2410fb_probe()调用s3c24xxfb_probe(),并且在s3c24xxfb_probe()中实现framebuffer的创建,初始化与注册,详见《Linux设备驱动--framebuffer》。
3.2 注册
在模块加载函数s3c2410fb_init()中调用platform_driver_register()函数注册上述平台驱动s3c2410fb_driver:
int __init s3c2410fb_init(void) { int ret = platform_driver_register(&s3c2410fb_driver); if (ret == 0) ret = platform_driver_register(&s3c2412fb_driver); return ret; }源文件:drivers/video/s3c2410fb.c
4 设备与驱动匹配
同《Linux设备驱动--WDT平台设备与驱动》第4节。
参考资料
[1]Linux下LCD驱动详细分析(一)
[2]Linux LCD驱动参数的配置与编译(完全)
[3]Linux的LCD驱动
[4]Linux下LCD编程
[5]Tiny 4412 lcd 驱动分析
[6]tiny4412LCD驱动加字符显示
[7]平台设备的识别
相关文章推荐
- Linux设备驱动--LCD平台设备与驱动(smdk2440)
- Linux设备驱动--LCD平台设备与驱动(tiny4412)
- linux中LCD设备驱动(4)——基于s3c6410平台
- Linux设备驱动--LCD平台设备与驱动(smdk6410)
- linux中LCD设备驱动(5)——基于s3c6410平台
- Linux设备驱动--LCD平台设备与驱动(s3c64xx)
- s2c2440 rtc 平台设备驱动 卸载问题 oops
- Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
- Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
- linux2.6.32.2 mini2440平台移植--LCD 背光驱动
- S3C2440驱动篇—Linux平台设备驱动
- S3C2440驱动篇—Linux平台设备驱动之SPI
- Windows CE LCD显示驱动简析(1)(基于WinCE5.0 SMDK2410 BSP的LCD显示设备驱动)
- Windows CE LCD显示驱动简析(2)(基于WinCE5.0 SMDK2410 BSP的LCD显示设备驱动)
- Linux平台下I2C设备驱动开发和实现
- linux2.6.32.2 mini2440平台移植-- LCD 显示驱动 ( W35屏 )
- S3C2440驱动篇—Linux平台设备驱动之RTC时钟
- Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
- linux 2.6.32 在arm9(s3c2440)平台的移植 - LCD背光驱动
- linux设备驱动——andriod平台wlan驱动