ATI Internals

Sb∞rnice I2C

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.

I2CAPI.DLL

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.
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.
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∞.

homepage