用開(kāi)始寫(xiě)的驅(qū)動(dòng)程序的文檔替代此文檔.
從該設(shè)備的概要開(kāi)始.指出該驅(qū)動(dòng)實(shí)現(xiàn)整個(gè)設(shè)備的部分還是全部細(xì)節(jié).
描述所有該設(shè)備的操作模式,指出該驅(qū)動(dòng)所實(shí)現(xiàn)的是哪種.
寫(xiě)出該設(shè)備在BSP中創(chuàng)建和初始化的步驟.寫(xiě)出可把該驅(qū)動(dòng)定制為特殊硬件環(huán)境的所有宏(macros).
寫(xiě)出所有可幫助用戶理解該設(shè)備如何工作和設(shè)備的接口.
模板概要:
這是一個(gè)串口驅(qū)動(dòng)模板.可用來(lái)作為寫(xiě)Vxworks5.3或更新版本的新驅(qū)動(dòng)的起點(diǎn).
這些驅(qū)動(dòng)支持舊串口驅(qū)動(dòng)沒(méi)有的新功能,首先,它們提供一個(gè)設(shè)置硬件選項(xiàng)的接口;
例如,停止位數(shù),數(shù)據(jù)位,奇偶,等等.
其次,它們提供可用來(lái)提供串口線上的外部模式調(diào)試(如,ROM監(jiān)視器調(diào)試)的輪巡通訊(polled communication)接口.通常只支持異步模式驅(qū)動(dòng). 貫穿整個(gè)文件,單詞"template"用來(lái)替換一個(gè)真實(shí)的設(shè)備名,按慣例采用廠商名的第一個(gè)字母加產(chǎn)品編號(hào).例如,Zilog 8530 串口設(shè)備應(yīng)一個(gè)名為Z8530——DUSAART
數(shù)據(jù)結(jié)構(gòu),好過(guò)TEMPLATE_DUSART.
數(shù)據(jù)結(jié)構(gòu)
設(shè)備數(shù)據(jù)結(jié)構(gòu)在文件 h/drv/sio/templateSio.h里定義。一個(gè)數(shù)據(jù)結(jié)構(gòu)——TEMPLATE_CHAN被定義,為每個(gè)通道。具有多串口通道的設(shè)備也為整個(gè)芯片定義了一個(gè)數(shù)據(jù)結(jié)構(gòu).例如,此驅(qū)動(dòng)有一個(gè)芯片級(jí)的,有兩個(gè)通道結(jié)構(gòu)作為成員數(shù)據(jù)結(jié)構(gòu)叫TEMPLATE_DUSART。
回調(diào)
傳輸準(zhǔn)備就緒(transmitter ready)中斷調(diào)用服務(wù)采用回調(diào)至高層庫(kù)以獲得一個(gè)字符來(lái)傳送。 默認(rèn)地,此驅(qū)動(dòng)安裝不做任何事情的傀儡回調(diào)程序。使用此驅(qū)動(dòng)的高層庫(kù)(例如,ttyDrv)將用SIO_INSTALL_CALLBACK控制命令(ioctl command)安裝自己的回調(diào)程序. 同樣,一個(gè)接受中斷處理采用回調(diào)來(lái)將字符傳給高層庫(kù)。
模式
理想模式下該驅(qū)動(dòng)應(yīng)支持輪巡和中斷模式,并可動(dòng)態(tài)切換模式。但這并非必須。Vxworks可支持此設(shè)備上的tty設(shè)備,即使該驅(qū)動(dòng)只支持
中斷模式.
增加動(dòng)態(tài)模式切換允許當(dāng)信息送至?xí)r將外部代理激活(例如,在第一楨時(shí)中斷). 對(duì)允許動(dòng)態(tài)模式切換的驅(qū)動(dòng),注意驅(qū)動(dòng)將在其輸入ISR中間被要求切換模式.一個(gè)驅(qū)動(dòng)的輸入ISR看起來(lái)應(yīng)如此: inChar = *pDev->dr;/@ 從數(shù)據(jù)寄存器里讀一個(gè)字符 @/ *pDev->cr = GOT_IT;/@ 承認(rèn)中斷@/ pDev->putRcvChar (...);/@ 發(fā)送字符到高層 @/ /@ give the character to the higher layer @/ 如果該通道用作外部模式調(diào)試的通訊路徑,且接收的該字符是"幀結(jié)束"字符,則代理的回調(diào)會(huì)鎖定中斷,切換設(shè)備到輪巡模式,并使用輪巡模式下的設(shè)備片刻.此后代理會(huì)解鎖中斷,切換模式到中斷模式,并返回ISR. 特別地,回調(diào)能使兩模式切換,首先到輪巡模式然后到中斷模式,后返回. 這要求小心處理中斷處理內(nèi)的回調(diào)。例如,在調(diào)用回調(diào)前你必須先承認(rèn)中斷。
用法:
該驅(qū)動(dòng)通常為BSP調(diào)用.該模塊里直接調(diào)用程序是 templateDevInit(), templateDevInit2(),templateIntRcv(), templateIntTx(), and templateIntErr(). BSP調(diào)用templateDevInit()來(lái)初始化或重啟芯片.它用intConnect()連接中斷處理(templateIntRcv, templateIntTx,和 templateIntErr). 連接中斷處理后,BSP調(diào)用templateDevInit2()來(lái)告訴驅(qū)動(dòng)中斷模式操作已可行.
BSP: 按常規(guī)所有BSP特定的串口初始化在sysSerial.c(被sysLib.c包含)里進(jìn)行, sysSerial.c實(shí)現(xiàn)至少4個(gè)函數(shù):sysSerialHwInit(),sysSerialHwInit2(), sysSerialChanGet(),和sysSerialReset(),如下工作: sysSerialHwInit被sysHwInit調(diào)用來(lái)初始化串口設(shè)備.此程序?qū)⒃谡{(diào)用能復(fù)位設(shè)備及安裝驅(qū)動(dòng)函數(shù)指針的templateDevinit前初始化TEMPLATE_DUSART結(jié)構(gòu)的所有板特定的區(qū)域(如,寄存器的I/O地址,等等).sysSerialHwInit還將執(zhí)其他所有串口驅(qū)動(dòng)所需要的過(guò)程,比如適當(dāng)配置板上的中斷控制器. sysSerialHwInit2被sysHwInit2調(diào)用來(lái)用intConnect連接驅(qū)動(dòng)的中斷處理.連接好中斷處理后,templateDevInit2的調(diào)用允許中斷模式操作開(kāi)始. sysSerialChanGet被usrRoot調(diào)用來(lái)取得與串口通道號(hào)相關(guān)的串口通描述.該程序使用一個(gè)0-NUM_TTY之間的一個(gè)數(shù)為單一的參數(shù).它返回一個(gè)指向相應(yīng)通道描述——SIO_CHAN * 的指針,它正好是TEMPLATE_CHAN結(jié)構(gòu)的地址. sysSerialReset被sysToMonitor()調(diào)用且會(huì)復(fù)位串口設(shè)備到一個(gè)不活動(dòng)的狀態(tài). 該驅(qū)動(dòng)可通過(guò)重定義TEMPLATE_REG_READ和TEMPLATE_REG_WRITE宏來(lái)定制.這兩個(gè)宏用來(lái)訪問(wèn)實(shí)際的芯片.如不定義,源代碼會(huì)假定用對(duì)所有寄存的read/write訪問(wèn)來(lái)對(duì)設(shè)備進(jìn)行簡(jiǎn)單內(nèi)存映射.
測(cè)試:
中斷驅(qū)動(dòng)接口可用通常方法來(lái)測(cè)試.當(dāng)它(測(cè)試信息,譯者如是猜測(cè))來(lái)到時(shí)Vxworks打印到串口控制臺(tái),于是看到加電后VxWorks輸出表示該驅(qū)動(dòng)基本開(kāi)始工作. VxWorks的Portkit測(cè)試也可用來(lái)進(jìn)行更嚴(yán)格的測(cè)試. 輪巡接口容易被檢驗(yàn)——你可調(diào)用通道的SIO_MODE_SET ioctllai使它進(jìn)入輪巡模式.注意通常的打印工具不能在輪巡模式下與串口通道一起工作.一些代理必須執(zhí)行輪巡循環(huán)來(lái)處理基于字符的字符輸入/輸出.這不是自動(dòng)進(jìn)行.當(dāng)切換WDB串口線到輪巡模式時(shí),WDB代理執(zhí)行它自己的輪巡循環(huán). 動(dòng)態(tài)模式切換可用tornado工具來(lái)檢查.重新配置代理使用WDB_COMM_UDLP_SLIP通訊路徑(詳見(jiàn)VxWorks run_time Guide的配置章節(jié)). 如下開(kāi)始wtxtcl %wtxtcl 從tcl提示符,連接到target server: wtxtcl.ex> wtxToolAttach 通知代理來(lái)轉(zhuǎn)換外部模式檢查回應(yīng)是OK(0). wtxtcl.ex>wtxAgentModeSet 2 0 要求代理掛起系統(tǒng)(請(qǐng)求會(huì)以中斷模式傳到,但回應(yīng)會(huì)以輪巡模式被傳送): wtxtcl.ex>wtxContextSuspend 0 0 0 在此時(shí)目標(biāo)將被掛起.控制臺(tái)將顯示凍結(jié)(果板卡有一個(gè)控制臺(tái)設(shè)備),你不能"ping"目標(biāo)的網(wǎng)絡(luò)接口.
恢復(fù)目標(biāo):
wtxtcl.ex>wtxContextResume 0 0 0 現(xiàn)在目標(biāo)將重新運(yùn)行,于是你能敲信息到控制臺(tái)(如果板卡有一個(gè)控制臺(tái)設(shè)備)并可從主機(jī)"ping"目標(biāo)的網(wǎng)絡(luò)接口.
vxworks下bsp制作教程
1 vxworks概述
vxworks是WIND RIVER公司的產(chǎn)品。作為一種商用的嵌入式操作系統(tǒng)?vxworks擁有強(qiáng)大的功能和友好的用戶界面。與免費(fèi)的嵌入式操作系統(tǒng)相比?商用操作系統(tǒng)經(jīng)過(guò)嚴(yán)格的測(cè)試?具有良好的實(shí)時(shí)性?易用性和大量的文檔支持?但是它的源碼是不公開(kāi)的并且價(jià)格昂貴;免費(fèi)的嵌入式操作系統(tǒng)有很多?大都是linux的移植?公開(kāi)源代碼?但缺乏文檔?要對(duì)照源碼進(jìn)行開(kāi)發(fā)。
2 BSP的流程
BSP流程分成兩部分。首先是位于BootRom中的Boot代碼?它的作用是實(shí)現(xiàn)配置硬件和啟動(dòng)vxworks下載程序。接下來(lái)是下載后跳轉(zhuǎn)到vxworks的入口地址運(yùn)行操作系統(tǒng)和應(yīng)用程序。
流程入圖:
ROM中的啟動(dòng)代碼部分:RomInit在文件在文件romInit.s中。它是運(yùn)行的開(kāi)始?實(shí)現(xiàn)這一部分是首先的。它實(shí)現(xiàn)判斷啟動(dòng)類型?配置內(nèi)核和非內(nèi)核寄存器以及內(nèi)存和外圍設(shè)備的讀寫(xiě)時(shí)序?因此可以在此處加入內(nèi)存檢測(cè)功能。在BSP中無(wú)法進(jìn)行調(diào)試?只能通過(guò)閃燈實(shí)現(xiàn)云信正確與否的判斷。閃燈功能函數(shù)也要在此加入。判斷啟動(dòng)類型和配置寄存器?這一部分不需要改動(dòng)。配置內(nèi)存和外圍設(shè)備讀寫(xiě)時(shí)序?要進(jìn)行改動(dòng)。這一部分的SDRAM?ROM?FLASH?FPGA有相應(yīng)的模板可以參考。它的實(shí)現(xiàn)是通過(guò)使用宏定義來(lái)實(shí)現(xiàn)的。但是要改動(dòng)的話也不難?一般是改動(dòng)空間大小的屏蔽位?讀寫(xiě)位數(shù)?以及片選寄存器OR和BR。至于特殊外設(shè)的讀寫(xiě)有待討論。內(nèi)存檢測(cè)在這里實(shí)現(xiàn)較復(fù)雜?它根據(jù)相應(yīng)的內(nèi)存檢測(cè)算法實(shí)現(xiàn)。主要是對(duì)地址線和數(shù)據(jù)線的檢測(cè)。通過(guò)寫(xiě)入數(shù)據(jù)再會(huì)讀出數(shù)據(jù)來(lái)判斷。使用"走步1"和"走步0"
算法。這一部分較多的依賴硬件?可移植性較差?根據(jù)自己的單板改動(dòng)。閃燈在這一部分是強(qiáng)烈推薦的。因?yàn)殚W燈才能定位程序的運(yùn)行位置。閃燈函數(shù)可移植?一般要改動(dòng)?因?yàn)闊艨赡芙釉诓煌腎/O口上。另外注意860SAR的PORT B是32位的。具體的端口見(jiàn)相應(yīng)的CPU的I/O口的參數(shù)?配置相應(yīng)的寄存器。
RomInit在函數(shù)結(jié)尾跳入RomStart。
RomStart在BootInt.c文件中。它是系統(tǒng)運(yùn)行的第一個(gè)C函數(shù)。這一部分是Wind River公司提供的標(biāo)準(zhǔn)程序?一般不需改動(dòng)。該函數(shù)是C的入口函數(shù),由匯編程序調(diào)用,主要完成清內(nèi)存,將ROM中的程序拷貝到RAM,解壓并跳至解壓后的程序處運(yùn)行。UsrInit在BootConfig.c文件中。它主要是實(shí)現(xiàn)硬件的初始化。其中涉及到串口?網(wǎng)口的初始化?CONSOLE的配置等。其中串口和網(wǎng)口的配置BSP的重要部分?但860CPU對(duì)串口和王口有很好的支持?只要做很小的改動(dòng)即可?串口很簡(jiǎn)單?網(wǎng)口較復(fù)雜一些。UsrRoot在BootConfig.c文件中。它主要是實(shí)現(xiàn)vxworks文件的下載?并且跳轉(zhuǎn)到vxworks的入口地址。從而進(jìn)入到操作系統(tǒng)中去。
VXWORKS文件中的代碼部分:
SysInit在sysAlib.s中。它是vxworks的啟動(dòng)代碼。它與RomInit的作用相同?對(duì)于這個(gè)文件?我們一般不需要去改動(dòng)它。UsrInit在Usrconfig.c中。它的作用與Boot中的UsrInit的作用相同?他們都調(diào)用SysLib.c中的子函數(shù)。實(shí)現(xiàn)相同的硬件初始化功能。UsrRoot在UsrConfig.c中。它的作用與Boot中的UsrRoot的作用類似。但是這里的UsrRoot是最終進(jìn)入到應(yīng)用程序中去。