linux内核驱动具有通用性,可以在内核驱动中跟随系统一同编译,也可以通过模块形式编译。
这里介绍写在模块形式编译时本机编译与交叉编译的配置。
源代码是一样的,只需要修改makefile文件即可。
这里以一个RK3588的驱动为例。
1. 本机编译(一般Ubuntu系统具备)
SUBARCH := $(shell uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/ -e s/s390x/s390/ -e s/parisc64/parisc/ -e s/ppc.*/powerpc/ -e s/mips.*/mips/ -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ -e s/riscv.*/riscv/)
CURARCH ?= $(SUBARCH)
ARCH ?= $(SUBARCH)
PWD :=$(shell pwd)
EXTRA_CFLAGS = -Wall -g -I$(CURDIR) -I$(subst fuxi-linux-release-package/module_fuxi/src,common,$(PWD)) -I$(PWD)
EXTRA_CFLAGS += -DFXGMAC_DEBUG
KSRC_BASE = /lib/modules/$(shell uname -r)
KSRC = $(KSRC_BASE)/build
KDST = ./
ko_dir = $(KSRC_BASE)/$(KDST)/
KFILE = ***
ko_full = $(ko_dir)$(KFILE).ko
yt6801-objs := ***.o
obj-m += ***.o
modules:
make -C $(KSRC) M=$(PWD) modules
install:
@echo "KFILE: " $(KFILE)
@echo "KDST: " $(KDST)
make -C $(KSRC) M=$(PWD) INSTALL_MOD_DIR=$(KDST) modules_install
sudo ls -l $(ko_dir)
depmod $(shell uname -r)
modprobe $(KFILE)
@file $(ko_full)
@echo install done.
@modinfo $(ko_full)
uninstall:
sudo ls -l $(ko_dir)
sudo rm $(ko_full)
sudo ls -l $(ko_dir)
clean:
make -C $(KSRC) M=$(PWD) clean
.PHONY:modules install uninstall clean
2.交叉编译
ARCH ?= arm64
CROSS_COMPILE ?= /home/gan/proj/rk3588_sdk/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
PWD :=$(shell pwd)
KSRC = /home/gan/proj/rk3588_sdk/kernel
EXTRA_CFLAGS = -Wall -g -I$(PWD)
EXTRA_CFLAGS += -DFXGMAC_DEBUG
EXTRA_CFLAGS += -I$(KSRC)/arch/arm64/include
EXTRA_CFLAGS += -I$(KSRC)/arch/arm64/include/generated
EXTRA_CFLAGS += -I$(KSRC)/arch/arm64/include/generated/uapi
EXTRA_CFLAGS += -I$(KSRC)/arch/arm64/include/uapi
EXTRA_CFLAGS += -I$(KSRC)/include
EXTRA_CFLAGS += -I$(KSRC)/include/generated/uapi
KFILE = ***
ko_full = $(ko_dir)$(KFILE).ko
yt6801-objs := ***.o
obj-m += ***.o
modules:
make -C $(KSRC) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules
clean:
make -C $(KSRC) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) clean
.PHONY:modules clean
从中可以看出主要区别有几点:
交叉编译需要指定ARCH 、CROSS_COMPILE;
KSRC 指linux目录,本机编译在/lib/modules/下,交叉编译根据linux源码目录来;
重点的交叉编译需要指定EXTRA_CFLAGS ,将需要的头文件包含进来,主要是asm一类的头文件。把下面的包含了基本就行了。
EXTRA_CFLAGS += -I$(KSRC)/arch/arm64/include
EXTRA_CFLAGS += -I$(KSRC)/arch/arm64/include/generated
EXTRA_CFLAGS += -I$(KSRC)/arch/arm64/include/generated/uapi
EXTRA_CFLAGS += -I$(KSRC)/arch/arm64/include/uapi
EXTRA_CFLAGS += -I$(KSRC)/include
EXTRA_CFLAGS += -I$(KSRC)/include/generated/uapi
交叉编译时在make指令需要指定ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE),表示是交叉编译。
如此一个驱动就可以从本机编译到交叉编译的轻松转换了。