Перейти к содержанию
    

Как получить прерывание от SATA(в режиме IDE)?

Есть контроллер SATA, который похож на контроллер, входящий в состав Intel 6 Series Chipset. Он подключается через PCI к процессорному модулю с архитектурой MIPS64.

Я работаю с ним в режиме IDE без DMA, проблема в том, что почему-то нет прерываний.

 

Последовательность действий такая:

1) Выделяю BAR'ам пространство в области ввода-вывода.

2) Подключаю обработчик прерывания и разрешаю прерывание PCI на самом процессорном модуле.

3) В PCI по адресу 0x4 записываю 0xffff035d, тем самым ставя биты 0, 2, 3, 4, 6, 8, 9 в регистре Command шины PCI.

4) Делаю ресет контроллера и перевожу его в режим IDE.

5) Записываю 0 в Control Register чтобы разрешить прерывания.

6) Записываю 0xa0 в drive/head register.

7) Записываю 0xec(команда идентификации) в регистр Command.

8) Жду, пока не снимится бит 7(BSY) и не установится бит 3(DRQ) в регистре Status.

 

После этого по идее должно быть прерывание, но его нет, в дальнейшем работаю с диском по опросу битов BSY и DRQ, диск работает нормально, но за всё время не было ни одного прерывания.

Правильный ли у меня алгоритм действий, или я что-то пропустил?

 

Ещё вопрос по поводу DMA: работа с ним зависит от конкретного контроллера или это как-то стандартизировано?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть контроллер SATA, который похож на контроллер, входящий в состав Intel 6 Series Chipset. Он подключается через PCI к процессорному модулю с архитектурой MIPS64.

Я работаю с ним в режиме IDE без DMA, проблема в том, что почему-то нет прерываний.

 

Последовательность действий такая:

1) Выделяю BAR'ам пространство в области ввода-вывода.

2) Подключаю обработчик прерывания и разрешаю прерывание PCI на самом процессорном модуле.

3) В PCI по адресу 0x4 записываю 0xffff035d, тем самым ставя биты 0, 2, 3, 4, 6, 8, 9 в регистре Command шины PCI.

4) Делаю ресет контроллера и перевожу его в режим IDE.

5) Записываю 0 в Control Register чтобы разрешить прерывания.

6) Записываю 0xa0 в drive/head register.

7) Записываю 0xec(команда идентификации) в регистр Command.

8) Жду, пока не снимится бит 7(BSY) и не установится бит 3(DRQ) в регистре Status.

 

После этого по идее должно быть прерывание, но его нет, в дальнейшем работаю с диском по опросу битов BSY и DRQ, диск работает нормально, но за всё время не было ни одного прерывания.

Правильный ли у меня алгоритм действий, или я что-то пропустил?

 

Ещё вопрос по поводу DMA: работа с ним зависит от конкретного контроллера или это как-то стандартизировано?

5) Все 8 бит нулями или только бит nIEN ? Нужно только его.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...