Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2016, 08:06   #1
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию Не получается прочитать один сектор 2 раза, outb( 0x1F0);

Такая проблема, не могу прочитать один сектор больше одного раза.

Одни раз, получается. потом только следующий.

Выбираю сектор через ATA_LBA.

И еще если я хочу прочитать сектор 5, то сначала нужно прочитать сектор 4 в пустую,
и только потом могу прочитать 5й.

Нужно как то скинуть все в ноль наверное, но немогу понять как.
Уже перечитал тучу форумов.

Подскажите что не так ?

Пробовал посылать разные значения на outb( 0x1F0 + 7, 0xC4); то тоже все без столку.

Код:
// ====================================================================
void set_LBA_SEC_CNT( uint32_t _ATA_LBA, uint32_t _ATA_SEC_CNT ) {

    // ------------------------------------------------------------
    _ATA_LBA     = 1;
    _ATA_SEC_CNT = 1;
    
    outb( 0x1F0 + 2, (uint8_t)( _ATA_SEC_CNT ) );
    outb( 0x1F0 + 3, (uint8_t)((_ATA_LBA) & 0xFF) );       // low byte
    outb( 0x1F0 + 4, (uint8_t)((_ATA_LBA >> 8) & 0xFF) );  // mid byte
    outb( 0x1F0 + 5, (uint8_t)((_ATA_LBA >> 16) & 0xFF) ); // high byte
    outb( 0x1F0 + 6, 0xE0 | (0xE0 << 4) | ((_ATA_LBA >> 24) & 0x0F));
    outb( 0x1F0 + 7, 0xC4);   
    // 0x20  Read Sectors (with retries)
    // 0x21  Read Sectors ( no  retries)
    // 0x29: READ MULTIPLE EXT 
    // 0xC4: READ MULTIPLE SECTORS
    // -----------------------------------------------------------
    ATA_WAIT_400ns( 0x3F6 ); // ATA_GET_READY( ATA_0, ATA_0_CTRL );

    while ( (inb( 0x1F0 + 7) & 0x80) ) {
        printf("ATA_WAIT ... \n");
    }

    ATA_READ(); // просто читаю инфу

    // -----------------------------------------------------------

}

// ====================================================================
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 01.10.2016 в 08:11.
pompiduskus вне форума Ответить с цитированием
Старый 01.10.2016, 09:09   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

pompiduskus
Где тестируете? Какое железо или эмулятор?
Цитата:
(0xE0 << 4)
Это вообще что такое? Правда регистр 8 бит так что не влияет.

outb( 0x1F0 + 7, 0xC4);
0xC4: READ MULTIPLE SECTORS

Зачем вам этот режим почему просто не читать через 0x20 Read Sectors?
Зачем используете умножение?
READ MULTIPLE SECTORS - читает число блоков равное числу секторов заданного в нёи и умноженное на число блоков заданных в SET MULTIPLE MODE.
Судя по всему до вас кто-то установил 2 блока.
ATA_READ(); и не вычитывает все блоки. А только первый.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 01.10.2016, 10:50   #3
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

тестирую из под Linux через, qemu (i386) эмулятор


Это строка устанваливает MASTER/SLAVE bit,
Код:
ATA_LBA_MODE = 0xE0
ATA_MASTER   = 0xE0
ATA_LBA      = 2

outb( 0x1F6, ATA_LBA_MODE | (ATA_MASTER << 4) | (( ATA_LBA >> 24) & 0x0F));
До этого делал вот так, но результат еще хуже

Код:
//outb( ATA_0 + 6, (_ATA_LBA >> 24) & 0x0F);

Сейчас попробую, 0x20, и по одному сектору.
Я еще прочитал что если указать "0" секторов, то там какой-то специальный режим включается.
А тоесть есть я ставлю LBA 4, и количестко секторов для чтения 4, то я обязан все дочитать до конца ?
Это оно поэтому оно мне давало получается.

А на счет режима 0x20, я уже столько перепробовал, что просто запутался вообще.

Столько комбинаций что можно тронутся.

Я новый в этом деле, извините если написал бред про одновременное выбирание режима, так как регистр на самом деле 8 bit
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 01.10.2016, 11:52   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
А тоесть есть я ставлю LBA 4, и количестко секторов для чтения 4, то я обязан все дочитать до конца ?
Это оно поэтому оно мне давало получается.
Это глюк QUEMU после посылки команды должен был быть сброс состояния.
Так что на всякий случай всё дочитываем до конца.

Цитата:
Столько комбинаций что можно тронутся.
Согласен на все 300%
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 01.10.2016, 12:53   #5
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Сппсибо.
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 01.10.2016, 13:25   #6
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Это глюк QUEMU после посылки команды должен был быть сброс состояния.
Так что на всякий случай всё дочитываем до конца.
Всё таки ошибся. Происходит сброс прерывания, а не состояния.
И других вариантов выхода я не нашёл.
Либо всё вычитывать либо делать сброс. Но софтварный сброс занимает до 61 секунды.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 01.10.2016, 13:45   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

DEVICE RESET - выполняет быстрый сброс за 6 секунд, с копейками.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 01.10.2016, 15:32   #8
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Как ты и сказал команда 0x20 делает то что нуджно. + я ошибся очень сильно.
В документации написано что если LBA == 0 то читаются 256 секторов, по 512 byte.
А я перепутал, и прочитал как-то криво. + 0xC4 который упорно пытался все это дело дочитать.

Вообщем, по тиху по тиху, рутовую директорию ext2 прочитал.

Спасибо еще раз

Код:

    outb( ATA_0 + 2, (uint8_t)(_ATA_SEC_CNT) );
    outb( ATA_0 + 3, (uint8_t)((_ATA_LBA) & 0xFF) );         // _ATA_LBA low byte
    outb( ATA_0 + 4, (uint8_t)((_ATA_LBA >> 8) & 0xFF) );    // _ATA_LBA mid byte
    outb( ATA_0 + 5, (uint8_t)((_ATA_LBA >> 16) & 0xFF) );   // _ATA_LBA high byte
    //outb( ATA_0 + 6, (_ATA_LBA >> 24) & 0x0F); //bits 24-28 of LBA
    outb( ATA_0 + 6, ATA_LBA_MODE | (ATA_MASTER << 4) | ((_ATA_LBA >> 24) & 0x0F));
    outb( ATA_0 + 7, 0x20);   //outb( ATA_0 + 7, 0xC4); // 0x29: READ MULTIPLE EXT // 0xC4: READ MULTIPLE SECTORS

    // -----------------------------------------------------------
    //ATA_WAIT_400ns( ATA_0_CTRL ); // ATA_GET_READY( ATA_0, ATA_0_CTRL );

    while ( (inb( ATA_0 + 7) & 0x80) ) {
        printf("ATA_WAIT ... \n");
    }
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Один человек из РЖД ушел - фонд зарплатный сократился в 3 раза Alar Свободное общение 19 18.11.2015 00:49
rand() бьет в один из интервалов в два раза чаще Symba Общие вопросы C/C++ 7 06.06.2013 00:11
CreateFile прочитать бут-сектор RoS Win Api 6 06.07.2010 09:36
Отобразить один сектор матрицы на другой зеркально SoulKeeper Помощь студентам 8 07.11.2009 02:09
Не получается прочитать из файла...( Regloger Помощь студентам 3 09.12.2007 14:23