写一个rv1106的led驱动1-整体架构

创建工程文件夹

在sysdrv/drv_ko/创建led文件夹

修改Makefile

在led文件夹的同级Makefile添加上led文件夹

bash 复制代码
ifeq ($(SYSDRV_PARAM), )
	SYSDRV_PARAM:=../../Makefile.param
	include $(SYSDRV_PARAM)
endif

CURRENT_DIR := $(shell pwd)
M_OUT_DIR ?= ../out

MODULE_NAME := led

build_target := modules

all: $(build_target)
	@echo "build $(MODULE_NAME) done"

.PHONY: modules clean

$(MODULE_NAME)-objs := led.o
obj-m := $(MODULE_NAME).o

modules:
	$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNEL_DIR) M=$(shell pwd) $@ -j12
	cp $(shell pwd)/led.ko $(M_OUT_DIR)
	@rm -rf *.o *~ .depend .*.cmd  *.mod.c .tmp_versions *.symvers modules.order *.mod

clean:
	@rm -rf *.o *~ .depend .*.cmd  *.mod.c .tmp_versions *.ko *.symvers modules.order *.mod

创建源文件led.c

c 复制代码
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/clk.h>
#include <linux/pwm.h>
#include <linux/file.h>
#include <linux/list.h>
#include <linux/gpio.h>
#include <linux/time.h>
#include <linux/hrtimer.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/module.h>
#include <linux/debugfs.h>
#include <linux/kthread.h>
#include <linux/mempolicy.h>
#include <linux/miscdevice.h>
#include <linux/interrupt.h>
#include <linux/miscdevice.h>
#include <linux/platform_device.h>
#include <linux/module.h>





static int led_probe(struct platform_device *pdev)
{


	printk("%s enter\n", __func__);


	printk("%s leave\n", __func__);
	return 0;
}

static int led_remove(struct platform_device *pdev)
{
	printk("led_remove\n");
	return 0;
}

struct of_device_id of_match_table = {
	.compatible = "led"
};

static struct platform_driver led_platform_driver = {
	.probe = led_probe,
	.remove = led_remove,
	.driver = {
		.name = "led",
		.owner = THIS_MODULE,
		.of_match_table = &of_match_table,
	}
};

static int __init led_init(void)
{
	int ret;
	ret = platform_driver_register(&led_platform_driver);
	return ret;
}

static void __exit led_exit(void)
{
	platform_driver_unregister(&led_platform_driver);
}

module_init(led_init);
module_exit(led_exit);

MODULE_LICENSE("GPL");

这个文件只是把整个架构做出来,没有什么功能。

修改dts

在根节点添加led节点

bash 复制代码
led: led{
		compatible = "led";
		status = "okay";
	};

编译

在sdk的根目录下,通过命令编译

bash 复制代码
./build.sh kernel
./build.sh driver

更新下位机的boot.img

测试

把sysdrv/drv_ko/out/led.ko 复制到下位机/oem/usr/ko文件夹中

bash 复制代码
insmod ./led.ko
rmmod led.ko

得到输出

bash 复制代码
[   97.620096] led_probe enter
[   97.620123] led_probe leave
[  149.878684] led_remove

驱动加载和卸载成功

相关推荐
小成202303202653 小时前
Linux高级02
linux·开发语言
mounter6253 小时前
【硬核前沿】CXL 深度解析:重塑数据中心架构的“高速公路”,Linux 内核如何应对挑战?-- CXL 协议详解与 LSF/MM 最新动态
linux·服务器·网络·架构·kernel
++==3 小时前
Linux 进程间通信与线程同步技术详解:IPC 机制、线程 API、同步工具与经典同步问题
linux
特长腿特长4 小时前
centos、ubantu系列机的用户和用户组的结构是什么?具体怎么配置?用户组权限怎么使用?这篇文章持续更新,帮助你复习linux的基础知识
linux·运维·centos
zzzyyy5384 小时前
Linux环境变量
linux·运维·服务器
pluvium274 小时前
记对 xonsh shell 的使用, 脚本编写, 迁移及调优
linux·python·shell·xonsh
无级程序员4 小时前
centos7 安装 llvm-toolset-7-clang出错的问题解决
linux·centos
CHHC18805 小时前
NetCore树莓派桌面应用程序
linux·运维·服务器
云栖梦泽6 小时前
Linux内核与驱动:9.Linux 驱动 API 封装
linux·c++
si莉亚7 小时前
ROS2安装EVO工具包
linux·开发语言·c++·开源