Ядро драйвера служит мостом между программным обеспечением и аппаратной частью. Оно позволяет получить доступ к аппаратным ресурсам ядра OpenHarmony через API файловой системы, предоставляя способ взаимодействия между пространствами пользователя и ядра, а также между процессами. Основные драйверы ядра включают mem, random, video, quickstart, hievent и tzdriver. Первые четыре типа драйверов хранятся в директории kernel/liteos_a/drivers/char, а последние два типа hievent и tzdriver — в директории drivers/liteos. Каждый тип драйвера представляет собой определенную возможность. Вы можете выбрать нужный драйвер для передачи данных. Ниже приведена схема архитектуры драйверов ядра.
Рисунок 1 Архитектура драйверов ядра
Где:
/drivers/liteos
├── hievent # Драйвер для управления логами событий
├── include # Внешние заголовочные файлы
├── tzdriver # Используется для переключения и связи между богатой средой выполнения (REE) и доверием средой выполнения (TEE) и предоставляет узлы устройств, доступные из уровня приложений.
Поскольку реализация tzdriver полностью открытого исходного кода недоступна, сторонним производителям требуется получение поддержки через сотрудничество.
Функциональность, связанная с hievent, в настоящее время недоступна и будет открыта в будущем. Кроме того, не модифицируйте API и формат их параметров, определённых в папке hievent.
Код, связанный с видео, хранится в файлах video/fb.c и video/fb.h в директории third_party/NuttX.
Как показано выше в архитектуре драйверов ядра, драйвер ядра можно рассматривать как специальный файл. Вы можете использовать стандартные 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 для удаления узла устройства. Для этой функции нет возвращаемых значений.
up_fbgetvplane
Прототип функции:
struct fb_vtable_s *up_fbgetvplane(int display, int vplane);
Описание функции: Получает указатель на драйвер фреймбуфера, который требуется вашей реализации. При успешном завершении операции возвращается действительный указатель. В противном случае возвращается NULL
.
Описание параметров
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 )