diff --git a/README.md b/README.md index df3d781..5df3137 100644 --- a/README.md +++ b/README.md @@ -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 | diff --git a/docs/00-UserGuide.dox b/docs/00-UserGuide.dox index baaad28..87bf3c9 100644 --- a/docs/00-UserGuide.dox +++ b/docs/00-UserGuide.dox @@ -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] Раздел @| Описание diff --git a/docs/01-Glossary.dox b/docs/01-Glossary.dox index 34be206..1659fd8 100644 --- a/docs/01-Glossary.dox +++ b/docs/01-Glossary.dox @@ -6,12 +6,15 @@ @term ЗОСРВ @use защищенная операционная система реального времени +@term КР +@use комплект разработчика + @term ПМ @use процессорный модуль @term ППМ @term BSP -@use пакет поддержки микропроцессора +@use пакет поддержки модуля @enddl @prev{./00-UserGuide.html|table_of_articles||1} diff --git a/docs/02-GeneralInfo.dox b/docs/02-GeneralInfo.dox index d58c2bc..4fe68bf 100644 --- a/docs/02-GeneralInfo.dox +++ b/docs/02-GeneralInfo.dox @@ -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} diff --git a/docs/03-Contents.dox b/docs/03-Contents.dox index 8c0e510..ac391a3 100644 --- a/docs/03-Contents.dox +++ b/docs/03-Contents.dox @@ -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 diff --git a/docs/04-Install.dox b/docs/04-Install.dox index 7783398..9cdd0b8 100644 --- a/docs/04-Install.dox +++ b/docs/04-Install.dox @@ -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} diff --git a/docs/05-Boot.dox b/docs/05-Boot.dox index b8ed52d..07a6479 100644 --- a/docs/05-Boot.dox +++ b/docs/05-Boot.dox @@ -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 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 +=> setenv ipaddr @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 diff --git a/docs/06-Connect.dox b/docs/06-Connect.dox new file mode 100644 index 0000000..27b00f0 --- /dev/null +++ b/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} diff --git a/docs/10-Components.dox b/docs/10-Components.dox index 5c8e488..6e771cb 100644 --- a/docs/10-Components.dox +++ b/docs/10-Components.dox @@ -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 diff --git a/docs/11-Verification.dox b/docs/11-Verification.dox index d9e9212..5151d29 100644 --- a/docs/11-Verification.dox +++ b/docs/11-Verification.dox @@ -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} diff --git a/docs/21-ReleaseNotes.dox b/docs/21-ReleaseNotes.dox index 5d2de5b..12b5528 100644 --- a/docs/21-ReleaseNotes.dox +++ b/docs/21-ReleaseNotes.dox @@ -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} diff --git a/docs/caption.inc b/docs/caption.inc index 4464c75..de6bb3c 100644 --- a/docs/caption.inc +++ b/docs/caption.inc @@ -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" diff --git a/images/orangepi.build b/images/orangepi.build index c84e5f6..1e066bc 100644 --- a/images/orangepi.build +++ b/images/orangepi.build @@ -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 ########################################################################### diff --git a/prebuilt/armle-v7/etc/system/config/sunxi.conf b/prebuilt/armle-v7/etc/system/config/sunxi.conf new file mode 100644 index 0000000..47b8ea4 --- /dev/null +++ b/prebuilt/armle-v7/etc/system/config/sunxi.conf @@ -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 + diff --git a/prebuilt/armle-v7/lib/dll/devg-sunxi.so b/prebuilt/armle-v7/lib/dll/devg-sunxi.so new file mode 100755 index 0000000..5273857 Binary files /dev/null and b/prebuilt/armle-v7/lib/dll/devg-sunxi.so differ diff --git a/prebuilt/armle-v7/lib/dll/devp-sunxi.so b/prebuilt/armle-v7/lib/dll/devp-sunxi.so new file mode 100755 index 0000000..38a2863 Binary files /dev/null and b/prebuilt/armle-v7/lib/dll/devp-sunxi.so differ diff --git a/prebuilt/armle-v7/sbin/platform-control b/prebuilt/armle-v7/sbin/platform-control new file mode 100755 index 0000000..f95be3f Binary files /dev/null and b/prebuilt/armle-v7/sbin/platform-control differ diff --git a/src/hardware/devnp/sun8i/devnp-sun8iso.dox b/src/hardware/devnp/sun8i/devnp-sun8iso.dox index 8302bc6..d7a7080 100644 --- a/src/hardware/devnp/sun8i/devnp-sun8iso.dox +++ b/src/hardware/devnp/sun8i/devnp-sun8iso.dox @@ -4,6 +4,12 @@ @remark io-pkt-* -d sun8i [опция[,опция ...]] ... +@param phy=число +Адрес подключенного контроллера физического уровня (PHY). + +@param priority=N +Приоритет потока событий драйвера. Значение по умолчанию – `21`. + @caution Для разделения опций используется запятая (но не пробелы). @endcaution diff --git a/src/hardware/devnp/sun8i/sun8i.c b/src/hardware/devnp/sun8i/sun8i.c index 3b1ca46..33de72e 100644 --- a/src/hardware/devnp/sun8i/sun8i.c +++ b/src/hardware/devnp/sun8i/sun8i.c @@ -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); } diff --git a/src/hardware/devnp/sun8i/sun8i.h b/src/hardware/devnp/sun8i/sun8i.h index 8eecb5a..7354df5 100644 --- a/src/hardware/devnp/sun8i/sun8i.h +++ b/src/hardware/devnp/sun8i/sun8i.h @@ -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)