📄 ide.c
字号:
/******************************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
我的邮箱:computer-lov@tom.com
欢迎访问我的blog: http://computer00.21ic.org
IDE.C file
Created by Computer-lov
Date: 2005.3.12
Edit date:2006.3.2
Version V1.1
Copyright(C) Computer-lov 2005-2015
All rigths reserved
*******************************************************************/
#include <at89X52.h>
#include "IDE.H"
//#include <serial.h>
unsigned char IDE_Buffer_H,IDE_Buffer_L;
unsigned char bdata IDE_status;
sbit IDE_BSY = IDE_status^7;
sbit IDE_DRDY = IDE_status^6;
sbit IDE_DWF = IDE_status^5;
sbit IDE_DSC = IDE_status^4;
sbit IDE_DRQ = IDE_status^3;
sbit IDE_CORR = IDE_status^2;
sbit IDE_IDX = IDE_status^1;
sbit IDE_ERR = IDE_status^0;
unsigned char bdata IDE_error_register;
sbit IDE_BBK = IDE_error_register^7;
sbit IDE_UNC = IDE_error_register^6;
sbit IDE_MC = IDE_error_register^5;
sbit IDE_IDNF = IDE_error_register^4;
sbit IDE_MCR = IDE_error_register^3;
sbit IDE_ABRT = IDE_error_register^2;
sbit IDE_TKONF= IDE_error_register^1;
sbit IDE_AMNF = IDE_error_register^0;
void delayXms(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<225;j++);
}
void reset_IDE(void)
{
IDE_Address=IDE_Reset;
IDE_ALE=1;
IDE_ALE=0;
delayXms(200);
IDE_Address=IDE_Bus_Not_Use;
IDE_ALE=1;
IDE_ALE=0;
delayXms(200);
while(!IDE_IORDY);
}
void read_IDE_16(unsigned char address)
{
while(!IDE_IORDY);
IDE_Address=address;
set_IDE_address();
IDE_DATA_H=0xFF;
IDE_DATA_L=0xFF;
IDE_DIOR=0;
IDE_Buffer_H=IDE_DATA_H;
IDE_Buffer_L=IDE_DATA_L;
IDE_DIOR=1;
IDE_Address=IDE_Bus_Not_Use;
set_IDE_address();
}
/*
void write_IDE_16(unsigned char address)
{
while(!IDE_IORDY);
IDE_Address=address;
set_IDE_address();
IDE_DIOW=0;
IDE_DATA_H=IDE_Buffer_H;
IDE_DATA_L=IDE_Buffer_L;
IDE_DIOW=1;
IDE_Address=IDE_Bus_Not_Use;
set_IDE_address();
}*/
unsigned char read_IDE_8(unsigned char address)
{
unsigned char temp;
while(!IDE_IORDY);
IDE_Address=address;
set_IDE_address();
IDE_DATA_H=0xFF;
IDE_DATA_L=0xFF;
IDE_DIOR=0;
temp=IDE_DATA_L;
IDE_DIOR=1;
IDE_Address=IDE_Bus_Not_Use;
set_IDE_address();
return temp;
}
void write_IDE_8(unsigned char address,unsigned char w_data)
{
while(!IDE_IORDY);
IDE_Address=address;
set_IDE_address();
IDE_DIOW=0;
IDE_DATA_L=w_data;
IDE_DIOW=1;
IDE_Address=IDE_Bus_Not_Use;
set_IDE_address();
}
void read_IDE_data(void)
{
read_IDE_16(IDE_Data);
}
/*
void write_IDE_data(void)
{
write_IDE_16(IDE_Data);
}
*/
void read_IDE_status(void)
{
IDE_status=read_IDE_8(IDE_Status);
}
void read_IDE_error(void)
{
IDE_error_register=read_IDE_8(IDE_Error_Register);
}
unsigned char wait_IDE_busy(void)
{
while(!IDE_IORDY);
do
{
read_IDE_status();
if(IDE_ERR)
{
read_IDE_error();
}
}while(IDE_BSY);
IDE_Address=IDE_Bus_Not_Use;
set_IDE_address();
return 0;
}
void write_IDE_command(unsigned char command)
{
write_IDE_8(IDE_Command,command);
wait_IDE_busy();
}
/*
void soft_reset_IDE(void)
{
write_IDE_8(IDE_Device_Control,0xFD);
wait_IDE_busy();
}*/
void get_IDE_information(void)
{
unsigned int i;
unsigned int n_cylinders;
unsigned int n_heads;
unsigned int n_sectors_per_track;
unsigned long int disk_capacity;
unsigned long int temp;
// prints("获取磁盘信息...",1);
write_IDE_command(IDE_Identify_Drive);
// prints("磁盘信息:",1);
read_IDE_data();//1st word
// if(IDE_Buffer_H&0x01)prints("磁盘传输速率: 小于5MBs",1);
// if(IDE_Buffer_H&0x02)prints("磁盘传输速率: 大于5MBs小于等于10MBs",1);
// if(IDE_Buffer_H&0x04)prints("磁盘传输速率: 大于10MBs",1);
// read_IDE_data();//2nd word
((unsigned char *)&n_cylinders)[0]=IDE_Buffer_H;
((unsigned char *)&n_cylinders)[1]=IDE_Buffer_L;
// prints("柱面数: ",0);
// printf(n_cylinders);
// prints("",1);
read_IDE_data();//3th word
read_IDE_data();//4th word
((unsigned char *)&n_heads)[0]=IDE_Buffer_H;
((unsigned char *)&n_heads)[1]=IDE_Buffer_L;
// prints("磁头数: ",0);
// printf(n_heads);
// prints("",1);
read_IDE_data();//5th word
read_IDE_data();//6th word
read_IDE_data();//7th word
((unsigned char *)&n_sectors_per_track)[0]=IDE_Buffer_H;
((unsigned char *)&n_sectors_per_track)[1]=IDE_Buffer_L;
// prints("每道扇区数: ",0);
// printf(n_sectors_per_track);
// prints("",1);
disk_capacity=n_cylinders;
disk_capacity*=n_heads;
disk_capacity*=n_sectors_per_track;
disk_capacity/=2048; //磁盘容量单位为MB
// prints("磁盘容量: ",0);
// printf(disk_capacity);
// prints(" MBytes",1);
read_IDE_data();//8th word
read_IDE_data();//9th word
read_IDE_data();//10th word
// prints("磁盘序列号: ",0);
for(i=0;i<10;i++) //11--20th words
{
read_IDE_data();
// send_to_comport(IDE_Buffer_L);
// send_to_comport(IDE_Buffer_H);
}
// prints("",1);
read_IDE_data();//21th
read_IDE_data();//22th
read_IDE_data();//23th
// prints("固件版本: ",0);//24th--27th
for(i=0;i<4;i++)
{
read_IDE_data();
// send_to_comport(IDE_Buffer_L);
// send_to_comport(IDE_Buffer_H);
}
// prints("",1);
// prints("Model number: ",0);//28th--47th
for(i=0;i<20;i++)
{
read_IDE_data();
// send_to_comport(IDE_Buffer_L);
// send_to_comport(IDE_Buffer_H);
}
// prints("",1);
read_IDE_data();//48th
read_IDE_data();//49th
read_IDE_data();//50th
// if(IDE_Buffer_H&0x01)prints("支持DMA模式",1);
// if(IDE_Buffer_H&0x02)prints("支持LBA模式",1);
for(i=0;i<4;i++)read_IDE_data();//51th--54th
// prints("当前柱面数: ",0);
read_IDE_data();//55th
temp=0;
((unsigned char *)&temp)[2]=IDE_Buffer_H;
((unsigned char *)&temp)[3]=IDE_Buffer_L;
// printf(temp);
// prints("",1);
// prints("当前磁头数: ",0);
read_IDE_data();//56th
temp=0;
((unsigned char *)&temp)[2]=IDE_Buffer_H;
((unsigned char *)&temp)[3]=IDE_Buffer_L;
// printf(temp);
// prints("",1);
// prints("当前每道扇区数: ",0);
read_IDE_data();//57th
temp=0;
((unsigned char *)&temp)[2]=IDE_Buffer_H;
((unsigned char *)&temp)[3]=IDE_Buffer_L;
// printf(temp);
// prints("",1);
// prints("当前磁盘容量: ",0);
read_IDE_data();//58th
DISK_CAPACITY[2]=IDE_Buffer_H;
DISK_CAPACITY[3]=IDE_Buffer_L;
((unsigned char *)&temp)[2]=IDE_Buffer_H;
((unsigned char *)&temp)[3]=IDE_Buffer_L;
read_IDE_data();//59th
DISK_CAPACITY[0]=IDE_Buffer_H;
DISK_CAPACITY[1]=IDE_Buffer_L;
((unsigned char *)&temp)[0]=IDE_Buffer_H;
((unsigned char *)&temp)[1]=IDE_Buffer_L;
temp/=2048; //磁盘容量单位为MB
// printf(temp);
// prints(" MBytes",1);
for(i=59;i<=255;i++)
{
read_IDE_data();
// printc(i);
//printc(IDE_Buffer_L);
// send_to_comport(' ');
//printc(IDE_Buffer_H);
//send_to_comport(' ');
}
}
void write_IDE_LBA3(unsigned char LBA3)
{
write_IDE_8(IDE_LBA_Bits_0_7,LBA3);
}
void write_IDE_LBA2(unsigned char LBA2)
{
write_IDE_8(IDE_LBA_Bits_8_15,LBA2);
}
void write_IDE_LBA1(unsigned char LBA1)
{
write_IDE_8(IDE_LBA_Bits_16_23,LBA1);
}
void write_IDE_LBA0(unsigned char LBA0)
{
LBA0&=0x0F;
LBA0|=0xE0;//磁盘0工作在LBA模式下
write_IDE_8(IDE_LBA_Bits_24_27,LBA0);
}
void write_IDE_sector_count(unsigned char count)
{
write_IDE_8(IDE_Sector_Count,count);
}
/*
void read_IDE_buffer(void)
{
write_IDE_command(IDE_Read_Buffer);
}
void write_IDE_buffer(void)
{
write_IDE_command(IDE_Write_Buffer);
}
*/
void read_IDE_sector(void)
{
write_IDE_command(IDE_Read_Sectors);
}
void write_IDE_sector(void)
{
write_IDE_command(IDE_Write_Sectors);
}
void IDE_initial(void)
{
reset_IDE();
// prints("IDE复位...",1);
// prints("磁盘忙,请等待...",1);
do
{
write_IDE_8(IDE_Drive_Head,0xE0);
read_IDE_status();
}while(IDE_BSY);
wait_IDE_busy();
write_IDE_8(IDE_Device_Control,0xFA);//没有中断模式f
get_IDE_information();
}
void system_initial(void)
{
EA=0;
IDE_Address=IDE_Bus_Not_Use;
IDE_ALE=1;
IDE_ALE=0;
delayXms(100);
// init_comport(57600);
// prints("",1);
// prints("开机...",1);
IDE_initial();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -