日期:2014-05-16  浏览次数:20629 次

linux lcd驱动分析一

硬件平台:mini2440 + TD035STED4  软件平台:linux-2.6.32.2 日期:04/07/2012


首先看驱动模块的初始化函数:

/* drivers/video/s3c2410fb.c */

   1119 int __init s3c2410fb_init(void)
   1120 {
   1121         int ret = platform_driver_register(&s3c2410fb_driver);
   1122
   1123         if (ret == 0)
   1124                 ret = platform_driver_register(&s3c2412fb_driver);
   1125
   1126         return ret;
   1127 }
   1128
   1129 static void __exit s3c2410fb_cleanup(void)
   1130 {
   1131         platform_driver_unregister(&s3c2410fb_driver);
   1132         platform_driver_unregister(&s3c2412fb_driver);
   1133 }

初始化函数里面就注册了一个平台设备驱动。

再来看驱动模块卸载函数:

   1129 static void __exit s3c2410fb_cleanup(void)
   1130 {
   1131         platform_driver_unregister(&s3c2410fb_driver);
   1132         platform_driver_unregister(&s3c2412fb_driver);
   1133 }

卸载函数里面注销平台设备驱动。

s3c2440自然采用的是s3c2410fb_driver,我们来看这个结构的定义:

   1097 static struct platform_driver s3c2410fb_driver = {
   1098         .probe          = s3c2410fb_probe,
   1099         .remove         = s3c2410fb_remove,
   1100         .suspend        = s3c2410fb_suspend,
   1101         .resume         = s3c2410fb_resume,
   1102         .driver         = {
   1103                 .name   = "s3c2410-lcd",
   1104                 .owner  = THIS_MODULE,
   1105         },
   1106 };

我们看driver中的name字段为s3c2410-lcd,那自然去找与之对应的平台设备。

我们在devs.c中找到了这个平台设备的定义:

/* arch/arm/plat-s3c24xx/devs.c */

    141 /* LCD Controller */
    142
    143 static struct resource s3c_lcd_resource[] = {
    144         [0] = {
    145                 .start = S3C24XX_PA_LCD,
    146                 .end   = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,
    147                 .flags = IORESOURCE_MEM,
    148         },
    149         [1] = {
    150                 .start = IRQ_LCD,
    151                 .end   = IRQ_LCD,
    152                 .flags = IORESOURCE_IRQ,
    15