LINUX.ORG.RU

outb, outw и outl не записывают в порт


0

0

Делаю драйвер. В одной из функций драйвера делаю запись в порт outb, а затем счтываю значение inb. Но считанное значение ff, а не то которое я записал. Диапазон портов распределяю reqest_region.

Что сделать, чтобы outb записывал в порт?

anonymous

эти команды однозначно работают. разбирайся с железкой. может, порт не предназначен для чтения?

Vinill ★★
()
Ответ на: комментарий от Murr

А как иначе?... или разве не так...а при чем тут железка..у меня вообще ничего не подключено...но записывать должно..ведь это всего лишь ячейка памияти.

anonymous
()
Ответ на: комментарий от anonymous

>но записывать должно..ведь это всего лишь ячейка памияти.

Необязательно. Может быть какой-нибудь простенький триггер.
Или статусный регистр.

Если запись в порт происходит без нарушения защиты, то значит,
что с самим кодом нет никаких проблем. Может быть нарушена
логика программы/модуля или устройства.

Murr ★★
()
Ответ на: комментарий от Murr

Да нет на этих портах никакого устройства...Вроде после распределения диапазона портов reqest_region, я могу иметь полный доступ к этому диапазону, те писать и читать.. Да вообщем какая тут логика: для модуля пишу системный вызов write. В тело этой функции:

ssize_t drv_write(....) { unsigned char val;

outb(0x20, 0x9c40); val=inb(0x9c40); printk("<KERN>Port value - %x\n", val); }

потом в программе открываю файл устройства и делаю write. В /var/log/message запись

..... kern Port value - ff

Думаю в трех строчках напутать с логикой нереально....

anonymous
()
Ответ на: комментарий от anonymous

А 9c40 - это чей порт?

У меня, к примеру, /proc/ioports не определяет принадлежность этого порта какому-либо устройству, т.е. этот порт вообще указывает в молоко. По идее контроллер памяти может игнорировать запись по такому адресу, а при чтении выдавать какую-нибудь глупость (я думал, что обычно это 0, но может и 0xff).

Всё IMHO, естественно.

Murr ★★
()
Ответ на: комментарий от Murr

Ну тк конечно у тебя нет в /proc/ioport.. А у меня есть..тк reqest_region() связал устройство с эти диапазоном...Да впринципе это чистая формальность, чтоб другие устройства не могли занять этот диапазон..Да и вообще, когда по шине пускается предупреждение, что в какой-то порт N процессор сейчас что-то запишет, это будет волновать только устройство которому принадлежит порт N и оно должно считать из этого порта.

anonymous
()
Ответ на: комментарий от anonymous

>Да и вообще, когда по шине пускается предупреждение, что в какой-то
>порт N процессор сейчас что-то запишет, это будет волновать только
>устройство которому принадлежит порт N и оно должно считать из этого
>порта.

К системной шине не подключены устройства. Все запросы разруливает и перенаправляет контроллер системной шины (не знаю как сей зверь официально называется). request_region ничего не делает, чтобы сообщить контроллеру куда разруливать запросы на ввод-вывод, это должно сделать само устройство, для этого ты должен его запрограммировать на эти порты либо оно должно само запрограммироваться на эти порты. :)

Murr ★★
()
Ответ на: комментарий от anonymous

> А у меня есть..тк reqest_region() связал устройство
> с эти диапазоном

Murr прав, reqest_region() ничего связать не может, это
просто административная функция, чтобы исключить конфликты
между различными драйверами, она вообще ничего не делает
с железом.

нет устройства - некому и "запомнить" записанное значение.

а если бы даже устройство и было, совсем не обязательно, что
чтение возвращало бы результат предыдущей записи.

само устройство бы и решало бы, что вам вернуть, при inb().
хоть текущее время.

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.