三、 OMAP 內部通訊架構及溝通方式
3.5 DSP PROGRAMMING
在前面說明 DSP Gateway 的架構和 Linux 端程式的操作之後,這一節,將說明圖 3-2 中 DSP 程式(DSP Task)的部分。在這之前,先對前面說明過的 DSP Gateway 架構和 Linux APIs 與 DSP Task 之間的動作結合做個流程說明。當一個 Linux 的使用者欲存取使用 DSP task device 時,驅動程式接收 ARM 的操作命令,產生一個 Mailbox command 給 DSP。
經過 Mailbox interrupt handler,再傳送至 DSP 端,DSP 系統的 BIOS,DSP Gateway BIOS(tokliBIOS),接收 Mailbox command,並在合適的 DSP/BIOS TSK 中佇列註冊這項 工作。DSP/BIOS TSK 使用正確的工作函式來處理在佇列中的命令,第四章中的圖 4-6 和圖 4-7為一實際資料傳輸的順序圖。其中工作函式是設計 DSP 應用的程式者用於實現 DSP 的函式,而且它可以回送一個 Mailbox command 給 ARM 利用 tokliBIOS 函式庫。
圖 3-20表示 DSP Gateway 資料傳輸的架構。
圖 3-20 DSP Gateway 資料傳輸架構圖
3.5.1 DSP Task Programming
Structure Data member Data type Description
tid unsigned short Task ID。DSP 工作的 ID。當工作初 始化時,DSP Gateway BIOS 設定 TID。
name String Task name(工作名稱),亦為 device file 的名稱
ttyp unsigned short Task type,工作的型式設定,例如:
BKMD(block transfer for MPUÆDSP)
*rcv_snd() unsigned short
*rcv_req() unsigned short
*rcv_tctl() unsigned short
Task function。DSP Gateway 會呼叫這 些 函 式 , 回 應 ARM 的 Mailbox command。
dsptask
*task_attrs struct TSK_Attrs DSP/BIOS TSK 特性。如果為 NULL,
則為預設值。
資料來源:Linux DSP Gateway Specification Rev2.0[1]
工作型式(Task type),則定義了 DSP TSK 不同的資料傳輸方式,表 3-5表示 ttyp 參數的
AREQ Active Receiving Task 送 出 WDREQ/BKREQ/BKREQP 命 令 給 ARM,當 Task 需要資料時
PVDM Passive Receiving Task 從不送 WDREQ/BKREQ 命令給 ARM
BKMD Block Sending Task 使用 BKSND/BKSNDP 命令
BKDM Block Receiving Task 送資料從 DSP 給 ARM 的命令
資料來源:Linux DSP Gateway Specification Rev2.0[1]
task_attrs 則是一些對於 DSP/BIOS 的特性設定,其中比較重要的設定為 task 優先權的設 定。在規劃一個即時多工程式處理系統時,在 task 的安排上相當重要,這時可以由 task_attrs 來設定每個 task 中優先權的屬性。
3.5.2 DSP Task 應用程式介面
DSP 工作程式設計者能使用一些 Task API 函式處理在工作函式中的資料。這些工 作函式包括有 rcv_snd、rcv_req 和 rcv_tctl,這些工作函式會被 DSP/BIOS 的工作所呼叫 執行,而且可加入 DSP/BIOS APIs 使用,沒有任何特別的限制。以下將針對這些函式,
一一的說明之。
(1) Uns (*rcv_snd)
這個函數定義於當 DSP 工作函式接收到 Mailbox command 中含有 WDSND、BKSND 或 BKSNDP 命令時的動作。表 3-6表示每種命令所對應資料接收的方式。
表 3-6 BKSND、BKSNDP 及 WDSND 命令說明
Receive Command type Parameter Script
WDSND struct dsptask *task, Uns data 接收 word 資料
BKSND struct dsptask *task, Uns bid, Uns cnt
Block 傳 資 料 時 , 利 用 Global IPBUF。所以在引 數中,需要有 BID 的資 料 , 以 及 被 傳 送 資 料 的 Count 數。
BKSNDP struct dsptask *task, Uns cnt
Block 傳 資 料 時 , 利 用 Private IPBUF,需要被傳 送資料的 Count 數。
(2) Uns (*rcv_req)
這個函數定義於當接收到 WDREQ 或 BKREQ 命令時動作。表 3-7表示每種命令所對應 的資料要求型態。
表 3-7 BKREQ 及 WDREQ 命令說明
Send Command type Parameter Script
WDREQ struct dsptask *task, Uns data 接收 word 資料
BKREQ struct dsptask *task, Uns bid, Uns cnt Block 傳資料時,利用 Global IPBUF。傳送資料的 Count 數。
Uns t1_rcv_tctl ( struct dsptask *task, Uns ctlcmd ) {
switch ( ctlcmd ) {
case MBCMD_TCTL_TINIT:
return 0;
case USER_DEFINED_TCTL_COMMAND:
/*
user program here
*/
default:
return MBCMD_EID_BADTCTL;
} }
圖 3-22 ARM 及 DSP 程式基本架構
/* ARM side s om e s ection s code */
int m ain(int argc, char *argv[]) int fd, cn t;
unsi gned s hort val ue[128];
char *devfn = "/ dev/dspt ask/t est1";