问个framebuffer相关的问题
2。另外framebuffer的数据是即写即显示还是什么情况 我在lk往framebuffer写数据时 每写一个字节都延时很久 但是看到的现象还是直接刷新 这是什么情况?
LK的地址是RAM的最高地址减去FB的大小,kernel的也是这样计算的。
LK是单核在跑,又没有抢占、调度的情况,所以你不管延时多久都没有用,因为程序只有在你写buffer完成后才会继续往下进行,而你在写buffer的时候显示模块还没开始工作,所以你写的内容不会马上被更新在屏幕上。
谢谢哥们
1.现在的现象是这样 我什么都不做修改 lk跳到kernel层 画面1/3为全黑 2/3为全白 尝试更换临时buffer的地址即tempfbaddr 画面正常 这个就好像kernel层的framebuffer地址和tempfbaddr有关联 似乎tempfbaddr是kernel层framebuffer的一部分 这样就能解释这个现象 所以我猜想kernel层framebuffer基地址发生变化
2.也就是说framebuffer是整个buffer写完数据才显示的吗? 那我的延时跑到哪去了 就算是写完显示 我也没发现整个过程有延时 是直接忽略延时吗 应该不会吧?
LK和kernel的buffer基地址和size不同的时候它会打日志的
warningwarningwarningwarningwarningwarningwarning
kernel的FB和BL的FB不一样,让你注意。
有这些日志。
另外,LK和kernel的基地址都有log的。
第二个疑问我没看明白。这么跟你说吧,如果是RGB和MIPI VIDEO 的屏,buffer的数据以60hz往屏上去显示的。显示模块正在工作,你去改变FB的内容,它会马上更新在屏幕上。显示模块没有工作,FB的内容显然不会更新。
如果是CPU和MIPI COMMAND,刷屏是有一个主动的调用的,所以你改变FB的内容后,要主动的去刷屏,FB的内容才会更新在屏幕上。
关于2 我的意思是不管你怎么跑 我的延时都在那里 假设我每个字节都延时1s 那么整个framebuffer的数据我可能会延长一个很大的时间 但是我开机后并没有发现这个时间 他还是直接刷新的 那么我的延时跑到哪去了? 另外感谢哥们给我科普哈
你确定显示的东西,就是你刷上去的东西吗?
那把你的代码贴出来,我看看。
很有可能你那段代码根本没跑,不然延时1s就是1s。在lk肯定是这样。
跑肯定是跑了 lk层调不了一些kernel层的延时函数 我写了个简单的延时
int i,j;
for (i=0;i<0x0fffffff;i++)
for (j=0;j<0x0fffffff;j++);
能贴个完整点的吗?这样也看不出问题
lk都是一条道走到低,调了就肯定会延时的
else if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "180", 2))
{
unsigned short *s;
unsigned short *d;
int ii,jj;
unsigned int width = CFG_DISPLAY_WIDTH;
unsigned int height = CFG_DISPLAY_HEIGHT;
mt_logo_decompress((void*)inaddr, fb_tempaddr, logolen, fb_size);
s = fb_tempaddr + (2 * ((height - 1) * width));
d = fb_addr;
for (j=0;j < height; j++){
{
for (k=0;k < width; k++)
{
//if ( j < height/2 ) continue;
//else
*(d+k) = *(s+width-k);
for (ii=0;ii<0x0fffffff;ii++)
for (jj=0;jj<0x0fffffff;jj++);
}
//memcpy(d, s, width * 2);
d += ALIGN_TO(width, 32);
s -= width;
}
}
}
这边没板子调不了,不然我也写成你这样试一试。
for (ii=0;ii<0x0fffffff;ii++)
for (jj=0;jj<0x0fffffff;jj++);
这样写也不知道它到底能延时多少。
你能打log的话 看看这一句 [PROFILE] ------- show logo takes 20 ms --------
我这里只需要20ms
或者是看
show_logo, in_addr=0x9f4000a4, fb_addr=0x9f800000, logolen=13501, ticks=2770
ticks=2779
两个ticks的差值就是刷buffer用的时间。
哥们 很感谢啊 另外问一下rdma的部分是在哪里 我一直没找到这块内容
ddp_rdma.c
代码里面就是dsi_init时去配置path的时候 配置的rmda, ovl,bls等模块。
其实你顺着 mtk_fb 的probe一直看下去就行,流程都在这个环节里。
其实我主要是想看下他是如何刷新数据到屏上的
很奇怪 这句被屏蔽了
//screen_update_task = kthread_create(
// screen_update_kthread, NULL, "screen_update_kthread");
