OSDev
http://osdev.ru/

ATAPI чтение сектора
http://osdev.ru/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/