SemiDrive E3 SSDK mbox 核間通信示例介紹

一、   概述

本文主要介紹 SemiDrive E3 SSDK 軟體包中 driver_demo/mbox 示例。

        Demo 主要功能為使用 E3 晶片的 mailbox 在不同的 core 之間傳輸消息,示例中以 SF core和 SX0 core 之間的通信為例,SX0 core 發送數據至 SF core。

硬體設備:E3640 GATEWAY 開發板

軟體包:SSDK PTG3.0

 


二、   代碼下載及 demo 介紹

       使用 SemiDrive support 系統上的 SSDK Builder ,選擇型號 E3640 和示例 app_demo/mbox 生成參考代碼。

       首先使用 JLINK 下載 SF 的鏡像至 E3 gateway 開發板,並啟動調試,進入 mailbox 接收等待狀態。

先點擊 make 編譯代碼,然後點擊 download and debug 燒錄代碼,最後點擊 go 運行代碼。

 

圖 2.1 SF 代碼下載並運行

 

        再下載 SX0 的鏡像至 E3 gateway 開發板,並啟動調試,將數據通過 mailbox 發送給 SF 核。

        先點擊 make 編譯代碼,然後點擊 download and debug 燒錄代碼,最後點擊 go 運行代碼。

 

圖 2.2 SX0 代碼下載並運行

 

        SF 核接收到 SX0 的數據後,進行檢驗是否正確,正確則通過串口列印 “SSDK E3 Mbox Demo Success” 的 log,表示 mbox demo 運行成功。

        示例中 SX0 發送了 32 字節的 0xA 給到 SF 核。

 

圖 2.3 運行成功 log

 


三、   代碼解析

3.1 SF 代碼流程

SF 核的代碼流程圖如下:



圖 3.1 SF 核代碼流程圖



        首先進行初始化,初始化各模塊、clock 時鐘、VIC1 中斷、Pinmux 配置和串口號等,並列印歡迎信息。

board_reset_init(); 會 reset SF 核的 VIC1, SX0 core,和 maibox 模塊。

        board_mbox_init(); 為初始化 maibox 模塊,將配置的 sdrv_mbox_cfg 信息傳遞給 g_sdrv_mbox_dev。主要包含 Mailbox Register base address、Mailbox Buffer base address和 mbox irq number。

mbox_recv_demo(); 為 SF 核主要部分。

       先定義一個 sdrv_mbox_chan_req_t 類型的結構體 chan_req,配置參數 rproc 為通信另一方的 core id ,這裡配置的為發送方 SX0;配置參數 src_addr 和 dest_addr,分別為源地址和目標地址的數據類型,無特殊要求則設為原始數據類型 MBOX_ADDR_RAW。

       然後根據配置的參數,申請 mailbox channel。在設置接收 callback 函數,然後進入等待接收循環,循環中會判斷 callback 中的標誌位 mbox_recv_flag。

       在 callback 函數中會根據接收數據的長度,判斷接收的數據中 0xA 的數量,如果為 32,則將標誌位 mbox_recv_flag 置 1,並列印串口 log。

       While 循環中,判斷 mbox_recv_flag 非 0 後,則會退出,並釋放申請的 mailbox channel ,列印 demo 運行成功 log。

 

3.2 SX0 代碼流程

       首先進行初始化,與 SF 核代碼類似,初始化各模塊、VIC3 中斷和列印輸出串口等,並列印歡迎信息。

board_reset_init(); 會 reset SX0 的 VIC3。

board_mbox_init(); 為初始化 mailbox 模塊,與 SF 核代碼類似。

mbox_send_demo(); 為 SX0 核的主要部分。

       首先也是配置 rproc 為通信方 core id,這裡配置的為接收方 SF,配置數據類型為 MBOX_ADDR_RAW。

       根據配置的參數,申請 mailbox channel。使 0xA 複製到申請的 send_data 用 memset 將 32 字節數的  數組中。然後調用 sdrv_mbox_send() 將數據發送出去,發送完後釋放 mailbox channel。

 

SX0 核的代碼流程圖如下:



圖 3.2 SX0 核代碼流程圖

 

 



四、   拓展分析說明

1. 多 core 通信

        配置的 rproc 參數,可以使用 MBOX_RPROC_SF | MBOX_RPROC_SP0 形式,增加通信方。參考 sdrv_mbox.h 文件的結構體 sdrv_mbox_rproc_t 介紹,對應的 TRM 中的寄存器為 TMH0 的 MDP[7:0]。

        另外需要在 sf/configs/reset_cfg.c 中添加對應 core ,比如增加 SP0 core,需要增加 rstsig_cr5_sp0,以 boot 對應 core ,否則會 debug 不成功。

 

圖 4.1 寄存器 TMH0 的 MDP 介紹



2. 
數據長度

       根據寄存器 TMH0 的 TXMES_LEN[10:0] 說明,最長配置為 2048 x 2 byte,每次最多只能傳輸 4096 字節。

 

圖 4.2 寄存器 TMH0 的 TXUSE_MB 和 TXMES_LEN 介紹

 

        在增大發送數據字節數時,IAR 可能會提示堆棧空間不足,則修改 icf 文件中配置的堆棧大小,默認配置的為 0x1000。

define symbol __ICFEDIT_size_cstack__   = 0x1000;

 

3. 數據收發地址

發送的數據存儲在 MB_MEM_BASE 的位置即 mailbox buffer,地址為 0x02001000。

比如示例中,SX0 核需要發送的 32 字節的 0xA ,使用 IAR 的 memory 觀察如下:

 

圖 4.3 發送數據存儲地址

 

        根據 TRM 6.2.4 Message Buffer Addressing 介紹,SX0 發送的數據存在的地址為 0xF4005000,示例中在 SF 的 callback 函數中設置斷點,可以使用 memory 觀察到接收的數據,如下:

 

圖 4.4 接收 SX0 數據存儲地址

 

 


五、   參考文檔

  • 《SemiDrive_E3_SSDK_User_Guide》
  • 《E3400_E3600_MCU_TRM》
  • 《AppNote_E3_Boot_and_OTA》


 歡迎在博文下方留言評論,我們會及時回復您的問題。

如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com   
作者:Eason Wang / 王寅森


更多資訊,請掃碼關注我們!


★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論