AM335X-Linux-解决VGA显示字体模糊问题
在am335x的linux显示器驱动中调节VGA显示一般是调节 drivers/video/da8xx-fb.c中的
static struct da8xx_panel known_lcd_panels[] = {
…
[2] = {
.name = "TFC_S9700RTWV35TR_01B",
.width = 800,
.height = 600,
.hfp = 128,
.hbp = 88,
.hsw = 40,
.vfp = 4,
.vbp = 23,
.vsw = 1,
.pxl_clk = (800+210+46)*(600+28)*60,
.invert_pxl_clk = 1,
},
…
}
但是有些VGA显示器最终显示效果会有一些竖条区域显示的文字稍模糊,通过调节上面的参数总是去不掉。用示波器量VGA信号发现VGA的场同步和行同步信号与PC机的信号不一样,如图所示。
图1 PC机行同步信号
图2 PC机场同步信号
图3 AM335X输出行同步(上)场同步(下)
图4 AM335X输出行同步(下)场同步(上)
从对比中可以看出,PC机的场同步与行同步信号空闲时为低电平,而AM335X输出的信号中场同步与行同步空闲期的电平为高电平,所以我们应该把这个信号反转过来, 从上面的代码中看到只有pixl信号的反转,查看am335x的手册后发现am335x中是有场(Vsync)、行(Hsync)同步信号反转寄存器设置的。分别为RASTER_TIMING_2 寄存器的ivs和ihs位。
在代码中的lcd_init函数中增加红色字体部分设置这两个位:
static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg, struct da8xx_panel *panel)
{
u32 bpp;
int ret = 0;
lcd_reset(par);
/* Calculate the divider */
lcd_calc_clk_divider(par);
if (panel->invert_pxl_clk)
lcdc_write((lcdc_read(LCD_RASTER_TIMING_2_REG) |
LCD_INVERT_PIXEL_CLOCK), LCD_RASTER_TIMING_2_REG);
else
lcdc_write((lcdc_read(LCD_RASTER_TIMING_2_REG) &
~LCD_INVERT_PIXEL_CLOCK), LCD_RASTER_TIMING_2_REG);
lcdc_write((lcdc_read(LCD_RASTER_TIMING_2_REG) |
LCD_INVERT_LINE_CLOCK), LCD_RASTER_TIMING_2_REG);
lcdc_write((lcdc_read(LCD_RASTER_TIMING_2_REG) |
LCD_INVERT_FRAME_CLOCK), LCD_RASTER_TIMING_2_REG);
/* Configure the DMA burst size and fifo threshold. */
ret = lcd_cfg_dma(cfg->dma_burst_sz, cfg->fifo_th);
if (ret < 0)
return ret;
…
重新编译内核,发现模糊消失了。问题解决。
维芯科weathink AM335x核心板:https://www.weathink.cn/products/hexinban/2.html