第四章 輸入端與輸出端模組
4.1 系統初始化設定
在應用程式開始執行之前,必須要先對整個系統環境進行初始化的設定,讓管理板 子的 BSL 層能夠取得硬體上的相關資訊,並且讓 DSP 晶片能夠辨認出周圍所連接的晶 片裝置。而這部分會以輸入端的環境為例,探討輸入端模組的硬體資源在系統初始化的 流程設定,其中輸入端模組在硬體環境上主要分為兩部分,訊號的類比數位轉換晶片單 元 ( SAA7115 ) 以及 DSP 晶片上處理輸入訊號的 SVIP 單元。
在應用程式上所執行的主程式 tmMain( )是由 TSA ( Trimedia Software Architecture ) 定義的一個函式,其功能就相當於一般 C 語言中的 main( ) 函式,但附加了許多系統上 功能函式的連結。因此當應用程式在執行 tmMain( ) 函式,但尚未開始執行主函式裡的 內容之前,會先連結到 tmMain( )函式裡,並藉由定義於 tmMain( )上的系統功能函式,
對整個 DSP 的環境做初始化的動作。而 tmMain( )的函式內容如圖 4.1 所示,tmMain( ) 實際上是執行一個叫 root()的函式,而 root()函式裡的 tmMain_BODY()則會開始呼叫相 關的函式來初始化 DSP 上的環境。其中 DSP 環境的初始化,主要包含了作業系統 psos 以及 DSP 外部所連結的晶片兩部分。首先在作業系統 psos 上的初始化內容,是對計時 器( timer )以及錯誤處理器( error handler ) 做一些初始值設定,兩者都是藉由 psos 所提 供的系統函式來執行。而在初始化 DSP 外部連結晶片的部分,也是本節所要探討的重 點,在執行的程序上,當 tmMain_BODY( )函式的連結到 tmMain_START( )函式時,在 tmMain_START( )函式裡則會進一步連結到 BSL 層管理初始化的函式 tmbslMgrInit( ),
36
而此 tmbslMgrInit( ) 函式會判斷 BSL 層的內容設定是否初始化過,若有,會回傳一個 確認值,若無則開始初始化的動作。
由於 BSL 是用來連結 DSP 與周圍的硬體裝置,所以 BSL 內部具備了一套管理的核 心架構,稱為 tmbslCore。BSL 核心提供了介面函式來初始化硬體裝置、設定或取得系 統的資訊(例如記憶體分配以及記憶體的實體和虛擬位址)、軟硬體的模組資訊、中央處 理器的資料快取控制等等功能,整體的 BSL 系統架構如圖 4.2 所示。
由 4.2 圖所示的系統架構可發現,在整個架構的最上層為 BSL 介面函式,而介面函 tmbslCore 介面函式
tmbslCore 初始化函式
Operating system BSP/OAL services
Hardware devices tmbslBoard 函式
tmbslMgrActivateBoard()
#define tmMain()
… void root (void)
{ tmMain_BODY(); }
#define tmMain_BODY() ( tmMain_OsSpecificStart(), tmMain_START(), tmMain_Root(), tmMain_EXIT (0) )
37
式大致上可分為兩部分,一部分提供給上層軟體模組操作,在這裡面包含了 tmbslCore 的初始化函式以及主函式,另一部分的函式則是提供給硬體平台註冊使用,稱為 tmbslCore 板子函式。所以當 BSL 的上層呼叫了 tmbslCore 初始化函式,BSL 核心管理 便會開始執行一連串啟動硬體環境的動作。首先會藉由管理啟動硬體環境的函式 tmbslMgrActivateBoard( ),針對目前所使用的硬體環境啟動其相關的函式,同時這些被 啟動的硬體也會將自己的資料註冊給 tmbslCore 的板子函式,如同圖 4.2 中的第二層,
最終讓 BSL 的核心管理部分能夠掌握所有硬體環境的資料。
在 tmbslMgrActivateBoard( )函式啟動硬體環境的過程中,首先會檢查一個存放板子 目錄的陣列,陣列的資料內容如圖 4.3 所示。在此陣列結構中存放了各種不同型號的板 子 id,例如在我們測試環境上用到的 DVR Demo 板以及 PCI Lite Demo 板。其中板子的 id 同時也是用來啟動板子的函式指標,所以當 BSL 管理啟動板子的函式在逐一檢查陣 列中的 id 時,就會同時連結到該板子啟動函式,並判斷何者為目前所操作硬體環境,而 只有該硬體環境的啟動函式能夠順利運作執行。
在板子的啟動函式中會以下列的步驟,依序對板子做啟動的程序設定:
‐ 啟動(Activation)
在啟動的這個步驟中,會一併執行接下來的三個步驟偵測、初始化以及註冊,所以 在 tmbslBoardActivate( )函式裡,會去呼叫偵測、初始化以及註冊的相關函式。
‐ 偵測(Detection)
偵測時主要是在確認板子 id 是否與硬體符合、設定硬體的記憶體位址分配、並回傳 啟動硬體資訊的指標。
static compActivateFunc_t *ppBoardActivateList [] = { //其它硬體環境的板子 id
&tmbslMgrBoardActivateOfBoardId0x00081131, &tmbslMgrBoardActivateOfBoardId0x10001131, &tmbslMgrBoardActivateOfBoardId0x10011131_XTV, &tmbslMgrBoardActivateOfBoardId0x10011131,
&tmbslMgrBoardActivateOfBoardId0x10021131, // tmbslPnxDVRDemo //本硬體環境的板子 id
&tmbslMgrBoardActivateOfBoardId0x10041131, // tmbslPnxLiteDemo …...
};
圖 4.3 BoardActivateList[]資料陣列
38
‐ 初始化(Initialization)
初始化過程中會更新 BSL 的系統資訊以及記憶體的資料結構,包括把在偵測時所 設定的記憶體位址更新到系統的記憶體區塊上。
‐ 註冊(Register)
註冊則是把在前幾個步驟得到的資料結構存放到 BSL 的核心管理層上,包含了系 統資訊、記憶體使用區塊、硬體上的模組資源等資訊。
而在板子硬體單元的啟動順序上,首先會對 DSP 晶片 PNX1005 做初始化的動作,
接著再啟動 DSP 晶片周邊所連接的硬體單元,其中在處理輸入影像的類比數位轉換(A/D) 晶片部分,是藉由呼叫板子上處理影像的初始化函式 tmbslPnxLiteDemo_VideoInit()來啟
動( PnxLiteDemo為板子的名稱 ),同時在這個函式裡,會去辨認目前有哪些 A/D 的晶
片存在,表 1.列舉了在兩種硬體平台上所使用的 A/D 晶片型號,而在確認好晶片型號 之後,便將晶片的資料內容註冊到 BSL 的核心管理層,提供操作介面給 DSP。
表 4.1 板子與使用的 A/D 晶片
板子的類型 A/D 型號
PCI Lite Demo Board SAA7115、TDA19978 DVR Demo Board Techwell2864
註冊的流程如圖 4.4 所示,在 VideoInit( )的函式中會呼叫各晶片的註冊函式,而這 些註冊函式的主要目的就是向 tmbslCore 註冊自己的資料,註冊的方法是藉由 tmbslCore 上的註冊函式 tmbslCoreRegisterComponent(),將自己的資料結構位址以及函式指標等資 訊存放到 tmbslCore 的陣列裡面,此陣列即為圖 4.4 中 gBslInterfaceInfo [index],是專門 用來儲存這些 DSP 周邊硬體裝置的資訊。
圖 4.4 PCI Demo 板 A/D 晶片的註冊流程
tmbslCore
gBslInterfaceInfo[index]
SAA7115 TDA19978 tmbslPnxLiteDemo_VideoInit()
{
tmbslPnxLiteDemo_RegisterSAA7115();
……
tmbslPnxLiteDemo_RegisterTDA19978();
tmbslCoreRegisterComponent()
//註冊到 BSL 核心的陣列中 //註冊函式
39
當 tmbslCore 取得這些硬體的資料結構以及函式位址資訊後,整個 BSL 初始化的步 驟就算是告一段落,接下來上層的軟體模組若有需要硬體的相關資訊,就可以直接到 tmbslCore 中來拿取資料。