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!