2010年10月31日 星期日

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

上一篇介紹了 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 將會在下篇文章講解。

2010年10月30日 星期六

撰寫程式來讓 PS3 顯示 BMP 圖 (FB 篇)。

這次 Shady 要告知如何撰寫有關在 PS3 上顯示 BMP 圖片,
而要達到此目的,就有必要知道 BMP 儲存格式和 PS3 的螢幕操控、顯示等,
所以 Shady 會將 PS3 的螢幕操控、顯示告知大家,
但 BMP 儲存格式則要請各位自己去 Google ,故在這 Shady 要說聲抱歉了。

首先要先講解 PS3 螢幕上的顯示,示意如下:
當中的白色部份為顯示區,而灰色為 Margin 區(不作顯示之區域),
Margin 區有分為上下兩個垂直 Margin 和左右兩個水平 Margin ,共四個。
若有照著 Shady 之前的 YDL 瘦身文章來調整解析度,
則 Margin 區是沒有出現的,也就是說整個畫面都是顯示區。

由於畫面的顯示是由多條水平掃描線構成,
而每條掃描線又由多個 Pixel 構成,最後每一 Pixel 則是由 4Bytes 構成,
而每個顏色占用 1Byte,其構成方式,按照順序為:
其中的白色應該是 Alpha 值,但目前好像沒有作用,
其餘為三原色:紅、綠、藍。

最後要說的是整個畫面是對應到之前 YDL 瘦身文章中的 ps3fb=8M,
也就是說在主記憶體區塊中有個 8MBytes 是屬於畫面顯示用,
而此區塊稱為 Frame Buffer,簡稱 FB,
且 8MBytes 則可存放二張 720p 畫面,
所以接下來就是要操控此記憶體區域來改變畫面成你想要的內容。

下一篇文章將介紹一些函式,
它們是用來取得畫面控制權、畫面資訊等。

2010年10月12日 星期二

啟用 libfreevec 來替 PS3 增加些效能吧!

什麼是 libfreevec 呢?

它是一個利用 PowerPC 的 VMX 單元為主的 Linux 的 glibc 替代方案,
而所謂的 VMX 指的是 PowerPC CPU 系列的 SIMD 單元,
以 VMX 的 register 而言有 128 bits 的寬度,
因為它可以用一指令同時命令 16 個 char、8 個 short、 4 個 int、4 個 float 等資料,
所以它可比平時的指令有更多的平行度,
也因此有一定的效能提升。

但它終究沒有完全代替 glibc,
不過它還是有不少有用的替代涵式,
如 memcpy、strcpy、strcpm 等,
光這些基本涵式就有不小的效能增長啦!

好啦!還沒安裝 libfreevec 的朋友,
就請跟著 Shady 的說明步驟前進吧!

1. 請以 root 的身分登入 YDL。
2. 在 YDL 的文字模式或虛擬終端機下輸入 yum install libfreevec 來安裝 libfreevec 。
3. 然後用 vi /etc/sysconfig/libfreevec 來開啟 libfreevec 檔案。
4. 再來按 A 鍵後將 ENABLE_FREEVEC=no 改成 ENABLE_FREEVEC=yes。
5. 最後按一下 Esc 鍵後輸入 :wq 來記錄檔案。
6. 登出 YDL 後再行登入就完成了。

雖然 libfreevec 可在 Cell 上執行,
但由於它是以 PowerPC 為準,
所以 Cell 中唯一有支援的核心只有 PPU 而已,
而且 PPU 比起以前的 PowerPC 有刪減和增加及更改的指令,
可剛好 libfreevec 用到的預先快取串流系列指令都以 nop (無操作指令)執行,
所以利用 libfreevec 的涵式前可能要自己撰寫預先提取的指令了...XD

之後 Shady 會有些文章針對 libfreevec 的最佳化,
主要是針對預先快取的部分,
而有興趣了解 libfreevec 原始碼的朋友可從此處下載SRPM檔,
如有SRPM使用的問題請參考"鳥哥的 Linux 私房菜"裡的文章。

最後在這裡預告下次的文章標題:
撰寫程式來讓 PS3 顯示 BMP 圖。