análisis trama de capa Android HAL (III)

Análisis previo de la capa HAL cómo androide está buscando módulos de hardware bibliotecas dinámicas compartida, de hecho, es encontrar el modueid.variant biblioteca compartida en el "sistema / lib / hw /" "/ / vendedor / lib / hw" estos dos caminos o. después de tanto cargar la biblioteca llamando a la función de carga.

Aquí entramos en la función de carga para ver cómo lograr bibliotecas compartidas de carga específica.

La siguiente es una definición de la función de carga, también logrado en el /hardware/libhardware/hardware.c,

/**
 * Load the file defined by the variant and if successful
 * return the dlopen handle and the hmi.
 * @return 0 = success, !0 = failure.
 */
static int load(const char *id,
        const char *path,
        const struct hw_module_t **pHmi)
{//传入硬件模块id和库所在路径,获取到硬件模块结构体
    int status;
    void *handle;
    struct hw_module_t *hmi;

    /*
     * load the symbols resolving undefined symbols before
     * dlopen returns. Since RTLD_GLOBAL is not or'd in with
     * RTLD_NOW the external symbols will not be global
     */
    handle = dlopen(path, RTLD_NOW);//打开共享库
    if (handle == NULL) {
        char const *err_str = dlerror();
        LOGE("load: module=%s\n%s", path, err_str?err_str:"unknown");
        status = -EINVAL;
        goto done;
    }

    /* Get the address of the struct hal_module_info. */
    const char *sym = HAL_MODULE_INFO_SYM_AS_STR;
    hmi = (struct hw_module_t *)dlsym(handle, sym);//解析共享库
    if (hmi == NULL) {
        LOGE("load: couldn't find symbol %s", sym);
        status = -EINVAL;
        goto done;
    }

    /* Check that the id matches */
    if (strcmp(id, hmi->id) != 0) {//匹配解析出硬件模块的id和传入我们实际想要得到的模块id是否一致
        LOGE("load: id=%s != hmi->id=%s", id, hmi->id);
        status = -EINVAL;
        goto done;
    }

    hmi->dso = handle;  //将打开库得到句柄传给硬件模块的dso

    /* success */
    status = 0;

    done:
    if (status != 0) {
        hmi = NULL;
        if (handle != NULL) {
            dlclose(handle);
            handle = NULL;
        }
    } else {
        LOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",
                id, path, *pHmi, handle);
    }

    *pHmi = hmi;//将得到的module的结果通过第三个参数传给hw_module_t

    return status;
}

Se puede ver la función de carga de entrada de varios parámetros, el primer parámetro es la necesidad de cargar el módulo módulo de hardware identificador de hardware corresponde a una biblioteca dinámica,

El segundo parámetro es el inventario dinámico poner la ruta en función hw_get_module frontal es parte de la trayectoria resultante base de búsqueda,

El tercer argumento es que necesitamos para obtener la estructura del módulo de hardware, a través del cual pasan hw_get_module, hw_get_module función JNI pasado por parámetro.

La línea 19, primera llamada dlopen abrir una biblioteca compartida, la función de biblioteca para encontrar el camino que pasa a través de la biblioteca, y abrirlo devuelve un identificador a la palanca de funcionamiento, a continuación, llamar dlsym función analiza la biblioteca abierta, la siguiente línea 29, obtener la estructura de módulo de hardware contenido en la biblioteca, y volver de nuevo. Por lo tanto, los fabricantes de hardware o receptores de trasplante de hardware tienen que ir a la estructura del módulo de hardware hw_module_t llenar esto y de acuerdo a su propio Hal relacionados con el hardware de esta arquitectura para su uso.

Después de analizar a través de dlsym get un hw_module_t, seguido por los primeros 37 filas de la estructura de base de datos obtenido mediante el análisis el identificador id entrante y comparación para ver si el mismo.

Si la prueba es conseguir la consistencia adecuada del módulo de hardware.

Finalmente, la línea 60, a un puntero estructura pasó hw_module_t tercer parámetro pasó función hw_get_module.

Esta función, hw_get_module conseguir un hw_module_t estructura del módulo de hardware.

Con hw_module_t, puede abrir el dispositivo correspondiente a los módulos de hardware por método abierto sus dispositivos de hardware interna puede ser operado por los métodos del cuerpo estructural.

Publicados 407 artículos originales · ganado elogios 150 · vistas 380 000 +

Supongo que te gusta

Origin blog.csdn.net/ds1130071727/article/details/104908908
Recomendado
Clasificación