Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- - The code is a polling loop that will check the status register for BUSY_MASK.
- - If it is set, then the code will wait until STATUS_REGISTER returns to 0.
- - The two functions are called by ata_busy_poll and ata_device_ready respectively.- The code attempts to poll the status register for BUSY_MASK and DEVICE_READY_MASK.
- - The while loop in ata_busy_poll() will cause it to be executed until STATUS_REGISTER & BUSY_MASK == 0, which means that the device is not busy.
- - The while loop in ata_devicereadywill cause it to be executed until STATUS REGISTER & DEVICE READY MASK == 0, which means that the device has been ready for a long enough time (in this case since its last read).- The code is reading a sector from the disk.
- - It starts by setting up a loop that will read 256 bytes, then it sets up another loop to read 5 sectors.
- - The first thing the code does is set up an infinite loop that will run until it reads 256 bytes of data.
- - The second thing the code does is set up a for-loop that will run until it reads 5 sectors worth of data (256 * 5 = 1000).
- - In both loops, there are two things happening:
- - 1) ata_busy_poll() which tells us when we can start reading again; and 2) ata_drq_poll(), which tells us when we should stop reading so as not to miss any more data."}- The code is not actually doing anything.
- - The code is not actually doing anything.- The code starts by sending the drive head register with 0xE0 for master.
- - This is followed by a bitwise operation that sets the last 4 bits of lba to 0xF0, which means it's set to read 256 sectors at once.
- - The code then sends a null byte to error register and sends the number of sectors in Count Register (s=256) to Sector Count Register.
- - The code starts by sending the drive head register with 0xE0 for master.
- - This is followed by a bitwise operation that sets the last 4 bits of lba to 0xF0, which means it's set to read 256 sectors at once.
- - The code then sends a null byte to error register and sends the number of sectors in Count Register (s=256) to Sector Count Register.- The code attempts to set the head register of a drive to 0xE0, which is master.
- - The last 4 bits of the lba are then set to 0xF0, which means that it will be in LBA space (the lower 24 bits).
- - Send to the drive-head-register, 0xE0 for master, then set the last 4 bits of the lba.
- - This register shares multiple values, so we do this here
- - */
- - outb(DRIVE_HEAD_REGISTER, 0xE0 | (0xF0 << 4) | ((lba >> 24) & 0x0F));
- - // Send a null byte to error register as in- The code starts by setting the LBA_LO_REGISTER to 0x00.
- - This is done so that the first 8 bits of our LBA are set to 0, which means we're starting at sector 1.
- - Next, it sets the LBA_MI_REGISTER to 0x01 and then sends a read command with an address of 0x02.
- - The next line does this for sectors 2 through 4, sending commands with addresses of 0x03, 0x04, and finally ending on sector 5 where it sends a command with an address of 0xff.
- - The code loops over each sector in turn until all sectors have been sent (i < sectors).
- - For each loop iteration i = 1; i <= n; i++ {
- - Next eight bits: outb(LBA_MI_REGISTER, (uint8_t) (lba >> 8));
- - Next eight bits: outb(LBA_HI_REGISTER, (uint8_t) lba);
- - Send our read command: outb(COMMAND REGISTERSETREADSECTORSWITHRETRY); }- The code attempts to read the first sector of a hard drive.
- –
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement