Skip to content
7. Zugriff auf Hardware aus dem Userspace
1

Zugriff auf HW aus dem Userspace

10.05.2024
7. Zugriff auf Hardware aus dem Userspace
2

Eingangsspannung

  • Bereich von 0 ... 3.3V einhalten (bei gewisser HW max 1.8V)
  • Für HW-Zugriff sind immer Kerneltreiber für HW und für Subsystem nötig
    • z.B. Accellerometer: adxl345 Industrial IO sowie I2C oder SPI
  • make menuconfig
    • GPIO_SYSFS
    • I2C_CHARDEV
    • SPI_SPIDEV
    • ...
  • Compile > Deploy > Load
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
3

SysFS

  • einfacher Zugriff auf (meist) einfache Schnittstellen (mit nur wenigen Parametern)
  • z.B. auf GPIOs, LEDs, PWM, Temperatursensoren, CPU-Powermodi, ...
  • über Pseudodateien unter
    • /sys/class/{gpio, leds, pwm, ...}
    • theoretisch beliebige GPIOs aktivierbar über /sys/class/gpio/export
    • export ändert jedoch das Pinmultiplexing nicht! (wenn falsch via DTS/DTB umdefinieren)
    • Zugriff via Shell (echo) oder File-Systemcalls (wie open(), read(), write(), lseek()...)
    • auch Asynchron Notification über gpio/value und poll()
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
4

Devicenode

  • Zugriff via /dev/ auf einen Device-Driver
  • z.B. Anwendungsspezifische Subsysteme
    • HID
    • TTY
    • Industrial IO (IIO)
    • Sound
    • Video4Linux
  • Zugriff via FS-Calls und ioctl
  • Für USB: libusb
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
5

/dev/mem

  • Direktes Mapping der Hardware via Memorymap
  • Sehr unsicher!
  • Quick and Dirty
  • Falls für HW keine Treiber existieren
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
6

GPIO

  • Input: Pollen
    • via read() call
    • erzeugt aber unnötig viel CPU Last
    • unproblematisch falls das Interval tief ist
  • Input: ISR
    • emöglicht schnelles reagieren ohne CPU-Last
    • reagiert auf hw interrupt
    • bei aktivierung aus dem Userspace mit /sys/class/gpio/event
  • Doku: https://www.kernel.org/doc/Documentation/gpio/sysfs.txt
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
7

I2C

  • Auch IIC, I2C oder TWI genannt
  • Benötigt nur 2 Signalleitungen
    • SDA: Serial Data
    • SCL: Serial Clock
  • Busfähig (7 Bit Adresse)
  • rel. langsam (max 3.2 Mbps)
  • Halbduplex (gleichzeitig nur eine Datenrichtung)
  • Single Master
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
8

Beispiel: adxl345

  • i2c-tools (Konfigurieren in Buildroot)
  • Für Accellerometer auf DE1-SoC
bash
i2cdetect -y 0
# Adresse 0x53
i2cget -y 0 0x53 0x2D
i2cget -y 0 0x53 0x2D 0x08
i2cget -y 0 0x53 0x32
i2cget -y 0 0x53 0x33
i2cget -y 0 0x53 0x34
# siehe datasheet
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
9
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
10

SPI Bus

  • schneller als I2C (bei 50MHz)
  • Vollduplex
  • Mehrere Devices am selben Bus
    • mit Chipselect (keine Adressen)
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
11

SPI Mutliple Chips

10.05.2024
7. Zugriff auf Hardware aus dem Userspace
12

SPI Clock Modes

  • Clock Polarity
  • Clock Phase (Rising / Falling Edge)
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
13

USB

  • Sehr hohe Datenraten möglich
SpecDatenrate Mbit / s
1.1 low speed1.5
1.1 full speed12
2.0 highspeed480
3.0 superspeed5'000
3.1 superspeed+10'000
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
14

USB

  • Netto Transferrate nur ca. 2/3 der theoretischen
  • USB 3.x immer noch relativ selten bei SoCs
  • Single Master, mehrere Slaves (via Hubs)
  • OTG: Hybrider Modus möglich
  • Tranfertypes (Control, Bulk, Isochron, Interrupt)
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
15

USB im Userspace

  • Mit libusb-1.0
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
16

Asynchron Serielle Schnittstelle

  • Unter Linux TTY / unter Windows COM
  • ... resp. unter /deV/tty*
  • Typische Bezeichnung
    • /dev/ttyUSB0 für FTDI / Profilic
    • /dev/ttyACM0 für USB CDC Serial Device Class (konformes USB Serial Interface)
    • /dev/ttyS0 für Schnittstelle direkt auf dem SoC
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
17

UART / USART

  • Praktisch und einfach für Zeilenorientierte Kommunikation (canonical input)
  • Kompliziert für Blockorientierten oder binären (non-ascii) Transfer - am besten für non-canonical libftdi verwenden - ... oder direkt libusb verwenden
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
18

Linux I/O für Sensoren

  • Input Subsystem
    • HID für Keyboard / Mouse
    • Zugriff via /sys/class/input
    • Android verwendet dieses Interface auch für Sensoren
  • HWMON
    • Überwachung des Mainboards
    • /sys/class/hwmon
    • Temparatur, Feuchtigkeit, Voltage
    • Im Kernel unter Hardware Monitoring Support
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
19

mmap

  • Per Systemcall auf mmap()
  • Erlaubt beliebiges Pagen auf Physical Memory in den Userspace
  • ... sowie DRAM als auch Memory Mapped IO
  • Nachteile
    • muss mit "root" ausgeführt werden
    • Portierbarkeit nicht gewährleistet
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
20

Industrial I/O (IIO)

  • Für komplexere Chips
  • /sys/class/iio/ + Char Device via /dev/
  • Derzeit > 300 Chips unterstützt
  • Programmierung meist im Kernel Space wegen HW-Triggerung
10.05.2024
7. Zugriff auf Hardware aus dem Userspace
21

GPIO: Interrupts

gpio example

10.05.2024
7. Zugriff auf Hardware aus dem Userspace
22

USB: mit libusb

USB example

10.05.2024
7. Zugriff auf Hardware aus dem Userspace

GPIO

23

mmap GPIO beim Raspi

mmap GPIO example

10.05.2024