Linux 4.10.9 for Zynq and SoC FPGA

Zynqに組んだ回路が動かないのでLinux Kernelをアップデートしてみた。

Linux Kernelをカスタマイズする

Linux Kernelのビルド用コンフィグファイル(.config)もKernel 4.2.xぐらいから引き継いでいるものを使っているのでそろそろ、Zynq/SoC FPGAのKernel 4.10.x向けに真面目にメンテナンスする。

まずはLinux Kernelのダンロードをする。

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

今回のメンテナンスはKernel 4.10.9をターゲットとするのでv4.10.9のタグでブランチしました。

$ git checkout -b custom-v4.10.9 refs/tags/v4.10.9
$ git branch
* custom-v4.10.9
  master

Linux KernelのmainlineにはZynq向けのdefconfigがありません。

SoC FPGA向けにはdefconfigは存在します(arch/arm/configs/socfpga_defconfig)。

つまり、Zynq系のKernelをビルドするときはビルド用コンフィグファイルを最初から作成しなければいけません。

なので、今まで古いコンフィグを引き継いでいたのです。

ビルド用コンフィグのおさらい

まずは、コンフィグのおさらいをするためにKernel 4.10.9のコンフィグパラメータを全て検出させてみた。

$ find ./|grep Kconfig | xargs cat | grep "^config"| awk '{print $2;}' > kconfig.txt

重複はあるかもしれないけど、17,429行もあったぞ。

まず、ZYNQをキーワードにパラメータを表示してみる。

$ grep ZYNQ kconfig.txt
ARCH_ZYNQMP
ARCH_ZYNQ
PINCTRL_ZYNQ
GPIO_ZYNQ
ARM_ZYNQ_CPUIDLE
SPI_ZYNQMP_GQSPI
RTC_DRV_ZYNQMP
RESET_ZYNQ
XILINX_ZYNQMP_DMA
FPGA_MGR_ZYNQ_FPGA

次にXILINXをキーワードにパラメータを表示してみる。

$ grep XILINX kconfig.txt
XILINX_UNCACHED_SHADOW
PCI_XILINX
XILINX_MICROBLAZE0_FAMILY
XILINX_MICROBLAZE0_USE_MSR_INSTR
XILINX_MICROBLAZE0_USE_PCMP_INSTR
XILINX_MICROBLAZE0_USE_BARREL
XILINX_MICROBLAZE0_USE_DIV
XILINX_MICROBLAZE0_USE_HW_MUL
XILINX_MICROBLAZE0_USE_FPU
XILINX_MICROBLAZE0_HW_VER
XILINX_PCI
XILINX_VIRTEX440_GENERIC_BOARD
XILINX_ML510
XILINX_VIRTEX
XILINX_VIRTEX_5_FXT
XILINX_VIRTEX_GENERIC_BOARD
XILINX_VIRTEX
XILINX_VIRTEX_II_PRO
XILINX_VIRTEX_4_FX
XILINX_HWICAP
SERIAL_XILINX_PS_UART
SERIAL_XILINX_PS_UART_CONSOLE
XILINX_GMII2RGMII
CAN_XILINXCAN
NET_VENDOR_XILINX
XILINX_EMACLITE
XILINX_AXI_EMAC
XILINX_LL_TEMAC
XILINX_WATCHDOG
XILINX_INTC
GPIO_XILINX
SERIO_XILINX_XPS_PS2
PCIE_XILINX_NWL
PCIE_XILINX
FB_XILINX
XPS_USB_HCD_XILINX
USB_GADGET_XILINX
XILINX_SYSACE
SPI_XILINX
XILINX_XADC
I2C_XILINX
VIDEO_XILINX
VIDEO_XILINX_TPG
VIDEO_XILINX_VTC
XILINX_DMA
XILINX_ZYNQMP_DMA

次はSOCFPGAをキーワードに表示です。

$ grep SOCFPGA kconfig.txt
SOCFPGA_SUSPEND
DWMAC_SOCFPGA
RESET_SOCFPGA
FPGA_MGR_SOCFPGA
FPGA_MGR_SOCFPGA_A10
SOCFPGA_FPGA_BRIDGE

最後にALTERAをキーワードに表示してみよう

$ grep ALTERA kconfig.txt
SERIAL_ALTERA_JTAGUART
SERIAL_ALTERA_JTAGUART_CONSOLE
SERIAL_ALTERA_JTAGUART_CONSOLE_BYPASS
SERIAL_ALTERA_UART
SERIAL_ALTERA_UART_MAXPORTS
SERIAL_ALTERA_UART_BAUDRATE
SERIAL_ALTERA_UART_CONSOLE
ALTERA_TSE
ALTERA_MBOX
GPIO_ALTERA
GPIO_ALTERA_A10SR
SERIO_ALTERA_PS2
EDAC_ALTERA
EDAC_ALTERA_L2C
EDAC_ALTERA_OCRAM
EDAC_ALTERA_ETHERNET
EDAC_ALTERA_NAND
EDAC_ALTERA_DMA
EDAC_ALTERA_USB
EDAC_ALTERA_QSPI
EDAC_ALTERA_SDMMC
PCIE_ALTERA
PCIE_ALTERA_MSI
SPI_ALTERA
ALTERA_STAPL
MEDIA_ALTERA_CI
MFD_ALTERA_A10SR
ALTERA_FREEZE_BRIDGE

ちゃんと取捨選択しないと無駄な機能も実装したKernelをビルドしてしまうかもね。

ベースの作成

なによりも、ベースを作成してみる。

参考にするconfigは次のものです。

$ git://github.com/Xilinx/linux-xlnx
$ git://github.com/altera-opensource/linux-socfpga

両方のリポジトリからZynqとSoC FPGAのdefconfigをマージして.configを作成した。

Zynqは4.9.xベース、SoC FPGAは4.10.xベースである。

SDSoC対応

ZynqはSDSoC対応するためにlinux-xlnxからdriver/uio/uio_xilinx_apm.cをmainlineに組み込んだ。

自作ドライバ

自作Framebufferドライバをdrivers/video/fbdev/aqfb.cに組み込んだ。

drivers/video/fbdev/Kconfig

config AQUAXIS_FB
    tristate "AQUAXIS Framebuffer support"
    depends on FB && ARCH_ZYNQ
    select FB_CFB_FILLRECT
    select FB_CFB_COPYAREA
    select FB_CFB_IMAGEBLIT
    help
      AQUAXIS Framebuffer.

drivers/video/fbdev/Makefile

obj-$(CONFIG_AQUAXIS_FB)          += aqfb.o

.config

CONFIG_AQUAXIS_FB=y

Device Treeは次のように対応する。

aq-fb@40000000 {
    compatible = "aquaxis,framebuffer";
    reg = <0x40000000 0x10000>;
    width = <0x320>;
    height = <0x1e0>;
    stride = <0xc80>;
    format = "a8r8g8b8";
};

Device Tree

Device TreeはZYBO、Zedともにmainlineに用意されているのでそのまま使用する。

$ make zynq-zybo.dtb
write: 2017/04/12/ 00:41:16