上一篇介紹了 PS3 的畫面 (Frame) 是通過 8MBytes 的改變而改變的,
而這個記憶體區塊被稱為 Frame Buffer ,簡稱 FB 。
所以接下來要介紹 FB 的相關資訊,
以至於大家能在 PS3 上填充自己想要的畫面。
首先 FB 在 PS3 的 Linux 上是一 IO (Input/Output) 裝置,
而 Linux 上的 IO 裝置又有"字元裝置"和"區塊裝置"兩種,
"字元裝置"如虛擬終端機就是個字元裝置,
因為它只能於一時間內接收一字元資料,
而"區塊裝置"顧名思義就是一次能接收一個固定大小之資料。
FB 屬於後者,所以他必須填滿整個 Frame 才能發送出去。
接著要說明的是 Linux 上要如何存取這些 IO 裝置。
由於 Linux 都將 IO 裝置當作檔案來處理,
所以這些 IO 裝置檔案都放置於 /dev 底下,
在文字模式下輸入 ls /dev 就會有一堆檔案出現,
其中 FB 之檔案名稱為 fb0。
既然知道 IO 裝置是個檔案,
那要將其用 C 語言開啟就不用想太多了,
下面就是用來開啟 fb0 的檔案描述子的函式:
#include< fcntl.h/ >
#include< sys/types.h >
#include< sys/stat.h >
int open(cont char *path, int oflags);
此函式只要將第一參數填入 "/dev/fb0" 包含雙引號,
而第二參數則填 O_RDONLY (唯讀)、O_WRONLY (唯寫)、O_RDWR (讀寫) 三者之一,
所以 open 可填寫如下:
int fd;
fd = open("/dev/fb0", O_RDWR);
這是以讀寫模式開啟 fb0 的檔案描述子之例子,
而檔案描述子經 open 函式回傳後,被存放在 fd 變數中。
想知道 open 函式的其餘較詳細資訊請使用 man open 指令於終端機下輸入。
關閉 fb0 檔案描述子可透過 close 函式:
#include< unistd.h >
int close(int fildes);
當中的 fildes 參數便是填入檔案描述子。
再來要介紹 ioctl 函式,
此函式可用來取得 FB 資訊、FB 控制權和 FB 的操作。
ioctl 函式入下:
#include< unistd.h >
int ioctl(int fildes, int cmd, ...);
ioctl 會針對檔案描述子 fildes,執行 cmd 的功能。
它可能還有第三個參數,這個與裝置的功能有關。
至於如何詳細使用 ioctl 函式來取得FB 資訊、FB 控制權和 FB 的操作,
Shady 將會在下篇文章講解。
沒有留言:
張貼留言