摘要:本文通過一個開發實例詳細說明如何通過DSP的H">

欧美成人aaaaa免费视频_亚洲欧美激情小说另类_欧美激情一区二区三区视频_一级在线|欧洲

  • <dfn id="wo46q"></dfn>
    <kbd id="wo46q"><del id="wo46q"></del></kbd>
  • 技術頻道

    嵌入式Linux下ARM處理器與DSP的數據通信


    摘要:本文通過一個開發實例詳細說明如何通過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的功能

    HCNTL00011
    HCNTL1

    功 能

    0 主機對HPI控制寄存器(HPIC)進行讀寫
    1 主機對HPI地址寄存器(HPIA)進行讀寫
    0 主機對HPI數據寄存器(HPID)地址自動增加模式(Auto increment mode)進行讀寫,對HPID讀寫后,地址寄存器(HPIA)自動增加一個字地址(4字節地址)
    1 主機對HPI數據寄存器(HPID)地址固定模式(Fixed mode)進行讀寫。對HPID讀寫后,地址寄存器(HPIA)保持不變

    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)”標志。具體定義在源泉文件/include/linux/mm.h中。系統調用MMAP的程序代碼如下:

    static int hpi_mmap(struct file *f,struct vm_area_struct *vma)

    vma->vm_flags|=VM_WRITE;

    if(remap_page_range(vma->vm_start,((0x40000000)),

    vma->vm_end-vma->vm_start,(_pgprot (pgprot_val(pgprot_noncached(vma->vm_page_prot))|

    (L_PTE_WRITE|L_PTE_DIRTY))))) //進行映射

    {return -1;} //映射失敗

    return 0;

    }

    結合硬件結構可對函數remap_page_range()分別填充如下參數:

    remap_page_range(vma->vm_start,((0x40000000)),vma->vm_end-vma->vm_start,(__pgprot(pgprot_val(pgprot_noncached(vma->vm_page_prot)) |(L_PTE_WRITE|L_PTE_DIRTY)))))

    其中vma為結合vm_area_struct,在<linux/mm.h>中定義。

    應用中需要注意以下字段:unsigned long vm_flags應該使用標志VM_RESERVED,以避免內存管理系統將該VMA交換出去。因為要對DSP寫入數據,所以必須使用標志VM_WRITE說明對這一段VMA是允許寫入的。pgport_t vm_page_prot指明了對VMA的保護權限。由于利用CS3對DSP的HPI接口進行控制,所以應用pgprot_noncached禁止高速緩沖。

    通過mmap的構建就能夠將內核空間的數據映射到用戶空間去,也就是說可以在用戶空間內直接對地址為0x4000_0000的內存空間進行操作,而該段空間正是DSP的HPI接口所對應的地址。

    在實際應用中,應對CS3的低電平脈寬加以控制,方法是在初始化模塊時對ARM的控制寄存器CSR[3]進行調節。該寄存器的D0-D6確定了ARM外部總線的時鐘延時周期,D7為等待周期的使能,D12-D14為數據寬度。具體定義如下:AT91_SYS->EBI_SMC2_CSR[3]=0x00003083,即使用16bit數據寬度,等待周期為3個。當ARM主頻為180MHz時,CS3低電平脈寬約為150ns。

    4.3 驅動程序的系統調用接口

    為對處于總線地址0x4000_0000的DSP板進行操作,首先應用open打開設備,該設備可以通過mknod建立(本例建立的是/dev/hpi)。然后mmap完成映射。

    Int dev_hpi_open(str_HPI *ss)

    {size_t length=1024;

    int i;

    if((*ss).hpi_number==0)

    {

    (*ss).hpi_fd=open("/dev/hpi",O_RDWR);

    }

    if((*ss).hpi_fd==-1)return -1;

    (*ss).hpi_mmap_start =mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_SHARED,((*ss).hpi_fd),0); //獲得映射區內存的起始地址

    return 0;

    } //dev_hpi_open

    mmap的作用是將文件內容映射到內存中。函數的原形及各參數定義如下:

    *mmap(void *start,size_length,int prot,int flags,intfd,off_t offset)

    start指向欲對應的內存地址,size-length的含義是要映射的量;prot代表映射區域的保護方式;flag會影響映射區域的各種特性;fd為文件描述符;offtoffset代表文件的偏移量,通常設置為零。

    示例程序中的結構體變量ss用來總知各種變量。通過mmap可以獲得映射后的內存地址,用(*ss).hpi_mmap_start表示。

    一旦獲得了這個起始地址,就能對0x4000_0000起始的總線地址進行操作,因為映射已經完成,對(*ss).hpi_mmap_start的操作就是對0x4000_0000起始的總線地址進行操作,而DSP板HPI接口的控制線正是在這個位置。這樣就實現了物理地址和用戶空間的轉換。

    4.4 用戶程序接口部分

    下面以HPI接口讀寫中最復雜的自增讀方式用戶程序為例說明用戶接口程序的設計過程。要完成自增讀的操作,對于HPI一側,假設采用軟件握手的方式。要完成的工作如下:

    首先讀HPIC以查詢其中的HRDY位是否為1,如果為1則表示DSP中數據已經備妥。然后寫HPIA以告訴DSP從什么位置開始進行自增讀。接著將HPIC的FETCH位置1以刷新寫入。再讀HPIC以查詢其中的HRDY位是否為1,如果為1則表示DSP中數據已經備妥。最后從HPID中讀取數據。

    對于ARM一側,要對HPIC、HPID、HPIA寄存器進行讀寫必須滿足HPI接口的定義,具體如下(以自增讀為例):

    讀前半字節(高16位)時,HCNTL0=0、HCNTL1=1、HR/W=1、HHWRL=0。

    讀后半字節(低16位)時,HCNTL0=0、HCNTL1=1、HR/W=1、HHWRL=0。

    從硬件的原理圖可知,這些HPI的控制口線分別與ARM的一部分地址總線連接。具體為HCNTL0----A2、HCNTL1----A3、HR/W------A4、HHWIL-----A5。

    宏定義過程如下:

    #define HPIC_R_F(HPI_VA_BASE)*((unsigned long*)((HPI_VA_BASE)+0x00000004+DSPNUMBER))

    //讀HPIC第一半字

    #define HPIC_R_S(HPI_VA_BASE)*((unsigned long*)((HPI_VA_BASE)+0x0000000C+DSPNUMBER))

    //讀HPIC第二半字

    等等,只要改變在HPI_BA_BASE基礎上增加的數字就可以獲取對控制口線的操作。

    在這里HPI_VA_BASE將由映射得到的用戶空間虛擬地址代替,所以如果“自增模式讀HPID第一半字”那么就可求滿足前文提到的HCNTL0=0、HCNTL1=1、HR/W=1、HHWRL=0,也就是要滿足地址位A2=0、A3=1、A4=1、A5=0,所以只要在HPI_VA_BASE的基礎上加0x0000_0006就可以了。要注意的是ARM處理器的地址是32位。所以是加上0x0000_0006而不是0x0000_0018。

    另外,還有二點需要說明:

    通過改變宏定義中的DSPNUMBER常量可以控制地址總線A6、A7、A8。通過這3個總線組合并通過簡單地址譯碼電路就可以完成對多塊DSP板的讀寫。在硬件電路中可以定義為0。

    A4(HR/W)同時還用做SN74LVTH16245的方向控制。讀的時候A4=1,此時SN74LVTH16245的數據從A-->B;反之,則從B-->A。

    下面給出程序中的自增讀和注釋部分:

    int dev_hpi_auto1(str_HPI *ss)

    {volatile unsigned long dsp_addr_hign_read_auto;//定義各種中間變量

    volatile unsigned long dsp_addr_low_read_auto;

    volatile unsigned long dsp_data_hign_read_auto;

    volatile unsigned long dsp_data_low_read_auto;

    volatile unsigned long dsp_add_temp;

    int i;

    volatile unsigned long data_length;

    //---read hpic----the host polls the HPIC for HRDY=1

    volatile unsigned long polltest;

    polltest=HPIC_R_F((*ss).hpi_mmap_start);

    while((polltest&0x00000008)!=0x00000008)

    {polltest=HPIC_R_F((*ss).hpi_mmap_start);

    }

    dsp_add_temp=((*ss).hpi_dsp_add);//從應用程序傳過來的參數,指明希望從DSP的哪一個地址讀起

    dsp_addr_low_read_auto=((dsp_add_temp)&0x0000ffff)+((dsp_add_temp)<<16); //完成數據轉換

    dsp_addr_hign_read_auto=((dsp_add_temp)&0xffff0000)+((dsp_add_temp)>>16);

    //---write dsp s addr to HPIA

    HPIA_W_F ((*ss).hpi_mmap_start)=(dsp_addr_hign_read_auto);

    HPIA_W_S((*ss).hpi_mmap_start)=(dsp_addr_low_read_auto);

    //--------write hpic----------to FETCH bit

    HPIC_W_F((*ss).hpi_mmap_start)=0xfff8fff8;

    HPIC_W_S((*ss).hpi_mmap_start)=0xfff8fff8;

    //---read dsp s data from HPID,autoincrement mode

    data_length=(*ss).hpi_dsp_data_length;//從應用程序傳過來的參數,指明期望讀取多少個字

    for(i=0;i<=data_length;i++)

    {//---read hpic----the host polls the HPIC for HRDY=1 again

    polltest=HPIC_R_F((*ss).hpi_mmap_start);

    while((polltest&0x00000008)!=0x00000008)

    {polltest=HPIC_R_F((*ss).hpi_mmap_start);

    }

    dsp_data_hign_read_auto =HPID_R_F_A((*ss).hpi_mmap_start); //讀第一個半字。

    dsp_data_low_read_auto =HPID_R_S_A((*ss).hpi_mmap_start); //第二個個半字

    {(*ss).buffer [(i)]=(dsp_data_hign_read_auto&oxffff0000)+(dsp_data_low_read_auto&0x0000ffff);

    //數據拼接,放入結構體,回傳給調用的用戶程序。

    }

    }

    } //dev_hpi_read_auto(str_HPI *ss)

    5 結束語

    本文通過一個實例說明了如何實現在Linux操作系統下ARM體系結構的處理器與DSP的數據通信。給出了接口部分的硬件處理和部分驅動程序。

    在某款智能儀表的研發過程中,給出一個簡單的地址譯碼電路對二塊(或更多)DSP板進行交替讀寫,并以自增讀方式進行操作,當ARM主頻為180MHz,DSP主頻為125MHz時,對DSP數據的讀寫速度可以達到每毫秒1k的32位字。

    文章版權歸西部工控xbgk所有,未經許可不得轉載。

    欧美成人aaaaa免费视频_亚洲欧美激情小说另类_欧美激情一区二区三区视频_一级在线|欧洲

        9000px;">

            亚洲蜜臀av乱码久久精品| 韩国欧美国产一区| 在线视频国产一区| 亚洲图片欧美综合| 日韩一区二区三免费高清| 一本一本大道香蕉久在线精品| 日韩电影在线观看电影| 久久久夜色精品亚洲| 欧美日韩免费观看一区二区三区| 在线观看日韩一区| 国产精品久久久久久一区二区三区| 94-欧美-setu| 91成人在线精品| 欧美体内she精视频| 欧美亚洲国产怡红院影院| 在线免费视频一区二区| 日韩一区二区在线观看视频播放| 91精品国产欧美一区二区18| 欧美一区二区高清| 亚洲色欲色欲www| 爽爽淫人综合网网站| 国产一区激情在线| 91免费版pro下载短视频| 欧美一级理论性理论a| 日韩亚洲电影在线| 国产精品激情偷乱一区二区∴| 洋洋av久久久久久久一区| 日日夜夜精品视频免费| 成人a区在线观看| 日韩精品综合一本久道在线视频| 国产欧美精品日韩区二区麻豆天美| 中文字幕在线播放不卡一区| 亚洲第一搞黄网站| 色婷婷精品久久二区二区蜜臂av| 日韩一区二区三区在线观看| 自拍偷拍亚洲激情| 91亚洲精品乱码久久久久久蜜桃 | 精品久久国产97色综合| 婷婷成人综合网| 欧美最新大片在线看| xfplay精品久久| 亚洲成人动漫精品| 国产视频911| 日韩欧美一级二级| 在线视频国内一区二区| 久久国产精品99精品国产| 欧美激情艳妇裸体舞| 91麻豆精品国产无毒不卡在线观看| 伦理电影国产精品| 亚洲地区一二三色| 亚洲免费观看高清完整版在线观看| 亚洲男人的天堂网| 日本欧美在线观看| 久久亚洲春色中文字幕久久久| 国产精品18久久久久久久久 | 午夜精品视频一区| 久久久www免费人成精品| 972aa.com艺术欧美| 国产中文字幕一区| 亚洲一区二区三区小说| 精品sm捆绑视频| 91久久奴性调教| 韩国v欧美v亚洲v日本v| 亚洲免费看黄网站| 中文字幕av一区二区三区| 日韩视频免费观看高清完整版 | 日本精品一区二区三区高清 | 日韩高清在线不卡| 亚洲丝袜美腿综合| 久久精品99国产精品| 成人av在线一区二区| 欧美最猛黑人xxxxx猛交| 国产午夜精品一区二区三区四区| 午夜婷婷国产麻豆精品| 91精品国产综合久久久久久| 国内精品免费在线观看| 国产精品久久久久久久久免费桃花| 欧美色图第一页| 在线免费观看日本一区| 在线视频欧美精品| 色就色 综合激情| 日本精品一区二区三区高清 | 亚洲日本成人在线观看| 日本一区二区视频在线| 中文字幕av一区二区三区| 日韩欧美国产成人一区二区| 国产女人aaa级久久久级| 国产亚洲精品精华液| 国产校园另类小说区| 日本一区二区久久| 一区二区三区欧美视频| 一区二区三区欧美亚洲| 日日嗨av一区二区三区四区| 全部av―极品视觉盛宴亚洲| 国产乱人伦精品一区二区在线观看| 国产成+人+日韩+欧美+亚洲| 91在线视频网址| 日韩欧美高清dvd碟片| 国产日韩欧美精品在线| 亚洲一区二区三区四区五区黄 | 精品免费99久久| 国产亚洲综合性久久久影院| 国产精品福利影院| 日韩激情av在线| 99久久综合99久久综合网站| 欧美一区二区三区男人的天堂| 欧美国产欧美亚州国产日韩mv天天看完整 | 国产一区二区三区免费播放| 成人午夜视频网站| 日韩精品一区国产麻豆| 亚洲男人天堂av| 欧美日本国产视频| 亚洲裸体xxx| www.av亚洲| 国产精品理论片| 国产精品正在播放| 精品国产欧美一区二区| 日韩主播视频在线| 欧美久久久久久蜜桃| 亚洲成人久久影院| 91麻豆精品久久久久蜜臀| 午夜不卡在线视频| 欧美日韩高清在线播放| 日韩影院免费视频| 欧美一区二区久久| 国产乱码字幕精品高清av| 国产欧美精品在线观看| 国产成人夜色高潮福利影视| 欧美高清一级片在线观看| 高清shemale亚洲人妖| 国产精品国产a级| 在线观看日韩av先锋影音电影院| 一区二区三区国产精华| 欧美视频精品在线观看| 日韩综合小视频| 中文字幕成人av| 色综合中文字幕国产 | 国产日韩av一区二区| 国模大尺度一区二区三区| 欧美国产精品专区| 欧美三片在线视频观看| 亚洲无线码一区二区三区| 欧美v日韩v国产v| 99精品视频一区二区三区| 亚洲综合在线观看视频| 国产aⅴ综合色| 成人动漫一区二区在线| 欧美日韩久久不卡| 国产精品美女久久久久久久久| 色先锋aa成人| 欧美一区二区久久久| 久久久久综合网| 日韩毛片视频在线看| 亚洲国产精品一区二区www| 另类小说色综合网站| 成人av资源在线| 日韩精品一区二区三区视频播放 | 欧美日韩视频第一区| 91丨porny丨最新| 欧美少妇bbb| 国产亚洲精品久| 亚洲精选在线视频| 日韩精品一二三四| 风流少妇一区二区| 欧美三级一区二区| 日韩欧美123| 国产精品久久久久久久久久久免费看| 久久精品一级爱片| 26uuu另类欧美亚洲曰本| 国产精品久久777777| 青青青伊人色综合久久| 成人激情文学综合网| 粉嫩蜜臀av国产精品网站| 欧美日韩精品是欧美日韩精品| 中文字幕久久午夜不卡| 久久99最新地址| 日韩午夜激情电影| 亚洲精品网站在线观看| 豆国产96在线|亚洲| 欧美在线视频日韩| 国产日韩欧美不卡在线| 热久久久久久久| 欧美日韩日日摸| 日本午夜一区二区| 欧美日韩高清影院| 爽爽淫人综合网网站| 日韩精品专区在线影院观看| 久草中文综合在线| 欧美国产欧美综合| 在线视频综合导航| 一区二区三区日韩精品视频| 粉嫩av一区二区三区在线播放 | 欧美一级夜夜爽| 国产精品伦理在线| 国产伦精品一区二区三区免费| 欧美日韩中字一区| 青草av.久久免费一区| 国产欧美一区二区精品仙草咪| 成人av网站在线观看免费| 亚洲在线视频一区|