LINUX.ORG.RU

помогите с драйвером


0

0

доброго времени сутоу. первый раз пишу драйвер, и, естественно, возникли проблемы. короче говоря, имеется isa digital i/o карточка с _очень_ скудной документацией. у карточки 24 канала (0 .. 23), сгруппированные по 8 штук на 1 адресе: 0 .. 7 --> base_addr + 1 8 .. 15 --> base_addr + 2 16 .. 23 --> base_addr + 3

нужно записать единицу, например, в 9 канал. каким образом можно сие сделать?

такой вариант не работает: int channel = 9; outb(1 | channel, base_addr + 2);

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

нет.

там нужно каким-то образом задать номер канала, используя побитовые операции.

при изучении исходников драйвера похожей digital карточки наткнулся на такой код:

int mask = 1 << (channel_number & 0x07); int write = data | mask; outb(write, base_addr);

здесь data - это то, что нужно записать в заданный канал.

но этот вариант тоже не поршёл =(

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

особенно интересует base_addr + 0

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

да, имеются 4 матрица ba(базовый адрес) = 0x110 + 0xA000 1 subdev(матрица) = ba + 0

2 subdev = ba + 0x400

3 subdev = ba + 0x400 * 2

4 subdev = ba + 0x400 * 3

на каждой из матриц 24 канала.

если взять базовый адрес матрицы 2, т.е. subdev_ba = 0x110 + 0xA000 + 0x400, то

subdev_ba + 0 будет являться, как сказано в документации, 'банком портов', но, к сожалению там не поясняется что это есть...

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

попробуй записать (номер_порта << 4) | (номер_канала) в base_addr + 0, после чего писать в base_addr + номер_порта

anonymous
()

проблема разрешилась - всем анонимусам спасибо ;) оказывается я потерял 5 часво времени из-за того, что у тестовой платы - которая была подключена к исходной - были нелады с питанием =)

а сама реализация примерно следующая

static void __wirte(int base, int channel, int data)

{ int mask = 1 << (channel 0x07)

(data) ? data |= mask : data &= ~mask;

outb(data, base + 0xA000);

}

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