1
0

chore(driver): setup files and module

This commit is contained in:
2026-04-01 20:55:21 +02:00
parent 61cb96d2d7
commit 7f12a642e2
8 changed files with 302 additions and 0 deletions

13
src/02-driver/.clangd Normal file
View File

@@ -0,0 +1,13 @@
CompileFlags:
Add:
# Architecture and cross-compilation
- "--target=aarch64-linux-gnu"
# Setup sysroot for buildroot
- "--sysroot=/buildroot/output/host/aarch64-buildroot-linux-gnu/sysroot"
# Add specific header of linux from buildroot
- "-I/buildroot/output/build/linux-headers-5.15.148/include"
- "-I/buildroot/output/build/linux-headers-5.15.148/arch/arm64/include"
- "-I/buildroot/output/build/linux-headers-5.15.148/arch/arm64/include/generated"
- "-I/buildroot/output/build/linux-headers-5.15.148/**"

44
src/02-driver/Makefile Normal file
View File

@@ -0,0 +1,44 @@
EXE=app
SRCS=$(wildcard *.c)
ifeq ($(target),)
target=nano
endif
CFLAGS=-Wall -Wextra -g -c -O0 -MD -std=gnu11
TOOLCHAIN_PATH=/buildroot/output/host/usr/bin/
TOOLCHAIN=$(TOOLCHAIN_PATH)aarch64-linux-
CFLAGS+=-mcpu=cortex-a53 -funwind-tables
##CFLAGS+=-O2 -fno-omit-frame-pointer
OBJDIR=.obj/nano
EXEC=$(EXE)
CC=$(TOOLCHAIN)gcc
LD=$(TOOLCHAIN)gcc
AR=$(TOOLCHAIN)ar
STRIP=$(TOOLCHAIN)strip
OBJDIR=.obj/$(target)
OBJS= $(addprefix $(OBJDIR)/, $(SRCS:.c=.o))
$(OBJDIR)/%o: %c
$(CC) $(CFLAGS) $< -o $@
all: $(OBJDIR)/ $(EXEC)
$(EXEC): $(OBJS) $(LINKER_SCRIPT)
$(LD) $(OBJS) $(LDFLAGS) -o $@
$(OBJDIR)/:
mkdir -p $(OBJDIR)
clean:
rm -Rf $(OBJDIR) $(EXEC) $(EXEC)_s *~
clean_all: clean
rm -Rf .obj $(EXE) $(EXE)_s $(EXE)_a $(EXE)_a_s $(EXE)_h $(EXE)_h_s
-include $(OBJS:.o=.d)
.PHONY: all clean clean_all

33
src/02-driver/dts/.clangd Normal file
View File

@@ -0,0 +1,33 @@
CompileFlags:
Add:
# Architecture and cross-compilation
- "--target=aarch64-linux-gnu"
# Exclude standard library
- "-nostdinc"
# Mandatory kernel definitions
- "-D__KERNEL__"
- "-DMODULE"
- "-DCONFIG_CC_HAS_K_CONSTRAINT=1"
# Force-included files
- "-include"
- "/buildroot/output/build/linux-5.15.148/include/linux/compiler-version.h"
- "-include"
- "/buildroot/output/build/linux-5.15.148/include/linux/kconfig.h"
- "-include"
- "/buildroot/output/build/linux-5.15.148/include/linux/compiler_types.h"
# Kernel include paths
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include"
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include/generated"
- "-I/buildroot/output/build/linux-5.15.148/include"
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include/uapi"
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include/generated/uapi"
- "-I/buildroot/output/build/linux-5.15.148/include/uapi"
- "-I/buildroot/output/build/linux-5.15.148/include/generated/uapi"
# GCC compiler system include path
- "-isystem"
- "/buildroot/output/host/lib/gcc/aarch64-buildroot-linux-gnu/11.3.0/include"

View File

@@ -0,0 +1,37 @@
# Part executed when called from kernel build system:
ifneq ($(KERNELRELEASE),)
obj-m += mymodule.o ## name of the generated module
ccflags-y += -Wno-declaration-after-statement -std=gnu11
mymodule-objs := skeleton.o ## list of objects needed for that module
# Part executed when called from standard make in module source directory:
else
include ../../kernel_settings
PWD := $(shell pwd)
INCL+=-I. -I$(KDIR)/include -I$(KDIR)/arch/arm64/boot/dts
DTB = mydt.dtb
DTS = $(DTB:.dtb=.dts)
all: dtb boot
$(MAKE) -C $(KDIR) M=$(PWD) ARCH=$(CPU) CROSS_COMPILE=$(TOOLS) modules
dtb: $(DTB)
$(DTB) : $(DTS)
ln -s $(KDIR)/arch/arm/boot/dts arm
-cpp $(INCL) -E -P -x assembler-with-cpp $(DTS) | dtc -I dts -O dtb -o $(DTB) -
rm arm
boot:
mkimage -T script -A arm -C none -d boot.cmd boot.ovl
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
rm -f *.dtb *.ovl
install:
$(MAKE) -C $(KDIR) M=$(PWD) INSTALL_MOD_PATH=$(MODPATH) modules_install
endif

View File

@@ -0,0 +1,10 @@
setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait
fatload mmc 0 $kernel_addr_r Image
#fatload mmc 0 $fdt_addr_r nanopi-neo-plus2.dtb
fatload mmc 0 $fdt_addr_r mydt.dtb
fdt addr $fdt_addr_r
fdt resize
booti $kernel_addr_r - $fdt_addr_r

View File

@@ -0,0 +1,12 @@
/dts-v1/;
#include "allwinner/sun50i-h5-nanopi-neo-plus2.dts"
/ {
/delete-node/ leds;
mydevice {
compatible = "mydevice";
attribute = "text";
};
};

View File

@@ -0,0 +1,135 @@
/* skeleton.c */
#include <linux/init.h> /* needed for macros */
#include <linux/kernel.h> /* needed for debugging */
#include <linux/module.h> /* needed by all modules */
#include <linux/cdev.h> /* needed for char device driver */
#include <linux/fs.h> /* needed for device drivers */
#include <linux/uaccess.h> /* needed to copy data to/from user */
#include <linux/device.h> /* needed for sysfs handling */
#include <linux/miscdevice.h>
#include <linux/of.h>
#include <linux/platform_device.h> /* needed for sysfs handling */
static int skeleton_open(struct inode* i, struct file* f)
{
pr_info("skeleton : open operation... major:%d, minor:%d\n",
imajor(i),
iminor(i));
return 0;
}
static int skeleton_release(struct inode* i, struct file* f)
{
pr_info("skeleton: release operation...\n");
return 0;
}
static ssize_t skeleton_read(struct file* f,
char __user* buf,
size_t count,
loff_t* off)
{
pr_info("skeleton: read operation... read=%ld\n", count);
return 0;
}
static ssize_t skeleton_write(struct file* f,
const char __user* buf,
size_t count,
loff_t* off)
{
pr_info("skeleton: write operation... written=%ld\n", count);
return count;
}
static struct file_operations fops = {
.owner = THIS_MODULE,
.open = skeleton_open,
.read = skeleton_read,
.write = skeleton_write,
.release = skeleton_release,
};
struct miscdevice misc_device = {
.minor = MISC_DYNAMIC_MINOR,
.fops = &fops,
.name = "mydevice",
.mode = 0777,
};
int skeleton_probe(struct platform_device* pdev)
{
pr_info("skeleton - driver probe %llx (%s)- M.m=%d.%d\n",
(unsigned long long)pdev,
pdev->name,
MAJOR(pdev->dev.devt),
MINOR(pdev->dev.devt));
// register misc device ...
int ret = misc_register(&misc_device);
// read device tree attribute
struct device_node* dt_node = pdev->dev.of_node;
const char* prop = 0;
if (dt_node)
ret = of_property_read_string(dt_node, "attribute", &prop);
else
pr_info("mymodule not found!\n");
if ((prop != 0) && (ret == 0))
pr_info("attribute=%s (ret=%d)\n", prop, ret);
return 0;
}
int skeleton_remove(struct platform_device* pdev)
{
pr_info("skeleton - sysfs driver remove %llx\n", (unsigned long long)pdev);
misc_deregister(&misc_device);
return 0;
}
void skeleton_shutdown(struct platform_device* pdev)
{
pr_info("skeleton - sysfs driver shutdown %s\n", pdev->name);
}
struct of_device_id of_skeleton[] = {
{
.compatible = "mydevice",
},
{},
};
MODULE_DEVICE_TABLE(of, of_skeleton);
static struct platform_driver sysfs_driver = {
.probe = skeleton_probe,
.remove = skeleton_remove,
.shutdown = skeleton_shutdown,
.driver =
{
.name = "mydriver",
.of_match_table = of_match_ptr(of_skeleton),
},
};
static int __init skeleton_init(void)
{
pr_info("Linux module skeleton loading...\n");
int status = platform_driver_register(&sysfs_driver);
pr_info("Linux module skeleton loaded\n");
return status;
}
static void __exit skeleton_exit(void)
{
pr_info("Linux module skeleton exiting...\n");
platform_driver_unregister(&sysfs_driver);
pr_info("Linux module skeleton unloaded\n");
}
module_init(skeleton_init);
module_exit(skeleton_exit);
MODULE_AUTHOR("Daniel Gachet <daniel.gachet@hefr.ch>");
MODULE_DESCRIPTION("Module skeleton");
MODULE_LICENSE("GPL");

18
src/02-driver/main.c Normal file
View File

@@ -0,0 +1,18 @@
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/errno.h>
#include <sys/mman.h>
#include <unistd.h>
int main() {
int fd = open()
return 0;
}