基于8位微控制器控制硬盘进行HDTV码流读写
IPjavascript:window.open(this.src);" style="cursor:pointer;"/>
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流和卫星节目的仪器。