1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openharmony-drivers_liteos

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 17 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 27.02.2025 23:28 974c67b

Драйверы

Введение

Ядро драйвера служит мостом между программным обеспечением и аппаратной частью. Оно позволяет получить доступ к аппаратным ресурсам ядра OpenHarmony через API файловой системы, предоставляя способ взаимодействия между пространствами пользователя и ядра, а также между процессами. Основные драйверы ядра включают mem, random, video, quickstart, hievent и tzdriver. Первые четыре типа драйверов хранятся в директории kernel/liteos_a/drivers/char, а последние два типа hievent и tzdriver — в директории drivers/liteos. Каждый тип драйвера представляет собой определенную возможность. Вы можете выбрать нужный драйвер для передачи данных. Ниже приведена схема архитектуры драйверов ядра.

Рисунок 1 Архитектура драйверов ядра
Kernel driver architecture

Где:

  • mem указывает на драйвер для доступа к физическим устройствам ввода/вывода (I/O) в пространстве пользователя. Он используется вместе с функцией mmap.
  • random указывает на драйвер для получения случайных чисел, включая истинные генераторы случайных чисел (TRNG) и псевдорандомные генераторы (PRNG). Устройства для TRNG и PRNG имеют узлы устройств /dev/random и /dev/urandom соответственно. Относительно, TRNG обеспечивают более высокую степень случайности.
  • video указывает на фреймбуферный драйвер. Вам потребуется инициализировать API, зарегистрировать фреймбуферный драйвер и работать с ним через API файловой системы.

Структура директорий

/drivers/liteos
├── hievent         # Драйвер для управления логами событий
├── include         # Внешние заголовочные файлы
├── tzdriver        # Используется для переключения и связи между богатой средой выполнения (REE) и доверием средой выполнения (TEE) и предоставляет узлы устройств, доступные из уровня приложений.

Ограничения

Поскольку реализация tzdriver полностью открытого исходного кода недоступна, сторонним производителям требуется получение поддержки через сотрудничество.

Функциональность, связанная с hievent, в настоящее время недоступна и будет открыта в будущем. Кроме того, не модифицируйте API и формат их параметров, определённых в папке hievent.

Код, связанный с видео, хранится в файлах video/fb.c и video/fb.h в директории third_party/NuttX.

Доступные API

Как показано выше в архитектуре драйверов ядра, драйвер ядра можно рассматривать как специальный файл. Вы можете использовать стандартные API файловой системы, такие как open, close, read, write и ioctl для работы с драйвером. Ниже представлены связанные API:

  • fb_register

    Прототип функции:

    int fb_register(int display, int plane);

    Описание функции: Загружает драйвер фреймбуфера и регистрирует узел устройства /dev/fb0. При успешном завершении операции возвращается значение 0. В противном случае возвращается код ошибки.

    Описание параметров

    Параметр

    Описание

    display

    Указывает номер слоя отображения. Обычно это значение равно 0. Если аппаратное обеспечение поддерживает несколько слоёв отображения, этот параметр может принимать другие значения.

    plane

    Указывает цветовую плоскость. Обычно это значение равно 0.

  • fb_unregister

    Прототип функции:

    int fb_unregister(int display);

    Описание функции: Отменяет установку драйвера фреймбуфера. При успешном завершении операции возвращается значение 0. В противном случае возвращается код ошибки.

    Описание параметров

    Параметр

    Описание

    display

    Указывает номер слоя отображения.

  • up_fbinitialize

    Прототип функции:

    int up_fbinitialize(int display);

    Описание функции: Инициализирует драйвер фреймбуфера. Эта функция требует вашего выполнения путём вызова fb_register для регистрации узла устройства, предоставляющего возможности драйвера фреймбуфера. При успешном завершении операции возвращается значение 0. В противном случае возвращается код ошибки.

    Описание параметров

    Параметр

    Описание

    display

    Указывает номер слоя отображения.

  • up_fbuninitialize

    Прототип функции:

    void up_fbuninitialize(int display);

    Описание функции: Отменяет установку драйвера фреймбуфера. Эта функция требует вашего выполнения путём вызова fb_unregister для удаления узла устройства. Для этой функции нет возвращаемых значений.

    Описание параметров

    Параметр

    Описание

    display

    Указывает номер слоя отображения.

  • up_fbgetvplane

    Прототип функции:

    struct fb_vtable_s *up_fbgetvplane(int display, int vplane);

    Описание функции: Получает указатель на драйвер фреймбуфера, который требуется вашей реализации. При успешном завершении операции возвращается действительный указатель. В противном случае возвращается NULL.

    Описание параметров

    Параметр

    Описание

    display

    Указывает номер слоя отображения.

    vplane

    Указывает указанную цветовую плоскость.

  • pse_ran_dev_register

    Прототип функции:

    int pse_ran_dev_register(void);

    Описание функции: Инициализирует драйвер устройства PRNG и регистрирует узел устройства /dev/random. При успешном завершении операции возвращается значение 0. В противном случае возвращается код ошибки.

    Описание параметров: Нет

  • ran_dev_register

    Прототип функции:

    int ran_dev_register(void);

    Описание функции: Инициализирует драйвер TRNG и регистрирует узел устройства /dev/urandom. При успешном завершении операции возвращается значение 0. В противном случае возвращается код ошибки.

    Описание параметров: Нет

  • mem_dev_register

    Прототип функции:

    int mem_dev_register(void);

    Описание функции: Инициализирует драйвер mem и регистрирует узел устройства /dev/mem. При успешном завершении операции возвращается значение 0. В противном случае возвращается код ошибки.

    Описание параметров: Нет

Использование

  • Пример использования драйвера фреймбуфера:

    int up_fbinitialize(int display)
    {
        // Предоставляет возможности аппаратного драйвера буфера кадров. Конкретная логика кода требует вашей реализации.
    }
    
    void up_fbuninitialize(int display)
    {
        // Эта функция используется вместе с up_fbinitialize. Конкретная логика кода требует вашей реализации.
    }
    
    struct fb_vtable_s *up_fbgetvplane(int display, int vplane)
    {
        // Регистрирует аппаратный драйвер на основе информации, описанной структурой fb_vtable_s. Вы можете использовать возможности драйвера через уровень видеоподсистемы. Конкретная логика кода требует вашей реализации.
    }
    
    int FrameBufferFunc(void)
    {
        int ret;
        int fd = -1;
        struct hifb_info info;
        char *pShowScreen = NULL;
    
        ret = fb_register(0, 0); // Регистрация узла устройства /dev/fb0. Эта функция вызывает предыдущие функции для включения возможностей аппаратного драйвера.
        if (ret != bk_0) {
            return -1;
        }
    
        fd = open(file, O_RDWR, 0);  
        if (fd < 0) {
            return -1;
        }
     
        if (ioctl(fd, FBIOGET_SCREENINFO_HIFB, &info) < 0) {
            return -1;
        }
        info.vinfo.xres = 1920;
        info.vinfo.yres = 1080;
        info.oinfo.sarea.w = 1920;
        info.oinfo.sarea.h = 1080;
        info.oinfo.bpp = 16;
        info.activate = 0;
        info.vinfo.fmt = HIFB_FMT_ARGB1555;
    
        if (ioctl(fd, FBIOPUT_SCREENINFO_HIFB, &info) < 0) {
            return -1;
        }
    
        if (ioctl(fd, FBIOGET_SCREENINFO_HIFB, &info) < 0) {
            return -1;
        }
    
        pShowScreen = mmap(HI_NULL, info.oinfo.fblen, PROT_READ | PROT_WRITE, MAP_SHARED, pstInfo->fd, 0);
        if (pShowScreen == -1) {
            return -1;
        }
    
        // Заполняет память, на которую указывает pShowScreen, и отображает графику через вызов ioctl.
    
        munmap(pShowScreen, info.oinfo.fblen); 
    
        close(fd);
    
        ret = fb_unregister(0);
        if (ret != 0) {
            return -1;
        }
    }

Вовлечённые репозитории

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/openharmony-drivers_liteos.git
git@api.gitlife.ru:oschina-mirror/openharmony-drivers_liteos.git
oschina-mirror
openharmony-drivers_liteos
openharmony-drivers_liteos
master