Sunteți pe pagina 1din 53

Desarrollo de Sistemas Embebidos

en Android
Mobile Linux
ANDROID

Ezequiel Aceto
Senior Mobile Application Developer
Temas

Introduccin 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 mviles
Aplicaciones nativas en Java (Dalvik VM)
Aplicaciones viven en un Sandbox
Android 1.5 (Cupcake)
ANDROID
Versiones
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]
ANDROID
Versiones
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]

ANDROID
Versiones

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: Comunicacin entre procesos (IPC)
ashmem: Android Shared Memory (Virtual)
pmem: Memoria de Procesos (Fisica)
ashmem: Una nueva implementacin de un
allocator de memoria compartida, similar a
POSIX pero con un comportamiento

Permite alocar grandes cantidades de


diferente y sobre todo con una API mucho
ms simple, basada en archivos

pmem: driver para alocar grandes

memoria de forma continua cantidades de memoria FISICA continuas (de


1 a 16MB)

logger (logcat)
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
Dalvik VM

Java VM Dalvik VM
Java Bytecode Dalvik Bytecode

ANDROID
Dalvik VM
Diseada 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 aplicacin inicia su propia instancia de
Dalvik VM

ANDROID
NDK
Conjunto de herramientas para incorporar
cdigo nativo (C & C++)
Soporte para Arquitecturas
MIPS & x86 -> OS 2.3
ARM -> OS 1.5

NDK libs

MIPS
libc
libm
libz

x86
openGL
JNI

v7a
Thumb2

ARM (v7A & v5TE)


Hardware FPU
NEON instructions

ANDROID
Componentes
Principales
Activity
Service
Broadcast Receiver
Content Provider

ANDROID
Activity

Representa una pantalla (Vista) desde la cual


el usuario interactua con la aplicacin
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
ADB
Android Debug Bridge

client server daemon

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
ADB
Conexin remota

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

ANDROID
ADB
en BeagleBoard xM
ethernet

usb

client server daemon

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

ANDROID
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
En el Host
Cambiar permisos al archivo 51-
android.rules
$ chmod a+r /etc/udev/
rules.d/51-android.rules

Finalizamos las sesines 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 devices
List of devices attached
20100720 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
RS232 USB

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 Kernel
1. 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 *************************/
JNIEXPORT
jboolean
Java_ar_uba_fi_android_usb_connect(
JEnv* env,
jobject thiz,
jstring device) {
...
}

ANDROID
GRACIAS!

http://goo.gl/f78aeI

ANDROID

S-ar putea să vă placă și