Цель работы — перенос OpenHarmony на платформу Raspberry Pi.
Основной источник — компонент сборки HiSilicon. Нужно добавить новый продукт в список компонентов сборки, который указывается в файлах конфигурации продуктов. Например:
productdefine\common\products\RPI4B.json
Другие части можно взять за основу от Hi3516, но две строки должны быть указаны явно: путь к одиночному компоненту и его добавление. Без этих двух строк невозможно скомпилировать ядро, будет создан только файловая система OHOS.
... ..
"product_build_path": "device/raspberrypi/build",
"parts":{
... ...
"raspberrypi_products:raspberrypi_products":{},
... ...
}
Следующим шагом создаем директорию raspberrypi в каталоге device и добавляем в неё файл ohos.build. Этот файл соответствует настройкам в файлах конфигурации продуктов.
device\raspberrypi\build\ohos.build
{
"subsystem": "raspberrypi_products",
"parts": {
"raspberrypi_products": {
"module_list": [
"//device/raspberrypi/build:products_group"
]
}
}
}
Затем создаём BUILD.gn в директории device\raspberrypi\build. Каждый производитель может иметь несколько моделей, поэтому здесь можно указать пути к другим моделям, таким как Raspberry Pi 2B, 3B и так далее.
import("//build/ohos.gni")
device_type = "rpi4b"
group("products_group") {
deps += [
"//device/raspberrypi/rpi4b:rpi4b_group"
]
}
Таким образом, компонент сборки для Raspberry Pi 4B был добавлен в систему сборки OHOS3.0. Все последующие изменения следует делать в этой директории.
После того как мы добавили необходимые компоненты сборки, рассмотрим, какие компоненты были уже перенесены на Raspberry Pi 4B и как они могут быть включены в процесс сборки OHOS3.0.
Информацию о патчах можно найти в компонентах Patch. Процесс компиляции ядра выполняется с помощью файла kernel.mk.
kernel\linux\build\kernel.mk
DEVICE_PATCH_DIR := $(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patch
DEVICE_PATCH_FILE := $(DEVICE_PATCH_DIR)/$(DEVICE_NAME).patch
... ...
$(KERNEL_IMAGE_FILE):
$(hide) echo "build kernel..."
$(hide) rm -rf $(KERNEL_SRC_TMP_PATH);mkdir -p $(KERNEL_SRC_TMP_PATH);cp -arfL $(KERNEL_SRC_PATH)/* $(KERNEL_SRC_TMP_PATH)/
$(hide) cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(HDF_PATCH_FILE) && patch -p1 < $(DEVICE_PATCH_FILE)
ifneq ($(findstring $(BUILD_TYPE), small),)
$(hide) cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(SMALL_PATCH_FILE)
endif
Патч-файлы должны быть расположены в правильных директориях и названы правильно, чтобы быть применёнными к ядру.
Файл hdf.patch пока ещё не содержит информации о HDF, поэтому можно использовать патч из Hi3516.
Файл rpi4b.patch следует брать из официального образа Raspberry Pi, доступного по адресу https://github.com/raspberrypi/linux.
kernel\linux\patches\linux-5.10\rpi4b_patch\hdf.patch
kernel\linux\patches\linux-5.10\rpi4b_patch\rpi4b.patch
kernel\linux\config\linux-5.10\arch\arm\configs\rpi4b_standard_defconfig
Ниже приведена часть конфигурации ядра, которая должна быть активирована. Однако это не полный список всех требуемых настроек.
~/ohos/kernel/linux/config/linux-5.10/arch/arm/configs/rpi4b_standard_defconfig
#####################################################################################
> Опции безопасности
> (32768) Нижняя область адресного пространства для защиты от выделения пользователя
[*] Поддержка SELinux NSP #(выбор)
[*] SELinux параметры запуска #(выбор)
[ ] Отключение SELinux во время выполнения
[*] Разработка SELinux
[*] Статистика SELinux AVC
(1) Значение по умолчанию SELinux checkreqprot #(установить значение 1)
(9) Размер таблицы хэш-таблиц SELinux sidtab
(256) Размер кеша преобразования контекста SELinux SID
Первый старый 'major LSM' для инициализации (SELinux) ---> #(выбор) SELinux
Упорядоченный список активированных LSMs #(ввести:"lockdown,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor,bpf")
#####################################################################################
> Устройство-драйверы
> Android
[*] Android устройства #(активировать)
[*] Android Binder IPC устройство #(активировать)
#####################################################################################
> Устройство-драйверы
> Поддержка звука
<*> Расширенная архитектура звука Linux (ALSA) #(выбор, включить в ядро)
<*> Поддержка ALSA для SoC аудио #(выбор, включить в ядро)
> Устройство-драйверы
> Графический режим
<*> Direct Rendering Manager (XFree86 4.1.0 и более новые версии DRI поддержка) #(выбор, включить в ядро)
<*> Broadcom V3D 3.x и более новые версии #(выбор, включить в ядро)
<*> Broadcom VC4 графика #(выбор, этот драйвер зависит от предыдущего звукового драйвера, иначе он не сможет быть включен в ядро)
#####################################################################################
> Устройство-драйверы
> Поддержка ввода устройств
> Тачскрин
<*> Поддержка базовых данных тачскрина фирмы Raspberry Pi #(выбор, включить в ядро)
GPU Pi4 использует VideoCore VI, поддерживающий OpenGL ES 3.2, тогда как GPU Pi3 использует VideoCore IV, поддерживающий OpenGL ES 2.0. Для VideoCore IV используется драйвер VC4, а для VideoCore VI — V3D. Эти драйверы уже включены в ядро, согласно rpi4b_standard_defconfig.
Также требуется настроить config.txt следующим образом:
dtoverlay=vc4-fkms-v3d
В OHOS необходимо также изменить конфигурацию weston, указав драйвер для отображения.
system\etc\weston.ini
[output]
name=card0
Основная идея заключается в том, чтобы сначала найти номер устройства, затем найти драйвер по этому номеру.
ls -l /sys/dev/char/|grep input # Просматривает входные устройства в директории input
cat /sys/dev/char/13\:64/device/uevent # Затем вводит номер устройства, чтобы просмотреть информацию о драйвере
PRODUCT=19/0/0/0
NAME="raspberrypi-ts"
PROP=2
EV=b
KEY=400 0 0 0 0 0 0 0 0 0 0
ABS=2608000 3
MODALIAS=input:b0019v0000p0000e0000-e0,1,3,k14A,ra0,1,2F,35,36,39,mlsfw
Когда ранее настраивали ядро, в rpi4b_standard_defconfig уже было включено управление тачскрином, поэтому теперь не требуется загружать модуль при запуске init. Вместо этого достаточно изменить конфигурацию eudev.
third_party\eudev\rules.d\touchscreen.rules
ATTRS{name}=="raspberrypi-ts", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
ATTRS{name}=="VSoC keyboard", ENV{ID_INPUT}="1", ENV{ID_INPUT_KEYBOARD}="1"
DRIVERS=="hid-multitouch", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
Обычно ядро загружается через U-Boot, и OHOS по умолчанию генерирует uImage. Но Raspberry Pi имеет свой собственный загрузочный менеджер, хотя можно использовать U-Boot для загрузки uImage после загрузки U-Boot через BootLoader Raspberry Pi. Это усложняет процесс и увеличивает время загрузки. Однако в текущих скриптах компиляции ядра zImage заменяет uImage.
kernel\linux\build\kernel.mk
$(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) -j64 zImage
kernel\linux\build\build_kernel.sh
- cp ${2}/kernel/src_tmp/${8}/arch/arm/boot/uImage ${3}/uImage
+ cp ${2}/kernel/src_tmp/${8}/arch/arm/boot/zImage ${3}/zImage
kernel\linux\build\BUILD.gn
- outputs = [ "$root_build_dir/packages/phone/images/uImage" ]
+ outputs = [ "$root_build_dir/packages/phone/images/zImage" ]
kernel\linux\build\kernel_module_build.sh
- LINUX_KERNEL_UIMAGE_FILE=${LINUX_KERNEL_OUT}/arch/arm/boot/uImage
+ LINUX_KERNEL_UIMAGE_FILE=${LINUX_KERNEL_OUT}/arch/arm/boot/zImage
Компиляция ядра зависит от hdf.hcs файла, находящегося в директории vendor/$product_company/$product_name. Поэтому нужно создать этот файл, чтобы избежать ошибки.
ninja: error: '../../vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcs', needed by 'gen/drivers/adapter/uhdf2/hcs/hdf_default.hcb', missing and no known rule to make it
Создайте: vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcs
root {
module = "default";
}
Чтобы сделать процесс записи удобнее, нужно объединить boot.img, system.img, updater.img, vendor.img и userdata.img в один rpi4b.img. Также пишем простой скрипт для этого процесса rpi4b/device/raspberrypi/images/mkboot.py.
Однако есть проблема: главный раздел поддерживает только четыре раздела, поэтому updater.img временно не включается в rpi4b.img. Эту проблему можно решить в будущем.
В конце получится один образ rpi4b.img, который можно записать на SD-карту.
Linux: Можно использовать команду dd
Windows: Можно использовать Win32 Disk Imager для записи образа.
На данном этапе удалось пройти весь процесс добавления новой платформы, хотя пока что адаптированы только экран и тачскрин. В дальнейших планах стоит попробовать адаптировать HDF или distributed компоненты.
1.1. Установка окружения
1.2. Скачивание исходного кода
1.3. Стартовый процесс Raspberry Pi
1.4. Компиляция U-Boot для Raspberry Pi
2.1. Добавление нового устройства
2.2. Настройка запуска
2.4. Системные часы
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )