上一篇文章中(http://www.dongsenyule.com/Company/Detail/156999.shtml),介紹了一種基于AVR單片機的硬盤讀寫電路,采用的是8255芯片擴展IO口的方式。其實也可以直接用單片機的PA口和PB口接到硬盤的16根數據線上,利用PD口作為地址線和控制線,PC口接串口,作為控制指令的輸入和狀態的輸出口。這樣電路可適當化簡,但是不能用JTAG在線調試,只能用ISP下載程序到單片機。由于去掉了擴展接口的8255芯片,所以控制程序中可以去掉初始化和操作8255芯片的代碼模塊。從整體上看,單片機上的軟件,包括主程序和各個子程序模塊。
子程序模塊完成特定的功能,包括:硬盤初始化模塊,控制參數讀寫模塊,扇區讀模塊,扇區寫模塊,數據緩沖模塊等組成。
圖1、單片機程序模塊
硬盤初始化模塊,完成硬盤上電復位或硬件復位操作的延時,以PIO時序讀取硬盤狀態寄存器,執行硬盤IDENTIFY DEVICE命令,獲取硬盤基本信息,配置硬盤參數SET FEATURES命令,完成硬盤工作模式設置等工作;
硬盤控制參數讀寫模塊:單片機對硬盤的控制與讀寫,需要通過對硬盤寫入指令和參數來實現,比如讀寫扇區時,需要寫入要讀寫扇區的28位或48位LBA地址和扇區數,這就需要單片機以PIO時序讀寫相關的寄存器,存儲必要的參數,讀取需要的狀態數據。該模塊根據指令讀寫相關的參數寄存器;
扇區讀模塊:實現以PIO時序讀取目標盤的數據;
扇區寫模塊:實現以PIO時序向目標盤寫入數據;
數據緩沖模塊:對讀取或要寫入的數據進行拼接拆分等處理。
主程序模塊完成總體的調度和運行,根據串口輸入的指令,完成相應的功能,控制各個模塊執行操作。
整個軟件部分中,最關鍵的是PIO讀寫時序的實現,其時序圖為:
圖2 PIO時序圖
程序實現步驟為:首先寫地址信號,DA2-DA0,CS1-CS0,然后進入等待延遲計時,計時時間T1到,拉低讀或寫信號線(DIOR-或DIOW-),繼續計時T2-T3時刻,當寫數據時,向數據線上加載數據,繼續計時到T2時刻,讀或寫信號拉高,當寫數據時,數據線數據繼續保持T4時間,繼續計時到T9時刻,地址線無效,繼續延時計時T2i-T9時間后,一個讀寫周期結束。
部分實現的代碼為:
//硬盤初始化
void HardDisk_init(void)
{
byte s=0;
Write_ata_reg(DeviceAndHead,0xE0);//LBA模式
do
{
s = Read_ata_reg(Status_Command);
}while(!(s & Status_DRDY)|(s & Status_BUSY));
Write_ata_reg(Status_Command,0x91);
Wait_BSY();
}
//讀硬盤參數
int Driver_ID(void)
{
unsigned int i,j;
unsigned char data_buff[8];
while(!Disk_RDY());
Write_ata_reg(Status_Command,0xec);
while(!Disk_DRQ());
chip8255_Config(0x92);//A口、B口輸入、C口輸出,方式00
do
{
//讀取硬盤信息
for(j=0;j<8;j=j+2)
{
Write_8255PoartC(Data);
Write_8255PoartC(Data| SBIT(6));
PORTB &= ~SBIT(2);//置/CS低電平
PORTB &= ~SBIT(0);//置A0,A1為00
PORTB &= ~SBIT(1);
DDRA = 0x00;//單片機A口輸入
PORTB &= ~SBIT(3);//發送讀脈沖
data_buff[j] = PINA;
PORTB |= SBIT(3);
PORTB |= SBIT(2);//置/CS為高電平
PORTB &= ~SBIT(2);//置/CS低電平
PORTB &= ~SBIT(1);//置A1為0
PORTB |= SBIT(0);//置A0為1
DDRA = 0x00;//單片機A口輸入
PORTB &= ~SBIT(3);//發送讀脈沖
data_buff[j+1] = PINA;
PORTB |= SBIT(3);
PORTB |= SBIT(2);//置/CS為高電平
Write_8255PoartC(Data&(~SBIT(6)));
}
i=i+8;
}while(i<512);
//讀數據
void Read_Data(void)
{
DiskData_Buffer_L = 0;
DiskData_Buffer_H = 0;
chip8255_Config(0x92);//A口、B口輸入、C口輸出,方式00
Write_8255PoartC(Data);
Write_8255PoartC(Data| SBIT(6));//IOR拉高,PC6,IDE_IOR拉低
Write_8255PoartC(Data&(~SBIT(6)));//IOR拉低,PC6,IDE_IOR拉高
}
利用單片機讀寫硬盤雖然存在速度慢的缺陷,但是由于單片機軟件開發較為簡單,實現方式比較靈活,因此用單片機來制作一些硬盤固件級維修工具是比較經濟可行的,利用SD卡存取要操作的固件數據,通過SPI接口連接到單片機,通過串口發送指令,將是一個非常經濟實用的方案。
關于達思科技
達思科技的全稱是達思凱瑞技術(北京)有限公司,是數據恢復行業的著名品牌,在全國乃至整個亞洲地區具有較高的知名度。達思科技是一家真正掌握數據恢復核心技術的企業,公司的數據恢復技術研發中心不但承擔公司自主知識產權數據恢復軟件的研發任務,還為眾多大型企事業單位擔當數據安全顧問的角色。達思科技對數據恢復技術的深入研究,尤其在Unix及Linux大型存儲設備的數據恢復方面(包括EXT3文件系統刪除數據、UFS文件系統數據恢復、XFS文件系統數據恢復技術、IBM-AIX JFS2文件系統數據恢復高端技術、Vmware虛擬機數據恢復技術等)獨樹一幟,在同行業中具有較為明顯的優勢,達思科技承接的其他公司無法恢復的疑難案例不計其數。
達思科技數據恢復技術研發中心于2009年10月啟動了科技創新計劃,陸續發布了多款自主軟件產品。截止到2013年12月,達思科技自主知識產權的數據恢復軟件達到23款,其中Unix和Linux企業級數據恢復技術以及手機等移動終端數據恢復技術國際領先!
達思科技職業院校數據恢復實訓室是國內職業院校的首選,已經在多家學校正式運營,其中北京勞動保障職業學院、北京政法職業學院、北京商貿學校等中高職均采用達思數據恢復實訓室,開設了數據恢復專業課程。開展了深度校企合作,深受師生青睞。
達思數據恢復實驗室解決方案是多家涉密單位和科研機構指定建設單位,達思科技具備大型、中型和小型數據恢復實驗室設計與建設的能力,為涉密單位提供了安全保密數據恢復實驗室,為數據安全筑起最后一道防線。典型成功案例有天津市國家保密局數據恢復實驗室項目、總裝備部裝甲兵工程學院數據恢復實驗室項目、中央和國家機關涉密載體銷毀中心數據恢復項目等。