connecting android - externe hardware mit dem grünen ... · der android kernel basiert auf einem...
TRANSCRIPT
Connecting Android
Externe Hardware mit dem grünen Roboter verbinden
Alexander DahmenDominik Helleberg
Speaker
Dominik Helleberg
Mobile Development
Android / Embedded
Tools
http://dominik-helleberg.de/+
Speaker
Alexander Dahmen
Application Development
Embedded Android
http://google.com/+AlexanderDahmen3
https://twitter.com/Arubin/status/27808662429
Android EmbeddedAndroid ist modern und “anders”
Android EmbeddedBeispiele
Amazon http://www.amazon.de/Kindle-Fire-Zoll-HDX-Display-WLAN/dp/B00D695H6OSamsung http://www.samsung.com/de/promotions/galaxycamera/Google Glass http://www.google.com/glass/start/Samsung Gear Live https://play.google.com/store/devices/details?id=samsung_gear_live_blackAndroid Auto http://www.android.com/auto/Boing 787 http://www.boeing.com/boeing/commercial/787family/LG Kühlschrank http://www.lg.com/us/refrigerators/lg-LFX31995ST-french-3-door-refrigeratorMotorola MC3200 http://goo.gl/5dOVL7
Android EmbeddedSmart Hubs im IoT
Android EmbeddedBeispiel: Smart Home
http://www.gira.de/gebaeudetechnik/systeme/knx-eib_system/knx-produkte/bediengeraete/control9-knx.html
Android EmbeddedVorteile
● Modernes OS (Architektur)
● UI-Stack
● Community
● SDK
● Hardware Support
● Lizensierung
Android EmbeddedVorteile
Hardware Acceleration “builtin”
Canvas API
ViewsApplication
OpenGL ES
libHWUI SKIA
SurfaceFlinger
Android EmbeddedVorteile - HAL / Service Architektur
SystemService
Application 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
libhardware
Logik, Security Checks, Native JNI Aufrufe
Native “interface” (header file)
driver.so
/dev/foo
device depenedent driver
kernel / module
Android EmbeddedBeispiel: Display
Android EmbeddedBeispiel: Display
driver.so
/dev/foo
● 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
Android EmbeddedBeispiel: Display
SystemService
Application
Manager Interface
Manager Service
libhardware
driver.so
/dev/foo
Android EmbeddedBeispiel: Display
driver.so
/dev/foo
● 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 I2C-
Client Treiber benötigt.
Android EmbeddedBeispiel: Display
driver.so
/dev/foo
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, },
};
Android EmbeddedBeispiel: Display
driver.so
/dev/foo
static const struct file_operations lcd1313M1_fops = {
.owner = THIS_MODULE,
.open = lcd1313M1_open,
.release = lcd1313M1_release,
.write = lcd1313M1_write,
};
Android EmbeddedBeispiel: Display
driver.so
/dev/foo
● Der Client-Treiber kann über die I2C-Funktionen des Core-
Treibers mit dem LCD kommunizieren.○ i2c_smbus_write_byte_data (client, u8 command, u8 value);
○ i2c_smbus_read_byte_data (client, u8 command);
Android EmbeddedBeispiel: Display
driver.so
/dev/foo
● 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
Android EmbeddedBeispiel: Display
driver.so
/dev/foo
● Erweiterung der board-mx6q_marsboard.c
static struct i2c_board_info mxc_i2c2_board_info[] __initdata = {
{
I2C_BOARD_INFO("lcd1313M1", 0x3e),
},
{
I2C_BOARD_INFO("rgb1313M1", 0x62),
},
};
LCD
RGB
Android EmbeddedBeispiel: Display
driver.so
/dev/foo
Android EmbeddedBeispiel: Display
driver.so
/dev/foo
● Integration der Client-Treiber in den Kernel○ Anpassung/Erstellung der Kconfig-Dateien und Makefiles
○ make menuconfig (Konfigurationsdateien)
Android EmbeddedBeispiel: Display
SystemService
Application
Manager Interface
Manager Service
libhardware
driver.so
/dev/foo
Android EmbeddedBeispiel: 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 EmbeddedBeispiel: 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 EmbeddedBeispiel: Display
● Zur Verfügung gestellte Funktionen der HAL-Bibliothek○ displayInit()
○ setText(...)
○ setRGB(...)
○ backlightOn()/backlightOff()
○ ...
libhardware
libhardware
Android EmbeddedBeispiel: 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;
}
Android EmbeddedBeispiel: 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 EmbeddedBeispiel: Display
SystemService
Application
Manager Interface
Manager Service
libhardware
driver.so
/dev/foo
Android EmbeddedBeispiel: 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 EmbeddedBeispiel: Display
Manager Service
Android EmbeddedBeispiel: 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 EmbeddedBeispiel: 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 EmbeddedBeispiel: Display
SystemService
Application
Manager Interface
Manager Service
libhardware
driver.so
/dev/foo
Android EmbeddedBeispiel: 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 Java-
Dienst generiert (ILCDService.java)
Manager Interface
Android EmbeddedBeispiel: Display
SystemService
Application
Manager Interface
Manager Service
libhardware
driver.so
/dev/foo
Android EmbeddedBeispiel: Display
● AIDL-Funktionsprinzip
SystemService
Android EmbeddedBeispiel: 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 EmbeddedBeispiel: 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 EmbeddedBeispiel: Display
SystemService
Application
Manager Interface
Manager Service
libhardware
driver.so
/dev/foo
Android EmbeddedBeispiel: Display
Application
Android EmbeddedBeispiel: Display
● Problem:
Application
Android EmbeddedBeispiel: Display
● Android Build System!
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 EmbeddedVorteile
● Firmware Updates:
● komplett
● incrementel / delta (inc. Kernel, Bootloader)
● Digitale Signaturen
Ein BSP für alles: Releasetools
Android EmbeddedVorteile
● Board Configuration
○ Hardware Konfiguration
■ Partitionierung
■ Boot-Adressen
○ Architektur
○ Firmware (Bootloader, Kernel…)
Buildsystem inkl. Produktlinien- und
Variantenmanagement
Android EmbeddedVorteile
Buildsystem inkl. Produktlinien- und
Variantenmanagement
LCDBoardConfig.mk
fsl-imx6BoardConfigComm.mk
fsl-omx.mk fsl-codec.mkfsl-gpu.mk
Android EmbeddedVorteile
● Product Configuration
○ Gerätenamen, Hersteller etc.
○ System Apps
○ System Module
■ Shared Libraries
■ Vorinstallierte Daten
○ Lokalisierung
○ SDK-Addons
Buildsystem inkl. Produktlinien- und
Variantenmanagement
Android EmbeddedVorteile
Android EmbeddedBeispiel: Display
● SDK-Addon:
Application
Android EmbeddedBeispiel: Display
● SDK-Addon:
Application
Android EmbeddedBeispiel: Display
● SDK-Addon:
Application
Android EmbeddedBeispiel: Display
● SDK-Addon:
Application
Android EmbeddedBeispiel: Display
● SDK-Addon:
Application
Android EmbeddedBeispiel: Display
● Emulator:
Application
Android EmbeddedBeispiel: Display
● Emulator:
Application
Android Open Source ProjektArchitektur
Stock Apps
Framework / API
User Apps
JavaSystem Services
Dalvik / Runtime / Zygote
Kernel
Libs HAL Init
Devel Board
http://www.oreilly.de/catalog/9781449308292/index.htmlhttp://www.pearsonhighered.com/educator/product/Modern-Operating-Systems/9780133591620.page
Getting Started
Embedded AndroidGetting Started
https://entwickler.de/IoT-Mag
Embedded Android + IoT
+
Danke!
Danke!