Портируем FreeBSD на ARM

February 19th, 2019

NanoPi-K1-Plus – это маленький одноплатный компьютер от FriendlyElec.

Он использует 64-битный четырехъядерный SoC Allwinner H5 (ARM Cortex-A53), который имеет шестиядерное графическое ядро Mali450.

Кроме того на плате формата RaspberryPi имеются 1Gbps Ethernet, 2Gb DDR3 RAM, три порта USB-2.0, HDMI, Wi-Fi, разьёмы для подключения MMC и eMMC памяти.

Эти функции делают его особенно подходящим для приложений, требующих высокой пропускной способности данных, быстрой передачи данных и высокой производительности. Для него готовы образы UbuntuCore и Armbian.

Явно не хватает поддержки FreeBSD. Как это сделать описал Emmanuel Vadot в своей серии статей “Porting FreeBSD to a new ARM BoardРart1 , Part2 , Part3. Будем делать так как написал guru.

И так,


FreeBSD

Шаг третий – crochet

April 30th, 2019

После того как мы собрали загрузщик u-boot и создали конфигурационный файл ядра NANOPI, мы можем перейти к третьему шагу – сборке файла образа SD диска.

FreeBSD

Шаг второй – kernel config

April 29th, 2019

Для второго этапа нам понадобятся исходные коды ядра. Будем использовать FreeBSD 12.0-RELEASE. Скопируем их с помощью svnlite.

# svnlite checkout https://svn.freebsd.org/base/releng/12.0 /usr/src
# cp /use/src/sys/arm64/conf/GENERIC NANOPI

Берём конфигурацию GENERIC и убираем всё лишнее нe относящееся к Allwinner H3/H5. Получаем вот такой конфигурационный файл NANOPI.

#
# NANOPI - Kernel configuration file for NanoPI Allwinner H5/A64
#
cpu		ARM64
ident		NANOPI

#makeoptions	DEBUG=-g		# Build kernel with gdb(1) debug symbols
#makeoptions	WITH_CTF=1		# Run ctfconvert(1) for DTrace support

options 	SCHED_ULE		# ULE scheduler
options 	PREEMPTION		# Enable kernel thread preemption
options 	VIMAGE			# Subsystem virtualization, e.g. VNET
options 	INET			# InterNETworking
#options 	INET6			# IPv6 communications protocols
options 	IPSEC			# IP (v4/v6) security
options 	IPSEC_SUPPORT		# Allow kldload of ipsec and tcpmd5
options 	TCP_HHOOK		# hhook(9) framework for TCP
options 	TCP_OFFLOAD		# TCP offload
options		TCP_RFC7413		# TCP Fast Open
options 	SCTP			# Stream Control Transmission Protocol
options 	FFS			# Berkeley Fast Filesystem
options 	SOFTUPDATES		# Enable FFS soft updates support
options 	UFS_ACL			# Support for access control lists
options 	UFS_DIRHASH		# Improve performance on big directories
options 	UFS_GJOURNAL		# Enable gjournal-based UFS journaling
options 	QUOTA			# Enable disk quotas for UFS
options 	MD_ROOT			# MD is a potential root device
options 	NFSCL			# Network Filesystem Client
options 	NFSD			# Network Filesystem Server
options 	NFSLOCKD		# Network Lock Manager
options 	NFS_ROOT		# NFS usable as /, requires NFSCL
options 	MSDOSFS			# MSDOS Filesystem
options 	CD9660			# ISO 9660 Filesystem
options 	PROCFS			# Process filesystem (requires PSEUDOFS)
options 	PSEUDOFS		# Pseudo-filesystem framework
options 	GEOM_RAID		# Soft RAID functionality.
options 	GEOM_LABEL		# Provides labelization
options 	COMPAT_FREEBSD32	# Incomplete, but used by cloudabi32.ko.
options 	COMPAT_FREEBSD11	# Compatible with FreeBSD11
options 	SCSI_DELAY=5000		# Delay (in ms) before probing SCSI
options 	KTRACE			# ktrace(1) support
options 	STACK			# stack(9) support
options 	SYSVSHM			# SYSV-style shared memory
options 	SYSVMSG			# SYSV-style message queues
options 	SYSVSEM			# SYSV-style semaphores
options 	_KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options 	PRINTF_BUFR_SIZE=128	# Prevent printf output being interspersed.
options 	KBD_INSTALL_CDEV	# install a CDEV entry in /dev
options 	HWPMC_HOOKS		# Necessary kernel hooks for hwpmc(4)
options 	AUDIT			# Security event auditing
options 	CAPABILITY_MODE		# Capsicum capability mode
options 	CAPABILITIES		# Capsicum capabilities
options 	MAC			# TrustedBSD MAC Framework
options 	KDTRACE_FRAME		# Ensure frames are compiled in
options 	KDTRACE_HOOKS		# Kernel DTrace hooks
options 	VFP			# Floating-point support
options 	RACCT			# Resource accounting framework
options 	RACCT_DEFAULT_TO_DISABLED # Set kern.racct.enable=0 by default
options 	RCTL			# Resource limits
options 	SMP
options 	INTRNG

# Debugging support.  Always need this:
#options 	KDB			# Enable kernel debugger support.
#options 	KDB_TRACE		# Print a stack trace for a panic.

# For full debugger support use (turn off in stable branch):
#options 	DDB			# Support DDB.
#options 	DEADLKRES		# Enable the deadlock resolver
#options 	INVARIANTS		# Enable calls of extra sanity checking
#options 	INVARIANT_SUPPORT	# Extra sanity checks of internal structures, required by INVARIANTS
#options 	WITNESS			# Enable checks to detect deadlocks and cycles
#options 	WITNESS_SKIPSPIN	# Don't run witness on spinlocks for speed
#options 	MALLOC_DEBUG_MAXZONES=8	# Separate malloc(9) zones
#options 	ALT_BREAK_TO_DEBUGGER	# Enter debugger on keyboard escape sequence
#options 	USB_DEBUG		# enable debug msgs

# Kernel dump features.
options 	EKCD			# Support for encrypted kernel dumps
options 	GZIO			# gzip-compressed kernel and user dumps
options 	ZSTDIO			# zstd-compressed kernel and user dumps
options 	NETDUMP			# netdump(4) client support

# SoC support
options 	SOC_ALLWINNER_A64
options 	SOC_ALLWINNER_H5

# Timer drivers
device          a10_timer

# VirtIO support
device		virtio
device		virtio_pci
device		virtio_mmio
device		virtio_blk
device		vtnet

# CPU frequency control
device		cpufreq

# Ethernet NICs
device		mii
device		miibus		# MII bus support
device		mdio		#	
device		awg		# Allwinner EMAC Gigabit Ethernet

# Wireless NIC cards
#device		wlan                    # 802.11 support
#options	IEEE80211_DEBUG         # enable debug msgs
#options	IEEE80211_AMPDU_AGE     # age frames in AMPDU reorder q's
#options	IEEE80211_SUPPORT_MESH  # enable 802.11s draft support
#device		wlan_wep                # 802.11 WEP support
#device		wlan_ccmp               # 802.11 CCMP suppor
#device		wlan_tkip               # 802.11 TKIP support
#device		wlan_amrr               # AMRR transmit rate control algorithm
#device		rtwn			# Realtek wireless NICs
#device		rtwnfw			# Realtek firmware

# EVDEV support
device		evdev			# input event device support
options		EVDEV_SUPPORT		# evdev support in legacy drivers
device		uinput			# install /dev/uinput cdev
device		aw_ir                                                               

# Block devices
device		ahci
device		scbus
device		da

# ATA/SCSI peripherals
device		pass			# Passthrough device (direct ATA/SCSI access)

# MMC/SD/SDIO Card slot support
device		sdhci
device		mmc			# mmc/sd bus
device		mmcsd			# mmc/sd flash cards
device		aw_mmc			# Allwinner SD/MMC controller

# Serial (COM) ports
device		uart		# Generic UART driver
device		uart_snps

# USB support
device		aw_ehci			# Allwinner EHCI USB interface (USB 2.0)
device		aw_usbphy		# Allwinner USB PHY
device		dwcotg			# DWC OTG controller
device		ohci			# OHCI USB interface
device		ehci			# EHCI USB interface (USB 2.0)

device		usb			# USB Bus (required)
device		ukbd			# Keyboard
device		umass			# Disks/Mass storage - Requires scbus and da

# GPIO
device		aw_gpio		# Allwinner GPIO controller
device		gpio
device		gpioled
device		gpiokeys
device		fdt_pinctrl

# I2C
device		iic
device		iicbus
device		aw_rsb		# Allwinner Reduced Serial Bus
device		twsi		# Allwinner I2C controller
device          sy8106a

# Clock and reset controllers
device		aw_ccu		# Allwinner clock controller

# Interrupt controllers
device		aw_nmi		# Allwinner NMI support

# Real-time clock support
device		aw_rtc		# Allwinner Real-time Clock

# Watchdog controllers
device		aw_wdog		# Allwinner Watchdog

# SOUND
#device		sound
#device		a10_codec	# Allwinner Analog Sound

# EFUSE
device		aw_sid		# Allwinner Secure ID EFUSE

# Thermal sensors
device		aw_thermal	# Allwinner Thermal Sensor Controller

# SPI
device		spibus
device		aw_spi		# Allwinner SPI

# Console
device		vt
device		kbdmux

# EFI Framebuffer
device		vt_efifb

# Pseudo devices.
device		crypto		# core crypto support
device		loop		# Network loopback
device		random		# Entropy device
device		ether		# Ethernet support
device		vlan		# 802.1Q VLAN support
#device		tun		# Packet tunnel.
device		md		# Memory "disks"
#device		gif		# IPv6 and IPv4 tunneling
device		firmware	# firmware assist module
options 	EFIRT		# EFI Runtime Services

# EXT_RESOURCES pseudo devices
options 	EXT_RESOURCES
device		clk
device		phy
device		hwreset
device		nvmem
device		regulator
device		gpioregulator

device		syscon
device		aw_syscon

# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device		bpf		# Berkeley packet filter

options 	FDT
device		acpi

# DTBs
makeoptions     MODULES_EXTRA="dtb/allwinner"

Это пример конфигурационного файла для FreeBSD 12.0-RELEASE. В отличии от GENERIC в него добавленны некоторые функции.

  • Мы хотим управлять часторой процессора и видеть его температура. Добавляем.
# CPU frequency control
device		cpufreq

# EFUSE
device		aw_sid		# Allwinner Secure ID EFUSE

# Thermal sensors
device		aw_thermal	# Allwinner Thermal Sensor Controller

device		gpioregulator
device          sy8106a
  • В будуюшем мы захотим использоват инфракрасный пульт управления. Поэтому….
# EVDEV support
device		evdev			# input event device support
options		EVDEV_SUPPORT		# evdev support in legacy drivers
device		uinput			# install /dev/uinput cdev
device		aw_ir                                                               

Файл конфигурации ядра готов, можно проверить компиляцию ядра. Создадим shell script build.sh

#!/bin/sh

# Setup the environ for building freebsd
export TARGET=arm64
export TARGET_ARCH=aarch64
export SRCROOT=/usr/src
export MAKESYSPATH=$SRCROOT/share/mk
export MAKEOBJDIRPREFIX=/usr/obj
export KERNCONF=NANOPI

# Select some subset: the following used to be good, but now isn't
export MAKEFLAGS="-DNO_CLEAN -DWITHOUT_PROFILE -DWITHOUT_DEBUG_FILES"

cd ${SRCROOT}

make -j `sysctl -n hw.ncpu` -C $SRCROOT buildkernel

exit
 

FreeBSD

Шаг первый – U-boot.

April 29th, 2019

Das U-Boot, универсальный загрузчик, возможно, является самым богатым, самым гибким и наиболее активно развивающимся из загрузчиков с открытым исходным кодом. На FreeBSD WiKi есть статья описывающая всё многообразие портов u-boot для ARM. В ней написано, что нет портов для Allwinner H5. Это не верно. На самом деле OpangePi-PC2 – это Allwinner H5, а не Allwinner A64. Поэтому для своего порта в качестве прототипа мы можем взять порт u-boot-orangepi-pc2.

Устанавливаем коллекцию портов

# svnlite checkout https://svn.FreeBSD.org/ports/head /usr/ports

Посмотрим на порт подробно.

root@dev:/usr/ports/sysutils # cat u-boot-orangepi-pc2/Makefile
# $FreeBSD: head/sysutils/u-boot-orangepi-pc2/Makefile 472714 2018-06-18 20:22:13Z linimon $

MASTERDIR=      ${.CURDIR}/../u-boot-master

MODEL=          orangepi-pc2
BOARD_CONFIG=   orangepi_pc2_defconfig
FAMILY=         allwinner64

.include "${MASTERDIR}/Makefile"

Сделаем аналогично.

root@dev:/usr/ports/sysutils # cat u-boot-nanopi-k1-plus/Makefile 

MASTERDIR=      ${.CURDIR}/../u-boot-master

MODEL=          nanopi-k1-plus
BOARD_CONFIG=   nanopi_k1_plus_defconfig
FAMILY=         allwinner64

UBOOT_ARCH=     aarch64
EXTRA_PATCHES=  ${.CURDIR}/files/

.include "${MASTERDIR}/Makefile"

Сделаем правки в Makefile, и добавим недостающие конфигурационные файлы.

root@dev:/usr/ports/sysutils # ls u-boot-nanopi-k1-plus/files/*
u-boot-nanopi-k1-plus/files/patch-arch__arm__dts__Makefile
u-boot-nanopi-k1-plus/files/patch-arch__arm__dts__sun50i-h5-nanopi-k1-plus.dts
u-boot-nanopi-k1-plus/files/patch-configs__nanopi_k1_plus_defconfig
root@dev:/usr/ports/sysutils #

Всё наш порт готов.

Оригинал порта доступен по адресу https://github.com/S199pWa1k9r/ports

Проверяем что загрузщик собитается.

  • Устанавливает git.
# pkg install git
  • Скачиваем мой вариант порта.
# git clone https://github.com/S199pWa1k9r/ports.git /usr/tmp
  • Компилируем и устанавливает загрузщик.
# cd /usr/tmp/sysutils/u-boot-nanopi-k1-plus ; make install clean

После этого в каталоге /usr/local/share/u-boot/u-boot-nanopi-k1-plus должны появиться файлы.

# ls -lsa /usr/local/share/u-boot/u-boot-nanopi-k1-plus
total 656
  4 drwxr-xr-x  2 root  wheel     512 Feb 16 17:18 .
  4 drwxr-xr-x  7 root  wheel     512 Mar 27 12:27 ..
  4 -rw-r--r--  1 root  wheel     381 Feb 16 17:17 README
  4 -rw-r--r--  1 root  wheel      66 Feb 16 17:17 metadata
640 -rw-r--r--  1 root  wheel  607780 Feb 16 17:17 u-boot-sunxi-with-spl.bin
#

FreeBSD