BSP для ЗОСРВ "Нейтрино" редакции 2021
This commit is contained in:
commit
de2c0ad4e5
58
Makefile
Normal file
58
Makefile
Normal file
@ -0,0 +1,58 @@
|
||||
# This is the top level Makefile for all source packages.
|
||||
# It makes all the code in the "src" directory, then installs it
|
||||
# to the "install" directory", then makes the images in
|
||||
# the images directory (if present)
|
||||
|
||||
ROOT_DIR := $(notdir $(CURDIR))
|
||||
ifndef QCONFIG
|
||||
QCONFIG=qconfig.mk
|
||||
endif
|
||||
include $(QCONFIG)
|
||||
unexport ROOT_DIR
|
||||
|
||||
.PHONY: all install clean make_builds clean_builds dummy images prebuilt
|
||||
|
||||
# Expands to a single newline character
|
||||
define NEWLINE
|
||||
|
||||
|
||||
endef
|
||||
|
||||
SUFFIXES := .mk
|
||||
|
||||
all:
|
||||
$(if $(wildcard prebuilt/*), $(MAKE) prebuilt)
|
||||
$(if $(wildcard src/*), $(MAKE) -Csrc hinstall)
|
||||
$(if $(wildcard src/*), $(MAKE) -Csrc install)
|
||||
$(MAKE) make_builds
|
||||
$(MAKE) images
|
||||
@echo done
|
||||
|
||||
subdirs:=$(subst /Makefile,,$(wildcard */[Mm]akefile))
|
||||
|
||||
clean:
|
||||
$(foreach dir,$(subdirs), $(MAKE) -C$(dir) clean $(NEWLINE))
|
||||
-$(RM_HOST) -rv install/*
|
||||
|
||||
install: all
|
||||
|
||||
make_builds:
|
||||
@$(foreach file,$(wildcard install/*/boot/build/*), \
|
||||
$(if $(wildcard images/$(notdir $(file))), \
|
||||
echo Skip $(wildcard images/$(notdir $(file))), \
|
||||
echo Copy $(file) to images/$(notdir $(file)); $(CP_HOST) -n $(file) images/$(notdir $(file)));)
|
||||
|
||||
clean_builds:
|
||||
@$(if $(wildcard install/*/boot/build/*), \
|
||||
$(foreach file,$(wildcard install/*/boot/build/*), \
|
||||
echo Delete images/$(notdir $(file)); $(RM_HOST) images/$(notdir $(file)); ), \
|
||||
$(foreach file,$(wildcard prebuilt/*/boot/build/*), \
|
||||
echo Delete images/$(notdir $(file)); $(RM_HOST) images/$(notdir $(file)); ))
|
||||
|
||||
|
||||
images:
|
||||
$(if $(wildcard images/*.build), $(MAKE) -Cimages)
|
||||
|
||||
prebuilt:
|
||||
-$(RM_HOST) -rf install/*
|
||||
$(CP_HOST) -r prebuilt/* install/
|
85
README.md
Normal file
85
README.md
Normal file
@ -0,0 +1,85 @@
|
||||
# BSP для платы OrangePi PC на базе Allwinner H3 (ARMv7 Cortex-A7 QuadCore)
|
||||
|
||||
## Руководство пользователя и бинарная сборка
|
||||
|
||||
- [Бинарный релиз](https://git.kpda.ru/BSP/kpda-bsp-allwinner-h3-orangepipc/releases/tag/release-2021)
|
||||
- [Руководство пользователя](https://git.kpda.ru/BSP/kpda-bsp-allwinner-h3-orangepipc/releases/download/release-2021/UserManual.pdf)
|
||||
|
||||
## Поддерживаемые редакции
|
||||
|
||||
- 2021
|
||||
- 2020 (ограниченно)
|
||||
|
||||
## Сборка BSP
|
||||
|
||||
Скопировать BSP в рабочую директорию
|
||||
|
||||
Сменить текущую директорию на директорию с BSP
|
||||
|
||||
`cd kpda-bsp-allwinner-h3-orangepipc`
|
||||
|
||||
Для сборки образа из файла построения orangepi.build
|
||||
|
||||
`make -j$(nproc)`
|
||||
|
||||
## Передача образа на плату
|
||||
- скопировать полученный образ в папку tftp-сервера;
|
||||
|
||||
`tftp -R 6969:6969 172.16.x.x -c put ifs-h3-orangepi.bin ifs-h3-orangepi.bin`
|
||||
|
||||
- подключить плату по usb-uart;
|
||||
- проверить наличие устройства /dev/ttyUSB0;
|
||||
- настроить minicom со следующими параметрами: скорость 115200, 8 бит, без контроля
|
||||
четности, 1 стоп-бит, порт /dev/ttyUSB0;
|
||||
- запустить minicom и включить плату;
|
||||
- после запуска U-Boot ввести следующую последовательность команд:
|
||||
|
||||
|
||||
Установка ip-адреса для модуля:
|
||||
|
||||
`=> setenv ipaddr 172.16.x.x`
|
||||
|
||||
Установка ip-адреса для tftp-сервера:
|
||||
|
||||
`=> setenv serverip 172.16.x.x`
|
||||
|
||||
`=> setenv gatewayip 172.16.x.x`
|
||||
|
||||
Загрузка
|
||||
|
||||
```
|
||||
=> tftpboot 0x41000000 ifs-h3-orangepi.bin
|
||||
=> go 0x41000000
|
||||
```
|
||||
|
||||
Пример скрипта `tftp.sh` для автоматизации:
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
|
||||
set -ex
|
||||
|
||||
TFTP_SERIAL=${TTY_SERIAL:-/dev/ttyUSB0}
|
||||
TFTP_CLIENT=172.16.x.x
|
||||
TFTP_SERVER=172.16.x.x
|
||||
|
||||
image="ifs-h3-orangepi.bin"
|
||||
|
||||
tftp -R 6969:6969 $TFTP_SERVER -c put $image $image
|
||||
echo "setenv ipaddr $TFTP_CLIENT" > $TFTP_SERIAL
|
||||
echo "setenv serverip $TFTP_SERVER" > $TFTP_SERIAL
|
||||
echo "setenv gatewayip $TFTP_SERVER" > $TFTP_SERIAL
|
||||
echo "tftpboot 0x41000000 $image; go 0x41000000" > $TFTP_SERIAL
|
||||
```
|
||||
|
||||
Запуск:
|
||||
|
||||
`./tftp.sh`
|
||||
|
||||
## Поддерживаемые компоненты
|
||||
| Компонент | Поддержка | Протестировано | Комментарий |
|
||||
| :------------: | :-------: | :------------: | :----------------------------------------------------: |
|
||||
| RAM | 1GB | + | |
|
||||
| SMP | 4 CPU cores | + | |
|
||||
| UART | + | + | |
|
||||
| NET | + | + | |
|
42
docs/00-UserGuide.dox
Normal file
42
docs/00-UserGuide.dox
Normal file
@ -0,0 +1,42 @@
|
||||
@page "00-UserGuide" BSP для OrangePi-PC Allwinner-H3
|
||||
@par Аннотация
|
||||
|
||||
@brief Данный документ представляет собой руководство пользователя для пакета поддержки платы OrangePi-PC на основе интегральной микросхемы Allwinner-H3 под ЗОСРВ «Нейтрино».
|
||||
|
||||
Процессорная архитектура: ARMv7 Little Endian
|
||||
@hide @arch{armv7} @endhide
|
||||
|
||||
Поддерживаемые устройства:
|
||||
- Одноплатный компьютер @link{http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-PC.html}OrangePi-PC@endlink
|
||||
|
||||
Документ включает следующие разделы:
|
||||
@ul
|
||||
@item Основные термины и сокращения
|
||||
@item Общие сведения
|
||||
@item Состав и структура
|
||||
@item Установка и настройка
|
||||
@item Загрузка образа ОС
|
||||
@item Описание компонентов
|
||||
@item Проверка функционирования
|
||||
@item Известные особенности
|
||||
@item Журнал изменений
|
||||
@endul
|
||||
|
||||
В разделе «Основные термины и сокращения» приведена расшифровка сокращений, используемых в данном документе.
|
||||
|
||||
В разделе «Общие сведения» приведены назначение и функции ППМ, а также описание используемых технических средств.
|
||||
|
||||
В разделе «Состав и структура» приведены сведения о структуре ППМ, его составных частях и назначении составных частей.
|
||||
|
||||
В разделе «Установка и настройка» приведены указания по установке и настройке компонентов сред разработки и сред исполнения, необходимых для функционирования ППМ и сборки загружаемого образа ЗОСРВ «Нейтрино».
|
||||
|
||||
В разделе «Загрузка образа ОС» приведены сведения о вариантах запуска загружаемого образа ЗОСРВ «Нейтрино» на целевой системе.
|
||||
|
||||
В разделе «Описание компонентов» приведены описания компонентов ППМ.
|
||||
|
||||
В разделе «Проверка функционирования» приведены указания по проверке работоспособности пакета поддержки.
|
||||
|
||||
В разделе «Известные особенности» приведены известные особбености и ограничения текущей версии пакета поддержки.
|
||||
|
||||
@group table_of_articles
|
||||
@@table[width:40:60:width] Раздел @| Описание
|
17
docs/01-Glossary.dox
Normal file
17
docs/01-Glossary.dox
Normal file
@ -0,0 +1,17 @@
|
||||
@page "Glossary" Основные термины и сокращения
|
||||
|
||||
@brief Основные термины и сокращения, используемые в данном руководстве
|
||||
|
||||
@dl
|
||||
@term ЗОСРВ
|
||||
@use защищенная операционная система реального времени
|
||||
|
||||
@term ПМ
|
||||
@use процессорный модуль
|
||||
|
||||
@term ППМ
|
||||
@term BSP
|
||||
@use пакет поддержки микропроцессора
|
||||
@enddl
|
||||
|
||||
@prev{./00-UserGuide.html|table_of_articles||1}
|
24
docs/02-GeneralInfo.dox
Normal file
24
docs/02-GeneralInfo.dox
Normal file
@ -0,0 +1,24 @@
|
||||
@page "GeneralInfo" Общие сведения
|
||||
|
||||
@brief Общие сведения
|
||||
|
||||
@br
|
||||
Пакет поддержки платы OrangePi-PC (ППМ) предназначен для обеспечения запуска и функционирования ЗОСРВ «Нейтрино» на процессорном модуле (ПМ) на на основе интегральной микросхемы Allwinner-H3.
|
||||
|
||||
@br
|
||||
Для работы с ППМ необходим инструментальный ПК с установленным комплектом разработчика для ЗОСРВ «Нейтрино» в варианте _Linux Host_ и целевая плата OrangePi-PC на основе интегральной микросхемы Allwinner-H3.
|
||||
|
||||
@br
|
||||
ППМ совместим со следующими редакциями ЗОСРВ «Нейтрино»: @b 2021, @b 2020 (ограниченно).
|
||||
|
||||
@br
|
||||
ППМ обеспечивает поддержку и функционирование следующих блоков и интерфейсов интегральной микросхемы Allwinner-H3:
|
||||
@ul
|
||||
@item процессорнные ядра Cortex-A7 в режиме SMP
|
||||
@item контроллер прерываний GICv2
|
||||
@item контроллер оперативной памяти DDR
|
||||
@item UART
|
||||
@item Ethernet
|
||||
@endul
|
||||
|
||||
@prev{./00-UserGuide.html|table_of_articles||2}
|
28
docs/03-Contents.dox
Normal file
28
docs/03-Contents.dox
Normal file
@ -0,0 +1,28 @@
|
||||
@page "Contents" Состав и структура
|
||||
|
||||
@brief Состав и структура
|
||||
|
||||
@br
|
||||
ППМ представляет собой архив, имеющий формат .tar.gz и имя вида «kpda-bsp-allwinner-h3-orangepipc-(версия-ОС)-(формат)-(дата)-(хэш-git).tar.gz».
|
||||
Назначение полей:
|
||||
@ul
|
||||
@item (версия-ОС) - версия ЗОСРВ для которой предназначен BSP
|
||||
@item (формат) - формат ППМ: @a src для версии с исходными кодами, @a bin для версии с бинарными компонентами
|
||||
@item (дата) - дата сборки и запаковки BSP в формате ГГГГММДД
|
||||
@item (хэш-git) - номер или хэш коммита системы контроля версией git
|
||||
@endul
|
||||
|
||||
@br
|
||||
Архив ППМ содержит следующие компоненты:
|
||||
|
||||
@output{asciiart}
|
||||
kpda-bsp-allwinner-h3-orangepipc/ # Каталог верхнего уровня
|
||||
|--> images/ # Каталог с загрузочным образом (IFS) и файлами построения
|
||||
| |--> ifs-h3-orangepi.bin # Загружаемый образ ЗОСРВ «Нейтрино»
|
||||
| `--> *.build # Файлы построения загрузочных образов
|
||||
|--> install/ # Бинарные компоненты, собираемые из исходных кодов
|
||||
| `--> usr/include/ # Заголовочные файлы
|
||||
`--> src/ # Исходные коды компонентов ППМ
|
||||
@endoutput
|
||||
|
||||
@prev{./00-UserGuide.html|table_of_articles||3}
|
23
docs/04-Install.dox
Normal file
23
docs/04-Install.dox
Normal file
@ -0,0 +1,23 @@
|
||||
@page "Install" Установка и настройка
|
||||
|
||||
@brief Установка и настройка
|
||||
|
||||
@br
|
||||
Распаковывать архив с ППМ следует на инструментальной машине @a x86_64 c ОС @a Linux с установленным комплектом разработчика ЗОСРВ «Нейтрино».
|
||||
|
||||
Для распаковки ППМ следует скопировать архив в рабочий каталог и выполнить команду:
|
||||
|
||||
@output{shell}
|
||||
$ tar xzf kpda-bsp-allwinner-h3-orangepipc-*.tar.gz
|
||||
@endoutput
|
||||
|
||||
Для сборки ППМ выполните следующие команды:
|
||||
|
||||
@output{shell}
|
||||
$ cd kpda-bsp-allwinner-h3-orangepipc
|
||||
$ make
|
||||
@endoutput
|
||||
|
||||
В результате будет произведена сборка ППМ и подготовлен загрузочный образ ЗОСРВ «Нейтрино» @c ifs-h3-orangepi.bin.
|
||||
|
||||
@prev{./00-UserGuide.html|table_of_articles||4}
|
124
docs/05-Boot.dox
Normal file
124
docs/05-Boot.dox
Normal file
@ -0,0 +1,124 @@
|
||||
@page "Boot" Загрузка образа ОС
|
||||
|
||||
@brief Загрузка образа ОС
|
||||
|
||||
@@item Загрузка образа по сети
|
||||
@@item Загрузка образа с SD карты памяти
|
||||
@@item Результат загрузки образа
|
||||
@@item Сохранение варианта загрузки по-умолчанию
|
||||
|
||||
@group boot_net
|
||||
|
||||
Для загрузки образа ЗОСРВ «Нейтрино» на ПМ по сети используется протокол TFTP. На инструментальной системе необходимо настроить TFTP сервер и скопировать полученный загрузочный образ @c ifs-h3-orangepi.bin в каталог, использующийся TFTP сервером.
|
||||
|
||||
@br
|
||||
Затем следует подключить отладочный USB-UART ПМ к USB порту инструментального ПК, проверить наличие устройства `/dev/ttyUSB*` и запустить терминальную программу, например, minicom со следующими параметрами: скорость 115200, 8 бит, без контроля четности, 1 стоп-бит, порт `/dev/ttyUSB0`.
|
||||
|
||||
@br
|
||||
После включения питания ПМ в терминальной программе должен присутствовать отладочный вывод загрузчика U-Boot. Например:
|
||||
|
||||
@output{shell}
|
||||
U-Boot SPL 2020.04-orangepi (Oct 26 2020 - 16:27:23 +0800)
|
||||
DRAM: 1024 MiB
|
||||
Trying to boot from MMC1
|
||||
|
||||
|
||||
U-Boot 2020.04-orangepi (Oct 26 2020 - 16:27:23 +0800) Allwinner Technology
|
||||
|
||||
CPU: Allwinner H3 (SUN8I 1680)
|
||||
Model: Xunlong Orange Pi PC
|
||||
DRAM: 1 GiB
|
||||
MMC: mmc@1c0f000: 0
|
||||
Loading Environment from FAT... Unable to use mmc 0:1... In: serial@1c28000
|
||||
Out: serial@1c28000
|
||||
Err: serial@1c28000
|
||||
Net: phy interface0
|
||||
eth0: ethernet@1c30000
|
||||
starting USB...
|
||||
Bus usb@1c1a000: USB EHCI 1.00
|
||||
Bus usb@1c1a400: USB OHCI 1.0
|
||||
Bus usb@1c1b000: USB EHCI 1.00
|
||||
Bus usb@1c1b400: USB OHCI 1.0
|
||||
Bus usb@1c1c000: USB EHCI 1.00
|
||||
Bus usb@1c1c400: USB OHCI 1.0
|
||||
Bus usb@1c1d000: USB EHCI 1.00
|
||||
Bus usb@1c1d400: USB OHCI 1.0
|
||||
scanning bus usb@1c1a000 for devices... 1 USB Device(s) found
|
||||
scanning bus usb@1c1a400 for devices... 1 USB Device(s) found
|
||||
scanning bus usb@1c1b000 for devices... 1 USB Device(s) found
|
||||
scanning bus usb@1c1b400 for devices... 1 USB Device(s) found
|
||||
scanning bus usb@1c1c000 for devices... 1 USB Device(s) found
|
||||
scanning bus usb@1c1c400 for devices... 1 USB Device(s) found
|
||||
scanning bus usb@1c1d000 for devices... 1 USB Device(s) found
|
||||
scanning bus usb@1c1d400 for devices... 1 USB Device(s) found
|
||||
scanning usb for storage devices... 0 Storage Device(s) found
|
||||
Autoboot in 1 seconds, press <Space> to stop
|
||||
=>
|
||||
@endoutput
|
||||
|
||||
@br
|
||||
Для загрузки образа ЗОСРВ «Нейтрино» cледует остановить загрузку и в консоли загрузчика U-Boot выполнить следующие команды:
|
||||
@ul
|
||||
@item Указать IP-адрес TFTP сервера:
|
||||
|
||||
@output{shell}
|
||||
=> setenv serverip 172.16.0.16
|
||||
=> setenv gatewayip 172.16.0.16
|
||||
@endoutput
|
||||
|
||||
@item Установить IP-адрес модулю, для организации обмена по протоколу TFTP:
|
||||
|
||||
@output{shell}
|
||||
=> setenv ipaddr 172.16.10.44
|
||||
@endoutput
|
||||
|
||||
@item Загрузить образ по протоколу TFTP и запустить его:
|
||||
|
||||
@output{shell}
|
||||
=> tftpboot 0x41000000 ifs-h3-orangepi.bin
|
||||
=> go 0x41000000
|
||||
@endoutput
|
||||
@endul
|
||||
|
||||
|
||||
@group boot_sd
|
||||
|
||||
Для загрузки образа ЗОСРВ «Нейтрино» с карты памяти SD/microSD, скопируйте заранее подготовленный загрузочный образ @c ifs-h3-orangepi.bin на FAT раздел карты памяти и после включения питания ПМ в консоли загрузчика U-Boot выполните следующие команды:
|
||||
|
||||
@output{shell}
|
||||
=> fatload mmc 0 0x41000000 ifs-h3-orangepi.bin
|
||||
=> go 0x41000000
|
||||
@endoutput
|
||||
|
||||
|
||||
@group boot_kpda
|
||||
|
||||
В результате выполнения приведенных выше команд должен запуститься образ ЗОСРВ, выведены сообщения о ходе загрузки и запущен командный интерпретатор. Пример вывода:
|
||||
|
||||
@output{shell}
|
||||
System page at phys:40022000 user:fc410000 kern:fc410000
|
||||
Starting next program at vfe0820ac
|
||||
cpu_startnext: cpu0 -> fe0820ac
|
||||
cpu_startnext: invoking vstart:4100a720 sysp:fc410000 eip:fe0820ac cpu:00000000
|
||||
VFPv3: fpsid=41023075
|
||||
coproc_attach(10): attach fe099c78 (fe09b750)
|
||||
coproc_attach(11): attach fe099c78 (fe09b750)
|
||||
Welcome to KPDA Neutrino on the OrangePi PC Allwinner H3 (ARMv7 Cortex-A7 QuadCore) - Board
|
||||
Starting common servers...
|
||||
Starting UART serial driver...
|
||||
Starting Network driver...
|
||||
#
|
||||
@endoutput
|
||||
|
||||
|
||||
@group boot_auto
|
||||
|
||||
Для сохранения параметров загрузки и выполнения требуемого вариант загрузки по-умолчанию автоматически при включении питании модуля, в консоли U-Boot установите переменную окружения @b bootcmd и сохраните значение переменных c помощью команды @b saveenv, например:
|
||||
|
||||
@output{shell}
|
||||
=> setenv kpdaboot_net “tftpboot 0x41000000 ifs-h3-orangepi.bin; go 0x41000000”
|
||||
=> setenv bootcmd run kpdaboot_net
|
||||
=> saveenv
|
||||
@endoutput
|
||||
|
||||
@prev{./00-UserGuide.html|table_of_articles||5}
|
29
docs/10-Components.dox
Normal file
29
docs/10-Components.dox
Normal file
@ -0,0 +1,29 @@
|
||||
@page "10-Components" Описание компонентов
|
||||
|
||||
@brief Описание компонентов, используемых в ППМ
|
||||
|
||||
@@item Список компонентов, входящих в состав ППМ
|
||||
@@item Список стандартных компонентов, используемых в ППМ
|
||||
|
||||
|
||||
|
||||
@group table_of_drivers
|
||||
|
||||
Описание компонентов, входящих в состав ППМ.
|
||||
@@table[width:40:60:width] Раздел @| Описание
|
||||
|
||||
|
||||
|
||||
@group table_of_std_drivers
|
||||
|
||||
Описание стандартных компонентов, не входящих в состав ППМ.
|
||||
@table[width:40:60:width]
|
||||
@tr Компонент @| Описание
|
||||
@tr @center @l{devc-ser8250} @endcenter @| Менеджер последовательных 8250-совместимых каналов связи
|
||||
@endtable
|
||||
|
||||
@hint
|
||||
Опции запуска по умолчанию для указанных компонентов можно посмотреть на странице @link{./Verification.html#base_comp}"Проверка функционирования"@endlink.
|
||||
@endhint
|
||||
|
||||
@prev{./00-UserGuide.html|table_of_articles||10}
|
268
docs/11-Verification.dox
Normal file
268
docs/11-Verification.dox
Normal file
@ -0,0 +1,268 @@
|
||||
@page "Verification" Проверка функционирования
|
||||
|
||||
@brief Проверка функционирования ППМ OrangePi-PC Allwinner-H3 под ЗОСРВ «Нейтрино».
|
||||
|
||||
|
||||
@br
|
||||
Список проверок:
|
||||
@@item Базовые проверки функционирования ОС
|
||||
@@@item Проверка запуска на ПМ ядра ЗОСРВ в составе загружаемого образа
|
||||
@@@item Проверка запуска компонентов
|
||||
@@@item Проверка функционирования контроллера DDR памяти
|
||||
@@@item Проверка функционирования контроллера прерываний
|
||||
@@@item Проверка функционирования таймера
|
||||
@@@item Проверка работы ЗОСРВ на ЦП в режиме симметричной мультипроцессорности (SMP) с поддержкой всех CPU ядер типа Cortex-A7
|
||||
@@item Проверки интерфейсов
|
||||
@@@item Проверка драйвера контроллера UART
|
||||
@@@item Проверка драйвера контроллера Gigabit Ethernet
|
||||
|
||||
|
||||
|
||||
@par Тестовый стенд
|
||||
|
||||
Тестовый стенд представляет из себя отладочный модуль OrangePi-PC, соединённый с инструментальным ПК по интерфейсам RS-232 и Ethernet.
|
||||
|
||||
@br
|
||||
На инструментальный ПК должно быть установлено:
|
||||
@ul
|
||||
@item ОС семейства GNU Linux, например, Ubuntu 20.04
|
||||
@item Комплект разработчика для ЗОСРВ «Нейтрино»
|
||||
@item ППМ OrangePi-PC Allwinner-H3
|
||||
@item Терминальная программа для отладочной консоли модуля OrangePi-PC, например, minicom
|
||||
@endul
|
||||
|
||||
|
||||
|
||||
@par Подготовка
|
||||
|
||||
Перед проведением проверок необходимо запустить ЗОСРВ «Нейтрино» на отладочном модуле OrangePi-PC в соответствии с главой документации @link{./Boot.html}Загрузка образа ОС@endlink.
|
||||
|
||||
@br
|
||||
Дополнительные тестовые программы @a rr, @a ticksize и другие не входят в состав ППМ и должны быть самостоятельно загружены из @link{https://git.kpda.ru/utils/hw}публичного git-репозитория@endlink и собраны командой:
|
||||
|
||||
@output{shell}
|
||||
$ cd utils
|
||||
$ make install
|
||||
@endoutput
|
||||
|
||||
Затем следует скопировать @a armle-v7 версии тестовых программ на SD карту памяти и подключить её к OrangePi-PC или передать файлы по сети с помощью @l{Настройка FTP сервера|FTP} или @l{Настройка NFS сервера|NFS}.
|
||||
|
||||
|
||||
|
||||
@group base
|
||||
|
||||
@group base_run
|
||||
В последовательном терминале выполнить команду:
|
||||
|
||||
@output{shell}# uname -s @endoutput
|
||||
|
||||
Проверка считается выполненной успешно, если в терминале будет выведено сообщение вида:
|
||||
|
||||
@output{shell}KPDA @endoutput
|
||||
|
||||
|
||||
@group base_comp
|
||||
|
||||
Для вывода информации о запущенных компонентов выполнить команду @l{pidin|pidin ar}:
|
||||
|
||||
@output{shell}
|
||||
# pidin ar
|
||||
pid Arguments
|
||||
1 procnto-smp -vvv -ae
|
||||
2 slogger -s 16384k
|
||||
3 pipe
|
||||
4 devc-ser8250 -e -F -b115200 -c24000000/16 0x01C28000^2,32
|
||||
5 random -t
|
||||
6 io-pkt-v4-hc-ksz -dsun8i
|
||||
4103 sh
|
||||
4104 pidin ar
|
||||
@endoutput
|
||||
|
||||
|
||||
@group base_mem
|
||||
|
||||
Для вывода информации о процессоре и доступной оперативной памяти выполнить команду @l{pidin|pidin info}:
|
||||
|
||||
@output{shell}
|
||||
# pidin info
|
||||
CPU:ARM Release:trunk FreeMem:992Mb/1024Mb BootTime:Jan 01 00:00:00 UTC 1970
|
||||
Processes: 8, Threads: 28
|
||||
Processor1: 1091551349 Cortex A7 228MHz FPU
|
||||
Processor2: 1091551349 Cortex A7 228MHz FPU
|
||||
Processor3: 1091551349 Cortex A7 228MHz FPU
|
||||
Processor4: 1091551349 Cortex A7 228MHz FPU
|
||||
@endoutput
|
||||
|
||||
Для проверки функционирования контроллера оперативной памяти используется утилита @a memcheck. Ее требуется запустить и дождаться завершения проверки:
|
||||
|
||||
@output{shell}# /tmp/memcheck @endoutput
|
||||
|
||||
Проверка считается выполненной успешно, если выведено сообщение:
|
||||
|
||||
@output{shell}PASS: all memory allocated @endoutput
|
||||
|
||||
|
||||
|
||||
@group base_interrupts
|
||||
|
||||
Для вывода информации о используемых прерываниях выполнить команду @l{pidin|pidin ir}:
|
||||
|
||||
@output{shell}
|
||||
# pidin ir
|
||||
pid tid name
|
||||
1 1 procnto-smp
|
||||
1 2 procnto-smp
|
||||
1 3 procnto-smp
|
||||
1 4 procnto-smp
|
||||
0 0x1b 0 -P- @0xfe08a2c4:0x0
|
||||
1 5 procnto-smp
|
||||
1 6 procnto-smp
|
||||
1 7 procnto-smp
|
||||
1 8 procnto-smp
|
||||
1 9 procnto-smp
|
||||
1 10 procnto-smp
|
||||
1 11 procnto-smp
|
||||
1 12 procnto-smp
|
||||
1 13 procnto-smp
|
||||
1 14 procnto-smp
|
||||
1 16 procnto-smp
|
||||
2 1 slogger
|
||||
3 1 pipe
|
||||
3 2 pipe
|
||||
3 3 pipe
|
||||
4 1 devc-ser8250
|
||||
1 0x20 0 --- @0x804ab30:0x805d1c0
|
||||
5 1 random
|
||||
5 2 random
|
||||
5 3 random
|
||||
6 1 io-pkt-v4-hc-ksz
|
||||
6 2 io-pkt-v4-hc-ksz
|
||||
2 0x72 0 T-- @0x78002d5c:0x818f2c0
|
||||
6 3 io-pkt-v4-hc-ksz
|
||||
4103 1 sh
|
||||
20488 1 pidin
|
||||
@endoutput
|
||||
|
||||
Проверка считается пройденной успешно, если вывод утилиты @l{pidin|pidin ir} содержит информацию об обработчиках прерывания, принадлежащих выполняемым процессам, в формате
|
||||
|
||||
@output{shell}
|
||||
pid tid Имя процесса
|
||||
id прерывания vector mask_count flags handler:area
|
||||
@endoutput
|
||||
|
||||
|
||||
|
||||
@group base_system_timer
|
||||
|
||||
Для проверки функционирования системного таймера необходимо воспользоваться программой @a ticksize:
|
||||
|
||||
@output{shell}# /tmp/ticksize @endoutput
|
||||
|
||||
Проверка считается выполненной успешно, если вывод данной программы содержит аналогичные строки:
|
||||
|
||||
@output{shell}
|
||||
System timer ticksize: 1000 mks
|
||||
Measuring system timer interrupt latency for 10 sec...
|
||||
|
||||
------------------------------------
|
||||
System Timer Latency = 0.54 mks
|
||||
------------------------------------
|
||||
@endoutput
|
||||
|
||||
|
||||
|
||||
@group base_smp
|
||||
|
||||
Для вывода информации о количестве процессоров выполнить команду @l{pidin|pidin info}:
|
||||
|
||||
@output{shell}
|
||||
# pidin info
|
||||
CPU:ARM Release:trunk FreeMem:992Mb/1024Mb BootTime:Jan 01 00:00:00 UTC 1970
|
||||
Processes: 8, Threads: 28
|
||||
Processor1: 1091551349 Cortex A7 228MHz FPU
|
||||
Processor2: 1091551349 Cortex A7 228MHz FPU
|
||||
Processor3: 1091551349 Cortex A7 228MHz FPU
|
||||
Processor4: 1091551349 Cortex A7 228MHz FPU
|
||||
@endoutput
|
||||
|
||||
Для проверки функционирования на всех ядрах выполнить следующее:
|
||||
|
||||
@output{shell}
|
||||
# for cpu in 0 1 2 3; do on -C$cpu pidin -P pidin -fl; done
|
||||
@endoutput
|
||||
|
||||
Проверка считается выполненной успешно, если вывод содержит следующие строки:
|
||||
|
||||
@output{shell}
|
||||
cpu
|
||||
0
|
||||
cpu
|
||||
1
|
||||
cpu
|
||||
2
|
||||
cpu
|
||||
3
|
||||
@endoutput
|
||||
|
||||
|
||||
|
||||
@group bsp
|
||||
|
||||
@group bsp_uart
|
||||
|
||||
Для работы с последовательным портом используется драйвер @l{devc-ser8250}. Настройки последовательного порта по умолчанию: скорость 115200, 8 бит, без контроля четности, 1 стоп-бит. В составе загрузочного образа драйвер запускается автоматически.
|
||||
|
||||
В случае успешного запуска драйвера в директории `/dev/` будет создано устройство @c ser1.
|
||||
|
||||
@output{shell}
|
||||
# ls /dev/ser*
|
||||
/dev/ser1
|
||||
@endoutput
|
||||
|
||||
Для проверки функционирования драйвера UART подключить ПМ к ПК через преобразователь по USB в один из разъемов и запустить терминальную программу @a minicom. В последовательном или удалённом терминале выполнить следующую команду:
|
||||
|
||||
@output{shell}
|
||||
# echo Test message > /dev/ser1
|
||||
@endoutput
|
||||
|
||||
Проверка считается выполненной успешно, если в терминальной программе будет выведено сообщение:
|
||||
|
||||
@output{shell}
|
||||
Test message
|
||||
@endoutput
|
||||
|
||||
|
||||
|
||||
@group bsp_ethernet
|
||||
|
||||
Для работы с контроллером интерфейса Gigabit Ethernet используется драйвер @l{devnp-sun8i.so} и менеджер ресурсов @l{io-pkt-*|io-pkt-v4-hc-ksz}. В составе загрузочного образа драйвер запускается автоматически. Для вывода информации о сетевых интерфейсах выполнить команду @l{ifconfig}.
|
||||
|
||||
В случае успешного запуска драйвера будет создан сетевой интерфейс @a xzynq0 и в результате выполнения команды @l{ifconfig} на экран будут выведены данные, аналогичные следующим, с указанием текущего ip-адреса, маски и широковещательного адреса:
|
||||
|
||||
@output{shell}
|
||||
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33192
|
||||
inet 127.0.0.1 netmask 0xff000000
|
||||
sun0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
|
||||
address: f2:b4:15:84:4c:8b
|
||||
media: Ethernet autoselect (100baseTX full-duplex)
|
||||
status: active
|
||||
inet <ip адрес> netmask <маска> broadcast <широковещательный адрес>
|
||||
@endoutput
|
||||
|
||||
Для проверки функционирования сетевого обмена выполнить следующую команду, инициирующую отправку ICMP пакетов существующему сетевому узлу:
|
||||
|
||||
@output{shell}
|
||||
# ping -c 3 <ip получателя>
|
||||
PING <ip получателя> (<ip получателя>): 56 data bytes
|
||||
64 bytes from <ip получателя>: icmp_seq=0 ttl=64 time=0 ms
|
||||
64 bytes from <ip получателя>: icmp_seq=1 ttl=64 time=0 ms
|
||||
64 bytes from <ip получателя>: icmp_seq=2 ttl=64 time=0 ms
|
||||
|
||||
----<ip получателя> PING Statistics----
|
||||
3 packets transmitted, 3 packets received, 0% packet loss
|
||||
round-trip min/avg/max = 0/0/0 ms variance = 0 ms^2
|
||||
@endoutput
|
||||
|
||||
Проверка считается выполненной успешно, если все 3 пакета были успешно получены (процент потерь равен нулю).
|
||||
|
||||
@prev{./00-UserGuide.html|table_of_articles||11}
|
8
docs/20-KnownIssues.dox
Normal file
8
docs/20-KnownIssues.dox
Normal file
@ -0,0 +1,8 @@
|
||||
@page "KnownIssues" Известные особенности
|
||||
|
||||
@brief Известные особенности и ограничения текущей версии пакета поддержки
|
||||
|
||||
@br
|
||||
Известные особенности отсутствуют
|
||||
|
||||
@prev{./00-UserGuide.html|table_of_articles||20}
|
5
docs/21-ReleaseNotes.dox
Normal file
5
docs/21-ReleaseNotes.dox
Normal file
@ -0,0 +1,5 @@
|
||||
@page "ReleaseNotes" Журнал изменений BSP для OrangePi-PC Allwinner-H3
|
||||
|
||||
@brief Журнал и история изменений компонентов пакета поддержки
|
||||
|
||||
@prev{./00-UserGuide.html|table_of_articles||21}
|
11
docs/caption.inc
Normal file
11
docs/caption.inc
Normal file
@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
|
||||
################################################################
|
||||
## Переменные окружения с названием документа для gendoc
|
||||
################################################################
|
||||
|
||||
export GENDOC_PROJECT_NAME="Руководство пользователя"
|
||||
export GENDOC_PROJECT_BRIEF="Руководство пользователя пакета поддержки платы OrangePi-PC на основе интегральной микросхемы Allwinner-H3 под ЗОСРВ «Нейтрино»"
|
||||
|
||||
export GENDOC_PROJECT_VERSION=""
|
||||
export GENDOC_IGNORE_MISSING_AUTOLINK_ERRORS="yes"
|
18
exclude.inc
Normal file
18
exclude.inc
Normal file
@ -0,0 +1,18 @@
|
||||
# Include file for bsp-release.sh script
|
||||
|
||||
# Multithread build
|
||||
JLEVEL=$(nproc)
|
||||
|
||||
PACKAGE_SRCZIP_IGNORE=\
|
||||
"-x*.git/* "\
|
||||
"-x*.git* "\
|
||||
"-x*prebuilt/.* "\
|
||||
"-x*src/hardware/devu/* "\
|
||||
""
|
||||
|
||||
PACKAGE_SRCTAR_IGNORE=\
|
||||
"--exclude=src/hardware/devu"\
|
||||
""
|
||||
|
||||
PACKAGE_BINTAR_IGNORE=\
|
||||
""
|
19
images/Makefile
Normal file
19
images/Makefile
Normal file
@ -0,0 +1,19 @@
|
||||
ROOT_DIR := $(notdir $(CURDIR))
|
||||
ifndef QCONFIG
|
||||
QCONFIG=qconfig.mk
|
||||
endif
|
||||
include $(QCONFIG)
|
||||
|
||||
HOST_MKIFS := mkifs
|
||||
|
||||
SUFFIXES := .build .ifs .raw
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: ifs-h3-orangepi.bin
|
||||
|
||||
clean:
|
||||
$(RM_HOST) ifs-h3-orangepi.bin
|
||||
|
||||
ifs-h3-orangepi.bin: orangepi.build
|
||||
$(HOST_MKIFS) -r../install -v $(MKIFSFLAGS) $^ $@
|
216
images/orangepi.build
Normal file
216
images/orangepi.build
Normal file
@ -0,0 +1,216 @@
|
||||
###########################################################################
|
||||
##
|
||||
## KPDA Neutrino trunk on the OrangePi PC Allwinner H3 (ARMv7 Cortex-A7 QuadCore) Board
|
||||
##
|
||||
###########################################################################
|
||||
##
|
||||
## SUPPORTED DEVICES:
|
||||
##
|
||||
## UART_SERIAL: devc-ser8250
|
||||
## NETWORK: devnp-sun8i
|
||||
##
|
||||
###########################################################################
|
||||
##
|
||||
## NOTES:
|
||||
##
|
||||
###########################################################################
|
||||
|
||||
###########################################################################
|
||||
## START OF BUILD SCRIPT
|
||||
###########################################################################
|
||||
|
||||
[image=0x41000000]
|
||||
[virtual=armle-v7,raw] .bootstrap = {
|
||||
|
||||
startup-orangepi -vvv
|
||||
|
||||
PATH=:/proc/boot:/bin:/usr/bin:/sbin:/usr/sbin LD_LIBRARY_PATH=:/proc/boot:/lib:/usr/lib:/lib/dll procnto-smp -vvv -ae
|
||||
}
|
||||
|
||||
[+script] .script = {
|
||||
# Initialise the console
|
||||
procmgr_symlink ../../proc/boot/libc.so.3 /usr/lib/ldqnx.so.2
|
||||
|
||||
display_msg Welcome to KPDA Neutrino on the OrangePi PC Allwinner H3 (ARMv7 Cortex-A7 QuadCore) - Board
|
||||
|
||||
|
||||
display_msg Starting common servers...
|
||||
slogger -s 16384k
|
||||
pipe
|
||||
|
||||
|
||||
#######################################################################
|
||||
## UART driver
|
||||
## UART0 (0x01C28000) -> stdout
|
||||
#######################################################################
|
||||
display_msg Starting UART serial driver...
|
||||
devc-ser8250 -e -F -b115200 -c24000000/16 0x01C28000^2,32
|
||||
waitfor /dev/ser1
|
||||
reopen /dev/ser1
|
||||
|
||||
|
||||
#######################################################################
|
||||
## These env variables are inherited by all the programs which follow
|
||||
#######################################################################
|
||||
SYSNAME=nto
|
||||
TERM=qansi
|
||||
HOME=/
|
||||
PATH=:/proc/boot:/bin:/usr/bin:/sbin:/usr/sbin:/opt/bin:/usr/photon/bin
|
||||
LD_LIBRARY_PATH=:/proc/boot:/lib:/usr/lib:/lib/dll:/opt/lib
|
||||
|
||||
random -t
|
||||
|
||||
#######################################################################
|
||||
## Network driver
|
||||
#######################################################################
|
||||
display_msg Starting Network driver...
|
||||
io-pkt-v4-hc-ksz -dsun8i
|
||||
ifconfig sun0 192.168.1.2/24 up
|
||||
|
||||
[+session] sh &
|
||||
}
|
||||
|
||||
|
||||
# Redirect console messages
|
||||
[type=link] /bin/sh=/proc/boot/ksh
|
||||
[type=link] /dev/console=/dev/ser1
|
||||
[type=link] /tmp=/dev/shmem
|
||||
[type=link] /var/log=/tmp
|
||||
[type=link] /usr/tmp=/tmp
|
||||
[type=link] /bin/login=/proc/boot/login
|
||||
|
||||
|
||||
###########################################################################
|
||||
## Системные библиотеки
|
||||
###########################################################################
|
||||
libc.so
|
||||
libm.so
|
||||
libz.so
|
||||
libc.so.3
|
||||
[type=link] /lib/libc.so=/proc/boot/libc.so.3
|
||||
[type=link] /lib/libc.so.2=/proc/boot/libc.so.3
|
||||
[type=link] /lib/libc.so.3=/proc/boot/libc.so.3
|
||||
[type=link] /usr/lib/ldqnx.so.2=/proc/boot/libc.so.3
|
||||
|
||||
|
||||
###########################################################################
|
||||
## Библиотеки работы с диском и файловые системы
|
||||
###########################################################################
|
||||
fs-qnx4.so
|
||||
fs-qnx6.so
|
||||
libcam.so
|
||||
io-blk.so
|
||||
cam-disk.so
|
||||
fs-dos.so
|
||||
cam-cdrom.so
|
||||
fs-cd.so
|
||||
fs-udf.so
|
||||
|
||||
|
||||
###########################################################################
|
||||
## Драйверы USB и устройств ввода
|
||||
###########################################################################
|
||||
libhiddi.so
|
||||
libusbdi.so
|
||||
devu-ehci.so
|
||||
devu-ohci.so
|
||||
devh-usb.so
|
||||
|
||||
|
||||
###########################################################################
|
||||
## Сетевые драйверы
|
||||
###########################################################################
|
||||
devnp-shim.so
|
||||
libsocket.so
|
||||
lsm-qnet.so
|
||||
devnp-sun8i.so
|
||||
|
||||
|
||||
[data=c]
|
||||
#######################################################################
|
||||
## Драйверы последовательных портов
|
||||
#######################################################################
|
||||
devc-ser8250
|
||||
/bin/stty=stty
|
||||
|
||||
|
||||
#######################################################################
|
||||
## Драйверы ввода
|
||||
#######################################################################
|
||||
devu-kbd
|
||||
devu-mouse
|
||||
|
||||
|
||||
###########################################################################
|
||||
## Системные сервисы и утилиты
|
||||
###########################################################################
|
||||
ksh
|
||||
sh
|
||||
pipe
|
||||
mqueue
|
||||
cp
|
||||
mkdir
|
||||
ls
|
||||
pidin
|
||||
rm
|
||||
mv
|
||||
on
|
||||
uname
|
||||
slay
|
||||
sync
|
||||
mount
|
||||
umount
|
||||
shutdown
|
||||
less
|
||||
setconf
|
||||
getconf
|
||||
grep
|
||||
rtc
|
||||
date
|
||||
fdisk
|
||||
cat
|
||||
chown
|
||||
chmod
|
||||
use
|
||||
which
|
||||
dcheck
|
||||
usb
|
||||
pci
|
||||
devc-pty
|
||||
waitfor
|
||||
sloginfo
|
||||
sleep
|
||||
date
|
||||
|
||||
|
||||
###########################################################################
|
||||
## Менеджеры ресурсов: PCI, сеть, графика, аудио, драйвер диска и т.д.
|
||||
###########################################################################
|
||||
io-pkt-v4-hc-ksz
|
||||
io-usb
|
||||
io-hid
|
||||
usb
|
||||
devb-umass
|
||||
slogger
|
||||
|
||||
|
||||
###########################################################################
|
||||
## Сетевые утилиты
|
||||
###########################################################################
|
||||
fs-nfs3
|
||||
hostname
|
||||
ifconfig
|
||||
inetd
|
||||
ping
|
||||
telnetd
|
||||
ftpd
|
||||
nicinfo
|
||||
dhcp.client
|
||||
if_up
|
||||
netstat
|
||||
route
|
||||
random
|
||||
|
||||
###########################################################################
|
||||
## END OF BUILD SCRIPT
|
||||
###########################################################################
|
15
images/tftp.sh
Executable file
15
images/tftp.sh
Executable file
@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -ex
|
||||
|
||||
TFTP_SERIAL=${TTY_SERIAL:-/dev/ttyUSB0}
|
||||
TFTP_CLIENT=172.16.7.99
|
||||
TFTP_SERVER=172.16.7.7
|
||||
|
||||
image="ifs-h3-orangepi.bin"
|
||||
|
||||
tftp -R 6969:6969 $TFTP_SERVER -c put $image $image
|
||||
echo "setenv ipaddr $TFTP_CLIENT" > $TFTP_SERIAL
|
||||
echo "setenv serverip $TFTP_SERVER" > $TFTP_SERIAL
|
||||
echo "setenv gatewayip $TFTP_SERVER" > $TFTP_SERIAL
|
||||
echo "tftpboot 0x41000000 $image; go 0x41000000" > $TFTP_SERIAL
|
4
src/Makefile
Normal file
4
src/Makefile
Normal file
@ -0,0 +1,4 @@
|
||||
LIST=ALL
|
||||
EARLY_DIRS=lib
|
||||
LATE_DIRS=apps
|
||||
include recurse.mk
|
3
src/hardware/Makefile
Normal file
3
src/hardware/Makefile
Normal file
@ -0,0 +1,3 @@
|
||||
LIST=hardware
|
||||
EARLY_DIRS=dma devu
|
||||
include recurse.mk
|
2
src/hardware/devnp/Makefile
Normal file
2
src/hardware/devnp/Makefile
Normal file
@ -0,0 +1,2 @@
|
||||
LIST=DEVNP
|
||||
include recurse.mk
|
2
src/hardware/devnp/sun8i/Makefile
Normal file
2
src/hardware/devnp/sun8i/Makefile
Normal file
@ -0,0 +1,2 @@
|
||||
LIST=CPU
|
||||
include recurse.mk
|
8
src/hardware/devnp/sun8i/arm/Makefile
Normal file
8
src/hardware/devnp/sun8i/arm/Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
LIST=VARIANT
|
||||
ifndef QRECURSE
|
||||
QRECURSE=recurse.mk
|
||||
ifdef QCONFIG
|
||||
QRDIR=$(dir $(QCONFIG))
|
||||
endif
|
||||
endif
|
||||
include $(QRDIR)$(QRECURSE)
|
1
src/hardware/devnp/sun8i/arm/dll.le.v7/Makefile
Normal file
1
src/hardware/devnp/sun8i/arm/dll.le.v7/Makefile
Normal file
@ -0,0 +1 @@
|
||||
include ../../common.mk
|
25
src/hardware/devnp/sun8i/common.mk
Normal file
25
src/hardware/devnp/sun8i/common.mk
Normal file
@ -0,0 +1,25 @@
|
||||
#
|
||||
# (c) 2014-2019, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
#
|
||||
|
||||
ifndef QCONFIG
|
||||
QCONFIG=qconfig.mk
|
||||
endif
|
||||
include $(QCONFIG)
|
||||
|
||||
ISKERNEL := 1
|
||||
NETDRIVERS_MK = $(firstword $(wildcard $(MKFILES_ROOT)/netdrivers.mk ../../../../../netdrivers.mk ../../netdrivers.mk))
|
||||
include $(NETDRIVERS_MK)
|
||||
|
||||
LIBS = drvrS cacheS
|
||||
LIBS += $(foreach libpath,$(LIBVPATH), $(if $(wildcard $(libpath)/libnetdrvrS.a), netdrvrS) )
|
||||
|
||||
NAME = devnp-sun8i
|
||||
|
||||
CCFLAGS += -Wall -Wextra -pedantic -Werror -std=gnu99
|
||||
|
||||
define PINFO
|
||||
PINFO DESCRIPTION=sample io-pkt ethernet driver.
|
||||
endef
|
||||
|
||||
include $(MKFILES_ROOT)/qtargets.mk
|
41
src/hardware/devnp/sun8i/devnp-sun8iso.dox
Normal file
41
src/hardware/devnp/sun8i/devnp-sun8iso.dox
Normal file
@ -0,0 +1,41 @@
|
||||
@page "devnp-sun8iso" devnp-sun8i.so
|
||||
|
||||
@brief Драйвер Ethernet контроллеров семейства процессоров Allwinner sun8i (на базе Cortex-A7)
|
||||
|
||||
@remark io-pkt-* -d sun8i [опция[,опция ...]] ...
|
||||
|
||||
@caution
|
||||
Для разделения опций используется запятая (но не пробелы).
|
||||
@endcaution
|
||||
|
||||
@par Платформы:
|
||||
|
||||
ЗОСРВ «Нейтрино»
|
||||
|
||||
@arch{armv7}
|
||||
|
||||
@par Описание:
|
||||
|
||||
Драйвер @a devnp-sun8i.so управляет Ethernet контроллерами семейства процессоров Allwinner sun8i (на базе Cortex-A7). Это драйвер @l{io-pkt-*}; имена интерфейсов назначаются в виде @a sunX, где @a X – целое число.
|
||||
|
||||
@par Поддерживаемые устройства:
|
||||
|
||||
@ul
|
||||
@item Ethernet контроллер процессора Allwinner H3
|
||||
@endul
|
||||
|
||||
@par Примеры:
|
||||
|
||||
Запуск @l{io-pkt-*} с использованием драйвера @a devnp-sun8i.so и полного стека TCP/IP:
|
||||
|
||||
@output{shell}io-pkt -d sun8i
|
||||
ifconfig sun0 192.168.0.10 @endoutput
|
||||
|
||||
@par Классификация:
|
||||
Базовые подсистемы ЗОСРВ «Нейтрино», Драйверы
|
||||
|
||||
@par Тематические ссылки:
|
||||
|
||||
@l{Драйверы|devn-*}, @l{Драйверы|devnp-*}, @l{ifconfig}, @l{io-pkt-*}, @l{nicinfo}
|
||||
|
||||
@prev{./10-Components.html|table_of_drivers||50}
|
36
src/hardware/devnp/sun8i/netdrivers.mk
Normal file
36
src/hardware/devnp/sun8i/netdrivers.mk
Normal file
@ -0,0 +1,36 @@
|
||||
|
||||
# We link the stack with -E so a lot of the undefined
|
||||
# references get resolved from the stack itself. If
|
||||
# you want them listed at link time, turn off
|
||||
# --allow-shlib-undefined and replace with --warn-once
|
||||
# if desired.
|
||||
|
||||
#LDFLAGS+=-Wl,--warn-once
|
||||
LDFLAGS+=-Wl,--allow-shlib-undefined
|
||||
|
||||
NETDRVR_ROOT:=$(patsubst %/,%, $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
|
||||
DEVNP_ROOT:=$(NETDRVR_ROOT)/hardware/devnp
|
||||
BSDDRVR_ROOT:=$(DEVNP_ROOT)/bsd
|
||||
LIBNBDRVR_ROOT:=$(NETDRVR_ROOT)/lib/libnbdrvr
|
||||
|
||||
HDR_PATH=$(INSTALL_ROOT_HDR)/io-pkt
|
||||
PUBLIC_HDR_PATH=$(KPDA_TARGET)/usr/include/io-pkt
|
||||
|
||||
# Check for staging area first
|
||||
EXTRA_INCVPATH+= $(HDR_PATH) $(HDR_PATH)/sys-nto
|
||||
# Use headers installed in system if staging area not available
|
||||
EXTRA_INCVPATH+= $(PRODUCT_ROOT) $(PUBLIC_HDR_PATH) $(PUBLIC_HDR_PATH)/sys-nto
|
||||
ifneq ($(NEED_QNXH),)
|
||||
CCFLAGS += -Wp,-include -Wp,$(if $(wildcard $(HDR_PATH)),$(HDR_PATH)/qnx.h,$(PUBLIC_HDR_PATH)/qnx.h)
|
||||
endif
|
||||
ifneq ($(NEED_LIBNBDRVR),)
|
||||
EXTRA_INCVPATH+=$(LIBNBDRVR_ROOT)
|
||||
endif
|
||||
ifneq ($(ISKERNEL),)
|
||||
CCFLAGS += -D_KERNEL
|
||||
endif
|
||||
CCFLAGS_e2k += -fkernel
|
||||
CCFLAGS += $(CCFLAGS_$(CPU))
|
||||
|
||||
# gcc sometime after 2.95.3 added a builtin log()
|
||||
CCFLAGS += -fno-builtin-log
|
1497
src/hardware/devnp/sun8i/sun8i.c
Normal file
1497
src/hardware/devnp/sun8i/sun8i.c
Normal file
File diff suppressed because it is too large
Load Diff
276
src/hardware/devnp/sun8i/sun8i.h
Normal file
276
src/hardware/devnp/sun8i/sun8i.h
Normal file
@ -0,0 +1,276 @@
|
||||
/*
|
||||
* (c) 2023, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __SUN8I_H__
|
||||
#define __SUN8I_H__
|
||||
|
||||
#define BIT(bit) (UINT32_C(1) << bit)
|
||||
#define GENMASK32(a, b) ((UINT32_MAX >> (32 - (b) - 1)) & (UINT32_MAX << (a)))
|
||||
|
||||
// Syscon address space
|
||||
#define AW_H3_SYS_CTRL_BASE 0x01c00000
|
||||
#define AW_H3_SYS_CTRL_SIZE 0x1000
|
||||
|
||||
// EMAC Clock Register, Syscon
|
||||
#define EMAC_CLK_REG 0x0030
|
||||
#define H3_EPHY_DEFAULT_VALUE 0x58000
|
||||
#define H3_EPHY_DEFAULT_MASK GENMASK32(16, 31)
|
||||
#define H3_EPHY_ADDR_SHIFT 20
|
||||
#define REG_PHY_ADDR_MASK GENMASK32(0, 4)
|
||||
#define SC_EPIT BIT(2) // 1: RGMII, 0: MII
|
||||
#define SC_RMII_EN BIT(13)
|
||||
#define H3_EPHY_SELECT BIT(15) // 1: internal PHY, 0: external PHY
|
||||
#define H3_EPHY_SHUTDOWN BIT(16) // 1: shutdown, 0: power up
|
||||
#define H3_EPHY_LED_POL BIT(17) // 1: active low, 0: active high
|
||||
#define H3_EPHY_CLK_SEL BIT(18) // 1: 24MHz, 0: 25MHz
|
||||
#define SC_ETCS_MASK 0x3
|
||||
|
||||
// CCU address space
|
||||
#define AW_H3_CCU_BASE 0x01c20000
|
||||
#define AW_H3_CCU_SIZE 0x400
|
||||
|
||||
// Clock source register, CCU
|
||||
#define BUS_CLK_GATING_REG0 0x0060
|
||||
#define BUS_CLK_GATING_REG0_EMAC_GATING BIT(17)
|
||||
|
||||
// Reset source register, CCU
|
||||
#define BUS_SOFT_RST_REG0 0x02C0
|
||||
#define BUS_SOFT_RST_REG0_EMAC_RST BIT(17)
|
||||
|
||||
// EPHY clock, CCU
|
||||
#define BUS_CLK_GATING_REG4 0x0070
|
||||
#define BUS_CLK_GATING_REG4_EPHY_GATING BIT(0)
|
||||
|
||||
// EPHY reset, CCU
|
||||
#define BUS_SOFT_RST_REG2 0x02c8
|
||||
#define BUS_SOFT_RST_REG2_EPHY_RST BIT(2)
|
||||
|
||||
// EMAC address space
|
||||
#define SUN8I_EMAC_BASE 0x01c30000
|
||||
#define SUN8I_EMAC_SIZE 0x10000
|
||||
|
||||
// EMAC Basic Control 0 Register (Link control)
|
||||
#define EMAC_CTL0 0x0000
|
||||
#define EMAC_CTL0_FULL_DUPLEX BIT(0)
|
||||
#define EMAC_CTL0_LOOPBACK BIT(1)
|
||||
#define EMAC_CTL0_SPEED_MASK (BIT(3) | BIT(2))
|
||||
#define EMAC_CTL0_10 (BIT(3))
|
||||
#define EMAC_CTL0_100 (BIT(3) | BIT(2))
|
||||
|
||||
// EMAC Basic Control 1 Register
|
||||
#define EMAC_CTL1 0x0004
|
||||
#define EMAC_CTL1_SOFT_RST BIT(0) // Soft reset
|
||||
#define EMAC_CTL1_BURST_SIZE(val) ((val & 0x3f) << 24) // RX/TX DMA transfer burst len
|
||||
|
||||
// EMAC Interrupt Status/Enable Register
|
||||
#define EMAC_INT_STA 0x0008
|
||||
#define EMAC_INT_EN 0x000c
|
||||
#define EMAC_INT_RX_INT BIT(8) // RX interrupt
|
||||
#define EMAC_INT_TX_INT BIT(0) // TX interrupt
|
||||
#define EMAC_INT_TX_UNDERFLOW_INT_EN BIT(4) // TX FIFO underflow error
|
||||
#define EMAC_INT_RX_UNDERFLOW_INT_EN BIT(12) // RX FIFO underflow error
|
||||
#define EMAC_INT_EN_MASK (EMAC_INT_RX_INT | EMAC_INT_TX_INT | EMAC_INT_RX_UNDERFLOW_INT_EN | EMAC_INT_TX_UNDERFLOW_INT_EN)
|
||||
|
||||
// EMAC Transmit Control 0 Register
|
||||
#define EMAC_TX_CTL0 0x0010
|
||||
#define EMAC_TX_CTL0_TX_EN BIT(31) // Enable transmitter
|
||||
|
||||
// EMAC Transmit Control 1 Register
|
||||
#define EMAC_TX_CTL1 0x0014
|
||||
#define EMAC_TX_CTL1_TX_MD BIT(1) // Transmission starts after a full frame located in TX DMA FIFO
|
||||
#define EMAC_TX_CTL1_TX_DMA_EN BIT(30) // Start and run TX DMA
|
||||
#define EMAC_TX_CTL1_TX_DMA_START BIT(31) // Start and run TX DMA
|
||||
|
||||
// EMAC Transmit DMA Descriptor List Address Register
|
||||
#define EMAC_TX_DMA_DESC 0x0020
|
||||
|
||||
// EMAC Receive Control 0 Register
|
||||
#define EMAC_RX_CTL0 0x0024
|
||||
#define EMAC_RX_CTL0_RX_EN BIT(31) // Enable receiver
|
||||
|
||||
// EMAC Receive Control 1 Register
|
||||
#define EMAC_RX_CTL1 0x0028
|
||||
#define EMAC_RX_CTL1_RX_MD BIT(1) // RX DMA reads data from RX DMA FIFO to host memory after a complete frame has been written to RX DMA FIFO
|
||||
#define EMAC_RX_CTL1_RX_DMA_EN BIT(30) // Start and run RX DMA
|
||||
|
||||
// EMAC Receive DMA Descriptor List Address Register
|
||||
#define EMAC_RX_DMA_DESC 0x0034
|
||||
|
||||
// EMAC MAC Address 0 High Register
|
||||
#define EMAC_ADDR0_HIGH 0x0050
|
||||
|
||||
// EMAC MAC Address 0 Low Register
|
||||
#define EMAC_ADDR0_LOW 0x0054
|
||||
|
||||
// EMAC MII Command Register
|
||||
#define EMAC_MII_CMD 0x0048
|
||||
#define MDIO_CMD_MII_BUSY BIT(0)
|
||||
#define MDIO_CMD_MII_WRITE BIT(1)
|
||||
#define MDIO_CMD_MII_PHY_REG_ADDR_MASK GENMASK32(4, 8)
|
||||
#define MDIO_CMD_MII_PHY_REG_ADDR_SHIFT 4
|
||||
#define MDIO_CMD_MII_PHY_ADDR_MASK GENMASK32(12, 16)
|
||||
#define MDIO_CMD_MII_PHY_ADDR_SHIFT 12
|
||||
#define MDIO_CMD_MDC_DIV_RATIO_M_128 (BIT(20) | BIT(21))
|
||||
|
||||
// EMAC MII Data Register
|
||||
#define EMAC_MII_DATA 0x004c
|
||||
|
||||
// Descriptors macros
|
||||
#define CONFIG_ETH_BUFSIZE 2048 // Note must be dma aligned
|
||||
#define CONFIG_ETH_RXSIZE 2044 // Note must fit in ETH_BUFSIZE
|
||||
#define SUN8I_DESC(buf, idx) (&((sun8i_desc_t *)(buf)->area)[(idx)])
|
||||
|
||||
// TX descriptors
|
||||
#define CONFIG_TX_DESCR_NUM 32
|
||||
#define SUN8I_TX_DESC(sun8i, idx) SUN8I_DESC(&(sun8i)->txb, (idx))
|
||||
#define TX_DESC_CTL BIT(31)
|
||||
#define TX_INT_CTL BIT(31)
|
||||
#define LAST_DESC BIT(30)
|
||||
#define FIR_DESC BIT(29)
|
||||
#define TX_HEADER_ERR BIT(16)
|
||||
#define TX_LENGHT_ERR BIT(14)
|
||||
#define TX_PAYLOAD_ERR BIT(12)
|
||||
#define TX_CRS_ERR BIT(10)
|
||||
#define TX_COL_ERR_0 BIT(9)
|
||||
#define TX_COL_ERR_1 BIT(8)
|
||||
#define TX_COL_CNT_MASK GENMASK32(3, 6)
|
||||
#define TX_COL_CNT_SHIFT 3
|
||||
#define TX_COL_CNT(status) (((status) & TX_COL_CNT_MASK) >> TX_COL_CNT_SHIFT)
|
||||
#define TX_DEFER_ERR BIT(2)
|
||||
#define TX_UNDERFLOW_ERR BIT(1)
|
||||
#define TX_DEFER BIT(0)
|
||||
#define ERROR_STATUS_MASK (TX_HEADER_ERR | TX_LENGHT_ERR | TX_PAYLOAD_ERR | TX_CRS_ERR | TX_COL_ERR_0 | TX_DEFER_ERR | TX_UNDERFLOW_ERR)
|
||||
|
||||
// RX descriptors
|
||||
#define CONFIG_RX_DESCR_NUM 32
|
||||
#define SUN8I_RX_DESC(sun8i, idx) SUN8I_DESC(&(sun8i)->rxb, (idx))
|
||||
#define RX_DESC_CTL BIT(31)
|
||||
#define RX_LAST_DESC BIT(8)
|
||||
#define RX_DESC_FRM_SIZE_MASK GENMASK32(16, 29)
|
||||
#define RX_DESC_FRM_SIZE(status) (((status) & RX_DESC_FRM_SIZE_MASK) >> 16)
|
||||
|
||||
#define CONFIG_SYS_HZ 1000
|
||||
#define CONFIG_MDIO_TIMEOUT (3 * CONFIG_SYS_HZ)
|
||||
#define EMAC_SOFT_RESET_TIMEOUT_USEC (100 * 1000)
|
||||
|
||||
#define SPI_INTERRUPT_START 0x20
|
||||
#define SUN8I_H3_INTERRUPT (SPI_INTERRUPT_START + 0x52)
|
||||
|
||||
const uint8_t etherbroadcastaddr[ETHER_ADDR_LEN] =
|
||||
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
enum emac_variant
|
||||
{
|
||||
H3_EMAC = 2,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
PHY_INTERFACE_MODE_MII = 1,
|
||||
PHY_INTERFACE_MODE_GMII,
|
||||
PHY_INTERFACE_MODE_SGMII,
|
||||
};
|
||||
|
||||
struct sun8i_desc
|
||||
{
|
||||
uint32_t status;
|
||||
uint32_t size;
|
||||
uint32_t addr;
|
||||
uint32_t next;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
typedef struct sun8i_desc sun8i_desc_t;
|
||||
|
||||
struct desc_buffer
|
||||
{
|
||||
void *area;
|
||||
size_t size;
|
||||
off_t dma;
|
||||
int prot_flags;
|
||||
int map_flags;
|
||||
int tmem_fd;
|
||||
|
||||
struct mbuf **mbufs_set;
|
||||
|
||||
int head;
|
||||
int tail;
|
||||
int cnt;
|
||||
int free_cnt;
|
||||
struct
|
||||
{
|
||||
uint64_t header;
|
||||
uint64_t length;
|
||||
uint64_t payload;
|
||||
uint64_t crs;
|
||||
uint64_t coll0;
|
||||
uint64_t coll1;
|
||||
uint64_t coll_cnt;
|
||||
uint64_t defer;
|
||||
uint64_t underflow;
|
||||
} err;
|
||||
};
|
||||
|
||||
typedef struct desc_buffer desc_buffer_t;
|
||||
|
||||
struct sun8i_dev
|
||||
{
|
||||
struct device dev;
|
||||
struct ethercom ec;
|
||||
struct ieee80211com ic;
|
||||
struct mii_data bsd_mii;
|
||||
int iid;
|
||||
int intr_cnt;
|
||||
int intr_spurious;
|
||||
void *sd_hook;
|
||||
|
||||
uintptr_t syscon_base;
|
||||
uintptr_t clk_base;
|
||||
uintptr_t emac_base;
|
||||
|
||||
enum emac_variant variant;
|
||||
|
||||
int use_internal_phy;
|
||||
|
||||
uint32_t mii_mode;
|
||||
uint32_t adv;
|
||||
nic_config_t cfg;
|
||||
nic_stats_t stats;
|
||||
struct _iopkt_self *iopkt;
|
||||
struct _iopkt_inter inter;
|
||||
|
||||
int speed;
|
||||
int duplex;
|
||||
|
||||
desc_buffer_t txb;
|
||||
desc_buffer_t rxb;
|
||||
|
||||
struct cache_ctrl cachectl;
|
||||
uint32_t irq_src;
|
||||
mdi_t *mdi;
|
||||
struct callout mii_callout;
|
||||
int linkup;
|
||||
int start_running;
|
||||
};
|
||||
|
||||
typedef struct sun8i_dev sun8i_dev_t;
|
||||
|
||||
struct sun8i_attach_args
|
||||
{
|
||||
uintptr_t syscon_base;
|
||||
uintptr_t clk_base;
|
||||
uintptr_t emac_base;
|
||||
|
||||
enum emac_variant variant;
|
||||
|
||||
int use_internal_phy;
|
||||
int phy_addr;
|
||||
|
||||
uint32_t mii_mode;
|
||||
nic_config_t cfg;
|
||||
struct _iopkt_self *iopkt;
|
||||
char *options;
|
||||
};
|
||||
|
||||
#endif
|
4
src/hardware/startup/Makefile
Normal file
4
src/hardware/startup/Makefile
Normal file
@ -0,0 +1,4 @@
|
||||
LATE_DIRS=boards
|
||||
CPULIST=arm
|
||||
VARIANTLIST=v7
|
||||
include recurse.mk
|
2
src/hardware/startup/boards/Makefile
Normal file
2
src/hardware/startup/boards/Makefile
Normal file
@ -0,0 +1,2 @@
|
||||
LIST=BOARD
|
||||
include recurse.mk
|
128
src/hardware/startup/boards/common.mk
Normal file
128
src/hardware/startup/boards/common.mk
Normal file
@ -0,0 +1,128 @@
|
||||
#
|
||||
# (c) 2010-2019, SWD Embedded Systems Limited, http://www.kpda.ru
|
||||
#
|
||||
ifndef QCONFIG
|
||||
QCONFIG=qconfig.mk
|
||||
endif
|
||||
include $(QCONFIG)
|
||||
|
||||
PSTAG_64 = .64
|
||||
LIB_VARIANT = $(subst .o,,a.$(COMPOUND_VARIANT))$(PSTAG_$(PADDR_SIZE))
|
||||
|
||||
LINKER_TYPE=BOOTSTRAP
|
||||
INSTALLDIR = boot/sys
|
||||
LIBS = startup$(subst .,-,$(PSTAG_$(PADDR_SIZE)))
|
||||
LIBS += $(foreach lib,ucl lz4-dec zstd-dec,$(if $(wildcard $(addsuffix /lib$(lib).a,$(LIBVPATH))), $(lib)) )
|
||||
LIBS += drvr
|
||||
|
||||
# The board level is one up from the CPU level
|
||||
BOARD_ROOT=$(patsubst %/,%,$(dir $(CPU_ROOT)))
|
||||
BOARD=$(notdir $(BOARD_ROOT))
|
||||
|
||||
NAME = startup-$(BOARD)
|
||||
EXTRA_SILENT_VARIANTS+=$(subst -, ,$(BOARD) $(SECTION))
|
||||
USEFILE =
|
||||
|
||||
EXTRA_SRCVPATH += $(BOARD_ROOT)/overrides
|
||||
|
||||
EXTRA_INCVPATH += $(BOARD_ROOT)/overrides \
|
||||
$(LIBSTARTUP_ROOT)/$(CPU)/$(LIB_VARIANT) \
|
||||
$(LIBSTARTUP_ROOT)/$(CPU) \
|
||||
$(LIBSTARTUP_ROOT) \
|
||||
$(LIBSTARTUP_ROOT)/public
|
||||
|
||||
EXTRA_LIBVPATH += $(LIBSTARTUP_ROOT)/$(CPU)/$(LIB_VARIANT) \
|
||||
$(USE_ROOT_LIB) \
|
||||
$(QNX_TARGET)/$(CPUVARDIR)/lib \
|
||||
$(QNX_TARGET)/$(CPUVARDIR)/usr/lib
|
||||
|
||||
|
||||
#LDBOOTSTRAPPOST_nto_x86_gcc_qcc:=$(subst -lc, -L$(QNX_TARGET)/x86/lib -lc, $(LDBOOTSTRAPPOST_nto_x86_gcc_qcc))
|
||||
|
||||
CCFLAG_64 = -D_PADDR_BITS=64
|
||||
CCFLAGS_gcc_ = -O2 -fomit-frame-pointer
|
||||
CCFLAGS_gcc_qcc = -O2 -Wc,-fomit-frame-pointer
|
||||
CCFLAGS_$(BUILDENV) = -DBUILDENV_$(BUILDENV)
|
||||
CCFLAGS = $(CCFLAGS_$(COMPILER_TYPE)_$(COMPILER_DRIVER)) $(CCFLAG_$(PADDR_SIZE)) $(CCFLAGS_$(BUILDENV))
|
||||
CCFLAGS += -DBOARDNAME=\"$(BOARD)\"
|
||||
|
||||
LDFLAGS_gcc_qcc = -M
|
||||
LDFLAGS = $(LDFLAGS_$(COMPILER_TYPE)_$(COMPILER_DRIVER))
|
||||
|
||||
EXTRA_ICLEAN=$(BOARD_ROOT)/*.pinfo
|
||||
|
||||
FILE_INFO = 0 0 644
|
||||
define POST_INSTALL
|
||||
-$(foreach build,$(EXAMPLE_BUILDFILES), \
|
||||
$(CP_HOST) $(build) $(INSTALL_ROOT_nto)/$(CPUVARDIR)/boot/build/$(BOARD)-$(notdir $(build));)
|
||||
-$(foreach build,$(MAIN_BUILDFILES) $(EXAMPLE_READMES), \
|
||||
$(CP_HOST) $(build) $(INSTALL_ROOT_nto)/$(CPUVARDIR)/boot/build/$(BOARD).$(notdir $(build));)
|
||||
endef
|
||||
|
||||
include $(MKFILES_ROOT)/qmacros.mk
|
||||
ADD_USAGE=
|
||||
|
||||
-include $(PROJECT_ROOT)/roots.mk
|
||||
|
||||
ifndef LIBSTARTUP_ROOT
|
||||
LIBSTARTUP_ROOT=$(PRODUCT_ROOT)/lib
|
||||
endif
|
||||
|
||||
EXAMPLE_BUILDFILES:=$(wildcard *.build $(BOARD_ROOT)/*.build)
|
||||
MAIN_BUILDFILES:=$(wildcard build $(BOARD_ROOT)/build)
|
||||
EXAMPLE_READMES:=$(wildcard $(BOARD_ROOT)/*readme)
|
||||
|
||||
EBF_PINFOS:=$(addsuffix .pinfo, $(EXAMPLE_BUILDFILES))
|
||||
ERM_PINFOS:=$(addsuffix .pinfo, $(EXAMPLE_READMES))
|
||||
|
||||
EXTRA_DEPS = $(EBF_PINFOS) $(ERM_PINFOS)
|
||||
|
||||
include $(BOARD_ROOT)/pinfo.mk
|
||||
|
||||
-include $(BOARD_ROOT)/extra.mk
|
||||
|
||||
include $(MKFILES_ROOT)/qtargets.mk
|
||||
|
||||
|
||||