OMAPL138的DSPLINK開發入門


1、DSPLINK介紹

1.1GPP端

GPP(General Purpose Processor)是指和DSP端通信的通用處理器,在本文特指OMAPL138平臺的ARM端。

GPP OS:指通用處理器上的操作系統,本文特指OMAPL138平臺ARM端Linux操作系統。

OS ADAPTATION LAYER:指操作系統抽象層,包含了DSPLINK需要的一些通用的OS服務部件,提供了一套通用的API接口,與OS的其他組件隔離。其他組件通過API訪問,而不直接訪問DSPLINK,此特性使DSPLINK可以方便的被移植到不同操作系統中。

LINK DRIVER:指連接驅動層,包含了基於GPP與DSP的物理連接的底層控制操作,負責GPP與DSP之間的數據傳輸和DSP的運行等操作。

PROCESSOR MANAGER:指進程管理層,它維護一個針對所有模塊的Book-Keeping信息,通過 API給用戶提供通過LINKDRIVER的控制操作。

DSP/BIOSTM LINK API:指提供給GPP端的接口,是非常輕小型的組件,API層可以認爲是基於PROCESSOR MANAGER和 LINK DRIVER之上的層。


1.2 DSP端

       DSP端在本文特指OMAPL138平臺的DSP端。

DSP/BIOS:指DSP端的BIOS輕量級操作系統,同時它是一個實時操作系統。本文提到的DSPlink在ARM端是基於Linux系統,而在DSP端時基於DSP/BIOSTM。也就是說,如果使用DSPlink調用DSP,那麼編寫DSP程序時必須要選擇操作DSP/BIOSTM支持。

LINK DRIVER:LINK DRIVER是DSP/BIOS中驅動的一部分,該部分驅動只負責基於物理連接之上與GPP之間的交互。DSP端沒有DSPLINKAPI,和GPP之間的通信是基於DSP/BIOS中的SIO、GIO、MSGQ模塊來實現的。

OTHER DRIVERS:指DSP端其他驅動程序。


1.3DSPLINK關鍵組件

        GPP端的DSPLINK關鍵組件有PROC、CHNL、MSGQ、POOL、NOTIFY、MPCS、MPLIST、RINGIO。

1.3.1 PROC

    PROC表述應用空間的DSP處理器,提供以下服務:

   初始化DSP,使之能從GPP端進行訪問

   從GPP端加載DSP的代碼至DSP處理器

   從DSP代碼制定的地址運行DSP程序

   讀寫DSP端的地址空間

   停止DSP端程序的運行

   其他一些平臺專有的控制操作

1.3.2 CHNL

CHNL是channel的縮寫,該組件表述應用空間的一個邏輯數據傳輸通道,負責GPP與DSP之間的數據傳輸。通道channel的概念如下述:

   一種GPP端與DSP端傳輸數據的方式

   一個基於GPP與DSP的物理連接上的邏輯實體映射

   唯一的數字標識,標記連接到DSP的一組channel中的某個channel

   無方向性,通道方向可以配置

        DSP端與GPP端的一條物理連接被多通道複用,被傳輸的數據中不包含目的地和源地址的任何信息,數據發送與接收端的數據通路需要在應用前進行顯式的建立,採用issue-reclaim模式進行數據傳輸。

1.3.3 MSGQ

         MSGQ是message queue的縮寫,表述基於message的消息隊列,負責GPP與DSP端的可變長度的短消息交互,基於DSP/BIOSTM的MSGQ模塊實現。

         message的發送接收都通過消息隊列實現,消息接收者從消息隊列接收信息,而消息發送者將數據寫入到消息隊列中,一個消息隊列只可以有一個接收者,但可以有多個發送者。一個任務可以讀寫多個消息隊列。

1.3.4 POOL

         此模塊提供了API 用於配置共享內存區域,同時還提供兩個CPU間的緩存數據同步的API 接口。此模塊提供如下功能:

   通過調用打開(open)和關閉(close)配置共享內存區域

   在共享內存區域內分配或釋放緩存

   分配的內存地址可以在不同的地址空間內轉換

   在不同CPU核之間實現內存數據的同步

1.3.5 NOTIFY

此組件允許應用程序爲發生在遠程處理器上的事件通知(Notification )註冊,併發送事件通知給遠程的處理器。允許應用程序爲遠程處理器上的事件註冊一個帶事件回調函數;使能應用程序發送事件通知到遠程處理器;同時,應用程序也可以發送一個事件處理的選項值。

         Notify組件爲事件通知定義了優先級,優先級通過事件編號來實現,低編號的事件享有更高的優先級。如果事件通知不再需要使用,應用程序也可以實時註銷其相應的回調函數。

1.3.6 MPCS

        應用程序MPCS 實現GPP和DSP(Multi-ProcessorCritical Section)互斥訪問共享

的數據結構。應用程序有時候需要定義屬於自己的,並能夠被多個處理器訪問的數據結構,

用於多個處理器之間信息的通信。但是,應用程序必須保證多個處理器,或者每個處理上的各個任務之間互斥地訪問這些數據結構,從而保證數據的連貫性。MPCS被用來實現這個功能。

       在擁有可以共同訪問的內存區域的多處理器系統中,可以實現GPP和DPS之間的MPCS 。而爲了防止沒有共享存儲區域的情況出現,該模塊內部實現了MPCS組件要求的帶保護的同步。

        MPCS組件提供了APIs接口來創建和刪除MPCS實體,每個MPCS實體都通過一個系統唯一的字符串名字來標識。每一個需要使用MPCS的客戶端都需要調用API打開函數來獲取句柄。當不再需要使用MPCS時,通過相應的API函數來關閉句柄,同時也提供了進入和離開MPCS對象句柄指定的臨界區域的API函數。

       如果MPCS對象要求的存儲空間由用戶提供的話,它必須位於所有處理器都可以訪問到的池(Pool)中;如果在創建對象的時候不提供存儲空間,則指定池的ID號將被MPCS對象用來內部分配空間。

1.3.7 MPLIST

       此組件提供GPP和DSP之間傳輸機制的雙重循環連接列表。在GPP和DSP之間存在共享存儲空間的設備上,該模塊實現共享存儲空間的連接列表。對於不存在共享存儲空間的設備,該模塊內部保持和遠程處理器上連接列表的一致。

       該組件提供了創建和刪除MPLIST實體的APIs函數,每個MPLIST實體都通過一個系統唯一的字符串名字來標識。每一個需要使用MPLIST的客戶端都需要調用API打開函數來獲取句柄。當不再需要使用MPLIST時,通過相應的API函數來關閉句柄。

        MPLIST組件提供的API函數,可以在列表最後加入一個新的元素,或者刪除列表最前面的一個元素。也允許應用程序在某個已有的列表元素前插入一個緩衝,刪除列表中任意一個指定的元素,並提供了檢查列表是否爲空的API函數。另外,還有API函數通過獲取列表首元素的指針和指定元素後的一個元素,橫斷列表。

1.3.8 RING IO

       該組件提供基於數據流的循環緩衝區。該組件允許在共享存儲空間創建循環緩衝區,不同的處理都能夠讀取或者寫入循環緩衝區。RINGIO組件允許通過寫指針來獲取數據緩衝區的空存儲空間,當該存儲空間被釋放之後,相應存儲空間可以被再次寫入。

        RINGIO組件允許讀指針獲取緩衝區中讀取空間的有效數據。當被釋放之後,相應存儲空間的數據被標記爲無效。每個RINGIO實體擁有一個讀指針和一個寫指針。RINGIO組件也有API 函數,可以使能數據屬性的同步傳輸。如:EOS(End OfStream)、事件戳、流偏移地址等,也可能伴隨着循環緩衝區的偏移值。

2、DSPLINK 配置

      準備以下4個文件。

(1)bios_5_41_10_36.tar.gz                        //DSP/BIOS源碼

(2)dsplink_linux_1_65_00_03.tar.gz        //dsplink源碼

(3)ti_cgt_c6000_7.3.0.tar.gz                     //dsp編譯工具鏈

(4)xdctools_3_22_01_21.tar.gz                //實時調試工具

備註:此版本DSPLINK僅適用於linux-2.6.33內核。需要使用linux-3.3內核請使用MCSDKSYSLINK

                 分別解壓以上四個文件

Host#   tarzxvf /mnt/hgfs/shareVM/bios_5_41_10_36.tar.gz -C ./

Host#   tarzxvf /mnt/hgfs/shareVM/dsplink_linux_1_65_00_03.tar.gz -C ./

Host#   tar zxvf/mnt/hgfs/shareVM/ti_cgt_c6000_7.3.0.tar.gz -C ./

Host#   tarzxvf /mnt/hgfs/shareVM/xdctools_3_22_01_21.tar.gz -C ./

   解壓完成後,當前目錄下就有了以下4個目錄:

(1)bios_5_41_10_36

(2)dsplink_linux_1_65_00_03

(3)ti_cgt_c6000_7.3.0

(4)xdctools_3_22_01_21

 

2.1 DSPLINK源碼

       進入dsplink_linux_1_65_00_03/dsplink目錄,可以看到DSPLINK源碼展開後的各個目錄。

2.1.1 GPP端源碼

      dsplink_linux_1_65_00_03/dsplink/gpp目錄解析

inc:相關的頭文件。

src:dsplink源碼和sample例程源碼,用戶可以編譯和測試。



2.1.2 DSP端源碼

      dsplink_linux_1_65_00_03/dsplink/dsp目錄解析

inc:相關的頭文件。

src:dsplink源碼和sample例程源碼,用戶可以編譯和測試。

展開其各個目錄。

 2.2 DSPLINK配置

注意:本小結所有操作步驟務必在同一個窗口,否則會無法編譯。

(1)修改環境變量“DSPLINK”

dsplink環境變量配置文件所在目錄:dsplink_linux_1_65_00_03/dsplink/etc/host/scripts/Linux/

     在當前目錄運行命令“geditdsplinkenv.bash”打開配置文件dsplinkenv.bash。

      將文件中的第51行:

“exportDSPLINK=$HOME/dsplink_1_65_00_03/dsplink”改爲

“export DSPLINK=/home/tl/omapl138/dsplink_linux_1_65_00_03/dsplink”

 

       保存退出文件編輯,在當前目錄執行命令“sourcedsplinkenv.bash”會提示環境變量“DSPLINK”、“PATH”的值。

 

(2)配置編譯參數

       進入/ dsplink_linux_1_65_00_03/dsplink/config/bin目錄,查看到當前目錄下有dsplinkcfg.pl編譯配置文件,在當前目錄下執行以下命令:

perl dsplinkcfg.pl--platform=OMAPL138 --nodsp=1 --dspcfg_0=OMAPL138GEMSHMEM --dspos_0=DSPBIOS5XX--gppos=ARM --comps=ponslrmc

 

   各個參數的解釋:

perl:使用perl工具配置參數

--platform=OMAPL138:編譯的平臺是OMAPL138

--nodsp=1:只有一個dsp(dsplink支持一個arm跟多個dsp通信)

--dspcfg_0=OMAPL138GEMSHMEM:使用OMAPL138GEMSHMEM共享內存

--dspos_0=DSPBIOS5XX:dsp端使用的是bios5

--gppos=ARM:gpp端是ARM平臺

--comps=ponslrmc:編譯所有組件

     若出現如下圖的錯誤,請執行命令如下:

Host#  source /dsplink_linux_1_65_00_03/dsplink/etc/host/scripts/Linux/dsplinkenv.bash

 

     錯誤的原因在於通過“source dsplinkenv.bash”設置環境變量僅在當前窗口有效。在另外一個窗口操作時需要重新source。

 

(3)修改編譯時GPPOS的路徑和編譯器路徑

       進入/dsplink_linux_1_65_00_03/dsplink/gpp/src目錄,打開配置文件Rules.mk。

       將第56~59行的內容:

ifeq("$(TI_DSPLINK_PLATFORM)", "OMAPL138")

KERNEL_DIR    :=${HOME}/DaVinci-PSP-SDK-03.20.00.11/src/kernel/linux-03.20.00.11

TOOL_PATH      := ${HOME}/toolchains/git/arm-2009q1-203/bin

endif #ifeq("$(TI_DSPLINK_PLATFORM)", "OMAPL138")

        修改爲以下內容:

ifeq("$(TI_DSPLINK_PLATFORM)", "OMAPL138")

KERNEL_DIR     := /home/tl/omapl138/linux-2.6.33

TOOL_PATH       := /home/tl/arm-2009q1/bin

endif #ifeq("$(TI_DSPLINK_PLATFORM)", "OMAPL138")

        以上修改務必對應內核源碼和交叉編譯工具鏈源碼目錄所在路徑,修改結果如下圖:

 

(4)修改gpp端配置文件

       進入/omapl138/dsplink_linux_1_65_00_03/dsplink/make/Linux目錄,打開當前目錄下的gpp端配置文件omapl138_arm.mk。

 

        配置以下參數:

BASE_BUILDOS       := /home/tl/omapl138/linux-2.6.33

(內核存放在位置,根據內核源碼存放的目錄而改動)

BASE-TOOLCHAIN         := /home/tl/arm-2009q1

(交叉編譯工具鏈存放在位置,根據工具鏈存放的目錄而改動)

        以上修改務必對應內核源碼和交叉編譯工具鏈源碼目錄所在路徑,修改如下圖:

 

(5)修改DSP端配置文件

        進入omapl138/dsplink_linux_1_65_00_03/dsplink/make/DspBios目錄,打開當前目錄下的配置文件c674x_5.xx_linux.mk。

 

        修改63~84行,配置以下參數:

BASE_INSTALL        := /home/tl/omapl138

BASE_SABIOS          := /home/tl/omapl138/bios_5_41_10_36

XDCTOOLS_DIR      := /home/tl/omapl138/xdctools_3_22_01_21

BASE_CGTOOLS     := /home/tl/omapl138/ti_cgt_c6000_7.3.0

        以上修改務必對應bios_5_41_10_36、xdctools_3_22_01_2、ti_cgt_c6000_7.3.0目錄所在路徑.

3、DSPLINK編譯

注意:本小結所有步驟應在上小結的終端窗口下繼續操作,否則會出現編譯錯誤現象。

3.1 GPP端DSPLINK編譯

3.1.1 DSPLINK源碼編譯

      切換到dsplink_linux_1_65_00_03/dsplink/gpp/src目錄,這是GPP端源碼所在目錄,並運行“make”命令進行編譯.

       編譯完成後,將會在以下目錄產生gpp端的驅動程序鏡像dsplinkk.ko文件: dsplink_linux_1_65_00_03/dsplink/gpp/export/BIN/Linux/OMAPL138/RELEASE

3.1.2示例程序編譯

      小節編譯出來的示例程序是在gpp端運行的,首先切換到當前目錄下的samples示例代碼目錄,再在運行“make”命令編譯示例程序源碼.

      編譯出來的gpp端可執行文件位於以下目錄:

dsplink_linux_1_65_00_03/dsplink/gpp/export/BIN/Linux/OMAPL138/RELEASE

      綠色圖標*gpp文件就是gpp端的可執行文件:

 

3.2 DSP端DSPLINK編譯

3.2.1 DSPLINK源碼編譯

      進入/home/tl/omapl138/dsplink_linux_1_65_00_03/dsplink/dsp/src/目錄,這是DSP端庫文件源碼所在目錄,並運行“make”命令進行編譯。

      編譯出來的庫文件位於以下目錄:

dsplink_linux_1_65_00_03/dsplink/dsp/export/BIN/DspBios/OMAPL138/OMAPL138GEM_0/RELEASE,以.lib結尾的文件就是庫文件.

3.2.2 示例程序編譯

       首先切換到當前目錄下的samples示例代碼目錄,再在運行“make”命令編譯示例程序源碼。

 

        編譯出來的dsp端可執行文件位於以下目錄:dsplink_linux_1_65_00_03/dsplink/dsp/export/BIN/DspBios/OMAPL138/OMAPL138GEM_0/RELEASE/

                 以*.out結尾的文件就是dsp端的可執行文件:


4、DSPLINK例程演示

4.1 程序準備


      程序演示需要將編譯完成的GPP端和DSP端的程序和數據文件複製到開發板的文件系統。

(1)在虛擬機的建立存放GPP端和DSP端的程序的文件夾dsplink

Host#      mkdir -p /demo/dsplink

(2)將dsplink相關程序放到新建立的dsplink文件夾

拷貝dsplinkk.ko:

Host#      cp  -a/dsplink_linux_1_65_00_03/dsplink/gpp/export/BIN/Linux/OMAPL138/RELEASE/dsplinkk.ko  / demo/dsplink

                 拷貝所有以gpp後綴結尾的gpp端可執行程序:

Host#  cp  -a/home/tl/omapl138/dsplink_linux_1_65_00_03/dsplink/gpp/export/BIN/Linux/OMAPL138/RELEASE/*gpp  ./

  拷貝所有以.out後綴結尾的dsp程序可執行程序:

Host#      cp  -a/home/tl/omapl138/dsplink_linux_1_65_00_03/dsplink/dsp/export/BIN/DspBios/OMAPL138/OMAPL138GEM_0/RELEASE/*.out  ./

 

(3)將存放dsplink文件夾拷貝到開發板

          將dsplink文件夾拷貝到開發板的根目錄下,完成後,進入開發板的dsplink目錄。


4.2 運行dsplink演示程序

      在運行所有演示程序之前,請先安裝dsplink驅動程序dsplinkk.ko。在開發板的/dsplink目錄中運行以下命令:

Target#   insmod dsplinkk.ko

4.2.1、LOOP

         LOOP示例闡明瞭在DSP/BIOSTMLINK中的基本數據流的概念。它實現了在GPP端的任務與DSP端任務的數據傳輸。DSP端應用程序採用SIO和GIO實現了TSK(任務)與SWI(軟中斷)。

 

         LOOP例程演示操作的命令格式:./loopgpp<absolute path of DSP executable><BufferSize><number of transfers>< DSP Processor Id >

指DSP端可執行文件的路徑

Buffer Size:表示緩衝區大小;

number oftransfers:表示執行次數,值爲0時執行無數次;

DSPProcessor Id:DSP處理器的Id號,值爲0指DSP0, 值爲1指DSP 1,當只有一個DSP時,此處可不填。

       執行“./loopgpp”可以看到例程用法和參數的英文解釋(其他例程英文解釋查看方法一樣)。

 

LOOP例程演示命令如下:

Target#   ./loopgpploop.out 1024 1000

                 執行1000次,每次傳輸1Kbyte的數據量。


                 傳輸的內容對應在samples/loop/loop.c中已經定義好了。

 

                 可以看到填充的數據是0xE7。

4.2.2 MESSAGE

       MESSAGE示例闡明瞭在DSP/BIOSTMLINK中的基本信息傳遞的概念。它實現了GPP端任務與DSP端任務之間的信息傳遞。DSP端應用程序採用MSGQ實現了TSK與SWI。


       MESSAGE例程演示操作的命令格式如下:./messagegpp<absolute path of DSPexecutable><number of transfers><DSP Processor Id>

       執行“./messagegpp”可以看到例程的用法和參數的英文解釋

 

       MESSAGEGPP例程演示命令如下:

Target#   ./messagegppmessage.out 10000

        傳輸10000次,運行命令後的結果如下圖:

4.2.3 SCALE

        SCALE示例闡明瞭在的數據流和信息的組合概念。它不僅實現了GPP端任務與DSP端任務之間的數據傳遞,而且從GPP端發送信息到DSP端。

        DSP端應用程序採用SIO&MSGQ 和GIO&MSGQ實現了TSK與SWI。


       SCALE例程演示操作的命令格式如下:./scalegpp<absolute path of DSP executable><BufferSize><number of transfers><DSP Processor Id>

       執行“./scalegpp”可以看到例程的用法和參數的英文解釋,如下圖:


 

        SCALE例程演示命令如下:

Target#   ./scalegppscale.out 1024 100

        執行100次,每次傳輸1Kbyte的數據量,運行命令後的結果如下圖:

 4.2.4 READWRITE

       READWRITE示例闡明瞭大緩衝區通過直接讀寫DSP內部RAM來進行傳輸的概念。它實現了在GPP端和使用PROC_Read()和PROC_Write()API的DSP端以及兩個DSP端之間的大尺寸數據緩衝器之間的數據與信息的傳遞和轉換。DSP端應用程序採用MSGQ實現了TSK。


        READWRITE例程演示操作的命令格式如下:./readwritegpp<absolute path of DSPexecutable><DSP address><buffersize><number oftransfers><DSP ProcessorId>

        執行“./readwritegpp”可以看到例程的用法和參數的英文解釋。

        READWRITE例程演示命令如下:

Target#   ./readwritegppreadwrite.out 293601280 1024 1000      

        293601280是DSP的內存地址,執行1000次,每次傳輸1Kbyte的數據量。

4.2.5 RING IO

       RING_IO示例闡明瞭如何使用DSP/BIOSTMLINK中的RingIO部件以及在GPP與使用兩個RingIO實例的DSP之間的數據流的方法。它實現了數據在GPP端運行的線程/進程的應用程序和DSP端之間的傳遞與轉換。在Linux中,這個應用程序在某個過程中通過進程或者線程來運行。在PrOS中,它通過一系列任務來運行。在隨後的部分應用程序中的每個線程/進程/任務被視爲客戶端。在DSP端,此應用程序闡述了使用RingIO來實現TSK的用法。

例程演示操作的命令格式如下:./ringiogpp<absolute path of DSPexecutable><RingIO data Buffer Size in bytes><number of bytes totransfer><DSP Processor Id>

        執行“./ringiogpp”可以看到例程的用法和參數的英文解釋。

 

        RING_IO例程演示命令如下:

Target#   ./ringiogppringio.out 10240 1000

        執行1000次,數據緩衝區的大小是10KByte。

4.2.6 MPLIST

MPLIST示例闡明瞭如何使用DSP/BIOSTMLINK中的MPLIST的部件以及在GPP與使用多個處理器列表的DSP之間的數據流的方法。它實現了GPP端和DSP端之間的數據轉換與傳遞。在DSP端,應用程序通過MPLIST實現了TSK。

MPLIST例程演示操作的命令格式如下:./mplistgpp<absolute path of DSPexecutable><number of iterarions for which to run thesample><number of elements to add at end of list><DSP ProcessorId>

執行“./mplistgpp”可以看到例程的用法和參數的英文解釋。

MPLIST例程演示命令如下:

Target#   ./mplistgppmplist.out 1000 100

執行1000次,每次在隊列最後添加100個數據。

4.2.7 MPCSXFER

MPCSXFER示例闡明瞭通過一個擁有互斥訪問保護的共享內存緩衝區的基本機制實現了數據在GPP端與DSP端之間的傳遞與轉換。它通過使用MPCS的部件來爲分配使用POOL組件的共享緩衝器提供一個訪問保護機制。GPP與DSP兩端的應用程序同步化是通過使用NOTIFY的部件來實現的。

DSP端應用程序通過使用MPCS,POOL和NOTIFY的部件來實現TSK。


MPCSXFER例程演示操作的命令格式如下:./mpcsxfergpp<absolute path of DSPexecutable><Buffer Size><number of transfers><DSPProcessorId>

執行“./mpcsxfergpp”可以看到例程的用法和參數的英文解釋。

 

MPCSXFER例程演示命令如下:

Target#   ./mpcsxfergppmpcsxfer.out 1024 1000

執行1000次,緩衝區的大小是1KByte。


詳細的文檔請查閱廣州創龍資料:

http://pan.baidu.com/s/1eQ9YKRC?qq-pf-to=pcqq.c2c


   更多關於DSPLINK的開發資料請參考如下網站:

http://wenku.baidu.com/search?word=DSPLINK&lm=0&od=0&pn=0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章