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 ist modern und anders https://twitter.com/arubin/status/27808662429
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
Smart Hubs im IoT
Beispiel: Smart Home http://www.gira.de/gebaeudetechnik/systeme/knx-eib_system/knxprodukte/bediengeraete/control9-knx.html
Vorteile Modernes OS (Architektur) UI-Stack Community SDK Hardware Support Lizensierung
Vorteile Hardware Acceleration builtin Application Views Canvas API libhwui SKIA OpenGL ES SurfaceFlinger
Vorteile Hardware Acceleration builtin
Vorteile - HAL / Service Architektur Application SystemService Manager Interface Manager Service libhardware driver.so /dev/foo Applikations-Logik Java API / SDK / Dokumentation Greift über RPC Call auf den Service zu Binder Interface für den Service (AIDL) Logik, Security Checks, Native JNI Aufrufe Native interface (header file) device depenedent driver kernel / module
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
Application SystemService Manager Interface Manager Service libhardware 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. 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, }, }; driver.so /dev/foo
static const struct file_operations lcd1313m1_fops = {.owner = THIS_MODULE,.open = lcd1313m1_open,.release = lcd1313m1_release,.write = lcd1313m1_write, }; 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); 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 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), driver.so /dev/foo LCD RGB
driver.so /dev/foo
Integration der Client-Treiber in den Kernel Anpassung/Erstellung der Kconfig-Dateien und Makefiles make menuconfig (Konfigurationsdateien) driver.so /dev/foo
Application SystemService Manager Interface Manager Service libhardware driver.so /dev/foo
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
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
Zur Verfügung gestellte Funktionen der HAL-Bibliothek displayinit() settext(...) setrgb(...) backlighton()/backlightoff()... libhardware
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
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
Application SystemService Manager Interface Manager Service libhardware driver.so /dev/foo
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
Manager Service
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 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
Application SystemService Manager Interface Manager Service libhardware driver.so /dev/foo
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
Application SystemService Manager Interface Manager Service libhardware driver.so /dev/foo
AIDL-Funktionsprinzip SystemService
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
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
Application SystemService Manager Interface Manager Service libhardware driver.so /dev/foo
Application
Problem: Application
Android Build System!
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
Vorteile Ein BSP für alles: Releasetools Firmware Updates: komplett incrementel / delta (inc. Kernel, Bootloader) Digitale Signaturen
Vorteile Buildsystem inkl. Produktlinien- und Variantenmanagement Board Configuration Hardware Konfiguration Partitionierung Boot-Adressen Architektur Firmware (Bootloader, Kernel )
Vorteile Buildsystem inkl. Produktlinien- und Variantenmanagement LCDBoardConfig.mk fsl-imx6boardconfigcomm.mk fsl-omx.mk fsl-gpu.mk fsl-codec.mk
Vorteile Buildsystem inkl. Produktlinien- und Variantenmanagement Product Configuration Gerätenamen, Hersteller etc. System Apps System Module Shared Libraries Vorinstallierte Daten Lokalisierung SDK-Addons
SDK-Addon: Application
SDK-Addon: Application
SDK-Addon: Application
SDK-Addon: Application
SDK-Addon: Application
Emulator: Application
Emulator: Application
Android Open Source Projekt Architektur Stock Apps User Apps Framework / API System Services Java Dalvik / Runtime / Zygote Libs HAL Init Kernel
http://www.oreilly.de/catalog/9781449308292/index.html http://www.pearsonhighered.com/educator/product/modern-operating-systems/9780133591620.page Embedded Android Devel Getting Board Started
Embedded Android + IoT + https://entwickler.de/iot-mag
Danke! Danke!