s3c2440液晶屏驱动 (内核自带) linux-4.1.24

2023-09-01  

自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c


另一部分在 /drivers/video/fbdev/s3c2410fb.c


先打开调试功能,这样内核在启动的时候,就可以输出这些信息,或者使用 dmesg 查看到这些信息。当然,你配置内核 make menuconfig 也可以打开,但是太麻烦了,不如这样。


1 #define CONFIG_FB_S3C2410_DEBUG

2    #define dprintk(msg...)

3    do {

4        if (debug)

5           printk(msg);

6    } while (0)

使用新内核启动,出现了调试信息,检查是否有错。


lcdcon[1] = 0x00000778

lcdcon[2] = 0x0743c183

lcdcon[3] = 0x0039df13

lcdcon[4] = 0x00000003

lcdcon[5] = 0x00000b01

LCDSADDR1 = 0x19d20000

LCDSADDR2 = 0x19d3fe00

LCDSADDR3 = 0x000001e0


检查时钟设置是否正确 0x00000778>>8 输出 8 ,应该设为 4

s3c2410fb_activate_var()

clkdiv = DIV_ROUND_UP(s3c2410fb_calc_pixclk(fbi, var->pixclock), 2);

配置是按 HCLK 60M 算的 .pixclock = 166667, /* HCLK 60 MHz, divisor 10 */

s3c2410fb_calc_pixclk() 这个函数里面进行计算。

unsigned long clk = fbi->clk_rate;

unsigned long long div;


/* pixclk is in picoseconds, our clock is in Hz

*

* Hz -> picoseconds is / 10^-12

*/


div = (unsigned long long)clk * pixclk;

div >>= 12; /* div / 2^12 */

do_div(div, 625 * 625UL * 625); /* div / 5^12 */


添加打印出 clk 检查是多少 , 果然是 100M

dprintk("pixclk %ld, divisor is %ld clk %dn", pixclk, (long)div, clk);


return div;


((100000000 * 166667)>>12) / (5**12) = 16


((100000000 * 100000)>>12) / (5**12) = 10


所以 设为 .pixclock = 100000,// HCLK 100M


mach-smdk2440.c 中的修改地方


 1 /* LCD driver info */

 2 

 3 static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {

 4 

 5     .lcdcon5    = S3C2410_LCDCON5_FRM565 |

 6               S3C2410_LCDCON5_INVVLINE |

 7               S3C2410_LCDCON5_INVVFRAME |

 8               S3C2410_LCDCON5_HWSWP,

 9 

10     .type        = S3C2410_LCDCON1_TFT,

11 

12     .width        = 480,

13     .height        = 272,

14 

15     .pixclock    = 100000, /* HCLK 100 MHz, divisor 10 */

16     .xres        = 480,

17     .yres        = 272,

18     .bpp        = 16,

19     .left_margin    = 2,

20     .right_margin    = 2,

21     .hsync_len    = 41,

22     .upper_margin    = 2,

23     .lower_margin    = 2,

24     .vsync_len    = 10,

25 };

26 

27 static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {

28     .displays    = &smdk2440_lcd_cfg,

29     .num_displays    = 1,

30     .default_display = 0,

31 

32     /* currently setup by downloader */

33     .gpccon        = 0xaaaaaaaa,

34     .gpccon_mask    = 0xffffffff,

35 

36     

37     .gpdcon        = 0xaaaaaaaa,

38     .gpdcon_mask    = 0xffffffff,

39 

40     //.lpcsel        = ((0xCE6) & ~7) | 1<<4,

41 };


因为在里面,不能配置 背光 和 POWER EN 。所以还需要在 s3c2410fb.c 中配置


s3c2410fb_init_registers()


 1 modify_gpio(S3C2410_GPCUP,  mach_info->gpcup,  mach_info->gpcup_mask);

 2 modify_gpio(S3C2410_GPCCON, mach_info->gpccon, mach_info->gpccon_mask);

 3 modify_gpio(S3C2410_GPDUP,  mach_info->gpdup,  mach_info->gpdup_mask);

 4 modify_gpio(S3C2410_GPDCON, mach_info->gpdcon, mach_info->gpdcon_mask);

 5 

 6 //背光控制为 GPB0 配置 为输出引脚

 7 writel(1<<0, S3C2410_GPBCON);

 8 //默认打开背光

 9 writel(1<<0, S3C2410_GPBDAT);

10 //配置 GPG4 为 LCD POWER EN

11 writel(3<<8, S3C2410_GPGCON);


参数都是逐个带进去算出来的,这个要看你的液晶屏 datasheet 接线来确定。


最后是试机图:


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