嵌入式Linux下ARM處理器與DSP的數據通信
發布時間:2007/8/29 0:00:00 訪問次數:788
摘要:本文通過一個開發實例詳細說明如何通過DSP的HPI接口與運行Linux操作系統的ARM架構處理器進行數據通信。給出接口部分的實際電路和ARM-Linux下驅動程序的開發過程。
關鍵詞:設備驅動程序 嵌入式Linux HPI ARM DSP
1 引言
基于ARM核心處理器的嵌入式系統以其自身資源豐富、功耗低、價格低廉、支持廠商眾多的緣故,越來越多地應用在各種需要復雜控制和通信功能的嵌入式系統中。
內核源碼開放的Linux與ARM體系處理器相結合,可以發揮Linux系統支持各種協議及存在多進程調度機制的優點,從而使開發周期縮短,擴展性增強。作為數字處理專用電路,DSP的數字信號處理能力十分強大,但對諸如任務管理、通信、人機交互等功能的實現較為困難。
如果將這三者結合起來,即由DSP結合采樣電路采集并處理信號,由ARM處理器作為平臺,運行Linux操作系統,將經過DSP運算的結果發送給用戶程序進行進一步處理,然后提供給圖形化友好的人機交互環境完成數據分析和網絡傳輸等功能,就會最大限度的發揮三者所長。
2 系統結構
該系統硬件由二部分組成,其中一部分為若干塊DSP板,各自獨立承接數據采集和信號處理。另一部分為以ARM為核心處理器的CPU板。系統硬件框圖如圖1所示(僅接口部分)。
3 接口硬件部分設計
3.1 HPI接口簡介
HPI接口是TI公司新一代、高性能DSP上用以完成與主機或其他DSP之間數據交換的接口,這里主要介紹實際電路中使用的控制引腳和時序。
HCNTL0和HCNTL1為訪問控制選擇。用來確定主機(ARM)究竟對TMS320C6711中的哪一個HPI寄存器進行處理。具體功能如表1所列。
表1 HCNTL0和HCNTL1的功能
HR/W:讀寫選擇控制。為“1”表示是從DSP中讀,反之則為寫。
HHWIL:半字節定義選擇,與HPIC寄存器中的HWOB位進行配合可以選擇當前傳輸的是高半字還是低半字。低電平是第一個半字,高電平是第二個半字。
HCS:選通脈沖(Strobe),與HDS1、HDS2相互配合完成內部信號HSTROBE的生成。邏輯關系如圖2所示。
將HDS1、HDS2分別固定為高電平和低電平,這樣HCS就和HSTROBE完全一致。
HSTROBE讀時序如圖3所示。
3.2 接口電路
ARM處理器通過DSP的HPI接口與DSP進行連接的硬件原理如圖4所示(以單板DSP為例)。其中SN74LVTH16245為16位(二個8位)雙向三態總線收發器,主要起總線驅動和方向控制的作用同時也保證在不對HPI口進行操作時數據總線鎖閉。AT91RM9200為Atmel公司生產的ARM9為核心的處理器,其中引腳D0-D15為數據總線,A2-A8為地址總線的一部分,CS3為片選信號線,當ARM對總線地址范圍為0x40000 0000~0x4FFF FFFF的外部設備進行操作時,會在該引腳產生一個片選信號。同時該信號控制SN74LVTH16245的使能端,避免在讀寫其他地址時對HPI端口造成影響。TMS320C6711D是TI公司生產的DSP,每秒可以完成15億次浮點運算,數據處理功能十分強大。引腳D0-D15為數據總線。其余端口是HPI接口的控制引腳。
4 驅動程序設計
4.1 Linux驅動程序簡介
在Linux操作系統下有二種方式將驅動程序裝入操作系統內核:一種是直接將驅動程序編譯進內核,另外一種是將驅動程序構建為驅動程序模塊后采用insmod/rmmod命令將模塊加載內核中。由于是在嵌入式系統中進行程序開,所以筆者選用了模塊加載方式。這樣,在整個程序的調試過程中不必因為修改某處而反復編譯整個內核,只需編譯驅動程序模塊并重新加載。
本例中Linux下的驅動程序主要用來完成文件(Linux把外部設備也認為是文件)的打開、關閉、讀、寫等操作。也就是對如下結合的填充。
Static struct file_operations fops=
{open:hpi_open,
release:hpi_release,
mmap:hpi_mmap,
};
其中,open和release完成設備的打開和關閉。mmap為內存地址映射操作。因為采用的是模塊加載方式,所以還應該加上int init_module(void)和void cleanup_module(void)函數,以完成模塊的注冊和卸載。
4.2 驅動程序中映射的實現
由于驅動程序的內存空間是在內核空間中,因此首先應解決內核空間與用戶空間的交互問題。這里采用最直接的方式將內核空間和用戶空間聯系起來實現映射,即利用remap_page_range內核函數(通過mmap系統調用實現)。
函數原形如下:
int remap_page_range(unsigned long virt_add,unsigned long phys_add,unsigned long size,pgprot_tprot);
函數的功能是構造用于映射一段物理地址的新頁表。函數返回的值通常是0或者一個負的錯誤碼。函數參數的確切含義如下:
virt_add:重映射起始處的用戶虛擬地址。phys_add:虛擬地址所映射的物理地址。Size:被重映射的區域的大小。Prot:新VMA(virtual memory area)的“保證(protection)”標志。具體定
摘要:本文通過一個開發實例詳細說明如何通過DSP的HPI接口與運行Linux操作系統的ARM架構處理器進行數據通信。給出接口部分的實際電路和ARM-Linux下驅動程序的開發過程。
關鍵詞:設備驅動程序 嵌入式Linux HPI ARM DSP
1 引言
基于ARM核心處理器的嵌入式系統以其自身資源豐富、功耗低、價格低廉、支持廠商眾多的緣故,越來越多地應用在各種需要復雜控制和通信功能的嵌入式系統中。
內核源碼開放的Linux與ARM體系處理器相結合,可以發揮Linux系統支持各種協議及存在多進程調度機制的優點,從而使開發周期縮短,擴展性增強。作為數字處理專用電路,DSP的數字信號處理能力十分強大,但對諸如任務管理、通信、人機交互等功能的實現較為困難。
如果將這三者結合起來,即由DSP結合采樣電路采集并處理信號,由ARM處理器作為平臺,運行Linux操作系統,將經過DSP運算的結果發送給用戶程序進行進一步處理,然后提供給圖形化友好的人機交互環境完成數據分析和網絡傳輸等功能,就會最大限度的發揮三者所長。
2 系統結構
該系統硬件由二部分組成,其中一部分為若干塊DSP板,各自獨立承接數據采集和信號處理。另一部分為以ARM為核心處理器的CPU板。系統硬件框圖如圖1所示(僅接口部分)。
3 接口硬件部分設計
3.1 HPI接口簡介
HPI接口是TI公司新一代、高性能DSP上用以完成與主機或其他DSP之間數據交換的接口,這里主要介紹實際電路中使用的控制引腳和時序。
HCNTL0和HCNTL1為訪問控制選擇。用來確定主機(ARM)究竟對TMS320C6711中的哪一個HPI寄存器進行處理。具體功能如表1所列。
表1 HCNTL0和HCNTL1的功能
HR/W:讀寫選擇控制。為“1”表示是從DSP中讀,反之則為寫。
HHWIL:半字節定義選擇,與HPIC寄存器中的HWOB位進行配合可以選擇當前傳輸的是高半字還是低半字。低電平是第一個半字,高電平是第二個半字。
HCS:選通脈沖(Strobe),與HDS1、HDS2相互配合完成內部信號HSTROBE的生成。邏輯關系如圖2所示。
將HDS1、HDS2分別固定為高電平和低電平,這樣HCS就和HSTROBE完全一致。
HSTROBE讀時序如圖3所示。
3.2 接口電路
ARM處理器通過DSP的HPI接口與DSP進行連接的硬件原理如圖4所示(以單板DSP為例)。其中SN74LVTH16245為16位(二個8位)雙向三態總線收發器,主要起總線驅動和方向控制的作用同時也保證在不對HPI口進行操作時數據總線鎖閉。AT91RM9200為Atmel公司生產的ARM9為核心的處理器,其中引腳D0-D15為數據總線,A2-A8為地址總線的一部分,CS3為片選信號線,當ARM對總線地址范圍為0x40000 0000~0x4FFF FFFF的外部設備進行操作時,會在該引腳產生一個片選信號。同時該信號控制SN74LVTH16245的使能端,避免在讀寫其他地址時對HPI端口造成影響。TMS320C6711D是TI公司生產的DSP,每秒可以完成15億次浮點運算,數據處理功能十分強大。引腳D0-D15為數據總線。其余端口是HPI接口的控制引腳。
4 驅動程序設計
4.1 Linux驅動程序簡介
在Linux操作系統下有二種方式將驅動程序裝入操作系統內核:一種是直接將驅動程序編譯進內核,另外一種是將驅動程序構建為驅動程序模塊后采用insmod/rmmod命令將模塊加載內核中。由于是在嵌入式系統中進行程序開,所以筆者選用了模塊加載方式。這樣,在整個程序的調試過程中不必因為修改某處而反復編譯整個內核,只需編譯驅動程序模塊并重新加載。
本例中Linux下的驅動程序主要用來完成文件(Linux把外部設備也認為是文件)的打開、關閉、讀、寫等操作。也就是對如下結合的填充。
Static struct file_operations fops=
{open:hpi_open,
release:hpi_release,
mmap:hpi_mmap,
};
其中,open和release完成設備的打開和關閉。mmap為內存地址映射操作。因為采用的是模塊加載方式,所以還應該加上int init_module(void)和void cleanup_module(void)函數,以完成模塊的注冊和卸載。
4.2 驅動程序中映射的實現
由于驅動程序的內存空間是在內核空間中,因此首先應解決內核空間與用戶空間的交互問題。這里采用最直接的方式將內核空間和用戶空間聯系起來實現映射,即利用remap_page_range內核函數(通過mmap系統調用實現)。
函數原形如下:
int remap_page_range(unsigned long virt_add,unsigned long phys_add,unsigned long size,pgprot_tprot);
函數的功能是構造用于映射一段物理地址的新頁表。函數返回的值通常是0或者一個負的錯誤碼。函數參數的確切含義如下:
virt_add:重映射起始處的用戶虛擬地址。phys_add:虛擬地址所映射的物理地址。Size:被重映射的區域的大小。Prot:新VMA(virtual memory area)的“保證(protection)”標志。具體定