2016-05-29 8 views
0

Ich habe eine thermo3 click, die tmp102 sensor hat.User-Space-Anwendung für tmp102 Sensortreiber

Daten von ihm zu lesen, ich habe einen User-Space-Anwendung mit I2C wie folgt geschrieben:

fd = open("/dev/i2c-0", O_RDWR)) 
ioctl(fd, I2C_SLAVE, 0x48) 
read(fd, &buf, 2) 

Aber dann fand ich seinen Fahrer in linux source code.

Also ich frage mich:

1) Kann ich einen User-Space-Anwendung schreiben, die diesen Fahrers API verwendet (Mittel Fahrergerätedatei)?

2) Wie I2C User-Space-Anwendung funktioniert, ohne diesen Treiber zu verwenden (weil dieser Treiber in meinem Kernel nicht aktiviert ist, wenn ich i2c User-Space-Anwendung verwendete) oder So funktioniert I2C?

Antwort

0

1) Dies ist ein hwmon Gerät, Sie haben keine Gerätedatei zu verwenden. Stattdessen ist die API in /sys/class/hwmon. Insbesondere möchten Sie die Dateien lesen

2) Durch die Verwendung von /dev/i2c-0, kommunizieren Sie direkt auf dem i2c-Bus, effektiv um jeden Kernel-Treiber umgehen. Sie müssen dann die Details für jedes Gerät kennen, das Sie verwenden (Register zum Lesen und ihre Bedeutung ...), anstatt die generische Linux-Kernel-Abstraktion zu verwenden.

+0

bedeutet Lesen von Daten aus/sys/class/hwmon/hwmonX/tempX_input ist der ideale Weg im Vergleich zum Lesen über i2c Bus – Patrick

+0

Ich habe die Gerätetreiber -> Hardware Monitoring-Unterstützung -> tmp102 in meinem Kernel, aber ich konnte nicht sehen jede Datei, die unter/sys/class/hwmon erstellt wurde. Aber es gibt eine Datei, die hier erstellt wurde/sys/bus/i2c/drivers/tmp102 – Patrick

+0

Vielleicht hast du nicht alles aktiviert, was du brauchst. Vergessen Sie nicht über udev, das einen Mechanismus zum Laden des Treibers basierend auf Ereignissen bietet, obwohl ich denke, dass es nicht immer der Fall ist (einige alte, dh Nicht-ACPI, Nicht-DT Plattformen können es entweder aus dem eingebauten Code laden, oder manuell). – 0andriy

0

Benutzer-Level-Anwendung kann nicht mit Hardware interagieren. Sie können über Systemaufruf (ioctl, öffnen, lesen und schreiben usw.) und Sysfs (sysfs ist ein virtuelles Dateisystem) kommunizieren.

1: - Ihr Gerät ist hwmom Gerät. Ihr Treiber ist "tmp102". Driver Expose diese drei temp1_input, temp1_max_hyst und temp1_max sysfs Eintrag für Benutzer-Anwendung.

SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, tmp102_show_temp, NULL , 0); 
SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO, tmp102_show_temp, tmp102_set_temp, 1); 
SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, tmp102_show_temp, 
      tmp102_set_temp, 2); 

Sie können lesen/sys/class/hwmom/TMP102/temp1_input sysfs-Datei. Sie können diese beiden sysfs-Datei/sys/class/hwmom/tmp102/temp1_max_hyst und sys/class/hwmom/tmp102/temp1_max lesen und schreiben.

2: - Die Dateien in/dev sind tatsächliche Gerätedateien, die UDEV zur Laufzeit erstellt.Eine Gerätedatei ist eine Schnittstelle für einen Gerätetreiber, der in einem Dateisystem wie eine normale Datei angezeigt wird. Ihr Treiber hat eine andere Gerätedatei verfügbar gemacht. thermal_zone_of_sensor_register (hwmon_dev, 0, hwmon_dev, & tmp102_of_thermal_ops). Sie haben den Knoten/dev/hwmom_dev.

Die Anwendung auf Benutzerebene kann nicht direkt mit dem i2c-Gerät oder der Hardware kommunizieren. Der Linux-Kernel hat Einschränkungen. Anwendung benötigt Treiber als Schnittstelle, um irgendeines der Geräte zu steuern.