Cómo escribir un controlador de interfaz USB para Android
Cuando se trata de controladores de Android, los controladores de Linux son inseparables. El kernel de Android utiliza el kernel de Linux 2.6 (recientemente Linux 3.3 ha incluido algo de código de Android). Sin embargo, Android no copia completamente el kernel del sistema Linux. Además de algunas modificaciones a Linux, se ha agregado una gran cantidad de contenido. Los controladores de Android se dividen principalmente en dos tipos: controladores específicos de Android y controladores de dispositivos utilizados por Android (linux).
Controlador propietario de Android:
1) El intercambio anónimo de memoria de Android Ashmem proporciona un mecanismo para asignar memoria para programas de espacio de usuario y proporciona grandes bloques de memoria entre procesos, al tiempo que proporciona memoria compartida. el kernel con la capacidad de recuperar y gestionar esta memoria.
2) Controlador LOG (registro) ligero de Android Logger
3) Android Binder es un controlador basado en el marco OpenBinder
4) Administración de energía de Android; módulo de administración de energía
5) Administrador de memoria baja Low Memory Killer
6) Controlador de memoria física PMEM de Android
7) Controlador USB de dispositivo USB (basado); en el marco gaeget);
8) La consola Ram se utiliza para depurar el dispositivo que escribe información de registro
9) Dispositivo de control de tiempo
; 10 ) Reloj de hardware de alarma de Android
Controlador de dispositivo en Android:
1) Controlador de pantalla Framebuff
2) Controlador de dispositivo de entrada de eventos
3) controlador de audio ALSA;
4) controlador de audio OSS;
5) cámara v412: controlador de video
6) controlador MTD; /p>
7) Controlador Bluetooth
8) Controlador de dispositivo WLAN
Controlador propietario de Android
1.Android Ashmem
Proporciona un mecanismo de asignación de memoria para programas de espacio de usuario, proporciona grandes bloques de memoria compartida entre procesos y proporciona al kernel la capacidad de reciclar y administrar esta memoria.
Nodo del dispositivo: /dev/ashmen. Número de dispositivo principal 10.
Ubicación del código fuente: include/linux/ashmen.h Kernel /mm/ashmen.c
En comparación con los mecanismos tradicionales de asignación de memoria como malloc y mmap anónimo/con nombre, su ventaja es que el controlador del kernel proporciona un mecanismo de algoritmo de recuperación de memoria del kernel auxiliar (pin/unoin)
2. Android Logger p>
Ya sea el código fuente subyacente o la aplicación de la capa superior, podemos usar el dispositivo registrador para verlo y depurarlo.
Nodo del dispositivo: /dev/log/main /dev/log/event /dev/log/radio
Ubicación del código fuente: include/linux/logger.h include/linux/ logger .c
3.Android Binder
IPC Binder es un mecanismo de comunicación entre procesos. Su proceso puede proporcionar servicios a otros procesos ----- a través de la API de llamada al sistema estándar de Linux.
Nodo del dispositivo: /dev/binder
Ubicación del código fuente: Kernel/include/linux/binder.h Kernel/drivers/misc/binder.c
4 .Android Power Management
Un sistema liviano de administración de energía de Android basado en la administración de energía estándar de Linux, en drivers/android/power.c kernel/power/
5.Low Memory Killer
Especifica un conjunto de valores críticos de memoria en el espacio del usuario. Cuando uno de los valores está en el mismo rango que el valor oom_adj en la descripción del proceso, el proceso se finalizará (especificado en los parámetros). /adj oome_adj). Es similar al mecanismo OOM estándar de Linux, pero el método de implementación es diferente
Ubicación del código fuente: drivers/misc/lowmemorykiller.c
6. Android PMEM
PMEM Main Su función es proporcionar un área de memoria física continua al espacio del usuario.
1. Deje que el buffer de la GPU o VPU comparta el núcleo de la CPU.
2. Se utiliza para el montón de servicios de Android.
Ubicación del código fuente: include/linux/android_pmem.h drivers/android/pmem.c
7.Dispositivo USB
Basado en el dispositivo USB estándar de Linux marco del controlador Controlador de dispositivo.
Ubicación del código fuente: drivers/usb/gadet/
Consola 8.Ram
Para proporcionar funciones de depuración, Android permite escribir información de registro de depuración a este dispositivo Es un búfer basado en RAM.
Ubicación del código fuente: drivers/staging/android/ram_console.c
9. Dispositivo de tiempo
El control de sincronización proporciona El dispositivo tiene la función de control de sincronización.
Ubicación del código fuente: drivers/staging/android/timed_output.c(timed_gpio.c)
10.Alarma de Android
Proporciona un temporizador para que el dispositivo se active desde el modo de suspensión y también proporciona una base de reloj que funciona incluso mientras el dispositivo está en modo de suspensión.
Nodo del dispositivo: /dev/alarm
Ubicación del código fuente: drivers/trc/alarm.c
Controlador de dispositivo Android
1 Dispositivo Framebuffer Framebuffer
El controlador Framebuffer es un controlador de dispositivo de visualización estándar en Linux. Para sistemas de PC, es el controlador de la tarjeta gráfica; para sistemas de procesador SOC integrado, es el controlador del controlador LCD u otro controlador de pantalla. Es un dispositivo de caracteres y el nodo del dispositivo en el sistema de archivos suele ser /dev/fbx. Cada sistema puede tener múltiples dispositivos de visualización, representados por /dev/fbO, /dev/fb l
, etc. a su vez. En el sistema Android, el número de dispositivo principal es 29 y el número de dispositivo secundario se genera de forma incremental.
Android utiliza el controlador Framebuffer de forma estándar. El nodo del dispositivo Framebuffer en /dev/graphie/ es creado automáticamente por el proceso de inicio y llamado por la biblioteca libui. En el sistema GUI de Android, la abstracción del dispositivo de visualización se realiza llamando a la interfaz estándar del controlador Framebuffer.
El marco estructural y la implementación de Framebuff:
Controlador LCD de Linux (2) - FrameBuffer
Controlador LCD de Linux (4) - Implementación del controlador p>
p>
2. Controlador del dispositivo de entrada de eventos
El controlador de entrada es el controlador del dispositivo de entrada de Linux, que se divide en joystick (joystick), mouse (mouse y mouse) y evento. dispositivo (cola de eventos) 3 controladores. Entre ellos, los programas controlados por eventos son actualmente programas comunes que pueden admitir múltiples dispositivos de entrada, como teclados, ratones y pantallas táctiles. El número de dispositivo principal del controlador de entrada es l3. Cada número de dispositivo esclavo de dispositivo de entrada ocupa 5 bits. Se asignan tres números de dispositivo esclavo: Joystick 0 ~ 61; Ratón 33 ~ 62; Dispositivo de evento 64 ~ 95; El dispositivo está en misceláneos, pantalla táctil, teclado y otros directorios.
El dispositivo de eventos utiliza lectura, ioctl, encuesta y otras operaciones de interfaz del sistema de archivos en el espacio del usuario. La lectura se usa para leer información de entrada, ioctl se usa para obtener y configurar información y la encuesta se usa para bloquear. espacio de usuario. Cuando el kernel tiene una interrupción, como presionar una tecla, se implementa activando la encuesta del kernel en la interrupción.
Arquitectura e implementación del controlador de entrada de eventos:
Controlador de dispositivo Linux - subsistema de entrada
3. Controlador de audio ALSA
Arquitectura avanzada de sonido de Linux ALSA (Advanced Linux Sound Architecture) es un componente del kernel de Linux que proporciona controladores para el sistema de audio, reemplazando el sistema de sonido de desarrollo original OSS. Es un conjunto de controladores de audio de código completamente abierto. Además de proporcionar un conjunto de módulos de controladores de kernel como OSS, ALSA también proporciona bibliotecas de funciones correspondientes específicamente para simplificar la escritura de aplicaciones. Es similar al ioctl original basado en ioctl proporcionado por OSS. En comparación con la interfaz de programación, la biblioteca de funciones ALSA es más cómoda de usar
Con esta biblioteca de funciones, los desarrolladores pueden desarrollar sus propias aplicaciones de forma cómoda y rápida, dejando los detalles a la biblioteca de funciones para el procesamiento interno. Por lo tanto, aunque ALSA también proporciona una interfaz de sistema similar a OSS, se recomienda que los desarrolladores de aplicaciones utilicen la biblioteca de funciones de audio en lugar de llamar directamente a la función del controlador.
El número de dispositivo principal del controlador ALSA es 116, y el número de dispositivo menor lo define individualmente cada dispositivo. Los nodos de dispositivo principales son los siguientes:
/dev/snd/. contmlCX - control principal
/dev/snd/pcmXXXc——canal de datos PCM;
/dev/snd/seq——Secuenciador;
/dev /snd/timer—— — definidor.
En el espacio de usuario, el controlador ALSA generalmente se usa junto con la biblioteca ALSA, y la biblioteca llama al nodo de dispositivo del controlador ALSA a través de interfaces como ioctl. Para llamadas al controlador AIJSA, se llama a la interfaz de la biblioteca ALSA en el espacio del usuario en lugar de llamar directamente al controlador ALSA.
El archivo de encabezado principal del controlador ALSA es include / sound ./ sound , la estructura de datos central del controlador y la función de registro del controlador específico son include / sound / core . La implementación del controlador son archivos Sound /core/sound.c.
El driver ALSA registra controles y dispositivos usando la siguiente función:
int snd_pcm_new (struct snd_card*card, char*id, int dispositivo, int playback_ count, int capture_count, struct snd_pcm ** rpcm);
int snd ctl _ add(struct snd _ card * card, struct snd _ kcontrol * kcontro1); El controlador de audio está configurado en menuconfig en el kernel, la opción de configuración es "Controladores de dispositivo" > "Soporte de tarjeta de sonido" > "Arquitectura de sonido avanzada de Linux". Las subopciones incluyen dispositivos de sonido genéricos, compatibilidad con arquitectura ARM y varias opciones compatibles con OSS. El archivo correspondiente a la configuración del controlador de audio ALsA es sound/core/Kconfig.
Android no utiliza directamente el controlador ALSA. La capa de abstracción de hardware de Android Audio se puede implementar en función del controlador A-LSA y la biblioteca ALSA, y la biblioteca ALSA llama al controlador ALSA del kernel; La capa de abstracción del hardware de audio llama a la biblioteca ALSA.
4. Controlador de audio OSS
OSS (Open Sound System) es el primer controlador de tarjeta de sonido en Linux. OSS consta de un conjunto completo de módulos de controladores del kernel que pueden proporcionar una interfaz de programación unificada para la mayoría de las tarjetas de sonido.
OSS es un dispositivo de caracteres con un número de dispositivo principal de 14. Incluye principalmente los siguientes archivos de dispositivo:
1) /dev/sndstat
Es un controlador de tarjeta de sonido Se proporciona una interfaz simple. Generalmente es un archivo de solo lectura y su función se limita a informar el estado actual de la tarjeta de sonido. (Se utiliza para detectar tarjetas de sonido)
2)/dev/dsp
Archivos de dispositivo para muestreo y grabación digital. Importante para la programación de audio. Realizar la conversión de señales analógicas y señales digitales.
3) /dev/audio
Similar a /dev/dsp, usando codificación mu-law.
4) /dev/mixer
Se utiliza para combinar o superponer múltiples señales. Para diferentes tarjetas de sonido, las funciones del mezclador pueden ser diferentes.
5) /dev/sequencer
Este dispositivo se utiliza para operar el sintetizador de tabla de ondas integrado en la tarjeta de sonido, o para controlar instrumentos en el bus MIDI.
Los archivos involucrados en el controlador OSS incluyen principalmente:
kernel/include/linux/soundcard.h
kernel/include/linux/sound.h define Número de dispositivo menor y función de registro del controlador OSS
kernel/sound_core.c Parte de implementación principal de OSS
5. Controlador de video V4l2
V4L2 es una versión mejorada de V4L Proporciona un conjunto de especificaciones de interfaz para programas de dispositivos de vídeo en Linux. Incluye un conjunto de estructuras de datos y una interfaz de controlador V4L2 subyacente. V4L2 proporciona muchas interfaces de acceso y puede elegir el método de operación según sus necesidades específicas. Cabe señalar que pocos controladores implementan completamente todas las funciones de la interfaz. Por lo tanto, debe consultar el código fuente del controlador cuando lo utilice o leer atentamente las instrucciones de uso del proveedor del controlador.
El número de dispositivo principal de V4L2 es 81 y el número de dispositivo menor es 0~255. También hay varios dispositivos en estos números de dispositivo menor (dispositivo de video, dispositivo de radio, teletexto, VBI).
Nodos de dispositivo V4L2: /dev/videoX, /dev/vbiX y /dev/radioX
Controlador de dispositivo Android (Parte 2)
Controlador MTD p> p>
Los controladores flash suelen utilizar MTD (dispositivo de tecnología de memoria), dispositivo de tecnología de memoria.
Dispositivo de caracteres de MTD:
/dev/mtdX
Dispositivo principal número 90.
Dispositivo de bloques de MTD:
/dev/block/mtdblockX
Número de dispositivo principal 13.
Código fuente del controlador MTD
drivers/mtd/mtdcore.c: núcleo MTD, definir Dispositivo sin formato MTD
drivers/mtd/mtdchar.c: dispositivo de caracteres MTD
drivers/mtd/mtdblock.c: dispositivo de bloques MTD
controlador MTD Es un nuevo tipo de controlador especialmente desarrollado para entornos integrados en Linux. La interfaz del controlador MTD en Linux se divide en módulos de usuario y módulos de hardware:
El módulo de usuario proporciona interfaces utilizadas directamente desde el espacio del usuario: acceso a caracteres sin formato, acceso a bloques sin formato, FTL (Capa de transición Flash) y JFS ( Sistema de archivos con diario).
Los módulos de hardware proporcionan acceso físico a los dispositivos de memoria, pero no los utilizan directamente. Se accede a ellos a través de los módulos de usuario mencionados anteriormente. Estos módulos proporcionan implementación de operaciones de lectura, escritura y borrado en la memoria flash.
Controlador Bluetooth
En Linux, el controlador del dispositivo Bluetooth es un dispositivo de red y utiliza una interfaz de red.
La pila de protocolos Bluetooth de Android utiliza la implementación BlueZ para admitir especificaciones de aplicaciones como GAP, SDP y RFCOMM, y ha obtenido la certificación SIG. Dado que Bluez tiene licencia GPL, el marco de Android interactúa con el código del espacio de usuario de bluez a través de D-BUS IPC para evitar el uso de código no autorizado.
Archivo de encabezado parcial del protocolo Bluetooth:
include/net/bluetooth/hci_core.h
include/net/bluetooth/bluetooth.h
Archivos de código fuente del protocolo Bluetooth:
net/bluetooth/*
Archivos de partes del controlador Bluetooth:
drivers/bluetooth/*
Los controladores Bluetooth generalmente se implementan a través del control HCI estándar. Sin embargo, existen algunas diferencias según la interfaz del hardware y el proceso de inicialización. Este tipo de acción de inicialización suele consistir en algunas configuraciones básicas, como la frecuencia del oscilador de cristal y la velocidad en baudios. Por ejemplo, los chips CSR generalmente completan la configuración de inicialización inicial a través del protocolo BCSP y luego activan el proceso de control HCI estándar. Para Linux, una vez que bluez puede usar HCI para establecer comunicación con el chip (generalmente hciattach + hciconfig), puede usar los protocolos estándar (SCO, L2CAP, etc.) para comunicarse con Bluetooth y hacer que funcione normalmente.
Controlador de dispositivo WLAN (Wi-Fi) (es más complicado y escribiré un análisis de wifi dedicado más adelante)
En Linux, los dispositivos Wlan son dispositivos de red y utilizan interfaces de red.
Wlan utiliza una interfaz de socket estándar para el control en el espacio del usuario.
Archivo de encabezado parcial del protocolo WiFi:
include/net/wireless.h
Archivo de origen parcial del protocolo WiFi:
net/wireless /*
Sección de controladores WiFi:
drivers/net/wireless/*