1
1

BSPv3: добавлен драйвер интегрированного графического контроллера, исправлен сетевой драйвер, обеспечена более плотная интеграция с КР

Этот коммит содержится в:
родитель f0886cf582
Коммит f30dee5603
20 изменённых файлов: 547 добавлений и 155 удалений

Просмотреть файл

@ -12,8 +12,8 @@
## Руководство пользователя и бинарная сборка
- [Бинарный релиз](https://git.kpda.ru/BSP/kpda-bsp-allwinner-h3-orangepipc/releases/tag/release-2021-v2)
- [Руководство пользователя](https://git.kpda.ru/BSP/kpda-bsp-allwinner-h3-orangepipc/releases/download/release-2021-v2/UserManual.pdf)
- [Бинарный релиз](https://git.kpda.ru/BSP/kpda-bsp-allwinner-h3-orangepipc/releases/tag/release-2021-v3)
- [Руководство пользователя](https://git.kpda.ru/BSP/kpda-bsp-allwinner-h3-orangepipc/releases/download/release-2021-v3/UserManual.pdf)
## Поддерживаемые редакции Нейтрино
@ -96,3 +96,5 @@ echo "tftpboot 0x41000000 $image; go 0x41000000" > $TFTP_SERIAL
| NET | + | + | |
| SD | + | + | Версия исходного кода драйвера - 57d005663e |
| MMC | + | + | Версия исходного кода драйвера - 57d005663e |
| PCTL | + | + | Версия исходного кода: драйвер - ee2a55d5fd, сервис - 6427df4cac |
| DC | + | + | Версия исходного кода драйвера - 7f993f4eb4 |

Просмотреть файл

@ -1,14 +1,14 @@
@page "00-UserGuide" BSP для OrangePi-PC Allwinner-H3
@page "00-UserGuide" BSP для OrangePi PC Allwinner H3
@par Аннотация
@brief Данный документ представляет собой руководство пользователя для пакета поддержки платы OrangePi-PC на основе интегральной микросхемы Allwinner-H3 под ЗОСРВ «Нейтрино».
@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(v1.3)@endlink
- Одноплатный компьютер @link{http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-PC-Plus.html}OrangePi-PC-Plus(v1.1)@endlink
- Одноплатный компьютер @link{http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-PC.html}OrangePi PC (v1.3)@endlink
- Одноплатный компьютер @link{http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-PC-Plus.html}OrangePi PC Plus (v1.1)@endlink
Документ включает следующие разделы:
@ul
@ -17,6 +17,7 @@
@item Состав и структура
@item Установка и настройка
@item Загрузка образа ОС
@item Запуск тестового проекта
@item Описание компонентов
@item Проверка функционирования
@item Известные особенности
@ -33,11 +34,13 @@
В разделе «Загрузка образа ОС» приведены сведения о вариантах запуска загружаемого образа ЗОСРВ «Нейтрино» на целевой системе.
В разделе «Запуск тестового проекта» приведены указания по подключению к инструментальной системе по протоколу SSH, созданию и запуску тестового проекта.
В разделе «Описание компонентов» приведены описания компонентов ППМ.
В разделе «Проверка функционирования» приведены указания по проверке работоспособности пакета поддержки.
В разделе «Известные особенности» приведены известные особбености и ограничения текущей версии пакета поддержки.
В разделе «Известные особенности» приведены известные особености и ограничения текущей версии пакета поддержки.
@group table_of_articles
@@table[width:40:60:width] Раздел @| Описание

Просмотреть файл

@ -6,12 +6,15 @@
@term ЗОСРВ
@use защищенная операционная система реального времени
@term КР
@use комплект разработчика
@term ПМ
@use процессорный модуль
@term ППМ
@term BSP
@use пакет поддержки микропроцессора
@use пакет поддержки модуля
@enddl
@prev{./00-UserGuide.html|table_of_articles||1}

Просмотреть файл

@ -3,16 +3,16 @@
@brief Общие сведения
@br
Пакет поддержки платы OrangePi-PC (ППМ) предназначен для обеспечения запуска и функционирования ЗОСРВ «Нейтрино» на процессорном модуле (ПМ) на на основе интегральной микросхемы Allwinner-H3.
Пакет поддержки платы (модуля) OrangePi PC (ППМ) предназначен для обеспечения запуска и функционирования ЗОСРВ «Нейтрино» на процессорном модуле (ПМ) на основе интегральной микросхемы Allwinner H3.
@br
Для работы с ППМ необходим инструментальный ПК с установленным комплектом разработчика для ЗОСРВ «Нейтрино» в варианте _Linux Host_ и целевая плата OrangePi-PC на основе интегральной микросхемы Allwinner-H3.
Для работы с ППМ необходим инструментальный ПК с установленным комплектом разработчика для ЗОСРВ «Нейтрино» в варианте Linux Host и целевая плата OrangePi PC на основе интегральной микросхемы Allwinner H3.
@br
ППМ совместим со следующими редакциями ЗОСРВ «Нейтрино»: @b 2021, @b 2020 (ограниченно).
@br
ППМ обеспечивает поддержку и функционирование следующих блоков и интерфейсов интегральной микросхемы Allwinner-H3:
ППМ обеспечивает поддержку и функционирование следующих блоков и интерфейсов интегральной микросхемы Allwinner H3:
@ul
@item процессорнные ядра Cortex-A7 в режиме SMP
@item контроллер прерываний GICv2
@ -21,6 +21,7 @@
@item USB (EHCI/OHCI)
@item Ethernet
@item SD/eMMC
@item HDMI
@endul
@prev{./00-UserGuide.html|table_of_articles||2}

Просмотреть файл

@ -6,9 +6,9 @@
ППМ представляет собой архив, имеющий формат .tar.gz и имя вида «kpda-bsp-allwinner-h3-orangepipc-(версия-ОС)-(формат)-(дата)-(хэш-git).tar.gz».
Назначение полей:
@ul
@item (версия-ОС) - версия ЗОСРВ для которой предназначен BSP
@item (версия-ОС) - версия ЗОСРВ для которой предназначен ППМ
@item (формат) - формат ППМ: @a src для версии с исходными кодами, @a bin для версии с бинарными компонентами
@item (дата) - дата сборки и запаковки BSP в формате ГГГГММДД
@item (дата) - дата сборки и запаковки ППМ в формате ГГГГММДД
@item (хэш-git) - номер или хэш коммита системы контроля версией git
@endul

Просмотреть файл

@ -2,22 +2,103 @@
@brief Установка и настройка
@br
Распаковывать архив с ППМ следует на инструментальной машине @a x86_64 c ОС @a Linux с установленным комплектом разработчика ЗОСРВ «Нейтрино».
@@item Получение архива ППМ
@@item Настройка SSH
@@item Сборка загрузочного образа
Для распаковки ППМ следует скопировать архив в рабочий каталог и выполнить команду:
@group bsp_get
@link{https://git.kpda.ru/BSP/kpda-bsp-allwinner-h3-orangepipc/releases}В публичном репозитории СВД ВС@endlink скачать архив с исходным кодом ППМ текущей версии в домашний каталог и распаковать его:
@output{shell}
$ tar xzf kpda-bsp-allwinner-h3-orangepipc-*.tar.gz
$ cd ~
$ tar -xzf имя_архива.tar.gz
@endoutput
Для сборки ППМ выполните следующие команды:
@group ssh_setup
Приведенные в данном разделе действия необязательны и выполняются в случае последующей кросс-разработки в среде КР.
@br
В файле построения образа ~/kpda-bsp-allwinner-h3-orangepipc/images/orangepi.build раскомментировать секцию "Конфигурация ssh" и строку запуска sshd:
@output{shell}
$ cd kpda-bsp-allwinner-h3-orangepipc
[argv0=/usr/sbin/sshd] sshd
@endoutput
Также в файле построения в следующей строке:
@output{shell}
ifconfig sun0 192.168.1.2/24 up
@endoutput
заменить IP-адрес по умолчанию на требуемый IP-адрес.
@br
Создать необходимые для работы SSH каталоги:
@output{shell}
$ cd ~/kpda-bsp-allwinner-h3-orangepipc
$ mkdir -p prebuilt/armle-v7/var/chroot/sshd
$ mkdir -p prebuilt/armle-v7/root/.ssh
$ mkdir -p prebuilt/armle-v7/etc/ssh
@endoutput
Копировать конфигурационный файл сервера SSH в каталог с ППМ:
@output{shell}
$ cp $KPDA_TARGET/etc/ssh/sshd_config prebuilt/armle-v7/etc/ssh
@endoutput
Открыть файл prebuilt/armle-v7/etc/ssh/sshd_config и привести в соответствие указанные ниже параметры, т.е., раскомментировать и установить значение yes:
@output{shell}
PermitRootLogin yes
PubkeyAuthentication yes
PermitUserEnvironment yes
@endoutput
Создать серверные ключи:
@output{shell}
$ ssh-keygen -t rsa -m pem -P "" -f kpda-bsp-allwinner-h3-orangepipc/prebuilt/armle-v7/etc/ssh/ssh_host_rsa_key
$ ssh-keygen -t dsa -m pem -P "" -f kpda-bsp-allwinner-h3-orangepipc/prebuilt/armle-v7/etc/ssh/ssh_host_dsa_key
@endoutput
Создать клиентские ключи:
@output{shell}
$ ssh-keygen -t rsa -P "" -f ~/.ssh/orangepi-rsa
@endoutput
Добавить публичный ключ в ППМ:
@output{shell}
$ cat ~/.ssh/orangepi-rsa.pub >> kpda-bsp-allwinner-h3-orangepipc/prebuilt/armle-v7/root/.ssh/authorized_keys
@endoutput
@group ifs_build
Сборка загрузочного образа ЗОСРВ «Нейтрино» выполняется в процессе сборки ППМ с помощью инструментов КР.
@br
Для сборки в текстовом режиме необходимо в корневом каталоге ППМ выполнить команду make:
@output{shell}
$ cd ~/kpda-bsp-allwinner-h3-orangepipc
$ make
@endoutput
В результате будет произведена сборка ППМ и подготовлен загрузочный образ ЗОСРВ «Нейтрино» @c ifs-h3-orangepi.bin.
Для сборки ППМ в графической среде Qt Creator необходимо запустить скрипт run_qtcreator.sh из каталога установки КР, например:
@output{shell}
$ /opt/kpda2021a/run_qtcreator.sh
@endoutput
@br
В среде Qt Creator в режиме «Начало» в разделе «Проекты» нажать кнопку «+Создать». Выбрать шаблон «Импортировать проект» и «Импорт существующего проекта». Указать название проекта, например, orangepi и размещение ~/kpda-bsp-allwinner-h3-orangepipc. В следующем окне установить флажок на каталоге ~/kpda-bsp-allwinner-h3-orangepipc (все компоненты должны быть выбраны), нажать «Далее» и завершить создание проекта.
@br
В нижнем левом углу нажать на кнопку «Собрать проект». При отсутствии ошибок сборки в каталоге ~/kpda-bsp-allwinner-h3-orangepipc/images должен появиться файл образа ЗОСРВ «Нейтрино» ifs-h3-orangepi.bin.
@prev{./00-UserGuide.html|table_of_articles||4}

Просмотреть файл

@ -2,36 +2,110 @@
@brief Загрузка образа ОС
@@item Подготовка SD карты
@@item Загрузка образа с SD карты
@@item Загрузка образа по сети
@@item Загрузка образа с SD карты памяти
@@item Результат загрузки образа
@@item Сохранение варианта загрузки по-умолчанию
@@item Сохранение варианта загрузки по умолчанию
@group boot_net
@group sd_prepare
Для загрузки образа ЗОСРВ «Нейтрино» на ПМ по сети используется протокол TFTP. На инструментальной системе необходимо настроить TFTP сервер и скопировать полученный загрузочный образ @c ifs-h3-orangepi.bin в каталог, использующийся TFTP сервером.
Для обеспечения доступа к плате по интерфейсу UART и Ethernet, загрузки ЗОСРВ «Нейтрино» и работы с файловыми системами необходимо установить загрузчик U-Boot на SD-карту и создать на ней разделы. Для этого на инструментальной системе выполнить следующие действия:
@br
Затем следует подключить отладочный USB-UART ПМ к USB порту инструментального ПК, проверить наличие устройства `/dev/ttyUSB*` и запустить терминальную программу, например, minicom со следующими параметрами: скорость 115200, 8 бит, без контроля четности, 1 стоп-бит, порт `/dev/ttyUSB0`.
@br
После включения питания ПМ в терминальной программе должен присутствовать отладочный вывод загрузчика U-Boot. Например:
Подключить SD карту к инструментальной системе и копировать на нее загрузчик U-Boot:
@output{shell}
U-Boot SPL 2020.04-orangepi (Oct 26 2020 - 16:27:23 +0800)
$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1k seek=8
@endoutput
где sdX - имя SD карты в инструментальной системе, например, sdc.
@caution
Файл загрузчика u-boot-sunxi-with-spl.bin предоставляется на условиях "как есть", т.е. без сопровождения, и может быть собран самостоятельно из исходных текстов, расположенных @link{https://github.com/orangepi-xunlong/u-boot-orangepi}в репозитории U-Boot@endlink
@endcaution
Создать раздел FAT32 размером 100 Мб и Power-Safe размером 2 Гб:
@output{shell}
$ echo -e "o\nn\np\n1\n2048\n206848\nt\nb\nn\np\n2\n206849\n4401153\nt\n2\nb3\nw\n" | sudo fdisk /dev/sdX
@endoutput
Форматировать раздел FAT32:
@output{shell}
$ sudo mkfs.vfat -F 32 /dev/sdX1
@endoutput
Создать файл построения образа файловой системы Power-Safe powersafe.bld следующего содержания:
@output{shell}
[blksize=512]
[vol_name=kpda_fs]
[+boot_cls]
[+boot_quiet]
[+boot_active]
[-followlink]
[num_sectors=4194304]
[num_inodes=320000]
[uid=0 gid=0]
[boot_offset=2048]
/usr/bin/=${KPDA_TARGET}/armle-v7/usr/bin
@endoutput
Создать образ раздела с файловой системой Power-Safe:
@output{shell}
$ mkqnx6fsimg2 -vvv powersafe.bld powersafe.qfs
@endoutput
Записать полученный образ файловой системы Power-Safe в раздел Power-Safe SD карты:
@output{shell}
$ sudo dd if=powersafe.qfs of=/dev/sdX2
@endoutput
Копировать образ ЗОСРВ «Нейтрино» в раздел FAT32 SD карты:
@output{shell}
$ cp ~/kpda-bsp-allwinner-h3-orangepipc/images/ifs-h3-orangepi.bin /точка_монтирования
@endoutput
где точка_монтирования - это, как правило, каталог /media/имя_пользователя/метка_тома. Если после форматирования раздела FAT32 при подготовке SD карты не произошло автомонтирование раздела, то следует подключить его вручную.
@group boot_sd
Вставить SD карту в слот на плате. Подключить плату к инструментальной системе через переходник USB-UART.
@br
Установить и запустить программу minicom со следующими параметрами: скорость 115200, 8 бит, без контроля четности, 1 стоп-бит, порт `/dev/ttyUSB0`:
@output{shell}
$ sudo apt install minicom
$ sudo minicom -D /dev/ttyUSB0
@endoutput
Включить плату. Дождаться запуска командной строки в отладочной консоли U-Boot в окне терминала инструментальной системы (для пропуска установленных ранее вариантов автозагрузки можно нажать любую клавишу), например:
@output{shell}
U-Boot SPL 2022.04-rc5 (Apr 23 2024 - 17:57:50 +0300)
DRAM: 1024 MiB
Trying to boot from MMC1
U-Boot 2020.04-orangepi (Oct 26 2020 - 16:27:23 +0800) Allwinner Technology
U-Boot 2022.04-rc5 (Apr 23 2024 - 17:57:50 +0300) Allwinner Technology
CPU: Allwinner H3 (SUN8I 1680)
Model: Xunlong Orange Pi PC
DRAM: 1 GiB
Core: 38 devices, 15 uclasses, devicetree: separate
WDT: Not starting watchdog@1c20ca0
MMC: mmc@1c0f000: 0
Loading Environment from FAT... Unable to use mmc 0:1... In: serial@1c28000
Out: serial@1c28000
Err: serial@1c28000
Loading Environment from FAT... OK
In: serial
Out: serial
Err: serial
Net: phy interface0
eth0: ethernet@1c30000
starting USB...
@ -52,48 +126,47 @@ 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
Hit any key to stop autoboot: 0
=>
@endoutput
Загрузить и запустить образ ЗОСРВ «Нейтрино»:
@output{shell}
=> fatload mmc 0 0x41000000 ifs-h3-orangepi.bin
=> go 0x41000000
@endoutput
@group boot_net
Если для загрузки образа ЗОСРВ «Нейтрино» используется протокол TFTP, то на инструментальной системе необходимо настроить TFTP сервер и копировать загрузочный образ @c ifs-h3-orangepi.bin в каталог, использующийся TFTP сервером:
@output{shell}
$ sudo apt install tftpd-hpa
$ sudo cp ~/kpda-bsp-allwinner-h3-orangepipc/images/ifs-h3-orangepi.bin /srv/tftp
$ sudo systemctl restart tftpd-hpa
@endoutput
@br
Для загрузки образа ЗОСРВ «Нейтрино» cледует остановить загрузку и в консоли загрузчика U-Boot выполнить следующие команды:
@ul
@item Указать IP-адрес TFTP сервера:
Подключить плату через кабель Ethernet к локальной сети, в которой находится инструментальная система. В консоли загрузчика U-Boot указать IP-адрес TFTP-сервера и назначить IP-адрес клиента (платы):
@output{shell}
=> setenv serverip 172.16.0.16
=> setenv gatewayip 172.16.0.16
=> setenv serverip <IP-адрес TFTP-сервера>
=> setenv ipaddr <IP-адрес TFTP-клиента>
@endoutput
@item Установить IP-адрес модулю, для организации обмена по протоколу TFTP:
Загрузить образ ЗОСРВ «Нейтрино» по протоколу 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
=> tftpboot 0x41000000 ifs-h3-orangepi.bin
=> go 0x41000000
@endoutput
@group boot_kpda
В результате выполнения приведенных выше команд должен запуститься образ ЗОСРВ, выведены сообщения о ходе загрузки и запущен командный интерпретатор. Пример вывода:
В результате выполнения приведенных выше команд должен запуститься образ ЗОСРВ «Нейтрино», выведены сообщения о ходе загрузки и запущен командный интерпретатор. Пример вывода:
@output{shell}
System page at phys:40022000 user:fc410000 kern:fc410000
@ -112,14 +185,20 @@ Starting Network driver...
#
@endoutput
Все системные утилиты расположены в файловой системе загрузочного образа. При необходимости использования файловой системы Power-Safe SD карты с дополнительными утилитами из каталога `/usr/bin` можно подключить её следующей командой:
@output{shell}
# mount -t qnx6 /dev/sd0t179 /
@endoutput
@group boot_auto
Для сохранения параметров загрузки и выполнения требуемого вариант загрузки по-умолчанию автоматически при включении питании модуля, в консоли U-Boot установите переменную окружения @b bootcmd и сохраните значение переменных c помощью команды @b saveenv, например:
Для сохранения параметров загрузки и выполнения требуемого варианта загрузки по умолчанию автоматически при включении питании модуля в консоли 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
=> setenv kpdaboot “fatload mmc 0 0x41000000 ifs-h3-orangepi.bin; go 0x41000000”
=> setenv bootcmd run kpdaboot
=> saveenv
@endoutput

40
docs/06-Connect.dox Обычный файл
Просмотреть файл

@ -0,0 +1,40 @@
@page "Connect" Запуск тестового проекта
@brief Запуск тестового проекта
@@item Подключение к инструментальной системе по протоколу SSH
@@item Создание и запуск тестового проекта
@group ssh_connect
На инструментальной системе в главном меню Qt Creator выбрать «Инструменты», затем «Параметры» и «Устройства». На вкладке «Устройства» выбрать устройство Unconfigured (по умолчанию для ЗОСРВ «Нейтрино») и нажать «Добавить». Выбрать «Устройство под управлением ЗОСРВ «Нейтрино» и нажать «Начать настройку».
@br
В появившемся окне указать название конфигурации (например, orangepi), IP-адрес целевой системы и имя пользователя root. Далее с помощью кнопки «Обзор» указать ключ orangepi_rsa в домашнем каталоге. По завершении настройки будет проведена проверка связи с устройством.
@group test_create
В домашнем каталоге инструментальной системы создать каталог helloworld:
@output{shell}
$ mkdir ~/helloworld
@endoutput
@br
В среде Qt Creator в режиме «Начало» в разделе «Проекты» нажать кнопку «+Создать». Выбрать «Примеры для ЗОСРВ «Нейтрино» и «Приложение «Hello, World». Указать название проекта helloworld и путь размещения ~/helloworld. Далее указать систему сборки Cmake и выбрать комплект для ARMv7.
@br
Перейти в режим «Проекты» и в разделе «Сборка и запуск» проекта helloworld выбрать «Запуск». В настройках запуска в разделе «Развертывание» необходимо удалить этап «Проверить место на диске».
@br
В нижнем левом углу нажать на кнопку «Запустить». В окне «Вывод приложения» должен отобразиться текст «Добро пожаловать в ЗОСРВ «Нейтрино».
@br
Дополнительно можно проверить работу проекта, нажав кнопку «Управление», далее в разделе «Устройства» нажать «Открыть удаленную оболочку» и выполнить команду:
@output{shell}
# /tmp/helloworld
@endoutput
@prev{./00-UserGuide.html|table_of_articles||5}

Просмотреть файл

@ -23,6 +23,8 @@
@tr @center @l{devu-ehci.so} @endcenter @| Драйвер для USB-контроллеров с усовершенствованным интерфейсом хост-контроллера (EHCI)
@tr @center @l{devu-ohci.so} @endcenter @| Драйвер для USB-контроллеров с открытым интерфейсом хост-контроллера (Open Host Controller Interface, OHCI)
@tr @center @l{devb-sdmmc} @endcenter @| Драйвер для SD/eMMC контроллеров
@tr @center @l{devp-sunxi} @endcenter @| Драйвер управления общими элементами платформы SUNXI
@tr @center @l{devg-sunxi} @endcenter @| Драйвер графического контроллера Allwinner SoC
@endtable
@hint

Просмотреть файл

@ -1,6 +1,6 @@
@page "Verification" Проверка функционирования
@brief Проверка функционирования ППМ OrangePi-PC Allwinner-H3 под ЗОСРВ «Нейтрино».
@brief Проверка функционирования ППМ OrangePi PC Allwinner H3 под ЗОСРВ «Нейтрино».
@br
@ -11,33 +11,35 @@
@@@item Проверка функционирования контроллера DDR памяти
@@@item Проверка функционирования контроллера прерываний
@@@item Проверка функционирования таймера
@@@item Проверка функционирования подсистемы управления общими элементами платформ
@@@item Проверка работы ЗОСРВ на ЦП в режиме симметричной мультипроцессорности (SMP) с поддержкой всех CPU ядер типа Cortex-A7
@@item Проверки интерфейсов
@@@item Проверка драйвера контроллера UART
@@@item Проверка драйвера контроллера Gigabit Ethernet
@@@item Проверка драйвера контроллера USB
@@@item Проверка драйвера контроллера SD/MMC
@@@item Проверка драйвера контроллера HDMI
@par Тестовый стенд
Тестовый стенд представляет из себя отладочный модуль OrangePi-PC, соединённый с инструментальным ПК по интерфейсам RS-232 и Ethernet.
Тестовый стенд представляет из себя отладочный модуль OrangePi PC, соединённый с инструментальным ПК по интерфейсам RS-232 и Ethernet.
@br
На инструментальный ПК должно быть установлено:
@ul
@item ОС семейства GNU Linux, например, Ubuntu 20.04
@item Комплект разработчика для ЗОСРВ «Нейтрино»
@item ППМ OrangePi-PC Allwinner-H3
@item Терминальная программа для отладочной консоли модуля OrangePi-PC, например, minicom
@item ППМ OrangePi PC Allwinner H3
@item Терминальная программа для отладочной консоли модуля OrangePi PC, например, minicom
@endul
@par Подготовка
Перед проведением проверок необходимо запустить ЗОСРВ «Нейтрино» на отладочном модуле OrangePi-PC в соответствии с главой документации @link{./Boot.html}Загрузка образа ОС@endlink.
Перед проведением проверок необходимо запустить ЗОСРВ «Нейтрино» на отладочном модуле OrangePi PC в соответствии с главой документации @link{./Boot.html}Загрузка образа ОС@endlink.
@br
Дополнительные тестовые программы @a rr, @a ticksize и другие не входят в состав ППМ и должны быть самостоятельно загружены из @link{https://git.kpda.ru/utils/hw}публичного git-репозитория@endlink и собраны командой:
@ -47,7 +49,7 @@ $ cd utils
$ make install
@endoutput
Затем следует скопировать @a armle-v7 версии тестовых программ на SD карту памяти и подключить её к OrangePi-PC или передать файлы по сети с помощью @l{Настройка FTP сервера|FTP} или @l{Настройка NFS сервера|NFS}.
Затем следует скопировать @a armle-v7 версии тестовых программ на SD карту памяти и подключить её к OrangePi PC или передать файлы по сети с помощью @l{Настройка FTP сервера|FTP} или @l{Настройка NFS сервера|NFS}.
@ -73,14 +75,20 @@ $ make install
1 procnto-smp -vvv -ae
2 slogger -s 16384k
3 pipe
4 devc-ser8250 -e -F -b115200 -c24000000/16 0x01C28000^2,32
5 io-usb -dehci ioport=0x01c1b000,irq=106 -dohci ioport=0x01c1b400,irq=107
-dehci ioport=0x01c1c000,irq=108 -dohci ioport=0x01c1c400,irq=109
-dehci ioport=0x01c1d000,irq=110 -dohci ioport=0x01c1d400,irq=111
6 random -t
7 io-pkt-v4-hc-ksz -dsun8i
4103 sh
4104 pidin ar
4 platform-control -dsunxi
5 devc-ser8250 -e -F -b115200 -c24000000/16 0x01C28000^2,32
6 io-usb -dehci ioport=0x01c1b000,irq=106
-dohci ioport=0x01c1b400,irq=107
-dehci ioport=0x01c1c000,irq=108
-dohci ioport=0x01c1c400,irq=109
-dehci ioport=0x01c1d000,irq=110
-dohci ioport=0x01c1d400,irq=111
7 devb-sdmmc mem name=/below4G blk memory=/below4G,cache=8m
sdio hc=sunxi,addr=0x01C0F000,irq=92 disk name=sd cam pnp,quiet
8 random -t
9 io-pkt-v4-hc-ksz -dsun8i
4106 sh
4107 pidin ar
@endoutput
@ -119,8 +127,7 @@ Processor4: 1091551349 Cortex A7 228MHz FPU
1 2 procnto-smp
1 3 procnto-smp
1 4 procnto-smp
0 0x1b 0 -P- @0xfe08a2c4:0x0
1 5 procnto-smp
0 0x1b 0 -P- @0xfe08a4b8:0x0
1 6 procnto-smp
1 7 procnto-smp
1 8 procnto-smp
@ -131,39 +138,44 @@ Processor4: 1091551349 Cortex A7 228MHz FPU
1 13 procnto-smp
1 14 procnto-smp
1 15 procnto-smp
1 17 procnto-smp
1 16 procnto-smp
2 1 slogger
3 1 pipe
3 2 pipe
3 3 pipe
4 1 devc-ser8250
4 1 platform-control
4 2 platform-control
5 1 devc-ser8250
1 0x20 0 --- @0x804ab6c:0x805d1c0
5 1 io-usb
6 1 io-usb
2 0x6a 0 TP- =PULSE 0x40000008:21 0:0
3 0x6b 0 TP- =PULSE 0x4000000b:21 0:0
4 0x6c 0 TP- =PULSE 0x4000000e:21 0:0
5 0x6d 0 TP- =PULSE 0x40000011:21 0:0
6 0x6e 0 TP- =PULSE 0x40000014:21 0:0
7 0x6f 0 TP- =PULSE 0x40000017:21 0:0
5 2 io-usb
5 3 io-usb
5 4 io-usb
5 5 io-usb
5 6 io-usb
5 7 io-usb
5 8 io-usb
5 9 io-usb
5 10 io-usb
5 11 io-usb
6 1 random
6 2 random
6 3 random
7 1 io-pkt-v4-hc-ksz
7 2 io-pkt-v4-hc-ksz
8 0x72 0 T-- @0x78002d5c:0x818f2c0
7 3 io-pkt-v4-hc-ksz
4104 1 sh
4105 1 pidin
3 0x6c 0 TP- =PULSE 0x4000000e:21 0:0
4 0x6e 0 TP- =PULSE 0x40000014:21 0:0
6 2 io-usb
6 3 io-usb
6 4 io-usb
6 5 io-usb
6 6 io-usb
6 7 io-usb
6 8 io-usb
7 1 devb-sdmmc
5 0x5c 1 TP- =PULSE 0x40000005:21 0x3:0
7 2 devb-sdmmc
7 3 devb-sdmmc
7 4 devb-sdmmc
7 5 devb-sdmmc
7 6 devb-sdmmc
7 7 devb-sdmmc
7 8 devb-sdmmc
8 1 random
8 2 random
8 3 random
9 1 io-pkt-v4-hc-ksz
9 2 io-pkt-v4-hc-ksz
6 0x72 0 T-- @0x78002d5c:0x818f2c0
9 3 io-pkt-v4-hc-ksz
4106 1 sh
12299 1 pidin
@endoutput
Проверка считается пройденной успешно, если вывод утилиты @l{pidin|pidin ir} содержит информацию об обработчиках прерывания, принадлежащих выполняемым процессам, в формате
@ -194,6 +206,40 @@ System Timer Latency = 0.54 mks
@group base_platform
Для вывода информации о запущенных компонентов выполнить команду @l{pidin|pidin ar}:
@output{shell}
# pidin ar
pid Arguments
1 procnto-smp -vvv -ae
2 slogger -s 16384k
3 pipe
4 platform-control -dsunxi
5 devc-ser8250 -e -F -b115200 -c24000000/16 0x01C28000^2,32
6 io-usb -dehci ioport=0x01c1b000,irq=106
-dohci ioport=0x01c1b400,irq=107
-dehci ioport=0x01c1c000,irq=108
-dohci ioport=0x01c1c400,irq=109
-dehci ioport=0x01c1d000,irq=110
-dohci ioport=0x01c1d400,irq=111
7 devb-sdmmc mem name=/below4G blk memory=/below4G,cache=8m
sdio hc=sunxi,addr=0x01C0F000,irq=92 disk name=sd cam pnp,quiet
8 random -t
9 io-pkt-v4-hc-ksz -dsun8i
4106 sh
4107 pidin ar
@endoutput
Проверка считается пройденной успешно, если вывод утилиты @l{pidin|pidin ar} содержит информацию о запуске @l{platform-control|менеджера управления общими элементами платформ} с аргументом @l{devp-sunxi.so|-dsunxi}:
@output{shell}
4 platform-control -dsunxi
@endoutput
@group base_smp
Для вывода информации о количестве процессоров выполнить команду @l{pidin|pidin info}:
@ -292,7 +338,7 @@ round-trip min/avg/max = 0/0/0 ms variance = 0 ms^2
@group bsp_usb
Для работы с контроллером интерфейса USB используется драйвера @l{devu-ehci.so}, @l{devu-ohci.so} и менеджер ресурсов @l{io-usb}. В составе загрузочного образа драйвер запускается автоматически. Для вывода информации о доступных интерфейсах выполнить команду @l{usb}.
Для работы с контроллером интерфейса USB используются драйвера @l{devu-ehci.so}, @l{devu-ohci.so} и менеджер ресурсов @l{io-usb}. В составе загрузочного образа драйвер запускается автоматически.
В случае успешного запуска драйвера в директории `/dev/` будет создано устройство @c io-usb.
@ -301,7 +347,7 @@ round-trip min/avg/max = 0/0/0 ms variance = 0 ms^2
devu-ehci.so devu-ohci.so io-usb
@endoutput
Для проверки функционирования драйвера UART подключить ПМ к ПК через преобразователь по USB в один из разъемов и запустить терминальную программу @a minicom. В последовательном или удалённом терминале выполнить следующую команду:
Для получения списка подключенных @a usb устройств может быть использована утилита @a usb:
@output{shell}
# usb
@ -323,7 +369,7 @@ USB 4 (EHCI) v1.10, v1.01 DDK, v1.01 HCD
USB 5 (OHCI) v1.10, v1.01 DDK, v1.01 HCD
@endoutput
После подключения должно появиться новое устройство:
После подключения USB flash накопителя к ПМ должно появиться новое устройство:
@output{shell}
# usb
@ -396,4 +442,46 @@ USB 5 (OHCI) v1.10, v1.01 DDK, v1.01 HCD
@endoutput
@group bsp_hdmi
Проверка HDMI производится с использованием утилиты @l{gf-vsync}. Перед выполнением проверки необходимо подключить к OrangePi PC монитор через разъем HDMI. Для корректной проверки на устройстве должен размещаться файл @l{display.conf|/etc/system/config/display.conf} следующего содержания:
@code
device {
drivername=sunxi
vid=0x0
did=0x0
deviceindex=0
display {
xres=1920
yres=1080
refresh=60
pixel_format=argb8888
}
}
@endcode
В конфигурационном файле @l{sunxi.conf|/etc/system/config/sunxi.conf} раскомментировать соответствующую строку:
@code
# Allwinner H3 configuration sample
irq=118,memory=64,verbose=debug
#base=0x01C0C000:0x01000000:0x01EE0000,irq=118,memory=64,verbose=debug
@endcode
Затем необходимо запустить @l{io-display}
@output{shell}
# io-display -dvid=0,did=0
@endoutput
После — воспользоваться утилитой @l{gf-vsync}
@output{shell}
# gf-vsync -l0
@endoutput
Проверка считается пройденной успешно, если на экране отображается корректное изображение, соответствующее документации на утилиту @l{gf-vsync}.
@prev{./00-UserGuide.html|table_of_articles||11}

Просмотреть файл

@ -1,5 +1,21 @@
@page "ReleaseNotes" Журнал изменений BSP для OrangePi-PC Allwinner-H3
@page "ReleaseNotes" Журнал изменений ППМ для OrangePi PC Allwinner H3
@brief Журнал и история изменений компонентов пакета поддержки
@par 20240617-de72907e60
@ul
@item devg-sunxi
@ul
@item Добавлен драйвер графического контроллера Allwinner SoC
@endul
@endul
@par 20240507-e02227891b
@ul
@item devp-sunxi
@ul
@item Добавлен драйвер управления общими элементами платформы SUNXI
@endul
@endul
@prev{./00-UserGuide.html|table_of_articles||21}

Просмотреть файл

@ -5,7 +5,7 @@
################################################################
export GENDOC_PROJECT_NAME="Руководство пользователя"
export GENDOC_PROJECT_BRIEF="Руководство пользователя пакета поддержки платы OrangePi-PC на основе интегральной микросхемы Allwinner-H3 под ЗОСРВ «Нейтрино»"
export GENDOC_PROJECT_BRIEF="Руководство пользователя пакета поддержки платы OrangePi PC на основе интегральной микросхемы Allwinner H3 под ЗОСРВ «Нейтрино»"
export GENDOC_PROJECT_VERSION=""
export GENDOC_IGNORE_MISSING_AUTOLINK_ERRORS="yes"

Просмотреть файл

@ -26,7 +26,7 @@
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
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 = {
@ -40,6 +40,12 @@
slogger -s 16384k
pipe
#######################################################################
## Platform driver
#######################################################################
display_msg Starting Platform driver...
platform-control -dsunxi &
waitfor /dev/platform
#######################################################################
## UART driver
@ -74,10 +80,12 @@
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
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
devc-pty
#######################################################################
## Network driver
@ -85,6 +93,8 @@
display_msg Starting Network driver...
io-pkt-v4-hc-ksz -dsun8i
ifconfig sun0 192.168.1.2/24 up
waitfor /dev/random
# [argv0=/usr/sbin/sshd] sshd
[+session] sh &
}
@ -106,11 +116,14 @@ libc.so
libm.so
libz.so
libc.so.3
libcrypto.so.2
[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
[type=link] /usr/lib/libcrypto.so=/proc/boot/libcrypto.so.2
[type=link] /usr/lib/libcrypto.so.1=/proc/boot/libcrypto.so.2
[type=link] /usr/lib/libcrypto.so.2=/proc/boot/libcrypto.so.2
###########################################################################
## Библиотеки работы с диском и файловые системы
@ -146,6 +159,13 @@ devnp-sun8i.so
[data=c]
###########################################################################
## Platform driver
###########################################################################
platform-control
devp-sunxi.so
#######################################################################
## Драйверы последовательных портов
#######################################################################
@ -207,7 +227,12 @@ sloginfo
sleep
date
df
sshd
awk
cut
printf
sed
tail
###########################################################################
## Менеджеры ресурсов: PCI, сеть, графика, аудио, драйвер диска и т.д.
@ -237,6 +262,34 @@ netstat
route
random
###########################################################################
## Конфигурация ssh
###########################################################################
#/root/.ssh/environment = {
#PATH=/proc/boot:/bin:/usr/bin:/sbin:/usr/sbin
#}
#/etc/passwd = {
#root::0:0:Supervisor:/root:/bin/sh
#sshd:x:15:6:sshd:/var/chroot/sshd:/bin/false
#}
#/etc/ssh/sshd_config=../install/armle-v7/etc/ssh/sshd_config
#[perms=600 gid=0 uid=0] /etc/ssh/ssh_host_rsa_key=../install/armle-v7/etc/ssh/ssh_host_rsa_key
#[perms=600 gid=0 uid=0] /etc/ssh/ssh_host_dsa_key=../install/armle-v7/etc/ssh/ssh_host_dsa_key
#[perms=644 gid=0 uid=0] /etc/ssh/ssh_host_rsa_key.pub=../install/armle-v7/etc/ssh/ssh_host_rsa_key.pub
#[perms=644 gid=0 uid=0] /etc/ssh/ssh_host_dsa_key.pub=../install/armle-v7/etc/ssh/ssh_host_dsa_key.pub
#[type=dir perms=750 gid=0 uid=0] /root/.ssh=../install/armle-v7/root/.ssh
#[type=dir perms=755 gid=0 uid=0] /var/chroot/sshd=../install/armle-v7/var/chroot/sshd
#[perms=600 gid=0 uid=0] /root/.ssh/authorized_keys=../install/armle-v7/root/.ssh/authorized_keys
#[type=link] /var/run=/tmp
#/usr/libexec/sftp-server=${KPDA_TARGET}/armle-v7/usr/libexec/sftp-server
###########################################################################
## END OF BUILD SCRIPT
###########################################################################

Просмотреть файл

@ -0,0 +1,16 @@
# devg-sunxi.so parameters
#
# base Display controller registers base phys-address in format: "tcon:de:hdmi"
# (default - auto-select)
# irq Display controller interrupt id (default - polling mode)
# memory Video memory size. Default/minimum GPU memory size - 64 Mb. This option causes
# increasing initialization time.
# verbose Verbosity level: "silent" (default), "info", "warn", "debug"
#
# The driver will use the first un-commented entry.
# Allwinner H3 configuration sample
irq=118,memory=64,verbose=debug
#base=0x01C0C000:0x01000000:0x01EE0000,irq=118,memory=64,verbose=debug

Двоичные данные
prebuilt/armle-v7/lib/dll/devg-sunxi.so Исполняемый файл

Двоичный файл не отображается.

Двоичные данные
prebuilt/armle-v7/lib/dll/devp-sunxi.so Исполняемый файл

Двоичный файл не отображается.

Двоичные данные
prebuilt/armle-v7/sbin/platform-control Исполняемый файл

Двоичный файл не отображается.

Просмотреть файл

@ -4,6 +4,12 @@
@remark io-pkt-* -d sun8i [опция[,опция ...]] ...
@param phy=число
Адрес подключенного контроллера физического уровня (PHY).
@param priority=N
Приоритет потока событий драйвера. Значение по умолчанию – `21`.
@caution
Для разделения опций используется запятая (но не пробелы).
@endcaution

Просмотреть файл

@ -193,26 +193,6 @@ int sun8i_entry(void *dll_hdl, struct _iopkt_self *iopkt, char *options)
val |= BUS_SOFT_RST_REG2_EPHY_RST;
out32(sun8i_args.clk_base + BUS_SOFT_RST_REG2, val);
// Set up system configuration for EMAC
val = in32(sun8i_args.syscon_base + EMAC_CLK_REG);
if (sun8i_args.use_internal_phy)
{
val &= ~H3_EPHY_DEFAULT_MASK;
val |= H3_EPHY_DEFAULT_VALUE;
val |= sun8i_args.phy_addr << H3_EPHY_ADDR_SHIFT;
val &= ~H3_EPHY_SHUTDOWN;
val |= H3_EPHY_SELECT;
val |= H3_EPHY_LED_POL;
val |= H3_EPHY_CLK_SEL;
}
else
{
val &= ~H3_EPHY_SELECT;
}
val &= ~(SC_ETCS_MASK | SC_EPIT);
val &= ~SC_RMII_EN;
out32(sun8i_args.syscon_base + EMAC_CLK_REG, val);
if (dev_attach("sun", NULL, &sun8i_ca, &sun8i_args, NULL, &dev, NULL) != EOK)
{
return ENODEV;
@ -246,7 +226,7 @@ void sun8i_mdi_callback(void *handle, uint8_t phyaddr, uint8_t linkstate)
struct ifnet *ifp = &sun8i->ec.ec_if;
nic_config_t *cfg = &sun8i->cfg;
slogf(_SLOGC_NETWORK, _SLOG_INFO, "%s:%d phyaddr = %d linkstate = %d devidx = %d", __func__, __LINE__, phyaddr, linkstate, cfg->device_index);
slogf(_SLOGC_NETWORK, _SLOG_INFO, "%s:%d phyaddr = %d linkstate = %#x devidx = %d", __func__, __LINE__, phyaddr, linkstate, cfg->device_index);
switch (linkstate)
{
@ -300,9 +280,9 @@ void sun8i_mdi_callback(void *handle, uint8_t phyaddr, uint8_t linkstate)
break;
}
slogf(_SLOGC_NETWORK, _SLOG_INFO, "%s:%d - Link up (%s) if=%d mode = %d", __func__, __LINE__, s, cfg->device_index, mode);
slogf(_SLOGC_NETWORK, _SLOG_INFO, "%s:%d - Link up (%s) if=%d mode = %#x", __func__, __LINE__, s, cfg->device_index, mode);
val = (sun8i->emac_base + EMAC_CTL0);
val = in32(sun8i->emac_base + EMAC_CTL0);
if (cfg->duplex)
{
val |= EMAC_CTL0_FULL_DUPLEX;
@ -428,14 +408,15 @@ int sun8i_attach(struct device *parent __attribute__((unused)), struct device *s
sun8i->cfg.duplex = -1;
sun8i->cfg.mtu = ETHERMTU;
sun8i->cfg.mru = ETHERMTU;
sun8i->cfg.flags |= NIC_FLAG_MULTICAST;
sun8i->cfg.phy_addr = sun8i_args->phy_addr;
// sun8i->cfg.flags |= NIC_FLAG_MULTICAST;
strcpy(ifp->if_xname, sun8i->dev.dv_xname);
strcpy((char *) sun8i->cfg.uptype, "en");
strcpy((char *) sun8i->cfg.device_description, "sun8i");
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX;
// ifp->if_flags = | IFF_MULTICAST;
ifp->if_ioctl = sun8i_ioctl;
ifp->if_start = sun8i_start;
ifp->if_init = sun8i_init;
@ -455,11 +436,29 @@ int sun8i_attach(struct device *parent __attribute__((unused)), struct device *s
slogf(_SLOGC_NETWORK, _SLOG_ERROR, "devnp-sun8i: error parsing options");
return err;
}
if (!sun8i->cfg.num_irqs)
sun8i->cfg.irq[0] = SUN8I_H3_INTERRUPT;
sun8i->cfg.num_irqs = 1;
// Set up system configuration for EMAC
val = in32(sun8i_args->syscon_base + EMAC_CLK_REG);
if (sun8i_args->use_internal_phy)
{
sun8i->cfg.irq[0] = SUN8I_H3_INTERRUPT;
++sun8i->cfg.num_irqs;
val &= ~H3_EPHY_DEFAULT_MASK;
val |= H3_EPHY_DEFAULT_VALUE;
val |= sun8i->cfg.phy_addr << H3_EPHY_ADDR_SHIFT;
val &= ~H3_EPHY_SHUTDOWN;
val |= H3_EPHY_SELECT;
val |= H3_EPHY_LED_POL;
val |= H3_EPHY_CLK_SEL;
}
else
{
val &= ~H3_EPHY_SELECT;
}
val &= ~(SC_ETCS_MASK | SC_EPIT);
val &= ~SC_RMII_EN;
out32(sun8i_args->syscon_base + EMAC_CLK_REG, val);
val = in32(sun8i->emac_base + EMAC_CTL1);
@ -596,6 +595,9 @@ int sun8i_init(struct ifnet *ifp)
ifp->if_flags_tx |= IFF_OACTIVE;
NW_SIGUNLOCK_P(&ifp->if_snd_ex, iopkt, wtp);
sun8i->cfg.mtu = ETHERMTU;
sun8i->cfg.mru = ETHERMTU;
sun8i_stop(ifp, 0);
// Clean EMAC registers
@ -779,8 +781,9 @@ void sun8i_stop(struct ifnet *ifp, int disable)
desc = SUN8I_DESC(&sun8i->rxb, i);
desc->addr = 0;
desc->status = 0;
desc->size = 0;
if (!sun8i->rxb.mbufs_set[i])
if (sun8i->rxb.mbufs_set[i])
{
m_freem(sun8i->rxb.mbufs_set[i]);
sun8i->rxb.mbufs_set[i] = NULL;
@ -794,7 +797,7 @@ void sun8i_stop(struct ifnet *ifp, int disable)
desc->status = 0;
desc->size = 0;
if (!sun8i->txb.mbufs_set[i])
if (sun8i->txb.mbufs_set[i])
{
m_freem(sun8i->txb.mbufs_set[i]);
sun8i->txb.mbufs_set[i] = NULL;
@ -809,12 +812,12 @@ void sun8i_reap(sun8i_dev_t *sun8i)
sun8i_desc_t *desc = NULL;
desc_buffer_t *txb = &sun8i->txb;
cnt = txb->cnt;
if (txb->free_cnt == txb->cnt)
{
return;
}
cnt = txb->cnt - txb->free_cnt;
while (cnt)
{
desc = SUN8I_DESC(txb, txb->tail);
@ -850,10 +853,6 @@ void sun8i_reap(sun8i_dev_t *sun8i)
txb->tail = (txb->tail + 1) % txb->cnt;
++txb->free_cnt;
if (!txb->free_cnt)
{
break;
}
--cnt;
}
}
@ -881,7 +880,7 @@ void sun8i_start(struct ifnet *ifp)
for (;;)
{
if (txb->free_cnt < CONFIG_TX_DESCR_NUM / 2)
if (txb->free_cnt < SUN8I_UNUSED_DESCR)
{
sun8i_reap(sun8i);
}
@ -899,10 +898,10 @@ void sun8i_start(struct ifnet *ifp)
}
}
if ((num_frag) > txb->free_cnt)
if (num_frag > txb->free_cnt)
{
sun8i_reap(sun8i);
if ((num_frag + 2) > txb->free_cnt)
if (num_frag > txb->free_cnt)
{
ifp->if_flags_tx |= IFF_OACTIVE;
sun8i->start_running = 0;
@ -1125,7 +1124,7 @@ void sun8i_receive(sun8i_dev_t *sun8i)
while (!(desc->status & RX_DESC_CTL))
{
if (rxb->cnt - rxb->free_cnt > CONFIG_RX_DESCR_NUM / 2)
if (rxb->cnt - rxb->free_cnt > SUN8I_UNUSED_DESCR)
{
sun8i_alloc_mbufs(sun8i);
}
@ -1139,6 +1138,7 @@ void sun8i_receive(sun8i_dev_t *sun8i)
desc->addr = 0;
rm = rxb->mbufs_set[rxb->head];
rxb->mbufs_set[rxb->head] = NULL;
rm->m_len = len;
rm->m_pkthdr.rcvif = ifp;
@ -1233,7 +1233,7 @@ int sun8i_process_interrupt(void *arg, struct nw_work_thread *wtp)
if (!sun8i->start_running)
{
NW_SIGLOCK_P(&ifp->if_snd_ex, iopkt, wtp);
if (sun8i->txb.free_cnt < CONFIG_TX_DESCR_NUM / 2)
if (sun8i->txb.free_cnt < SUN8I_UNUSED_DESCR)
{
sun8i_reap(sun8i);
}

Просмотреть файл

@ -151,6 +151,8 @@
#define RX_DESC_FRM_SIZE_MASK GENMASK32(16, 29)
#define RX_DESC_FRM_SIZE(status) (((status) & RX_DESC_FRM_SIZE_MASK) >> 16)
#define SUN8I_UNUSED_DESCR 2
#define CONFIG_SYS_HZ 1000
#define CONFIG_MDIO_TIMEOUT (3 * CONFIG_SYS_HZ)
#define EMAC_SOFT_RESET_TIMEOUT_USEC (100 * 1000)