專利名稱:一種VxWorks操作系統(tǒng)中實現(xiàn)驅(qū)動1394設備的方法和系統(tǒng)的制作方法
技術領域:
本發(fā)明涉及計算機技術領域,更具體地說,涉及一種VxWorks操作系統(tǒng)中實現(xiàn)驅(qū) 動1394設備的方法和系統(tǒng)。
背景技術:
IEEE (Institute of Electrical and Electronics Engineers,美國電氣禾口電子 工程師協(xié)會)1394是由蘋果(APPLE)公司提出的一種高速串行接口標準,蘋果公司稱之 為FireWire (火線),索尼(Sony)稱之為i. Link,德州儀器(Texas Instruments)稱之為 Lynx。1995 年,IEEE 制定并頒布了 IEEE 1394-1995 標準,并在 2000 年推出了 IEEE 1394A 標準,可以支持100Mbps、200Mbps和400Mbps的傳輸速率。在最新的IEEE1394B標準中,支 持的傳輸速率提高到了 800Mbps、1. 6Gbps和3. 2Gbps。IEEE1394總線除了傳輸速率高外,還具有接口簡單,使用方便,良好的兼容性和可 升級性等優(yōu)點,并且可以獨立于主機,支持點到點的連接,各個節(jié)點可以脫離主機自主執(zhí)行 事務。該標準自發(fā)布以來已經(jīng)得到了很多國內(nèi)外的知名IT廠商的關注和大力的支持,許多 廠商為了使該技術能夠廣泛應用和推廣,而設計出基于OHCI規(guī)范的鏈路層芯片,使得通過 CPU控制鏈路層芯片來實現(xiàn)點到點的數(shù)據(jù)交互成為一種可能。VxWorks操作系統(tǒng)是美國WindRiver公司于1983年設計開發(fā)的一種嵌入式實時操 作系統(tǒng)(Real-Time Operating System,RT0S),是嵌入式開發(fā)環(huán)境的關鍵組成部分。其良好 的持續(xù)發(fā)展能力、高性能的內(nèi)核、高可靠性和卓越的實時性被廣泛應用在通信、軍事、航空、 航天等精尖技術及實時性要求極高的領域中。作為一個計算機系統(tǒng),不可避免的需要使用 外部1/0設備,正是1/0設備的驅(qū)動程序為其提供了可訪問性和可操作性。目前,Vxfforks 操作系統(tǒng)提供了對多種1/0設備驅(qū)動程序包括串口、并口、網(wǎng)卡、ATA等的支持,但是沒有提 供對具有1394標準接口的外部設備(簡稱1394設備)的驅(qū)動支持,而鑒于1394設備的應 用日益廣泛和諸多的優(yōu)越性,在VxWorks操作系統(tǒng)中實現(xiàn)驅(qū)動1394設備是非常有必要的。
發(fā)明內(nèi)容
本發(fā)明的目的在于針對現(xiàn)有技術的不足和缺陷,提供一種在VxWorks操作系統(tǒng)中 實現(xiàn)驅(qū)動具有1394設備的方法和系統(tǒng)。為實現(xiàn)上述目的,本發(fā)明實施例提供了如下技術方案一種VxWorks操作系統(tǒng)中 實現(xiàn)驅(qū)動1394設備的方法,包括步驟a)初始化;b)中斷處理;c)使能DMA讀寫,接收和發(fā)送數(shù)據(jù)。所述a)初始化進一步包括步驟al)設置鏈路層寄存器和物理層寄存器,使寄存器處于準備狀態(tài);a2)初始化DMA接收描述符和DMA發(fā)送描述符;
4
a3)安裝中斷服務程序,通過設置鏈路層芯片的中斷屏蔽寄存器來使中斷打開;a4)軟復位總線,使能鏈路層。所述al)設置鏈路層寄存器和物理層寄存器,使寄存器處于準備狀態(tài)具體包括步 驟設置總線選項寄存器;設置主機控制器控制寄存器LPS位;設置節(jié)點標識和狀態(tài) 寄存器中的總線號;使能PostedWrites位;清除鏈路層控制寄存器;使能周期定時器和周 期控制器;清除中斷寄存器;設置自標識DMA緩存區(qū)并使能自標識DMA ;設置配置ROM映射 寄存器并初始化ConfigROM ;獲得最大數(shù)據(jù)包的大小,單位為字節(jié);設置異步接收過濾寄存 器;設置字節(jié)交換。所述a2)初始化DMA接收描述符和DMA發(fā)送描述符具體包括步驟確定需要的發(fā)送描述符和接收描述符的個數(shù);為發(fā)送數(shù)據(jù)和接收數(shù)據(jù)分配內(nèi)存空間;初始化發(fā)送描述符鏈表和接收描述符鏈表;將每一個描述符鏈表的頭節(jié)點的地址賦值到相應的命令寄存器中,DMA控制器根 據(jù)寄存器中的地址來進行命令解析。所述為發(fā)送和接收數(shù)據(jù)分配內(nèi)存空間具體實現(xiàn)為一次性在物理內(nèi)存空間內(nèi)開辟 一段連續(xù)的空間,分別存儲發(fā)送和接收的數(shù)據(jù)包,所述連續(xù)空間劃分成若干相等的內(nèi)存塊。 發(fā)送緩沖區(qū)的單個內(nèi)存塊的大小是一個最大的數(shù)據(jù)包的大小,接收緩沖區(qū)的單個內(nèi)存塊大 小是一個最大的數(shù)據(jù)包的大小的整數(shù)倍,整個存儲空間是靜態(tài)的,在運行過程中不釋放。所述DMA的讀操作包括步驟接收數(shù)據(jù)包上下文處理任務接收到DMA的中斷產(chǎn)生 的信號后,在當前的接收描述符中查詢是否有數(shù)據(jù)包過來,并且判斷是否有跨描述符,然后 根據(jù)獲得的信息將接收數(shù)據(jù)包的地址和大小一起通過消息隊列的方式傳遞給解包任務。所述DMA的寫操作包括步驟應用程序?qū)⑿枰l(fā)送的數(shù)據(jù)包封裝好后,先將數(shù)據(jù) 包的信息放入到一個動態(tài)的鏈表中,然后依次從按照發(fā)送描述符的格式來插入到發(fā)送描述 符鏈表中,通過設置相應的寄存器來啟動DMA的發(fā)送,當發(fā)送第一個數(shù)據(jù)包完畢后會產(chǎn)生 一個發(fā)送完成中斷,在該中斷中會繼續(xù)從動態(tài)鏈表中獲取數(shù)據(jù)包插入到描述符鏈表中,直 到完成全部數(shù)據(jù)包的發(fā)送。所述中斷包括不可恢復性中斷,循環(huán)連續(xù)包中斷,總線復位中斷,請求發(fā)送完成 中斷,響應發(fā)送完成中斷,請求包中斷,響應包中斷,等時接收中斷,等時發(fā)送中斷和自標識 包中斷。一種VxWorks操作系統(tǒng)中實現(xiàn)驅(qū)動1394設備的系統(tǒng),包括初始化單元,用于設置鏈路層芯片的相關寄存器和物理層寄存器的相關位,使處 于準備狀態(tài),初始化DMA接收描述符和DMA發(fā)送描述符;中斷處理單元,用于處理各類中斷;數(shù)據(jù)發(fā)送單元,以DMA方式發(fā)送數(shù)據(jù);數(shù)據(jù)接收單元,以DMA方式接收數(shù)據(jù)。
所述初始化單元進一步包括 寄存器初始化單元,用于設置總線選項寄存器;設置主機控制器控制寄存器中的 LPS位;設置節(jié)點標識和狀態(tài)寄存器中的總線號;使能PostedWrites位;清除鏈路層控制
5寄存器;使能周期定時器和周期控制器;清除中斷寄存器;設置自標識DMA緩存區(qū)并使能自 標識DMA ;設置配置ROM映射寄存器并初始化ConfigROM ;獲得最大包的大小,單位為字節(jié); 設置異步接收過濾寄存器;設置字節(jié)交換;內(nèi)存分配單元,用于一次性在物理內(nèi)存空間內(nèi)開辟一段連續(xù)的空間,分別存儲發(fā) 送和接收的數(shù)據(jù)包,所述連續(xù)空間劃分成若干相等的內(nèi)存塊;DMA描述符初始化單元,用于初始化DMA發(fā)送描述符鏈表和DMA接收描述符鏈表;中斷掛接單元,用于掛接中斷服務程序??梢姡c現(xiàn)有技術相比,本發(fā)明實施例提供的技術方案,實現(xiàn)了在VxWorks操作系 統(tǒng)中驅(qū)動1394設備。
圖1為IEEE 1394硬件拓撲結(jié)構示意圖;圖2為IEEE 1394協(xié)議棧結(jié)構示意圖;圖3為IEEE 1394驅(qū)動架構示意圖;圖4為IEEE 1394B兩個設備之間的數(shù)據(jù)包流向圖;圖5為本發(fā)明實施例提供的一種內(nèi)存空間分配示意圖;圖6為本發(fā)明實施例DMA接收描述符鏈表結(jié)構示意圖;圖7為本發(fā)明實施例數(shù)據(jù)包接收數(shù)據(jù)流示意圖;圖8為本發(fā)明實施例DMA發(fā)送描述符鏈表結(jié)構示意圖;圖9為本發(fā)明實施例數(shù)據(jù)包發(fā)送數(shù)據(jù)流示意圖;圖10為本發(fā)明實施例提供的一種VxWorks操作系統(tǒng)中實現(xiàn)驅(qū)動1394設備的方法 流程圖;圖11為本發(fā)明實施例提供的一種VxWorks操作系統(tǒng)中實現(xiàn)驅(qū)動1394設備的系統(tǒng) 結(jié)構示意圖。
具體實施例方式下面將結(jié)合附圖及實施例對本發(fā)明作進一步說明,本發(fā)明實施例以在VxWorks操 作系統(tǒng)中驅(qū)動具有1394標準接口的外部設備,特別是以驅(qū)動德州儀器(Tl)公司推出的 OHCI (Open Host Controller Interface)鏈路層芯片和物理層芯片為例來詳細說明。1394總線的拓撲結(jié)構是一個樹形的結(jié)構,樹形結(jié)構就是所有連接在一起的設備不 能形成一個環(huán)(圈),否則就不能正常地工作,但是IEEE 1394B提出了一個避免環(huán)狀結(jié)構的 方法,即使設備連接形成一個環(huán)(圈)也能正常工作。請參閱圖1所示,圖1為IEEE 1394B總線硬件拓撲結(jié)構。一個IEEE1394系統(tǒng)由 眾多可尋址的節(jié)點(node)組成,節(jié)點(node)是一個1394網(wǎng)絡中的基本組成單位。請參閱圖2所示,圖2為IEEE1394協(xié)議棧結(jié)構示意圖。IEEE 1394標準定義了三 個基本協(xié)議層,分別是事務層,鏈路層,物理層,用于在請求者和響應者之間的數(shù)據(jù)傳輸過 程中完成相關的服務,后來新增加了總線管理層和應用層,每層負責完成自己的服務。本發(fā) 明實施例是基于鏈路層中的異步傳輸模式來實現(xiàn)驅(qū)動的。請參閱圖3所示,圖3為IEEE1394B驅(qū)動架構示意圖,本發(fā)明實施例驅(qū)動只實現(xiàn)了協(xié)議棧中的數(shù)據(jù)鏈路層,提供了一些應用程序接口函數(shù)給用戶,可以直接在應用層上調(diào)用 該接口函數(shù)來進行數(shù)據(jù)包的DMA傳送,將數(shù)據(jù)通過物理層和傳輸線纜到達接收的節(jié)點。請參閱圖4所示,圖4為IEEE 1394B兩個設備之間的數(shù)據(jù)包流向圖,在點對點的 數(shù)據(jù)傳輸中,節(jié)點一(發(fā)送端設備)中由應用程序來進行發(fā)起一個請求包,通過發(fā)送端的 DMA經(jīng)由1394的線纜傳送到節(jié)點二(接收端設備),節(jié)點二通過接收DMA接收到數(shù)據(jù)包后 傳遞給接收任務,接收任務根據(jù)包格式解包后發(fā)送一個響應數(shù)據(jù)包,通過其發(fā)送DMA經(jīng)由 1394線纜傳送到節(jié)點一,然后節(jié)點一的接收DMA接收到響應數(shù)據(jù)包后傳遞給接收任務,這 樣完成了 一次數(shù)據(jù)交互的過程。數(shù)據(jù)鏈路層主要實現(xiàn)了接收DMA和發(fā)送DMA的數(shù)據(jù)描述符鏈表,該鏈表在內(nèi)存中 被維護,通過該鏈表和DMA控制器進行通訊。請參閱圖5所示,本發(fā)明采用統(tǒng)一的內(nèi)存分配方案,即在初始化過程中,在物理內(nèi) 存中開辟一段連續(xù)的空間,分別存儲發(fā)送和接收的數(shù)據(jù)包。整個存儲空間為靜態(tài)的,在運行 過程中不釋放。用于發(fā)送數(shù)據(jù)包的單個內(nèi)存塊的大小是一個最大的數(shù)據(jù)包的大小,用于接 收數(shù)據(jù)包的單個內(nèi)存塊大小是一個最大的數(shù)據(jù)包的大小的整數(shù)倍。目前,1394 OHCI (Open Host Controller Interface,開放式主機控制接口協(xié) 議)支持7種DMA (Direct Memory Access,直接內(nèi)存訪問)類型,每種DMA類型都有自己 的寄存器空間,并且至少支持一個“邏輯數(shù)據(jù)流上下文(Context)”,即DMA通道。每個DMA 通道由一個DMA上下文鏈表(Context program)和另外兩個寄存器上下文控制寄存器 (ContextControl register)和命令地址寄存器(CommandPtr register)組成。上下文鏈 表是指DMA描述符鏈表,這個鏈表位于主內(nèi)存中。描述符鏈表中的每個描述符定義了待傳 輸?shù)臄?shù)據(jù)包格式和控制信息,并由相應的DMA控制器將數(shù)據(jù)放入對應的FIFO (First Input First Output,先進先出)數(shù)據(jù)緩存器中,然后發(fā)出中斷請求。上下文控制寄存器可以控制 DMA的開始和結(jié)束,并返回傳輸狀態(tài);命令地址寄存器用來保存描述符鏈表的開始地址以 及描述符的個數(shù)。為了滿足驅(qū)動程序高效操作和實現(xiàn)的需要,本發(fā)明實施例定義了如下的幾個數(shù)據(jù) 結(jié)構
};DMA發(fā)送描述符結(jié)構體(AT_DMA_PRG)struct at_dma_prg{struct dma_cmd begin ; /* 起始命令描述符,16 字節(jié) */quadlet_t data[4] ; /* 用來存放數(shù)據(jù)包頭 */
DMA接收描述符結(jié)構體(DMA_CMD) struct dma cmd
u32 control ; u32 address ; u32 branchAddress u32 status ;
命令描述符的控制位,32位*/ 數(shù)據(jù)緩沖區(qū)的地址,32位*/ 下一個描述符的地址,32位*/ 狀態(tài)位,32位*/
7
struct dma_cmd end ; /* 結(jié)束命令描述符,16 字節(jié) */quadlet_t pad[4] ;/*需要時用來填充,保證是16字節(jié)對齊*/};DMA接收上下文結(jié)構體(DMA_RCV_CTX)struct dma_rcv_ctx{struct ti_ohci*ohci ;enum context_type type ;/*上下文的類型,是否是異步還是同步*/int ctx ;/*是否是請求上下文還是響應上下文*/unsigned int num_desc ;/氺接收描述符的個數(shù)氺/unsigned int buf_size ;/*用來存放單個DMA接收緩沖區(qū)的大小*/unsigned int split_buf_size ;/*分離的數(shù)據(jù)包緩沖區(qū)分配的大小*/struct dma_cmd#prg_cpu ;/*用來存放指定個數(shù)的接收描述符的首地址 */dma_addr_t氺prg_bus ;quadlet_t#buf_cpu ; /*用來存放第一個單內(nèi)存塊的首地址*/quadlet_t*split_buf ;/*分離包的緩沖區(qū),最大數(shù)據(jù)包的大小,當出現(xiàn)跨描述符時,將分布在兩個描述符對應的接收緩沖區(qū)的數(shù)據(jù)包整合到該內(nèi)存塊中進行處理*/int length ;/*用來存放當前的DMA接收緩沖區(qū)中有效的數(shù)據(jù)的長度*/unsigned int buf_ind ; /*當前的DMA接收描述符的序號*/unsigned int buf_offset ;/*用來存放當前的DMA接收描述符中的有效數(shù)據(jù)的地址偏移量*/quadlet_t*spb ;spinlock_tlock ;int ctrlClear ;/*存放異步接收上下文控制清除寄存器偏移量,通過該數(shù)值 可以用來訪問異步接收上下文控制清除寄存器,可用于停止接收DMA*/int ctrlSet ;/*異步接收上下文控制設置寄存器偏移量,通過該數(shù)值可以用 來訪問異步接收上下文控制設置寄存器,可用于啟動接收DMA*/int cmdPtr ;/*命令指針寄存器偏移量,通過該數(shù)值可以用來訪問命令指針 寄存器,命令指針寄存器存放了第一個有效的接收描述符的地址,通知DMA從該描述符對 應的緩沖區(qū)開始接收數(shù)據(jù)包*/int CtxtMatCh ;};DMA發(fā)送上下文結(jié)構體(DMA_TRM_CTX)struct dma_trm_ctx{struct ti_ohci*ohci ;
enum context_type type ;int ctx ;unsigned int num_desc ; /*用于發(fā)送描述符的個數(shù)*/struct at_dma_prg#prg_cpu ;/*用于保存第一個發(fā)送描述符的內(nèi)存地址 */unsigned int prg_ind ;/*用來記錄當前的描述符的序號*/unsigned int sent_ind ;int free_prgs ;/*空閑的描述符的個數(shù),如果不為0則表示
可以用來發(fā)送數(shù)據(jù)包,如果為0,則不能發(fā)送quadlet_t*branchAddrPtr ;/*用來保存下一個描述符的地址*/struct list_head fifo_list ; /* 一個雙向鏈表,用來鏈接需要發(fā)送的 數(shù)據(jù)包 */struct list_head pending_list ;/* —個雙向鏈表,用來鏈接未發(fā)送的數(shù)據(jù)包 */spinlock_t lock ;int ctrlClear ;/*存放異步發(fā)送上下文控制清除寄存器偏移量,通過該數(shù) 值可以用來訪問異步發(fā)送上下文控制清除寄存器,可用于停止發(fā)送DMA*/int ctrlSet ;/*異步發(fā)送上下文控制設置寄存器偏移量,通過該數(shù)值可以 用來訪問異步發(fā)送上下文控制設置寄存器,可用于啟動發(fā)送DMA*/int cmdPtr ;/*命令指針寄存器偏移量,通過該數(shù)值可以用來訪問命令指針
寄存器,命令指針寄存器存放了第一個有效的發(fā)送描述符的地址,當異步發(fā)送上下文控制 設置寄存器后,DMA將從該描述符開始解析并發(fā)送數(shù)據(jù)包*/};
描述1394 OHCI的結(jié)構體 (TI_0HCI)
struct ti_ohci
{
enum
{
0HCI__INIT_ALL0C_H0ST,
0HCI__INIT__HAVE_MEM_REGION,
0HCI__INIT__HAVE_IOMAPPING,
OHCIINITHAVE CONFIG ROM BUFFER,
0HCI__INIT__HAVE_SELFID_BUFFER,
0HCI__INIT__HAVE_TXRX_BUFFERS_MAYBE,
0HCI__INIT__HAVE_IRQ,
0HCI__INIT__D0NE,
9氺
0138]
0139]
0140]
}init_state ; void氺registers ; quadlet_t*selfid_buf_cpu ;
自標識數(shù)據(jù)包的存放內(nèi)存地址
quadlet_t*csr_config—rom—cpu ; int csr_config—rom—length ; unsigned int max_packet_siζe ; struct dma_rcv_ctx ar_resp_context struct dma_rcv_ctx ar—req—context ; struct dma—trm—ctx at_resp_context struct dma—trm—ctx at—req—context ; struct hpsb—host氺host ; int phyid, isroot ; spinlock—t phy—reg—lock ; spinlock—t event_lock ; int self—id—errors ; unsigned int selfid—swap:1 ; unsigned int no_swap_incoming:1 ; unsigned int check—busreset:1 ;
最大數(shù)據(jù)包的大小*/ ~異步接收響應上下文結(jié)構體*/ ^異步接收請求上下文結(jié)構體*/ 異步發(fā)送響應上下文結(jié)構體*/ 異步發(fā)送請求上下文結(jié)構體*/
0141]
0142]
0143]
0144]
0145]
0146]
0147]
0148]
0149]
0150]
0151]
0152]
0153]
0154]
0155]
0156]};
0157]請參閱圖6所示,圖6為DMA接收描述符鏈表結(jié)構。圖中接收DMA描述符指針(prg_ cpu)用于保存在初始化時由用戶來動態(tài)分配的指定個數(shù)的DMA接收描述符中的第一個描 述符的地址。描述符指針0(prg_cpU
)、描述符指針1 (prg_Cpu[l])、描述符指針2(prg_ cpu [2])、描述符指針3 (prg_cpu [3])到描述符指針N (prg_cpu [N])用于保存動態(tài)分配的每 個描述符的地址。所述控制位(Control),接收緩沖區(qū)地址(Data Address),下一個描述符地址 (Branch Addres)以及狀態(tài)位(Status)組成的一個塊在數(shù)據(jù)結(jié)構上構成一個DMA_CMD結(jié)構 體。需要說明的是,下一個描述符地址(BranchAddress)里面包含了兩部分,一部分是下一 個描述符的地址,一部分是一個4比特的標志位。該標志位用來標識該下一個描述符是否 有效。如果是1則為有效,如果是0則為無效,且表示結(jié)束。第一個描述符中的BanchAddress變量存放了下一個描述符的地址并且該標志位 為1,第二個描述符的BranchAddress變量存放了第三個描述符的地址,并且設置該標志位 為1,依次類推,直到最后一個描述符,最后一個描述符的BranchAddress變量存放了第一 個描述符的地址,但是該標志位為0,表示結(jié)束,這樣形成了一個環(huán)鏈。接收緩沖區(qū)指針(buf_Cpu)用于保存初始化時由用戶分配的指定個數(shù)的DMA接收 緩沖區(qū)的第一個緩沖區(qū)的地址,接收緩沖區(qū)指針0(buf_Cpu
)、接收緩沖區(qū)指針l(buf_ 。 11[1])、接收緩沖區(qū)指針2(1^_叩11[2])到接收緩沖區(qū)指針N(buf_Cpu[N])保存了每一個 DMA接收描述符對應的接收緩沖區(qū)的地址。以上分配好之后,將第一個描述符的地址存放到異步接收命令指針寄存器中,異
10步接收DMA將會從該描述符來執(zhí)行相關操作。當異步接收上下文設置寄存器的DMA啟動位 置位后,那么DMA接收機制將啟動,只要有數(shù)據(jù)包從線纜上發(fā)送過來,該DMA接收控制器就 把數(shù)據(jù)存放到指定的接收緩沖區(qū)。請參閱圖7所示,圖7為數(shù)據(jù)包接收流程示意圖。圖中實線表示一次實際的操作, 而虛線代表依次將要發(fā)生的操作。每個內(nèi)存塊的大小是數(shù)據(jù)包的整數(shù)倍。從內(nèi)存塊1到N 的數(shù)據(jù)包地址和長度通過消息隊列的方式傳遞給解析數(shù)據(jù)包任務。接收數(shù)據(jù)包的流程包括 步驟接收數(shù)據(jù)包時,接收數(shù)據(jù)包上下文處理任務接收到DMA的中斷產(chǎn)生的信號后,在當前 的接收描述符中查詢是否有數(shù)據(jù)包過來,并且判斷是否有跨描述符,然后根據(jù)獲得的信息 將接收數(shù)據(jù)包的地址和大小一起通過消息隊列的方式(Vxworks系統(tǒng)中的功能)傳遞給解 析數(shù)據(jù)包任務,接收的數(shù)據(jù)會依次放在如圖5中的靜態(tài)內(nèi)存中。本發(fā)明實施例中,因為數(shù)據(jù)包的大小可能是不確定的,但是每一個描述符對應的 接收緩沖區(qū)(也就是分配好的內(nèi)存中的某一塊)有可能不是剛好裝滿剩余的空間,那么就 需要使用下一個描述符對應的緩沖區(qū)來存放數(shù)據(jù)包的另一部分。本發(fā)明實施例中,每一個 描述符對應的接收緩沖區(qū)在內(nèi)存中是連續(xù)的,但是緩沖區(qū)長度是有限的,最終總會到末尾, 如果在末尾發(fā)生跨描述符的情況,將會導致接收的數(shù)據(jù)包在內(nèi)存中不完整,需要判斷后手 動從最后一個描述符號和第一個描述符中的緩沖區(qū)中根據(jù)指定的包的大小將這個數(shù)據(jù)包 整合在一起就可以了。最后一個描述符號對應的緩沖區(qū)用完了將使用第一個接收緩沖區(qū), DMA自動使用哪一個描述符是由描述符中的狀態(tài)標識來判斷的。舉例說明,假設接收到了一 個新的數(shù)據(jù)包,長度是9字節(jié),它應該存放到當前的描述符指向的接收緩沖區(qū)。但是當前的 描述符對應的緩沖區(qū)中由于上一次接收了數(shù)據(jù)包而只剩下空閑的5個字節(jié),此時,當前的 描述符對應的緩沖區(qū)接收完后需要使用下一個描述符對應的接收緩沖區(qū)的4字節(jié)。請參閱圖8所示,圖8為DMA發(fā)送描述符鏈表結(jié)構。圖8中的發(fā)送描述符鏈表由 單個的發(fā)送描述符組成,根據(jù)需要和實際的情況來選擇鏈表節(jié)點的個數(shù)。單個的發(fā)送描述 符結(jié)構符合AT_DMA_PRG結(jié)構體。圖中發(fā)送DMA描述符指針(prg_Cpu)用于保存在初始化 時由用戶來動態(tài)分配的指定個數(shù)的DMA發(fā)送描述符中的第一個描述符的地址。發(fā)送描述符 指針0(prg_cpu
)、發(fā)送描述符指針1 (prg_Cpu[l])、發(fā)送描述符指針2(prg_CpU[2])、發(fā) 送描述符指針3(prg_CpU[3])到發(fā)送描述符指針N(prg_CpU[N])保存了動態(tài)分配的每個描 述符的地址。需要進一步說明的是,圖8中的“下一個描述符”的地址一欄中,包含了最低的4個 比特位數(shù)值,稱之為Z,用來表示發(fā)送所需要的16字節(jié)的命令塊數(shù)值。由OHCI規(guī)范可知,帶 有*_Immdiate的描述符Z值為2,其它的描述符的Z為1,這樣可以得知,如果帶有數(shù)據(jù)負 載,則Z值為3,否則為2。發(fā)送DMA可以知道當前的數(shù)據(jù)包需要使用的16字節(jié)的命令塊的 個數(shù)來決定是否發(fā)送完畢。以上分配好之后,就可以用來發(fā)送數(shù)據(jù)包。請參閱圖9所示,圖9為數(shù)據(jù)包發(fā)送流程示意圖。圖中實線表示一次實際的操作, 而虛線代表依次將要發(fā)生的操作。每個內(nèi)存塊的大小是數(shù)據(jù)包的整數(shù)倍。發(fā)送數(shù)據(jù)包的流 程包括步驟首先進行應用程序組包,把需要發(fā)送的數(shù)據(jù)包按照標準的格式填充好,驅(qū)動程序 會將該數(shù)據(jù)包先掛到一個雙向鏈表中。如果數(shù)據(jù)包很多,將依次往后排列。然后判斷是否
11有空閑描述符號來決定是否繼續(xù)發(fā)送該數(shù)據(jù)包,如果有則先用現(xiàn)有的描述符來發(fā)送可以發(fā) 送的數(shù)據(jù)包,如果沒有則等待,直到發(fā)送完成中斷產(chǎn)生后將會有空閑的發(fā)送描述符。然后依 次從待發(fā)送的雙向鏈表中取數(shù)據(jù)包來插入到發(fā)送描述符中啟動發(fā)送DMA進行發(fā)送,直到發(fā) 送完畢。本發(fā)明實施例中,使用三種命令描述符進行插包,和接收數(shù)據(jù)包不同。如果是沒有 負載(數(shù)據(jù)內(nèi)容)的數(shù)據(jù)包,則使用OUTPUT_LAST_Immdiate描述符,如果是有負載(只有 包頭)的數(shù)據(jù)包,則使用0UTPUT_M0RE_Immdiate描述符和0UTPUT_LAST描述符,完成將每 一個數(shù)據(jù)包插入到發(fā)送描述符鏈表中。然后通過設置異步發(fā)送上下文設置寄存器中的相關 位來啟動DMA發(fā)送。請參閱圖10所示,圖10為本發(fā)明實施例提供的一種初始化方法流程圖,包括步 驟步驟1001 設置鏈路層芯片的相關寄存器和物理層寄存器的相關位,使處于準備 狀態(tài),具體包括以下步驟設置Bus options (總線選項)寄存器;設置主機控制器控制(HCControl)寄存器中的LPS位,LPS稱之為連接電源狀態(tài), 是HCControl寄存器中的一個控制位,該位是用來使能鏈路層芯片和物理層芯片之間連接 的一個控制位,使能以后,可以通過鏈路層芯片來執(zhí)行物理層的讀和寫操作,否則,鏈路層 將不能執(zhí)行物理層的讀寫操作;設置Node indentif ication and status (節(jié)點標識和狀態(tài))寄存器中的總線號; 使能PostedWrites (通告寫,是指在數(shù)據(jù)寫到主機內(nèi)存之前發(fā)送一個應答信號)位;清除鏈路層控制寄存器;使能周期定時器和周期控制器;清除中斷寄存器;設置自標識DMA緩存區(qū)并使能自標識DMA ;設置Configuration ROM mapping (配置 ROM 映射)寄存器并初始化 Configrom ;獲得最大包的大小,單位為字節(jié);設置異步接收過濾寄存器;設置字節(jié)交換。步驟1002 初始化DMA接收描述符和DMA發(fā)送描述符;具體包括具體步驟確定所需要的發(fā)送描述符和接收描述符的個數(shù),根據(jù)自己需要來設置;為發(fā)送和接收數(shù)據(jù)分配內(nèi)存空間;初始化發(fā)送和接收描述符鏈表;將每一個描述符鏈表的頭節(jié)點的地址賦值到相應的命令寄存器中,DMA控制器根 據(jù)寄存器中的地址來進行命令解析。步驟1003 安裝中斷服務程序,通過設置鏈路層芯片的中斷屏蔽寄存器來使中斷 打開;需要說明的是,本發(fā)明實施例中是通過VxWorks操作系統(tǒng)的API (AppIication Programming Interface,應用程序接口)函數(shù)來安裝,通過設置IntMask(中斷屏蔽)寄存 器來設置所需要的中斷位。
12
本發(fā)明實施例中,DMA數(shù)據(jù)的接收和發(fā)送都需要對CPU申請中斷來告訴程序的當 前狀態(tài),系統(tǒng)處理的效率也可以體現(xiàn)在該中斷處理函數(shù)中。當系統(tǒng)需要進入中斷時,通過讀 取中斷事件寄存器,判斷是哪種類型的中斷,本發(fā)明實施例中出現(xiàn)的中斷類型包括但不局 限于不可恢復性中斷,循環(huán)連續(xù)包中斷,總線復位中斷,請求發(fā)送完成中斷,響應發(fā)送完成 中斷,請求包中斷,響應包中斷,等時接收中斷,等時發(fā)送中斷,自標識包中斷等,如果有上 述類型的中斷發(fā)生,則首先清楚對應的中斷標識位,然后處理該中斷。步驟1004 軟復位總線,使能鏈路層;需要說明的是,軟復位總線,通過寫物理寄存器的相關位來完成,使能鏈路層通過 設置HCControl寄存器來完成。根據(jù)上述的方法,本發(fā)明實施例還提供了一種VxWorks操作系統(tǒng)中實現(xiàn)驅(qū)動1394 設備的系統(tǒng),如圖11所示,系統(tǒng)包括初始化單元1101,用于設置鏈路層芯片的相關寄存器和物理層寄存器的相關位, 使處于準備狀態(tài),初始化DMA接收描述符和DMA發(fā)送描述符;本發(fā)明實施例中,所述初始化單元1101進一步包括寄存器初始化單元11011,用于設置Bus options (總線選項)寄存器;設置 HCControl (主機控制器控制)寄存器中的LPS位,LPS稱之為連接電源狀態(tài),是HCControl 寄存器中的一個控制位,該位是用來使能鏈路層芯片和物理層芯片之間連接的一個控制 位,使能以后,可以通過鏈路層芯片來執(zhí)行物理層的讀和寫操作,否則,鏈路層將不能執(zhí)行 物理層的讀寫操作;設置Node indentification and status (節(jié)點標識和狀態(tài))寄存器 中的總線號;使能PostedWrites位;清除鏈路層控制寄存器;使能周期定時器和周期控制 器;清除中斷寄存器;設置自標識DMA緩存區(qū)并使能自標識DMA ;設置Configuration ROM mapping (配置ROM映射)寄存器并初始化Configrom ;獲得最大包的大小,單位為字節(jié);設 置異步接收過濾寄存器;設置字節(jié)交換。內(nèi)存分配單元11012,一次性在物理內(nèi)存空間內(nèi)開辟一段連續(xù)的空間,分別存儲發(fā) 送和接收的數(shù)據(jù)包,所述連續(xù)空間劃分成若干相等的內(nèi)存塊。發(fā)送緩沖區(qū)的單個內(nèi)存塊的 大小是一個最大的數(shù)據(jù)包的大小,接收緩沖區(qū)的單個內(nèi)存塊大小是一個最大的數(shù)據(jù)包的大 小的整數(shù)倍,整個存儲空間是靜態(tài)的,在運行過程中不釋放;DMA描述符初始化單元11013,用于初始化DMA發(fā)送描述符鏈表和DMA接收描述符 鏈表;中斷掛接單元11014,用于掛接中斷服務程序。進一步的,本系統(tǒng)還包括中斷處理單元1102,用于處理各類中斷;進一步的,本系統(tǒng)還包括數(shù)據(jù)發(fā)送單元1103,以DMA方式發(fā)送數(shù)據(jù);進一步的,本系統(tǒng)還包括數(shù)據(jù)接收單元1104,以DMA方式接收數(shù)據(jù)。需要說明的是,本發(fā)明實施例提供的各單元之間的連接關系是為了清楚的闡釋其 信息交互控制過程的需要,因此僅視為邏輯上的連接關系,而不應僅限于物理連接。通過上述系統(tǒng),本發(fā)明提供的實施例實現(xiàn)了在VxWorks操作系統(tǒng)中對1394設備的驅(qū)動。綜上所述,本發(fā)明實施例以TI (Texas Instrument)公司推出的OHCI鏈路層芯片 和物理層芯片為例,對本發(fā)明實施例的原理及實施方式進行了闡述。對于本技術領域人員 來說,通過本發(fā)明實施例提供的技術方案即可開發(fā)出其他獨立芯片的1394驅(qū)動程序。通過以上的實施方式的描述,本領域的技術人員可以清楚地了解到本發(fā)明可借 助軟件加必需的硬件平臺的方式來實現(xiàn),當然也可以全部通過硬件來實施,但很多情況下 前者是更佳的實施方式。基于這樣的理解,本發(fā)明的技術方案對背景技術做出貢獻的全部 或者部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如 ROM/RAM、磁碟、光盤等,包括若干指令用以使得一臺計算機設備(可以是個人計算機,服務 器,或者網(wǎng)絡設備等)執(zhí)行本發(fā)明各個實施例或者實施例的某些部分所述的方法。本發(fā)明實施例應用了具體的實施例對本發(fā)明實施例的原理及實施方式進行了闡 述,以上實施例的說明只是用于幫助理解本發(fā)明實施例的方法及其核心思想;同時,對于本 領域的一般技術人員,依據(jù)本發(fā)明實施例的思想,在具體實施方式
及應用范圍上均會有改 變之處,綜上所述,本說明書內(nèi)容不應理解為對本發(fā)明實施例的限制。
權利要求
一種VxWorks操作系統(tǒng)中實現(xiàn)驅(qū)動1394設備的方法,其特征在于,包括步驟a)初始化;b)中斷處理;c)使能DMA讀寫,接收和發(fā)送數(shù)據(jù)。
2.根據(jù)權利要求1所述的方法,其特征在于,所述a)初始化進一步包括步驟al)設置鏈路層寄存器和物理層寄存器,使寄存器處于準備狀態(tài);a2)初始化DMA接收描述符和DMA發(fā)送描述符;a3)安裝中斷服務程序,通過設置鏈路層芯片的中斷屏蔽寄存器來使中斷打開;a4)軟復位總線,使能鏈路層。
3.根據(jù)權利要求2所述的方法,其特征在于,所述al)設置鏈路層寄存器和物理層寄存 器,使寄存器處于準備狀態(tài)具體包括步驟設置總線選項寄存器;設置主機控制器控制寄存器LPS位;設置節(jié)點標識和狀態(tài)寄存 器中的總線號;使能PostedWrites位;清除鏈路層控制寄存器;使能周期定時器和周期控 制器;清除中斷寄存器;設置自標識DMA緩存區(qū)并使能自標識DMA ;設置配置ROM映射寄存 器并初始化ConfigROM ;獲得最大數(shù)據(jù)包的大小,單位為字節(jié);設置異步接收過濾寄存器; 設置字節(jié)交換。
4.根據(jù)權利要求2所述的方法,其特征在于,所述a2)初始化DMA接收描述符和DMA發(fā) 送描述符具體包括步驟確定需要的發(fā)送描述符和接收描述符的個數(shù);為發(fā)送數(shù)據(jù)和接收數(shù)據(jù)分配內(nèi)存空間;初始化發(fā)送描述符鏈表和接收描述符鏈表;將每一個描述符鏈表的頭節(jié)點的地址賦值到相應的命令寄存器中,DMA控制器根據(jù)寄 存器中的地址來進行命令解析。
5.根據(jù)權利要求4所述的方法,其特征在于,所述為發(fā)送和接收數(shù)據(jù)分配內(nèi)存空間具 體實現(xiàn)為一次性在物理內(nèi)存空間內(nèi)開辟一段連續(xù)的空間,分別存儲發(fā)送和接收的數(shù)據(jù)包, 所述連續(xù)空間劃分成若干相等的內(nèi)存塊。發(fā)送緩沖區(qū)的單個內(nèi)存塊的大小是一個最大的數(shù) 據(jù)包的大小,接收緩沖區(qū)的單個內(nèi)存塊大小是一個最大的數(shù)據(jù)包的大小的整數(shù)倍,整個存 儲空間是靜態(tài)的,在運行過程中不釋放。
6.根據(jù)權利要求1所述的方法,其特征在于,所述DMA的讀操作包括步驟接收數(shù)據(jù)包 上下文處理任務接收到DMA的中斷產(chǎn)生的信號后,在當前的接收描述符中查詢是否有數(shù)據(jù) 包過來,并且判斷是否有跨描述符,然后根據(jù)獲得的信息將接收數(shù)據(jù)包的地址和大小一起 通過消息隊列的方式傳遞給解包任務。
7.根據(jù)權利要求1所述的方法,其特征在于,所述DMA的寫操作包括步驟應用程序?qū)?需要發(fā)送的數(shù)據(jù)包封裝好后,先將數(shù)據(jù)包的信息放入到一個動態(tài)的鏈表中,然后依次從按 照發(fā)送描述符的格式來插入到發(fā)送描述符鏈表中,通過設置相應的寄存器來啟動DMA的發(fā) 送,當發(fā)送第一個數(shù)據(jù)包完畢后會產(chǎn)生一個發(fā)送完成中斷,在該中斷中會繼續(xù)從動態(tài)鏈表 中獲取數(shù)據(jù)包插入到描述符鏈表中,直到完成全部數(shù)據(jù)包的發(fā)送。
8.根據(jù)權利要求1-7任一項所述的方法,其特征在于,所述中斷包括不可恢復性中 斷,循環(huán)連續(xù)包中斷,總線復位中斷,請求發(fā)送完成中斷,響應發(fā)送完成中斷,請求包中斷,響應包中斷,等時接收中斷,等時發(fā)送中斷和自標識包中斷。
9.一種VxWorks操作系統(tǒng)中實現(xiàn)驅(qū)動1394設備的系統(tǒng),其特征在于,包括初始化單元,用于設置鏈路層芯片的相關寄存器和物理層寄存器的相關位,使處于準 備狀態(tài),初始化DMA接收描述符和DMA發(fā)送描述符; 中斷處理單元,用于處理各類中斷; 數(shù)據(jù)發(fā)送單元,以DMA方式發(fā)送數(shù)據(jù); 數(shù)據(jù)接收單元,以DMA方式接收數(shù)據(jù)。
10.根據(jù)權利要求9所述的系統(tǒng),其特征在于,所述初始化單元進一步包括寄存器初始化單元,用于設置總線選項寄存器;設置主機控制器控制寄存器中的LPS 位;設置節(jié)點標識和狀態(tài)寄存器中的總線號;使能PostedWrites位;清除鏈路層控制寄存 器;使能周期定時器和周期控制器;清除中斷寄存器;設置自標識DMA緩存區(qū)并使能自標識 DMA ;設置配置ROM映射寄存器并初始化ConfigROM ;獲得最大包的大小,單位為字節(jié);設置 異步接收過濾寄存器;設置字節(jié)交換;內(nèi)存分配單元,用于一次性在物理內(nèi)存空間內(nèi)開辟一段連續(xù)的空間,分別存儲發(fā)送和 接收的數(shù)據(jù)包,所述連續(xù)空間劃分成若干相等的內(nèi)存塊;DMA描述符初始化單元,用于初始化DMA發(fā)送描述符鏈表和DMA接收描述符鏈表; 中斷掛接單元,用于掛接中斷服務程序。
全文摘要
本發(fā)明提供了一種VxWorks操作系統(tǒng)中實現(xiàn)驅(qū)動1394設備的方法和系統(tǒng),其中方法包括步驟a)初始化;b)中斷處理;c)使能DMA讀寫,接收和發(fā)送數(shù)據(jù)。系統(tǒng)包括初始化單元,用于設置鏈路層芯片的相關寄存器和物理層寄存器的相關位,使處于準備狀態(tài),初始化DMA接收描述符和DMA發(fā)送描述符;中斷處理單元,用于處理各類中斷;數(shù)據(jù)發(fā)送單元,以DMA方式發(fā)送數(shù)據(jù);數(shù)據(jù)接收單元,以DMA方式接收數(shù)據(jù)。本發(fā)明實現(xiàn)了在VxWorks操作系統(tǒng)下驅(qū)動1394設備。
文檔編號G06F13/32GK101937406SQ20091010816
公開日2011年1月5日 申請日期2009年6月29日 優(yōu)先權日2009年6月29日
發(fā)明者匡堯文, 熊威, 陳超 申請人:研祥智能科技股份有限公司