Имеется внешний мост pci-isa на it8888, есть желание запустить на нем имеющиеся звуковые платы. Процесс успешен на 66%, т.к. из 3 имеющихся, одна не заработала. Это гусь макс. Он не отвечает на команды по адресам своих командных регистров. Хотя в адресном пространстве виден. Есть плата с распаяным таким же мостом. На ней он работает. Для локализации поиска проблемы я сделал следующее:
отключил впаяный мост подняв на нем ножку идсел и линию ад22 прицепил на внешний мост, подняв на нем эту ногу тоже. еще прицепил необходимые линии serirq и ppdmareq ppdmagnt. мост заработал, биос прописал его конфигурацию. в результате ситуация повторилась, гусь не работает, остальные платы работают. при инициализации кодека сигнал SBHE становится высоким, но никакие биты говорящие о том, что произошла инициализация в адресном пространстве не появляются
буду признателен за идеи как его запустить.
п.с. гусь не пнп, остальные две платы пнп
п.п.с.
здесь успешный запуск одной из других плат
youtube.com/watch?v=nlYXbxQneG8&list=UULAp_q5UwwtJTYMRLuEtrvw
п.п.п.с.
#include #include #include "forte.h" #include "ultraerr.h" #include "gf1os.h" #include "extern16.h" #include "defs16.h" #include "codecos.h" #include "codec.h" #include "proto16.h" extern ULTRA16_DATA _codec_data; extern IMAGE16 _image_codec; extern ULTRA_DATA _gf1_data; static void waste_time(unsigned int val) { int i,j; for (i=0;ibase_port; _codec_data.type = config->type; _codec_data.base_port = port; _codec_data.addr = port+CODEC_ADDR; _codec_data.data = port+CODEC_DATA; _codec_data.status = port+CODEC_STATUS; _codec_data.pio = port+CODEC_PIO; switch(config->type) { case 0: break; /* daughter card */ case 1: /* UltraMAX */ { setup = 0x00; /* default codec to disabled */ enable_16 = FALSE; if (port >= 0x300 && port <= 0x3f0) { enable_16 = TRUE; bits = (port - 0x30C) >> 4; /* isolate bits */ setup |= bits; } if (enable_16) setup |= 0x40; if (config->rec_dma >= 4) setup |= 0x10; /* record is 16 bit channel */ if (config->play_dma >= 4) setup |= 0x20; /* play is 16 bit channel */ _codec_data.setup = setup; /* save to toggle later */ outp(gus_base+0x106,setup); /* program the interface */ waste_time(100); /* probably not needed ... */ break; /* UltraMax */ } } /* clear any pending IRQs */ (void)inp(_codec_data.status); outp(_codec_data.status,0); for (temp=0;temp<1000;temp++) { if (inp(_codec_data.base_port) & CODEC_INIT) waste_time(1); /* probably not needed ... */ else { version = Ultra16Revision(); if ((version >= 1) && (version < 15)) { /* Don't combine if an UltraMax */ if ((config->play_dma == config->rec_dma) && (config->type != 1)) _image_codec.ic |= SINGLE_DMA; ENTER_CRITICAL; outp(_codec_data.addr,CODEC_MCE|IFACE_CTRL); outp(_codec_data.data,_image_codec.ic); outp(_codec_data.addr,IFACE_CTRL); LEAVE_CRITICAL; return(ULTRA_OK); } } } if ((version >= 1) && (version < 15)) { /* Don't combine if an UltraMax */ if ((config->play_dma == config->rec_dma) && (config->type != 1)) _image_codec.ic |= SINGLE_DMA; ENTER_CRITICAL; outp(_codec_data.addr,CODEC_MCE|IFACE_CTRL); outp(_codec_data.data,_image_codec.ic); outp(_codec_data.addr,IFACE_CTRL); LEAVE_CRITICAL; return(ULTRA_OK); } else return(NO_ULTRA); }
Нашел datasheet, мост довольно сложный, проблема интересная.
Пока только мысль относительно отличий содержимого EEPROM на плате и на карте
Сравните PCI регистры когда работает встроенный мост и когда внешний.
Другие non-PNP ISA card, например ISA-POST card работают?
init для какой OS Вы писали?
И мне кажется может быть IDSEL не брать с платы, использовать карту штатно.
А потом сравнить инициализацию регистров и при нахождении отличий модифицировать
драйвер моста или написать драйвер делающий необходимую инициализацию
Кстати как решается проблема ISA DMA штатно, если нет PC/PCI разъема?
Производитель припайку проводов вряд-ли предусматривал:)
производитель просто говорит подсоединяйте провода для прерываний и дма. к слову, гусь должен отвечать на команды и без дма. идсел пробовал по-всякому. к ад22 подключил из-за того, что на этот номер функции идет программирование регистров моста из биос. но можно и из епром взять конфиг, я туда то же самое прописал. думаю что дело не в регистрах, сравнивал уже миллион раз и регистры моста и lpc. драйвер для моста никакой не нужен. задание конфига там очень простое. у меня нет не пнп карт пока кроме гуся чтобы попробовать. но пост карта просто обязана работать, потому что даже на самом мосте есть место для распайки индикатора и можно его заказать уже с ним. инит гуся я скопировал из сдк к нему, просто чтобы показать как он происходит. я сейчас в ручном режиме команды прописываю команды в его ио пространство, вернее там всего пара бит нужна в его контрол регистр чтобы он заработал, но не хочет
обнаружил разный уровень сигнала на контакте iochrdy. там где гусь работает везде 5в, там, где не работает 2.2в. разными номиналами он подтянут к 5в как и другие сигналы. на внешнем мосту практически все сигналы через 5 ком, на плате с распяным большинство на 8.2ком, но на iochrdy и некоторые другие 1ком
Уровень IOCHRDY смотрели осциллографом?
Поскольку это выход со стороны звуковой карты для удлинения
шинного цикла(низким уровнем), следует тщательно
проверить осциллографом что там делается.
Может быть просто проблема с уровнями сигналов
(типа звуковоя карта пытается выставить "1", но из-за
повышеного входного тока ITE, это не удается).
Из широко распространенных non-PNP карт могу предложить
проверить с ISA модемом. Они в большинстве своем имеют
перемычки для отключения PNP и ручного выставления IRQ
и I/O port address.
Да и про DMA пока забудем, надо проверить простое read/write
I/O портов.
попробовал iochrdy через 1ком подтянуть, почти ничего не изменилось. стало 2.8 вместо 2.2. не могу понять почему так, на иса разъем этот сигнал идет прямо с 8888. измерял обычным мультиметром, с осциллографом пока проблема.
К сожалению без осциллографа трудно разобраться. Непонятно это заниженный уровень "1" , завышенный "0" или там нормальные TTL импульсы.
А с другими ISA картами, но с этим же мостом какой уровень?
Просто в порядке первого что пришло в голову : может быть звуковая карта
требует удлинения шинного цикла низким уровнем сигнала IOCHRDY, но ITE
почему-то этого не делает.
этот уровень на пине а10 всегда одинаковый. хоть стоит плата в слоте хоть нет. сам чип 8888 держит его каким-то образом на заниженном уровне. хотя тут же рядом на матери 5в на этом выводе
Посмотрел в datasheet, этот вход может быть и выходом
в режиме ISA-master(стр9).То есть когда ISA карта является
инициатором, а ITE исполнителем. Похоже у Вас так и есть.
Проверьте вход MASTER# N11, пересмотрите datasheet
(Я бегло смотрел и возможно что-то упустил).
в общем ты прав, надо смотреть осциллографом
удалось вернуть высокий урвень iochrdy на 5в (просаживал напряжение светодиод), но это не помогло
Отправить комментарий