Linux framebuffer測試程式

2022-09-07 01:39:09 字數 3776 閱讀 2128

linux framebuffer的框架非常簡單, 對於應用程式就是操作一塊記憶體(俗稱幀快取), 當然也有可能是雙快取, 一般用於高幀率場景, 一塊幀在填充資料時, 另一塊在顯示, 接著對調過來,

那通過設定**告知驅動層讀取哪塊幀資料呢? 答案是用vinfo.xoffset, vinfo.yoffset

需要注意的是, 無論用write()、還是mmap()後直接操作記憶體都只是填充記憶體而已, 並不代表能夠立馬顯示, 這得看驅動, 如果驅動實現了自重新整理(不斷從幀快取拿資料刷到lcd上), 那填充資料到幀快取就會立馬顯示出來,

如果驅動沒有實現,那應用程式需要主動的呼叫 ioctl(fp, fbiopan_display, &vinfo);, 告知驅動可以刷資料了, 如果這都沒顯示出來, 估計驅動沒實現fbiopan_display功能。

示例**:(驅動實現自重新整理, 應用依次顯示黃、藍、紅,最後畫線)

#include #include 

#include

#include

#include

#include

#include

#define red 0xf800

#define yellow 0xffe0

#define blue 0x001f

#define white 0xffff

#define black 0x0000

void fill_color16(short *fb_addr, short bit_map, int

psize)

}int

main ()

if(ioctl(fp, fbioget_fscreeninfo, &finfo))

if(ioctl(fp, fbioget_vscreeninfo, &vinfo))

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8

; printf(

"the phy mem = 0x%x, total size = %d(byte)\n

", finfo.smem_start, finfo.smem_len);

printf(

"xres = %d, yres = %d, bits_per_pixel = %d\n

", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);

printf(

"so the screensize = %d(byte), using %d frame\n

", screensize, finfo.smem_len/screensize);

printf(

"vinfo.xoffset = %d, vinfo.yoffset = %d\n

", vinfo.xoffset, vinfo.yoffset);

printf(

"vinfo.vmode is :%d\n

", vinfo.vmode);

printf(

"finfo.ypanstep is :%d\n

", finfo.ypanstep);

printf(

"vinfo.red.offset=0x%x\n

", vinfo.red.offset);

printf(

"vinfo.red.length=0x%x\n

", vinfo.red.length);

printf(

"vinfo.green.offset=0x%x\n

", vinfo.green.offset);

printf(

"vinfo.green.length=0x%x\n

", vinfo.green.length);

printf(

"vinfo.blue.offset=0x%x\n

", vinfo.blue.offset);

printf(

"vinfo.blue.length=0x%x\n

", vinfo.blue.length);

printf(

"vinfo.transp.offset=0x%x\n

", vinfo.transp.offset);

printf(

"vinfo.transp.length=0x%x\n

", vinfo.transp.length);

fbp =(char *)mmap(0, screensize, prot_read | prot_write, map_shared, fp,0

);

if ((int)fbp == -1

)

printf(

"get virt mem = %p\n

", fbp);

pix_size = vinfo.xres *vinfo.yres;

/*using first frame, for fbiopan_display

* 當重新整理需要呼叫fbiopan_display, 要告知驅動刷哪塊幀, 用到下面兩個引數

* 如果使用第二幀buffer -> vinfo.xoffset = 0; vinfo.yoffset = vinfo.yres;

*/vinfo.xoffset = 0

; vinfo.yoffset = 0

;

/*show color loop

*/while(num--)

#if 1

/*這是你想畫的點的位置座標,(0,0)點在螢幕左上角

*/x = 10

; y = 10

; location = x * (vinfo.bits_per_pixel / 8) + y *finfo.line_length;

test_fbp = fbp +location;

printf(

"draw line.......\n");

for(i = 0; i < (vinfo.xres - x); i++)

*test_fbp++ = i+30

;

//ioctl(fp, fbiopan_display, &vinfo);

#endif

munmap(fbp, screensize);

/*解除對映

*/close (fp);

return0;

}

#include #include 

#include

#include

#include

#include

#include

#define red 0xf800

#define yellow 0xffe0

#define blue 0x001f

#define white 0xffff

#define black 0x0000

intmain ()

if(ioctl(fp, fbioget_vscreeninfo, &vinfo))

pix_size = vinfo.xres *vinfo.yres;

color1 = 0

; color2 = 0xf8

;

for(i=0; i)

close (fp);

return0;

}

C 實現的Miller Rabin素性測試程式

miller rabin素性測試演算法是概率演算法,不是確定演算法。然而測試的計算速度快,比較有效,被廣泛使用。另外乙個值得介紹的演算法是aks演算法,是三位印度人發明的,aks是他們的姓氏首字母。ask演算法是確定演算法,其時間複雜度相當於多項式的,屬於可計算的演算法。來自sanfoundry的c...

Spring Junit4 測試Web應用程式

1 環境搭建很簡單,只需要將這這兩個jar包 org.springframework.test 3.0.3.release.jar和junit 4.8.1.jar 和spring的公用包以及其它的jar包一起加入到專案中即可。2 使用時,編寫的測試類,需要繼承類abstractjunit4sprin...

python 多執行緒和協程速率測試對比

多執行緒和協程都屬於io密集型,我通過以下用例測試多執行緒和協程的實際速率對比。例項 通過socket客戶端以多執行緒併發模式請求不同伺服器端 這裡伺服器端分2種寫法 第一種伺服器通過協程實現,第二種伺服器通過多執行緒實現 的訪問速率 第一種伺服器端寫法 通過gevent實現 第二種伺服器端寫法 通...