desarrollo de sistemas embebidos en android · android • sistema operativo multi-usuario basado...
TRANSCRIPT
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
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
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
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
• 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
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
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 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
USB Host
• API Level 12 + HW Ready
• HID y MS por defecto
• Otros dispositivos requieren driver propio
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$ 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 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) { ...}