Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo modificar la segunda pantalla de inicio durante el inicio de Android

Cómo modificar la segunda pantalla de inicio durante el inicio de Android

La primera pantalla de inicio aparece durante el inicio del kernel y es una pantalla estática. La segunda pantalla de inicio aparece durante el proceso de inicio y también es una pantalla estática. La tercera pantalla de inicio aparece durante el proceso de inicio del servicio del sistema, que es una pantalla dinámica. No importa qué pantalla se utilice, se representan en un dispositivo de hardware llamado framebuffer (fb para abreviar). A continuación, analizaremos cómo se muestra cada uno de estos tres fotogramas en el búfer de fotogramas.

1. La primera pantalla de inicio

La primera pantalla de inicio de Android es en realidad la pantalla de inicio del kernel de Linux. Por defecto esta pantalla no aparece a menos que habilitemos las siguientes dos opciones de compilación al compilar el kernel:

CONFIG_FRAMEBUFFER_CONSOLE

CONFIG_LOGO

La primera La opción de compilación indica que el kernel admite la consola framebuffer y sus elementos de menú de configuración correspondientes son: Controladores de dispositivo ---gt; soporte de gráficos ---gt; soporte de controlador de pantalla de consola ---gt; La segunda opción de compilación indica que el kernel necesita mostrar el logotipo durante el proceso de inicio. Los elementos del menú de configuración correspondientes son: Controladores de dispositivo ---gt; Soporte de gráficos de consola ---gt; soporte: Controladores de dispositivos ---gt; soporte de gráficos ---logotipo de arranque. )banda.

El dispositivo de hardware frame buffer tiene un módulo de controlador correspondiente fbmem en el kernel, que se implementa en el archivo kernel/goldfish/drivers/video/fbmem.c. Su función de inicialización es la siguiente:

/**

* fbmem_init - Inicia el subsistema frame buffer

*

* Inicializa el subsistema de buffer de cuadros.

*

* NOTA: Esta función _solo_ la llama el controlador /char/mem.c.

*

*/

static int __init

fbmem_init(void)

{

proc_create("fb", 0, NULL y fb_proc_fops);

if (register_chrdev(FB_MAJOR, "fb", & fb_fops))

printk(" no se puede obtener d mayor para fb devs\n", FB_MAJOR);

fb_class = class_create(THIS_MODULE, "graphics");

if (IS_ERR(fb_class)) {

p>

printk(KERN_WARNING "No se puede crear la clase fb; errno = ld\n", PTR _ERR(fb_class));

fb_class = NULL

}

p>

devuelve 0.

Devuelve 0;

}

Esta función primero llama a proc_create para crear un archivo fb en el directorio /proc y luego llama a Register _chrdev para registrar un archivo. llamado dispositivo de caracteres fb y finalmente llame a class_create para crear un directorio de gráficos que describa el sistema de gráficos del kernel en el directorio /sys/class.

Además de realizar el trabajo de inicialización anterior, el módulo fbmem también exporta una función Register_framebuffer:

EXPORT_SYMBOL(register_framebuffer);

Esta función se utiliza durante el proceso de inicialización. Proceso de inicio del kernel llamado para realizar la operación de registrar el dispositivo de hardware del búfer de cuadros, la implementación específica es la siguiente:

/**

* registrar_framebuffer: registrar el dispositivo de búfer de cuadros <. /p>

* @fb_info: Estructura de información del frame buffer

*

* Registrar dispositivo frame buffer @fb_info.

*

* Devuelve un valor negativo errno en caso de error, cero en caso de éxito.

*

*/

int

register_framebuffer(struct fb_info *fb_info)

{

int i;

estructura fb_event evento

...

if (num_registered_fb == FB_MAX)

retorno -ENXIO;

...

num_registered_fb;

para (i = 0; i lt; FB_MAX; i)

p>

if (!if (! registrado_fb[i])

break;

fb_info-gt; nodo = i;

mutex_init(amp; fb_info-gt ;lock);

fb_info-gt;dev = dispositivo_create(fb_class, fb_info-gt;dispositivo,

MKDEV(FB_MAJOR, i), NULL, "fbd", i

);

if (IS_ERR(fb_info-gt;dev)){

/* No fatal*/

printk(KERN_WARNING "No se puede crear el dispositivo para framebuffer d . errno = ld\n", i, PTR_ERR(fb_info-gt;dev));

fb_info-gt;dev = NULL;

} else

fb_init_device( fb_info);

...

registrado_fb[i] = fb_info;

evento.info = fb_info

fb_notifier_call_chain(FB_EVENT_FB_REGISTERED; , amp; event);

return 0;

}

Dado que puede haber varios dispositivos de hardware de frame buffer en el sistema, el módulo fbmem utiliza el matrizregistrado_fb para guardar todos los dispositivos de hardware de búfer de cuadros registrados, donde cada hardware de búfer de cuadros se describe utilizando la estructura fb_info.