微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 问个framebuffer相关的问题

问个framebuffer相关的问题

时间:10-02 整理:3721RD 点击:
1.请问lk到kernel层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");

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top