Sensor STK2207-018

Links, Shops Formelsammlungen und so weiter

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Benutzeravatar
Nicki
Beiträge: 3127
Registriert: So 11. Aug 2013, 20:16
Wohnort: wo Mosel und Rhein sich treffen

Sensor STK2207-018

Beitrag von Nicki »

Hier mal der Beitrag von sebr, damit er nicht verloren geht:
Wie viel schon wissen gibt es bei Max die Kindle Akkus. Dort ist als "Beifang" auch ein Ambient Light Sensor dabei. Leider ist Dokumentation Mangelware, aber ich habe nach intensiver Recherche im Netz und Durchsicht des Quellcodes von dem Kindle Fire (Cyanogen Mod / Hashcode) einiges evtl. hilfreiches zusammengetragen. Im Forum gibt es schon ein Bild von dem Sensor: klick
Belegung (von oben nach unten): GND, SDA, SCL, +3.3V
Praktischerweise sind Abblockondensatoren (zusammen 1uF] gleich mit drauf.

Am BusPirate meldet sich das Teil wie folgt:

I2C>(1)
Searching I2C address space. Found devices at:
0x20(0x10 W) 0x21(0x10 R) 0x22(0x11 W) 0x23(0x11 R)


Also zwei Kommandoregister gilt es zu füllen. Da ist der oben erwähnte Quellcode recht hilfreich um die einzelnen Stellen bzw. deren Bedeutung zu kennen.

Kommandoregister 0x20
[G1] [G0] [1] [0] [IT1] [IT0] [WM] [SD]

- G1, G0: hiermit kann die Empfindlichkeit/Verstäkung (Gain) eingestellt werden. Zur Auswahl stehen x1 (0 : 0), x2, x4, x8 (1 : 1)
- IT1, IT0: Multiplikator für die integration time des ADC: x0.5 (0 : 0), x1, x2, x4 (1 : 1)
- WM: Word Mode, setzt man hier 1 finden sich das Ergebnis (Wort) in 0x21 (MSB) und 0x23 (LSB). Reichen 8 Bit, dann setzt man hier 0 und brauch den Wert nur in 0x21 abholen.
- SD: Shutdown, legt den Sensor schlafen. Die letzten gemessenen Werte können direkt aus 0x21 und 0x23 gelesen werden

Kommandoregister 0x22
[FD_IT2] [FD_IT1] [FD_IT0] [0] [0] [0] [0] [0]

- FD_IT2, FD_IT1, FD_IT0: Integration time, von 66ms (0 : 0 : 0) bis 800ms (1 : 1 : 1), sinnvoller Standard-Wert ist 100ms (1 : 0 : 1). Je höher desto besser die Auflösung.

Hier mal ein Test (Byte Mode)
I2C>[0x20 0xe8 [0x22 0xa0 [0x21 r]
I2C START BIT
WRITE: 0x20 ACK
WRITE: 0xE8 ACK
I2C START BIT
WRITE: 0x22 ACK
WRITE: 0xA0 ACK
I2C START BIT
WRITE: 0x21 ACK
READ: 0x0C
NACK
I2C STOP BIT
sebr
Beiträge: 156
Registriert: Mo 12. Aug 2013, 23:40
Wohnort: Hessen

Re: Sensor STK2207-018

Beitrag von sebr »

Vielen Dank fürs rüberkopieren von meinem Beitrag :)
Anbei nochmal ein Foto von dem Sensor.

@Omega: Könntest du noch ein paar Infos beisteuern wie du das Modul aus den Kindle-Sources kompilieren konntest, ggf. einige Anpassungen nötig waren? Mit meinen Infos von oben ist es ja zumindest für uC schon problemlos nutzbar.
Dateianhänge
STK2207-018
STK2207-018
P1000324.jpg (382.02 KiB) 2502 mal betrachtet
Benutzeravatar
omega
Beiträge: 520
Registriert: So 11. Aug 2013, 14:36
Kontaktdaten:

Re: Sensor STK2207-018

Beitrag von omega »

Ich werde das mal beschreiben. Aber bevor ich das aus dem Kopf versuche zu beschreiben, nehme ich mir mein Board und krame da nochmal in den Sourcen.
Benutzeravatar
omega
Beiträge: 520
Registriert: So 11. Aug 2013, 14:36
Kontaktdaten:

Re: Sensor STK2207-018

Beitrag von omega »

Linux Treiber für STK Sensoren vom Kindle Fire auf beliebige Platform portieren.

0. Hier wird vorausgesetzt, dass man alles Nötige installiert hat, um einen Kernel zu kompilieren. Außerdem gehe ich davon aus, dass man sich bereits einen passenden Kernel runtergeladen und entpackt hat. Ich gehe hier davon aus, dass direkt auf der Zielplattform gearbeitet wird, inklusive kompilieren.

1. Treiber herunterladen:
Man benötigt aus dem Kernel Source vom Kindle die Dateien:
- stk_defines.h
- stk_i2c_als22x7.h
- stk_i2c_als22x7_kcx.c
- stk_lk_defs.h
- Makefile
- Kconfig

Diese 4 Dateien findet man z.B. hier (https://github.com/DooMLoRD/Kindle-Fire ... c/SenseTek).
Wo ihr den Kernel im Dateisystem liegen habt spielt keine Rolle. Diese Dateien müssen in das Unterverzeichnis "drivers/i2c/SenseTek"

2. Konfiguration anpassen:
Noch weiß weder das Konfigurationstool, noch der Compiler, dass es den neuen Treiber gibt, dem Konfigtool teilt man dies über die Datei Kconfig mit und dem Compiler über das Makefile.
Es müssen also die Dateien "drivers/i2c/Makefile" und "drivers/i2c/Kconfig" angepasst werden.

Makefile:
In meinem Fall gibt es die Zeile:
"obj-y += busses/ chips/ algos/"
Diese muss um das SenseTek Verzeichnis ergänzt werden:
"obj-y += busses/ chips/ algos/ SenseTek/"

Kconfig:
An einer Stelle wird man folgendes finden:
source drivers/i2c/algos/Kconfig
source drivers/i2c/busses/Kconfig
source drivers/i2c/chips/Kconfig
Diese Zeilen weisen darauf hin, dass es in den Unterverzeichnissen weitere Informationen gibt.
Hier muss ebenfalls das SenseTek Verzeichnis hinzugefügt werden:
source drivers/i2c/algos/Kconfig
source drivers/i2c/busses/Kconfig
source drivers/i2c/chips/Kconfig
source drivers/i2c/SenseTek/Kconfig

3. Hier wird's kompliziert:
Jetzt sollte es möglich sein, mit "make menuconfig" den Treiber dem Kernel hinzuzufügen.
"make menuconfig" ausführen; Unter "Device Drivers" -> "I2C support" kann jetzt "SenseTek I2C Sensors" aktiviert werden.
Meine Konfiguration sieht so aus:

Code: Alles auswählen

		
  ¦ ¦                     [*]   SenseTek I2C Sensors                                                                 ¦ ¦
  ¦ ¦                     [*]     SenseTek Optical Sensors                                                           ¦ ¦
  ¦ ¦                               SenseTek Optical Sensor Type (Only SenseTek Ambient Light Sensor Generic Driver) ¦ ¦
  ¦ ¦                               Select Sensor Model (STK2207/2217)  --->                                         ¦ ¦
  ¦ ¦                     (20)      ALS Change Threshold (Lux)                                                       ¦ ¦
  ¦ ¦                     (10)      ALS Sampling rate for internal data polling (HZ)                                 ¦ ¦
  ¦ ¦                     (500)     Transmittance (1/10,000)                                                         ¦ ¦
  ¦ ¦                     (169)     CM3263 Transmittance (1/10,000)                                                  ¦ ¦
  ¦ ¦                     [*]       Enable STK Optical Sensor Engineering Mode                                       ¦ ¦
  ¦ ¦                     [*]         Enable STK ALS Transmittance Tuning                                            ¦ ¦
  ¦ ¦                     [*]     Enable Show Info                                                                   ¦ ¦
Konfigurationstool beenden und abspeichern.

Wenn man jetzt den Kernel kompilieren würde, wäre zwar der neue Treiber drinnen, aber der Kernel weiß nicht, dass die
verwendete Platform diesen Treiber benötigt und der wird nicht geladen.

Um zu erreichen, dass dieser geladen wird, muss schon dem I2C Treiber mitgeteilt werden, welche Geräte existieren und welcher Treiber dazu gehört.
Dies passiert in der Board Konfiguration und Initialisierung. Wo man diese findet hängt vom Board ab. In meinem Fall ist es die "arch/arm/mach-davinci/board-da830-evm.c" [TODO: für gängige Board ergänzen].

Es wird sich irgendwo ein Konstrukt mit I2C_BOARD_INFO( ... ) finden lassen. Dies muss mit den Informationen über den STK ergänzt werden:

Code: Alles auswählen

		
	static struct i2c_board_info __initdata da830_evm_i2c_devices[] = {
        {
                I2C_BOARD_INFO("stk_als22x7_addr1", 0x20>>1),
        },
        {
                I2C_BOARD_INFO("stk_als22x7_addr2", 0x22>>1),
        },

                I2C_BOARD_INFO("stk_als22x7_addr3", 0x70>>1),
        },
        {
                I2C_BOARD_INFO("bq27541_Battery", 0x55),
        },
	};

Das Beispiel enthält auch den Treiber für den Akku vom Kindle Fire.

4. Kompilieren:
Nachdem alle Änderungen durchgeführt wurden, kann der Kernel kompiliert und getestet werden.
Kompiliert wird mit "make all" anschließend wird ein "make uImage" nötig sein. Anschließend findet man unter "arch/arm/boot/uImage" den neuen Kernel.
Wo dieser nun hinkopiert werden muss hängt von der Platform ab. Bei mir reicht kopieren in "/boot". Ein Beaglebone lädt den Kernel meiner Information nach standardmäßig von einer extra FAT Partition.

Evtl. wird das kompilieren fehlschlagen, weil ein Pfad nicht gefunden wird. Bei mir gab es Probleme mit der Zeile "#include <linux/earlysuspend.h>" in "stk_i2c_als22x7_kcx.c", da die Datei nicht existiert. Ein einfaches entfernen des #includes hat bei mir schon geholfen.

5. Testen:
Nach einem Neustart sollte man unter "/sys/devices/platform/" "stk-oss" haben. Mit "echo 1 > /sys/devices/platform/stk-oss/als_enable" kann der Sensor aktiviert werden und mit "cat /sys/devices/platform/stk-oss/lux" ausgelesen werden.


Ich hoffe, ich habe nichts wichtiges vergessen. Einiges wird vielleicht etwas oberflächlich abgehandelt, wer was genauer wissen möchte, für den stehe ich für Fragen zur Verfügung. Ergänzungen für andere Boards sind willkommen.
Antworten