Odys Loox - Geräte mit inotifyd automatisch verwalten, einhängen

F

fluxflux

Stammgast
273
Das Programm inotifyd hat ropa erwähnt, ist also seine Idee!

Es ist Teil von busybox und kann Dateien oder Verzeichnisse überwachen.

Ich habe für mich mal etwas getestet, es scheint einen Weg zu geben, z. B. einen USB-GPS-Empfänger automatisch einzubinden, speziell die Baudrate zu switchen, sobald der Empfänger eingesteckt wird.

  • Das benötigte Kernelmodul liegt in der boot.img, ist also im laufenden Kernel vorhanden.
  • inotifyd wird in der boot.img über die init.rc/init.sh gestartet und läuft mit dem Befehl über die /data/local/init.sh "busybox inotifyd /data/local/devwatch /dev:n"
  • In /data/local/ liegt ein Skript devwatch, das folgende Zeilen enthält:
Code:
#!/system/bin/sh
if dmesg | tail -2 | grep pl2303 | grep ttyUSB0 | grep attached; then
# stty 3mal aufrufen, da es oft beim ersten Mal nicht klappt
stty -F /dev/ttyUSB0 ispeed 4800
stty -F /dev/ttyUSB0 ispeed 4800
stty -F /dev/ttyUSB0 ispeed 4800
fi
  • Steckt man nun den USB-GPS-Empfänger an, dann wird die Baudrate automatisch auf 4800 eingestellt und man kann sofort das Programm UsbGPS starten, ohne in einer Konsole noch etwas eingeben zu müssen.
Man kann so z. B. auch ein CD/DVD-Laufwerk mounten, ohne die vold.fstab zu verändern oder einen DVB-T-Empfänger starten.

Vorschläge willkommen!

Die Skripter dürfen das gerne in eine "schöne" Form bringen ... :)

Thomas.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: wishmasterf, RainerWP und Oma7144
Hi,

ich habe ein Script geschrieben, das /dev/bus/usb/002 mit Hilfe von inotifyd ueberwacht und beim Einstecken eines USB-Geraetes in den USB-Hostport prueft um welches Geraet es sich handelt. Wenn es ein Bluetooth USB tranceiver ist, in meinem Fall "ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)", wird darueber nach einem Geraete gesucht, das Bluetooth SP unterstuetzt. Das wird dann mit /dev/rfcomm0 gebunden, ueber das dann die z.B.: NMEA-Daten abgefragt werden koennen. Das ist zumindest das was ich moechte ;-)

Der Aufruf des Scripts geht so:

inotifyd /data/dev_watcher.sh /dev/bus/usb/002:nd &

Folgendes gibt es zu beachten:
1. Das Script geht nur wenn die Busybox und alle Symlinks unter /bin zu finden sind. Ist das nicht der Fall, muss man die 1. Zeile des Scripts anpassen.

2. Die Vendor und Product Ids sind anzupassen. Siehe entsprechende Variablen im Script.

3. Das Bluetooth-GPS muss VOR dem Einstecken der USB-Bluetooth-tranceivers eingeschaltet sein und sollte schon einen Positionfix haben, also seine Position kennen. Ich weis nicht ob alle GPSen schon vorher NMEA-Saetze schicken.

4. Leider geht das Entladen nicht so wie ich es mir vorstelle. Das Device /dev/rfcomm0 ist manchmal blockiert und kann daher nicht neu gebunden werden. Ich weis im Moment leider nicht wo die Ursache liegt. Wenn Jemand von Euch Lust dazu hat, kann er das gerne untersuchen. Wuerde mich ueber Hinweise freuen.

5. lsusb ist bei mir die "richtige vollstaendige" Version, also nicht das busybox applet. Diese Stelle im Script muss also wahrscheinlich angepasst werden.

6. Ohne Gewaehr !!!!

Hier das Script: ( gibt es im Anhang auch als dev_watcher.sh.txt zum downloaden )

Code:
#!/bin/sh

# This script is called from inotifyd when a device is
# added to or removed from /dev/bus/usb/002
# call with:
#     inotifyd /data/dev_watcher.sh /dev/bus/usb/002:nd &

DEBUG=1

if [ ${DEBUG} -eq 1 ]
then
    # enable shell debugging
    set -x
    
    # All output send to log file
    log=/data/dev_watcher.log
else
    # All output send to /dev/null
    log=/dev/null
fi

exec 2>&1 1>>${log}

EVENT=${1}
BUS=${2}
DEV=${3}

VENDOR="0x0a12"
PRODUCT="0x0001"

RFCOMM="/dev/rfcomm0"
DATA="/data/dev_watcher.dta"

# Should be stored in a file
BDADDR=""

case ${EVENT} in
"n")
    echo "We have a new device in here: dev=${DEV} ${SEC} event=${EVENT}!"

    # USB-Bluetooth-Tranceiver found ?
    idVendor=`/sbin/lsusb  -D ${BUS}/${DEV} | grep idVendor  | awk '{print $2}'`
    idProduct=`/sbin/lsusb -D ${BUS}/${DEV} | grep idProduct | awk '{print $2}'`

    # Known Device and Vendor ?
    if [[ "${idVendor}" == "${VENDOR}" && "${idProduct}" == "${PRODUCT}" ]]
    then
        echo "Found Bluetooth Dongle"
        # Setup hci0
        hciconfig hci0 up
        # Wait some seconds
        sleep 5
        # Look for service SP and get bluetooth addr if device supports service
        BDADDR=`sdptool search SP | grep "Searching for SP on" | awk '{print $5}'`
        echo ${BDADDR} > ${DATA}
        if [ ! -z ${BDADDR} ]
        then
            rfcomm release ${RFCOMM} ${BDADDR} 1
            rfcomm bind ${RFCOMM} ${BDADDR} 1
            if [ ! -c ${RFCOMM} ]
            then
                echo Could not create ${RFCOMM}
            else
                echo ${RFCOMM} should be ready for use
            fi
        else
            echo service SP not found on /dev/bus/usb/${BUS}/${DEV}
        fi
    else
        echo Unknown device
    fi
    ;;    

"d")
    echo ${BUS}/${DEV} removed so clean up

    # read bdaddr from file.
    BDADDR=`cat ${DATA}`

    rfcomm release ${RFCOMM} ${BDADDR} 1
    rm -f ${RFCOMM}
    echo ${RFCOMM} removed
    ;;
esac

exit 0
Viele Gruesse
ropa
 

Anhänge

  • dev_watcher.sh.txt
    1,7 KB · Aufrufe: 207
Zuletzt bearbeitet:
  • Danke
Reaktionen: PopEi und fluxflux
Ich hänge hier nochmal meine /data/local/init.sh und /data/local/devwatch an.

Die devwatch überwacht /dev bzgl. USB-GPS und switcht dann die Baudrate auf 4800 und /dev/input bzgl. Gamepad/Joystick, dessen Rechte dann für Gamepad IME korrekt gesetzt werden.

Thomas.
 

Anhänge

  • inotifyd.zip
    559 Bytes · Aufrufe: 84
  • Danke
Reaktionen: RainerWP und Oma7144
ropa schrieb:
3. Das Bluetooth-GPS muss VOR dem Einstecken der USB-Bluetooth-tranceivers eingeschaltet sein und sollte schon einen Positionfix haben, also seine Position kennen. Ich weis nicht ob alle GPSen schon vorher NMEA-Saetze schicken.

4. Leider geht das Entladen nicht so wie ich es mir vorstelle. Das Device /dev/rfcomm0 ist manchmal blockiert und kann daher nicht neu gebunden werden. Ich weis im Moment leider nicht wo die Ursache liegt. Wenn Jemand von Euch Lust dazu hat, kann er das gerne untersuchen. Wuerde mich ueber Hinweise freuen.

Ich habe jetzt in der boot.img die Bluetooth-Einträge etwas verändert, lasse die Bluetooth-Kernelmodule auch schon in der Ramdisk laden. Dadurch läuft der Bluetooth-Dongle korrekt, er wird beim Einstecken sofort aktiviert und das Scannen läuft jetzt richtig ab (so schnell wie am Linuxsystem und die Remotegeräte werden mit Namen angezeigt).

Das Verbinden, Trennen und Releasen des rfcomm0 klappt zuverlässig über inotifyd, ich verwende ein eigenes Skript mit fester <bdaddr> für den GPS-Empfänger. Der GPS-Empfänger muss nur eingeschaltet sein, ein Fix ist nicht notwendig.

Ich stoße den Stream im Skript mit cat an und lese für 30 Sekunden den Stream im Skript mit cat aus, in dieser Zeit starte ich UsbGPS, das den Stream anstandslos übernimmt (cat wird dann beendet)

Ich nehme das in den nächsten Tagen in eine neue boot.img auf, damit Interessierte dies auch nutzen können.

Thomas.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: PopEi, ropa, RainerWP und eine weitere Person
Hier meine derzeitige Lösung, gefällt mir, klappt ohne Fehler, werde ich für mich so beibehalten.

In der boot.img wird in der init.rc eine inotifyd.rc gestartet:

Code:
service inotifyd /inotifyd.rc
user root
oneshot

Die inotifyd.rc sieht so aus:

Code:
#!/busybox sh
if [ -x /system/etc/rc.d/rc.inotifyd ];
then
/busybox sh /system/etc/rc.d/rc.inotifyd
fi

/system/etc/rc.d/ ist bewährte Slackware-Tradition für Skripte, die beim Booten ausgeführt werden.

Dort liegt die rc.inotifyd:

Code:
#!/system/bin/sh
busybox inotifyd /system/etc/rc.d/rc.devwatch /dev:n /dev/input:n /dev/bus/usb/002:nd &

Es werden USB-GPS, Joystick und Bluetooth-Dongle/GPS überwacht und durch die rc.devwatch im gleichen Verzeichnis (/system/etc/rc.d/) gestartet:

Code:
#!/system/bin/sh
EVENT=${1}
case ${EVENT} in
"n")
# USB-GPS, fuer cp210x-basierte GPS pl2303 mit cp210x ersetzen
if dmesg | busybox tail -2 | busybox grep pl2303 | busybox grep ttyUSB0 | busybox grep attached ; then
sleep 5
echo Baudrate einstellen...
busybox stty -F /dev/ttyUSB0 ispeed 4800
busybox stty -F /dev/ttyUSB0 ispeed 4800
busybox stty -F /dev/ttyUSB0 ispeed 4800 
fi
# Joystick
if dmesg | busybox tail -5 | busybox grep Joystick ;
then
sleep 5
busybox chmod 666 /dev/input/js*
fi
# Bluetooth-GPS
if dmesg | busybox tail -5 | busybox grep idVendor | busybox grep 0a12 ; then
sdptool search AVRCT > /mnt/asec/ausg
cat /mnt/asec/ausg | busybox grep AVRCT -A 1 > /mnt/asec/ausg1
busybox tac /mnt/asec/ausg1 | busybox sed -n '/Service/{N;d};p' > /mnt/asec/ausg2
bdaddr=`cat /mnt/asec/ausg2 | busybox grep : | busybox cut -d" " -f5`
busybox mknod -m 666 /dev/rfcomm0 c 216 0
rfcomm release /dev/rfcomm0 ${bdaddr} 1
rfcomm bind /dev/rfcomm0 ${bdaddr} 1
cat /dev/rfcomm0 &
sleep 30
busybox killall cat
fi
;;
"d")
bdaddr=`cat /mnt/asec/ausg2 | busybox grep : | busybox cut -d" " -f5`
rfcomm release /dev/rfcomm0 ${bdaddr} 1
rm /mnt/asec/ausg*
;;
esac
exit 0

Danke an ropa für Einblicke ins Skriptschreiben!

Die Mac-Adresse des Bluetooth-GPS wird automatisch ausgelesen, /dev/rfcomm0 automatisch gebunden und getrennt. Man hat 30 Sekunden Zeit, den Dienst UsbGPS zu starten, der auf /dev/rfcomm0 zeigen muss. Die Zeit kann man beliebig verkürzen, verlängern.

Der Bluetooth-Dongle wird beim Anstecken automatisch erkannt und eingeschaltet, das habe ich durch ein paar Änderungen in der boot.img erreicht.

Die geänderten Dateien init.rc, init.rk29board.rc und uevent.rk29board.rc hänge ich an, dann kann jeder selber schauen, was anders ist.

Wie gesagt, mein Weg ...

Thomas.
 

Anhänge

  • bootdateien.zip
    5,9 KB · Aufrufe: 104
Zuletzt bearbeitet:
Das System kann ab morgen im Hack-Shop (danke an PopEi!!!) komplett geladen werden, dort gibt es eine readme.txt, die alle Infos enthält.

Alle notwendigen Änderungen oder Ergänzungen für neue USB-Geräte können durch den Nutzer problemlos in der /system/etc/rc.d/rc.devwatch eingetragen werden! Es ist somit frei konfigurierbar, läuft aber mit den eingetragenen Geräten schon beim ersten Start nach dem Flashen per default ohne Zutun des Nutzers.

Eventuelle Fehler berichtige ich gerne, danke ...

Thomas.
 
fluxflux schrieb:
Das System kann ab morgen im Hack-Shop (danke an PopEi!!!) komplett geladen werden, dort gibt es eine readme.txt, die alle Infos enthält.

Alle notwendigen Änderungen oder Ergänzungen für neue USB-Geräte können durch den Nutzer problemlos in der /system/etc/rc.d/rc.devwatch eingetragen werden! Es ist somit frei konfigurierbar, läuft aber mit den eingetragenen Geräten schon beim ersten Start nach dem Flashen per default ohne Zutun des Nutzers.

Eventuelle Fehler berichtige ich gerne, danke ...

Thomas.

gibts eine derartige lösung auch füs xpress? schön wäre es wenn es eine lösung gibt die mit dem ext4-image(für xpress) zusammenarbeiten würde.
 
Mit ext4-Image meinst du das Pistazien-System? :smile:

Thomas.
 
fluxflux schrieb:
Mit ext4-Image meinst du das Pistazien-System? :smile:

Thomas.

ja, ich finde es ist derzeit das beste image (wenn das problem mit autorotation nicht stört)
 
Ja, kann man machen, muss ich mir aber erst neu runterladen.

Oder du schiebst die beiden Dateien rc.inotifyd und rc.devwatch nach /system/etc/rc.d/ (Verzeichnis erst anlegen) und ich schicke dir nur die geänderte boot.img, dann müsstest du nur die boot.img neu flashen.

Über den Inhalt der rc.devwatch müssten wir noch reden, denn der Bluetooth-Part kann ja komplett entfallen, da Bluetooth im ext4 ja per default läuft.

Thomas.
 
  • Danke
Reaktionen: wishmasterf
fluxflux schrieb:
Ja, kann man machen, muss ich mir aber erst neu runterladen.

Oder du schiebst die beiden Dateien rc.inotifyd und rc.devwatch nach /system/etc/rc.d/ (Verzeichnis erst anlegen) und ich schicke dir nur die geänderte boot.img, dann müsstest du nur die boot.img neu flashen.

Über den Inhalt der rc.devwatch müssten wir noch reden, denn der Bluetooth-Part kann ja komplett entfallen, da Bluetooth im ext4 ja per default läuft.

Thomas.

bluetooth sollte per default laufen ja, läuft aber (noch) nicht beim xpress. Wenn due eine boot.img zur verfügung stellen kannst wäre dies echt genial!
 
Kannst du mir mal den Inhalt von /system/etc/bluez/ auf dem ext4-System mal zeigen?

Ich vermute nach wie vor, dass das Xpress den Kombichip WLAN/Bluetooth an Bord hat und deswegen ein externer Bluetooth-Dongle nicht korrekt läuft.

Thomas.
 
Und bitte noch prüfen, ob /system/bin/brcm_patchram_plus im ext4-System vorhanden ist ...

Thomas.
 
#ls /system/etc/bluez/
bcm432x
 
Ok, noch eine Ebene tiefer bitte, also den Inhalt von bcm432x ...

Thomas.
 
ls /system/etc/bluez/bcm432x
BCM4329B1_USI_WM-BN-BM-01.hcd
BCM4329B1_002.002.023.0389.0000_Cybertan-Foxconn_Cls2_extLNA_EDRmaxInputLev+PeakDEVM_NT.hcd
BCM4325D1_004.002.004.0034.MURATA.OPERA.TESTONLY_optweak_0dBm.hcd
BCM4329B1_TestOnly_0237_26MHz_SEMCO_B23.hcd
 
fluxflux schrieb:
Das System kann ab morgen im Hack-Shop (danke an PopEi!!!) komplett geladen werden, dort gibt es eine readme.txt, die alle Infos enthält.

Alle notwendigen Änderungen oder Ergänzungen für neue USB-Geräte können durch den Nutzer problemlos in der /system/etc/rc.d/rc.devwatch eingetragen werden! Es ist somit frei konfigurierbar, läuft aber mit den eingetragenen Geräten schon beim ersten Start nach dem Flashen per default ohne Zutun des Nutzers.

Eventuelle Fehler berichtige ich gerne, danke ...

Thomas.

Hallo Thomas,

hab mir die aktuellen mod_.img runtergeladen und installiert. Leider wird mein Bluetooth-Stick zwar erkannt, aber Bluetooth GPS wird nicht erkannt. Die Scripte haben bisher funktioniert.
Als letzte Meldung bei DMESG kommt:

usb 2-1.1: input irq status -115 received

Wo liegt der Fehler?

Klaus
 
Welche Skripte haben bisher funktioniert? Inhalt?

Und wie gehst du genau vor? UsbGPS startest du innerhalb der Zeit, in der der BT-Dongle den Datenstream aufnimmt (sieht man am Flackern der LED)?

Thomas.
 
Das script btgps hat bisher hervorragend funktioniert.
Wenn ich diese gestartet habe, hat nach ein paar Sekunden der BT-Dongle angefangen zu blinken. Danach hab ich UsbGPS gestartet...
Nach dem aufspielen sollte ja nun der BT-Dongle automatisch erkannt und der Bluetooth-GPs eingebunden werden. Allerdings blinkt der BT-Dongle nicht. Nur die LED leuchtet blau.

Klaus
 
Es läuft so ab:

BT-Dongle nach dem Booten anstecken, er leuchtet konstant blau, da er sofort nach dem BT-GPS scannt. Hat er das gefunden, dauert es ein paar Sekunden bis der Datenstrom anfängt zu laufen, die LED flackert jetzt.

Was läuft da bei dir anders? Wenn die LED dauernd leuchtet würde das auf ein fehlerhaftes Scannen mit sdptool hindeuten ...

Abziehen und Anstecken des BT-Dongles hilft auch nicht?

Thomas.

Gesendet vom Odys Loox mit der Android-Hilfe.de-App
 

Ähnliche Themen

J
  • Jotto94
Antworten
0
Aufrufe
1.346
Jotto94
J
B
  • berry055
Antworten
0
Aufrufe
1.183
berry055
B
B
  • Bochumer86
Antworten
9
Aufrufe
3.312
Mami1973
M
Zurück
Oben Unten