Semnatura Termica A Unui Sistem DE Calcul

Cuprins

1. Introducere

1.1 Importanța temperaturii și puterii în contextul evoluției tehnologice

În ultimii ani, progresele realizate în domeniul microelectronicii au fost foarte mari și foarte rapide, în special în ceea ce privește tehnologia de fabricație a circuitelor integrate VLSI. Pentru a oferi o putere de calcul tot mai mare (mai multe funcționalități, complexitate ridicată) și viteză de procesare tot mai mare, la baza evoluției circuitelor integrate a stat așa numitul proces de scalare. Scalarea este procesul prin care se poate crește densitatea de integrare și viteza de operare, prin micșorarea dimensiunilor tranzistorilor, scăderea tesiunii de prag și a tensiunii de alimentare (tabelul 1.1). Pe un plan secund au fost lăsate alte caracteristici importante cum ar fi puterea consumată, temperatura disipată și în unele cazuri chiar calitatea și fiabilitatea circuitelor, care au fost în mod direct afectate de procesul de scalare. Însă, în ultimul timp, datorită problemelor care apar, tot mai mult se discută despre controlul puterii consumate și scăderea temperaturii disipate de circuitele integrate VLSI. În continuare, în acest paragraf introductiv, va fi prezentat modul în care evoluția a influențat puterea consumată și temperatura disipată de circuitele integrate.

Tabelul 1.1 – Caracteristicile procesului de scalare [Chung2001]

Cerințele pieței pentru microprocesoare tot mai performante (tabelul 1.2) a condus la creșterea continuă și accentuată a puterii consumate de acestea și deci și a aplicațiilor în care sunt folosite [Gunther2001, Viswanath2000, Chung2001]. Creșterea consumului de putere nu afectează doar costul de utilizare al produsului ci și performanța și durata de viață a acestuia.

Tabelul 1.2 – Evoluția procesoarelor Intel

Principalul parametru care este influențat în mod direct de creșterea puterii consumate de un circuit integrat este temperatura. Temperatura este un parametru extrem de important în contextul circuitelor integrate deoarece creșterea acesteia influențează negativ atât performanța circuitului cât și fiabilitatea acestuia.

Efectele creșterii temperaturii sunt:

– scăderea vitezei – viteza scade cu 0.15% pentru fiecare creștere a temperaturii cu 1 oC. Creșterea temperaturii afectează timpii de comutare la nivel de poartă logică (vezi figura 1.2);

– scăderea fiabilității – durata de viață se diminuează cu 50% la o creștere a temperaturii cu 10-15 oC. Creșterea temperaturii afectează și degradează fizic structura de siliciu ducând la defectarea prematură a circuitului; creșterea curenților reziduali – IOFF crește cu temperatura. Poate apare fenomenul de fugă termică (thermal runaway) datorită creșterii curenților reziduali care implică o încălzire și mai puternică a circuitului, care la rândul ei produce un curent mai mare, ș.a.m.d.

Figura 1.1 – Performanța vs. temperatură [Sofia2000]

Din practică s-a constatat că cea mai întâlnită cauză de defectare la circuitele integrate este temperatura, 55% din totalul cauzelor de defectare se datorându-se acesteia (vezi figura 1.2). Circuitele integrate au specificate ca și date de catalog și valorile maxime admisibile pentru temperatura joncțiunii. Dacă se depășește această valoare circuitul riscă să se defecteze și se degradează mai repede. Din acest motiv, chiar dacă puterea consumată de un circuit integrat crește, temperatura acestuia trebuie păstrată sub valoarea maximă admisibilă, prin utilizarea mecanismelor de răcire corespunzătoare.

Figura 1.2 – Principalele cauze de defectare ale circuitelor integrate [Sofia2000]

Pentru microprocesoare s-a constatat că puterea consumată depinde de tipul aplicației executate (figura 1.3), astfel că în timpul funcționării puterea variază în funcție de aplicațiile executate la un moment dat. Sistemul trebuie astfel proiectat încât să asigure funcționarea procesorului sub limita maximă specificată pentru temperatură, chiar dacă puterea consumată crește până la valoarea maximă. Pentru a satisface acest deziderat trebuie utilizate sisteme de răcire tot mai performante, la prețuri cât mai mici.

Figura 1.3 – Variația puterii consumate funcție de aplicație [Viswanath2000]

Un al doilea parametru afectat de creșterea puterii consumate este curentul absorbit de circuit. Curentul absorbit de circuit crește atât datorită creșterii puterii consumate cât și datorită micșorării tensiunii de alimentare. De exemplu, pentru un procesor Pentium 4 ce consumă 75W, la o tensiune de alimentare de 1.5V, va absorbi un curent de ~50A.

Efectele creșterii curentului sunt:

– apariția căderilor de tensiune pe liniile de alimentare;

– afectarea tranzițiilor, fronturile semnalului de tact;

– scăderea fiabilității și apariția defectelor (scurt-circuite și întreruperi datorită migrării electronice).

În al treilea rând, costul soluțiilor de răcire depinde și el de temperatură. În ultimii ani, în primul rând datorită concurenței, tendința prețurilor de livrare a dispozitivelor electronice a fost într-o continuă scădere în ciuda creșterii performanțelor acestora. Creșterea puterii consumate de dispozitivele electronice și a temperaturii disipate de acestea impun însă costuri suplimentare în direcția reducerii lor și a testării.

Tendințele tehnologice pentru următorii ani vor rămâne aceleași:

– CMOS va rămâne încă tehnologia de fabricație atât pentru circuitele logice cât și pentru memorii;

– dimensiunile ariei de integrare și densitatea de integrare vor continua să crească generând un flux tot mai mare de căldură;

– costul va continua (va trebui) să scadă, chiar dacă apar problemele de răcire și control al puterii consumate;

– reducerea timpului de proiectare.

Va fi totuși o redirecționare a eforturilor către:

– găsirea unor noi soluții de răcire mai eficiente și mai ieftine;

– proiectarea se va face în funcție de puterea consumată și temperatură pentru minimizarea acestora;

– creșterea fiabilității circuitelor și găsirea unor noi metode de testare a fiabilității;

– controlul puterii consumate și a temperaturii disipate.

1.2 Scopul aplicației

În cazul funcționării unui calculator în interiorul carcasei, mai ales vara, temperatura aerului poate atinge ușor valori de peste 45C, datorită tuturor componentelor care degajă căldură. Odată cu apariția de componente mari consumatoare de energie a crescut și căldura disipată de acestea. O temperatură prea ridicată nu poate fi decât dăunătoare componentelor și poate să ducă la deteriorarea acestora.

Aplicația a fost concepută pentru monitorizarea proceselor ce rulează la un moment dat și a temperaturii unui sistem (PC) putând citi informații despre procese, despre temperatură atât din interiorul carcasei, cât și de la dispozitive externe conectate la portul serie.

Un avantaj al acestei aplicații este că poate citi informații de pe mai multe plăci de bază, iar montajul extern se poate extinde ușor la mai mulți senzori. Aplicația citește informația de pe magistrala SMBus (despre care se va vorbi într-un capitol ulterior), fapt care-i conferă avantajul de a fi ușor extinsă pentru mai multe plăci de bază cu un efort mic. Senzorii de pe montajul extern vor fi legați pe aceeași magistrală folosind protocolul 1-Wire Bus dezvoltat de firma Dallas Semiconductor. Numărul senzorilor care se pot lega pe această magistrală este teoretic nelimitat, acest număr depinzând de necesitățile utilizatorului.

De asemenea, aplicația poate fi dezvoltată în continuare printr-un modul de control ce ar avea ca sarcini, în cazul detectării unei temperaturi prea ridicate, atenționarea utilizatorului, oprirea sistemului sau chiar alte operații ce pot duce la scăderea acesteia. Primele două sarcini sunt mai ușor de implementat dar, pentru conceperea unor operații mai complexe, sunt necesare anumite studii referitoare la diferitele categorii de componente ce pot duce la încălzirea excesivă a sistemului și studierea componentelor din aceeași categorie dar de la producători diferiți.

2. Metode de măsurare a temperaturii

2.1. Tipuri de senzori de temperatură

Există multe tipuri de senzori de temperatură, în consecință există și multe metode de măsurare a temperaturii. Nu există o metodă de măsurare a temperaturii care să fie universal valabilă pentru toate categoriile de aplicații; o metodă poate să dea rezultate bune pentru o categorie de aplicații dar pentru altă categorie de aplicații poate să eșueze.

În continuare voi prezenta cei mai des folosiți senzori de temperatură: termocuplul, senzorul termo-rezistiv (RTD), termistorul și senzorul de temperatură integrat în pastilă de siliciu. Există și alte metode de măsurare a temperaturii, ca de exemplu folosirea pirometrului optic, dar care nu țin de obiectul acestui proiect.

Fiecare tip de senzor are o serie de parametrii care îl caracterizează: domeniul de măsurare a temperaturii, sensibilitatea, linearitatea, dimensiunea, prețul senzorului și multe altele. Caracteristicile celor patru tipuri de senzori de temperatură sunt prezentate în (tabelul 2.1).

Tabelul 2.1 – Caracteristicile senzorilor de temperatură

2.2. Termocuplul

Termocuplul este format din 2 conductoare de metal sau aliaje diferite care sunt sudate împreună (figura 2.1). Temperatura joncțiunii de referință (Reference Junction) este folosită pentru a diminua erorile induse de joncțiunea de fier-cupru (Iron-Copper Junction) și joncțiunea de cupru-constantan (Copper-Constantan Junction). Punctul de sudură al aliajelor (Solder Joint) se poziționează în locul în care se dorește măsurarea temperaturii. Funcționarea termocuplului se bazează pe efectul termoelectric direct. Din cauza acestui efect se produce o diferență de potențial între cele două joncțiuni, această diferență de potențial fiind proporțională cu temperatura măsurată.

Figura 2.1 – Termocuplul de tip J

Teoretic termocuplul se poate realiza din orice două metale diferite, dar practic există numai câteva tipuri de termocupluri, deoarece se dorește ca acestea să fie cât mai sensibile la variațiile de temperatură (Coeficientul Seebeck să fie cât mai mare). Tipurile de termocupluri cele mai des folosite sunt prezentate în (tabelul 2.2).

Tabelul 2.2 – Tipurile de termocupluri

Termocuplurile sunt foarte neliniare în comparație cu RTD-ul, termistorul sau senzorul de temperatură integrat. Așadar utilizarea termocuplurilor presupune și folosirea unor algoritmuri complexe de liniarizare a diferenței de potențial de la ieșirea senzorului. De exemplu pentru termocuplul de tip K și intervalul de temperatură 0C – 1372C se folosește ecuația:

V=c0 + c1t + c2t2 + c3t3 + …

Unde:

V – diferența de potențial dintre joncțiunile termocuplului

t – temperatura măsurată

c0, c1,c2, … c9 – coeficienții folosiți pentru liniarizare (tabelul 2.3)

Tabelul 2.3 – coeficienții folosiți pentru a liniariza variația diferenței de potențial

O alternativă pentru acest algoritm de liniarizare este folosirea unui tabel de conversie. Un astfel de tabel de conversie are ca intrare diferența de potențial de la ieșirea termocuplului și ca ieșire temperatura în grade Celsius.

Timpul de răspuns al termocuplului pentru temperaturi ridicate este mai mic raportat la timpul de răspuns al termistorului sau RTD-ului.

Domeniul termocuplului (-270C, +1800C) este mai mare decât domeniul termistorului sau RTD-ului, așadar se poate folosi în condiții extreme de temperatură. Prețul termocuplurilor este scăzut, ca și dimensiune termocuplurile sunt mici. Ele pot fi încapsulate într-un tub protector format din ceramică și metal.

Dezavantajele termocuplurilor sunt: semnalul de ieșire (diferența de potențial) este slab, necesită calibrare termică, semnalul de ieșire nu este liniar, acuratețea este scăzută.

2.3. RTD -ul

Tehnologia RTD (Resistive Temperature Device) este îmbunătățită constant, calitatea senzorilor RTD devenind din ce în ce mai bună. Pentru a produce senzori de temperatură RTD de calitate și acuratețe mare trebuie alese cu atenție materialele componente ale acestuia. Aceste materiale sunt de obicei metalcei metalele rezistive: Platină, Nichel sau Cupru. Aceste metale sunt alese pentru că la o variație a temperaturii au o variație mare a rezistenței. Tabelul 2.4 ilustrează rezistivitatea acestor metale.

Tabelul 2.4 – rezistivitatea metalelor folosite la RTD-uri

Dintre cele 3 tipuri de RTD-uri acuratețea cea mai bună o are RTD-ul din platină, prescurtat PRTD. Rezistivitatea platinei este mai mare decât al celorlalte metale, astfel senzorul poate să aibă dimensiuni mai mici. Senzorii sunt caracterizați prin rezistența lor la 0C. De exemplu rezistența PRTD-ului standard este de 100, dar există și senzori PRTD cu rezistențe de 50, 200, 500, 1000 sau 2000.

Relația dintre variația temperaturii și variația rezistenței PRTD–ului este aproape liniară. Tabelul 2.5 ilustrează variația rezistenței la variația temperaturii.

Tabelul 2.5 – Variația rezistenței la PRTD

Pentru a calcula variația R al rezistenței se folosește formula:

R= (Thermal Response) * R0 * t

De exemplu variația rezistenței, pentru un PRTD de 100, de la 0C la 100C este:

R= 0.00038//C * 100 * 100C =38.5

cum se poate observa și din Tabelul 2.5.

Din toți senzorii prezentați RTD-ul este cel mai liniar, necesitând doar 3 coeficienți de liniarizare. Pentru temperaturi între 0C și 859C se folosește ecuația de liniarizare:

Rt = R0(1 + At + Bt2),

iar pentru temperaturi între –200C și 0C ecuația:

Rt=R0(1 + At + Bt2) + C(t – 100t3)

Unde:

Rt – rezistența RTD-ului la temperatura măsurată

t – temperatura măsurată

R0 – rezistența RTD-ului la 0C

A, B, C – coeficienții de liniarizare determinați experimental.

Aceste ecuații se pot rezolva după 5 iterații cu o precizie de 0.001C.

Dezavantajele RTD-ului sunt: pot apărea erori datorită impurității materialelor din care este construit, vibrațiile și șocurile au efect negativ asupra repetabilității măsurării, apare efectul electrocaloric (Joule-Lenz) care induce erori suplimentare în procesul de măsurare. Prețul senzorilor RTD este mult mai mare decât a celorlalți senzori așa că nu este rentabil folosirea lor în toate tipurile de aplicații.

2.4. Termistorul

Este un element de circuit (senzor de temperatură) cu proprietăți semiconductoare a cărui rezistență variază cu temperatura după o lege exponențială. Există două tipuri de termistoare: cu coeficient negativ de temperatură (NTC) și cu coeficient pozitiv de temperatură (PTC).

Termistorul NTC este construit din oxizi metalici, (de exemplu: de mangan, de nichel, de cobalt, de fier, de zinc) sinterizați. Acesta are acuratețea mult mai mare decât un senzor RTD, așadar este și mult mai sensibil la variațiile de temperatură. Figura 2 ilustrează această diferență între un termistor NTC și un RTD de 100.

Un dezavantaj al termistorului NTC este liniaritatea scăzută față de un senzor RTD (figura 2.2). Pentru liniarizare se folosește ecuația:

ln Rt = B0 + B1t -1 + B2t -2 + B3t –3

Unde B0,B1,B2,B3 – sunt constante de material al termistorului.

Această ecuație se poate rezolva cu o precizie de 0.005C, dar este complicată implementarea rezolvării într-un microcontroler. O alternativă ar fi utilizarea unui tabel de conversie.

La fel ca și la RTD și la termistor apare efectul electrocaloric care induce erori în procesul de măsurare. Aceste erori se pot atenua printr-o calibrare software.

Figura 2.2 – Diferența între un termistor NTC și un senzor RTD

Termistorul PTD, are un coeficient de temperatură pozitiv și este construit din titanat de bariu. Sensibilitatea termistorului PTC este mult mai mare față de termistorul NTC. Domeniul de măsurare al termistorului PTC este (–25C, +150C).

În Figura 3 este ilustrată caracteristica rezistență–temperatură al unui termistor PTC. Pe prima porțiune (0, T) forma curbei este aproape constantă. Pe a doua porțiune, pentru temperaturi mai ridicate de T se schimbă caracteristica rezistență–temperatură. Peste acestă temperatură T o creștere a temperaturii duce la mărirea rezistenței PTC și curba caracteristicii rezistență–temperatură devine foarte abruptă.

Un alt tip de termistor cu coeficient de temperatură pozitiv este Silistorul. Acest dispozitiv este construit din silicon termo-senzitiv și are domeniul de (–60C, +150C). Caracteristica rezistență–temperatură al silistorului este liniară pe tot domeniul de măsurare (figura 2.3).

Figura 2.3 – Caracteristica rezistență–temperatură

al termistorului PTC și al Silistorului

2.5. Senzorul de temperatură integrat în pastilă de siliciu

Senzorul de temperatură integrat în pastilă de siliciu este o alternativă viabilă pentru a realiza monitorizarea temperaturii.

Avantajele acestui tip de senzor sunt: semnalul de ieșire este ușor de prelucrat; se poate instala ușor pe o placă de test, preț scăzut. De obicei acești senzori au și un circuit de prelucrare a semnalului integrat în același pastilă de siliciu; așadar semnalul de ieșire fiind în format digital. Rezultă că nu mai este nevoie de circuite suplimentare de prelucrare a semnalului pentru a realiza interfațarea senzorului cu un microcontroler sau microprocesor.

Dezavantajele senzorilor integrați sunt: acuratețe mai scăzută decât la celelalte tipuri de senzori; domeniul de măsurare scăzut (de obicei între –55C și +125C).

În continuare vor fi prezentați câțiva astfel de senzori.

2.5.1 ADM 1025

2.5.1.1 Caracteristici

– până la 8 canale de măsurare

– 5 intrări pentru a măsura tensiunile de alimentare

– Vcc monitorizat intern

– măsurarea temperaturii externe prin intermediul unei diode

– senzor de temperatură integrat în chip

– 5 intrări digitale pentru biți VID

– rezistențe de “pull-up” de 100k la pinii VID (doar la ADM1025)

– suport LDCM

– interfața I2C compatibilă cu SMBus (System Management Bus)

– ieșire RST programabilă

– ieșire INT programabilă

– offset configurabil pentru canalele interne/externe

– mod “shutdown” pentru a minimiza consumul de energie

– comparări cu limite pentru toate valorile monitorizate

Aplicații

– server-e de rețea și calculatoare personale

– echipamente diverse bazate pe microprocesoare

– echipamente de test și instrumente de măsură

2.5.1.2 Descriere generală

ADM1025/ADM1025A este un produs de monitorizare complet pentru hardware-ul unui sistem bazat pe microprocesor, asigurând măsurarea și compararea cu limite a diverșilor parametrii ai sistemului. Sunt prevăzute 5 intrări pentru măsurarea tensiuniilor de alimentare de 2.5V, 3.3V, 5V și 12V, precum și tensiunea de alimentare a procesorului. ADM1025/ADM1025A poate monitoriza a șasea tensiune prin măsurarea propriei tensiuni de alimentare (Vcc). Monitorizarea temperaturii este asigurată de o intrare (2 pini) dedicată unui diode termosensibile și de un senzor integrat. Versiunea ADM1025 are intrările VID cu colector deschis, pe când ADM1025A are prevăzute rezistențe de ”pull-up” de 100kΩ la aceste intrări. Valorile măsurate și starea limitelor pentru intrare/ieșire pot fi citite prin intermediul unui port serial I2C compatibil cu SMBus. Dispozitivul poate fi configurat și controlat prin intermediul aceluiași port serial. Dispozitivul este prevăzut cu cu o ieșire programabilă de interupere, pentru a semnala depășirea limitelor în cazul tensiunilor și a temperaturii.

Tensiunea de alimentare a dispozitivului ADM1025/ADM1025A poate varia între valorile de 3.3V și 5.5V precum și curentul de alimentare mic și interfața compatibilă I2C îl fac ideal pentru o gamă largă de aplicații. Acestea includ aplicații de monitorizare și protecție hardware pentru calculatoarele personale, echipamente electronice de teste și altele.

2.5.1.3 Schema bloc

2.5.1.4 Mod de identificare

Acest senzor a fost prevăzut cu un registru intern special, folosit în procesul de identificare a senzorului pe o anumită magistrală (I2C sau SMBus). Registrul se află la adresa 3Eh și are valoarea implicită de 41h. Valoarea registrului poate fi, numai, citită de la adresa de bază a senzorului specificând apoi adresa internă a registrului.

2.5.2 ADM 9240

2.5.2.1 Caracteristici

– 6 intrări de măsurare a tensiunii (incluzând două tensiuni ale procesorului) cu atenuatoare integrate

– senzor de temperatură integrat

– 5 intrări digitale pentru VID Bits

– suport complet pentru „Intel’s LANDesk Client Manager” (LDCM)

– registru – compatibil cu produsele LM7x

– 2 intrări de monitorizare a vitezei ventilatorului

– interfața I2C compatibilă cu SMBus (System Management Bus)

– detector de pătrundere în carcasă

– ieșire pentru întrerupere

– pin de programare RESET I/O

– mod “shutdown” pentru a minimiza consumul de energie

– comparator de limite ale tuturor valorilor monitorizate

Aplicații

– server-e de rețea și calculatoare personale

– echipamente diverse bazate pe microprocesoare

– intrumente de testare și măsurare

2.5.2.2 Descriere generală

ADM9240 este un produs de monitorizare complet pentru hardware-ul unui sistem bazat pe microprocesor și permite măsurarea și compararea cu limite a până la patru alimentări și două tensiuni ale procesoarelor, a temperaturii , a vitezelor a două ventilatoare și detecția pătrunderii în carcasă. Valorile măsurate pot fi citite prin intermediul interfaței I2C compatibile cu SMBus (System Management Bus) iar valorile pentru limitele de comparare pot fi programate prin același bus serial. Aproximarea succesivă ADC de mare viteză permite eșantionarea frecventă a canalelor analoge pentru a asigura un răspuns rapid de întrerupere pentru orice măsurare ce depășește limita.

Domeniul tensiunii de alimentare a ADM9240 de la 2.85 V la 5.75 V, curentul mic de alimentare și interfața compatibilă I2C îl fac ideal pentru o gamă largă de aplicații. Acestea includ monitorizarea hardware și aplicații de protecție la calculatoarele personale, la echipamente electronice de testare și la electronică de birou.

2.5.2.3 Schema bloc

2.5.2.4 Mod de identificare

Acest senzor a fost prevăzut cu un registru intern special, folosit în procesul de identificare a senzorului pe o anumită magistrală (I2C sau SMBus). Registrul se află la adresa 3Eh și are valoarea implicită de 23h. Valoarea registrului poate fi, numai, citită de la adresa de bază a senzorului specificând apoi adresa internă a registrului.

2.5.3 LM75

2.5.3.1 Caracteristici

– pachetele SOP-8 și Mini SOP-8 (MSOP) economisesc spațiu

– interfața I2C

– pinul de ieșire separat cu colector în gol funcționează ca ieșire de intrerupător sau comparator/termostat

– registru cu capabilitatea de „readback”

– valorile implicite la pornire permit operații de „stand-alone” ca termostat

– mod „shutdown” de minimizare a consumului de putere

– până la 8 LM75-uri pot fi conectate la un singur bus

– componentă recunoscută UL

– tensiune de alimentare 3.0V la 5.5V

– curentul de operare 250 µA (obișnuit), 1 mA (max), de „shutdown” 4 µA (obișnuit)

– acuratețea temeraturii −25°C la 100°C ±2°C(max), −55°C la 125°C ±3°C(max)

Aplicații

– management termic de sistem

– calculatoare personale

– electronica de birou

– echipament electronic de testare

2.5.3.2 Descriere generală

LM75 este un senzor de temperatură, convertor analog-digital Delta-Sigma și detector de supratemperatură cu interfață I2C. Gazda poate interoga un LM75 în orice moment să citească temperatura. Ieșirea cu colector în gol pentru întrerupere la supratemperatură (O.S.) devine activ când temperatura depășește o limită programabilă. Acest pin poate funcționa fie în modul „Comparator” fie în modul „Interrupt”.

Gazda poate programa atât temperatura pragului de alarmare (TOS) care cât și temperatura la care condiția de alarmare dispare (THYST). În plus, gazda poate citi conținuturile registrelor TOS și THYST ale lui LM75. Trei pini (A0, A1, A2) sunt disponibili pentru selectarea adreselor. La pornire, senzorul trece în modul „Comparator” cu praguri implicite de 80°C TOS și 75°C THYST.

Domeniul tensiunii de alimentare a LM75 de la 3.0V la 5.5V, curentul mic de alimentare și interfața I2C îl fac ideal pentru un larg domeniu de aplicații. Acestea includ managementul termic și aplicații de protecție a calculatorul personal, echipamente electronice de testare și electronică de birou.

2.5.3.3 Schema bloc

2.5.3.4 Mod de identificare

Acest senzor a fost prevăzut cu o adresă memorată intern, folosită în procesul de identificare a senzorului pe o anumită magistrală (I2C sau SMBus). Adresa are valoarea implicită de 1001XXXb (pot fi conectați până la 8 sezori pe aceeași magistrală specificândule biții cei mai puțin semnificatifi într-un mod corspunzător).

2.5.4 LM78

2.5.4.1 Caracteristici

– sesizarea temperaturii

– 5 intrări de tensiune pozitivă

– 2 aplificatoare operaționale pentru monitorizarea tensiunii negative

– 3 intrări de monitorizare a vitezei ventilatorului

– intrare pentru senzori de temperatura adiționali

– intrare pentru detectarea pătrunderii în carcasă

– comparare „WATCHDOG” a tuturor valorilor monitorizate

– POST pentru memoria RAM de stocare a codului

– interfețe bus ISA și I2C

– specificații pentru taste

– acuratețea de monitorzare a tensiunii ±1% (max)

– acuratețea temperaturii −10°C la +100°C ±3°C (max)

– tensiunea de alimentare de 5V

– curentul de funcționare: 1mA (obișnuit) , de „shutdown”: 10 µA (obișnuit)

– rezoluția ADC de 8 bit

2.5.4.2 Descriere generală

LM78 este un sistem integrat de achiziție de date pentru monitorizarea hardware a serverelor, calculatoarelor personale sau, practic, a oricărui sistem bazat pe microprocesor. Într-un microprocesor, LM78 poate fi folosit pentru a monitoriaza tensiunile de alimentare, temperaturile și vitezele ventilatoarelor. Valorile actuale a acestor intrări pot fi citite în orice moment, și limitele programabile ale WATCHDOG-ului pot activa o întrerupere programabilă și mascabilă pentru sistem având două ieșiri. LM78 are un senzor integrat de temperatură, 5 intrări analogice pozitive, 2 intrări inversate (pentru monitorizarea tensiunilor negative) și un convertor anolog-digital pe 8 biți (ADC). O intrare este prevăzută pentru ieșirile de „supra temperatură” a altui senzor de temperatură și este legată la sistemul de întrerupere. LM78 este prevăzut cu intrări pentru 3 tacometre ale ventilatoarelor. Intrările adiționale sunt prevăzute pentru circuite de detecție a pătrunderii în carcasă, monitorizare a intrărilor VID și înlănțuirea întreruperilor. LM78 este prevăzut cu interfețe ISA și SMBus. O memorie RAM pe 32 biți cu auto-incrementare este prevăzută pentru teste POST (Power On Self Test) a stocarii codului.

Aplicații:

– sisteme de monitorizare hardware a serverelor și PC-urilor

– instrumente și echipamente electronice de testare

– diferite echipamente electronice

2.5.4.3 Schema bloc

2.5.4.4 Mod de identificare

Acest senzor a fost prevăzut cu un registru intern special, folosit în procesul de identificare a senzorului pe o anumită magistrală (I2C sau SMBus). Registrul se află la adresa 49h și are valoarea implicită de 40h. Valoarea registrului poate fi, numai, citită de la adresa de bază a senzorului (2Dh) specificând apoi adresa internă a registrului.

2.5.5 WB83783S

2.5.5.1 Caracteristici

– 3 intrări “termice” pentru termistori, tranzisoare de tipul 2N3904 NPN sau diode termice PentiumII (Deschutes)

– 6 intrări pentru tensiuni (tipic pentru: Vcore, , +3.3V, +12V, -12V, +5V, -5V)

– 3 intrări pentru măsurarea vitezei ventilatorului

– intrare pentru detecția deschiderii carcasei

– comparare WATCHDOG pentru toate valorile măsurate

– histereze programabile și prag de alarmă pentru toate valorile măsurate

– ton de avertizare sonoră

– 2 ieșiri PWM (pulse with modulation) pentru controlul vitezei ventilatorului (MUX opțional)

– inițează semnalele SMI#, OVT#, GPO# pentru a activa protecția sistemului

– interfață serială compatibilă I2C

– 5 intrări (pini) VID pentru indentificarea tensiunii Vcore a CPU (pentru PentiumII)

– semnalizare inițială a alimentării eronate (pentru +3.3V, Vcore)

– suport pentru Intel LDCM (driver DMI 2.0)

– suport pentru Acer ADM (driver DMI 2.0)

– frecvența de tact opțională (24, 48, 14.318 MHz)

– tensiunea de alimentare 5V

2.5.5.2 Descriere generală

W83783S este o versiune mai evoluată a W83782D; care este cel mai popular produs de monitorizare hardware a firmei Winbond. W83783S poate fi folosit pentru a monitoriza câțiva parametrii critici hardware ai sistemului, incluzând tensiunile de alimentare, vitezele ventilatoarelor și temperaturile, care sunt foarte importante întru-un sistem (calculator) pentru ca acesta să funcționeze stabil și corect. W83783S are prevăzută o interfață serială I2C.

W83783S a fost prevăzut cu un convertor analog-digital (ADC). Astfel W83783S poate măsura 6 intrări analogige pentru tensiuni, 3 tacometre pentru ventilatoare și 3 temperaturi externe. Senzorii externi pot fi: termistori, tranzistori 2N3904 NPN sau diode termice Deschutes ale procesoarelor Intel. W83783S este prevăzut cu: 2 ieșiri PWM pentru controlul vitezei ventilatoarelor, ieșire pentru semnalizare sonoră de avertizare, posibilitatea generării semnalelor SMI#, OVT#, GPO# pentru protecția sistemului.

Prin intermediul unor aplicații software sau BIOS, utilizatorul poate citii din când în când toți parametrii monitorizați ai sistemului. O avertizare de tipul “pop-up” poate fi activată când mărimea monitorizată a depașit intervalul normal. De asemenea utilizatorul poate seta limitele superioară și inferioară ale mărimilor moitorizate și poate activa o întrerupere programabilă și mascabilă. O semnalizare sonoră poate fi folosită ca și avertizare când parametrii monitorizați se află în afara intervalului specificat.

În plus, 5 intrări VID sunt prevăzute pentru a citi VID a CPU-ului, dacă este posibil. Acest lucru permite corecția tensiunii Vcore automat. Deasemenea W83783S are o caracteristică opțională unică: în stadiu timpuriu (înainte de a se fi încărcat BIOS-ul) poate genera o semnalizare sonoră. Aceasta permite semnalizarea absenței unor elementelor critice: dacă tensiunile Vcore sau +3.3V nu există și sistemul nu poate fi pornit.

2.5.5.3 Mod de identificare

Acest senzor a fost prevăzut cu un set de registre interne speciale, folosite în procesul de identificare a senzorului pe o anumită magistrală (I2C sau SMBus). Registrele se află la adresele 4Fh, 58h și au valoarile implicite de 5CA3h, 40h. Aceste valori ale registrelor pot fi, numai, citite de la adresa de bază a senzorului specificând apoi adresele interne ale registrelor.

2.5.6 VIA VT82C686A PSIPC

2.5.6.1 Caracteristici

– inter-operabil cu VIA și alte „Host-to-PCI Bridges”

– bridge PCI la ISA

– controler PCI EIDE mod master UltraDMA 33/66

– controler integrat Super IO

– suportă 2 porturi seriale, port IR (port infra-roșu), port paralel și controler de floppy disk

– 2 UART-uri pentru un sistem complet de porturi seriale

– infra-roșu IrDA (HPSIR) și ASK (Amplitude Shift Keyed), portul IR multiplexat pe COM2

– port paralel multi-mod

– controler de floppy disk cu 16 octeți FIFO

– controler audio digital AC97 cu suport hardware pentru SoundBlaster Pro și Direct Sound

– controler de monitorizare a temperaturii, tensiunilor și vitezei ventilatoarelor

– poate monitoriza 5 tensiuni pozitive (una internă), 3 temperaturi (una internă) și 2 viteze a ventilatoarelor

– controlul, satus-ul și alarmele sunt programabile pentru a asigura un management flexibil prin intermediul unor aplicații

– senzori externi (termistori) sau integrați („bandgap”)

– poate ajusta clock-ul automat în funcție de temperatură

– senzor intern pentru tensiunea Vcore

– montaj extern flexibil pentru măsurarea tensiunii (orice sursă pozitivă sau baterie)

– controler USB (Universal Serial Bus)

– interfață SMBus (System Management Bus)

– interfață gazdă pentru comunicarea cu procesorul

– interfață slave pentru masteri SMBus externi

– PC99 compatibil cu „Mobile Power Management”

– controler „Plug and Play”

– I/O APIC (Advanced Peripheral Interrupt Controller) integrat

– pin cu arbore NAND integrat ce permite scanare de test

– putere de consum redusă la 3.3V

– chip integrat: 27×27 mm, 325 pini BGA

2.5.6.2 Descriere generală

VT VT82C686A PSIPC (PCI Super-I/O Integrated Peripheral Controller) este un dispozitiv integrat, performant, cu consum redus și compatibil, ce suportă procesoare Intel și altele asigurând interfața cu bus-ul PCI pentru a crea un sistem complet compatibil Microsoft PC99 (PCI/ISA). În plus pentru a completa funcționalitatea extensiei bus-ului ISA, VT82C686A include anumite controlere standard inteligente pentru perferice:

a) modul master îmbunătățește controlerul IDE cu două canale DMA și două canale pentru comenzi. O stivă FIFO dedicată cuplată cu operațiile modului master asigură performanțe de transfer ridicate între dispozitivele PCI și IDE. În plus la standardul PIO și modul DMA, VT82C686A asigură suport în standardul UltraDMA-33, pentru un transfer de date sigur cu viteze de până la 33MB/s. VT82C686A suportă și standardul UltraDMA-66. Controlerul DMA respectă standardele „SFF-8038i v1.0” și „Microsoft Windows”.

b) controlerul USB respectă standardele „USB v1.1” și „Universal HCI v1.1”. VT82C686A include un „root hub” cu patru porturi pentru funcții și transceiver-e ale nivelului fizic integrate. Controlerul USB asigură „hot plug and play” și suport de driver-e universal concomitent cu introducerea unui nou dispozitiv în sistem. De asemenea, controlerul implementază suport pentru tastatură și mouse astfel încât software-ul poate rula transparent și pe un sistem non-USB.

c) controler pentru tastatură cu suport PS2 pentru mouse

d) ceas în timp real cu 256 octeți. În plus față de funcționalitatea standard a ISA RTC, RCT-ul integrat include alarmă de dată, câmp pentru secol și alte îmbunătățiri pentru a asigura compatibilitatea cu standardul ACPI.

e) funcționalități de management a consumului de energie din clasa Notebook compatibile cu ACPI și cerințele APM. Numeroase stări de „spleep” (power-on suspend, suspend-to-DRAM, and suspend-to-Disk) sunt suportate cu posibilități hardware automate de „wake-up”. Funcționalitățile adiționale includ: monitorizarea evenimentelor, controlul ceasului CPU-ului (protocolul Intel pentru procesoare), controlul ceasului bus-ului PCI, control al ceasului și scurgerilor, tratarea evenimentelor se poate face hardware cât și software, I/O de uz general, SMI extern și selecție a chip-ului.

f) subsitem hardware pentru monitorizarea nivelelor de tensiune, temperaturilor și vitezei ventilatoarelor sistemului sau a plăcii de bază.

g) interfață SMBus (System Management Bus) completă

h) două porturi I/O seriale compatibile 16550 cu posibilitatea comunicării în infra-roșu pentru al doilea port

i) sistem de sunet integrat AC97 controlat prin bus-ul PCI, full-duplex, compatibil direct-sound. Suporturi hardware pentru soundblaster-pro și blocuri FM sunt incluse, asigurând compatibilitatea cu Windows DOS box. Capabilitate “loopback” implementată pentru mixarea directă în boxe USB și 1394 (FireWire) asigura o calitate sporită a sunetului digital.

j) două “game port” și unul MIDI

k) port paralel capabil ECP/EPP

l) interfață standard cu drive-ul floppy disk

m) capabilități DMA distribuite pentru a asigura modul DMA ISA pe bus-ul PCI. IRQ-ul serial este suportat în aplicații diverse.

n) controlerul “plug and play” asigură redirecționarea completă a tuturor întreruperilor PCI și a celor a canaleor DMA spre orice canal de întrerupere. Un canal de întrerupere suplimentar redirecționabil este prevăzut pentru a asigura compatibilitatea dispozitivelor onboard “plug and play” și reconfigurabile cu Windows-ul

o) I/O APIC intern (Advanced Programmable Interrupt Controller)

VT82C686A îmbunătățește funcționalitatea dispozitivelor standard ISA. Controlerul de întreruperi integrat suportă ambele limite și nivele de acționare canal cu canal. Controlerul DMA integrat suportă și tipul F DMA în plus față de modul DMA a standardului ISA. Compatibil cu specificațiile PCI-2.2, VT82C686A suportă tranzacțiile cu întârzieri și managementul la distanță a puterii astfel că dispozitivele ISA mai lente no vor bloca traficul pe bus-ul PCI. O circuistică specială este integrată pentru a asigura operații concurente fără a cauza gâtuiri chiar și într-un mediu de interfețe PCI la PCI. Chip-ul inculde, de asemenea, opt nivele de buffer-e de linie de la bus-ul PCI la bus-ul ISA pentru a îmbunătăți performanțele globale ale sistemului.

2.5.6.3 Mod de identificare

Acest senzor a fost prevăzut cu un set de registre interne speciale, folosite în procesul de identificare a senzorului pe o anumită magistrală (PCI, ISA). Valorile registrelor pot fi, numai, citite de la adresa de bază a senzorului specificând apoi adresele interne ale registrelor.

2.5.7 DS1820 (DS18S20)

2.5.7.1 Caracteristici

– interfața 1-wire necesită un singur port (pin) pentru comunicare;

– fiecare dispozitiv are un cod serial pe 64-biti unic, stocat in memoria ROM internă;

– capacitatea “Multi-drop” simplifică aplicațiile distribuite de măsurare a temperaturii;

– nu necesita componente externe;

– poate fi alimentat de la linia de date; plaja de alimentare este 3.0V pana la 5.5V;

– masoară temperaturi între –55°C si +125°C (–67°F si +257°F);

– precizie de ±0.5°C intre –10°C și +85°C;

– termometru cu rezoluție de 9 biți;

– timpul maxim de conversie este de 750 ms;

– setari de alarmă definite de utilizator;

– comanda de căutare a alarmei identifică și adresează dizpozitive ale căror temperaturi

depașesc limitele specificate (condițiile de alarmă);

– aplicațiile includ: control termostatic, sisteme industriale, produse de consum,

termometre sau orice sistem termo-sensibil.

2.5.7.2 Descriere generală

Termometrul digital DS1820 realizează măsurări de temperatură, în grade Celsius, al caror rezultat este codificat pe 9 biți și are o funcție de alarmă cu posibilitatea specificarii limitelor de către utilizator. DS1820 comunică printr-un sistem de tipul “1-wire bus” care necesită o singura linie de date (și masa) pentru comunicarea cu unitatea centrala. Poate masură temperaturi între –55°C si +125°C și are o precizie de ±0.5°C între –10°C și +85°C. În plus, DS1820 se poate alimenta direct de pe linia de date (“parasite power”), eliminand astfel necesitatea unei surse externe.

Fiecare DS1820 are un cod unic de 64 biti, fapt care permite funcționarea mai multor senzori DS1820 pe același sistem “1–wire bus”; astfel se poate utiliza un singur microprocesor sau microcontroler (dispozitiv master) pentru a controla mai multi senzori DS1820 raspandiți pe o suprafată largită. Aplicațiile care pot beneficia de aceasta particularitate include sisteme de control de tip HVAC, sisteme de monitorizare a temperaturii, a echipamentelor, mașinariilor sau a interiorului clădirilor, și sisteme de control și de monitorizare a procesului.

2.5.7.3 Schema bloc

2.5.7.4 Mod de identificare

Toate dispozitivele slave care se conenctează la 1WireBus au un cod unic pe 64 biți. Acest cod unic poate fi doar citit și asigură atât identificarea tipului (clasa) dispozitivului cât și a dispozitivului propriu-zis. Acest lucru, permite conectarea practic a unui număr foarte mare de dispozitive pe aceeași magistrală.

Algoritmul propriu-zis de identificare a codurilor dispozitivelor prezente pe magistrală este ceva mai comlicat și nu va fi prezentat în acest capitol. Detecția codurilor dispozitivelor, asigură identificarea lor, începând de la codul cel mai mic (ca valoare numerică) până la cel mai mare. Poate fi implementat și printr-o metodă recursivă.

2.6 Alegerea unui senzor

2.6.1 Senzori integrați pe placile de bază

După cum s-a putut observa, există numeroase tipuri și modele de senzori. În urma creșterii frecvenței de lucru a microprocesoarelor și a puterii consumate într-un sistem de calcul, s-a pus problema monitorizării și controlării anumitor parametrii cum ar fi: temperatura și valoarea efectivă a tensiunii de lucru. Astfel au apărut senzorii integrați pe pastila de siliciu, cu informația convertită în format digital, care asigură o precizie și un timp de măsurare acceptabil, și totodată o integrare și interfațare facilă în majoritatea aplicațiilor.

În vederea asigurării unor soluții complete producătorii plăcilor de bază au început integrarea acestor senzori direct pe plăcile de bază. La început numărul de senzori integrați pe pastila de siliciu a fost de unul singur. Cu timpul însă au apărut soluții integrate care includ senzori pentru măsurarea temperaturii, tensiunii și a vitezei de rotație a ventilatoarelor. Astfel o soluție integrată are 2 sau chiar mai mulți senzori de temperatură (1 măsurând temperatura CPU-ului, 1 măsurând temperatura globală a sistemului, iar restul depinzând de produs), 2 sau chiar mai mulți senzori pentru măsuarea vitezei de rotație a ventilatoarelor (1 pentru CPU, 1 pentru sistem, etc), 4 până la 6 senzori pentru măsurarea principalelor tensiuni prezente într-un sistem de calcul (Vcore, +3.3V, +5V, +12V, -5V, -12V).

Alimentarea senzorilor se face de pe placa de bază. Interfața și protocolul de comunicație poate să difere de la un producător la altul. În general protocolul de comunicație este unul serial compatibil I2C, iar în ceea ce privește interfața ea poate fi o magistrală ISA sau SMBus. În sistemele mai vechi interfața se realizează pe magistrala ISA, iar în sistemele mai noi pe SMBus.

2.6.2 Senzori externi

Există multe tipuri de senzori de temperatură, cele mai folosite fiind: termocuplul, RTD-ul, termistorul NTC sau PTC și senzorul de temperatură integrat în pastilă de siliciu.

Desigur, în fucție de necesitățile aplicației, acești senzori externi pot fi chiar de tipul celor prezentați până acuma, dar spre deosebire de aceștia, cei externi, necesită și o interfață cu sistemul de bază pentru asigurarea protocolului de comunicație și a alimentării.

În cazul măsurarii unei temperaturi, dacă aplicația necesită un domeniu de măsurare mare (temperaturi înalte) se recomandă alegerea unui termocuplu. Dacă este importantă liniaritatea semnalului de ieșire și temperaturile de măsurat sunt joase se recomandă folosirea senzorului RTD sau senzorului integrat în pastilă de siliciu. Dacă este importantă acuratețea măsurării pe un domeniu restrâns de temperatură se recomandă folosirea unui termistor.

După ce un senzor de temperatură a fost ales se proiectează interfața senzorului de temperatură cu un circuit de prelucrare a semnalului. Acest circuit de prelucrare a semnalului poate fi un microcontroler, microprocesor sau un DSP (Digital Signal Processeor). Dacă se dorește ca această interfață să fie cât mai simplă se recomandă alegerea unui senzor de temperatură integrat în pastila de siliciu, având semnalul de ieșire digital.

Pentru această aplicație am folosit un senzor de temperatură integrat în pastilă de siliciu, DS182X de la firma Dallas Semiconductor. Acest senzor are semnalul de ieșire în format digital, în plus el nu necesită o linie de alimentare separată, având capacitatea de a se alimenta „parazit”. Astfel interfațarea cu un microcontroler sau un microprocesor poate fi facilă și foarte simplu de relizat .

3. Magistrale utilizate (1WireBus ,SMBus, PCI)

3.1 Magistrala 1WireBus

Sistemul “1-wire bus” folosește un dispozitiv master pentru a controla celalalte dispozitive de tip slave (unul sau mai multe). Toate datele si comenzile sunt transmise începând cu cel mai puțin semnificativ bit. În continuare, prezentarea acestui sistem este detaliată puțin în urmatoarele trei părți: configurația hardware, secvența de comunicare si tipuri de semnale.

3.1.1 Configurația hardware

Sistemul “1-wire bus”, prin definiție, necesită doar o linie de date (figura 3.1). Fiecare dispozitiv (master sau slave) este conectat la linia de date printr-o poartă cu 3 stari, cu colector în gol. Acest lucru asigură posibilitarea “eliberarii” liniei atunci cand dispozitivul nu comunică, lasând linia liberă pentru celalalte dispozitive conectate. Sistemul “1-wire bus” necesită o rezistență externă (numita rezistenta de “pull-up”) de aproximativ 5 kΩ; deci, când linia este inactiva va fi pe 1 logic. Daca se dorește ca o secvență de comunicare sa fie întreruptă pentru o perioada de tip, atunci linia de date trebuie lăsată inactivă pentru a putea relua secvența la un moment dat. Dacă linia este lasată inactiva (1 logic), între biții tranzactionați pot apărea pauze de timp infinite. Iar, dacă linia stă pe 0 logic mai mult de 480 µs, toate dispozitivele vor fi resetate.

Figura 3.1 – Configurația hardware

3.1.2 Secvența de comunicare

Secvența de comunicare cu un dispozitiv slave (DS1820) prezintă urmatorii pași:

1. Inițializarea

2. Comanda ROM (dupa caz, urmată de alte date suplimentare)

3. Funcția de comanda (specifică fiecarui tip de dispozitiv în parte, după caz urmată de alte date suplimentare). Ordinea și numărul pașilor este foarte importantă în procesul de comunicare, iar nerespectarea lor va face ca dispozitivul să nu raspundă corespunzător. Există totuși și câteva excepții (detalii în documentația completă).

3.1.2.1. Initializarea

Toate tranzacțiile de date în sistemul “1-wire bus” încep cu secvența de inițializare. Aceasta consta dintr-un “reset pulse” transmis de dispozitivul master, urmat apoi de un “presence pulse” transmis de dispozitivele slave. Dispozitivul master își poate da seama dacă există alte dispozitive slave conectate cu ajutorul acestui “presence pulse”.

3.1.2.2. Comenzi ROM

După ce dispozitivul master a detectat un “presence pulse”, el poate iniția o comandă ROM. Aceste comenzi operează cu codul unic pe 64 biți al fiecarui dispozitiv și permit selectarea a unui singur dispozitiv slave. De asemenea, aceste comenzi, permit determinarea tipului dispozitivelor slave. Există cinci comenzi ROM specifice acestui sistem “1-wire bus”, ele fiind implementate în majoritatea dispozitivelor slave.

3.1.2.3. Funcții de comandă

După ce dispozitivul master a dat o comandă ROM, pentru a selecta dispozitivul slave cu care dorește să comunice, poate iniția o functie comandă specifică fiecarui tip de dispozitiv slave. Aceste comenzi permit master-ului efectuarea unei operații de scriere, citire, conversie sau altele.

Atenție

Detalii suplimentare despre aceste operații se găsesc în documentațiile complete ale fiecarui tip de senzori sau dispozitive Dallas.

3.1.3 Tipuri de semnale

Sistemul “1-wire bus” are un protocol de comunicație foarte strict pentru a asigura integritatea comunicației datelor. Există câteva tipuri de semnale definite de acest protocol: “reset pulse”, “presence pulse”, “write 0”, “write 1”, “read 0” și “read 1”. Toate aceste semnale, cu excepția “presence pulse”, sunt inițiate de către master.

3.1.4 Procedura de inițializare; semnalele de resetare și detecție a prezenței (“reset

pulse” și “presence pulse”)

Orice proces de comunicație între master și dispozitivele slave începe cu secvența de inițializare, care constă din “reset pulse” trimis de master, urmat apoi de “presence pulse” trimis de dispozitivele slave (figura 3.2). Când dispozitivul slave trimite “presence pulse”, ca răspuns la “reset pulse”, înseamnă că este prezent și gata de operare. În timpul secvenței de inițializare dispozitivul master transmite “reset pulse” ținând linia pe 0 logic timp de cel puțin 480 µs. Apoi master-ul intră în modul de recepționare, lăsând linia liberă. Astfel rezistența de “pull-up” (de 5kΩ) va aduce linia pe 1 logic. După ce dispozitivul slave detectează frontul crescător, asteapta pentru 15-60 µs, după care transmite “presence pulse”, ținând linia pe 0 logic timp de 60-240 µs.

Figura 3.2 – Semnalele de “reset” și “presence pulse”

3.1.5 Semnalele de scriere/citire (“write/read”)

Dispozitivul master poate scrie sau citi date pe sistemul “1-wire bus”, repectând aceste semnale de scriere/citire. Fiecare semnal de scriere/citire conține doar un singur bit de informație. Prin înlănțuirea lor se poate tranzacționa un octet și asa mai departe.

Figura 3.3 – Semnalele de scriere și citire

3.1.5.1 Semalele de scriere (“write 1”, “write 0”)

Există două tipuri de semnale de scriere (folosite de dispozitivul master): “write 1” (scrie 1 logic), “write 0” (scrie 0 logic). Fiecare semnal de scriere trebuie să aiba o durată minimă de 60 µs, iar între acestea trebuie să existe minimum 1 µs pauză. Ambele tipuri de semnale de scriere sunt inițiate de master prin aducerea la 0 logic a liniei. Pentru a genera un semnal de tipul “write 1”, dupa ce master-ul a adus linia pe 0 logic, trebuie ca după 15 µs să o lase liberă. Apoi rezistența de 5 kΩ va aduce linia pe 1 logic. Pentru a genera un semnal de tipul “write 0”, dupa ce master-ul a adus linia pe 0 logic, trebuie să țină în continuare linia pe 0 logic pe durata unui semnal de scriere (în total minimum 60 µs). Dispozitivele slave se “uită” pe linie în timpul unei durate de 15-60 µs, după ce master-ul a inițiat semnalul. Daca linia este pe 1 logic în acea perioadă, se va scrie un 1 logic la slave; iar dacă linia va fi pe 0 logic, atunci se va scrie 0 logic.

3.1.5.2 Semnalele de citire (“read 1”, “read 0”)

Dispozitivele slave pot trimite date spre master numai atunci când acesta inițiază semnale de citire. De aceea master-ul trebuie să genereze aceste semnale imediat după o comandă, ce are ca scop o citire de date de la un dispozitiv slave. În funcție de comanda transmisă inițial de către master, o citire ce o urmeza poate avea diferite semnificații. Fiecare semnal de citire trebuie să aibă minimum 60 µs, iar între acestea trebuie sa existe minimum 1 µs pauză. Semnalul de citire este inițiat de master prin aducerea la “0”logic a liniei pentru o durată de 1-5 µs, după care acesta va elibera linia. După ce master-ul a inițiat un semnal de citire, dispozitivul slave va transmite un bit de informație (0 sau 1). Dispozitivul slave transmite un 1 logic lăsând linia să revină la 1 logic sau transmite un 0 logic dacă o mai ține pe 0 logic un timp. Dupa ce a transmis un 0 logic, dispozitivul slave va lasă linia, iar rezistență o va aduce pe 1 logic. Bitul de informație trimis de către dispozitivul slave este valid dupa 15 µs după primul front căzător (generat de master). De aceea, dispozitivul master trebuie să lase linia și să se “uite” la ea (pentru a citi bitul) într-un interval de 15 µs de la inițierea semnalului de citire. Detalii suplimentare cu privire la duratele acestor semnale se găsesc în documentațiile complete ale fiecarui tip de senzori sau dispozitive Dallas.

3.2 Magistrala SMBus (System Management Bus)

3.2.1 Trecere în revistă

Magistrala de management a sistemului (SMBus) este o interfață de doua fire prin care diverse circuite componente ale unui sistem pot comunica. Se bazează pe principiile de funcționare a magistralei I2C.

SMBus este o magistrală de control pentru managementul sistemului și energiei. Aceasta se poate folosi pentru transmiterea de mesaje înspre și dinspre echipamente înlocuind liniile de control individuale. Prin eliminarea liniilor de control se reduce numărul de pini. Folosind sistemul de mesaje, se asigură o expansibilitate în viitor.

Prin Magistrala de control a sistemului, un echipament poate pune la dispoziție informații de la producător, poate comunica sistemului propriul număr de model/componentă, să-și salveze starea pentru un eveniment special, să raporteze diverse tipuri de erori, să accepte patrametri de control, să returneze starea proprie.

3.2.2 Definiții de termeni

Termenii care urmează sunt definiți in concordanță cu specificațiile și pot avea și alte sensuri în contexte diferite.

Tabelul 3.1 – Definiții de termeni

3.2.3 Convenții

În tot acest document adresele SMBus sunt date în format binar. Adresele SMBus au lungimea de 7 biți și sunt exprimate în mod convențional ca și un grup de 4 biți urmat de alt grup de 3 biti și terminate cu litera ‘b’, de exemplu 0001 110b. Aceste adrese ocupă cei 7 biți superiori din campul de 8 biți de magistrală. Bitul inferior din acest camp are alt sens și nu face parte din adresă.

Diagramele structurilor de date implicate în tranzacțiile SMBus au forma:

Figura 3.1 – Diagrama structuri de date

În această diagramă, porțiunile care nu sunt colorate sunt furnizate de dispozitivul master iar cele colorate sunt furnizate de slave. Numerele de deasupra indică numărul de biți ai fiecărui câmp. În unele cazuri valorile se vor găsi sub campul din diagrama, în acest cay având semnificația de valoare a câmpului respectiv.

Condițiile de START și STOP specifice sunt referite cu litere mari.

3.2.4 Caracteristici generale

SMBus este o magistrală cu două fire. Pot fi conectate diverse dispozitive, atăt master cât și slave, la un segment SMBus. În general un dispozitiv master inițiază un transfer între el și un slave și pune la dispoziție semnalul de sincronizare (clock). Singura excepție de la această regulă, detaliată mai târziu, este în timpul instalării inițiale (initial bus setup) când un singur master poate iniția tranzacții simultan cu mai multe dispozitive slave. Un dispozitiv slave poate primi date de la un master sau poate trimite date către un master.

Doar un singur device poate fi master la un moment dat. Dat fiind faptul că mai multe dispozitive încearcă să pună controlul pe magistrală ca și master, SMBus pune la dispoziție un mecanism de arbitrare care se bazează pe conexiunea ȘI-cablat a dispozitivelor interfațate la SMBus.

Specificația definește două tipuri de caracteristici electrice, nivelul low si nivelul high (low power and high power). Prima clasă, definită original în specificațiile SMBus 1.0 și 1.1, a fost proiectată inițial ținându-se cont de bateriile inteligente (smart batteries), dar se putea folosi și cu alte dispozitive cu energie joasă. Această clasă introduce și un set de caracteristici electrice alternative cu energie înaltă. Această clasă este potrivită pentru cazul în care este cerută încarcare mare, de exemplu cu dispozitive SMBus pe plăcile de extensie pe PCI și pentru conectarea unor astfel de plăci între ele și dispozitive SMBus pe placa de bază (sistem).

Dispozitivele pot fi alimentate de VDD al magistralei, sau de la altă sursă de energie, VBus,(ca de exemplu bateriile inteligente – Smart Batteries) și vor funcționa împreună atâta timp cât se alătură specificațiilor electrice ale clasei respective.

Următoarea diagramă ilustrează un exemplu de implementare SMBus cu 5 volți cu dispozitive alimentate alimentate de VDD al magistralei, împreună cu dispozitive cu alimentare proprie.

Figura 3.2 – Topologia SMBus

VDD poate fi de la 3 la 5 volți +/– 10% și pot exista dispozitive alimentate direct de la magistrală. Ambele linii SMBCLK și SMBDAT sunt bidirecționale, conectate la o sursă de tensiune pozitivă printr–o rezistență de limitare sau la o sursă de curent sau alt circuit similar. Când magistrala este liberă, ambele linii sunt pe nivelul high. Etajele de ieșire ale dispozitivelor conectate la magistrală trebuie să fie cu colectorul în gol sau drenă deschisă pentru a se putea realiza conexiunea de ȘI cablat. Trebuie avută grijă la proiectarea etajelor de ieșire și de intrare ale dispozitivelor, pentru a nu încărca magistrala când nu mai au alimentare.

Figura 3.3 – Exemplu de etaje de intrare și de ieșire pentru dispozitive SMBus

Un dispozitiv care vrea să plaseze un „0” pe magistrală trebuie să aducă linia de magistrală pe nivelul de tensiune joasă definit. Pentru a plasa un „1” pe magistrală, trebuie să elibereze linia lăsând–o sa fie adusă la nivelul de tensiune ridicată de către circuistica de alimentare.

Figura 3.4 – Circuistica de protecție SMBus (alimentare!!!)

3.2.5 Nivelul 1 – Nivelul Fizic

3.2.5.1 Caracteristicile electrice ale dispozitivelor SMBus – două lumi discrete

SMBus 2.0 se vrea să opereze în două medii diferite care au caracteristici electrice diferite. În primul rând, SMBus trebuie să funcționeze corespunzător într–un mediu obișnuit cu alimentare joasă a dispozitivelor cu baterii. De asemenea trebuie să funcționeze corespunzător și în mediul cu nivel înalt de zgomote al magistralei PCI și plăcilor de extensie PCI. Cum s-a mai spus există două clase de caracteristici electrice pentru satisfacerea acestor două cerințe.

3.2.5.1.1 Specificațiile de tensiune SMBus (AC)

Ambele caracteristici (tensiune joasă, și tensiune înaltă) au un set comun de specificații de tensiune.

Figura 3.5 – Timpi SMBus

Tabelul 3.2 – Apecificații AC SMBus

Nota 1: Frecvența minimă pentru sincronizarea tactului dispozitivelor este definită în secțiunea 4.3.3. Un dispozitiv master nu are voie să furnizeze un tact cu o frecvență sub FSMB. De asemenea frecvența de operare să nu fie redusă din pricina extensiei periadei de tact a dispozitivelor slave sub acest prag.

Nota 2: Dispozitivele care participă la un transfer, pot abandona transferul și elibera magistrala, când intervalul low al tactului depășește valoarea TTIMEOUT,MIN. După ce dispozitivul master detectează această condiție, trebuie să genereze o condiție de STOP în timpul sau după transferul octetului curent. Dispozitivele care au detectat această condiție, trebuie să–și refacă comunicația și să fie pregătite să primească o nouă condiție de START, nu mai târziu de TTIMEOUT,MAX.

Nota 3: THIGH,MAX pune la dispoziție o metodă simplă pentru dispozitivele master pentru stării libere a magistralei. Un master poate presupune că magistrala este liberă dacă tactul și datele au fost pe nivelul ridicat (high) pe un interval de timp mai mare de THIGH,MAX.

Nota 4: TLOW:SEXT este timpul cumulativ cu care un dispozitiv slave poate să extindă ciclurile de clock într–un mesaj, de la condiția de START inițială, pâna la STOP. Este posibil de asemenea, ca alt dispozitiv slave sau master să extindă perioada tactului, cauzând extensia combinată a tactului să fie mai mare de TLOW:SEXT. De aceea, acest parametru este măsurat cu un dispozitiv slave luat ca și referință.

Nota 5: TLOW:MEXT este timpul cumulativ cu care dispozitivul master poate să extindă ciclurile de tact pe durata fiecărui octet din mesaj, definit între START-și-ACK, ACK-și-ACK, sau ACK-și-STOP. De asemenea există posibilitatea ca alt dispozitiv slave sau master să extindă perioada de tact, cauzând extinderea perioadei low a tactului să fie mai mare decât TLOW:MEXT pentru un oarecare octet.

Nota 6: Limitele timpului de creștere și de coborâre sunt definite ca:

TR = (VILMAX – 0.15) și (VIHMIN + 0.15)

TF = (VIHMIN + 0.15) și (VILMAX – 0.15)

3.2.5.1.1.1 Condiții generale de timp

SMBus este prioectată să pună la dispoziție o legătură de comunicare între sistem și dispozitivele sale. Există dispozitive, cum ar fi Smart Battery (Baterie Inteligentă) care folosesc microcontroler pentru tranzacțiile de magistrală, care au nevoie de timp mai mult decât în mod normal. Specificațiile țin cont și de aceste dispozitive. Cele ce urmează sunt comentarii generale referitoare la perioadele(timpii) SMBus:

– magistrala este la 0 KHz cand este liberă. Specificația FSMB,MIN este prevăzută pentru a preveni componentele în legatură cu timpul necesar unei tranzacții.

– fiecare dipozitiv trebuie să fie în stare să recunoască și să reacționeze la o condiție de START încadrându-se în condițiile de timp din tabelul 1.

3.2.5.1.1.2 Timeout-uri

Figura de mai jos ilustrează intervalele de timeout TLOW:SEXT și TLOW:MEXT.

Figura 3.6 – Intervalele de măsurare a timeout-urilor

3.2.5.1.1.3. Definirile și condițiile timeout-urilor pentru dispozitivele slave

Parametrul TTIMEOUT,MIN permite unui master sau slave să decidă dacă un dispozitiv cu defect ține tactul pe nivelul low o perioadă nedefinită, sau un master încearcă în mod intenționat să scoată de pe magistrală alte dispozitive. Este recomandat ca un dispozitiv slave să elibereze magistrala (să lase SMBCLK și SMBDAT la nivelul ridicat) când detectează un tact cu nivelul low mai mare de TTIMEOUT,MIN. Dispozitivele care au detectat această condiție trebuie sa-și reinițializeze comunicația și să fie în stare să primească o nouă condiție de START nu mai târziu de TTIMEOUT,MAX.

Dispozitivele slave care violează TLOW:SEXT nu sunt în conformitate cu aceste specificații. Un dispozitiv master poate să întrerupă tranzacția curentă oricărui dispozitiv slave care violează specificațiile TLOW:SEXT sau TTIMEOUT,MIN.

3.2.5.1.1.4 Definirile și condițiile timeout-urilor pentru dispozitivele master

TLOW:MEXT este definit ca și intervalul de timp cumulativ cu care un dispozitiv master poate să extindă ciclul de clock în timpul transferului unui octet dintr-un mesaj măsurat între:

START și ACK

ACK și ACK

ACK și STOP.

O gazdă sistem nu poate viola condiția TLOW:MEXT cu excepția situației combinației între extensia proprie a tactului cu exstensia unui dispozitiv slave sau a altui dispozitiv master.

Un master poate să întrerupă transferul curent oricărui dispozitiv slave care violează condiția TLOW:SEXT sau TTIMEOUT,MIN. Aceasta se poate realiza prin emiterea unei condiții de STOP de către master în timpul transferului octetului curent .

3.2.5.1.2 Specificațiile low-power DC

3.2.5.1.2.1 Parametri DC

SMBus este proiectată să opereze într-un interval de tensiuni între 3 și 5 volți ±10% (2.7V și 5.5V).

Tabelul 3.3 – Specificații DC SMBus de putere joasă

Nota 1: Dispozitivele trebuie să îndeplinească aceste condiții fie că sunt alimentate sau nealimentate. În orice caz, un microcontroler cu rolul de gazdă SMBus nu poate depăși ILEAK cu mai mult de 10 µA.

Nota 2: Specificația IPULLUP,MAX este în primul rând determinată de nevoia de acomodare cu un maxim de 1.1 K echivalent serie al dispozitivelor SMBus detașabile, menținând în același timp VOL,MAX pe magistrală.

Datorită curentului pull-up relativ mic, proiectantul sistemului trebuie să sa asigure că încărcarea magistralei rămâne în limite acceptabile. De asemenea dispozitivele care rămân conectate la magistrală nelimentate (au VCC zero), trebuie să îndeplinească specificațiile legate de curentul rezidual. Actualmente, sistemele pot fi proiectate folosind componente CMOS, cum ar fi microcontrolerele. Este responsabilitatea proiectantului să se asigure că toate componentele SMBus sunt în concordanță cu specificațiile de timp și tensiune.

3.2.5.1.2.2 Modelul de circuit SMBus

Diagrama următoare arată modelul de circuit SMBus. Se poate folosi o rezistență de protecție pentru componentele care pot fi introduse „din mers” în sistem, cum ar fi Smart Battery. Rezistența echivalentă a dispozitivului și conexiunii nu trebuie să depășească 1.1K pentru a se putea menține nivelul VOL,MAX din specificații.

Figura 3.7 – Modelul de circuit SMBus

Valoarea rezistenței (Rp) poate varia în funcție de VDD și capacitanța magistralei. Sursele de curent (IP) oferă o performanță mai ridicată, dar au și un cost crescut.

Dioda este pentru protecția ESD. Ea poate fi necesară în sisteme unde se folosesc dispozitive mobile cum ar fi Smart Battery.

3.2.5.1.3 Specificațiile de High-Power DC

Figura 3.8 – Segment SMBus cu multiple dispozitive atașate

Aceste specificații de putere înaltă permit spre exemplu magistralei conectarea la PCI, în felul acesta realizându–se comunicarea între dispozitive aflate pe plăci de extensie PCI cu alte dispozitive din sistem, sau de pe alte plăci PCI. În continuare sunt explicați câțiva parametri.

Tabelul 3.4 – Specificații DC SMBus de putere înaltă

3.2.5.1.3.1. Încărcarea capacitivă a liniilor SMBus cu tensiune ridicată

Încărcarea capacitivă pentru fiecare linie a magistralei include toate capacitanțele pinilor, cablurilor și conectorilor. Încărcarea maximă capacitivă influențează alegerea rezistenței de limitare RP sau a sursei de curent pentru a întruni cerințele din specificațiile SMBus.

Capacitanța pinilor (CI) este definită ca și încărcarea capacitivă totală a unui dispozitiv SMBus, specificată de fabricant. Această valoare este utilă, spre exemplu dacă două dispozitive există pe o placă de extensie.

3.2.5.1.3.2. Cerințele de scurgere minimă de curent pentru dispozitivele SMBus

În timp ce la dispozitivele folosite pe segmente cu alimentare joasă, practic nu există scurgere de curent, dispozitivele cu alimentare înaltă sunt obligate la un curent rezidual de 4 mA, menținând VOL,MAX la 0.4 V. Aceste cerințe determină valoare minimă a rezistenței de limitare RP fololsită în sistemul SMBus.

3.2.5.1.4. Alte specificații

3.2.5.1.4.1. Considerații legate de „back powering”

Dispozitivele nealimentate conectate la un segment de magistrală trebuie să aibă protecție împotriva „back powering”. Dispozitivele nealimentate conectate la segmente cu alimentare ridicată trebuie să resepecte specificațiile în legătură cu scurgerile de curent amintite în secțiunea 3.1.2.1.

3.2.5.1.4.2. Reinițializarea la reset

Dispozitivele SMBus detectează evenimentul de „power-on” (comanda de pornire) în trei feluri:

– detectând faptul că primesc alimentare,

– detectând un semnal extern de reset sau

– pentru dispozitivele cu alimentare proprie, prin detectarea faptului că magistrala este activă (liniile de tact și date sunt pe nivel înalt, după ce au fost pe nivel jos mai mult de 2 ½ secunde).

Un dispozitiv SMBus trebuie să răspundă unui astfel de eveniment devenind operațional în intervalul TPOR , definit în tabelul 1, după ce dispozitivul a fost alimentat la valori corespunzătoare. Dispozitivele cu alimentare proprie, sau cele alimentate tot timpul, nu trebuie să realizeze un reset complet ci trebuie să fie operaționale în 500 ms după ce magistrala devine activă.

3.2.6 Nivelul 2 – Nivelul Legătură de Date

3.2.6.1. Transferuri la nivel de bit

SMBus folosește nivele fixe de tensiune pentru a defini nivelele logice „ZERO” și „UNU”.

3.2.6.1.1 Validitatea datelor

Figura 3.9 – Validitatea datelor

Datele pe SMBDAT trebuie să fie stabile pe durata perioadei „HIGH” a tactului. Datele se pot schimba doar pe perioada în care SMBCLK este pe nivel jos.

3.2.6.1.2. Condițiile de START și STOP

Figura 3.10 – Condițiile de START și STOP

Două situații unice ale magistralei definesc condițiile de START și STOP.

1. O tranziție de la HIGH la LOW a liniei SMBDAT în timp ce SMBCLK este la nivel HIGH, definește o condiție de START.

2. O tranziție de la LOW la HIGH a liniei SMBDAT în timp ce linia SMBCLK este pe nivelul HIGH definește o condiție de STOP. Condițiile de START și STOP dâsunt totdeauna generate de dispozitivul master. După o condiție de START magistrala se consideră ocupată. Magistrala devine liberă din nou după o condiție de STOP, sau după ce ambele linii SMBCLK și SMBDAT ramân pe nivel înalt mai mult de THIGH:MAX.

3.2.6.1.3. Condiția de magistrală liberă

Magistrală este liberă când ambele linii SMBDAT și SMBCLK sunt la nivel înalt, fără nici o tranziție de stare, pe o perioadă care este minimul dintre următoarele:

TBUF (4.7 µS) de la ultima condiție de STOP, sau

THIGH:MAX (50 µS)

Cel de-al doilea parametru acoperă condiția în care un dispozitiv master a fost adăugat la magistrală în mod dinamic și e posibil să nu fi detectat o tranziție de stare pe liniile SMBCLK sau SMBDAT. În acest caz, dispozitivul master trebuie să aștepte astfel încăt să se asigure că nu se desfășoară un transfer la momentul respectiv.

3.2.6.2. Transferul de date pe SMBus

Figura 3.11 – Formatul octetului SMBus

Fiecare octet este compus din 8 biți. Fiecare transfer de octet pe magistrală trebuie să fie urmat de un bit de confirmare. Octeții sunt transferați începând cu bitul cel mai semnificativ.

În diagrama de mai jos se arată pozitionarea impulsurilor ACK și NACK relativ față de celelalte date.

Figura 3.12 – Semnalele ACK și NACK SMBus

Impulsul de tact corespunzător impulsului de confirmare este generat de master. Transmițătorul, master sau slave, eliberează linia SMBDAT (care se pune pe high) în timpul ciclului de confirmare. Pentru a confirma un octet, dispozitivul receptor trebuie să forțeze linia SMBDAT pe nivelul LOW pe durata când impulsul de clock este pe nivel HIGH.

Un dispozitiv SMBus totdeauna își confirmă adresa. Magistrala folosește această semnalizare pentru a detecta prezența dispozitivelor detașabile în sistem.

Un dispozitiv SMBus poate decide să răspundă cu NACK la un octet (altul decât octetul adresă) în următoarele situații:

– dispozitivul este ocupat cu un task în timp real, sau datele cerute nu sunt disponibile. La detecția condiției NACK, dispozitivul master trebuie să genereze condiția de STOP pentru a opri transferul. Ca și o alternativă la această situație, dispozitivul slave poate prelungi durata perioadei LOW a tactului în limitele specificațiilor, pentru a termina taskul și apoi să continue transferul.

– dispozitivul slave detectează o comandă sau date invalide. În acest caz dispozitivul slave trebuie să genereze NACK la octetul primit. Diapozitivul master va genera condiția de STOP și va încerca să reia tranzacția.

– dacă un dispozitiv master-receptor este implicat într-o tranzacție, trebuie să semnalizeze dispozitivului slave-transmițător terminarea datelor prin generarea NACK la ultimul octet transmis de slave. Dispozitivul slave-transmițător trebuie să elibereze linia pentru ca dispozitivul master să genereze condiția de STOP.

3.2.6.3. Generarea tactului și arbitrarea

3.2.6.3.1. Sincronizarea

Pot apărea probleme când mai multe dispozitive master vor să plaseze pe magistrală semnalul de tact. Rezultatul va fi acela din ȘI-ul cablat dintre toate semnalele de clock ale dispozitivelor master.

O tranziție high-low pe linia SMBCLK va semnala la toate dispozitivele să-și contorizele perioada LOW și să înceapă să ducă linia SMBCLK pe nivel LOW dacă dispozitivul respectiv este master. De îndată ce un dispozitiv termină de contorizat perioada LOW, va elibera linia SMBCLK. Totuși, semnalul de pe SMBCLK nu va trece in starea HIGH, daca alt dispozitiv master cu perioada mai lunga de LOW ține linia pe LOW. În această situație, dispozitivul master care a eliberat linia SMBCLK va trece în perioada de asteptare a nivelului HIGH. Când toate dispozitivele își vor vi terminat perioada de semnal LOW, linia SMBCLK se va elibera si va trece pe HIGH. Toate dispozitivele implicate vor începe să-și contorizeze perioada HIGH. Primul dispozitiv care-și va termina perioada HIGH va pune linia pe LOW, iar ciclul se va relua.

Figura 3.13 – Sincronizarea tactului pe SMBus

Intervalul între prima tranziție HIGH-LOW a CLK1 și CLK2 trebuie să fie mai mică decât (TLOW:MIN-TSU:DAT). În acest fel se realizează un semnal de tact pentru toate dispozitivele, unde periada LOW a SMBCLK este determinată de cel mai lent dispozitiv, iar perioada HIGH este determinată de cel mai rapid.

3.2.6.3.2. Arbitrarea

Un dispozitiv master poate iniția un transfer doar dacă magistrala este liberă. Unul sau mai multe dispozitive pot genera o condiție de START în intervalul tHOLD:STA minim.

Deoarece dispozitivele care generează condiția de START nu cunosc faptul că și alte dispozitive master dispută magistrala, arbitrarea are loc pe linia SMBDAT în timp ce linia SMBCLK este pe nivel HIGH. Un dispozitiv master care transmite un nivel HIGH în timp ce alt (alte) dispozitiv master transmite un nivel LOW pe linia SMBDAT pierde controlul magistralei în ciclul de arbitrare.

Dispozitivul master care a pierdut arbitrarea poate să continue generarea semnalului de tact pâna la terminarea octetului la care a pierdut arbitrarea. Arbitrarea în cazul în care două dispozitive master încearcă să acceseze același dispozitiv poate continua și după octetul de adresă. În acest caz arbitrarea va continua cu datele rămase de transferat. În cazul în care două dispozitive master sunt în ciclul de arbitrare și primul vrea să pună un START repetat pe magistrală în timp ce al doilea vrea să pună un bit ZERO pe magistrală, primul master trebuie să admită că nu poate genera condiția de start și pierde arbitrarea. Dacă primul master vrea să pună un START repetat pe magistrală în timp ce al doilea master vrea să pună un bit UNU pe magistrală, al doilea master va observa START-ul repetat și va pierde arbitrarea. Dacă ambele dispozitive pun un START repetat pe magistrală la aceeași poziție de bit, arbitrarea va continua la fiecare bit de date.

Acest mecanism implică faptul ca fiecare dispozitiv master care participă la ciclul de arbitrare să monitorizeze starea liniei SMBDAT în timpul ciclului.

Dacă un dispozitiv master încorporează de asemenea și funcția de slave și pierde controlul magistralei în ciclul de arbitrare la faza de adresă, va trebui să verifice adresa de pe magistrală pentru a vedea dacă alt dispozitiv master vrea să-l acceseze. În acest caz, dispozitivul master care a pierdut arbitrarea trebuie să treacă imediat pe modul slave-receptor, pentru a putea primi restul mesajului.

Figura 3.14 – Arbitrarea pe SMBus

3.2.6.3.3. Extinderea perioadei LOW a tactului

SMBus pune la dispoziție un mecanism de sincronizare care permit comunicarea diferitelor dispozitive pe magistrală. În afară de procedura de arbitrare, mecanismul de sincronizare a tactului mai poate fi folosit în timpul unui transfer la nivel de bit sau la nivel de octet pentru a permite dispozitivelor slave mai lente să facă față dispozitivelor master rapide.

La nivel de bit, un dispozitiv poate încetini magistrala extinzând in mod periodic perioada LOW a tactului.

Dispozitivele pot extinde tactul în limitele specificațiilor. Totuși, dispozitivele proiectate să extindă fiecare ciclu de tact periodic, trebuie să mențină frecvența fSMB,MIN de 10 KHz (fSMB,MIN-1=100µs) pentru a se păstra lățimea de bandă SMBus.

Figura 3.15 – Extinderea periodică a tactului provocată de un dispozitiv slave

Extinderea perioadei LOW a tactului trebuie să înceapă după tranziția HIGH-LOW a liniei SMBCLK în intervalul TLOW:MIN–TSU:DAT.

Un dispozitiv slave poate extinde perioada LOW a tactului între transferurile de octet pe magistrală, pentru a procesa datele primite, sau pregătirea pentru transmitere de date. În acest caz, dispozitivul slave va ține linia de tact pe nivelul LOW după recepționarea și confirmarea unui octet.

În timpul unei tranzacții și dispozitivul master poate să decidă să extindă perioada LOW a tactului, între octeți sau în orice moment al transferului de octet, inclusiv perioada LOW de după transferul de octet și după tactul de confirmare.

Figura 3.16 – Extindere aleatoare a tactului

3.2.6.4. Formatele de transfer al datelor

Transferurile de date pe SMBus au următorul format.

Figura 3.17 – Transfer de date pe SMBus

După condiția de START, S, dispozitivul master plasează adresa de 7 biți a dispozitivului slave pe care vrea să-l adreseze pe magistrală. Adresa are 7 biți și este urmată de un al optulea care indică direcția transferului (R/W); un ZERO indică o scriere (WRITE), în timp ce un UNU indică o cerere de date (READ). Un transfer de date totdeauna este terminat de o condiție de STOP generată de dispozitivul master.

3.2.7 Nivelul 3 – Nivelul Rețea

3.2.7.1 Modelul de folosire

Specificațiile SMBus se referă la trei tipuri de dispozitive. Un dispozitiv slave este un dispozitiv care primește sau răspunde la o comandă. Un dispozitiv master este un dispozitiv care trimite comenzi, generează semnalul de clock și finalizează transferul. Un dispozitiv gazdă (host) este un master specializat care pune la dispoziție interfața principală cu CPU-ul sistemului. O gazdă poate fi un master-slave și trebuie să aibă suport pentru protocolul de notificare al gazdei SMBus. Poate exista cel mult o gazdă în sistem.

3.2.7.2 Identificarea dispozitivului – adresele slave

Orice dispozitiv existent pe SMBus ca și slave are o adresă unică numită Adresă de Slave. Există tabele cu un grup de adrese rezervate care nu pot fi folosite și asignate dispozitivelor slave. Toate celelalte adrese sunt disponibile pentru a fi asignate dispozitivelor cu adrese dinamice sau alte tipuri de dispozitive.

3.2.7.2.1 Tipuri de adrese SMBus.

Pe magistrala SMBus pot exista simultan mai câteva tipuri de dispozitive. Există mai multe tipuri de adrese folosite în mod curent în sistemele SMBus actuale.

3.2.7.2.1.1 Adrese rezervate

Adrese rezervate pentru funcții specifice ale magistralei.

3.2.7.2.1.2 Adrese alocate in funcție de scop (purpose-assigned)

Acestea sunt adrese alocate de Grupul de Lucru SMBus pentru tipuri speciale de dispozitive. Orice dispozitiv care obține o astfel de adresă trebuie să aibă asociată o specificație SMBus. Se presupune că dacă există un dispozitiv cu o astfel de adresă, acesta întrunește specificațiile pentru acea adresă.

3.2.7.2.1.3 Adrese prototip

Adresele prototip (1001 0XX) sunt rezervate pentru prototipuri de dispozitive și experimentări în aplicații care folosesc adresele cu scop. Acestea nu sunt proiectate pentru producție și nu vor fi folosite niciodată ca atare.

3.2.7.2.1.4 Alte tipuri de adrese

Fabricanții au produs și continuă să producă dispozitive compatibile SMBus cu scopuri specifice, pentru care nu sunt nevoiți să implementeze specificațiile complete SMBus, sau pentru care nu este nevoie de suport explicit din partea SO. Acestea pot fi de exemplu expandatoare de port, circuite D/A, etc.

3.2.7.2.1.5 Adrese alocate dinamic

Conceptul de adresă dinamică este introdus în versiunea 2.0.

3.2.7.3 Modul de folosire a unui dispozitiv

Un dispozitiv SMBus tipic va avea un set de comenzi prin care se pot citi sau scrie date. Toate comenzile au lungimea de 8 biți. Argumentele comenzii și valorile returnate pot varia ca și lungime. Există 11 tipuri de protocoale de comandă pentru un dispozitiv. Un dispozitiv slave îl poate folosi pe oricare, sau pe toate pentru a comunica. Protocoalele sunt Comandă Rapidă, Trimite Octet, Primește Octet, Scrie Octet, Scrie Cuvânt, Citește Octet, Citește Cuvânt, Apel Proces (Process Call), Citire Bloc, Scrie Bloc și Apel Proces Citește Bloc–Scrie Bloc.

3.2.7.4. Controlul erorilor la pachete

Versiunea 1.1 SMBus a introdus mecanismul de control al erorilor pentru a îmbunătăți siguranța și robustețea transferului. Implementarea mecanismului de control al erorilor este opțională pentru dispozitivele SMBus dar este obligatorie pentru dispozitivele care participă la procesul ARP. Dispozitivele care SMBus care implementează mecanismul de control al erorilor trebuie să fie capabile să comunice și cu cele care nu implementează acest mecanism.

Mecanismul de control al erorilor la pachete PEC este implementat prin adăugarea unui cod de eroare al pachetului la sfârșitul fiecărui transfer de mesaj. Fiecare protocol din cele enumerate mai sus (cu excepția Quick Command și Notificare Gazdă) are două variante: una cu controlul erorilor și una fără. PEC este un octet corector de eroare CRC–8, calculat pe toți octeții mesajului, inclusiv pe cei de adresă și biții de r/w. PEC este adăugat mesajului de către dispozitivul care a furnizat ultimul octet.

3.2.7.5 Protocoale de magistrală

În continuare sunt descrise protocoalele de magistrală cu și fără control de erori al pachetelor. Nu toate dispozitivele trebuie să implementeze aceste protocoale.

Mai jos este descrise diagramele protocoalelor. Nu toate elementele vor fi incluse în toate diagramele. Spre exemplu nu toate pachetele trebuie să includă PEC.

S Condiție de Start

Sr Condiție repetată de Start

Rd Citire (Valoarea bitului – 1)

Wr Scriere (Valoarea bitului – 0)

x Dacă apare sub un câmp înseamnă că acel câmp trebuie să aibă valoarea „x”

A Confirmare (Acknowledge – Acest bit poate să fie 0 pentru ACK și 1 pentru NACK)

P Condiție de Stop

PEC Cod de eroare al pachetului

Master to Slave (Direcția transferului)

Slave to Master (Direcția transferului)

Figura 3.18 – Diagrama pachetului de protocol SMBus

Formatele de date implementate de SMBus sunt:

– master transmițător transmite unui dispozitiv slave receptor: în acest caz direcția transferului nu se schimbă.

– dispozitivul master citește de la dispozitivul slave imediat după primul octet: în momentul primului bit de confirmare (emis de dispozitivul slave receptor) dispozitivul master transmițător devine master receptor iar dispozitivul slave receptor devine slave transmițător.

– format combinat: în timpul unei schimbări de direcție într-un transfer, dispozitivul master repetă condiția de START și adresa dispozitivului slave dar cu bitul R/W inversat. În acest caz dispozitivul master receptor termină transferul generând un NACK la ultimul octet al transferului și o condiție de STOP.

3.2.7.5.1 Comandă rapidă (Quick command)

Figura 3.19 – Protocolul Quick Command

Folosit pentru dispozitive care au un suport sărac pentru SMBus. Bitul de R/W poate fi folosit pur și simplu pentru a opri/porni o funcție a unui dispozitiv, sau pentru a activa/dezactiva modul standby, etc.

3.2.7.5.2 Trimite octet (Send byte)

Un dispozitiv slave poate să primească pâna la 256 comenzi în forma octetului cre urmează după adresă.

Figura 3.20 – Protocolul Send Byte (fără PEC și cu PEC)

3.2.7.5.3 Primește octet (Receive Byte)

Figura 3.21 – Protocolul Receive Byte (fără PEC și cu PEC)

Protocolul este similar cu Send Byte, diferența constând în direcția transferului.

3.2.7.5.4 Scrie octet/cuvânt (Write Byte/word)

Primul octet este codul de comandă. Următorul octet/cuvânt este data care se va scrie. Dispozitivul slave confirmă fiecare octet, iar întreaga tranzacție se termină cu o condiție de STOP.

Figura 3.22 – Protocolul Write Byte(fără PEC și cu PEC)

Figura 3.23 – Protocolul Write Word (fără PEC și cu PEC)

3.2.7.5.5 Citește octet/cuvânt

Citirea datelor este puțin mai complicată decât scrierea. Prima dată, gazda trebuie să scrie o comandă la dispozitivul slave. Apoi trebuie să urmeze o condiție de START repetat care denotă o citire de la adresa dispozitivului slave. Apoi dispozitivul slave returnează doi octeți de date.

Este de notat că nu există condiție de STOP înaintea START-ului repetat., iar NACK semnifică sfârșitul transferului.

Figura 3.24 – Protocolul Read Byte (fără PEC și cu PEC)

Figura 3.25 – Protocolul Read ByteWord (fără PEC și cu PEC)

3.2.7.5.6 Apel Proces (Process Call)

O comandă trimite o dată și așteaptă ca dispozitivul slave să returneze o valore, dependent de data trimisă. Protocolul este pur și simplu un Write Word, urmat de un Read Word fără câmpul de comandă al Readm Word și bitul r/w al Write Word.

Figura 3.26 – Protocolul Process Call (fără PEC și cu PEC)

3.2.7.5.7 Scriere/Citire bloc (Bloc write/read)

Scrierea Bloc începe cu o adresă de slave și o condiție de scriere. După codul comenzii, dispozitivul gazdă trimite un octet câți octeți vor mai urma în mesaj. Contorul de octeți nu include și octetul PEC. Contorul de octeți nu poate fi 0. Într-o citire/scriere bloc se pot transfera maxim 32 de octeți.

Figura 3.27 – Protocolul Block Write (fără PEC și cu PEC)

Figura 3.28 – Protocolul Block Read (fără PEC și cu PEC)

3.2.7.5.8 Apel proces Scriere bloc-Citire bloc (Block write-block read process call)

Este un mesaj din două părți. Apelul începe cu o adresă de slave și o condiție de START. După codul comenzii, dispozitivul gazdă trimite numărul de octeți (M) care înseamnă numărul de octeți care se vor mai scrie în prima parte a mesajului. A doua parte a mesajului este un bloc de date citite începând cu condiția de START repetat urmată de adresa dispozitivului slave și bitul de citire. Următorul octet este numărul de octeți citiți (N), care nu poate fi 0.

Condițiile pentru acest transfer sunt următoarele:

– M≥1 octet

– N≥ 1 octet

– M + N ≤ 32 octeți

Figura 3.29 – Protocolul Block Write (fără PEC și cu PEC)

3.2.7.5.9 Protocolul de notificare al gazdei (SMBus host notify protocol)

Există o singură metodă pentru a preveni mesajele de la dispozitivele necunoscute în formate necunoscute către dispozitivele gazdă, există acest protocol care este un Write Word modificat. Acest protocol trebuie să fie folosit când un dispozitiv SMBus devine master pentru a comunica cu o gazdă SMBus care se comportă ca un dispozitiv slave.

Comunicarea de la dispozitivul SMBus la gazda SMBus începe cu adresa gazdei SMBus (0001 000b). Codul comandă de inițializare al mesajului este adresa de început a dispozitivului SMBus. De aici încolo, gazda SMBus știe originea următorilor 16 biți a stării dispozitivului. Conținutul stării este specific fiecărui dispozitiv.

Figura 3.30 – Dispozitiv adresabil pe 7 biți pentru comunicarea cu gazda

3.2.7.6 Protocolul rezoluție al adreselor SMBus (SMBus Address resolution protocol)

Conflictele de adrese se rezolvă prin alocarea dinamică de adrese unice fiecărui dispozitiv slave. Protocolul de rezoluție al adreselor (ARP) are următoarele atribute:

– asignarea adreselor folosește mecanismul standard de arbitrare al nivelului fizic.

– adresa asignată rămâne constantă cănd dispozitivul este alimentat; de asemenea este permisă reținerea adresei cât tim dispozitivul pierde alimentarea.

– nu este fixată nici o constrângere referitoare la pachetele de date după asignarea adresei.

– orice dispozitiv master poate enumera (dispozitivele) magistrala SMBus.

3.2.7.6.1 Identificatorul unic al dispozitivului (Unique Device Identifier – UDID)

Pentru a pune la dispoziție un mecanism pentru a izola fiecare dispozitiv după fuincționalitate, fiecare dispozitiv trebuie să implementeze (să aibă) un identificator unic (UDID). Acest număr de 128 de biți are următoarele câmpuri:

Figura 3.31 – UDID

Capabilitățile

dispozitivului Descrie capabilitățile dispozitivului.

Versiune/Revizie Numărul versiunii UDID.

ID-ul fabricantului ID-ul fabricantului, asignat de SBS Implementers Forum sau PCI SIG.

ID-ul dispozitivului ID-ul dispozitivului asignat de fabricant.

Interfața Identifică interfețele suportate cu nivelele protocoalelor SMBus.

ID-ul fabricantului

Subsistemului Această valoare poate avea mai multe surse:

– ID-ul fabricantului, asignat de SBS Implementers Forum sau PCI SIG.

– ID-ul OEM al dispozitivului, asignat de SBS Implementers Forum sau PCI SIG. O valoare care, în combinație cu ID-ul dispozitivului subsistem, poate fi folosită pentru a identifica o organizație sau grup industrial care a definit o interfață specială a dispozitivului.

ID-ul dispozitivului

Subsistem Specifică o interfață specială, implementare sau dispozitiv.

ID specific

fabricantului Un număr unic per dispozitiv.

În contunuare voi descrie câmpurile care am considerat că sunt mai relevante în acest context.

Capabilitățile dispozitivului

Acest câmp are mai multe scopuri:

– raportează capabilitățile generice SMBus.

– garantează ordinea rezoluției în ARP. Deoarece un bit 0 câștigă în fața unui 1 în procesul de arbitrare, și biții care specifică tipul de adresă sunt primii doi în procesul de prezentare a UDID, in procesul ARP sunt detectate mai întâi dispozitivele cu adrese fixe, apoi cele cu adrese dinamice și persistente, etc. Biții din paranteze drepte de mai jos sunt cei doi biți care specifică tipul adresei din campul de capabilități a dispozitivului:

– [00] dispozitivele cu adresă fixă sunt detectate primele.

– [01] dispozitivele cu adresă dinamică și cele cu adresă persistentă sunt detectate apoi.

– [10] dispozitivele cu adresă dinamică și volatilă sunt apoi detectate.

– [11] dispozitivele cu număr aleator sunt detectate în ultima fază.

Figura 3.33 – Câmpul de 8 biți descriind capabilitățile dispozitivului

Tipul de adresă Descriu tipul de adresă conținută în dispozitiv.

– [00] Adresă Fixă a dispozitivului

– [01] Adresă dinamică și persistentă

– [10] Adresă dinamică și volatilă

– [11] Dispozitiv cu număr aleator

Suport PEC Acest bit este setat dacă dispozitivul are suport pentru PEC pentru toate comenzile la adresa asociată la acest UDID.

Rezervat Biții rezervați sunt folosițipentru extinderi viitoare, trebuiesc returnați 0 și ignorați la citire.

Interfața

Câmpul de interfață definește versiunea SMBus și protocoalele suportate.

Figura 3.34 – Câmpul de interfață

SMBus version Acești biți definesc versiunea SMBus:

– [0000b] – SMBus 1.0 – nu se folosesc la dispozitivele non ARP

– [0001b] – SMBus 1.1 – nu se folosesc la dispozitivele non ARP

– [0010b] – Rezervat

– [0011b] – Rezervat

– [0100b] – SMBus 2.0

– Restul de valori sunt rezervate.

Cei mai semnificativi biți ai câmpului de interfață sunt folosiți pentru a identifica protocoalele suportate de dispozitiv.

Tabelul 3.5 – Biții câmpului de interfață

3.3 Magistrala PCI (Peripheral Component Interconnect)

Plăcile video și plăcile de rețea necesită rate de transfer foarte mari. Magistrala PCI a fost proiectată de firma Intel și este destinată dispozitivelor hardware de viteză mare. Organizarea tipică a unui sistem bazat pe magistrala PCI este prezentată în figura următoare.

Figura 3.35 – Organizarea tipică a unui sistem bazat pe magistrala PCI

Arhitectura PCI permite conectarea de până la 32 unități fizice (denumite dispozitive) la magistrală, fiecare din aceste unități poate conține până la 8 unități funcționale distincte.

Caracteristicile generale ale magistralei PCI:

– în protocolul PCI transferurile se efectuează în rafală;

– PCI suportă mai mulți master-i de magistrală și permite comunicarea directă între dispozitive (fără trecerea intermediară prin memorie);

– un arbitru centralizat reduce latența prin suprapunerea fazei de arbitrare cu transferul datelor;

– un circuit de interfață între CPU și magistrală are rol de cache și citire în avans.

3.3.1 Accesarea regiștrilor

Deși standardul PCI suportă adrese pe 32 de biți, spațiul de intrare/ieșire la procesoarele 80×86 este limitat la 64K, astfel că orice registru PCI trebuie să se mapeze în acest spațiu de adresare. În plus, dacă în sistem există și magistrale EISA/ISA, trebuie evitate adresele standard alocate dispozitivelor de pe aceste magistrale.

3.3.2 Întreruperile

Magistrala PCI are 4 linii pentru cererile de întrerupere (INTA-INTD), cu prioritate egală, active pe nivelul zero logic și partajabile. Dispozitivele PCI cu o singură unitate funcțională folosesc INTA, în timp ce dispozitivele multi-funcționale pot folosi orice combinație secvențială din cele 4 linii, începând cu INTA. Prioritizarea cererilor de întrerupere se face la nivelul controller-ului de întreruperi, unde se face și redirectarea cererilor de întrerupere către liniile IRQ0-IRQ15.

Unitățile funcționale ce generează întreruperi trebuie să implementeze următoarele două registre de configurare: Interrupt Pin Register – identifică linia de întrerupere folosită; Interrupt Line Register – specifică prioritatea și vectorul de întrerupere atașate unității funcționale.

3.3.3 DMA

Unitățile funcționale PCI funcționează sau prin intrări/ieșiri programate sau prin bus master DMA, având implementat propriul controller DMA. Participanții unui transfer DMA se numesc agenți și sunt întotdeuna în număr de doi, la un transfer:

– Inițiatorul – este unitatea care a câștigat magistrala și va efectua următorul transfer DMA pe magistrală;

– Ținat – este unitatea curent adresată de inițiator.

Deoarece orice unitate funcțională PCI poate fi un inițiator, este posibil transferul direct de la o unitate PCI la o alta fără copierea intermediară în memoria sistem.

3.3.4 Memoria dispozitiv

Memoria dedicată folosită de unitățile funcționale PCI poate fi mapată în spațiul de adresare pe 32 de biți. În acest mod se permite accesul direct al procesorului la memoria unității funcționale.

3.3.5 Autoconfigurarea

Specificațiile PCI cer ca fiecare unitate funcțională de pe magistrala PCI să aibă implementată propria zonă de 256 de octeți pentru datele de configurare. Această zonă de memorare se numește spațiu de configurare.

Primii 64 de octeți din spațiul de configurare (denumiți antet) au o structură predeterminată și sunt folosiți pentru identificarea unității funcționale în sistem și asignarea resurselor necesare acesteia. Câteva din câmpurile din antet includ:

– informații despre producător, tipul dispozitivului și versiunea acestuia;

– o pereche standard de registre de comandă și stare pentru validarea diferitelor caracteristici ale unității și pentru raportarea erorilor;

– o listă de resurse ce specifică cerințele de adrese de I/O și memorie;

– registrele pentru întreruperi;

-referințe către memoria ROM specifică unui anumit tip de arhitectură.

Accesarea datelor de configurare se poate realiza prin intermediul a două registre:

– registrul de adresă – identifică numărul magistralei, dispozitivul, unitatea funcțională și adresa din spațiul de configurare ce se dorește accesat;

– registrul de date – acționează ca un buffer de date între CPU și spațiul de configurare.

După ce a fost setat registrul de adresare, citirea sau scrierea registrului de date va transfera informația în sau din spațiul de configurare. Octeții rămași din spațiul de configurare (cei de după antet) pot fi folosiți de proiectanții dispozitivului pentru alte operații specifice.

Nivelul HAL din nucleul sistemului de operare Windows oferă funcții pentru accesarea datelor de configurare ale unităților funcționale PCI. Ex. HalGetBusData, HalSetBusData, HalAssignSlotResources.

Recomandări pentru lucrul cu dispozitive hardware:

– studierea specificațiilor respectivului dispozitiv

– arhitectura magistralei

– registrele de control

– raportarea stărilor de eroare

– modul de lucru prin întreruperi

– mecanismele transferurilor de date

– memoria dispozitivelor

– utilizarea inteligenței hardware integrată

– testarea hardware-ului înainte de testarea driver-ului și integrarea lui în sistem.

4. Drivere Windows

4.1. Obiectele nucleului și driverele

Win NT este un sistem de operare bazat pe obiecte, deoarece își gestionează structurile de date interne într-un mod asemănător obiectelor. În particular, modulele nucleului și ale executivului își definesc propriile structuri de date împreună cu un set de funcții de acces. Toate celelalte module folosesc aceste funcții de acces pentru manipularea datelor. Structurile de date nu sunt accesibile direct de către celelalte module. În cazul driverelor, acestea au un statut special, și li se permite accesul direct la anumite câmpuri ale obiectelor în timp ce altele sunt accesibile tot prin intermediul funcțiilor obiectului.

4.2. Drivere Windows XP

Un sistem Windows XP cuprinde mai multe tipuri de drivere. Figura de mai jos ilustrează câteva dintre ele.

Figura 4.1 – Tipuri de drivere

– un driver de device virtual (virtual device driver – VDD) este o componentă în mod utilizator care permite aplicațiilor DOS să acceseze echipamentele hardware pe platformele x86. Un VDD se bazează pe o mască a drepturilor de acces pentru a capta accesul la porturi și în esență, simulează operațiile echipamentului hardware în beneficiul aplicațiilor care, original, au fost programate să comunice direct cu echipamentul. Deși acest tip de driver are același nume și scop cu un tip de driver folosit în Windows 98, este cu totul și cu totul altceva. Vom folosi acronimul VDD pentru acest tip de driver din Windows XP și acronimul VxD pentru cel din Windows 98, pentru a putea face distincție între cele două.

– categoria drivere în mod nucleu (kernel-mode drivers) include mai multesubcategorii.Un driver PnP este un driver nucleu care „înțelege” protocolul Plug and Play (PnP) din Windows XP.

– un driver WDM este un driver PnP care „înțelege” și protocolul de power management și este compatibil atât cu Windows 98, cât și cu Windows XP. În categoria driverelor WDM se poate face distincție între driverele de clasă, care gestionează echipamentele care aparțin unei aceleiași clase bine definită, și mini drivere, care oferă suport specific, în funcție de producătorul echipamentului, driverelor de clasă.

– driverele video sunt drivere în mod nucleu pentru adaptoarele grafice și imprimante – echipamente a căror principală caracteristică este redarea vizuală a informației.

– driverele pentru sistemul de fișiere implementează sistemul de fișiere standard PC (care include conceptul de structură ierarhică de directoare ce conțin fișiere), pe discuri locale sau în rețea.

– drivere specializate sunt drivere în mod nucleu care controlează direct echipamentul hardware, fără ajutor din partea altor drivere. Această categorie include în principal driverele pentru versiuni mai vechi de Windows NT, care rulează nemodificate în Windows XP.

4.3. Modelul de driver Windows (WDM)

În modelul WDM fiecare echipament hardware are cel puțin două drivere. Unul din aceste drivere, denumit driverul funcție (function driver), este cel considerat întotdeauna „driverul” echipamentului respectiv. El este cel care „înțelege” toate detaliile legate de funcționarea echipamentului. El este responsabil de inițierea operațiilor I/O, de tratarea întreruperilor ce apar la terminarea acestor operații și de oferirea unei modalități prin care utilizatorul să controleze echipamentul. Celălalt driver poartă numele de driver de magistrală (bus driver). El este responsabil de gestionarea conexiunilor între echipamentul hardware și calculatorul gazdă. De exemplu driverul de magistrală pentru PCI (Peripheral Component Interconnect) este componenta software care detectează faptul că o placă este conectată într-un slot PCI și determină cerințele plăcii respective cu privire la conexiunile cu mașina gazdă. Tot el este cel care controlează fluxul de curent electric pentru slotul plăcii respective.

Unele echipamente au nevoie de mai mult de două drivere. Folosim pentru aceste drivere termenul generic de driver filtru. Unele drivere filtru pur și simplu „veghează” operațiile I/O efectuate de driverul funcție. De cele mai multe ori însă, un producător de software sau hardware oferă un driver filtru cu scopul de a schimba comportamentul unui driver funcție existent. Driverele filtru superioare au acces la pachetul IRP înaintea driverului funcție și au ocazia să ofere facilități suplimentare pe care driverul funcție nu le oferă. Uneori un driver filtru superior poate să corecteze o eventuală eroare de programare sau o deficiență a driverului funcție sau a echipamentului hardware. Driverele filtru inferioare au acces la pachetul IRP pe care driverul funcție încearcă să-l trimită driverului de magistrală. În unele cazuri, cum ar fi atunci când echipamentul este conectat la magistrala USB, un filtru inferior poate modifica fluxul de operații pe care driverul funcție încearcă să le facă.

În general, un driver funcție WDM este compus din două fișiere executabile. Un fișier – driverul de clasă – înțelege toate protocoalele WDM folosite de sistem și știe care sunt trăsăturile de bază ale unei întregi clase de echipamente (de exemplu driverul de clasă pentru camerele video USB). Celălalt fișier – minidriverul – conține funcționalități pe care driverul de clasă le folosește pentru a controla facilități specifice unui anumit producător. Combinația dintre driverul de clasă și minidriver formează un driver funcție complet.

Figura 4.2 – Conținutul unui pachet driver WDM

Putem privi un driver complet ca pe o colecție de subrutine pe care sistemul de operare le apelează pentru a efectua diferite operații. Figura de mai sus ilustrează acest concept. Unele rutine, cum ar fi DriverEntry și AddDevice, precum și funcțiile de tratare a câtorva tipuri de pachete IRP vor fi prezente obligatoriu în fiecare astfel de colecție. Driverele care au nevoie să pună cererile într-o coadă de așteptare – și majoritatea fac acest lucru – vor avea o rutină StartIo. Driverele care efectuează transferuri cu acces direct la memorie (DMA) vor avea o rutină AdapterControl. Driverele pentru echipamentele care generează întreruperi hardware vor avea o rutină de deservire a întreruperilor (Interrupt Service Routine – ISR) și o rutină de apel al procedurilor (Deferred Procedure Call – DPC). Pe lângă cele strict necesare, majoritatea driverelor vor avea funcții pentru tratarea câtorva tipuri suplimentare de pachete IRP.

4.4 Structura de bază a unui driver WDM

Am spus că un driver poate fi privit ca o colecție de subrutine pe care sistemul de operare le apelează pentru a efectua diverse activități legate de un echipament hardware. În continuare vom prezenta conținutul de bază al unei astfel de colecții și vom vorbi despre cum sunt stratificate driverele. Vom discuta de asemenea despre funcțiile DriverEntry și AddDevice pe care orice driver WDM trebuie să le includă.

4.5 Stratificarea driverelor

Modelul WDM formalizează o stratificare a driverelor, ilustrată în Figura 2-6.

Figura 4.3 Stratificarea obiectelor device și a driverelor în modelul WDM

În partea stângă a figurii apare o stivă de obiecte device. Acestea sunt structuri de date create de sistem pentru a ajuta la controlul echipamentului hardware. Mai multe astfel de structuri de date pot să existe pentru un singur echipament hardware. Obiectul de pe nivelul cel mai de jos al stivei se numește obiectul device fizic (physycal device object), prescurtat PDO. Undeva la mijlocul stivei de obiecte se găsește un obiect numit obiect device funcțional (functional device object), prescurtat FDO. Mai sus sau mai jos de FDO poate să existe o colecție de obiecte device filtru (filter device objects – FiDO). Obiectele filtru situate mai sus de obiectul FDO sunt denumite filtre superioare, în timp ce obiectele situate mai jos de obiectul FDO (dar deasupra de PDO) sunt denumite filtre inferioare.

Managerul PnP construiește stiva de obiecte device la cererea driverelor. Vom folosi termenul generic de magistrală pentru a descrie un echipament hardware la care se conectează electronic alte echipamente. Această denumire este destul de cuprinzătoare. Nu numai că include elemente precum magistrala PCI (Peripheral Component Interconnect), dar include și adaptorul SCSI (Small Computer System Interface), un port paralel, un port serial, un hub USB (Universal Serial Bus) și așa mai departe – de fapt orice echipament la care se pot conecta mai multe alte echipamente. Una din sarcinile unui driver de magistrală este să enumere toate echipamentele conectate la magistrală și să creeze obiecte PDO pentru fiecare dintre ele. Astfel, managerul PnP începe să construiască structura din Figura 2-6 în momentul în care unul din driverele de magistrală a detectat un nou echipament conectat la magistrală.

După crearea obiectului PDO, managerul PnP consultă fișierul registry pentru a determina driverele filtru și driverele funcție care ocupă poziția din mijlocul figurii 2-6. Programul de instalare este responsabil de inițializarea celor mai multe dintre aceste intrări în registry, iar de celelalte răspund fișierele INF care controlează procesul de instalare a unui driver. Înregistrările din registry definesc ordinea în care driverele vor fi dispuse în stivă; managerul PnP începe construcția stivei încărcând driverul filtru de pe nivelul cel mai de jos și apelând funcția AddDevice a acestuia. Această funcție creează un obiect FiDO, stabilind astfel legătura orizontală între obiectul FiDO și driver. După aceasta, funcția AddDevice conectează obiectul PDO la obiectul FiDO. Managerul PnP va continua apoi, încărcând și apelând fiecare filtru inferior, driverul funcție și fiecare filtru superior, până când stiva este construită în întregime.

Scopul acestei stratificări devine evident atunci când se analizează fluxul cererilor I/O reprezentat în partea dreaptă a diagramei din figura 2-6. Fiecare cerere pentru o operație adresată unui device folosește un pachet IRP. Aceste pachete sunt trimise driverului de pe nivelul cel mai de sus asociat cu acel device și sunt filtrate de-a lungul stivei de către celelalte drivere. La fiecare nivel driverul decide ce va face cu pachetul IRP. Uneori driverul de pe un nivel nu va face nimic cu pachetul primit, ci doar îl va transmite mai departe driverului de pe nivelul imediat inferior. Alteori un driver de pe un anumit nivel va deservi în întregime cererea din pachetul IRP, fără a transmite mai departe pachetul. Există și situații când un driver va prelucra mai întâi pachetul IRP și apoi îl va transmite nivelului următor inferior. Toate aceste decizii depind de echipament și de semnificația exactă a pachetului.

Diferitele tipuri de drivere care formează stiva pentru un anumit echipament hardware au diferite roluri: driverul funcție se ocupă de gestionarea echipamentului hardware, reprezentat prin obiectul FDO; driverul de magistrală se ocupă de gestionarea conexiunii între echipament și computer, reprezentat prin obiectul PDO; driverele filtru, dacă există, vor modifica fluxul de pachete IRP.

4.6 Modul de încărcare al driverelor

Am spus că driverul de magistrală creează obiectul PDO, dar am spus și că managerul PnP încarcă driverele pe baza înregistrărilor din registry corespunzătoare unui obiect PDO care există deja. Deci, de unde a apărut driverul de magistrală? Răspunsul la această întrebare se află în secțiunea următoare. Fișierul registry joacă un rol foarte important în procesul de încărcare a driverelor și de configurare a echipamentelor.

4.7 Enumerarea recursivă

Ca punct de plecare, în managerul PnP există integrat un „driver” pentru o magistrală „rădăcină” virtuală, magistrală care de fapt nu există. Această magistrală conectează, la modul conceptual, calculatorul gazdă cu toate echipamentele hardware care nu sunt capabile să-și anunțe propria prezență electronic – inclusiv magistrala hardware primară (precum PCI). Driverul pentru magistrala rădăcină obține informații despre calculator din fișierul registry, care a fost inițializat de programul de instalare al sistemului Windows XP. Programul de instalare a obținut aceste informații rulând un program complex de detecție și cerându-i utilizatorului anumite informații. Astfel, driverul pentru magistrala rădăcină are destule informații pentru a crea un obiect PDO pentru magistrala primară.

Driverul magistralei primare poate apoi să-și enumere electronic propriile echipamente hardware. De exemplu, magistrala PCI oferă o modalitate de a accesa o zonă specială de configurare pentru fiecare device atașat, iar această zonă conține o descriere a echipamentului și a resurselor de care are nevoie. Atunci când un driver de magistrală efectuează operația de enumerare a echipamentelor, practic se comportă ca un driver funcție obișnuit. În momentul în care a detectat un echipament, driverul își schimbă rolul: devine driver de magistrală și creează un nou obiect PDO pentru echipamentul detectat. Managerul PnP încarcă apoi driverele corespunzătoare acestui PDO. Se poate întâmpla ca driverul funcție să enumere în continuare alte echipamente, situație în care tot procesul se repetă recursiv. Rezultatul final va fi un arbore asemănător celui din Figura 2-7, unde o stivă corespunzătoare unei magistrale se ramifică în alte stive corespunzătoare echipamentelor atașate la acea magistrală.

Figura 4.4 Stratificarea echipamentelor enumerate recursiv

4.8 Rolul fișierului Registry

În procesul de configurare al unui device sunt implicate trei chei din registry: cheia hardware, cheia de clasă și cheia serviciului. Numele acestor chei nu sunt tocmai potrivite. Sunt de fapt nume generice ale unor chei al căror nume de cale depinde de echipamentul de care aparțin. La modul general, cheia hardware conține informații despre un singur device, cheia de clasă conține informații despre toate echipamentele de același tip, iar cheia serviciului conține informații despre drivere. Deseori cheia hardware mai este denumită „cheie de instanță”, iar cheia serviciului – „cheie software”.

4.8.1 Cheia hardware (de instanță)

Cheile hardware se află enumerate în subcheia HKEY_LOCAL_MACHINE\System\ CurrentControlSet\Enum în fișierul registry. Figura 2-8 prezintă o cheie hardware pentru un device PCI (în acest caz un adaptor grafic).

Figura 4.5 Exemplu de cheie hardware din registry

4.8.2 Cheia de clasă

Cheile de clasă pentru toate clasele de echipamente apar enumerate sub cheia HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control \Class. Numele acestor chei sunt identificatori globali unici alocați de Microsoft. Figura 2-9 ilustrează cheia de clasă pentru clasa de echipamente SAMPLE.

Figura 4.6 Exemplu de cheie de clasă din registry

4.8.3 Cheile serviciului (software) „giveio”

Cea de-a treia cheie importantă pentru un driver este cheia serviciului. Ea precizează locația pe disc a fișierului executabil al driverului și conține o serie de parametrii care controlează procesul de încărcare a driverului. Cheile pentru servicii apar în cheia HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. În figura 2-10 este exemplificată cheia serviciului pentru driverul „giveio” folosit în acest proiect.

Figura 4.7 Exemplu de cheie serviciu din registry

Valorile parametrilor din cheia serviciu, din acest exemplu, au următoarele semnificații:

– ImagePath precizează că fișierul executabil pentru driver are numele „Giveio.sys” și poate fi găsit în directorul „\??\c:\windows\system32\drivers”. De observat că valoarea acestui parametru reprezintă un nume de cale relativ, începând de la directorul rădăcină sistem.

– Type (1) indică faptul că intrarea se referă la un driver în mod nucleu.

– Start (3) indică faptul că sistemul va încărca acest driver doar atunci când un nou device a sosit în sistem. (Această valoare corespunde constantei SERVICE_DEMAND_START într-un apel al funcției CreateService și atunci când se referă la un driver în mod nucleu, înseamnă că nu este nevoie de un apel StartService pentru a porni driverul.)

– ErrorControl (1) indică faptul că în caz de eșec la încărcarea acestui driver, sistemul va înregistra eroarea și va afișa un mesaj.

– DisplayName specifică numele serviciului.

4.9 Ordinea de încărcare a driverelor

În momentul în care managerul PnP descoperă un nou device, deschide cheile hardware și de clasă și începe încărcarea driverelor în ordinea următoare:

– orice driver filtru inferior specificat în cheia hardware corespunzătoare. Cum valoarea intrării LowerFilters este de tip REG_MULTI_SZ, se pot specifica mai multe drivere. Ele vor fi încărcate în ordinea în care sunt întâlnite în acest șir.

– orice driver filtru inferior specificat în cheia de clasă. Din nou, acestea sunt încărcate în ordinea în care apar în șirul LowerFilters.

– driverul specificat de intrarea Service din cheia hardware.

– orice drivere filtru superioare specificate în cheia hardware, în ordinea în care apar în șirul UpperFilters.

– orice drivere filtru superioare specificate în cheia de clasă, în ordinea în care apar în șirul UpperFilters.

– când sistemul „încarcă” un driver, el mapează imaginea driverului în memoria virtuală și apelează funcția de intrare al driverului. Funcția de intrare a unui driver poartă numele DriverEntry. Această funcție va fi descrisă mai târziu în cadrul acestui capitol. S-ar putea ca un driver să fie deja prezent în memorie, caz în care nu se întâmplă nimic în faza de încărcare cu excepția incrementării unui contor de referințe care va păstra imaginea în memorie atâta vreme cât vreunul din echipamente are nevoie de ea.

5. Procese software, măsurarea încărcării unui sistem

5.1 Descriere generală

Ca toate sistemele de operare moderne, Windows-ul poate rula mai multe programe simultan. Totuși, dacă clacuatorul dumneavoartră nu are mai multe procesoare, el poate executa doar un „task” la un moment dat. Pentru a rezolva această problemă Windows-ul comută rapid între toate programele (aplicațiile) ce rulează, creând iluzia că toate programele rulează în paralel. Dacă însă, ați avut vreodată experiența unei blocări, ați remarcat că îndată ce această „comutare” a încetat, practic toate programele au încetat să mai funcționeze. Acest lucru se datorează faptului că procesorul a rămas blocat într-un proces și nu mai poate „ieși” din el.

5.2 Ce este un proces software?

În timp ce cuvântul „program” se referă la codul executabil (fișierul executabil, spre exemplu), un proces software este un program ce este în execuție. Când porniți un program în Windows, executabilul va fi încărcat în memoria RAM. După aceea Windows-ul va adăuga un nou proces în lista lui internă și îi va asigura memoria, resursele și ceva „timp CPU” necesare. Un proces poate apoi să ceară orice cantitate de resurse de la Windows atâta timp cât au mai rămas resurse libere. Windows-ul urmărește ce resurse utilizează fiecare proces. Îndată ce un proces este închis sau terminat, toate resursele folosite de acesta vor fi returnate Windows-ului și vor putea fi apoi folosite de către alte procese. Spre deosebire de memorie și resursele similare acesteia, „timpul CPU” nu poate fi cerut pur și simplu dar este alocat în mod egal între procese. Un proces poate returna CPU-ul Windows-ului după ce spațiul („cuanta”) de timp alocat acestuia s-a terminat. Acest lucru se întâmplă practic în majoritatea timpului și acesta este motivul pentru care CPU nu este folosit tot timpul în procent de 100%.

5.3 Terminarea proceselor pentru a elibera resurse

În momentul când un proces este terminat de către utilizator, toate resursele folosite de acesta vor fi eliberate și vor fi disponibile celorlalte procese. Dacă, să presupunem că, avem 10 procese ce rulează pe un sistem, oricare proces poate dispune de doar 10% din totalul resurselor hardware. Dacă avem procesorul cu frecveța de lucru de 1GHz și 64 MB RAM, de exemplu, fiecare proces va putea avea un procesor de 100MHz și 6.4 MB RAM. Acest exemplu este, desigur, mult simplficat, dar în realitate unele procese pot avea mai multe resurse decât altele. Totuși, deoarece mulți utilizatori au un număr de 50 de procese ce rulează sau chiar mai multe, cantitatea resurselor disponibile pentru un joc sau un „mp3 player” poate fi considerabil mai mică decât totalul resurselor hardware. Ce am putea face în această problemă? După cum va-ți dat seama, există o soluție chiar simplă: terminarea tuturor proceselor inutile!

5.4 Despre procese și fire de execuție

O aplicație este formată dintr-unul sau mai multe preocese. Un “proces”, în termenii cie mai simpli, este un program în execuție. Unul sau mai multe fire de execuție pot rula în contextul unui proces. Un “fir de execuție” este unitatea de bază căreia procesorul îi alocă “timp procesor”. Un fir de execuție poate executa orice parte din codul procesului, inclusiv părți ce sunt executate de către alt fir de execuție. O “fibră” este unitatea de execuție ce trebuie a fi programată chiar de aplicație. “Fibrele” rulează în contextul “firulor de excuție” ce le-au apelat.

Fiecare proces asigură resursele necesare pentru execuția unui program. Un proces are un spațiu de adrese virtuale, cod executabil, date, referințe de obiecte, variabile de mediu, o prioritate de bază și mărimile minimă și maximă a spațiului de lucru (memoria de lucru). Fiecare proces este pornit cu un singur fir de execuție, adesea numit “fir primar”, dar poate crea și “fire” adiționale dacă sunt necesare. Toate “firele de execuție” ale unui proces își împart spațiul de adrese virtuale și resursele sistemului. În plus, fiecare “fir de execuție” își menține referințele exepțiilor, o prioritate și un set de structuri pe care sistemul îl va folosi pentru a salva contextul “firului de execuție”, până când acesta va fi din nou activat. Contextul unui fir de execuție include regiștrii mașinii, stiva nucleului, un bloc al mediului și o stivă utilizator în spațiul de adresare a procesului. Windows NT suportă “multitasking preemtiv”, care creează efectul execuției simultane a mai multor fire de execuție ale mai multor procese. Pe un calculator cu mai multe procesoare, Windows NT poate executa simultan, atâtea “fire de execuție” câte procesoare sunt prezente.

5.5 Multitasking

Un sistem de operare “multitasking” împarte timpul procesor disponibil proceselor sau firelor de execuție care au nevoie. Sistemul este destinat unui “multitasking preemtiv”, el alocă o cuantă de “timp procesor” fiecărui fir pe care îl execută. Firul aflat în execuție este suspendat când cuanta de timp se termină, lăsând posibilitatea de a rula altui fir de execuție. Când sistemul schimbă firul de execuție, salvează contextul firului care tocmai va fi suspendat și restaureză contextul salvat al următorului fir din buclă. Lungimea cuantei de timp depinde de sistemul de operare și de procesor. Deoarece fiecare cuantă de timp este mică (aproximativ 20 milisecunde), mai multe fire par a fi executate simultan. Aceasta este defapt cazul sistemelor cu multiprocesoare, unde firele excutabile sunt distribuite procesoarelor disponibile. Oricum, trebuie avut grijă în cazul utilizării mai multor fire într-o aplicație, deoarece performanțele sistemului pot scade dacă există prea multe fire de execuție.

5.6 Tehnici de monitorizare

Dacă ați parcurs vreodată o listă de categori și contoare (ale programului de monitorizare utilizat), ați observat că există prea multe contoare de urmărit. Fără îndoială că, unele contoare sunt foarte importante pe când altele măsoară statistici obscure, de care probabil nici nu ați auzit. Pentru a stabili o bază de plecare este necesar cunoașterea contoarelor pe care le veți folosi. După ce ați ales aceste contoare, mai trebuie sa știți încă doua lucruri despre ele. Primul, trebuie să știți ce valori sunt normale pentru fiecare contor folosit. Al doilea, trebuie să cunoașteți limitele peste care valorile sunt considerate periculoase (sau problematice). De exemplu, anterior am menționat că, contorul „timp procesor” (%) ne poate spune cât de mult lucrează procesorul. În timp ce valori ocazionale de până la 100% sunt normale, media trebuie să fie sub 85%, altfel procesorul este inadecvat pentru sarcinile date și ar fi timpul unui upgrade. Dacă ați măsura performanțele sistemului dumneavoastră și ați descoperiți că valoarea medie a acestui contor este de 80%, veți ști că dacă doriți să porniți noi aplicații s-ar putea să aveți nevoie de un upgrade la procesor.

Din păcate monitorizarea performanței nu este așa de simplă ca adăugarea de noi contoare și citirea valorilor acestora. Există un număr de factori care pot cauza un program de monitorizare să arate rezultate inexacte. De aceea, înainte de a porni în formarea bazei, este important a elimina cât mai mulți factori cu putință.

Înainte de a vă arăta cum să reduceți rata erorilor, este important de știut că oricare măsurătoare nu va fi lipsită de erori. Oricum, orice om de ștință vă va spune că este imposibil a măsura ceva fară ca procesul de măsurare în sine să nu influențeze rezultatul final. Acestea fiind spuse, pimul lucru pe care îl recomand este să vă asigurați ca mărimea „page file” să fie corespunzătoare. Aceasta trebuie să fie de minim 100MB plus mărimea memoriei fizice. O valoare insuficientă ar putea cauza citiri inexacte ale performanței memoriei, procesorului și harddisk-ului, datorită unor operații de paginare excesive.

Apoi aș recomanda să opriți toate aplicațiile sau să dezactivați setările ce nu sunt neapărat necesare. Screen saver-ele sunt notorii prin apariția lor în timpul monitorizării performanței și determină rezultate eronate.

Am menționat mai devreme că nu se poate măsura performanța sistemului fără ca procesul de mărurare să o afcteze. Există câteva metode prin care se poate reduce influența procesului de măsurare. În primul rând, dacă nu doriți să comparați contoarele între ele ar trebui să evitați a măsura mai mult de un contor la un moment dat. Există și câteva motive pentru această observație. Fiecare contor adițional determină încărcări suplimentare, ceea ce poate afecta mărimi ca „meoria” și „timp procesor”. Apoi, măsurarea a prea multor contoare simultan determină congestionarea datelor afișate pe ecran și le face foarte dificil de citit și urmărit.

O altă tehnică de a minimiza încărcările suplimentare este cea de a afișa rezultatele în mod text decât în mod grafic. Modul grafic consumă cel mai mult din capacitatea de procesare decât celălalte moduri de vizualizare.

În final aș recomanda schimbarea frecvenței de achiziție a datelor. Deobicei, în cele mai multe programe, această achiziție se face la fiecare secundă. De multe ori însă, în multe situații, această rată de achiziție este prea mare. Nu uitați că în moment ce datele sunt achiziționate, acestea sunt salvate, de obicei, într-un fișier (de tip log). Dacă monitorizați un sistem ce are deja o încărare moderată, acesta poate să nu fie capabil să țină pasul cu cererile cauzate de către o rată de achiziție așa de ridicată. Aceste rate ridicate de achiziție pot cauza diferite operații de backup suplimentare și determină valori artificial de mari ale contoarelor de memorie și harddisk. Dacă doriți să opțineți valori în timp real ale contoarelor de performanță, vă sugerez a folosi o ratăde achiziție de peste 5 secunde. Un interval de 5 secunde este destul de încet pentru a permite sistemului să țină pasul cu cererile și, totodată, destul de rapid pentru a opține date în timp real. Dacă doriți să monitorizați sistemul pe perioade mai îndelungate (cum ar fi o zi), ar fi bine să setați rata de achiziție la o valoare și mai mare cum ar fi 5 sau chiar 10 minute.

6. Aplicația de monitorizare a temperaturii

6.1 Scopul aplicației

În cazul funcționării unui calculator în interiorul carcasei, mai ales vara, temperatura aerului poate atinge ușor valori de peste 45C, datorită tuturor componentelor care degajă căldură. Odată cu apariția de componente mari consumatoare de energie a crescut și căldura disipată de acestea. O temperatură prea ridicată nu poate fi decât dăunătoare componentelor și poate să ducă la deteriorarea acestora.

Aplicația a fost concepută pentru monitorizarea proceselor ce rulează la un moment dat și a temperaturii unui sistem (PC) putând citi informații despre procese, despre temperatură atât din interiorul carcasei, cât și de la dispozitive externe conectate la portul serie.

Un avantaj al acestei aplicații este că poate citi informații de pe mai multe plăci de bază, iar montajul extern se poate extinde ușor la mai mulți senzori. Aplicația citește informația de pe magistrala SMBus (despre care s-a vorbit într-un capitol ulterior), fapt care-i conferă avantajul de a fi ușor extinsă pentru mai multe plăci de bază cu un efort mic. Senzorii de pe montajul extern vor fi legați pe aceeași magistrală folosind protocolul 1-Wire Bus dezvoltat de firma Dallas Semiconductor. Numărul senzorilor care se pot lega pe această magistrală este teoretic nelimitat, acest număr depinzând de necesitățile utilizatorului.

De asemenea, aplicația poate fi dezvoltată în continuare printr-un modul de control ce ar avea ca sarcini, în cazul detectării unei temperaturi prea ridicate, atenționarea utilizatorului, oprirea sistemului sau chiar alte operații ce pot duce la scăderea acesteia. Primele două sarcini sunt mai ușor de implementat dar, pentru conceperea unor operații mai complexe, sunt necesare anumite studii referitoare la diferitele categorii de componente ce pot duce la încălzirea excesivă a sistemului și studierea componentelor din aceeași categorie dar de la producători diferiți.

6.2 Descrierea aplicației

Aplicația constă dintr-un program ce rulează pe un sistem de operare Windows (98, 2000, ME, NT și XP) și dintr-un montaj hardware experimental.

Programul (denumit „Power Spy”) are scopul de a monitoriza procesele ce rulează la un moment dat într-un calculator și valorile (temperaturilor, tensiunilor și vitezei ventilatoarelor) citite de la senzorii integrați pe placa de bază. Aplicația are un mod de afișare text a datelor, un mod de afișare grafică a anumitor date culese, cât și posibilitatea de a salva aceste date în fișiere, pentru eventuale prelucrări ulterioare.

Având posibilitatea de a înregistra și salva datele despre procesele software și diferitele valori citite de la senzori (interni și externi), aplicația poate fi folosită în numeroase scopuri, cum ar fi: monitorizarea unei sesiuni de lucru a calulatorului, identificarea diferitelor procese nedorite ce rulează sau au rulat la un moment dat, monitorizarea „încărcării software” unui sistem concomitent cu „încărcarea tremică” și infuența uneia asupra celeilalte din prelucrarea datelor înregistrate.

6.3 Implementarea aplicației

Programul aplicației a fost realizat în Visual C++ 7.0 (.NET) și Visual C++ 6.0. Implementarea a fost bază de clase, putându-se verifica si modifica usor in vederea unei depanari sau a unei viitoare imbunătățiri (ierarhia claselor va fi prezentată ulterior).

Programul poate afișa date despre toate procesele ce rulează la un moment dat pe calculator (date de genul: PID (process id), nume, pioritatea, gradul de utilizare a CPU-ului, memoria utilizată de program, etc). Aceste date sunt afișate în mod text, fiind grupate într-o listă; separat afișându-se numărul total de procese ce rulează și gradul de utilizare a procesorului. O altă categorie de informații este cea alocată senzorilor. Acestea oferă date despre tipul cipset-ului plăcii de bază (scanarea făcându-se pe magistrala PCI), tipul de access la senzori (SMBus, ISA- bus, 1 Wire Bus), adresele sau id-urile senzorilor prezenți și identificați și valorile citite de la aceștia grupate pe categorii (temperaturi, tensiuni, viteze ale ventilatoarelor).

Pe lângă modul de afișare în mod text a fost prevăzut și un mod grafic mai intuitiv. Acesta poate afișa doar anumite informații, cum ar fi: gradul global de utilizare a procesorului, temperaturile, tensiunile și vitezele de rotație a ventilatoarelor.

Selectarea informațiilor de afișat se face într-o secțiune separată, unde se mai pot alege și alte setări. Setările globale se referă la timpul (intervalul) de reîmprospătare a informațiilor afișate, slectarea modului de înregistrare precum și numele de bază a fișierelor în care vor fi stocate datele culese. Setările referitoare la senzori specifică tipul de valori de afișat. Intervalul de reîmprospătare a datelor se referă atât la procese cât și la senzori. În cazul datelor afișate despre anumite procese există posibilitatea ca acestea să nu fi putut fi citite și deci valorile aferente sunt deobicei egale cu 0. În cazul senzorilor pot exista mai multe probleme legate de driver-ul folosit de magistrala de acces la senzori cât și de tipul senzorilor “cunoscuți” de aplicație și deci posibil a fi identificați. În cazul driver-ului se vor afișa mesaje de eroare, iar în cazul senzorilor, se vor afișa doar senzorii recunoscuți.

Detalii despre implemntare vor fi prezentate în descrierea claseor.

6.4 Descrierea claselor

Descrierea claselor a fost mult simplificată, în vederea realizării unei imagini de ansamblu; nu au fost incluse toate clasele utilizate, metodele și membrii unei clase nu au fost amintiți.

Devices

CDriverInterface

– asigură interfața cu driverul folosit de aplicație

CDriverService

– asigură diferite facilități pentru instalarea/dezinstalarea, pornirea/oprirea unui serviciu driver

CBusInterface

– definește un set de funcții abstracte pentru interfața cu o magistrala

CPCIBusInterface

– asigură funcțiile de bază pentru interfața cu o magistrala PCI

C1WireBusInterface

– asigură funcțiile de bază pentru interfața cu o magistrala 1WireBus

CSMBusInterface

– asigură funcțiile de bază pentru interfața cu un bus SMBus

CDeviceInfo

– definește structura de date specifica unui dispozitiv fizic

CHardwareMonitor

– definește funcțiile specifice unor device-uri de monitorizare (senzori)

C1WireBusDevice

– definește funcțiile specifice unor device-uri (senzori) compatibile cu „1 Wire Bus”

CVIADevice

– asigură datele și funcțiile specifice unui device VIA

CWBDevice

– asigură datele și funcțiile specifice unui device WB

CADMDevice

– asigură datele și funcțiile specifice unui device ADM

CLMDevice

– asigură datele și funcțiile specifice unui device LM

CDSDevice

– asigură datele și funcțiile specifice unui device DS

Session

Sensors data

CDataItem

– asigură stocarea datelor citite de la senzori în funcție de tipul lor

CDataList

– asigură identificarea și stocarea mărimilor citite de la senzori

CMonitorHistory

– asigură și păstrează informații despre mărimile citite de la senzori de la pornirea aplicatiei

Processes

CProcessData

– asigură procesarea și calcularea diferiților parametrii ale proceselor indentificate si pastreaza datele pentru un anumit proces

CProcessList

– asigură identificarea și stocarea tuturor informațiilor proceselor curente dintr-un sistem

CProcessHistory

– asigură și păstrează informații despre toate procesele executate de la pornirea aplicatiei

Csession

– asigură inițierea operațiilor de salvare și „refresh” în cadrul unei sesiuni de lucru

User interface

CTabView

– definește și implementează funcțiile de bază a unui „View”

CSensorView

– asigură vizualizarea informațiilor referitoare la magisrale și senzori

CExternalSensorView

– asigură vizualizarea informațiilor referitoare la senzorii externi

CProcessView

– asigură vizualizarea informațiilor referitoare la procese

CGraphicView

– asigură vizualizarea diferitelor mărimi sub formă grafică

COptionsView

– permite modificarea setărilor programului

6.5 Prezentarea aplicației

6.5.1 Partea software

În continuare vor fi prezentate principalele ferestre ale aplicației “Power Spy” sub formă de „screen shot-uri” împreună cu o scurtă prezentare a acestora.

Aplicația a fost concepută ca un program utilitar în vederea determinării unei “semnături termice” a unui sistem, astfel fiind incluse facilități precum: citirea senzorilor integrați pe plăcile de bază, citirea informațiilor referitoare la procesele pornite, precum și posibilitatea memorării acestor date în fișiere pentru ulterioare prelucrări statistice.

Primele două ferestre (“Sensors” și “External sensors”) oferă informații asupra hardware-ul identificat (date referitoare la procesor, chip-set-ul plăcii de bază, senzorii identificați (interni și externi), și datele citite de la aceștia (temperaturi, vitezele ventilatoarelor, tensiuni).

Fereastra referitoare la procese prezintă o imagine “software” a sistemului adică: procesele pornite, gradul lor de utilizare a procesorului etc.

Fereastra “Graphic” prezintă un scurt istoric a anumitor mărimi alese spre vizualizare (gradul de utilizare a procesorului, temperaturile, etc.)

Fereastra “Options” oferă posibilitatea selectării anumitor parametrii de funcționare, precum: intervalul de timp pentru reîmprospătarea informațiilor, selectarea directorului de lucru, mărimile pentru modul de vizualizare grafic, etc.

Astfel aplicația este o un “tool” eficient și spre deosebire de alte programe din această categorie, oferă o imagine completă a unei sesiuni de lucru a sistemului atât din punct de vedere “software” cât și din punct de vedere “hardware”.

– fereastra „Hardware” ce oferă informații asupra procesorului, chipset-ului, senzorului identificat și a temperaturilor citite

– fereastra „External sensors” ce oferă informații asupra senzorilor externi și a mărimilor citite (temperaturi în cazul de față)

– fereastra „Processes” ce oferă informații detaliate asupra proceselor, și asupra procentului de utilizare a procesorului

– fereastra „Graphic” ce oferă o vizualizare grafică a unor mărimi (în cazul de față procentul de utilizare a procesorului)

– fereastra „Options” ce oferă posibilitatea de modificare a unor parametrii de funcționare aiprogramului

6.5.2 Partea hardware

Montajul extern a fost realizat pentru a interfața magistrala de tip Dallas “1 Wire Bus” la portul serial (COM) al unui calculator.

Dacă echipamentul are un port RS232 real ce utilizează circuite de limitare a curentului cu tensiuni de cel puțin ±8V, atunci este suficient un circuit pasiv simplu pentru a realiza interfața cu “1 Wire Bus”. Figura 6.1 prezintă toate detaliile. Formele de undă de la RXD și TXD sunt în principiu aceleași relativ la masa calculatorului. Diferența majoră constă în faptul că în loc de 0V vom avea o tensiune reală negativă, reprezentând starea “în gol” sau nivelul logic 1. Neglijând nivelele de tensiuni absolute, forma de undă observată la RXD este în esență inversara formei de undă ce va fi observată la o linie de date a sistemului “1-wire bus”, ce are nivelele 0 logic la 0V și 1 logic la 5V. Potențialul “mesei” calculatorului este diferit de cel al “1 Wire Bus”. Se observă că nivele tipice de tensiune (0 / 5V) pe linia de date a sistemului “1 Wire Bus” diferă față de nivelele de tensiune ale portul serial (-10 / +10V). D2 fixează potențialul liniei de date constant la 3.9V. Semnalele pentru comunicația “1 Wire Bus” vor fi practic generate prin modificarea potențialului liniei de masă fața de linia de date a sistemului “1 Wire Bus”.

Rezistența de “pullup” se află între masa “1 Wire Bus” și TXD, care furnizează tensiunea pentru sistem. D3 limitează cresterea tensiunii pe “1 Wire Bus” la o valoare maximă de 6.2V. Deoarece DTR este ținut la 3.9V, D3 limitează de asemenea tensiunea negativă ce apare pe RXD la –2.3V. D2 conduce doar când tensiunea pe TXD este negativă față de masa calculatorului. D4 limitează tensiunea dintre linia de masă și cea de date a “1-wire bus” atunci când tensiunea pe TXD este pozitivă. D6 cuplează TXD cu RXD atunci când TXD este pozitiv și șuntează pe R1 pentru a avea rezistentă scazută care va permite o tranzacție pe “1-wire bus”. D6 nu conduce atunci când tensiunea pe TXD este negativă față de masa calculatorului. Dacă un dispozitiv slave coboară linia de date “1-wire bus” (de ex. la “presence pulse” sau la “write 0”), va scurtcircuita DTR la RXD, obținându-se o tensiune pozitivă la RXD. Această tensiune pozitivă va fi tradusă ca 0 logic în buffer-ul de intrare a UART-ului. Vizualizând tensiunea dintre linia de date și cea de masă a “1-wire bus” cu un osciloscop nu va aparea nimic deosebit, decât faptul că variațiile tensiunii au loc la nivelul superior al limitei tolerabile. Vizualizând tensiuniile dintre RXD, TXD față de masa calculatorului vom observa semnale normale. Singura observație este cea a nivelului tensiunii negative de circa –2.3V (prea aprape de 0V) pe linia RXD.

Vizualizând cele trei semnale (linia de date “1-wire bus”, TXD, RXD) față de masa calculatorului vom observa o tensiune aproape constanta de 3.9V pe linia de date a sistemului “1-wire bus”. Tensiunea pozitivă de aprox. +4.1V de la RXD se încadrează în limitele specifice standardului RS232; tensiunea negativă se află la limita specificațiilor. Datorită faptului că variația tensiunii pe “1-wire bus” este limitată la 6V, o tensiune mai negativă se poate obține prin conectarea JP1, astfel D1 va sunta dioda D2, pentru ca are o valoare mai mică (3.2V). Dar acest lucru va duce la un curent absorbit mai mare pe DTR. Din fericire dispozitivele RS232 sunt mult mai sensibile la o tensiune pozitiva scazută, decât la o tensiune negativă apropiată de 0V.

Linia CTS a fost adaugată pentru a asigura un curent mai mare pe magistrală. Acest lucru este necesar atunci când senzorii sunt conectați la magistrala în configurația “parasite power” și sunt în faza de conversie a temperaturii. Deși nu se încadrează complet în caracteristicile RS232, această interfață realizată cu componentele specificate s-a dovedit a fi funcțională cu majoritatea calculatoarelor personale. Calculatoarele mici, în special cele cu baterii, s-ar putea sa nu poată genera curentul necesar. Se poate recurge la altă interfață mult mai performantă realizată cu DS9097.

Figura 6.1 – Circuit pentru interfața “1 Wire Bus” – “RS232”

7. Concluzii

7.1 Concluzii generale

Disiparea de căldură a circuitelor integrate VLSI moderne a crescut rapid o dată cu creșterea numărului de tranzistoare integrate și cu creșterea frecveței. De aceea, în ultimii ani, eforturile producătorilor de circuite integrate și a cercetătorilor din acest domeniu au fost direcționate înspre reducerea puterii consumate și scăderea temperaturii disipate de către circuitele integrate.

În ceea ce privește studiul și aplicabilitatea temperaturii în sistemele digitale, domeniul a devenit foarte larg, distingându-se însă câteva direcții mai importante și focalizate pe o anumită caracteristică. Principalele direcții de studiu a temperaturii sistemelor electronice sunt următoarele (figura 1.5):

– modelarea disipării căldurii într-un sistem – este necesară pentru estimarea căldurii disipate și are la bază noțiuni din termotehnică și termodinamică. Modelarea este abordată la mai multe niveluri de abstractizare, astfel că există modele pentru disiparea căldurii într-un circuit integrat, placă cu circuite integrate și sistem.

– metode de răcire a componentelor electronice – este foarte importantă în contextul în care puterea consumată crește iar temperatura la nivel de joncțiune trebuie limitată la o anumită valoare.

– metode de testare termică – temperatura este un parametru pe baza căruia se poate estima corectitudinea și funcționalitatea unui dispozitiv electronic. Cunoscând harta termică (distribuția de căldură) a unui dispozitiv se pot detecta și localiza defectele ce apar în respectivul dispozitiv. Testarea termică poate fi utilizată atât în faza de testare din procesul de producție al dispozitivului, cât și in timpul utilizării acestuia.

– metode de control a temperaturii disipate și a puterii consumate de un dispozitiv electronic – există destul de multe situații în care nu se poate recurge la metodele de răcire cele mai eficiente datorită costului, dimensiunilor sistemului, consumului suplimentar, etc.

Se poate observa astfel că aplicația realizată se încadrează în domeniul aplicațiilor care au ca scop realizarea unei „semnături termice” (mult simplificată) a unei sesiuni de funcționare a unui sistem. De asemenea, pe lângă monitorizarea temperaturii s-a implementat și un modul de monitorizare a proceselor software. Acest lucru oferă o imagine de ansamblu asupra „încărcării software” a unui sistem în raport cu „încărcarea termică”, pe care o induce prima. Capacitatea de a salva pe disk datele culese permite realizarea unor statistici, utile în diverse alte studii și aplicații.

Aplicația realizată constituie o „unealtă” efectivă și la îndemâna oricărui tip de utilizator, în vederea vizualizării și monitorizării în timp real a parametrilor critici unui sistem (toate procesele pornite, temperatura procesorului și a sistemului, vitezele de rotație a ventilatoarelor, etc). Domeniul de utilizare poate include atât monitorizarea calculatoarelor personale, server-elor cât și a altor dispozitive, prin folosirea senzorilor de temperatură externi.

De asemenea, aplicația poate fi dezvoltată în continuare printr-un modul de control ce ar avea ca sarcini, în cazul detectării unei temperaturi prea ridicate, atenționarea utilizatorului, oprirea sistemului sau chiar alte operații ce pot duce la scăderea acesteia. Primele două sarcini sunt mai ușor de implementat dar, pentru conceperea unor operații mai complexe, sunt necesare anumite studii referitoare la diferitele categorii de componente ce pot duce la încălzirea excesivă a sistemului și studierea componentelor din aceeași categorie dar de la producători diferiți.

7.2 Domenii de utilizare

Apticația realizată („Power Spy”) poate fi utilizată pentru diferite scopuri, cum ar fi:

– monitorizarea calculatoarelor personale în vederea stabilirii unei imagini de ansamblu asupra unei sesiuni de lucru („home users”);

– monitorizarea server-elor de retea în vederea realizării unei imagini asupra încărcării „softwre” și „termică” într-o sesiune de lucru normală, realizându-se astfel o „semnătură termică” normală, care mai apoi va permite determinarea perioadelor de supraîncărcare nedorite;

– posibilitatea vizualizării proceselor ce rulează la un moment dat, permite utilizatorilor avansați determinarea acelor procese nedorite, precum: viruși, procese „fantomă” (ce au rămas active în urma închiderii necorespunzătoare a unor aplicații), etc.;

– posibilitatea vizualizării unor parametrii critici de funcționare „în timp real”, cum ar fi: temperatura procesorului, temperatura sistemului, tensiunile interne de alimentare, vitezele de rotație ale ventilatoarelor;

– posibilitatea memorării datelor înregistrate, atât sub formă de istorie completă („log file”), cât și sub formă de raport (adică media datelor), asigură date pentru diferite alte studii în această direcție generală de detecție și control termic a sistemelor;

– posibilitatea comunicării cu senzori externi (conectați la portul serial al calculatorului) lărgește aria de detecție a aplicației;

– posibilitatea îmbunătățirii cu un modul de control va crește capacitatea aplicației de la un simpu „observator” la un adevărat „supervizor” cu putere de decizie.

7.3 Citirea temperaturii de la circuitul W83697HF al firmei Winbond

#include "stdafx.h"

#include <iostream.h>

#include <conio.h>

#include <windows.h>

#include <ctype.h>

#include "ResFile.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// The one and only application object

#define BUFFLENGTH 200

// Port Addreses

// By the manual we have two ports to use

// 0x295 – the INDEX port and

// 0x296 – the DATA port

#define INDEX 0x295

#define DATA 0x296

#define BANK_SET 0x4e // lowest three bitti set a bank, in manual lk97 and lk109

#define CPU_TEMP 0x50 // BANK 0 0x4e = xxxxx001

#define MBM_TEMP 0x67 // 0x4e = xxxxx000

//CWinApp theApp;

CString * buffer = new CString[BUFFLENGTH]; //memory buffer for reading temperatures

//using namespace std;

int inline openIO(){

HANDLE h;

h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if(h == INVALID_HANDLE_VALUE) {

cout << "Couldn't access giveio device\n";

return 1;

}

CloseHandle(h);

return 0;

}

int main(int argc, char ** argv)

{

int millis;

char mbTemp[5], cpuTemp[5], tmp[30];

//int ch;

int iterator = 0;

if(openIO()) return -1;

if (argc < 1 || argc > 3){

//get filename from commandline

cout << "Invalid command line parameters!"<<endl;

cout << "Usage: TempReader <filename.txt> <interval>"<<endl;

cout << "filename.txt text file for storing the results"<<endl;

cout << "<interval> miliseconds between reading temperatures"<<endl;

return -1;

}

if ((millis=atoi(argv[2])) == 0){

cout << "Invalid argument for milliseconds. It has to be an integer value."<<endl;

return -1;

}

CResFile rf(argv[1]); //create the file for writing temperatures

// TODO: code your application's behavior here.

if (!rf.openFile()){

cout<<"Error in opening file!!!"<<endl;

return -1;

}

//main application loop

do{

//verify buffer length

//if buffer is not full

if ( iterator < BUFFLENGTH ){

//read temperatures

//convert to String > use _itoa

//write to buffer

// Set Bank register to BANK0

_outp(INDEX, BANK_SET);

_outp(DATA, _inp(DATA)|0x01);

_outp(INDEX, CPU_TEMP);

//CPU temperature

_itoa(_inp(DATA), cpuTemp, 10);

// lets unset BANK register, to get Motherboard temperature

_outp(INDEX, BANK_SET);

_outp(DATA, _inp(DATA)&0xf8);

_outp(INDEX, MBM_TEMP);

//motherboard temperature

_itoa(_inp(DATA), mbTemp, 10);

strcpy(tmp, mbTemp);

strcat(tmp, " ");

strcat(tmp, cpuTemp);

strcat(tmp, "\n");

buffer[iterator] = tmp;

iterator += 1;

}else{

//write buffer to file

rf.appendVector(buffer, BUFFLENGTH);

delete(buffer);

buffer = new CString[BUFFLENGTH];

iterator = 0;

}

Sleep(millis);

}while(!kbhit());

if (!rf.closeFile()){

cout<<"Error in closing file!!!"<<endl;

return -1;

}

7.4 Scanarea magistralei PCI pentru a identifica chipset-urile plăcii de bază

typedef struct _PCI_INFO

{

WORD Vendor_ID;

CString Vendor_Name;

WORD Device_ID;

CString Device_Name;

BYTE Rev;

BYTE Bus;

BYTE Dev;

BYTE Fun;

WORD SMB_Address;

} PCI_INFO;

PCI_INFO* Scan_PCI(void)

{

UINT Bus, Dev, Fun;

PCI_INFO *p = NULL;

DWORD Data;

for( Bus = 0; !b && Bus <= 0xFF; Bus++ )

{

for( Dev = 0; !b && Dev <= 0x1F; Dev++ )

{

for( Fun = 0; Fun <= 0x07; Fun++ )

{

Data = Get_PCI_Reg(Bus, Dev, Fun, 0);

if( (Data != 0xFFFFFFFF) && (Data != 0) )

{

p = Get_PCI_Info(Data, Bus, Dev, Fun);

if( p != NULL )

{

break;

}

}

}

}

}

return p;

}

ULONG Get_PCI_Reg(ULONG Bus, ULONG Dev, ULONG Fun, ULONG Reg)

{

ULONG cc;

ULONG t, r;

cc = 0x80000000;

cc = cc | ((Bus & 0xFF) << 16);//Bus

cc = cc | ((Dev & 0x1F) << 11);//Dev

cc = cc | ((Fun & 0x07) << 8);//func

cc = cc | ((Reg & 0xFC));//Reg

t = _inpd(0xcf8);

_outpd(0xcf8, cc);

r = _inpd(0xcfc);

_outpd(0xcf8, t);

return r;

}

PCI_INFO* Get_PCI_Info(DWORD Data, ULONG Bus, ULONG Dev, ULONG Fun)

{

PCI_INFO* p;

p = new PCI_INFO();

p->Vendor_ID = (WORD)Data & 0xFFFF;

p->Device_ID = (WORD)(Data >> 16) & 0xFFFF;

p->Bus = (BYTE)Bus;

p->Dev = (BYTE)Dev;

p->Fun = (BYTE)Fun;

switch(Data)

{

case 0x71138086:

p->SMB_Address = (WORD)Get_PCI_Reg(Bus, Dev, Fun, 0x90) & 0xFFF0;

p->Rev = (BYTE)Get_PCI_Reg(Bus, Dev, Fun, 0x08) & 0xFF;

p->Vendor_Name = "Intel®";

p->Device_Name = "82371AB/EB (PIIX4)";

break;

case 0x24138086:

p->SMB_Address = (WORD)Get_PCI_Reg(Bus, Dev, Fun, 0x20) & 0xFFF0;

p->Rev = (BYTE)Get_PCI_Reg(Bus, Dev, Fun, 8) & 0xFF;

p->Vendor_Name = "Intel®";

p->Device_Name = "82801AA/ICH";

break;

case 0x24238086:

p->SMB_Address = (WORD)Get_PCI_Reg(Bus, Dev, Fun, 0x20) & 0xFFF0;

p->Rev = (BYTE)Get_PCI_Reg(Bus, Dev, Fun, 8) & 0xFF;

p->Vendor_Name = "Intel®";

p->Device_Name = "82801AB/ICH0";

break;

case 0x24438086:

p->SMB_Address = (WORD)Get_PCI_Reg(Bus, Dev, Fun, 0x20) & 0xFFF0;

p->Rev = (BYTE)Get_PCI_Reg(Bus, Dev, Fun, 8) & 0xFF;

p->Vendor_Name = "Intel®";

p->Device_Name = "82801BA/ICH2";

break;

}

return p;

}

8. Bibliografie

[Chung] – Chung-Υu Wu, „Challenges and Perspective of Integrated Circuits and Systems Research in the New Century”, http://soc1.cs.ccu.edu.tw/vlsi2002/, Mar. 2001.

[Gunther] – S. Gunther, F. Binns, D. Carmean, J. Hall, “Managing the Impact of Increasing Microprocessor Power Consumption”, Intel Technology Journal, 2001.

[Tadayon] – P. Tadayon, „Thermal Challenges During Microprocessor Testing”, Intel Technology Journal, 2000.

[Viswanath] – R. Viswanath, V. Wakharkar, A. Watwe, V. Lebonheur, „Thermal Performance Challenges from Silicon to Systems”, Intel Technology Journal, 2000.

[Sofia] – J. W. Sofia, „Trends in Electronics Reliability Testing”, http://www.analysistech.com/Trends.ppt, 2000.

[Brian] – Brian Posey, „Monitoring Windows’ Performance” (Part 1 and Part 2), http://www.brienposey.com/index.asp

[LIUtilities] – „Windows Processes Explained”, http://www.liutilities.com/products/wintaskspro/whitepapers/paper8/

[National] – National Semiconductor, http://www.national.com/appinfo/tempsensors/products.html#digital

[ADM] – Analog Devices, http://www.analog.com <search> <ADM1025 datasheet>

[WB] – Winbond, http://winbond.com <search> <WB83783S>

[Dallas] – Dallas Semiconductor, http://www.maxim-ic.com/1-Wire.cfm

[VIA] – VIA Technologies, http://www.via.com.tw <search> <VT82C686 datasheet>

[Intel] – Intel, http://intel.com <search> <Intel 82801BA>

Similar Posts