写一个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

驱动加载和卸载成功

相关推荐
青梅橘子皮1 小时前
Linux---基本指令
linux·运维·服务器
REDcker2 小时前
Linux信号机制详解 POSIX语义与内核要点 sigaction与备用栈实践
linux·运维·php
cui_ruicheng2 小时前
Linux进程间通信(三):System V IPC与共享内存
linux·运维·服务器
蚰蜒螟3 小时前
深入 Linux 内核同步机制:从 futex 到 spinlock 的完整旅程
linux·windows·microsoft
运维全栈笔记3 小时前
Linux安装配置Tomcat保姆级教程:从部署到性能调优
linux·服务器·中间件·tomcat·apache·web
dllmayday4 小时前
Linux 上用终端连接 WiFi
linux·服务器·windows
峥无5 小时前
Linux系统编程基石:静态库·动态库·ELF文件·进程地址空间全景图
linux·运维·服务器
用户2367829801685 小时前
从 chmod 755 说起:Unix 文件权限到底是怎么算的?
linux
Strugglingler5 小时前
【systemctl 学习总结】
linux·systemd·systemctl·journalctl·unit file
嵌入式×边缘AI:打怪升级日志7 小时前
100ASK-T113 Pro 开发板 Bootloader 完全开发指南
linux·ubuntu·bootloader