Introducción al marco OpenHarmony HDF


Introducción al marco OpenHarmony HDF

El marco del controlador HDF del sistema OpenHarmony se construye utilizando el modelo de programación orientado a objetos en lenguaje C. A través del desacoplamiento de la plataforma y el desacoplamiento del kernel, logra el propósito de ser compatible con diferentes kernels y unificar la base de la plataforma, lo que ayuda a los desarrolladores a darse cuenta del efecto de desarrollo de controladores de una sola vez e implementación de múltiples sistemas.

Para lograr tal objetivo, el marco del controlador HDF del sistema OpenHarmony proporciona:
Capa de adaptación del sistema operativo (OSAL): encapsula de manera uniforme las interfaces relacionadas con el sistema operativo del kernel y protege las interfaces de operación de diferentes sistemas
: i2c, spi, uart bus y otros recursos de la plataforma) y, al mismo tiempo, realizar una abstracción de interfaz de adaptación unificada para la operación del hardware de la placa, de modo que los desarrolladores solo necesiten desarrollar una nueva interfaz de abstracción de hardware y luego puedan obtener la parte de la placa recién agregada. Soporte de controlador Modelo de controlador:
para el controlador de dispositivo, proporciona un modelo de abstracción de controlador común, principalmente para dos propósitos:
proporcionar un modelo de controlador de dispositivo estandarizado, los desarrolladores no necesitan desarrollar de forma independiente, y la implementación del controlador se puede completar a través de la configuración
Proporcionar abstracción del modelo de controlador , protege la relación entre el controlador y los diferentes componentes del sistema. La interacción hace que el controlador sea más versátil.

El marco del controlador HDF del sistema OpenHarmony se compone principalmente de:

  • Marco base del controlador
  • conductor
  • archivo de configuración del controlador
  • interfaz de controlador

Estas cuatro partes están compuestas.

  1. La infraestructura de controladores HDF proporciona administración unificada de recursos de hardware, administración de carga de controladores y administración de nodos de dispositivos. El marco del controlador adopta la configuración del modo maestro-esclavo y consiste en un administrador de dispositivos y un host de dispositivos. El administrador de dispositivos proporciona una administración de controladores unificada. Cuando se inicia el administrador de dispositivos, carga el host del dispositivo del controlador correspondiente de acuerdo con la información del dispositivo del controlador proporcionada por la información del dispositivo y controla el host para completar la carga del controlador. El host del dispositivo proporciona el entorno para que se ejecute el controlador y, al mismo tiempo, el marco del host preestablecido coopera con el administrador del dispositivo para completar la carga y la llamada del controlador. De acuerdo con los requisitos comerciales, el host del dispositivo puede tener varias instancias.
  2. El controlador implementa las funciones específicas del controlador.Cada controlador se compone de uno o más controladores, y cada controlador corresponde a una entrada de controlador. la entrada del controlador completa principalmente la inicialización del controlador y la función de enlace de la interfaz del controlador;
  3. El archivo de configuración del controlador (.hcs) se compone principalmente de información del dispositivo y recursos del dispositivo. La información del dispositivo completa la configuración de la información del dispositivo (como la estrategia de liberación de la interfaz de configuración, el método de carga del controlador, etc.). recurso del dispositivo Complete la configuración de los recursos del dispositivo (como pines GPIO, registros y otra configuración de información de recursos, etc.);
  4. La interfaz del controlador (HDI) proporciona definición e implementación de interfaz estandarizada, y el marco del controlador proporciona servicios de IO y mecanismos de despacho de IO, de modo que la interfaz del controlador tiende a ser consistente en diferentes formas de implementación.

inserte la descripción de la imagen aquí

Diagrama de bloques del marco del controlador HDF

El marco HDF coloca una clase de controladores de dispositivos en el mismo host, y los desarrolladores también pueden desarrollar e implementar las funciones del controlador de forma independiente en capas, admitiendo múltiples nodos para un controlador.El modelo de controlador de administración del marco HDF se muestra en la siguiente figura:

inserte la descripción de la imagen aquí

Cómo funciona el marco del controlador HDF

El administrador de dispositivos proporciona un mecanismo de administración de carga de controladores unificado y un mecanismo de publicación de interfaz de controladores.
Cuando se carga el entorno del host del dispositivo, el administrador del dispositivo solicita al host que cargue el controlador correspondiente de acuerdo con la información del dispositivo, y el host del dispositivo realiza las siguientes operaciones al recibir la solicitud:

  • Cargue la información del dispositivo de acuerdo con la solicitud, busque y cargue la imagen del controlador en la ruta especificada o busque la entrada del controlador desde la dirección de la sección especificada (sección)
  • Encuentre el descriptor del dispositivo del controlador y haga coincidir el controlador del dispositivo correspondiente
  • Cuando la coincidencia del controlador sea exitosa, cargue la imagen del controlador especificado
  • Una vez que la imagen del controlador se carga correctamente, el marco del host llama a la interfaz de enlace y a la interfaz de inicialización de la entrada del controlador para realizar el enlace con el objeto de servicio del controlador e inicializar el controlador del dispositivo al mismo tiempo.
  • Cuando la política de servicio en la configuración de la información del dispositivo requiere exposición externa de la interfaz del controlador, el marco del controlador agregará el objeto de servicio del controlador a la lista de objetos de servicio publicados externamente, y los programas de clientes externos pueden consultar y acceder al servicio correspondiente a través de esta interfaz de lista .

Diagrama de bloques del principio de funcionamiento del marco del controlador HDF:

inserte la descripción de la imagen aquí

Análisis del proceso de carga del controlador HDF

El controlador del sistema OpenHarmony tiene dos métodos de carga de controladores de acuerdo con las diferentes formas de implementación del controlador:

  • Método de carga dinámica: utilizando el método de carga tradicional so (biblioteca compartida), el controlador encuentra la entrada de función del controlador y la carga especificando el método de símbolo
  • Método de carga estática: compila el programa del controlador en la sección especificada a través de la dispersión y luego encuentra la entrada de la función del controlador para cargar accediendo a la dirección correspondiente a la sección especificada.

A continuación, se combina un código de muestra para explicar el proceso de carga del controlador, centrándose en el análisis del proceso de carga del controlador en modo kernel en el modo de carga estático.

Análisis del proceso de carga del controlador HDF: implementación del controlador 1

En el marco del controlador HDF, el objeto HdfDriverEntry se usa para describir la implementación de un controlador:

struct HdfDriverEntry{
    int32_t    moduleVersion;
    const char *moduleName;
    int32_t    (*Bind)(struct HdfDeviceObject *deviceObject);
    int32_t    (*Init)(struct HdfDeviceObject *deviceObject);
    void     (*Release)(struct HdfDeviceObject *deviceObject);
}
  • Vincular interfaz: realice la creación de instancias y el enlace de la interfaz del controlador.Si es necesario publicar la interfaz del controlador, se llamará durante el proceso de carga del controlador, y el servicio del controlador de la interfaz se instanciará y vinculará al objeto del dispositivo;
  • Interfaz de inicio: realice la inicialización del controlador, devolver un error detendrá el proceso de carga del controlador;
  • Interfaz de liberación: realice la descarga del controlador y libere los recursos de software y hardware de la instancia del controlador en esta interfaz.

Análisis del proceso de carga del controlador HDF: implementación del controlador 2

int SampleDriverBind(struct HdfDeviceObject *deviceObject)
intSampleDriverInit(struct HdfDeviceObject *deviceObject)
intSampleDriverRelease(struct HdfDeviceObject *deviceObject)

struct HdfDriverEntry g_sampleDriverEntry = {
    .moduleVersion = 1,
    .moduleName = "sample_driver",
    .Bind = SampleDriverBind,
    .Init = SampleDriverInit,
    .Release = SampleDriverRelease
};

HDF_INIT(g_sampleDriverEntry);

Expanda la macro HDF_INIT:

#define HDF_SECTION    __attribute__((section(".hdf.driver")))
#define HDF_DRIVER_INIT(module)    \
const size_t    USED    ATTR    module##HdfEntry HDF SECTION = (size_t)(&(module))

inserte la descripción de la imagen aquí

Se puede ver que HDF_INITla macro define un símbolo de "nombre del módulo del controlador + HdfEntry" y lo coloca en “.hdf.driver”la sección a la que apunta el símbolo. La dirección de memoria a la que apunta el símbolo es la dirección de la estructura de entrada del controlador. Esta sección especial se utilizará para buscar controladores de dispositivos en el momento del arranque.

Análisis del proceso de carga del controlador HDF: obtenga la lista de controladores

inserte la descripción de la imagen aquí

El marco del controlador HDF realiza la indexación del controlador almacenando la dirección del símbolo de entrada del controlador en una sección especial. Dos símbolos especiales _hdf_drivers_start y _hdf_drivers_end se insertan al principio y al final de esta sección para marcar el alcance de esta sección. entre los dos símbolos especiales se encuentra el puntero de implementación del controlador.

Análisis del proceso de carga del controlador HDF: obtener la lista de dispositivos

inserte la descripción de la imagen aquí

Una vez compilado el texto de configuración, se convertirá en un archivo de configuración en formato binario, en el que la información relacionada con el dispositivo se almacena en un bloque de configuración device_info marcado con "hdf_manager", nombre de host, prioridad de arranque e información de la lista de dispositivos. El campo moduleName en la información del dispositivo se usará para hacer coincidir el moduleName en la entrada del controlador, para que coincida con el controlador correcto para el dispositivo.

Análisis del proceso de carga del controlador HDF: coincidencia entre el dispositivo y el controlador

Cuando se inicia el sistema, el marco del controlador se inicia primero (administrador de dispositivos, host del dispositivo), obtiene la lista de dispositivos analizando el archivo de configuración, lee la lista de controladores leyendo la sección ".hdf.drivers" y luego recorre la lista de dispositivos y controlador La lista coincide y se carga el controlador coincidente. El marco de controladores tiene dos administradores principales:

  • device managerResponsable de la gestión de dispositivos, incluidas las funciones relacionadas con dispositivos, como la carga, descarga y consulta de dispositivos.
  • device service managerResponsable de administrar los servicios de interfaz liberados por el dispositivo y proporcionar funciones tales como publicar y consultar servicios de interfaz

La carga del controlador está dirigida principalmente por el administrador de dispositivos. Primero, el administrador de dispositivos necesita analizar la lista de host en el archivo de configuración e instanciar el objeto de host correspondiente de acuerdo con la información en la lista de host. El host analiza el archivo para obtener el lista de dispositivos asociados, y recorre la lista de dispositivos para obtener el nombre del controlador correspondiente, y luego recorre la sección hdf.driver antes mencionada para obtener la dirección del controlador basada en el nombre del controlador.

Análisis del proceso de carga del controlador HDF: diagrama de flujo del proceso de carga

inserte la descripción de la imagen aquí

El administrador de dispositivos recorre la lista de dispositivos y, cuando encuentra el controlador correspondiente, crea una instancia de objeto de dispositivo para el dispositivo. Si el campo de política en la configuración del dispositivo es una interfaz de controlador que debe liberarse al mundo exterior, el enlace Se llamará primero a la interfaz del controlador para asociar el dispositivo con la instancia de servicio del dispositivo. Luego, se llamará a la interfaz Init del controlador para completar el trabajo de inicialización relacionado del controlador. Si el controlador se descarga o la interfaz Init devuelve una falla debido al hardware y otras razones, se llamará a Release para liberar varios recursos solicitados por el controlador.

Análisis del proceso de carga del controlador HDF: inicio del marco del controlador
El marco del controlador se inicia con late_initcall

static init __init DeviceManagerInit(void)
{
    int ret;
    ret = DeviceManagerStart();
    return ret;
}

late_initcall(DeviceManagerInit);

late_initcall expansión de macros
inserte la descripción de la imagen aquí

Macro significado:

  1. Declare un puntero de función de tipo initcall)_t llamado __initcall_DeviceManagerInit
  2. Inicialice este puntero de función como DeviceManagerInit
  3. Al compilar, debe colocar esta variable de puntero de función en la sección denominada ".initcall7.init", la esencia es colocar la primera dirección de la función DeviceManagerInit en la sección ".initcall7.init"

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Análisis del proceso de carga del controlador HDF: resumen

  1. Cuando se inicia el sistema, devicemanagerInit se inicia primero hasta late_initcall
  2. El administrador de dispositivos analiza la lista de hosts en el archivo de configuración de acuerdo con la información del dispositivo e instancia el objeto de host correspondiente de acuerdo con la información de la lista de hosts.
  3. La lista de dispositivos de la variable host para obtener el nombre del controlador coincidente y luego recorrer la sección .hdf.driver según el nombre del controlador para obtener la dirección del controlador
  4. Después de que el dispositivo y el controlador coincidan correctamente, obtenga la dirección de entrada del controlador especificado y cargue el controlador del dispositivo correspondiente
  5. Llame a la interfaz de enlace del controlador especificado para asociar el dispositivo y la instancia de servicio
  6. Llame a la interfaz de inicio del controlador especificado y complete el trabajo de inicialización relacionado del controlador
  7. Si el controlador se desinstala o la interfaz de inicio devuelve una falla debido al hardware y otras razones, se llamará a release para liberar varios recursos solicitados por el controlador.

Link de referencia

Supongo que te gusta

Origin blog.csdn.net/qq_37596943/article/details/128527737
Recomendado
Clasificación