OSDev http://osdev.su/ |
|
ATAPI чтение сектора http://osdev.su/viewtopic.php?f=7&t=968 |
Страница 1 из 1 |
Автор: | Rammstein [ 21 июл 2014, 03:19 ] |
Заголовок сообщения: | ATAPI чтение сектора |
не читается сектор. предпологаю что неправильно посылаю пакет. но где ошибка - ума не приложу. устройство устанавливает бит BSY и все, не идет никуда ._. Код: mov edi, packetCommand xor eax, eax mov ecx, 12 rep stosb mov [packetCommand], byte 0xA8 mov dword [packetCommand+2], 10000000h ;16й сектор mov dword [packetCommand+6], 01000000h ;читать 1 сектор mov [packetSize], 12 call sendDataPacket посыл команды и пакета Код: sendDataPacket: pusha ; Послать ATA-команду передачи пакетной команды mov [ATAFeatures],0 mov [ATASectorsCount],0 mov [ATASectorNumber],0 ; Загрузить размер передаваемого блока mov AX,[CDBlockSize] mov [ATACylinder],AX mov [ATAHead],0 mov [ATACommand],0A0h call sendCommandToHDD cmp [devErrorCode],0 ;проверить код ошибки jne .error xor eax, eax mov al, [channel] shl eax, 2 mov dx, [basePort+eax] add dx, 7 mov ecx, 0xFFF @@: dec ecx jz .error in AL,DX test AL,80h ;состояние сигнала BSY jnz @b test AL,1 ;состояние сигнала ERR jnz @b test AL,08h ;состояние сигнала DRQ jz @b sub dx, 7 movzx ecx, [packetSize] shr ecx, 1 mov esi, packetCommand xchg bx, bx @@: rep outsw add dx, 7 mov ecx, 0xFFF @@: dec ecx jz .error in AL,DX test AL,80h ;состояние сигнала BSY jnz @b test AL,1 ;состояние сигнала ERR jnz @b test AL,08h ;состояние сигнала DRQ jz @b mov edi, CDDataBuf movzx ecx, [CDBlockSize] shr ecx, 1 sub dx, 7 rep insw mov [devErrorCode], 0 popa ret .error: mov [devErrorCode], 1 popa ret sendCommandToHDD работает 100%, ибо я с этой же процедуриной и лоток сидирома вытаскивал, и с жестака ось грузил. собсно не могу только получить ответ от устройства, но лоток открыть могу. |
Автор: | Nable [ 21 июл 2014, 03:37 ] |
Заголовок сообщения: | Re: ATAPI чтение сектора |
Насколько я понял из вики, BSY снимается не когда данные можно начинать читать, а когда данные прочёл (и то не сразу, нужно дождаться пока обработка команды закончится). Код: /* Send ATAPI/SCSI command */
outsw (ATA_DATA (bus), (uint16_t *) read_cmd, 6); /* Wait for IRQ that says the data is ready. */ schedule (); /* Read actual size */ size = (((int) inb (ATA_ADDRESS3 (bus))) << 8) | (int) (inb (ATA_ADDRESS2 (bus))); /* This example code only supports the case where the data transfer * of one sector is done in one step. */ ASSERT (size == ATAPI_SECTOR_SIZE); /* Read data. */ insw (ATA_DATA (bus), buffer, size / 2); /* The controller will send another IRQ even though we've read all * the data we want. Wait for it -- so it doesn't interfere with * subsequent operations: */ schedule (); /* Wait for BSY and DRQ to clear, indicating Command Finished */ while ((status = inb (ATA_COMMAND (bus))) & 0x88) asm volatile ("pause"); |
Автор: | Rammstein [ 21 июл 2014, 03:55 ] |
Заголовок сообщения: | Re: ATAPI чтение сектора |
неа. не знаю что там хотели сказать (кстати там код я тоже смотрел, пытался даже скопировать - толку нуль), но устройство должно выставить эти биты в сигнал о том, что данные готовы. |
Автор: | Rammstein [ 21 июл 2014, 14:28 ] |
Заголовок сообщения: | Re: ATAPI чтение сектора |
Read (12) не работает, работает 10ти байтный пакет. ну это в борще. в других виртуалках надо тестить. |
Автор: | phantom-84 [ 21 июл 2014, 16:31 ] |
Заголовок сообщения: | Re: ATAPI чтение сектора |
Работает. Ищите ошибку в коде. |
Автор: | Rammstein [ 21 июл 2014, 20:40 ] |
Заголовок сообщения: | Re: ATAPI чтение сектора |
дык нету ошибки. все должно быть идеально. хрен знает что не так. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |