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.jpg

图1 PC机行同步信号

图2.jpg

图2 PC机场同步信号

图3.jpg

图3 AM335X输出行同步(上)场同步(下)

图4.jpg

图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

 


Tags: Array