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

    

Как получить прерывание от 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 ? Нужно только его.

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация