Connecting Android - Externe Hardware mit dem grünen Roboter

Werbung
Connecting Android
Externe Hardware mit dem grünen Roboter
verbinden
Alexander Dahmen
Dominik Helleberg
Speaker
Dominik Helleberg
Mobile Development
Android / Embedded
Tools
http://dominik-helleberg.de/+
Speaker
Alexander Dahmen
Application Development
Embedded Android
http://google.com/+AlexanderDahmen3
Android Embedded
Android ist modern und “anders”
https://twitter.com/Arubin/status/27808662429
Android Embedded
Beispiele
Amazon
Samsung
Google Glass
Samsung Gear Live
Android Auto
Boing 787
LG Kühlschrank
Motorola MC3200
http://www.amazon.de/Kindle-Fire-Zoll-HDX-Display-WLAN/dp/B00D695H6O
http://www.samsung.com/de/promotions/galaxycamera/
http://www.google.com/glass/start/
https://play.google.com/store/devices/details?id=samsung_gear_live_black
http://www.android.com/auto/
http://www.boeing.com/boeing/commercial/787family/
http://www.lg.com/us/refrigerators/lg-LFX31995ST-french-3-door-refrigerator
http://goo.gl/5dOVL7
Android Embedded
Smart Hubs im IoT
Android Embedded
Beispiel: Smart Home
http://www.gira.de/gebaeudetechnik/systeme/knx-eib_system/knxprodukte/bediengeraete/control9-knx.html
Android Embedded
Vorteile
● Modernes OS (Architektur)
● UI-Stack
● Community
● SDK
● Hardware Support
● Lizensierung
Android Embedded
Vorteile
Hardware Acceleration “builtin”
Application
Views
Canvas API
libHWUI
OpenGL ES
SurfaceFlinger
SKIA
Android Embedded
Vorteile
Hardware Acceleration “builtin”
Android Embedded
Vorteile - HAL / Service Architektur
Application
SystemService
Applikations-Logik
Java API / SDK / Dokumentation
Greift über RPC Call auf den Service zu
Manager
Interface
Binder Interface für den Service (AIDL)
Manager
Service
Logik, Security Checks, Native JNI Aufrufe
libhardware
Native “interface” (header file)
driver.so
device depenedent driver
/dev/foo
kernel / module
Android Embedded
Beispiel: Display
Android Embedded
Beispiel: Display
● Grove 16x2 Display mit I2C
○ LCD-Modul
○ RGB-Modul
● Der Befehlssatz des LCDs wird vom Hersteller bereitgestellt.
● MarS Board mit Android 4.0.4 (BSP)
● Das LCD wird per I2C an das Mars Board angeschlossen
○ LCD 0x3e
○ RGB 0x62
driver.so
/dev/foo
Android Embedded
Beispiel: Display
Application
SystemService
Manager
Interface
Manager
Service
libhardware
driver.so
/dev/foo
Android Embedded
Beispiel: Display
● Der Android Kernel basiert auf einem Linux Kernel mit
einigen Android spezifischen Anpassungen
● Der Linux Kernel stellt bereits einen I2C-Core-Treiber zur
Verfügung.
○ Dieser übernimmt die Kommunikation mit den am Bus
angeschlossenen Geräten.
● Für das LCD-Modul und das RGB-Modul wird jeweils ein I2CClient Treiber benötigt.
driver.so
/dev/foo
Android Embedded
Beispiel: Display
static int __init lcd1313M1_init(void) {
ret = i2c_add_driver(&lcd1313M1_i2c_driver);
}
static struct i2c_driver lcd1313M1_i2c_driver = {
.probe = lcd1313M1_i2c_probe,
.driver = {
.name = "lcd1313M1",
.owner = THIS_MODULE,
};
driver.so
/dev/foo
},
Android Embedded
Beispiel: Display
static const struct file_operations lcd1313M1_fops = {
.owner = THIS_MODULE,
.open = lcd1313M1_open,
.release = lcd1313M1_release,
.write = lcd1313M1_write,
};
driver.so
/dev/foo
Android Embedded
Beispiel: Display
● Der Client-Treiber kann über die I2C-Funktionen des CoreTreibers mit dem LCD kommunizieren.
○
i2c_smbus_write_byte_data (client, u8 command, u8 value);
○
i2c_smbus_read_byte_data (client, u8 command);
driver.so
/dev/foo
Android Embedded
Beispiel: Display
● Anforderung:
○ Die Treiber sollen beim Systemstart geladen und das Display
initialisiert werden.
● Wie findet die Verknüpfung zwischen LCD-/RGB-Modul und
dem jeweiligen Treiber statt?
● board-mx6q_marsboard.c
○ unter /arch/arm/mach-mx6
driver.so
/dev/foo
Android Embedded
Beispiel: Display
● Erweiterung der board-mx6q_marsboard.c
static struct i2c_board_info mxc_i2c2_board_info[] __initdata = {
{
I2C_BOARD_INFO("lcd1313M1", 0x3e),
LCD
I2C_BOARD_INFO("rgb1313M1", 0x62),
RGB
},
{
},
};
driver.so
/dev/foo
Android Embedded
Beispiel: Display
driver.so
/dev/foo
Android Embedded
Beispiel: Display
● Integration der Client-Treiber in den Kernel
○ Anpassung/Erstellung der Kconfig-Dateien und Makefiles
○ make menuconfig (Konfigurationsdateien)
driver.so
/dev/foo
Android Embedded
Beispiel: Display
Application
SystemService
Manager
Interface
Manager
Service
libhardware
driver.so
/dev/foo
Android Embedded
Beispiel: Display
● Zugriff auf die Treiber über eine HAL-Bibliothek (Userspace)
● HAL-Bibliothek greift über System-Call-Interface auf die
Gerätedateien zu (/dev/lcd1313M1 u. /dev/rgb1313M1)
● Kann auch unter eine proprietäre Lizenz gestellt werden
(Treiber muss unter die GPL gestellt werden, daher werden
diese oft einfach gehalten)
libhardware
Android Embedded
Beispiel: Display
● Die HAL-Bibliothek besteht aus zwei Komponenten
○ Implementierung unter:
■ /device/fsl/marsboard_6q/lcd1313M1
○ Headerdatei unter:
■ /hardware/libhardware/include/hardware
● Der Zugriff auf die HAL-Bibliothek findet über die
Headerdatei statt
libhardware
Android Embedded
Beispiel: Display
● Zur Verfügung gestellte Funktionen der HAL-Bibliothek
○ displayInit()
○ setText(...)
○ setRGB(...)
○ backlightOn()/backlightOff()
○ ...
libhardware
Android Embedded
Beispiel: Display
const struct hw_module_t HAL_MODULE_INFO_SYM = {
.tag = HARDWARE_MODULE_TAG,
.id = LCD1313M1_HARDWARE_MODULE_ID,
.methods = &lcd1313M1_module_methods,
};
static int open_lcd1313M1hw(...) {
struct lcd1313M1hw_device_t *dev =
malloc(sizeof(struct lcd1313M1hw_device_t));
file_descriptor_lcd = open("/dev/lcd1313M1", O_RDWR);
return 0;
}
libhardware
Android Embedded
Beispiel: Display
● Damit ein open(...) auf /dev/lcd1313M1 erfolgreich ist,
müssen die Rechte stimmen
● /system/core/rootdir/ueventd.rc erweitern:
○ /dev/lcd1313M1 0660 system system
○ /dev/rgb1313M1 0660 system system
● HAL-Bibliothek läuft im system-Kontext
libhardware
Android Embedded
Beispiel: Display
Application
SystemService
Manager
Interface
Manager
Service
libhardware
driver.so
/dev/foo
Android Embedded
Beispiel: Display
● Der Manager Service besteht aus zwei Teilen:
○ den nativen Methoden in
com_android_server_LCDService.cpp
○ LCDService.java
● com_android_server_LCDService.cpp bindet die
Headerdatei der HAL-Bibliothek ein und lädt die Bibliothek
● LCDService.java ruft die nativen Methoden über das JNI
auf
Manager
Service
Android Embedded
Beispiel: Display
Manager
Service
Android Embedded
Beispiel: Display
public class LCDService extends ILCDService.Stub {
private int mNativePointer;
public LCDService(Context context) {
super();
mNativePointer = init_native();
}
public int setText(String mString)
{
checkPermission(android.Manifest.permission.LCD_SERVICE);
synchronized (mLock) {
byte[] buffer = mString.getBytes();
return setText_native(mNativePointer, buffer); }
}
private static native int init_native();
SystemService
Android Embedded
Beispiel: Display
● Android Permission für das LCD
○ android.Manifest.permission.LCD_SERVICE
● Eine App, die den Service/Hardware verwenden möchte,
muss diese Permission in der Manifest-Datei angeben
○ <uses-permission>
Manager
Service
Android Embedded
Beispiel: Display
Application
SystemService
Manager
Interface
Manager
Service
libhardware
driver.so
/dev/foo
Android Embedded
Beispiel: Display
● Für den LCDService muss eine zugehörige ILCDService.
aidl Datei erstellt werden.
● Diese beinhaltet die Deklarierung der Funktionen, die vom
Binder aufrufbar sein sollen.
● Aus der .aidl Datei wird ein Binder-Interface für den JavaDienst generiert (ILCDService.java)
Manager
Interface
Android Embedded
Beispiel: Display
Application
SystemService
Manager
Interface
Manager
Service
libhardware
driver.so
/dev/foo
Android Embedded
Beispiel: Display
● AIDL-Funktionsprinzip
SystemService
Android Embedded
Beispiel: Display
public class LCDManager
{
public static LCDManager getLCDManager()
{
IBinder b = ServiceManager.getService("lcd1313M1");
ILCDService service = ILCDService.Stub.asInterface(b);
return new LCDManager(service);
}
public int setText(String mString) {
try {
return mService.setText(mString);
} catch (RemoteException e) {
return -1;
}
}
SystemService
Android Embedded
Beispiel: Display
● Anpassung des System Servers damit beim Systemstart
der neue LCDService gestartet wird
public void run() {
//...
try {
ServiceManager.addService("lcd1313M1", new LCDService(context));
} catch ( Throwable e ) {
reportWtf("starting LCD service",e) ;
}
}
SystemService
Android Embedded
Beispiel: Display
Application
SystemService
Manager
Interface
Manager
Service
libhardware
driver.so
/dev/foo
Android Embedded
Beispiel: Display
Application
Android Embedded
Beispiel: Display
● Problem:
Application
Android Embedded
Beispiel: Display
● Android Build System!
Android Embedded
Vorteile
Ein BSP für alles: Build Targets
● Firmware for production/debug
(extern: Kernel, Bootloader)
● Emulator
● Custom SDK / SDK Addons
● Embedded Android as a Platform
Android Embedded
Vorteile
Ein BSP für alles: Releasetools
● Firmware Updates:
● komplett
● incrementel / delta (inc. Kernel, Bootloader)
● Digitale Signaturen
Android Embedded
Vorteile
Buildsystem inkl. Produktlinien- und
Variantenmanagement
● Board Configuration
○ Hardware Konfiguration
■ Partitionierung
■ Boot-Adressen
○ Architektur
○ Firmware (Bootloader, Kernel…)
Android Embedded
Vorteile
Buildsystem inkl. Produktlinien- und
Variantenmanagement
LCDBoardConfig.mk
fsl-imx6BoardConfigComm.mk
fsl-omx.mk
fsl-gpu.mk
fsl-codec.mk
Android Embedded
Vorteile
Buildsystem inkl. Produktlinien- und
Variantenmanagement
● Product Configuration
○ Gerätenamen, Hersteller etc.
○ System Apps
○ System Module
■ Shared Libraries
■ Vorinstallierte Daten
○ Lokalisierung
○ SDK-Addons
Android Embedded
Beispiel: Display
● SDK-Addon:
Application
Android Embedded
Beispiel: Display
● SDK-Addon:
Application
Android Embedded
Beispiel: Display
● SDK-Addon:
Application
Android Embedded
Beispiel: Display
● SDK-Addon:
Application
Android Embedded
Beispiel: Display
● SDK-Addon:
Application
Android Embedded
Beispiel: Display
● Emulator:
Application
Android Embedded
Beispiel: Display
● Emulator:
Application
Android Open Source Projekt
Architektur
Stock Apps
User Apps
Framework / API
Java
System Services
Dalvik / Runtime / Zygote
Libs
HAL
Kernel
Init
Embedded Android
Devel Board
Getting
Started
http://www.oreilly.de/catalog/9781449308292/index.html
http://www.pearsonhighered.com/educator/product/Modern-Operating-Systems/9780133591620.page
Embedded Android + IoT
+
https://entwickler.de/IoT-Mag
Danke!
Danke!
Herunterladen