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>
|