I2C Oversikt i Linux

I2C Oversikt i Linux
I denne artikkelen vil vi utforske grunnleggende introduksjon om I2C og implementering av I2C i Linux. Vi vil utforske I2C -delsystemet i Linux -kjernen og noen eksempler for I2C Master and Slave Communication.

Beskrivelse

I2C står for Inter Integrated Circuit, er en ombordprotokoll for brukt til kommunikasjon mellom to ICS. Det er en seriell, to ledningsprotokoll. Dette følger master slavemodus. I2C -master initierer alltid kommunikasjonen og klokken for kommunikasjon er også gitt av I2C Master. På to linjer kan det være flere enheter tilkoblet. På enkeltmester og mange slavekonfigurasjoner vil hver slave skilles ut med unik slaveadresse.

Eksempelkonfigurasjon av enemaster og flere slaver:

I blokkdiagrammet ovenfor kan vi se at det er en master og 3 slaver med adresser som nevnt i boksen til hver slave.

I2C -protokoll

Generelle I2C -meldinger sekvens brukt i kommunikasjon mellom master og slave vises nedenfor:

Start -> Adresse + R/W BYTE -> ACK -> Data BYTE1 -> ACK -> Data BYTE2 -> ACK -> Data BYTE3 -> ACK -> Stopp

Start: Tilstand generert av master for å indikere at den vil kommunisere med slaven.

Adresse + r/w byte: 7-biters slaveadresse og 1 bit for å indikere om operasjonen leses eller skriver.

Ack: Anerkjennelse sendes alltid for hver byteoverføring. Dette sendes av mottakende enhet.

Stoppe: Når overføringen er fullført, vil kontroller/master sende stopptilstanden for å fullføre overføringen.

I Linux er I2C -drivere organisert i tre logiske lag:

  1. master/adapter driver
  2. I2C-core lag
  3. Slave/klientdriver

I2C Master/Adapter Drivers

Disse er plassert i kjernekildetreet ved stien: Drivere/ I2C/ Busses/. For hver I2C -master eller kontroller skal det være en sjåfør til stede på denne veien. Dette er sjåføren som registrerer seg i I2C-Core-laget og kontrollerer/administrerer I2C-busene. Dette er driveren som kommuniserer med I2C -slaveenhetene over I2C -busser som er til stede på plattformen.

I2C-core drivere

Dette er den vanlige I2C -kjernelogikken til Linux. Dette er vanlig og uavhengig av enhver spesifikk I2C -mester eller slave. Dette er kjerneimplementeringen av I2C -undersystemet i Linux.

I2C Slave/Client Driver

Dette er slavebrikkedriveren som trengs for hver slaveenhet. Enhver I2C slaveenhet skal ha driver eller implementering til stede i denne kategorien. Dette er nødvendig for at enhver slaveenhet skal registrere seg selv til Linux I2C -undersystemet.

Aktivering av I2C -driverne i Linux -kjernen

I2C Core Related Implementation vil bli aktivert med I2C Core Kernel Config -flagg. I2C Master Driver vil også være aktivert med den spesifikke tavlen I2C -kontrolleren. Tilsvarende vil det være ett konfigurasjonsflagg som skal aktiveres for I2C -slavesjåføren.

Alle nødvendige konfigurasjoner kan aktiveres på to måter. En som innebygd driver eller som en kjernemodul. Kernelmoduler gir oss fordelen med å laste den som runtime uten å endre eller sammenstille Linux -kjernen.

Modultilnærming kan bare brukes hvis enhetstilgangen ikke er en del av oppstartsstien. Hvis det er nødvendig med noen enhetsdata for at systemet skal starte opp, må disse driverne bygges inn. Slike drivere kan ikke samles som en dynamisk lastede moduler ved kjøretid.

Instortering av I2C -enhetene

I Linux er det til stede forskjellige måter for å instantisere I2C -enhetene. To mye brukte metoder er: statiske og dynamiske

Statisk: På ARM -systemer kan enhetstreet brukes til å lage en forekomst av I2C -enheten.

Spesifikk enhetsnode kan legges til i enhetstreet. Eksempel, Device Tree Declaration for I2C -enhet er:

I2C0: I2C@60000000
eeprom@50
kompatibel = "atmel, eeprom-at";
reg = <0x50>;
;
RTC@60
kompatibel = "RTC, RTC-MAXIM";
reg = <0x60>;
;
;

Over eksemplet oppretter en forekomst av 2 I2C slaveenheter. Den ene er EEPROM -enhet og en annen er RTC -enhet. Etter at systemet har dukket opp, kan disse oppføringene finnes i/sys/buss/i2c/enheter/i2c-0/. Begge vil bli opprettet i I2C-0-katalogen fordi disse er plassert inne i I2C-node 0.

Dynamisk: Runtime -forekomst av I2C -enheten kan opprettes gjennom SYSFS -filer.

Det er to SYSFS -filer til stede for hver I2C -buss. New_Device og Delete_device, begge filene er skrivebeskyttet, og I2C slaveadresse kan skrives på disse filene for å opprette enhetsforekomst og slette enhetsforekomst.
For å lage en I2C -enhet som tilsvarer enhetene som er definert i enhets tre fra forrige eksempel.

Opprett EEPROM -forekomst med slaveadresse 0x50:

# Echo EEPROM 0x50>/SYS/BUS/I2C/DEVICES/I2C-0/NEW_DEVICE

Sletting av EEPROM -enhetsforekomst:

# ECHO 0x50>/SYS/BUS/I2C/DEVICES/I2C-0/DELETE_DEVICE

Deretter kan sondering av enheten med driver også gjøres fra SYSFS-filer: Det er to skrivefiler som binder og unbind, tilknyttet hver driver. Eksportere enhets -ID til bind- og unbind -filene resulterer til kobling og kobling av driveren med enheten. For eksempel har Driver RTC-DS1307 filene nedenfor i SYSFS som diskutert tidligere.

[Root] $ LS/SYS/BUS/I2C/DRIVERS/RTC-DS1307/
Bind uevent unbind
[root] $

La oss ha litt mer diskusjon om SYSFS -filene til I2C -undersystemet:

I2C SYSFS er til stede på stedet:/SYS/BUS/I2C/

Øyeblikksbilde av i2c sysfs:

Som vi kan se, er det to kataloger: enheter og drivere

Enheter vil inneholde alle enhetsforekomstene som er til stede og kjent for Linux -kjernen. På vårt styre har vi under I2C -enheter i enhetens katalog:

Drivere vil inneholde alle I2C -sjåførene som er til stede og kjent for Linux -kjernen. På styret vårt har vi under I2C -drivere inne i driverkatalogen:

For binding og avbinding av enhetene med drivere, er det to skrivefiler som er til stede i hver driver. For kobling av en hvilken som helst enhet med driveren kan gjøres ved å ekko enhets -ID til bindfilen og kobling kan gjøres ved å gjenspeile enhets -IDen til unbind -filen.

Binding av I2C -enheten med I2C -driveren

[root] $ ekko 1-0068>/sys/buss/i2c/drivere/rtc-ds1307/bind
[592061.085104] RTC-DS1307 1-0068: Registrert som RTC0
[root] $

Bekreftelse av den vellykkede bindingen kan gjøres ved å sjekke den myke koblingen som er opprettet etter bindingsoperasjonen. En ny enhet myk lenke kan sees i loggforekomsten nedenfor etter å ha utført kommandoen som er nevnt i bindingsseksjonen:

[Root] $ LS/SYS/BUS/I2C/DRIVERS/RTC-DS1307/
1-0068 bind uevent unbind
[root] $

Unbinding av I2C -enheten med I2C -driveren

[root] $ ekko 1-0068>/sys/buss/i2c/drivere/rtc-ds1307/unbind

Bekreftelse av den vellykkede unbinding kan gjøres ved å sjekke den myke koblingsenhetsnoden som er opprettet tidligere inne i førerkatalogen, blir fjernet. Hvis vi sjekker innholdet i sjåførenes katalog, bør vi se snapshot for logger som nedenfor:

[Root] $ LS/SYS/BUS/I2C/DRIVERS/RTC-DS1307
Bind uevent unbind
[root] $

I2C -applikasjoner eller bruk saker med hensyn til Linux

  1. EEPROM -enhet For å lagre små data, er minnet av få KB.
  2. RTC -enhet, brukt til å oppbevare sanntidsdata. Enheten brukes til å holde banen på tid selv når hovedsystemet er strøm av.
  3. Mange HW -sensorenheter som termiske sensorer, strømsensorer og spenningssensorer kommer som I2C -enheter.
  4. Fankontrollerende brikker kommer også som I2C -enheter.

I2C-verktøy

Brukerplassapplikasjoner i Linux -miljø brukes til å få tilgang til I2C slaveenheter. I2CDETECT, I2CGET, I2CSET, I2CDUMP og I2CTRANSFER er kommandoene som er tilgjengelige når I2C-verktøy er installert på en hvilken som helst Linux-plattform. Alle enhetens brukssaker omtalt i I2C -applikasjonsseksjonene kan nås gjennom disse verktøyene.

Det er ikke behov for I2C slaveenhetsdriver, når du prøver å få tilgang til slaveenheten med I2C-verktøy. Disse verktøyene kan gi oss tilgang til enhetene i rått format. Flere detaljer om disse verktøyene er tilgjengelige i en annen artikkel.

Konklusjon

Vi diskuterte I2C -undersystemet i Linux. I2C Framework med Oversikt over logisk kodeorganisasjon ble gitt. Vi diskuterte også I2C SYSFS -filer. Vi har diskutert I2C -kommunikasjonsmeldingssekvensen. Vi har gått gjennom opprettelsen av enhetens forekomst på begge måtene, jeg.e., statisk og dynamisk. Vi utforsket også bind/unbind drivere med enheter. Noen av I2C sanntidsapplikasjoner.