I2C programátor je aj vo vašom počítači
.. alebo programujem cez grafický výstup
EdizonTN, 26.04.2021-07:30

Má ho prakticky každý počítač v sebe. I2C zbernica je dostupná je na grafickom výstupe pre externý monitor - v prevedení VGA, DVI alebo HDMI.
Zbernica DP (Display port) ju neobsahuje.

I2C zbernica na grafickom rozhraní, je nazývaná DDC kanál (Display Data Channel), pomocou ktorého monitor posiela operačnému systému svoje parametre a operačný systém na ich základe nastavuje optimálne rozlíšenie (plus časovanie videosignálov na grafickej karte).
Balík parametrov je v definovanej štruktúre (definovaná vo VESA Standard), ktorá sa nazýva EDID (Extended Display Identification Data). EDID je teda blok údajov uložených v EEPROM pamati v monitore s HW adresou 0x50, pripojenej k I2C zbernici. EEPROM je napájaná z +5V priamo z PC (súčasť graf. výstupov) a teda pamäť komunikuje aj pri vypnutom monitore.


Signály I2C zbernice (Data, Clock) a napájanie +5 a GND sa nachádzajú na nasledujúcich vývodoch:
Na konektoroch pripájajúcich externý monitor sa nachádza tu:


VGA konektor:

img src: [url]

I2C zbernica je na pinoch č. 15 a 12 (15 - SCL, 12 - SDA), +5V (pin č. 9)
Staršie VGA konektory I2C neobsahovali, ale tie v dnešnej dobe už asi ani nenájdeme.


DVI konektor:

img src: [url]

I2C zbernica je na pinoch č. 6 a 7 (6 - SCL, 7 - SDA), +5V (pin č. 14). Je prítomná pri všetkých typoch DVI, teda pri DVI-A, DVI-D a pri DVI-I.


HDMI konektor:

img src: [url]

I2C zbernica je na pinoch č. 15 a 16 (15 - SCL, 16 - SDA), +5V (pin č. 18)
Na identifikované vývody SDA,SCL, GND a +5V si teda môžem pripojiť svoj EEPROM čip.


Software
Ak operačný systém chce načítať EDID informácie cez DDC kanál, musí teda vedieť ovládať I2C zbernicu (stačí čítanie). No z princípu I2C zbernice je však čítanie a zápis podobné (nevyžaduje rozdielny HW, a ani dodatočné signály), takže každý OS vie (by mal) čítať aj zapisovať dáta pomocou I2C.
No nie každý OS jednoducho sprístupňuje túto vlastnosť užívateľovi.
Vo Windows-e si to treba naprogramovať a hotovú utilitu na zápis som nenašiel.
Preto som zvolil linux.

Operačný systém - LINUX
Je nutné doinštalovať balíky i2c-tools a read-edid, budem ich potrebovať.
  1. sudo apt install i2c-tools read-edid


Okrem grafických výstupov, sa I2C zbernica používa v počítačoch na viacerých miestach - napríklad pri komunikácii s tepelnými senzormi na základnej doske, pri identifikácii RAM modulov atď.
Preto musím identifikovať, ktorá I2C zbernica je na mojom grafickom výstupe (konektore)

Najskôr sa pozriem, aké I2C zbernice mám v PC:
  1. sudo i2cdetect -l



Vidím, že mám 10 I2C zberníc označenie používajú 0-9.
Ďalej potrebujem zistiť, na ktorej zbernici sa nachádza EEPROM pamäť s adresou 0x50.
Môžem použiť príkaz i2cdetect -y n, kde n je číslo I2C zbernice, ktorého výstupom je zoznam adries ktoré ACK-ovali I2C dopyt (odpovedali na adresovanie) a vo výpise hľadať len tie, kde je adresa 0x50, ale toto je zdĺhavé.
Ľahšie je použiť utilitu get-edid, ktorá robí presne to isté postupne po všetkých dostupných I2C zberniciach, ale hľadá iba potvrdenú adresu 0x50.
  1. sudo get-edid



Z výpisu sa dozvedáme, že toto PC obsahuje naozaj desať I2C zberníc a EEPROM pamäť reagujúca na adresu 0x50 sa nachádza na zbernici číslo 2 a 5, pričom na zbernici 2 program prečítal 128 bytov EDID informácii. To je monitor ktorý práve používam pri práci.

Teraz pripojím na grafický konektor, pomocou ktorého chcem programovať moju I2C pamäť, funkčný LCD monitor a znova spustím get-edid


Na výpise následne vidím, že pribudla pamäť 0x50 na zbernici č.1 (to je práve pripojený LCD monitor). Keďže som ho pripojil na HDMI rozhranie, I2C zbernica č.1 sa nachádza teda na HDMI. Postup opakujem ale na VGA rozhraní. Tam je pre zmenu zbernica č.0

Tento postup som robil len z toho dôvodu, aby som spároval čísla I2C zberníc z fyzickou zbernicou na grafických konektoroch. Je treba mať istotu, že zbernica s ktorou pracujem je naozaj tá, na ktorú mám pripojený svoj EEPROM čip, aby nedošlo k poškodeniu (prepísaniu) iného I2C čipu v PC.

Teraz odpojím LCD monitor a na jeho miesto si pripojím svoj EEPROM čip, s ktorým chcem pracovať.

Použil som poškodený HDMI kábel, ktorý mal jeden koniec dobrý, tak som ho strihol a prepípaním identifikoval signály I2C. Tie som naspájkoval na svoj EEPROM čip. Vývody A0 (prípadne aj A1 a A2) pamäte nastavujem tak, aby I2C adresa bola 0x50 (neni nutné-ale treba ju poznať)

Starý RAM modul som použil lebo nič lepšie nebolo po ruke


Momentálne je I2C EEPROM pamäť s adresou 0x50 pripojená k zbernici 1.

Samotný zápis a čítanie je v možné pomocou príkazov i2cget a i2cset

  1. i2cget -a 1 0x50 0x00 b

načíta byte z adresy 0x00 z EEPROM s adresou 0x50 zo zbernice č.1

  1. i2cset -a 1 0x50 0x00 0x01 b

zapíše byte s hodnotou 0x01 na adresu 0x00 do EEPROM s adresou 0x50 na zbernici č.1

  1. i2cdump -a 1 0x50 b

vyčíta blok 256 byte z adresy 0x00 z EEPROM s adresou 0x50 zo zbernice č.1:


pre porovnanie - štítok na RAM module:


Príkazom i2ctransfer sa dajú kombinovať viaceré správy a poslať v jednom prenose (read+write+read+write...).


Teraz som v stave, keď viem modifikovať (čítať alebo zapísať) jednu bunku v mojej EEPROM pamäti.
Lenže, ja chcem pracovať s celou pamäťou. Linux bohužiaľ nemá (neviem o nich) nástroje na prenos ľubovoľne dlhého bloku do/z EEPROM a jeho uloženie/načítanie v binárnom súbore - čo by sa pre programovanie a načítanie obsahu EEPROM hodilo.

Použijem script!
Po hľadaní na internete som ale taký script nenašiel. Niečo tam síce je, ale nespĺňa to vyššie uvedené.
Preto som požiadal nášho člena Fabo.sk a ten mi so scriptom pomohol. Vychádzali sme zo scriptu write-edid, ktorý sme modifikovali.

Tu je: https://github.com/Mikrozone-Server/rw-i2c

Script poskytuje aj návratové kódy. Tak ho môžete použiť pri svojej práci sofistikovanejšie.
Napríklad - pripojenie malého LCD displeja priamo na VGA konektor a “kŕmenie” živými dátami o teplote CPU….
To musí vypadať fakt srandovne.


Paráda. čo viac treba….
Ďakujem členovi MZ - Fabo.sk za práce na úprave scriptu.
Script (ešte sa na ňom pracuje! ) je uložený na GitHub-e: https://github.com/Mikrozone-Server/rw-i2c
Ak by ste radi niečo doplniť, alebo v prípade problémov s ním, použite issues priamo na githube.




tento článok je z mikroZONE
( https://mikrozone.sk/pluginy/content/content.php?content.156 )