處理器間/處理器內部通訊(IPC)是一種產品,用於在多處理器環境中實現處理器之間的通訊。IPC的特點包括訊息傳遞、多處理器門、共用記憶體原語等.
IPC被設計用於與執行SYS/BIOS應用程式的處理器一起使用。這通常是ARM或DSP。IPC包括支援高階作業系統(HLOS),如Linux,以及SYS/BIOS RTOS。在HLOS環境中支援的IPC特徵的寬度被減少,以便簡化產品。
IPC通常分佈並安裝在更大的SDK中。在這些情況下,不需要安裝。
在SDK之外,IPC可以在這裡下載,並作為zip檔案發布。要安裝,只需提取檔案即可…這將在目錄中提取IPC產品及其產品名稱和版本資訊(例如。c:/ti/ipc_)。
IPC產品提供多個處理器之間的軟體連線。每個處理器可以執行HLOS(例如
Linux、QNX)或RTOS(例如,SYS/BIOS)。IPC是一個開源的專案, 你可以在這裡找到它http://git.ti.com/ipc/ipcdev.
處理器SDKInstaller(ti-processor-sdk-linux-[platformName]-evm-xx.xx-Linux-x86-Install.bin)將安裝必要的元件,以便在TI微處理器上啟動您的開發。SDK由MatrixAppLauncher起始點應用程式的原始碼、一個開發檔案系統、一個目標檔案系統、範例應用程式、工具鏈和板支援包、易用性指令碼和檔案組成。處理器SDK現在包括ARM GCC工具鏈。處理器SDK是根據特定的Linux發行版名稱和版本Ubuntu16.04和18.04構建和測試的。注意,這並不妨礙使用者在其他Linux發行版上安裝SDK。
最後一步是下載並安裝處理器-SDKRTOS。要獲取本軟體的最新版本,請參見裝置的「軟體產品」頁。
範例的二進位制影象位於主機和各個核心的相應目錄中。可以通過使用通過JTAG的CCS載入和執行二進位制檔案來執行範例。
本文面向在Cortex A 15上執行Linux的AM57xx使用者。其目標是幫助使用者瞭解如何獲得AM57xx的DSP(C66x)和IPU (Cortex M4)子系統的許可權。
AM572x裝置有兩個IPU (IPUSS),每個子系統有兩個核心。IPU 2被用作多媒體應用程式中的控制器,所以如果您在執行處理器SDK Linux,那麼IPU 2很可能已經載入了韌體。但是,IPU 1是開放的,用於通用程式設計來解除安裝ARM任務。
這個任務有很多方面:構建、載入、偵錯、MMU、記憶體共用等等。本文打算採取漸進的步驟來理解所有這些部分。
在這個序列中,電源復位與遠端裝置(即DSP和M4)之間的間隔取決於HLOS初始化時間。
下圖說明ARMLinux核心的遠端proc/rpMsg驅動程式如何與執行RTOS的從處理器(如DSP、IPU等)上的IPC驅動程式通訊。
為了在從核心上設定IPC,我們在IPC包中提供了一些可從ARMLinux執行的預先構建的範例。接下來的章節描述瞭如何構建和執行此範例,並將其用作此工作的起點。
CMEM
To view the allocation at run-time:
root@am57xx-evm:~# cat /proc/cmem
這表明我們在0xA0000000的物理基地址上定義了一個CMEM塊,其總大小為0xc 000000(192 MB)。此塊包含由1個緩衝區組成的緩衝池。池中的每個緩衝區(本例中只有一個)被定義為大小為0xc000000(192 MB)。
更改DSP記憶體對映
首先,重要的是要理解,存在一對位於DSP子系統和L3互連之間的記憶體管理單元(MMUS)。其中一個MMUUS用於DSP核心,另一個是針對其本地EDMA。它們都用於將虛擬地址(即,由DSP子系統觀看的地址)轉換為實體地址(即,從L3互連觀看的地址)的相同目的。
DSP實體地址DSP程式碼/資料實際駐留的物理位置由CMA carveouts進行定義。要更改此位置,您必須更改香芹的定義。在LinuxDTS檔案中定義了DSP carveouts。例如對於AM57xxEVM:
您可以同時更改大小和位置。小心不要重疊任何其他carveouts!
此外,當您更改分出位置時,必須對資源表進行相應的更改。首先,如果您正在進行記憶體更改,則需要一個自定義資源表。資源表是一個大型結構,是實體記憶體和虛擬記憶體之間的「橋樑」。此結構用於設定位於DSP子系統前面的MMU。IPCResourceCustomTable一文中提供了詳細的資訊。
建立自定義資源表後,必須將phys_mem_IPC_VRING的地址更新為與相應的CMA相同的基址。
DSP虛擬地址
這些地址是DSP子系統看到的地址,也就是連結器命令檔案中的地址,等等。您必須確保節的大小與資源表中的相應定義一致。您應該建立自己的資源表,以修改記憶體對映。這是在頁IPC資源自定義表中描述的。您可以檢視IPC中的現有資源表:
換句話說,由於我們使用了身份對映,所以可以在它們的實體地址處存取外圍裝置。
執行時檢查DSPIOMMU頁面表
可以使用以下命令轉儲DSPIOMMU頁表:
一般來說,MMU 0和MMU 1的程式設計方式是相同的,所以您只需要檢視其中一個或另一個就可以理解給定DSP的對映。
「da」(「裝置地址」)列反映虛擬地址。它是從索引中派生的,即在頁表中不存在「da」暫存器或欄位。地址空間中的每個MB對映到表中的條目。顯示「da」,使其易於找到感興趣的虛擬地址。
「pte」(「頁表項」)列可以根據上述表20-4進行解碼。例如:
1: 0x4a000000 0x4a040002
0x4a040002向我們表明,它是一個基地址0x4A000000的超值。這給了我們一個16 MB的記憶體頁面。注意後面重複的條目。這是MMU的要求。
為了充分理解CortexM4IPU子系統的記憶體對映,認識到存在兩種不同/獨立的記憶體轉換級別很有幫助。以下是TRM中的片段以說明:
CortexM4 IPU實體地址
M4程式碼/資料實際所在的物理位置由CMA carveout進行定義。要更改此位置,您必須更改香芹的定義。M4 carveout在LinuxDTS檔案中定義。例如對於AM57xxEVM:
此外,當您更改 carveout的位置時,必須對資源表進行相應的更改。首先,如果您正在進行記憶體更改,您需要自定義資源表。資源表是一個大型結構,是實體記憶體和虛擬記憶體之間的「橋」。此結構用於設定IPUxMMU(不是UniCacheMMU)。在文章IPC資源客製化表中提供了詳細資訊。建立自定義資源表時,必須將physmemIPCvring的地址更新為與相應CMA相同的基地址。
CortexM4IPU虛擬地址
UniCacheMMU,
UniCacheMMU最接近CortexM4。它提供了一級地址翻譯。UniCacheMMU實際上是由CortexM4「自行程式設計」的。UniCacheMMU也被稱為屬性MMU(AMMU)。有固定數量的小、中和大頁面。以下是顯示一些關鍵對映的片段:
這3頁是「身份」對映,對關聯的地址範圍執行請求通過。這些中間地址在下一級翻譯(IOMMU)中被對映到它們的實體地址。用於程式碼和資料的AMMU範圍需要是標識對映,因為否則RemoteProc載入器將無法與相關聯的IOMMU對映從ELF檔案中匹配這些部分。這些對映應足以滿足任何應用,即無需調整這些對映。修改的更可能區域是下一節中的資源表。AMMU對映主要用於理解關於CortexM4記憶體對映的完整影象。
IOMMU
IOMMU位於離L3互連最近的地方。它獲取來自AmMu的中間地址輸出,並將其轉換為L3互連所使用的實體地址。IOMMU是由ARM基於相關資源表編寫的。如果您正在計劃任何記憶體更改,那麼您將需要建立一個自定義資源表,如頁面IPC資源自定義表中所描述的那樣。
來自資源表的3個條目都來自相關聯的IPUCMA池(即,如由型別_CARSOUT所指示的)。第二參數列示虛擬地址(即對IOMMU的輸入地址)。這些地址必須與AMMU對映以及連結器命令檔案一致。來自IPC的EX02_MessageQ範例在檔案範例/Dra7xx_Linux_ELF/EX02_MessageQ/共用/config.bld.中定義了這些記憶體部分您可以使用以下命令解除安裝IPUIOMMU頁面表:
範例:從IPU存取UART5在本例中,假定引導載入程式中已經設定了PIN-MUXED。如果不是這樣,你就得在這做。UART5模組需要通過CM_L4PER_UART5_CLKCTRL暫存器使能。這位於實體地址0x4A009870。因此,從M4,我們將在虛擬地址0x6A009870上對該暫存器進行程式設計。將值2寫入此暫存器將啟用外圍裝置。在完成上一個步驟後,UART5暫存器將變為可存取的。通常UART5可在物理基礎地址0x48066000處存取。這將相應地從IPU在0x68066000處存取。
預設情況下,IPU和DSP自動空閒。這可以防止您能夠使用JTAG連線到裝置,也無法通過devme 2存取本地記憶體。在sysfs中有一些選項是必要的,以強制這些子系統執行,有時這是開發和偵錯目的所需要的。這些操作需要一些源自裝置樹(dra7.dtsi)的寫死裝置名稱:
要將這些系統FS名稱對映到關聯的RemoteProc條目,您可以執行以下命令:
root@am57xx-evm:~# ls -l /sys/kernel/debug/remoteproc/
root@am57xx-evm:~# cat /sys/kernel/debug/remoteproc/remoteproc*/name
命令的結果將是一對一的對映。例如,58820000.ipu對應於remoteproc0。
類似地,要檢視每個核心的電源狀態:
root@am57xx-evm:~# cat /sys/class/remoteproc/remoteproc*/state
狀態可以掛起、執行、離線等。只有當狀態「執行」時,才能附加JTAG。如果它顯示為「暫停」,則必須強制它執行。例如,假設DSP 0被「掛起」。可以執行以下命令強制執行:
root@am57xx-evm:~# echo on > /sys/bus/platform/devices/40800000.dsp/power/control
任何核心都是如此,但是用上面圖表中關聯的系統FS名稱替換40800000.dsp。
有幾個步驟進行整個過程工作,每個步驟將在下面的章節中進行描述,並使用程式碼編寫器Studio(CCS)在EVM上執行「開箱即用」LED閃爍範例,從IPC軟體包獲取EX02_訊息範例,並將其轉換為CCS專案。建立它並修改Linux啟動程式碼以使用此新映像。這只是一個明智的檢查步驟,以確保我們可以在CCS中構建IPC範例,並讓它們在EVM啟動時執行。在CCS中,進行開箱即用的LED範例的克隆,並將其重新命名為「S」範例的IPC版本。然後,使用EX02_MessageQ範例作為參考,在IPC塊中新增到LED範例。從CCS構建然後將其新增到Linux韌體資料夾中。
將IPC新增到LED閃爍範例第一步是克隆出開箱即用的LED閃爍CCS專案,並將其重新命名為使用IPC表示它。執行此操作的最簡單方法是使用CCS。下面是步驟……在「編輯」(Edit)透檢視中,進入「專案瀏覽器」(ProjectExplorer)視窗,右鍵單擊GPIO_LEDBLINK_EVMAN572XC66XExampleProject專案,然後從彈出式選單中選擇「複製」(Copy)。Maske確定專案不是關閉狀態。Rick單擊專案瀏覽器視窗的「In」和「空」區域,然後選擇「過去」。彈出對話方塊,修改名稱以表示它使用IPC。一個好的名稱是GPIO_LEDBLINK_EVMAM572XC66XExamplejec_with_IPC。
右鍵單擊GPIO_LedBlink_evmAM572x c66xExampleProjec_With_IPC專案並在左側窗格中選擇Properties,單擊CCS General。在右側,單擊RTSC索引標籤上的XDCtools版本:在產品和儲存庫列表中選擇3.32.0.06_core,檢查以下.IPC 3.43.2.04 SYS/BIOS 6.45.1.29 am57xx PDK 1.0.4 for Target,選擇ti.Target ts.elf.C66作為平臺,選擇ti.platforms.evmDRA7XX,在平臺被選中後,編輯其名稱BueHand並追加:dsp 1到末尾。在此之後,應該是ti.platforms.evmDRA7XX:dsp 1,然後將構建組態檔設定為DEBUG。按下OK按鈕。現在,我們希望將EX02_MessageQIPC範例的設定和原始檔複製到我們的專案中。IPC範例位於C:TiIPC_3_43_02_04ExampleDra7xx_Linux_ELFEX02_MessageQ。要將檔案複製到CCS專案中,您可以簡單地選擇Windows資源管理器中所需的檔案,然後將它們拖放到CCS中的專案中。將這些檔案複製到CCS專案中……
人們想要做的一件常見的事情就是使用一個現有的IPU應用程式,它可以控制序列或控制介面,並將IPC新增到其中,這樣韌體就可以從ARM載入。當從唯一的IPU解決方案遷移到具有MPUSS(ARM)和IPUSS的異構SoC時,這種情況很常見。這是本節的重點。為了描述這個過程,我們需要一個TI RTOS測試用例來處理。為此,我們將使用屬於PDK(安裝為處理器SDKRTOS的一部分)的UART_BasicExgrom_evmAM572x_m4ExampleProject範例。此範例使用TI RTOS並在AM572xGP EVM上使用UART 3埠執行序列IO操作,它在EVM螢幕上被標記為SerialDebug。
為使整個過程工作採取了若干步驟,每個步驟將在下面的章節中進行描述使用程式碼ComposerStudio(CCS)構建並執行EVM上的開箱即用UARTM4範例從IPC軟體包構建並執行EX02_MessageQ範例,並將其轉換為CCS專案。建立它並修改Linux啟動程式碼以使用此新映像。這只是一個明智的檢查步驟,以確保我們可以在CCS中構建IPC範例,並讓它們在EVM啟動時執行。在CCS中,進行開箱即用UARTM4範例的克隆,並將其重新命名為該範例的IPC版本。然後使用EX02_MessageQ範例作為參考,在IPC塊中新增到UART範例程式碼。從CCS構建然後將其新增到Linux韌體資料夾中。
Linux核心啟用所有設定所需的SOCHW模組。適當的驅動程式設定所需的時鐘並初始化HW暫存器。對於所有未使用的IP,沒有設定時鐘。 使用裝置樹在核心中禁用uart3節點。此外,這限制了核心將這些IP放到睡眠模式。
在每個IPU 1和IPU 2子系統中都有兩個MMU。L1 MMU稱為IPU_UNICACHE_MMU或AmMu和L2 MMU。關於如何在IPC-Remoteproc中設定這一點的說明已在Changing_Cortex_M4_ IPU _Memory_Map一節中進行了描述。IPC處理L1和L2 MMU不同於PDK驅動程式範例如何使用這些MMU設定記憶體存取,使用者在整合元件時需要管理這些MMU。這種差異突出如下:
PDK範例將地址(0x4X000000)用於外圍暫存器,並使用以下MMU設定L2 MMU使用預設1:1對映Ammu Configuration將物理0x4X000000存取轉換為邏輯0x4X000000
IPC遠端proc ARM M4要求IPU使用邏輯地址(0x6X000000),並使用以下MMU設定L2 MMU,使MMU將0x6X000000存取地址轉換為地址0x4X000000(設定為1:1對映和0x6X000000)
因此,在將IPC與PDK驅動程式整合之後,建議使用別名地址來存取外圍裝置和PRCM暫存器。這需要更改PDK驅動程式和應用程式程式碼中使用的地址。然後對IPU應用程式原始碼進行以下更改:
將UART_SOC.C檔案新增到專案中,並修改UART_HATTRS中所有IPUUART暫存器範例的基本地址,以使用別名地址:
新增自定義SOC設定還意味著您應該使用通用的UART驅動程式,而不是內建在SOC設定中的驅動程式。要執行此註釋,請在.cfg中使用以下行:
在應用程式碼中也有一個範例,在該範例中,我們將指標新增到需要改變如下的PRCM暫存器。現在,您已經準備好構建韌體。構建.out之後,將擴充套件名更改為.xem 4,並將其複製到用於載入M4韌體的檔案系統中的位置。