connecting android - externe hardware mit dem grünen ... · der android kernel basiert auf einem...

59
Connecting Android Externe Hardware mit dem grünen Roboter verbinden Alexander Dahmen Dominik Helleberg

Upload: others

Post on 18-Oct-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Connecting Android

Externe Hardware mit dem grünen Roboter verbinden

Alexander DahmenDominik Helleberg

Page 2: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Speaker

Dominik Helleberg

Mobile Development

Android / Embedded

Tools

http://dominik-helleberg.de/+

Page 3: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Speaker

Alexander Dahmen

Application Development

Embedded Android

http://google.com/+AlexanderDahmen3

Page 4: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

https://twitter.com/Arubin/status/27808662429

Android EmbeddedAndroid ist modern und “anders”

Page 5: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 6: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedSmart Hubs im IoT

Page 7: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Smart Home

http://www.gira.de/gebaeudetechnik/systeme/knx-eib_system/knx-produkte/bediengeraete/control9-knx.html

Page 8: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedVorteile

● Modernes OS (Architektur)

● UI-Stack

● Community

● SDK

● Hardware Support

● Lizensierung

Page 9: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedVorteile

Hardware Acceleration “builtin”

Canvas API

ViewsApplication

OpenGL ES

libHWUI SKIA

SurfaceFlinger

Page 10: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedVorteile

Hardware Acceleration “builtin”

Page 11: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 12: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

Page 13: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 14: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

SystemService

Application

Manager Interface

Manager Service

libhardware

driver.so

/dev/foo

Page 15: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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.

Page 16: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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, },

};

Page 17: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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,

};

Page 18: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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);

Page 19: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 20: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 21: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

driver.so

/dev/foo

Page 22: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

driver.so

/dev/foo

● Integration der Client-Treiber in den Kernel○ Anpassung/Erstellung der Kconfig-Dateien und Makefiles

○ make menuconfig (Konfigurationsdateien)

Page 23: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

SystemService

Application

Manager Interface

Manager Service

libhardware

driver.so

/dev/foo

Page 24: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 25: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 26: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

● Zur Verfügung gestellte Funktionen der HAL-Bibliothek○ displayInit()

○ setText(...)

○ setRGB(...)

○ backlightOn()/backlightOff()

○ ...

libhardware

Page 27: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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;

}

Page 28: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 29: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

SystemService

Application

Manager Interface

Manager Service

libhardware

driver.so

/dev/foo

Page 30: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 31: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

Manager Service

Page 32: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 33: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 34: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

SystemService

Application

Manager Interface

Manager Service

libhardware

driver.so

/dev/foo

Page 35: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 36: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

SystemService

Application

Manager Interface

Manager Service

libhardware

driver.so

/dev/foo

Page 37: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

● AIDL-Funktionsprinzip

SystemService

Page 38: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 39: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 40: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

SystemService

Application

Manager Interface

Manager Service

libhardware

driver.so

/dev/foo

Page 41: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

Application

Page 42: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

● Problem:

Application

Page 43: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

● Android Build System!

Page 44: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 45: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

● Firmware Updates:

● komplett

● incrementel / delta (inc. Kernel, Bootloader)

● Digitale Signaturen

Ein BSP für alles: Releasetools

Android EmbeddedVorteile

Page 46: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

● Board Configuration

○ Hardware Konfiguration

■ Partitionierung

■ Boot-Adressen

○ Architektur

○ Firmware (Bootloader, Kernel…)

Buildsystem inkl. Produktlinien- und

Variantenmanagement

Android EmbeddedVorteile

Page 47: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Buildsystem inkl. Produktlinien- und

Variantenmanagement

LCDBoardConfig.mk

fsl-imx6BoardConfigComm.mk

fsl-omx.mk fsl-codec.mkfsl-gpu.mk

Android EmbeddedVorteile

Page 48: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

● Product Configuration

○ Gerätenamen, Hersteller etc.

○ System Apps

○ System Module

■ Shared Libraries

■ Vorinstallierte Daten

○ Lokalisierung

○ SDK-Addons

Buildsystem inkl. Produktlinien- und

Variantenmanagement

Android EmbeddedVorteile

Page 49: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

● SDK-Addon:

Application

Page 50: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

● SDK-Addon:

Application

Page 51: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

● SDK-Addon:

Application

Page 52: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

● SDK-Addon:

Application

Page 53: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

● SDK-Addon:

Application

Page 54: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

● Emulator:

Application

Page 55: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android EmbeddedBeispiel: Display

● Emulator:

Application

Page 56: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Android Open Source ProjektArchitektur

Stock Apps

Framework / API

User Apps

JavaSystem Services

Dalvik / Runtime / Zygote

Kernel

Libs HAL Init

Page 57: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

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

Page 58: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

https://entwickler.de/IoT-Mag

Embedded Android + IoT

+

Page 59: Connecting Android - Externe Hardware mit dem grünen ... · Der Android Kernel basiert auf einem Linux Kernel mit einigen Android spezifischen Anpassungen Der Linux Kernel stellt

Danke!

Danke!