Opis
I2C oznacza obwód zintegrowany, jest protokołem na pokładzie używanego do komunikacji między dwoma układami scalonymi. Jest to szeregowy, dwa przewody protokołu. Jest to zgodne z trybem niewolników głównych. I2C Master zawsze inicjuje komunikację, a zegar komunikacji jest również dostarczany przez I2C Master. Na dwóch liniach może być podłączone wiele urządzeń. W konfiguracji pojedynczej i wielu niewolników każdy niewolnik będzie wyróżniony unikalnym adresem niewolnika.
Przykładowa konfiguracja pojedynczego głównego i wielu niewolników:
Na powyższym schemacie blokowym widzimy, że istnieje pojedynczy master i 3 niewolnicy z adresami, jak wspomniano w polu każdego niewolnika.
Protokół I2C
Ogólna sekwencja wiadomości I2C używana w komunikacji między głównym a niewolnikiem pokazano poniżej:
Start -> Adres + R/W BYTE -> ACK -> DANY BYTE1 -> ACK -> DANY BYTE2 -> ACK -> DANY BYTE3 -> ACK -> STOP
Początek: Warunek generowany przez mistrza w celu wskazania, że chce komunikować się z niewolnikiem.
Adres + bajt r/w: 7-bitowy adres niewolnika i 1 bit w celu wskazania, czy operacja jest odczytywana, czy zapisz.
Ack: Potwierdzenie jest zawsze wysyłane do każdego transferu bajtów. Jest to wysyłane przez urządzenie odbierające.
Zatrzymywać się: Po zakończeniu transferu kontroler/master wyśle warunek zatrzymania, aby ukończyć transfer.
W Linux sterowniki I2C są zorganizowane w trzy logiczne warstwy:
I2C Master/Adapter Sterowni
Są one znajdujące się w drzewie źródłowym jądra na ścieżce: sterowniki/ i2c/ busses/. Dla każdego mistrza lub kontrolera I2C powinien istnieć kierowca obecny na tej ścieżce. To jest sterownik, który rejestruje się w warstwie rdzeniowej I2C i kontroluje/zarządza i2c. To jest kierowca, który komunikuje się z urządzeniami niewolnikami I2C przez autobusy I2C obecne na platformie.
Kierowcy I2C
To jest wspólna logika rdzenia I2C Linux. Jest to powszechne i niezależne od konkretnego mistrza lub niewolnika I2C. To jest podstawowa implementacja podsystemu I2C w Linux.
I2C Slave/Client Driver
To jest sterownik chipów niewolniczy potrzebny dla każdego urządzenia niewolnika. Każde urządzenie niewolników I2C powinno mieć sterownik lub implementację obecną w tej kategorii. Jest to wymagane, aby każde urządzenie niewolnikowe zarejestrowało się na podsystemie Linux I2C.
Włączanie sterowników I2C w jądrze Linux
I2C Podstawowa implementacja będzie włączona z flagami konfiguracji jądra I2C Core. Sterownik główny I2C będzie również włączony do konkretnego kontrolera płyty I2C. Podobnie będzie włączona jedna flaga konfiguracyjna dla sterownika niewolnika I2C.
Wszystkie wymagane konfiguracje można włączyć na dwa sposoby. Jeden jako wbudowany sterownik lub moduł jądra. Moduły jądra zapewniają przewagę ładowania go jako środowiska wykonawczego bez zmiany lub kompilacji jądra Linux.
Podejście modułu można użyć tylko wtedy, gdy dostęp do urządzenia nie jest częścią ścieżki rozruchowej. Jeśli dane o jakimkolwiek urządzeniu są potrzebne do uruchamiania systemu, wówczas te sterowniki muszą być wbudowane. Takich sterowników nie można skompilować jako dynamicznie ładowane moduły w czasie wykonywania.
Instatowanie urządzeń I2C
W systemie Linux są obecne różne sposoby tworzenia instancji urządzeń I2C. Dwie powszechnie stosowane metody to: statyczne i dynamiczne
Statyczny: W systemach ARM drzewo urządzeń można użyć do utworzenia instancji urządzenia I2C.
W drzewie urządzenia można dodać określony węzeł urządzenia. Przykład, deklaracja drzewa urządzenia dla urządzenia I2C to:
I2C0: I2C@60000000
EEPROM@50
Compatible = "Atmel, eeprom-at";
Reg = <0x50>;
;
RTC@60
Compatible = "RTC, RTC-MAXIM";
Reg = <0x60>;
;
;
Powyższy przykład tworzy instancję 2 urządzeń niewolników i2C. Jednym z nich jest urządzenie EEPROM, a drugie to urządzenie RTC. Po pojawieniu się systemu wpisy można znaleźć w/sys/bus/i2c/devices/i2c-0/. Oba zostaną utworzone w katalogu I2C-0, ponieważ są one umieszczone w węźle I2C 0.
Dynamiczny: Instancja runtime urządzenia I2C można tworzyć za pomocą plików SYSFS.
Istnieją dwa pliki SYSFS dla każdego magistrali I2C. NEW_DEVICE I DELETE_DEVICE, oba pliki są tylko w zapisie, a adres niewolnika I2C można zapisać na tych plikach, aby utworzyć instancję urządzenia i usunąć instancję urządzenia.
Aby utworzyć urządzenie I2C równoważne urządzeniom zdefiniowanym w drzewie urządzeń jako poprzedni przykład.
Utwórz instancję EEPROM z adresem niewolnika 0x50:
# Echo EEPROM 0x50>/sys/bus/i2c/devices/i2c-0/new_device
Usunięcie instancji urządzenia EEPROM:
# echo 0x50>/sys/bus/i2c/devices/i2c-0/delete_device
Następnie sondowanie urządzenia z sterownikiem można również wykonać z plików SYSFS: Istnieją dwa pliki zapisu, powiązane z każdym sterownikiem, powiązane. Eksportowanie identyfikatora urządzenia do plików BIND i PLIFS RESS do łączenia i nierównomierności sterownika z urządzeniem. Na przykład sterownik RTC-DS1307 ma poniższe pliki w SYSFS, jak omówiono wcześniej.
[root] $ ls/sys/bus/i2c/sterowniki/rTC-DS1307/
wiązać Uevent Uncind
[root] $
Prowadzimy trochę więcej dyskusji na temat plików SYSFS podsystemu I2C:
I2C SYSFS jest obecny w lokalizacji:/sys/bus/i2c/
Migawka I2C SYSFS:
Jak widzimy, istnieją dwa katalogi: urządzenia i kierowcy
Urządzenia będą zawierać wszystkie obecne instancje urządzenia i znane z jądra Linux. Na naszej tablicy mamy poniżej urządzeń I2C w katalogu urządzeń:
Kierowcy będą zawierać wszystkie obecne i znane sterownikom I2C. Na naszej tablicy mamy poniżej kierowców I2C w katalogu kierowców:
W celu wiązania i rozpinania urządzeń za pomocą sterowników istnieją dwa pliki tylko do zapisu obecne w każdym sterowniku. W przypadku powiązania dowolnego urządzenia z sterownikiem można wykonać poprzez echem identyfikator urządzenia z plik wiązania i nie można było wykonywać echo identyfikatora urządzenia do pliku Unpind.
Wiązanie urządzenia I2C z sterownikiem I2C
[root] $ echo 1-0068>/sys/bus/i2c/sterowniki/rTC-DS1307/BIND
[592061.085104] RTC-DS1307 1-0068: Zarejestrowany jako RTC0
[root] $
Potwierdzenie udanego wiązania można wykonać, sprawdzając miękki łącze utworzone po operacji wiązania. Nowe miękkie link urządzenia można zobaczyć w poniższej instancji dziennika po wykonaniu polecenia wymienionego w sekcji powiązania:
[root] $ ls/sys/bus/i2c/sterowniki/rTC-DS1307/
1-0068 wiązanie Uevent Unbind
[root] $
Uzbrojenie urządzenia I2C za pomocą sterownika I2C
[root] $ echo 1-0068>/sys/bus/i2c/sterowniki/rTC-DS1307/Unbind
Potwierdzenie udanego rozpoznania można wykonać, sprawdzając węzeł urządzenia miękkiego utworzonego wcześniej w katalogu sterowników, zostanie usunięte. Jeśli sprawdzimy zawartość katalogu sterowników, powinniśmy zobaczyć migawkę Logs jak poniżej:
[root] $ ls/sys/bus/i2c/sterowniki/rTC-DS1307
wiązać Uevent Uncind
[root] $
Aplikacje lub przypadki użycia w odniesieniu do Linux
I2C-tools
Aplikacje przestrzeni użytkowników w środowisku Linux są używane do uzyskiwania dostępu do urządzeń niewolniczych I2C. I2CDETECT, I2CGET, I2CSET, I2CDUMP i I2CTRANSFER to polecenia dostępne, gdy narzędzia I2C są instalowane na dowolnej platformie Linux. Wszystkie przypadki użycia urządzeń omówione w sekcjach aplikacji I2C można uzyskać za pośrednictwem tych narzędzi.
Nie ma potrzeby sterownika urządzenia niewolnika I2C, podczas próby dostępu do urządzenia niewolnika z narzędziami I2C. Te narzędzia mogą pozwolić nam uzyskać dostęp do urządzeń w formacie RAW. Więcej informacji na temat tych narzędzi jest dostępnych w innym artykule.
Wniosek
Omówiliśmy podsystem I2C w Linux. Podano framework I2C z przeglądem organizacji kodu logicznego. Omówiliśmy również pliki i2c Sysfs. Omówiliśmy sekwencję wiadomości komunikacyjnych I2C. Przeszliśmy przez instancję urządzenia.mi., statyczne i dynamicznie. Zbadaliśmy również sterowniki wiązania/rozpasu z urządzeniami. Niektóre z aplikacji w czasie rzeczywistym I2C.