Generelt trenger ethvert operativsystem et stykke programvare som er spesifikt for enheten. Dette programvaren forstår enhetens funksjonalitet og er et mellomlag mellom OS og maskinvare. Enhetsdriver er betegnelsen som brukes til dette programvaren. I denne artikkelen skal vi diskutere hvordan Linux håndterer enhetene og enhetsdriverne. Med enkle ord vil vi utforske enhetsdriverens rammeverk av Linux.
Beskrivelse
Vanligvis er det på et hvilket som helst brett eller plattform, til stede, og disse enhetene er koblet til hverandre av noen fysiske linjer eller protokoller. Disse tilkoblingsprotokollene er kjent som busser. Det er flere bussprotokoller tilgjengelig. Få eksempler er I2C, SPI, AHB, APB, PCI, etc. La oss ta et eksempel på EEPROM -minneenhet. EEPROM er koblet til systemet med I2C -buss. CPU vil bruke I2C -protokollen for å lese/skrive data fra EEPROM. Fra CPU -siden vil denne protokollhåndteringen bli gjort av I2C -protokollkontrolleren. I2C -kontrolleren på CPU fungerer som hovedenheten. EEPROM fungerer som slaveapparatet. Alle detaljene i I2C er tilgjengelige i I2C -spesifikasjonen.
I Linux -baserte ARM -systemer er EEPROM -enheter befolket ved hjelp av enhets treet. Å definere EEPROM i enhetstreet er nok til å erklære enheten i systemet. Med denne enhetens oppføringsenhet vil forekomst bli opprettet av Linux -kjernen mens du starter opp. Når Linux starter opp, analyserer det enhetstreet og opprettet forekomsten av enhetene som er definert i enhets treet.
Med denne enheten opprettes i Linux, men Linux vil ikke kunne forstå enheten. For enhetskommunikasjon/operasjoner er det nødvendig med en spesiell programvare som er spesifikk for enheten. Dette vil bli kjent som enhetsdriveren for enheten. Kommer tilbake til EEPROM -eksemplet, vil EEPROM -enhetsdriver være nødvendig for å lese/skrive dataene fra EEPROM.
For å binde enhetsdriveren til den spesifikke enheten, er det nødvendig med en kompatibel streng. Kompatibel streng brukes av Linux -kjernen for å undersøke den spesifikke driveren til enheten mens du starter. Linux -kjernen gir også fleksibiliteten som en enhetsdriver kan lastes ved kjøretid. Den eneste tilstanden er at sjåføren ikke skal være nødvendig for at plattformen skal starte opp. Enhetsdriver som blir lagt til senere til kjernen er samlet som kjerneobjekter. Dette er filene som er til stede som .ko. InsMod -kommandoen brukes til å legge til kjerneobjektene på den løpende kjernen.
Etter at enhetsdriveren er sondert med enheten, kan enheten brukes til operasjonene. EEPROM -enhet kan leses/skrives etter at EEPROM -driveren er initialisert i Linux -kjernen. EEPROM -driveren initialiserer enheten og gir Linux -kjernen muligheten til å lese/skrive EEPROM.
La oss ta et eksempel på EEPROM -enhetsdriver som AT24, kildekode for enheten kan finne på lenken: https: // github.com/torvalds/linux/blob/master/drivere/misc/eeprom/at24.c
Denne sjåføren støtter veldig bredt antall EEPROM -enheter som beskrevet i kommentarene til førermel AT24C eller * Microchip 24LC, etc.
Følgende er enhetens treinformasjon som skal legges til for å opprette en enhetsforekomst:
eeprom@50
kompatibel = "Atmel, 24c32";
reg = <0x50>;
Pagesize = <32>;
Dette bør legges til den spesifikke I2C -kontrollernoden, der denne EEPROM -enheten er tilkoblet.
Som vi kan se, er det en kompatibel streng. Dette er informasjonen som brukes av Linux -kjernen for å finne enhetsdriveren til EEPROM -enheten.
For å få informasjonen om enhetene og enhetene som er til stede på Linux -systemet, er SYSFS -oppføringer det beste stedet.
For hver enhet og driver på systemet vil SYSFS -oppføringer bli opprettet av kjernen. Bruker kan henvise disse SYSFS -filene for å diagnostisere systemet.
Hvis vi ser innholdet i Sys -katalogen i Linux -kjernen:
/sys/buss: Alle bussene som er til stede på systemet er oppført i dette.
I2C -buss kan også sees. Da vi diskuterte I2C -enhetseksemplet. Inne i busskatalogen har vi I2C Bus Directory.
For enhver buss i SYSFS, vil vi ha alle enhetene og sjåførene til stede på den bussen. La oss se innholdet i I2C -bussen:
Hvis vi surfer videre på enhetene og driverkatalogen, vil vi få den komplette listen over enheter og drivere kjent for Linux -kjernen.
Inne i enhetene kan vi se at det er flere I2C -busser som er til stede i systemet. I2C-0, I2C-1, I2C-5, etc., er forskjellige I2C -busser. 0-0018 og 0-001A er slaveenhetene på I2C-0. 1-0050 og 1-0068 er I2C slaveenheter på buss nei. 1 i.e. I2C-1.
Inne i førerkatalogen har vi listen over alle I2C Slave Device Drivers.
Hvis du flytter tilbake til EEPROM-enhetens eksempel, er 1-0050 Eeprom-slaveapparatet. Hvis vi dykker videre inn i 1-0050-katalogen, vil vi se noe sånt nedenfor:
Dette har gitt oss kunnskapen om sjåføren som kontrollerer denne enheten. I øyeblikksbildet kan vi se AT24 -sjåføren kontrollerer EEPROM som er til stede i systemet. Dette er driveren som er koblet til denne EEPROM -enheten.
For å få tilgang til EEPROM -enheten fra brukerområdet, har driveren laget filen “Eeprom” som også kan sees i øyeblikksbildet.
For å lese 8K EEPROM -data og dumpe til filen, kan DD -kommandoen brukes som nedenfor:
dd if =/sys/buss/i2c/enheter/1-0050/eeprom av = eeprom_data.BIN BS = 1K telling = 8
Som det kan sees fra tømmerstokkene som 8K -byte leses fra Eeprom og skrevet til EEPROM_DATA.Bin -fil. Denne søppelfilen vil ha EEPROM -dataene. DD -kommando er mest populær og ofte brukt kommando i Linux World.
Akkurat som denne EEPROM -enheten, må andre I2C -enheter også følge retningslinjene gitt av Linux -kjernen. Andre I2C -enheter kan være RTC, TOCH -skjerm, etc. Totalt sett er denne enhetsdriverrammen aktuelt selv for enhetene utenfor I2C -omfanget.
Det kan være en SPI -enhet eller en hvilken som helst annen enhet. Det vil være en enhetsforekomst som skal opprettes og en annen driverforekomst. Både enheten og driveren vil være koblet/tilkoblet via bussjåfør. Dette er den generiske enhetsdriverens rammeverk i Linux.
Binding og unbinding av sjåføren
Binding av driveren med enhet er prosessen med å knytte til eller koble til driveren til enheten som kan kontrollere eller forstår det. Unbinding er den omvendte prosessen, når vi kobler fra driveren med enheten.
Det er SYSFS -filer som er til stede i alle driverne. Filnavn er bind og unbind. Dette er filene som kan brukes til å binde og unbind. Følgende er øyeblikksbildet til EEPROM -driveren AT24:
Avbinding av driveren med enhet
Som vi kan se, er enhetsforekomsten til stede inne i AT24. Dette betyr at enheten allerede er koblet. Vi kan gjenspeile enhetsnavnet for å binde driveren fra enheten.
Avbinding av sjåføren med enheten kan sees i øyeblikksbildet.
Echo 1-0050>/SYS/BUS/I2C/DRIVERS/AT24/Unbind; er kommandoen som har gjort unbinding. Etter denne kommandoen er ikke enheten til stede. Derfor er enheten ikke koblet til sjåføren nå.
Binding av driver med enhet
Echo 1-0050>/SYS/BUS/I2C/DRIVERS/AT24/BIND; er kommandoen som gjør bindingen av driveren med enheten.
First LS -kommandoen viser at enhetsdetaljer ikke er til stede i AT24 -katalogen, noe som betyr at enheten ikke er koblet til noen driver. For det andre ga vi en kommando for å koble enheten til sjåføren. Som et resultat så vi enhetsinformasjonen blir befolket inne i driverkatalogen. Derfor blir sjåføren koblet til enheten.
Enheten kan bare nås etter vellykket binding av driveren med enheten.
Konklusjon
Vi diskuterte enhetsdriverens rammeverk i Linux -kjernen med et eksempel på I2C EEPROM -enhet. Vi utforsket EEPROM -enhetsoppretting i enhetstreet og koblingen av driveren med enheten. Noe utforskning ble gjort på SYSFS -filene, som gir den veldig gode diagnostiske informasjonen om enheter og drivere til stede i Linux -kjernen. Vi så et eksempel på EEPROM -tilgang ved hjelp av DD -kommando. Vi forsto også de generiske rammene som involverer enhet, drivere og busser. Endelig henviste vi også måtene å binde og avbinde drivere og enheter manuelt fra brukerområdet.