VÜechny obvody v ATI-TV, kterΘ je mo₧nΘ softwarov∞ ovlßdat, pou₧φvajφ sb∞rnici I2C. Jejφ hardwarov² popis tady uvßd∞t nebudu, proto₧e je to z programßtorskΘho hlediska zbyteΦnΘ, a hlavn∞ ho neznßm :-). StaΦφ, ₧e je to sΘriovß sb∞rnice se signßly clock a data.ATI ve sv²ch programech pou₧φvß pro p°φstup k I2C knihovnu ATI_I2C.DLL. D°φve jsem ji taky pou₧φval, ale pak jsem si vÜiml, ₧e TV-Online se na ATI_I2C.DLL v∙bec neobracφ a mφsto toho pou₧φvß knihovnu I2CAPI.DLL. Ta je, na rozdφl od ATI_I2C.DLL, umφst∞nß v systΘmovΘm adresß°i Windows (%WINDIR%\System). P°itom vÜechny odstatnφ DLL jsou v \ATI\ATIDESK[\DRIVERS]. P°edpoklßdßm tedy, ₧e I2CAPI.DLL je jakßsi "ve°ejnß" knihovna, kterß mß slou₧it v²vojß°∙m ke komunikaci s I2C. Navφc jsem se do nφ dφval, a je to vlastn∞ jen interface, kter² najde ATI_I2C.DLL, naimportuje z nφ pat°iΦnΘ funkce a ty pak volß. To by potvrzovalo p°edpoklad o public verzi.
JeÜt∞ vßs chci upozornit, ₧e programuji p°evß₧n∞ v Delphi. Proto i vÜechny deklarace funkcφ apod. budu uvßd∞t tak, jak by se pou₧ily v Delphi. Myslφm ale, ₧e p°evod do "C" podoby pro vßs nebude v∙bec ₧ßdn² problΘm.
- deklarace procedure xxx je to samΘ jako void xxx()
- deklarace function xxx(a:TYP1, b:TYP2):TYPF je to samΘ jako TYPF xxx(TYP1 a, TYP2 b)
- typ word je 16bitov² unsigned int
- typ pointer je obecn²_typ *
- vÜem funkcφm exportovan²m z knihoven ATI se parametry p°edßvajφ v p∙vodnφm po°adφ, nßvratovß hodnota se vracφ v registru AX, a ·klid zßsobnφku provßdφ volanß funkce. To myslφm odpovφdß konvenci stdcall, ale ruku do ohn∞ bych za to nedal. Nemßm te∩ po ruce manußl.
Knihovna I2CAPI.DLL exportuje tyto funkce pro prßci s I2C:NE-Dump of "I2CAPI.DLL" ... Entry 7: I2CREADAFTERRESTART Entry 4: I2CCLOSE Entry 3: I2COPEN Entry 6: I2CWRITE ...Kdy₧ se podφvßme, s jak²mi parametry se tyto funkce volajφ, vyjde nßm n∞co takovΘho:function I2COPEN(dummy:Word):Word; far; external 'I2CAPI.DLL' name 'I2COPEN'; procedure I2CCLOSE; far; external 'I2CAPI.DLL' name 'I2CCLOSE'; function I2CWRITE( xunit:Word; port:Word; wbuffer:Pointer; wcount:Word):Word; far; external 'I2CAPI.DLL' name 'I2CWRITE'; function I2CREADAFTERRESTART( xunit:Word; port:Word; rbuffer:Pointer; rcount:Word; wbuffer:Pointer; wcount:Word):Word; far; external 'I2CAPI.DLL' name 'I2CREADAFTERRESTART';D∙le₧itΘ jsou jen funkce I2CWRITE a I2CREADAFTERRESTART. I2COPEN a I2CCLOSE toti₧ v aktußlnφ verzi (5.0) ned∞lajφ v∙bec nic. Resp. I2CCLOSE skuteΦn∞ ned∞lß nic, a I2COPEN pouze vrßtφ parametr dummy, kter² jφ byl p°edßn :-).Tak₧e te∩ k t∞m dv∞ma d∙le₧it²m funkcφm:
function I2CWRITE(xunit:Word; port:Word; wbuffer:Pointer; wcount:Word):Word;
PoÜle data na sb∞rnici I2C.
- xunit
╚φslo sb∞rnice I2C, se kterou se mß komunikovat. Musφ b²t v₧dy nula.- port
Port I2C, na kter² se bude zapisovat. M∞la by to b²t v₧dy sudß hodnota, ale nenφ to podmφnkou (automaticky se to opravφ v ATI_I2C.DLL)- wbuffer
Adresa bufferu, kter² obsahuje data p°ichystanß k zßpisu na I2C.- wcount
PoΦet bajt∙, kterΘ se majφ poslat na I2C.- Nßvratovß hodnota
0 pokud doÜlo k chyb∞ (FAIL), 1 pokud se vÜechno povedlo (OK).
function I2CREADAFTERRESTART(xunit:Word; port:Word; rbuffer:Pointer; rcount:Word; wbuffer:Pointer; wcount:Word):Word;
NaΦte data ze sb∞rnice I2C, p°φpadn∞ na ni jeÜt∞ p°edtφm poÜle data (obvykle adresu registru, ze kterΘho se bude Φφst).Pokud chcete z I2C pouze Φφst, nastavte wcount na nulu.
- xunit
╚φslo sb∞rnice I2C, se kterou se mß komunikovat. Musφ b²t v₧dy nula.- port
Port I2C, ze kterΘho se bude Φφst. M∞la by to b²t v₧dy lichß hodnota, ale nenφ to podmφnkou (automaticky se to opravφ v ATI_I2C.DLL)- rbuffer
Adresa bufferu, do kterΘho se ulo₧φ data naΦtenß ze sb∞rnice I2C.- rcount
PoΦet bajt∙, kterΘ se majφ naΦφst z I2C.- wbuffer
Adresa bufferu, kter² obsahuje data p°ichystanß k zßpisu na I2C.- wcount
PoΦet bajt∙, kterΘ se majφ poslat na I2C.- Nßvratovß hodnota
0 pokud doÜlo k chyb∞ (FAIL), 1 pokud se vÜechno povedlo (OK).
Ukßzkov² unit v Delphi pro prßci s I2CAPI.DLL:unit I2C_API; interface uses SysUtils, WinTypes, WinProcs; type TI2CBuffer = record a:Word; {+0 (0)} port:Word; {+2 (port)} retval:Word; {+4 (return value -- 0 = OK)} writeCount:Word; {+6 (delka)} readCount:Word; {+8 (0)} writeBuf:Pointer; {ofs=+0a, seg=+0c} readBuf:Pointer; end; procedure I2C_Open; procedure I2C_Close; function I2C_write(port:Byte; co:String):Word; function I2C_read(port:Byte; wbuf:String; co:Pointer; delka:Integer):Word; implementation function I2COPEN(dummy:Word):Word; far; external 'I2CAPI.DLL' name 'I2COPEN'; procedure I2CCLOSE; far; external 'I2CAPI.DLL' name 'I2CCLOSE'; function I2CWRITE(xunit:Word; port:Word; wbuffer:Pointer; wcount:Word):Word; far; external 'I2CAPI.DLL' name 'I2CWRITE'; function I2CREADAFTERRESTART(xunit:Word; port:Word; rbuffer:Pointer; rcount:Word; wbuffer:Pointer; wcount:Word):Word; far; external 'I2CAPI.DLL' name 'I2CREADAFTERRESTART'; procedure I2C_Open; var W:Word; begin W:=I2COPEN(0); end; procedure I2C_Close; begin I2CCLOSE; end; function I2C_write(port:Byte; co:String):Word; begin I2C_write := I2CWRITE(0, port, @co[1], Length(co)); end; function I2C_read(port:Byte; wbuf:String; co:Pointer; delka:Integer):Word; begin I2C_read := I2CREADAFTERRESTART(0, port, co, delka, @wbuf[1], Length(wbuf)); end; end.To by bylo pro zaΦßtek vÜechno. Odkazy na popisy jednotliv²ch I2C obvod∙ jsou na ·vodnφ stran∞.