驱动编译的两种方法
- 使用petalinux-build
- 使用makefile进行编译
使用petalinux工具进行编译
- 创建module
- petalinux-create -t modules -n module-name --enable
- 此时不使用
--enable
,后面需要根文件系统配置中module config进行使能
- 编辑驱动文件
- 编译
使用makefile编译
- 安装SDK
- 已经创建过一个工程并编译过内核
- 创建驱动文件夹
modname:=test-module
obj-m:=$(modname).o
PWD :=$(shell pwd)
MAKE :=make
KERNELDIR =/media/kemao/linux/zynq/basic/build/tmp/work-shared/zynqmp-generic/kernel-build-artifacts
CROSS_COMPILE = aarch64-xilinx-linux-
ARCH=arm64 # 指定目标架构为 `arm64`
all:
$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR)
M=$(PWD) modules
clean:
rm -rf $(modname).ko *.o *mod* \.*cmd *odule* .tmp_versions
.PHONY: all clean
Makefile解释
modname:=test-module
obj-m:=$(modname).o
- obj-m 表示将 modname 这个文件编译为模块
PWD :=$(shell pwd)
KERNELDIR =/media/kemao/linux/zynq/basic/build/tmp/work-shared/zynqmp-generic/kernel-build-artifacts
- KERN_DIR 表示开发板所使用的 Linux 内核源码目录(这里使用的是petalinx编译后生成的内核源码),使用绝对路径
all:
$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR)
M=$(PWD) modules
all:
:这是一个目标,表示当你在命令行中运行 make all
或 make
时,将执行其后面的命令。$(MAKE)
:这是一个变量,前面定义为 make
,表示调用 make
命令。ARCH=$(ARCH)
:指定目标架构,这里 ARCH
变量前面定义为 arm64
,表示目标架构为 arm64
。CROSS_COMPILE=$(CROSS_COMPILE)
:指定交叉编译工具链前缀,这里 CROSS_COMPILE
变量前面定义为 aarch64-xilinx-linux-
,表示使用 aarch64-xilinx-linux-
前缀的交叉编译工具链。-C $(KERNELDIR)
:切换到内核目录,这里 KERNELDIR
变量前面定义为 kernel-build-artifacts,表示切换到这个内核目录。M=$(PWD)
:指定模块的目录,这里 PWD
变量前面定义为当前工作目录,表示模块的目录为当前工作目录。modules
:这是 make
命令的目标,表示要编译内核模块。