viernes, 7 de febrero de 2014

Read and Write IDE ATA functions in C

The following functions in C  allows you to read and write a single sector in a hard disk:

int IDE1=0x1F0;
unsigned int drive=0x00;

int Read_Disk(unsigned long addr, unsigned char *targetbuffer)
{
unsigned int i;
int idx;

unsigned int tmpword;
unsigned char buffer[512];
outb(0x00,IDE1+0x01);//null data
outb(0x1,IDE1+0x02);//sector count
outb((unsigned char) addr,IDE1+0x03 );
outb((unsigned char)(addr >> 8),IDE1+0x04 );
outb((unsigned char)(addr >> 16),IDE1+0x05 );
outb(0xE0 | (drive << 4) | ((addr >> 24) & 0x0F),IDE1+0x06 );
outb( 0x20,IDE1+0x07);
while (!(inb(IDE1+0x07) &0x08)) {
//printf("waiting for HD 0x%x\n",addr);
inb(IDE1+0x07);
}
for (idx = 0; idx < 512; idx++)

{
tmpword = inw(IDE1+0x0);
buffer[idx] = (unsigned char)tmpword;
buffer[idx  + 1] = (unsigned char)(tmpword >> 8);
   //printf("%hhx %hhx ",(unsigned char)buffer[idx],(unsigned char)buffer[idx+1]);
  idx++;
}

memcpy(targetbuffer,&buffer,512);

return idx;
}

int Write_Disk(unsigned long addr, unsigned char *targetbuffer)
{

unsigned int i,drive;

int idx;
int m=0;
drive=0;
unsigned int tmpword;
unsigned char buffer[512];
memcpy(&buffer,targetbuffer,512);
outb(0x00,IDE1+0x1);//null data
outb(0x1,IDE1+0x2);//sector count
outb((unsigned char) addr,IDE1+0x3 );
outb((unsigned char)(addr >> 8),IDE1+0x4);
outb((unsigned char)(addr >> 16),IDE1+0x5 );
outb( 0xE0 | (drive << 4) | ((addr >> 24) & 0x0F),IDE1+0x6);
outb( 0x31,IDE1+0x7);//write command
while ((inb(IDE1+0x7) != 0x58)) {
//printf("Write waiting for HD\n");
}
for (idx = 0; idx < 2*512; idx++)

{
tmpword = buffer[ idx ] | (buffer[ idx  + 1] << 8);
outw(tmpword,IDE1+0x0);
idx++;
}

return idx;
}


No hay comentarios:

Publicar un comentario