imx6q led灯驱动及测试代码ioctl(自动创建设备文件v2)

2024-06-12 14:38

本文主要是介绍imx6q led灯驱动及测试代码ioctl(自动创建设备文件v2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

微笑驱动层代码微笑

/*************************************************************************> File Name: led_drv.c> Author: XXDK> Email: v.manstein@qq.com > Created Time: Sun 26 Feb 2017 04:28:00 AM PST************************************************************************/#include<linux/init.h>
#include<linux/module.h>
#include<asm/gpio.h>
#include<mach/iomux-mx6q.h>
#include<linux/cdev.h>
#include<linux/fs.h>
#include<linux/device.h>#define SABRESD_GPIO_LED4	IMX_GPIO_NR(3, 21)
#define SABRESD_GPIO_LED5	IMX_GPIO_NR(3, 22)
#define SABRESD_GPIO_LED6   IMX_GPIO_NR(3, 23)
#define LED_ON	1
#define LED_OFF 0struct led_resource {int gpio;char *name;int data;
};static struct cdev led_cdev;
static dev_t led_dev_id;
static struct class *cls;static struct led_resource led_res[] = {[0] = {.gpio = SABRESD_GPIO_LED4,.name = "xxdk_led4",},[1] = {.gpio = SABRESD_GPIO_LED5,.name = "xxdk_led5",},[2] = {.gpio = SABRESD_GPIO_LED6,.name = "xxdk_led6",}
};static int led_open(struct inode* ip, struct file* fp)
{int i;printk("%s\n", __func__);for(i=0; i<ARRAY_SIZE(led_res); i++) {gpio_set_value(led_res[i].gpio, 1);}return 0;}static int led_close(struct inode* ip, struct file* fp)
{int i;printk("%s\n", __func__);for(i=0; i<ARRAY_SIZE(led_res); i++) {gpio_set_value(led_res[i].gpio, 0);}return 0;
}static struct file_operations led_fops = {.owner = THIS_MODULE,.open = led_open,.release = led_close 
};
static int led_init(void)
{int i;alloc_chrdev_region(&led_dev_id, 0, 1, "led@xxdk");cdev_init(&led_cdev, &led_fops);cdev_add(&led_cdev, led_dev_id, 1);for(i=0; i<ARRAY_SIZE(led_res); i++) {gpio_request(led_res[i].gpio, led_res[i].name);gpio_direction_output(led_res[i].gpio, 0);}cls = class_create(THIS_MODULE, "xxdk");device_create(cls, NULL, led_dev_id, NULL, "led@xxdk");return 0;
}static void led_exit(void)
{int i;cdev_del(&led_cdev);unregister_chrdev_region(led_dev_id, 1);for(i=0; i<ARRAY_SIZE(led_res); i++) {gpio_set_value(led_res[i].gpio, 0);gpio_free(led_res[i].gpio);}	device_destroy(cls, led_dev_id);class_destroy(cls);}module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
吐舌头应用层代码 吐舌头

/*************************************************************************> File Name: led_test.c> Author: XXDK> Email: v.manstein@qq.com > Created Time: Sun 26 Feb 2017 05:22:08 AM PST************************************************************************/#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>int main(void)
{int fd;fd = open("/dev/led@xxdk", O_RDWR);if(fd < 0) {printf("open led device failed!\n");return -1;}sleep(3);close(fd);return 0;
}

偷笑编译脚本 偷笑

#Makefil
ifneq ($(KERNELRELEASE),)obj-m += led_drv.o
elseKERNEL_DIR = /opt/EmbedSky/TQIMX6/TQ_COREC/linux_IMX6_CoreC_3.0.35_for_Linux
all:PWD=$(shell pwd)$(MAKE) -C $(KERNEL_DIR) M=$(PWD)
clean:rm -rf .*.cmd *.o *.mod.c *.ko *.tmp_versions module* Module*
endif



这篇关于imx6q led灯驱动及测试代码ioctl(自动创建设备文件v2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054504

相关文章

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

MySQL的触发器全解析(创建、查看触发器)

《MySQL的触发器全解析(创建、查看触发器)》MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行... 目录触发器的概念:创建触www.chinasem.cn发器:查看触发器:查看当前数据库的所有触发器的定

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我