官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1464|回复: 3

谁把mini2440的x35 lcd的驱动程序弄好了?

[复制链接]

1

主题

2

帖子

25

积分

新手上路

Rank: 1

积分
25
发表于 2014-5-16 08:31:46 | 显示全部楼层 |阅读模式
韦老师的mini2440代码对x35的屏幕没效果啊,一点反应都没有,谁写好了能贴下代码吗?急求
回复

使用道具 举报

191

主题

1764

帖子

6129

积分

超级版主

答疑助手

Rank: 8Rank: 8

积分
6129
QQ
发表于 2014-5-16 09:15:49 | 显示全部楼层
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/err.h>
  4. #include <linux/errno.h>
  5. #include <linux/string.h>
  6. #include <linux/mm.h>
  7. #include <linux/slab.h>
  8. #include <linux/delay.h>
  9. #include <linux/fb.h>
  10. #include <linux/init.h>
  11. #include <linux/dma-mapping.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/clk.h>
  15. #include <linux/cpufreq.h>
  16. #include <linux/io.h>

  17. #include <asm/div64.h>

  18. #include <asm/mach/map.h>
  19. #include <mach/regs-lcd.h>
  20. #include <mach/regs-gpio.h>
  21. #include <mach/fb.h>
  22. //#include "fbmem.h"

  23. //函数申明
  24. static int s3c_lcdfb_setcolreg(unsigned int regno, unsigned int red,
  25.                              unsigned int green, unsigned int blue,
  26.                              unsigned int transp, struct fb_info *info);

  27. struct lcd_regs {
  28.         unsigned long        lcdcon1;
  29.         unsigned long        lcdcon2;
  30.         unsigned long        lcdcon3;
  31.         unsigned long        lcdcon4;
  32.         unsigned long        lcdcon5;
  33.     unsigned long        lcdsaddr1;
  34.     unsigned long        lcdsaddr2;
  35.     unsigned long        lcdsaddr3;
  36.     unsigned long        redlut;
  37.     unsigned long        greenlut;
  38.     unsigned long        bluelut;
  39.     unsigned long        reserved[9];
  40.     unsigned long        dithmode;
  41.     unsigned long        tpal;
  42.     unsigned long        lcdintpnd;
  43.     unsigned long        lcdsrcpnd;
  44.     unsigned long        lcdintmsk;
  45.     unsigned long        lpcsel;
  46. };

  47. static struct fb_ops s3c_lcdfb_ops = {
  48.         .owner                    = THIS_MODULE,
  49.         .fb_setcolreg        = s3c_lcdfb_setcolreg,
  50.         .fb_fillrect        = cfb_fillrect,        /*insmod cfbfillrect.ko*/
  51.         .fb_copyarea        = cfb_copyarea,    /*insmod cfbcopyarea.ko*/
  52.         .fb_imageblit        = cfb_imageblit,   /*insmod cfbimgblt.ko*/
  53. };

  54. static struct fb_info *lcd;
  55. static volatile unsigned long *gpbcon;
  56. static volatile unsigned long *gpbdat;
  57. static volatile unsigned long *gpccon;
  58. static volatile unsigned long *gpdcon;
  59. static volatile unsigned long *gpgcon;
  60. //static volatile unsigned long *gpgdat;
  61. static u32 pseudo_palette[16];
  62. static struct lcd_regs *lcd_pres;

  63. /* from pxafb.c */
  64. static inline unsigned int chan_to_field(unsigned int chan, struct fb_bitfield *bf)
  65. {
  66.         chan &= 0xffff;
  67.         chan >>= 16 - bf->length;
  68.         return chan << bf->offset;
  69. }


  70. static int s3c_lcdfb_setcolreg(unsigned int regno, unsigned int red,
  71.                              unsigned int green, unsigned int blue,
  72.                              unsigned int transp, struct fb_info *info)
  73. {
  74.         unsigned int val;
  75.        
  76.         if (regno > 16)
  77.                 return 1;

  78.         /* 用red,green,blue三原色构造出val */
  79.         val  = chan_to_field(red,        &info->var.red);
  80.         val |= chan_to_field(green, &info->var.green);
  81.         val |= chan_to_field(blue,        &info->var.blue);
  82.        
  83.         //((u32 *)(info->pseudo_palette))[regno] = val;
  84.         pseudo_palette[regno] = val;
  85.         return 0;
  86. }

  87. static int lcd_init(void)
  88. {
  89.         /*分配fb_info*/
  90.         lcd = framebuffer_alloc(0,NULL);
  91.        
  92.         /*设置fb_info*/
  93.         /*设置固定参数*/
  94.         strcpy(lcd->fix.id,"mini_lcd");
  95.         lcd->fix.smem_len = 320 * 240 * 32 / 8 ;/*mini2440:24位每一个像数,lcd控制器只能发32位单位字节*/
  96.         lcd->fix.type     = FB_TYPE_PACKED_PIXELS;/*支持大部分LCD*/
  97.         lcd->fix.visual   = FB_VISUAL_TRUECOLOR;/*TFT:真彩色*/
  98.         lcd->fix.line_length = 240 * 4;/*in字节320->240*/
  99.        
  100.         /*设置可变参数*/
  101.         lcd->var.xres           = 240;//320->240
  102.         lcd->var.yres                = 320;//240->320
  103.         lcd->var.xres_virtual   =  240;/*为了简便设置和真实坐标一样320->240*/
  104.         lcd->var.yres_virtual   =  320;//240->320
  105.         lcd->var.bits_per_pixel =  32;/*lcd控制器只能发32位*/
  106.        
  107.         /*RGB:888*/
  108.         lcd->var.red.offset     = 16;
  109.         lcd->var.red.length     = 8;
  110.        
  111.         lcd->var.green.offset   = 8;
  112.         lcd->var.green.length   = 8;
  113.        
  114.         lcd->var.blue.offset    = 0;
  115.         lcd->var.blue.length    = 8;

  116.         lcd->var.activate       = FB_ACTIVATE_NOW;

  117.         /*设置操作函数*/
  118.         lcd->fbops              = &s3c_lcdfb_ops;
  119.        
  120.         /*其他设置*/
  121.         lcd->pseudo_palette     = pseudo_palette;
  122.         lcd->screen_size        = 240 * 320 * 32 / 8;

  123.         /*硬件相关操作*/
  124.         /*根据LCD手册设置控制器,VCK的频率*/
  125.        
  126.         //lcd->fix.smem_start = XXX;
  127.         /*设置GPIO用于LCD*/
  128.         gpbcon = ioremap(0x56000010, 8);
  129.         gpbdat = gpbcon+1;
  130.         gpccon = ioremap(0x56000020, 4);
  131.         gpdcon = ioremap(0x56000030, 4);
  132.         gpgcon = ioremap(0x56000060, 4);

  133.     *gpccon  = 0xaaaaaaaa;   /* GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND */
  134.         *gpdcon  = 0xaaaaaaaa;   /* GPIO管脚用于VD[23:8] */
  135.        
  136.         *gpgcon |= (3<<8); /* GPG4用作LCD_PWREN */
  137.        
  138.         /*映射LCD控制器*/
  139.         lcd_pres = ioremap(0x4D000000, sizeof(struct lcd_regs));
  140.        
  141.         /*
  142.          * CLKVAL [17:8] VCLK = HCLK / [(CLKVAL+1) x 2]=7.1=100/6+1   
  143.          * PNRMODE [6:5] Select the display mode:11 = TFT LCD panel
  144.          * BPPMODE [4:1] 0B1101 :24bpp
  145.          * ENVID [0]=0:先不使能
  146.          */
  147.         lcd_pres->lcdcon1 |= (8<<8) | (3<<5) |(0x0d<<1);

  148.         /*
  149.          * VBPD [31:24]:上黑框=8
  150.          * LINEVAL [23:14]:320-1=319
  151.          * VFPD [13:6]下黑框=6-1=5
  152.          * VSPW [5:0]:=8
  153.          */
  154.         lcd_pres->lcdcon2 |=(8<<24) | (319<<14) | (5<<6) | (8<<0) ;//239->319,1->8,1->8
  155.         /*参考手册
  156.          * HBPD [25:19]
  157.          * HOZVAL [18:8]:239
  158.          * HFPD [7:0] HBPD+HFPD =31
  159.          */
  160.          lcd_pres->lcdcon3 |=(15<<19) | (239<<8) | (16<<0);//319->239
  161.         /*HSPW=0*/
  162.         lcd_pres->lcdcon4  = (5<<0);
  163.         /*
  164.          * NVVCLK [10]=1 在VCLk上升沿取数据
  165.          * INVVLINE [9]=1 HSYNC反转
  166.          *INVVFRAME [8]=1vsync反转,其余为默认值0
  167.          */
  168.          lcd_pres->lcdcon5 = (1<<10) | (1<<9)|(1<<8)|(1<<6)|(0<<0);
  169.        
  170.         /*分配framebuffer,并把显存虚拟地址地址告诉LCD控制器*/
  171.         lcd->screen_base = dma_alloc_writecombine(NULL,lcd->fix.smem_len,&lcd->fix.smem_start,GFP_KERNEL) ;
  172.        
  173.         lcd_pres->lcdsaddr1  = (lcd->fix.smem_start >> 1) & ~(3<<30);
  174.         lcd_pres->lcdsaddr2  = ((lcd->fix.smem_start + lcd->fix.smem_len) >> 1) & 0x1fffff;
  175.         lcd_pres->lcdsaddr3  = (320*32/16);  /* 一行的长度(单位: 2字节)240->320 */
  176.        
  177.         /*启动LCD,使能输出*/
  178.         lcd_pres->lcdcon1    |= (1<<0);
  179.         /*
  180.          * Enable PWREN
  181.          */
  182.         lcd_pres->lcdcon5    |= (1<<3);
  183.         /*注册*/
  184.         register_framebuffer(lcd);
  185.        
  186.         return 0;
  187. }
  188. static void lcd_exit(void)
  189. {
  190.         framebuffer_release(lcd);
  191.         lcd_pres->lcdcon1    &= ~(1<<0);
  192.         lcd_pres->lcdcon5    &= ~(1<<3);
  193.         unregister_framebuffer(lcd);
  194.         iounmap(gpbcon);
  195.         iounmap(gpccon);
  196.         iounmap(gpdcon);
  197.         iounmap(gpgcon);
  198.         iounmap(lcd_pres);
  199.         dma_free_writecombine(NULL,lcd->fix.smem_len, lcd->screen_base,lcd->fix.smem_start);
  200. }
  201. module_init(lcd_init);
  202. module_exit(lcd_exit);
  203. MODULE_LICENSE("GPL");
复制代码


内核版本是3.4.2
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.100ask.org/bbs/forum. ... id=10914&extra=
回复 支持 反对

使用道具 举报

1

主题

2

帖子

25

积分

新手上路

Rank: 1

积分
25
 楼主| 发表于 2014-5-16 12:10:50 | 显示全部楼层

谢谢!我弄了好几天了,终于解决了。
回复 支持 反对

使用道具 举报

3

主题

15

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2018-1-19 17:21:20 | 显示全部楼层
有X35裸机的代码吗,在我这也是没有效果
回复 支持 反对

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2018-10-19 00:42 , Processed in 0.386836 second(s), 19 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表