Jump to content

    

Как получить прерывание от 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: работа с ним зависит от конкретного контроллера или это как-то стандартизировано?

Share this post


Link to post
Share on other sites
Есть контроллер 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 ? Нужно только его.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this