Linux设备树led,linux设备树下LED灯控制

linux设备树下LED灯控制

linux设备树下LED灯控制

原理图:

07c274ab872bb89f4b5e504680fd0123.png

所以在设备树下子节点下插入gpioled节点:

gpioled {

#address-cells = <1>;

#size-cells = <1>;

compatible = "atkalpha-gpioled";

pinctrl-names = "default";

pinctrl-0 = ;//设置引脚控制节点

led-gpio = ;//设置GPIO编号初始低电平

status = "okay";

};

在查看GPIO1_IO03的IO配置:

5fff72b7af66de27de218860ceb76ffc.png

cf715f3e4cb350802e78bfd263da1885.png

bit 16:0 HYS 关闭

bit [15:14]: 00 默认下拉

bit [13]: 0 kepper 功能

bit [12]: 1 pull/keeper 使能

bit [11]: 0 关闭开路输出

bit [7:6]: 10 速度 100Mhz

bit [5:3]: 110 R0/6 驱动能力

bit [0]: 0 低转换率

0 0001 0xxx 1011 0xxx

配置0x10b0:0001 0000 1011 0000

在iomuxc节点下添加子节点pinctrl_led

pinctrl_led: ledgrp{

fsl,pins = <

MX6UL_PAD_GPIO1_IO03__GPIO1_IO030x10b0 //设置IO口属性

>;

};

设备树配置到此结束。

底层驱动文件:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define GPIOLED_CNT1 /* 设备号个数 */

#define GPIOLED_NAME"gpioled"/* 名字 */

#define LEDOFF 0/* 关灯 */

#define LEDON 1/* 开灯 */

/* gpioled设备结构体 */

struct gpioled_dev{

dev_t devid;/* 设备号 */

struct cdev cdev;/* cdev */

struct class *class;/* 类 */

struct device *device;/* 设备 */

int major;/* 主设备号 */

int minor;/* 次设备号 */

struct device_node*nd; /* 设备节点 */

int led_gpio;/* led所使用的GPIO编号*/

};

struct gpioled_dev gpioled;/* led设备 */

/*

* @description: 打开设备

* @param - inode : 传递给驱动的inode

* @param - filp : 设备文件,file结构体有个叫做private_data的成员变量

* 一般在open的时候将private_data指向设备结构体。

* @return : 0 成功;其他 失败

*/

static int led_open(struct inode *inode, struct file *filp)

{

filp->private_data = &gpioled; /* 设置私有数据 */

return 0;

}

/*

* @description: 从设备读取数据

* @param - filp : 要打开的设备文件(文件描述符)

* @param - buf : 返回给用户空间的数据缓冲区

* @param - cnt : 要读取的数据长度

* @param - offt : 相对于文件首地址的偏移

* @return : 读取的字节数,如果为负值,表示读取失败

*/

static ssize_t led_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)

{

return 0;

}

/*

* @description: 向设备写数据

* @param - filp : 设备文件,表示打开的文件描述符

* @param - buf : 要写给设备写入的数据

* @param - cnt : 要写入的数据长度

* @param - offt : 相对于文件首地址的偏移

* @return : 写入的字节数,如果为负值,表示写入失败

*/

static ssize_t led_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)

{

int retvalue;

unsigned char databuf[1];

unsigned char ledstat;

struct gpioled_dev *dev = filp->private_data;

retvalue = copy_from_user(databuf, buf, cnt);

if(retvalue < 0) {

printk("kernel write failed!\r\n");

return -EFAULT;

}

ledstat = databuf[0];/* 获取状态值 */

if(ledstat == LEDON) {

gpio_set_value(dev->led_gpio, 0);/* 打开LED灯 */

} else if(ledstat == LEDOFF) {

gpio_set_value(dev->led_gpio, 1);/* 关闭LED灯 */

}

return 0;

}

/*

* @description: 关闭/释放设备

* @param - filp : 要关闭的设备文件(文件描述符)

* @return : 0 成功;其他 失败

*/

static int led_release(struct inode *inode, struct file *filp)

{

return 0;

}

/* 设备操作函数 */

static struct file_operations gpioled_fops = {

.owner = THIS_MODULE,

.open = led_open,

.read = led_read,

.write = led_write,

.release = led_release,

};

/*

* @description: 驱动出口函数

* @param : 无

* @return : 无

*/

static int __init led_init(void)

{

int ret = 0;

/* 设置LED所使用的GPIO */

/* 1、获取设备节点:gpioled */

gpioled.nd = of_find_node_by_path("/gpioled");

if(gpioled.nd == NULL) {

printk("gpioled node not find!\r\n");

return -EINVAL;

} else {

printk("gpioled node find!\r\n");

}

/* 2、 获取设备树中的gpio属性,得到LED所使用的LED编号 */

gpioled.led_gpio = of_get_named_gpio(gpioled.nd, "led-gpio", 0);

if(gpioled.led_gpio < 0) {

printk("can't get leds\r\n");

return -EINVAL;

}

printk("led-gpio num = %d\r\n", gpioled.led_gpio);

/* 3、设置GPIO1_IO03为输出,并且输出高电平,默认关闭LED灯 */

ret = gpio_direction_output(gpioled.led_gpio, 1);

if(ret < 0) {

printk("can't set gpio!\r\n");

}

/* 注册字符设备驱动 */

/* 1、创建设备号 */

if (gpioled.major) {/* 定义了设备号 */

gpioled.devid = MKDEV(gpioled.major, 0);

register_chrdev_region(gpioled.devid, GPIOLED_CNT, GPIOLED_NAME);

} else {/* 没有定义设备号 */

alloc_chrdev_region(&gpioled.devid, 0, GPIOLED_CNT, GPIOLED_NAME);/* 申请设备号 */

gpioled.major = MAJOR(gpioled.devid);/* 获取分配号的主设备号 */

gpioled.minor = MINOR(gpioled.devid);/* 获取分配号的次设备号 */

}

printk("gpioled major=%d,minor=%d\r\n",gpioled.major, gpioled.minor);

/* 2、初始化cdev */

gpioled.cdev.owner = THIS_MODULE;

cdev_init(&gpioled.cdev, &gpioled_fops);

/* 3、添加一个cdev */

cdev_add(&gpioled.cdev, gpioled.devid, GPIOLED_CNT);

/* 4、创建类 */

gpioled.class = class_create(THIS_MODULE, GPIOLED_NAME);

if (IS_ERR(gpioled.class)) {

return PTR_ERR(gpioled.class);

}

/* 5、创建设备 */

gpioled.device = device_create(gpioled.class, NULL, gpioled.devid, NULL, GPIOLED_NAME);

if (IS_ERR(gpioled.device)) {

return PTR_ERR(gpioled.device);

}

return 0;

}

/*

* @description: 驱动出口函数

* @param : 无

* @return : 无

*/

static void __exit led_exit(void)

{

/* 注销字符设备驱动 */

cdev_del(&gpioled.cdev);/* 删除cdev */

unregister_chrdev_region(gpioled.devid, GPIOLED_CNT); /* 注销设备号 */

device_destroy(gpioled.class, gpioled.devid);

class_destroy(gpioled.class);

}

module_init(led_init);

module_exit(led_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("xzw");

APP文件:

#include "stdio.h"

#include "unistd.h"

#include "sys/types.h"

#include "sys/stat.h"

#include "fcntl.h"

#include "stdlib.h"

#include "string.h"

#define LEDOFF 0

#define LEDON 1

/*

* @description: main主程序

* @param - argc : argv数组元素个数

* @param - argv : 具体参数

* @return : 0 成功;其他 失败

*/

int main(int argc, char *argv[])

{

int fd, retvalue;

char *filename;

unsigned char databuf[1];

if(argc != 3){

printf("Error Usage!\r\n");

return -1;

}

filename = argv[1];

/* 打开led驱动 */

fd = open(filename, O_RDWR);

if(fd < 0){

printf("file %s open failed!\r\n", argv[1]);

return -1;

}

databuf[0] = atoi(argv[2]);/* 要执行的操作:打开或关闭 */

/* 向/dev/led文件写入数据 */

retvalue = write(fd, databuf, sizeof(databuf));

if(retvalue < 0){

printf("LED Control Failed!\r\n");

close(fd);

return -1;

}

retvalue = close(fd); /* 关闭文件 */

if(retvalue < 0){

printf("file %s close failed!\r\n", argv[1]);

return -1;

}

return 0;

}

结果:

c6778111e5dd8d36f40ed0fcb5e979cf.png

控制灯亮灭。

linux设备树下LED灯控制相关教程

linux如何清空某目录内文件

linux清空某目录内文件的方法:1、使用“rm -f *”指令删除当前目录下的所有文件;2、使用find命令查找普通文件并删除;3、通过“rm-f `find . -type f`”命令删除全部普通文件;4、用for循环语句删除文件。 推荐:《linux教程》 Linux删除目录下的文件的10

【Git】003-常用Linux命令

【Git】003-常用Linux命令 目录 一、启动Git 第一步:鼠标右键单击空白处 第二步:点击Git Bash Here 二、回退到上一级目录 命令: 演示: 三、改变目录 命令: 演示: 四、显示当前所在目录的路径 命令: 演示: 五、清屏 命令: 演示: 六、查看当前目录下

linux下mysql环境如何搭建

linux下mysql环境搭建的方法:首先下载Linux版本的MySQL,并解压缩文件;然后添加用户、设置权限;接着初始化数据库,并安装SSL服务;最后开启服务,并使用root账户登录即可。 linux下mysql环境搭建的方法: 1)下载Linux版本的MySQL 。 2)警告 如果您以前

linux curl命令

linux curl命令 文章目录 curl介绍 用法 curl介绍 curl 命令在 Linux 操作系统中经常来测试网络和 url 的联通性,模拟正常的网络访问。除此之外,curl 还支持包括 HTTP、HTTPS、ftp 等众多协议,还支持 POST、cookies、认证、从指定偏移处下载部分文件等功能

[imx6][Linux4.9]IMX6平台设备树的解析

[imx6][Linux4.9]IMX6平台设备树的解析 文章目录 设备树 1、设备树的查看 2、设备树源文件分析 3、设备树内容的解析函数 3.1、查找节点(`node`)的`of`函数 3.2、查找属性值(`property`)得`of`函数 3.3、其他常用的`OF`函数 主控芯片 硬件开发板 内核版本

linux系统编程笔记03——软链接和硬链接

linux系统编程笔记03——软链接和硬链接 linux系统编程笔记03——软链接和硬链接 Linux下的软链接行为和windows下的快捷方式差不多,但是如果是用相对路径创建的软链接,在软链接移动之后就会失效,无法访问。这一点和windows快捷方式不同,windows快捷方式随

linux新建文件有哪些方法

linux新建文件的方法有:1、使用重定向符号创建文件;2、使用touch命令创建文件;3、使用echo命令创建文件;4、使用printf命令创建文件;5、使用cat命令创建文件。 linux下新建文件有多种方法,如下: (视频教程推荐:linux视频教程 ) 1、在 Linux 上使用

在Linux上部署SpringBoot前后端分离的项目

在Linux上部署SpringBoot前后端分离的项目 1、把后端spring boot项目打成jar包,传到Linux上 2、在Linux上运行jar包 (1)、java -jar xxx.jar; 关闭服务器连接时会关闭此程序进程,(推荐测试可用) (2)、将jar程序设置成后台运行,并且将标准输出的日志重定

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值