建设可以聊天的网站,网站seo最新优化方法,群辉怎么做网站,苏州网站seo优化在入手全志T113之后#xff0c;第一时间移植好了之前6ull平台的rootfs。但是在测试QT的过程中发现屏幕最右侧有一部分显示不正常#xff0c;经过初步推测应该是RGB行场同步时序有问题。本以为在设备树里面稍作修改之后就能OK#xff0c;但是居然前前后后一共花了至少三个星期…在入手全志T113之后第一时间移植好了之前6ull平台的rootfs。但是在测试QT的过程中发现屏幕最右侧有一部分显示不正常经过初步推测应该是RGB行场同步时序有问题。本以为在设备树里面稍作修改之后就能OK但是居然前前后后一共花了至少三个星期的时间。
这里就不给分析经过了因为是真的真的太漫长了搞得我头都大了。真的是要吐槽一下全志的代码
1.函数名字真的看得头疼
2.代码杂乱无章大量使用全局变量让分析各种没头绪。
然后在这里直接给出最终分析的结果
1.设备树里面timing除了width、height、lcd_x和lcd_y之外的参数全没有用上一开始不停的源码里面找这些参数在什么地方配置的最后发现特么的根本就没有地方使用过这些参数 2.width和height主要是用来计算dpi使用的我这里写的280最终计算出来的dpi大概是97左右windows标准的是96反正相差无几我也没有细调了lcd_x和lcd_y在原来的代码里主要是用来计算内核里面有一张图片的缩放使用的。
3.lcd timing寄存器里面的值是在uboot里面设置好之后在kernel里面直接拿来用的。
4.uboot里面的timing计算方式有问题应该是百问没有仔细阅读全志文档的原因造成的这也是使得屏幕显示向左平移了几十个像素的原因
5.我忘记我要说什么了…
接下来就说怎么处理吧:
1.首先按照全志的文档把设备树里面的timing改了
2.打开 drivers/video/fbdev/sunxi/disp2/disp/de/disp_lcd.c 然后找到 s32 disp_init_lcd(struct disp_bsp_init_para* para) 函数在前面加上一段代码
typedef struct
{volatile unsigned int Timing0;volatile unsigned int Timing1;volatile unsigned int Timing2;volatile unsigned int Timing3;
}RegTypeDef;static void set_lcd_timings(unsigned int dwLcdRegBase, struct disp_video_timings* pTimings)
{RegTypeDef* reg;unsigned int dwWidth, dwHeight;unsigned int dwHT, dwHBP;unsigned int dwVT, dwVBP;unsigned int dwHSPW, dwVSPW;reg (RegTypeDef*)(dwLcdRegBase 0x48);dwWidth pTimings-x_res;dwHSPW pTimings-hor_sync_time;dwHBP pTimings-hor_back_porch pTimings-hor_sync_time; //在官方文档里hbp hbp hspw然而在全志的代码里面又将hspw其减去所以在这里需要加回来dwHT pTimings-hor_total_time;dwHeight pTimings-y_res;;dwVSPW pTimings-ver_sync_time;dwVBP pTimings-ver_back_porch pTimings-ver_sync_time;dwVT pTimings-ver_total_time;reg-Timing0 ((dwWidth - 1) 16) | (dwHeight - 1);reg-Timing1 ((dwHT - 1) 16) | (dwHBP - 1);reg-Timing2 (((dwVT - 1) * 2) 16) | (dwVBP - 1);reg-Timing3 ((dwHSPW - 1) 16) | (dwVSPW - 1);printk(width: %d, hspw: %d, hbp: %d, ht: %d\n, dwWidth, dwHSPW, dwHBP, dwHT);printk(height: %d, vspw: %d, vbp: %d, vt: %d\n, dwHeight, dwVSPW, dwVBP, dwVT);
}然后在 s32 disp_init_lcd(struct disp_bsp_init_para* para) 函数的 disp_lcd_init(lcd, lcd-disp); 后面加上
set_lcd_timings(para-reg_base[DISP_MOD_LCD0], lcd-timings);3.最后编译烧写进去之后重启就搞定了…
4.uboot我就懒得修改了凑合用吧
本文转载自https://bbs.aw-ol.com/topic/3533/