自己写了一份驱动代码,指定工程内核编译生成ko
1.单个文件:
----> linux-4.19.y
----> Demo
--> demo.c
--> Makefile
#若报错 arch/x86/Makefile:No such file or directory
#和No rule to make target 'arch/x86/Makefile'. stop.
#可加上下面两句试试,指定编译工具链和架构,交叉编译基本都需要;
#export ARCH=arm
#export CROSS_COMPILE=arm-himix410-linux-
ifneq ($(KERNELRELEASE),)
obj-m := demo.o
else
#KERNELDIR:=/lib/modules/$(shell uname -r)/build/ #这句指定的内核为虚拟机本身的
KERNELDIR := ../linux-4.19.y #指定自己的,绝对路径
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD ) modules
chmod 777 *.ko
clean:
#rm -rf *.o *.mod.c *.mod.o *.ko *.order *.symvers
$(MAKE) -C $(KERNELDIR) M=$(PWD ) clean
endif #此处最好有回车
2.多个文件:
----> linux-4.19.y
----> Demo
--> demo.c (包含hello.h)
--> hello.c
--> hello.h
--> Makefile
#export ARCH=arm
#export CROSS_COMPILE=arm-himix410-linux-
ifneq ($(KERNELRELEASE),)
modulename = myDemo
$(modulename)-objs = demo.o hello.o
obj-m := $(modulename).o
else
#KERNELDIR:=/lib/modules/$(shell uname -r)/build/ #这句指定的内核为虚拟机本身的
KERNELDIR := ../linux-4.19.y #指定自己的,绝对路径
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD ) modules
chmod 777 *.ko
clean:
#rm -rf *.o *.mod.c *.mod.o *.ko *.order *.symvers
$(MAKE) -C $(KERNELDIR) M=$(PWD ) clean
endif #此处最好有回车
3. 多级目录
----> linux-4.19.y //内核
----> my_pro
--> device //(1) 设备驱动文件
--> demoa.c
--> Makefile
--> include //(2) 头文件
--> common.h
--> interface //(3)一些接口函数实现
--> common.c
--> Makefile
--> modules //(4) 存放*.ko *.so 等
--> test //(5) 用户测试文件
--> test.c
--> Makefile
--> Makefile //(6)顶层Makefile
(1) 设备驱动文件 Makefile
ifneq ($(KERNELRELEASE),)
obj-m := demoa.o
else
#KERNELDIR:=/lib/modules/$(shell uname -r)/build/ #这句指定的内核为虚拟机本身的
KERNELDIR := ../linux-4.19.y #指定自己的,绝对路径
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD ) modules
mv *.ko $(TOPDIR)/modules
endif
clean:
#rm -rf *.o *.mod.c *.mod.o *.ko *.order *.symvers
$(MAKE) -C $(KERNELDIR) M=$(PWD ) clean
(2) 无
(3)一些接口函数实现 Makefile
ifneq ($(KERNELRELEASE),)
obj-m := common.o
else
#KERNELDIR:=/lib/modules/$(shell uname -r)/build/ #这句指定的内核为虚拟机本身的
KERNELDIR := ../linux-4.19.y #指定自己的,绝对路径
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD ) modules
cp -a Module.symvers $(TOPDIR)/device
mv *.ko $(TOPDIR)/modules
endif
clean:
#rm -rf *.o *.mod.c *.mod.o *.ko *.order *.symvers
$(MAKE) -C $(KERNELDIR) M=$(PWD ) clean
(4) 无
(5) 用户测试文件 Makefile
cc=arm-gcc
CFLAGS=-Wall -O2 -g -std=gun99
LDFLAGS=
APP = app
OBJS = $(patsubs %.c ,%.o,$(wildcard *.c))
$(APP) : $(OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
clean:
rm -rf $(OBJS) $(APP) *.o
(6)顶层Makefile
TOPDIR = $(PWD)
SUBDIRS = $(TOPDIR)/interface \ #目录间用\隔开连接
$(TOPDIR)/device \
$(TOPDIR)/test
export TOPDIR #必须导出,不然子目录看不了
all:
@for dir in $(SUBDIRS );do\ #遍历所有子目录
$(MAKE) -C $$dir; \ #-C跳到对应目录
done
@echo "build done"
clean:
@for dir in $(SUBDIRS );do\
$(MAKE) -c $$dir clean; \
done