Jump to content

    
Sign in to follow this  
IOne

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

Recommended Posts

Есть контроллер 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this