PYNQでデバイスドライバを開発する

cdc-acm.koが必要になったので、そのビルド
まずカーネルソース(linux-xlnx)を落とす

git clone https://github.com/Xilinx/linux-xlnx.git

該当のブランチをチェックアウト
今回はPYNQ v2.1を使う。https://github.com/Xilinx/PYNQ/releases によれば
v2.1ではXilinx 2017.4 を使っているので、以下のようにする

git checkout xilinx-v2017.4

PYNQのカーネルコンフィグを落としてくる
https://github.com/Xilinx/PYNQ/tree/master/sdbuild/boot_configs/Pynq-Z1-defconfig
にある、kernel.configをダウンロードして.configにリネームし、linux-xlnxのルートフォルダに置く。

$ cd linux-xlnx
$ wget https://raw.githubusercontent.com/Xilinx/PYNQ/master/sdbuild/boot_configs/Pynq-Z1-defconfig/kernel.config .config

カーネルモジュールをコンパイルする準備(menuconfig/prepare/modules_prepare)

$ make ARCH=arm CROSS_COMPILE:=arm-xilinx-linux-gnueabi- menuconfig

scripts/kconfig/mconf  Kconfig
*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.
$ make ARCH=arm CROSS_COMPILE:=arm-xilinx-linux-gnueabi- prepare

  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  CHK     include/generated/bounds.h
  CHK     include/generated/timeconst.h
  CHK     include/generated/asm-offsets.h
  CALL    scripts/checksyscalls.sh
$ make ARCH=arm CROSS_COMPILE:=arm-xilinx-linux-gnueabi- modules_prepare

  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  CHK     include/generated/bounds.h
  CHK     include/generated/timeconst.h
  CHK     include/generated/asm-offsets.h
  CALL    scripts/checksyscalls.sh

適当にビルドフォルダを作成

mkdir ~/Downloads/cdc-acm-driver
cd ~/Downloads/cdc-acm-driver
cp ~/Downloads/linux-xlnx/drivers/usb/class/cdc-acm.c .
cp ~/Downloads/linux-xlnx/drivers/usb/class/cdc-acm.h .

Makefileは以下のようにする

export ARCH:=arm
export CROSS_COMPILE:=arm-xilinx-linux-gnueabi-

CC=$(CROSS_COMPILE)gcc

obj-m += cdc-acm.o

KDIR  := /home/shohei/Downloads/linux-xlnx
PWD   := $(shell pwd)

default:
	${MAKE} -C ${KDIR} M=${PWD} modules

clean:
	${MAKE} -C ${KDIR} M=${PWD} clean

実行

$ make
make -C /home/shohei/Downloads/linux-xlnx M=/home/shohei/Downloads/cdc-acm-driver modules
make[1]: Entering directory '/home/shohei/Downloads/linux-xlnx'

  WARNING: Symbol version dump ./Module.symvers
           is missing; modules will have no dependencies and modversions.

  Building modules, stage 2.
  MODPOST 1 modules
make[1]: Leaving directory '/home/shohei/Downloads/linux-xlnx'

$ ls 
cdc-acm.c  cdc-acm.ko     cdc-acm.mod.o  Makefile       Module.symvers
cdc-acm.h  cdc-acm.mod.c  cdc-acm.o      modules.order

cdc-acm.koをPYNQに送ってinsmodでロード

$ sudo insmod cdc-acm.ko