Przegląd I2C w Linux

Przegląd I2C w Linux
W tym artykule zbadamy podstawowe wprowadzenie do I2C i wdrożenie I2C w Linux. Zbadamy podsystem I2C w jądrze Linux i kilka przykładów komunikacji Master i Slave Communication I2C.

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:

  1. sterownik master/adapter
  2. Warstwa I2C
  3. SLAVE/KIEROWNIK CLIENT

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

  1. Urządzenie EEPROM do przechowywania małych danych, pamięć ma kilka KBS.
  2. Urządzenie RTC, używane do przechowywania danych w czasie rzeczywistym. Urządzenie służy do utrzymania czasu, nawet gdy główny system jest wyłączony.
  3. Wiele urządzeń czujników HW, takich jak czujniki termiczne, czujniki prądu i czujniki napięcia są dostarczane jako urządzenia I2C.
  4. Płyty kontrolujące wentylatory są również urządzeń I2C.

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.