linux内核驱动在本机编译与交叉编译

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),表示是交叉编译。

如此一个驱动就可以从本机编译到交叉编译的轻松转换了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值