From: Stefan E. <se...@us...> - 2002-05-10 15:33:42
|
Update of /cvsroot/blob/blob/src/lib In directory usw-pr-cvs1:/tmp/cvs-serv11822 Modified Files: ide.c Log Message: - lba read Index: ide.c =================================================================== RCS file: /cvsroot/blob/blob/src/lib/ide.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- ide.c 8 May 2002 19:16:04 -0000 1.6 +++ ide.c 10 May 2002 15:33:39 -0000 1.7 @@ -345,6 +345,69 @@ } /********************************************************************** + * hd_read_lba + * - read using LBA mode + */ +int hd_read_lba( ide_drive_t *drive, u32 lba, char *buffer) +{ + int i, hd_drive; + u8 status, hd_cmd[8]; + volatile u8 *port = NULL; + volatile u8 *reg = NULL; + + if ( !drive || !drive->ide_port ) + return -1; + + port = drive->ide_port; + reg = drive->ide_reg; + + lba &= 0x0fffffff; + + hd_drive = 0; + + hd_cmd[1] = 0; + hd_cmd[2] = 1; /* # sectors */ + hd_cmd[3] = lba&0xff; + hd_cmd[4] = (lba>>8)&0xff; + hd_cmd[5] = (lba>>16)&0xff; + hd_cmd[6] = (lba>>24)&0xff; + hd_cmd[6] |= ((hd_drive&1) << 4) | 0xe0; + + hd_busy_wait(port); + + for (i = 1; i < 7; i++) { + port[i] = hd_cmd[i]; + barrier(); + } + + port[7] = HDC_READ; + barrier(); + + hd_busy_wait(port); + + for (i = 0; i < IDE_BLOCK_SIZE; i++) { + buffer[i] = port[0]; + barrier(); + } + + drive->last_status = status = port[7]; + + if (status & ERROR) { + printf("hd_read_lba: read status: %2x\n", status); + + printf("hd_read_lba: lba=%08x\n", lba&0x0fffffff ); + for (i = 1; i < 7; i++) { + printf("hd_cmd[%d] %2x\n", i, hd_cmd[i]); + } + } + + if (status & ERROR) + return -1; + + return 0; +} + +/********************************************************************** * hd_read_mapped * * - reads 512 bytes from sector <sector_num> from drive <drive> |