IOne 0 20 сентября, 2013 Опубликовано 20 сентября, 2013 · Жалоба Есть контроллер 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: работа с ним зависит от конкретного контроллера или это как-то стандартизировано? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mar_K 0 12 декабря, 2014 Опубликовано 12 декабря, 2014 · Жалоба Есть контроллер 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 ? Нужно только его. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться