desarrollo de sistemas embebidos en android · android • sistema operativo multi-usuario basado...

53
Desarrollo de Sistemas Embebidos en Android

Upload: trantuyen

Post on 07-Jul-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Desarrollo de Sistemas Embebidos en Android

Mobile LinuxANDROID

Ezequiel AcetoSenior Mobile Application Developer

Temas

• Introducción a Android

• ADB

• Drivers desde Java

• Drivers desde el Kernel

ANDROID

ANDROID

• Sistema Operativo multi-usuario basado en Linux

• Desarrollado por Android Inc. y adquirido por Google en 2005

• Dispositivos móviles

• Aplicaciones nativas en Java (Dalvik VM)

• Aplicaciones viven en un “Sandbox”

• Android 1.5 (Cupcake)

ANDROID

Versiones

ANDROID

• Cupcake (1.5) [Abril 2009]

• Donut (1.6) [Septiembre 2009]

• Eclair (2.0) [Octubre 2009]

• Eclair (2.1)

• Froyo (2.2) [Mayo 2010]

• Gingerbread (2.3) [Diciembre 2010]

• Honeycomb (3.0) [Febrero 2011]

• Ice Cream Sandwich (4.0) [Octubre 2011]

Versiones

ANDROID

• Astro (Android OS 1.0) [Sept 2008]

• Bender (Android OS 1.1) [Feb 2009]

• Jelly Bean (Android OS 4.1) [Jun 2012]

• Jelly Bean (Android OS 4.2) [Nov 2013]

• Jelly Bean (Android OS 4.3) [Jul 2013]

Versiones

ANDROID

• Location API (API Level 1+)

• Bluetooth API (API Level 5+)

• USB Device (API Level 12+)

• USB Host (API Level 12+ / HW Ready)

ANDROID

Android• No es solo un OS. Android es un gran

framework para desarrollo de aplicaciones.

• Sistema Operativo

• Emuladores

• Herramientas de Desarrollo

• Amplio conjunto de APIs

• Creciente comunidad de desarrolladores

• Muchos usuarios “evangelizados”

ANDROID

Linux Kernel

• Kernel 2.6 (pre OS 4.0) - Kernel 3.0 (OS 4.0)

• binder: Comunicación entre procesos (IPC)

• ashmem: Android Shared Memory (Virtual)

• pmem: Memoria de Procesos (Fisica)

• Permite alocar grandes cantidades de memoria de forma continua

• logger (logcat)

ashmem: Una nueva implementación de un allocator de memoria compartida, similar a POSIX pero con un comportamiento diferente y sobre todo con una API mucho más simple, basada en archivos

pmem: driver para alocar grandes cantidades de memoria FISICA continuas (de 1 a 16MB)

ANDROID

Linux Kernel• Power Management

• Wakelocks

• Alarmas programadas

• Low Memory Handler

• Paranoid Network

• Sockets IPv4/IPv6/Bluetooth, RFCOMM,...

• Aprox. 200 parches respecto al Kernel 2.6.38

ANDROID

Java VMJava Bytecode

Dalvik VMDalvik Bytecode

Dalvik VM

ANDROID

Dalvik VM

• Diseñada para funcionar con menos de 100MB de RAM

• Procesadores lentos (500Mhz y FSB 100MHz)

• Espacio para aplicaciones entre 16MB y 48MB (depende de la plataforma)

• Cada aplicación inicia su propia instancia de Dalvik VM

ANDROID

NDK

• Conjunto de herramientas para incorporar código nativo (C & C++)

• Soporte para Arquitecturas

• MIPS

• x86

• ARM (v7A & v5TE)

MIPS & x86 -> OS 2.3ARM -> OS 1.5

NDK libslibclibmlibz

openGLJNI

v7a Thumb2Hardware FPUNEON instructions

ANDROID

Componentes Principales

• Activity

• Service

• Broadcast Receiver

• Content Provider

ANDROID

Activity

• Representa una pantalla (Vista) desde la cual el usuario interactua con la aplicación

• Al menos una actividad es considerada “principal”

• No hay un único punto de ingreso (“main”)

ANDROID

ANDROID

Service

• Componente que se ejecuta en background

• No bloquea la UI

• Se utiliza para procesos que consumen mucho tiempo y/o no requieren interfaz de usuario

ANDROID

Broadcast Receiver

• Componente que responde a mensajes del sistema

• Iniciados por el OS o por aplicaciones

• No tienen una UI asociada, pero pueden crear notificaciones

ANDROID

Content Provider

• Encapsula contenidos (datos) y provee mecanismos para poder acceder a ellos.

• Es el mecanismo por defecto para el intercambio de de datos entre aplicaciones

• Por ejemplo: La libreta de contactos

ANDROID

ADB

ANDROID

ADBAndroid Debug Bridge

daemonserverclient

ANDROID

ADB

• Instalar aplicaciones

• Ver el log del sistema operativo (logcat)

• Copiar archivos desde y hacia el dispositivo

• Ejecutar test de stress (Monkey)

$ adb usb$ adb tcp 6543$ adb logcat

ANDROID

ADBConexión remota

$ adb devicesList of devices attached 0A3BF9160300600B device$ adb usb$ adb tcpip 5555$ adb connect 192.168.1.102:5555

ANDROID

ADBADBen BeagleBoard xM

daemonserverclient

usb

ethernet

ANDROID

USB Debugging

• Por default esta deshabilitado en el todas las distribuciones de Android

• Junto con “Origenes Desconocidos” son las dos opciones del OS que permiten instalar apps por fuera del Google Play

ANDROID

USB Debugging

• Menú de Apps -> Settings -> Developer Options -> USB Debugging

En el Host• Permitir que el servicio UDEV reconozca al

dispositivo$ vim /etc/udev/rules.d/51-android.rules

SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666"SUBSYSTEM=="usb", SYSFS{idVendor}=="0451", MODE="0666"

ANDROID

ANDROID

En el Host

• Cambiar permisos al archivo 51-android.rules

$ chmod a+r /etc/udev/rules.d/51-android.rules

• Finalizamos las sesiónes de ADB

$ sudo killall adb

ANDROID

En el Host

• Reiniciamos UDEV

$ sudo service udev restart

ANDROID

En el Host

• Reiniciamos ADB y buscamos dispositivos

$ cd ~/adt-bundle-linux-x86_64/sdk/platform-tools$ sudo ./adb/ start-server$ sudo ./adb/ devices

ANDROID

En el Host

• Resultado de listar dispositivos

$ ./adb devicesList of devices attached20100720 device

ANDROID

Drivers desde Java

ANDROID

USB Host

• API Level 12 + HW Ready

• HID y MS por defecto

• Otros dispositivos requieren driver propio

ANDROID

USB desde Java

FTDI FT232RL

USBRS232

ANDROID

Application

FT232Driver

RS232Conf VCPDriver AsyncRX

Android Application Framework

USBManager

ANDROID

public FT232Driver(UsbManager usbManager, UsbDevice device) { super(usbManager,device);

UsbInterface mUsbIntf = device.getInterface(0); super.setUsbInterface(mUsbIntf);

for (int i = 0; i < mUsbIntf.getEndpointCount(); i++) { if (mUsbIntf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN) { super.setUsbVCPRXendpoint(mUsbIntf.getEndpoint(i)); } else if (mUsbIntf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_OUT) { super.setUsbVCPTXendpoint(mUsbIntf.getEndpoint(i)); } }}

ANDROID

Log.i(LOG_TAG,"Enviar comando - Purgar TX");byte[] buffer = new byte[]{};int transferred = getConnection().controlTransfer(0x40, 0, 0x01, 0, buffer, buffer.length,0);

Log.i(LOG_TAG,"Bytes enviados: " + transferred);byte[] bb = new byte[512];int count = getConnection().bulkTransfer(usbVCPRXendpoint(), bb,bb.length, 0);

Log.i(LOG_TAG,"Bytes recibidos: " + count);for (int i = 0; i < count; i ++) { Log.i(LOG_TAG,"Byte "+ i + ": " + bb[i]);}

ANDROID

/*********************** PUBLIC API ***********************/public abstract boolean connect(RS232Configuration configuration, AsyncReceiver asyncReceiver) throws VCPDriverException;

public abstract boolean disconnect();

public abstract byte[] transfer(byte[] data, int dataLength, int timeout) throws VCPDriverException, VCPTransferException;

public abstract void send(byte[] data, int dataLength, int timeout) throws VCPDriverException, VCPTransferException;

ANDROID

Drivers desde el Kernel

ANDROID

Drivers desde el Kernel$ cd ~/rowboat-android/kernel

make ARCH=arm CROSS_COMPILE=arm-eabi- distclean

make ARCH=arm CROSS_COMPILE=arm-eabi- omap3_beagle_android_defconfig

make ARCH=arm CROSS_COMPILE=arm-eabi- menuconfig

ANDROID

Drivers desde el Kernel

ANDROID

Drivers desde el Kernel

ANDROID

Drivers desde el Kernel

ANDROID

Drivers desde el Kernel

ANDROID

Drivers desde el Kernel

make ARCH=arm CROSS_COMPILE=arm-eabi- -j4

ANDROID

Drivers desde el Kernel

ANDROID

Drivers desde el Kernel

ANDROID

Drivers desde el Kernel1. Conectamos el RX del FTDI con el TX

2. Nos conectamos a la placa por ADB

./adb shell

3. Configuramos ttyUSB0 usando ‘stty’

/data/busybox/busybox stty -F /dev/ttyUSB0 115200

4. Ejecutamos microcom y probamos el adaptador

/data/busybox/busybox microcom -s 115200 /dev/ttyUSB0

ANDROID

Drivers desde el Kernel

FILE* usbdev = fopen(“/dev/ttyUSB0”,“rw+”);fwrite(...,sizeof(...),usbdev);fread(...,sizeof(...),usbdev);fclose(usbdev);

ANDROID

Drivers desde el Kernel

/*********************** PUBLIC API ***********************/private native boolean connect(String device);

private native boolean disconnect();

private native int send(byte[] data, int dataLength);

private native int hasData();

private native byte[] receive(byte[] data);

ANDROID

Drivers desde el Kernel

/************************* C Lib *************************/JNIEXPORTjbooleanJava_ar_uba_fi_android_usb_connect( JEnv* env, jobject thiz, jstring device) { ...}

ANDROID

GRACIAS!

http://goo.gl/f78aeI