2010年11月1日 星期一

撰寫程式來讓 PS3 顯示 BMP 圖 (函式篇,下)。

在上篇文章的最後,Shady 介紹了 ioctl 函式,
它會視裝置而有不同用途的第三個參數,
接下來 Shady 將解釋如何使用 ioctl 控制 FB。

首先 Shady 先略提 Linux Frame Buffer I/O,
然後接著介紹  PS3 Frame Buffer I/O,它可以說是很底層的控制了。

如果有大略觀看過 linux/fb.h 標頭檔,
將會看到很多有關 Linux Frame Buffer 之內容,
當中會有可成為 ioctl 的第二參數 cmd 的要求碼,
還有 bit mask,它是用來過濾 ioctl 的輸出資料用的。
在這 Shady 只介紹一個重要的要求碼 FBIOGET_VBLANK,
因為它會告訴我們有關系統的掃描操作,
如果 ioctl 使用此要求碼會回傳一個 fb_vblank 結構,
fb_vblank 結構的內容與解釋如下:

○ unsigned int flags:用來辨識掃描狀態。
○ unsigned int count:自啟動來的 traces 數量。
○ unsigned int vcount:目前垂直掃描位置。
○ unsigned int hcount:目前水平掃描位置。
○ unsigned int reserved[4]:保留給以後之功能使用。

以上的 fb_vblank 的內容中我們會用 flags 來辨識是否有支援垂直同步信號,
所以只要將 FB_VBLANK_HAVE_VSYNC 此一 bit mask 與 flags 作 AND 運算就行了。
使用 ioctl 實作的例子入下:

#include< linux/fb.h >
struct fb_vblank date;/*宣告 fb_vblank 結構變數 date*/
ioctl(fd, FBIOGET_VBLANK, &date);/*取得 Linux FB 之資訊*/
if(!(date.flags & FB_VBLANK_HAVE_VSYNC))
      /*做無垂直同步的處理*/

至此 Linux Frame Buffer 就到此打住,
因為以 Shady 對 YDL 的設置是 8MB 的 FB,
這樣的設置對 720p 的解析度而言,會有兩個 FB,
又垂直同步對多個 FB 較重要,所以 Shady 只介紹到這,
想多了解的朋友可觀看 linux/fb.h 這一標頭檔。

再來就是 PS3 Frame Buffer 了。
首先是 Shady 感覺較重要的要求碼,它們被定義在 asm/ps3fb.h 中:

●PS3FB_IOCTL_SCREENINFO:用來獲取 FB 的環境資訊。
●FBIO_WAITFORVSYNC:停止 FB 輸出動作且等待垂直同步信號。
●PS3FB_IOSTL_FSEL:發送 FB 的操作,等於垂直同步的發送。
●PS3FB_IOCTL_ON:開啟讓使用者程式操控 FB 的權利。
●PS3FB_IOCTL_OFF:關閉使用者程式操控 FB 的權利。

以上的要求碼 Shady 只會再介紹第一個,
剩下的四個會在"撰寫程式來讓 PS3 顯示 BMP 圖 (程式篇)。"中解釋。
PS3FB_IOCTL_SCREENINFO 於 ioctl 使用後,
會回傳 ps3fb_ioctl_res 的結構,其內容為:

○unsigned int xres:水平解析度數目。
○unsigned int yres:垂直解析度數目。
○unsigned int xoff:水平 Margin數目。
○unsigned int yoff:垂直 Margin數目。
○unsigned int num_frames:FB 的數量。

至於如何利用這些要求碼,
Shady 將會在"撰寫程式來讓 PS3 顯示 BMP 圖 (程式篇)。"解說。

沒有留言:

張貼留言