Linux驱动开发——基于设备树的LED驱动开发


系列文章:
Linux驱动开发——字符设备驱动开发
Linux驱动开发——LED驱动开发
Linux驱动开发——新字符设备驱动开发

1 概述

目前驱动开发都基于设备树开发,设备树文件中定义硬件属性,通过设备树来向内核传递相关的寄存器物理地址,驱动开发时使用一系列的of函数类从设备树中获取对应的属性,来执行对应的操作。
使用设备树开发led驱动,可以分为三步:

  1. 在设备树文件中添加设备节点
  2. 编写驱动程序,获取设备树中的相关属性
  3. 使用设备树中获取到的相关属性来初始化LED所使用的GPIO

2 修改设备树文件

在对应的设备树文件中添加设备节点

rk3568_led: rk3568_led {
   
	compatible = "atkrk3568-led";
	status = "okay";
	reg = < 0x0 0xFDC20010 0x0 0x08
			0x0 0xFDC20090 0x0 0x08
			0x0 0xFDD60004 0x0 0x08
			0x0 0xFDD6000C 0x0 0x08 >;
};

这里添加了一个led的节点,名称为rk3568_led。属性 compatible 设置 rk3568_led 节点兼容为“atkrk3568-led”,属性status设置状态为“okay”,然后设置了reg属性,包含了所要使用的寄存器的地址。
添加完成之后,重新编译内核,并刷机。
刷机完成之后,可以查看设备中的设备树是否有对应的节点,查看/proc/device-tree目录,正常会有如下节点:
在这里插入图片描述
打开该目录
在这里插入图片描述
里面包含了设备树设置的几个属性,可以通过cat查看属性是否与设备树配置的一致。

3 编写驱动程序

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <asm/uaccess.h>
#include <asm/io.h>

#define DTSLED_CNT 1
#define DTSLED_NAME "dtsled"
#define LEDON 1
#define LEDOFF 0

static void __iomem *PMU_GRF_GPIO0C_IOMUX_L_PI;
static void __iomem *PMU_GRF_GPIO0C_DS_0_PI;
static void __iomem *GPIO0_SWPORT_DR_H_PI;
static void __iomem *GPIO0_SWPORT_DDR_H_PI;

struct dtsled_dev {
   
    dev_t devid;
    struct cdev cdev;
    struct class *class;
    struct device *device;
    int major;
    int minor;
    struct device_node *nd;
};

struct dtsled_dev dtsled;

void led_switch(u8 sta) {
   
    u32 val = 0;
    if (sta == LEDON) {
   
        val = readl(GPIO0_SWPORT_DR_H_PI);
        val &= ~(0x1 << 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值