Достоим привет! Дело токого рода не так давно писал программку которая с помощью драйвера giveio обращается на прямую к COM порту и все колом! (не выдавал порт ни каких сигналов при OUT а IN возвращала всегда 255) потом написал драйвер котораый в режиме ядра обращался к порту, тоже самое. Где то нашел токой код вставил в драйвер (в свой или giveio нет разници) и все везде заработало. cli mov edx,2eh ;адрес регистра ACPI - может быть 370h, 3f0h mov ebx,[3f8h] ;адрес com порта xor ecx,ecx ;логический номер устройства ACPI PortEnable1: inc cl cmp cl,7 ; ищем в промежутке 1...7 jnc PortEnablex mov al,055h ; открываем доступ к регистрам ACPI out dx,al jmp short $+2 mov al,87h out dx,al ;reset ACPI jmp short $+2 out dx,al ;reset ACPI jmp short $+2 mov al,7 ;команда адреса out dx,al jmp short $+2 inc edx ;на регистр данных mov al,cl out dx,al ;пишем адрес jmp short $+2 dec edx mov al,61h ;команда младшего адреса порта out dx,al jmp short $+2 inc edx in al,dx ;читаем младший адрес dec edx cmp al,bl ;совпадает с нашим портом? jnz PortEnable1 ;нет, не наше устройство mov al,60h ;команда старшего адреса порта out dx,al jmp short $+2 inc edx in al,dx ;читаем dec edx cmp al,bh ;совпадает с нашим портом? jnz PortEnable1 ;нет, не наше устройство ; устройство найдено mov al,70h ;команда прерывания порта out dx,al jmp short $+2 inc edx mov eax,[4] ;номер прерывания из реестра out dx,al ;устанавливаем jmp short $+2 dec edx mov al,30h ;команда enable device out dx,al jmp short $+2 inc edx mov al,1 ;открываем устройство out dx,al jmp short $+2 dec edx xor ecx,ecx PortEnablex: mov al,0aah ;закрываем доступ к регистрам ACPI out dx,al sti А теперь в суть. Может ли кто подбросить более подробную инф. по ACPI желательно на русском ? Или может этот код можно подробней прокоментировать ? Все рву строку.
здесь не ACPI, а работа с Super I/O. И заточен код под какие-то конкретные SIO-чипы (а именно с открытием по 55 87 87 или 55 и 87 87), т.е. на всех остальных он работать не будет. Доп. инфу проще всего раздобыть, узнав (например, с помощью проги CPU-Z или аналогов) название своего SIO-чипа, а затем найти и скачать даташит на него. Для сабжа есть и альтернативный вариант -- отключать порты не на уровне отрубания девайсов Super I/O, а до него -- средствами чипсета (напр., регистр LPC_EN на интеловских).
модель Super I/O он тоже показывает -- оно у него обозвано как Sensor. Не опознать (т.е. когда выводит числом вместо имени чипа) может только новые (м.б. еще редкие), в этом случае можно попробовать HWiNFO32 или еще какую прогу с той же оперы. В HWiNFO32 это строка Mainboard --> Super-IO/LPC Chip
Ага нашел LPC IO W83687THF только производителя не знаю на чипе кроме номера ничего нет даташит пока не нашел да _BC_ не обессуть так как я "работю над собой и постаянно расширяю свой кругозор" и вот такое дело нужен какойнибудь исходничек желательно на ASM где в DOSе включают и работают с какимнибудь устройством подключенным к PCI шине , а так ДОБРА И ЗДОРОВЬЯ тебе, всё ушел.
1. Берешь описание устройства 2. Конфигурируешь его (через конфигурационное адресное пространство) 3. Работаешь с ним как пример, включение и конфигурирование HPET на ICH5 Код (Text): enable_hpet: mov eax, 0x8000F8D0 ; выбираем шину, устройство, функцию (B0:D31:F0 (LPC)) и смещение в конфигурационном пространстве устройства (0xD0) mov edx, 0xCF8 ; I/O адрес CONFIG_ADDRESS out dx, eax mov edx, 0xCFC ; I/O адрес CONFIG_DATA in eax, dx ; читаем 4 байта из конфигурационного пространства по смещению 0xD0 and eax, 0xFFFE7FFF ; выбираем пространство адресов HPET (0xFED00000-0xFED003FF) or eax, 0x20000 ; включаем декодирование этого пространства со стороны LPC out dx, eax ; вносим изменения ; конфигурация HPET mov ebx, 0xFED00000 ; базовый адрес регистров HPET and dword [ebx + 0x10], 0xFFFFFFFC and dword [ebx + 0xF0], 0 ; обнуляем счетчик mov edx, dword [ebx + 0x104] mov eax, 0x2F4C mov dword [ebx + 0x100], eax mov dword [ebx + 0x108], 0x100000 ; установить значение компаратора and dword [ebx + 0x20], 0xFFFFFFF8 ; сбросить регистр статуса shr eax, 9 lea eax, dword [eax * 2 + 0x10] mov dword [0xFEC00000], eax mov dword [0xFEC00010], 0x00000020 ; конфигурирование I/O APIC sti or dword [ebx + 0x10], 1 ; включить таймер
это Winbond. Даташит -- W83627THF W83627THG Winbond LPC I/O. http://www.google.com/search?hl=ru&ie=UTF-8&oe=UTF-8&q=W83627THF%20W83627THG%20%22Winbond%20LPC%20I/O%22 Вышеприведенный код с ним (навскидку) совместим. Код включения/выключения какого-либо девайса -- это смотря на каком уровне делать, и смотря какой девайс. Часть может быть отключена в SIO-чипе, другая часть (самая обширная) -- средствами чипсета. В обоих случаях код будет зависеть от моделей соответственно SIO и чипсета. Плюс до кучи независимое отключение/усыпление некоторых внешних устройств, ихними же средствами. Есть еще конечно ACPI и APM, но это, так сказать, на любителя.
ОТ ДУШИ ДУШЕ ДУШЕВНО сами знаете.Интересная микросхемка. Интересно еще вот про архитектуру (286,386,486) можно найти много примеров и информации но дальше все становится сложнее такое чувство что держится все это под "конспёрой" или я плохо ищу или вобще это сечас не актуально? Да reiЗer внеси ясность пожалуста откуда взялся этот адрес mov dword [0xFEC00000], eax mov dword [0xFEC00010], 0x00000020 ; конфигурирование I/O APIC видь пространство адресов HPET (0xFED00000-0xFED003FF)
DRAHM 0xFEC00000-0xFEC01000 - стандартное пространство адресов I/O APIC Код (Text): mov eax, 0x2F4C ... shr eax, 9 lea eax, dword [eax * 2 + 0x10] грубо говоря, EAX теперь хранит индекс в таблице перенаправлений прерываний I/O APIC-а работа с регистрами I/O APIC, которые не отображены на адресное пространство напрямую, идет через специальные регистры I/O APIC расположенные по 0xFEC00000 (выбор регистра) и 0xFEC00010 (получение содержимого регистра или запись в него), так вот сначала выбираем регистр Код (Text): mov dword [0xFEC00000], eax а потом записываем в него Код (Text): mov dword [0xFEC00010], 0x00000020 0x20 - номер вектора прерывания (есть суть номер дескриптора в IDT)
DRAHM Да, все становиться сложнее. Во времена i286,i386,i486 то же было разнообразие машин. Так что и там были проблемы, с поиском информации. Хотя тогда она и была открытой. Эти времена я почти не застал. А вот в современные машины почти не описаны на русском. Видать это связанно с перестройкой. Если поискать в интернете, то на английском можно найти документацию почти на все оборудования. Правда некоторые производители скрывают свои стандарты.
offtop Pavia может чего знаешь по этому поводу а то складывается ощущение, что это действительно тайна буду благодарен
Привет всем! Небольшие пояснения по приведенному выше коду. Этот код я действительно писал, используя документацию под чип Winbond W83977TF, но там были адреса для SIO 3f0h,370h. У меня на домашней машине стоит ICH5, у него адрес 2eh. Гоняя код на 3 разных машинах, я заметил, что логический номер устройства на разных чипах разный, поэтому я ищу порт по его адресу. Винда его не трогает при включении-выключении порта. Адрес порта и номер прерывания брал из реестра. Винда включает - выключает порты таким же образом - я ставил Айсом брейки на порт 2eh. А вообще-то интересно на каких чипах этот код не идет.
alutov ну дык, 2Eh как конфиг для SIO появился где-то начиная с ICH/ICH0 (~1999), а именно, когда на чипсетах появился LPC-интерфейс. А W83977TF -- не LPC, по даташиту он ~1998 года, когда LPC возможно еще и в помине не было, отсюда и SIO-конфиг на 3F0h, а не 2Eh. Винда сама вообще-то не умеет работать с Super I/O. Включением/выключением устройств средствами SIO она всецело обязана соответствующим методам объектов-устройств в DSDT биоса. C самим SIO работает AML-интерпретатор, при выполнении этих методов -- именно он выполняет собственно I/O в/из SIO-порты. Надо полагать, именно отсюда появилось слово "ACPI" в комментах к коду и названии этой темы -- перехватываемый айсом I/O с портами 2Eh/2Fh видимо шел из acpi.sys. Из декомпиленной DSDT можно кстати почерпнуть работу с недокументированными SIO-чипами (и не только), т.е. с недоступными даташитами -- там работа с ним как на ладони, рипнуть алго оттуда можно быстрее, чем из дизасма биоса. Код (Text): Method (ENFG, 0, NotSerialized) { Store (0x87, INDP) Store (0x01, INDP) Store (0x55, INDP) Store (0x55, INDP) Or (POWC, 0x80, POWC) }
Пока не нашел понятного описания DSDD, где она находится в памяти и как достать из нее данные. И везде в общих чертах пишется об AML - интерпретаторе...
alutov Читай документацию ACPI. RSDP->RSDT->FADT->DSDT RSDP ищется в первом мегабайте, а именно либо ->В первом килобайте Extended BIOS Data Area(EBDA). Адрес EBDA лежит здесь 40:0Eh ->E0000h-FFFFFh Ищешь сигнатуру “RSD PTR ” выровнена по 16 Байтной границе. Дальше В RSDP ищешь RsdtAddress это смещение +16 4 байта или 32 bit physical address of the RSDT. Дальше разбираешь RSDT смотришь длину. Со смещения 36 точки входа для различных таблиц. Число точек входа определяется через длину таблицы. Точка входа 4 байта physical address Ищешь FADT Разбираешь FADT Там со смещения 40 будет Physical address of the DSDT. DSDT представляет собой таблицу плюс набор данных в AML коде, который может быть переведен в ASL. AML - бинарные коды, ASL - естественный язык. У Intel есть утилиты для конвертации.