基于8位微控制器控制硬盤進(jìn)行HDTV碼流讀寫
摘要:介紹用C8051F015微控制器控制硬盤進(jìn)行HDTV碼流存取的高清碼流回放機(jī)的硬件設(shè)計和軟件編程。該系統(tǒng)作為解碼器的前端,可以實現(xiàn)HDTV碼流的適時回放。 關(guān)鍵詞:HDTV 碼流 ATA/ATAPI-4標(biāo)準(zhǔn) LBA模式 CPLD
隨著HDTV在全球的興起以及數(shù)字技術(shù)的日趨成熟,音/視頻產(chǎn)品數(shù)字化、高清晰度化已成為未來家電視聽產(chǎn)品的大趨勢。高清晰度電視HDTV(High-Definition Television)采用了國際上流行的MPEG-2標(biāo)準(zhǔn),MPEG-2規(guī)定了數(shù)字圖像的音視頻編解碼算法以及傳送的碼流應(yīng)該符合的語法和語義,而其編解碼算法又參考了聽覺心理模型和視覺心理模型。HDTV的圖像格式為19201080I,傳輸碼率高達(dá)20Mbps,同時采用的視頻壓縮技術(shù)可使HDTV的每一幀包含更多的信息,大大提高圖像的清晰度。HDTV在音頻壓縮方面采用了數(shù)字音頻的編碼和壓縮技術(shù),現(xiàn)有的數(shù)字音頻編碼壓縮方案有MPEG、Dolby AC-3和美國ATT的MPAC以及歐洲的MIX。它們都能實現(xiàn)5.1聲道,其聲道數(shù)可以擴(kuò)展到5.1,即三個前面的聲道(L、C、右聲道R)、兩個環(huán)繞聲道(左環(huán)繞聲道Ls、右環(huán)繞聲道Rs)和一個低音效果聲道LFE,使聲音效果可以達(dá)到家庭影院的音響效果。HDTV聲光效果上優(yōu)勢,注定它的發(fā)展有著技術(shù)和市場的雙重必然性。為了配合HDTV及相關(guān)技術(shù)產(chǎn)品的推廣,筆者開發(fā)了一個既可以作為MPEG解碼器信號源,又可以作為信道編碼/調(diào)制器信號源的碼流回放機(jī),應(yīng)用于數(shù)字電視產(chǎn)品的開發(fā)、生產(chǎn)調(diào)試及展示宣傳。
HDTV節(jié)目有傳輸碼率高、節(jié)目信息最大的特點。為了研制出符合大容量高速率要求的碼流回放機(jī),傳統(tǒng)的方法是用操作系統(tǒng)控制硬盤的讀寫操作。這樣做的好處在于:首先,PC機(jī)的主頻很高,用來作為控制碼流的時鐘信號在速度上不會有瓶頸問題;其次,對硬盤里HDTV節(jié)目的讀取是基于文件系統(tǒng)的,研發(fā)人員不用寫硬盤的驅(qū)動程序,軟件的工作量大大減小。但是,就碼流回放機(jī)本身而言,它是一個單任務(wù)設(shè)備,采用操作系統(tǒng)的方案無疑將造成CPU資源的極大浪費。因此,筆者設(shè)想用單片機(jī)或DSP控制硬盤的讀寫操作。只要所選微控制器上速度上滿足高清晰度電視的碼率要求,在技術(shù)上就能夠?qū)崿F(xiàn)預(yù)期的功能。與操作系統(tǒng)方案相比較,用微控制器無疑可以大大降低生產(chǎn)成本,同時也降低了硬件設(shè)計的難度。不過,在這種方式下,需要編寫硬盤的底層驅(qū)動程序。
圖1 C8051F015內(nèi)部結(jié)構(gòu)
1 總體方案
華天HTTS HDTV第III代碼流回放機(jī)可以播放數(shù)字高清晰度電視HDTV碼流。該碼泫回放機(jī)整體設(shè)計沒有采用在工控機(jī)上研發(fā)PCI卡驅(qū)動硬盤的方案,而是遵照AT Attachment with Packet Interface Extension(ATA/ATAPI-4)標(biāo)準(zhǔn),用8位單片機(jī)C8051F015通過PIO方式按照LBA模式直接對硬盤進(jìn)行物理級的讀寫操作。硬盤接收微控制器的命令后按照邏輯地址順序輸出HDTV碼流給兩片F(xiàn)IFO,硬盤輸出的16位數(shù)據(jù)通過兩片8位FIFO緩存后輸出給CPLD進(jìn)行拆分以識別包同步和字節(jié)同步。經(jīng)CPLD解析后的數(shù)據(jù)流再經(jīng)過解碼器解碼及適當(dāng)后處理,送顯示器、揚聲器以提供視頻、音頻信號。既可以作為MPEG解碼器的信號源,又可以作為信道編碼/調(diào)制器的信號源。
2 C8051F015內(nèi)部結(jié)構(gòu)
C8051F015的內(nèi)部結(jié)構(gòu)如圖1所示。它使用了CYGNAL的專利――CIP-51微控制器內(nèi)核CIP-51。CIP-51與MCS-51的指令集完全兼容,可以使用標(biāo)準(zhǔn)803x/805x的匯編器和編譯器進(jìn)行軟件開發(fā)。同時,CIP-51采用流水線結(jié)構(gòu),70%的指令執(zhí)行時間為1或2個系統(tǒng)時鐘周期,外部晶振最大可以到25MHz。8位HDTV輸出碼流的標(biāo)準(zhǔn)時鐘頻率為19MHz和25MHz??紤]到硬盤的輸出是16位,理論上采用這款MCU完全可以達(dá)到速度要求。這里,就系統(tǒng)的初始化問題有幾點說明:(1)內(nèi)外部晶振切換。在外部晶體振蕩器被允許時,系統(tǒng)晶體驅(qū)動器的輸出端XTAL2腳會出現(xiàn)一個瞬時脈沖,該脈沖足以在晶體實際啟動前,將OSCXCN寄存器中的XTLVLD位置1。在允許晶體振蕩器和檢查XTLVLD位之間引入1ms的延時,可以防止提前切換到外部晶振。(2)配置交叉開關(guān)。系統(tǒng)內(nèi)部交叉開關(guān)根據(jù)優(yōu)先權(quán)譯碼表將所選擇的內(nèi)部數(shù)字資源分配到I/O引腳,寄存器XBR0、XBR1、XBR2用于選擇內(nèi)部數(shù)字功能或讓I/O引腳默認(rèn)為I/O端口。I/O引腳的輸出驅(qū)動器特性用端口配置寄存器PRT0CF、PRT1CF、PRT2CF和PRT3CF定義。每個端口輸出驅(qū)動器都可被配置為漏極開路或推挽方式。將配置寄存器的相應(yīng)位配置為漏極開路,并在外部加1kΩ的上拉電阻,可用3.3V供電的C8051F015去驅(qū)動5V供電的硬盤。初始化程序:
void sysclk_init(void)
{WDTCH=0xde; //禁止看門狗定時器
WDTCN=0xad;
//啟動外部振蕩器
OSCXCN=0x67; //外接24MHz的晶振
//配置外部晶體
while((OSCXCNXTLVLD_BIT= =0)
{}
OSCICN=0x88; //選擇外部振蕩器作為系統(tǒng)時鐘,禁止內(nèi)部振蕩
}
//配置交叉開關(guān)
void xbar_init(void)
{XBR0=0x04; //RX TX連到兩個引腳
XBR1=0x04; //INT0連到斷口引腳
XBR2=0x40; //使能交叉開關(guān)和弱上拉
PRT0CF=0xff; //控制FIFO讀寫,使能
PRT1CF=0x07; //控制CPLD讀寫,使能
PRT2CF=0x00; (P0口的所有輸出為弱上拉(寫硬盤命令字)
PRT3CF=0x00; //控制硬盤讀寫,使能
}
3 ATA/ATAPI-4標(biāo)準(zhǔn)下的硬盤內(nèi)部寄存器和PIO讀時序關(guān)系
3.1 硬盤內(nèi)部寄存器
目前,大部分計算機(jī)配置了兩個IDE接口,地址范圍分別為:0170~0117,0376~0376(對應(yīng)PC機(jī)的Secondary IDE Channel)和01F0~01F6,03F6~03F6(對應(yīng)PC機(jī)的Primary IDE Channel)。地址譯碼如表1所示。
表1 地址譯碼
數(shù)據(jù)寄存器(170R/W):這是一個16位PIO數(shù)據(jù)寄存器,用于對扇區(qū)的讀、寫和格式化操作。MCU通過該寄存器向硬盤控制寄存器寫入或從硬盤控制器讀出扇區(qū)緩沖區(qū)的數(shù)據(jù)。
錯誤寄存器(171R):該寄存器是一個8位的寄存器,它反映控制寄存器在診斷方式或操作方式下的錯誤原因。
扇區(qū)數(shù)寄存器(172R/W):它記錄讀、寫命令的扇區(qū)數(shù)。當(dāng)多扇區(qū)傳輸時,每完成一個扇區(qū)操作,該寄存器自動減1,直至為0。如果初值為0,則表示256;如果有錯誤生,該寄存器包含已經(jīng)操作成功的扇區(qū)數(shù)。
扇區(qū)號寄存器(173R/W):它記錄讀、寫和校驗命令指令起始扇區(qū)號。本文用LBA模式。該寄存器記錄邏輯扇區(qū)的0字節(jié)。
柱面號寄存器(174 175 R/W):它記錄讀、寫、校驗、尋址和格式化命令指定的柱面號,在LBA尋址方式下,這2個寄存器包含起始扇區(qū)的1和2字節(jié)。
驅(qū)動器/磁頭寄存器(176R/W):它記錄讀、寫、校驗、尋道和格式化命令指定的驅(qū)動器號、磁頭號和尋址方式。在ATA/ATAPI-4中其定義如表2所示。
表2 驅(qū)動器/磁頭寄存器在ATA/ATAPI-4中的定義
HS0~HS3(磁頭選擇):在LBA方式中,是邏輯扇區(qū)的高4位。
DEV驅(qū)動器選擇:0選擇主驅(qū)動器,1選擇從驅(qū)動器。
L(LBA方式):L=1,置驅(qū)動器為LBA模式;L=0,置驅(qū)動器為CHS模式。
狀態(tài)寄存器(177 R);反映了硬盤執(zhí)行命令后的狀態(tài)。讀該寄存器清除中斷請求信號,為避免清除中斷,可以讀輔助狀態(tài)寄存器376h。這兩個寄存器的內(nèi)容完全一樣。在ATA/ATAPI-4中其定義如表3所示。
BSY:驅(qū)動器忙。
DRDY:驅(qū)動器準(zhǔn)備好。
DRQ:請求服務(wù),驅(qū)動器請求通過寄存器與處理器交換一個字節(jié)數(shù)據(jù)。
ERR:命令執(zhí)行錯誤。
3.2 硬盤PIO方式下特定區(qū)域多扇區(qū)讀的操作
如果想從硬盤的特定扇區(qū)讀出碼流信息,首先主機(jī)(C8051F015)要對驅(qū)動器/磁頭寄存器、柱面號寄存器、扇區(qū)號寄存器、扇區(qū)數(shù)寄存器設(shè)置參數(shù)。完畢后要等待至少400ns才能去讀狀態(tài)寄存器的參數(shù)判斷以上設(shè)置是否有效。硬盤接收命令后置BSY=1,并開始執(zhí)行命令。硬盤如果準(zhǔn)備好傳送數(shù)據(jù)包,就置DRQ=1,同時清零BSY。當(dāng)機(jī)循環(huán)讀狀態(tài)寄存器或輔助狀態(tài)寄存器判斷BSY=0DRQ=1,一旦硬盤狀態(tài)符合要求,主機(jī)寫參數(shù)0x80(128扇區(qū))到數(shù)據(jù)寄存器(0x170),并寫0x20(PIO讀)到命令寄存器(0x177),表示要求讀出硬盤相應(yīng)地址里的數(shù)據(jù)塊。硬盤判斷數(shù)據(jù)寄存器被置數(shù)后立即置BSY=1DRQ=0。主機(jī)讀到置位信息后給硬盤讀時鐘,硬盤輸出數(shù)據(jù)直到數(shù)據(jù)包傳完為止。
表3 狀態(tài)寄存器在ATA/ATAPI-4中的定義
4 系統(tǒng)設(shè)計方案
4.1 系統(tǒng)硬件構(gòu)成
基于8位微控制器的系統(tǒng)設(shè)計方案如圖2所示。主系統(tǒng)中以C8051F015為控制核心,C8051F015產(chǎn)生硬盤和FIFO的讀寫時序(為了避免硬盤寄存器參數(shù)也被寫入FIFO,在硬件上要把二者的讀寫時鐘分開。);硬盤輸出的16位數(shù)據(jù)分離低8位分別送入兩片64KB的FIFO緩存。數(shù)據(jù)經(jīng)緩存后持續(xù)地輸出到CPLD,CPLD對16位數(shù)據(jù)流進(jìn)行拆分,同時識別包同步和字節(jié)同步。這樣,原始的一路HDTV碼流就被分成3路輸送給解碼器解碼。主系統(tǒng)通過串行總線與前面板相連,采用通用單片機(jī)AT89C51為前面板的控制核心。AT89C51接收來自鍵盤的命令并在LCD上以文字和圖形的方式展現(xiàn)在用戶面前,同時通過串口通信,啟動主控制器執(zhí)行命令。
4.2 系統(tǒng)軟件設(shè)計
4.2.1 存碼流部分
本系統(tǒng)沒有引入操作系統(tǒng)和文件格式,所以碼流文件存入硬盤時就不能按文件格式,而只能按二進(jìn)制流的方式從PC機(jī)的碼流文件中讀出數(shù)據(jù),再按同樣的方式寫入裸盤。為了解決碼流的總是,試圖調(diào)用BIOS中斷,讓BIOS的硬盤服務(wù)流程負(fù)責(zé)把INT13的讀寫請求轉(zhuǎn)化為ATA界面對硬盤的請求,并執(zhí)行數(shù)據(jù)I/O傳輸?shù)奈锢韯幼?。但由于BIOS本身寄存器的限制,用它去訪問硬盤有8.4G容限的問題。如果想突破這個限制而用擴(kuò)展的INT13,將是一個比較復(fù)雜的過程。可以利用PC機(jī)上的Secondary IDE Channel(0x170~0x177)作為硬盤寄存器的端口地址。在這個硬件平臺下,可以直接將fread()函數(shù)讀出的碼流按塊寫入目標(biāo)硬盤,甚至不要求大多地考慮時序問題。
4.2.2 讀碼流部分
這部分軟件是在上述硬件系統(tǒng)平臺上直接編程。系統(tǒng)在啟動硬盤前要等待串行中斷,接收由前面板發(fā)出的命令,再根據(jù)接收的數(shù)據(jù)信息具體決定應(yīng)該播放哪幾個節(jié)目;隨后對硬盤、FIFO進(jìn)行初始化,啟動CPLD,F(xiàn)IFO輸出數(shù)據(jù)時鐘信號,并讓硬盤按命令輸出數(shù)據(jù)流。數(shù)據(jù)在總線穩(wěn)定的時間內(nèi)給FIFO寫時鐘,以采集正確的碼流信息(這里強(qiáng)調(diào)時序)。FIFO有“半滿”(HF)標(biāo)志,用HF去觸發(fā)中斷,有中斷請求,就讓硬盤輸出64KB的數(shù)據(jù)。如此循環(huán),保證FIFO不空。當(dāng)FIFO輸出第一個數(shù)據(jù)時,CPLD開始對數(shù)據(jù)流進(jìn)行拆分,并按照HDTV碼流的格式標(biāo)準(zhǔn)對數(shù)據(jù)流進(jìn)行判別(HDTV碼流188字節(jié)為一個包,每個包頭是0x47),即每計數(shù)1次,就輸出一個比特同步,每計數(shù)188次并識別下一個數(shù)為0x47,就輸出一個包同步。這部分程序流程如圖3。
IP
4.2.3 應(yīng)用程序
系統(tǒng)設(shè)置硬盤寄存器參數(shù)時,首先調(diào)用SetMode()函數(shù)設(shè)定硬盤的IDLE狀態(tài)和自掉電功能,可以保證硬盤在不工作的情況下,磁頭會復(fù)位到“登陸區(qū)”;然后調(diào)用SetAdress()函數(shù)選擇對應(yīng)的寄存器;接下來可以調(diào)用ReadSector()函數(shù)進(jìn)行多扇區(qū)讀操作。以下是寄存器選擇子函數(shù)和多扇區(qū)讀子函數(shù)。
//寄存器選擇子函數(shù);
void SetAddress(unsigned char cs,unsigned char adr){
DA0=((adr 0x01)= =0x01;
DA1=((adr 0x02) = =0x02);
DA2=((adr 0x04) = =0x04);
if(cs= =CTRL) {
nCS1FX=1;
nCS3FX=0;
}else {
nCS1FX=0;
nCS3FX=1;
}
}
//多扇區(qū)讀子函數(shù):
unsigned char ReadSector(unsigned long point,unsigned char *Buffer){
unsigned int i,k;
WriteBYTE(CMD,6,0xe0); //LBA模式
WriteBYTE(CMD,5,point>>16); //LBA模式下的高16位地址
WriteBYTE(CMD,4,point>>8); //LBA模式下的高8位地址
WriteBYTE(CMD,3,point); //LBA模式下的低8位地址
WriteBYTE(CMD,2,0x80); //一次讀寫的扇區(qū)數(shù)
//Issue read sector command...
WriteBYTE(CMD,7,0x20); //0x20多為扇區(qū)讀命令
Timer 10mSec=10000;
while((ReadBYTE(CMD,7)0x08)!=0x08 Timer 10mSec); //等待DRQ=1或者timeout
if(Timer 10mSec= =0)return 0xFF;
//Fetch the sector...
LSBDATA=ALLINPUT;
//Select address and activate CS
SetAddress(CMD,0);
for(k=0;k0x80;k++)
for(i=0;i512;i+=2){ //一次讀兩字節(jié)
nDIOR=0; //硬盤的讀時鐘
WCK=1;
WCK=0;
nDIOR=1;
}
nCS1FX=1; //復(fù)位CS
nCS3FX=1;
return ReadBYTE(CMD,1); //返回錯誤寄存器的信息
}
本文是“第三代碼流回放機(jī)研制”課題的一個重要組成部分。本方案利用微控制器對硬盤進(jìn)行基于LBA模式下的讀寫操作(不用操作系統(tǒng)),硬軟件簡潔可靠,技術(shù)上也解決前期產(chǎn)品的兩個難題:
(1)一些舊機(jī)器的BIOS不支持INT 13h Extension,無法訪問8.4G以上硬盤空間;
(2)WINDOWS操作系統(tǒng)不支持存儲1.2G以上碼流文件。
將此系統(tǒng)逆向設(shè)計,能夠研發(fā)出適時錄制TS流和衛(wèi)星節(jié)目的儀器。
評論