Linux S3C2440 LCD 设备驱动

发布时间:2024-06-13  

主机:VM - RedHat 9.0

开发板:FL2440,linux-2.6.12

arm-linux-gcc:3.4.1

  1. /* 

  2.  *  linux/drivers/video/s3c2410fb.c 

  3.  */  

  4.   

  5. #include    

  6. #include    

  7. #include    

  8. #include    

  9. #include    

  10. #include    

  11. #include    

  12. #include    

  13. #include    

  14. #include    

  15. #include    

  16. #include    

  17. #include    

  18. #include    

  19. #include    

  20. #include    

  21.   

  22. #include    

  23. #include    

  24. #include    

  25. #include    

  26. #include    

  27. #include    

  28. #include    

  29. #include    

  30.   

  31. #include "s3c2410fb.h"   

  32.   

  33. /* 

  34.  * Complain if VAR is out of range. 

  35.  */  

  36. #define DEBUG_VAR 1   

  37.   

  38. // 通过写入一个数据到此寄存器来清除SRCPND 寄存器的指定位。其只清除那些数据中被设置为1 的相应   

  39. // 位置的SRCPND 位。那些数据中被设置为0 的相应位置的位保持不变。   

  40. #define ClearPending(x) {      

  41.               __raw_writel((1 << (x)), S3C2410_SRCPND);     

  42.               __raw_writel((1 << (x)), S3C2410_INTPND);     

  43.             }  

  44.   

  45. struct gzliu_fb_mach_info fs2410_info = {  

  46.     .pixclock   = 270000,  

  47.     .xres       = 320,  

  48.     .yres       = 240,  

  49.     .bpp        = 16,  

  50.     .hsync_len  = 8,  

  51.     .left_margin    = 5,  

  52.     .right_margin   = 15,  

  53.     .vsync_len  = 15,  

  54.     .upper_margin   = 3,  

  55.     .lower_margin   = 5,  

  56.     .sync       = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,  

  57.     .cmap_greyscale = 0,  

  58.     .cmap_inverse   = 0,  

  59.     .cmap_static    = 0,  

  60.     .reg        = {  

  61.         .lcdcon1 = (6<<8)|(0<<7)|(3<<5)|(12<<1),  

  62.         .lcdcon2 = (3<<24) | (239<<14) | (5<<6) | (15),  

  63.         .lcdcon3 = (58<<19) | (319<<8) | (15),  

  64.         .lcdcon4 = (13<<8) | (8),  

  65.         .lcdcon5 = (1<<11) | (0<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3)  |(0<<1) | (1),  

  66.     }  

  67. };  

  68.   

  69. static void (*gzliu_fb_backlight_power)(int);  

  70. static void (*gzliu_fb_lcd_power)(int);  

  71.   

  72. static int gzliu_fb_activate_var(struct fb_var_screeninfo *var, struct gzliu_fb_info *);  

  73. static void set_ctrlr_state(struct gzliu_fb_info *fbi, u_int state);  

  74.   

  75. static inline void gzliu_fb_schedule_work(struct gzliu_fb_info *fbi, u_int state)  

  76. {  

  77. printk("@@@@@@@@@@ gzliu_fb_schedule_work() @@@@@@@@@@@@n");  

  78.     unsigned long flags;  

  79.   

  80.     local_irq_save(flags);  

  81.     /* 

  82.      * We need to handle two requests being made at the same time. 

  83.      * There are two important cases: 

  84.      *  1. When we are changing VT (C_REENABLE) while unblanking (C_ENABLE) 

  85.      *     We must perform the unblanking, which will do our REENABLE for us. 

  86.      *  2. When we are blanking, but immediately unblank before we have 

  87.      *     blanked.  We do the "REENABLE" thing here as well, just to be sure. 

  88.      */  

  89.     if (fbi->task_state == C_ENABLE && state == C_REENABLE)  

  90.         state = (u_int) -1;  

  91.     if (fbi->task_state == C_DISABLE && state == C_ENABLE)  

  92.         state = C_REENABLE;  

  93.   

  94.     if (state != (u_int)-1) {  

  95.         fbi->task_state = state;  

  96.         schedule_work(&fbi->task);  

  97.     }  

  98.     local_irq_restore(flags);  

  99. }  

  100.   

  101. static inline u_int chan_to_field(u_int chan, struct fb_bitfield *bf)  

  102. {  

  103. printk("@@@@@@@@@@ chan_to_field() @@@@@@@@@@@@n");  

  104.     chan &= 0xffff;  

  105.     chan >>= 16 - bf->length;  

  106.     return chan << bf->offset;  

  107. }  

  108.   

  109. static int gzliu_fb_setpalettereg(u_int regno, u_int red, u_int green, u_int blue,  

  110.                u_int trans, struct fb_info *info)  

  111. {  

  112. printk("@@@@@@@@@@ gzliu_fb_setpalettereg() @@@@@@@@@@@@n");  

  113.     struct gzliu_fb_info *fbi = (struct gzliu_fb_info *)info;  

  114.     u_int val, ret = 1;  

  115.   

  116.     if (regno < fbi->palette_size) {  

  117.         if (fbi->fb.var.grayscale) {  

  118.             val = ((blue >> 8) & 0x00ff);  

  119.         } else {  

  120.             val  = ((red   >>  0) & 0xf800);  

  121.             val |= ((green >>  5) & 0x07e0);  

  122.             val |= ((blue  >> 11) & 0x001f);  

  123.         }  

  124.   

  125.         fbi->palette_cpu[regno] = val;  

  126.         ret = 0;  

  127.     }  

  128.     return ret;  

  129. }  

  130.   

  131. static int gzliu_fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,  

  132.            u_int trans, struct fb_info *info)  

  133. {  

  134. printk("@@@@@@@@@@ gzliu_fb_setcolreg() @@@@@@@@@@@@n");  

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>