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