4 系統設計方案
4.1 系統硬件構成
基于8位微控制器的系統設計方案如圖2所示。主系統中以C8051F015為控制核心,C8051F015產生硬盤和FIFO的讀寫時序(為了避免硬盤寄存器參數也被寫入FIFO,在硬件上要把二者的讀寫時鐘分開。);硬盤輸出的16位數據分離低8位分別送入兩片64KB的FIFO緩存。數據經緩存后持續地輸出到CPLD,CPLD對16位數據流進行拆分,同時識別包同步和字節同步。這樣,原始的一路HDTV碼流就被分成3路輸送給解碼器解碼。主系統通過串行總線與前面板相連,采用通用單片機AT89C51為前面板的控制核心。AT89C51接收來自鍵盤的命令并在LCD上以文字和圖形的方式展現在用戶面前,同時通過串口通信,啟動主控制器執行命令。
4.2 系統軟件設計
4.2.1 存碼流部分
本系統沒有引入操作系統和文件格式,所以碼流文件存入硬盤時就不能按文件格式,而只能按二進制流的方式從PC機的碼流文件中讀出數據,再按同樣的方式寫入裸盤。為了解決碼流的總是,試圖調用BIOS中斷,讓BIOS的硬盤服務流程負責把INT13的讀寫請求轉化為ATA界面對硬盤的請求,并執行數據I/O傳輸的物理動作。但由于BIOS本身寄存器的限制,用它去訪問硬盤有8.4G容限的問題。如果想突破這個限制而用擴展的INT13,將是一個比較復雜的過程。可以利用PC機上的Secondary IDE Channel(0x170~0x177)作為硬盤寄存器的端口地址。在這個硬件平臺下,可以直接將fread()函數讀出的碼流按塊寫入目標硬盤,甚至不要求大多地考慮時序問題。
4.2.2 讀碼流部分
這部分軟件是在上述硬件系統平臺上直接編程。系統在啟動硬盤前要等待串行中斷,接收由前面板發出的命令,再根據接收的數據信息具體決定應該播放哪幾個節目;隨后對硬盤、FIFO進行初始化,啟動CPLD,FIFO輸出數據時鐘信號,并讓硬盤按命令輸出數據流。數據在總線穩定的時間內給FIFO寫時鐘,以采集正確的碼流信息(這里強調時序)。FIFO有“半滿”(HF)標志,用HF去觸發中斷,有中斷請求,就讓硬盤輸出64KB的數據。如此循環,保證FIFO不空。當FIFO輸出第一個數據時,CPLD開始對數據流進行拆分,并按照HDTV碼流的格式標準對數據流進行判別(HDTV碼流188字節為一個包,每個包頭是0x47),即每計數1次,就輸出一個比特同步,每計數188次并識別下一個數為0x47,就輸出一個包同步。這部分程序流程如圖3。
IP
4.2.3 應用程序
系統設置硬盤寄存器參數時,首先調用SetMode()函數設定硬盤的IDLE狀態和自掉電功能,可以保證硬盤在不工作的情況下,磁頭會復位到“登陸區”;然后調用SetAdress()函數選擇對應的寄存器;接下來可以調用ReadSector()函數進行多扇區讀操作。以下是寄存器選擇子函數和多扇區讀子函數。
//寄存器選擇子函數;
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); //一次讀寫的扇區數
//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;k<0x80;k++)
for(i=0;i<512;i+=2){ //一次讀兩字節
nDIOR=0; //硬盤的讀時鐘
WCK=1;
WCK=0;
nDIOR=1;
}
nCS1FX=1; //復位CS
nCS3FX=1;
return ReadBYTE(CMD,1); //返回錯誤寄存器的信息
}
本文是“第三代碼流回放機研制”課題的一個重要組成部分。本方案利用微控制器對硬盤進行基于LBA模式下的讀寫操作(不用操作系統),硬軟件簡潔可靠,技術上也解決前期產品的兩個難題:
(1)一些舊機器的BIOS不支持INT 13h Extension,無法訪問8.4G以上硬盤空間;
(2)WINDOWS操作系統不支持存儲1.2G以上碼流文件。
將此系統逆向設計,能夠研發出適時錄制TS流和衛星節目的儀器。





