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

Post on 18-Oct-2020

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

Hardware Acceleration “builtin”

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!

top related