中断控制gpio-led

1、添加设备树节点

 2、驱动程序

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/gpio.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/cdev.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/gpio/consumer.h>
#include <asm/uaccess.h>
#include <linux/uaccess.h>
#include <linux/ioctl.h>
#include <linux/uaccess.h>	
#include <linux/string.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/of_irq.h>
#include <asm/io.h>
 
 
#define LED_CNT    1         /*设备个数*/
#define LED_NAME   "irq"     /*设备名字*/
 
 
int err;
int temp;	
 
struct led_dev{
	int major;/*主设备号*/
	int minor;/*次设备号*/
	dev_t devid; /*设备号*/
	struct cdev cdev; /*字符设备*/
	struct class *class;/*类 */
	struct device *device; /*设备*/	
	struct device_node *dnode;/*设备树的节点信息*/
	int gpioled1,gpioled2,gpio3;/*GPIO号*/
	int irqnum;            //中断号
	irqreturn_t (*handler)(int,void*);   //中断处理函数
};
 
struct  led_dev ledev;
 
//中断处理函数
static irqreturn_t led_handler(int irq, void *dev_id){
	
	int val = 0;
	struct led_dev *dev=(struct led_dev*)dev_id;
	val=gpio_get_value(dev->gpio3);
	if(val == 0){
		gpio_set_value(ledev.gpioled1,1);
		gpio_set_value(ledev.gpioled2,0);
	}else if(val == 1){
		gpio_set_value(ledev.gpioled1, 0);
		gpio_set_value(ledev.gpioled2, 1);
	}
	
	return IRQ_HANDLED;
}
 
/*led_fops的 led_open*/
static int led_open(struct inode *inode, struct file *file)
 {
    return 0;
 }
 
/*led_fops的led_read*/
static ssize_t led_read(struct file *filp, char __user *buf, size_t len, loff_t *off)
{
    return 0;
}
 
/*led_fops的led_write*/
static ssize_t led_write(struct file *filp, const char __user *buf, size_t len, loff_t *off)
 {
    return 0;
 }
 
/*led_fops的led_release*/
static int led_release(struct inode *inode, struct file *file)
 {
    return 0;
 }
 
/*外部控制*/
static const struct file_operations led_fops={
	.owner = THIS_MODULE,
	.read = led_read,
	.write = led_write,
	.open = led_open,
	.release = led_release,
};
 
 
 
 
 
static const struct of_device_id gpio_led_match[] = {
	{ .compatible = "hello_test", },
	{ },
};
MODULE_DEVICE_TABLE(of, gpio_led_match);
 
 
 
static int gpio_led_probe(struct platform_device * pdev)
{
	int ret = 0;
	printk("hello test probe");
	/*注册字符设备*/
	/*1、申请设备号*/
	ledev.major=0;
	if(ledev.major){/*定义设备号*/
		ledev.devid=MKDEV(ledev.major,0);
		ret=register_chrdev_region(ledev.devid,LED_CNT,LED_NAME);
	}else{/*没有给定设备号*/
		ret = alloc_chrdev_region(&ledev.devid,0,LED_CNT,LED_NAME);
		ledev.major = MAJOR(ledev.devid);
		ledev.minor = MINOR(ledev.devid);
	}
	
	if(ret < 0){
		return ENXIO;
	}
	
	
	/*2、添加字符设备*/
	ledev.cdev.owner = THIS_MODULE;
	cdev_init(&ledev.cdev,&led_fops);//申请空间和简单的初始化,led_fops函数是指向处理与设备实际通信的函数
	ret = cdev_add(&ledev.cdev,ledev.devid,LED_CNT);
	if(ret < 0){
		return ENOTBLK;
	}
	
	ledev.class = class_create(THIS_MODULE,LED_NAME);//class_create函数动态的创建设备的逻辑类,完成部分字段的初始化,
	//然后添加到Linux的内核中去,效果是创建一个以第二个参数为文件的空文件名
	if(IS_ERR(ledev.class)){
		ret=PTR_ERR(ledev.device);
		return ENODEV;
	}
	
	ledev.device = device_create(ledev.class,NULL,ledev.devid,NULL,LED_NAME);
	//device_create能自动创建设备文件是依赖于udev这个应用程序,设备文件通常放在/dev目录下。
	//使用udev后,在/dev目录下就只包含系统中真正存在的设备。
	if(IS_ERR(ledev.device)){
		ret = PTR_ERR(ledev.device);
		return ENODEV;
	}
	
	
	/*解析设备树节点信息,通过名字*/
	ledev.dnode = pdev->dev.of_node;
 
	
	
	/*根据设备结点的信息结构体获取gpio编号*/
    ledev.gpioled1 = of_get_named_gpio(ledev.dnode,"red-gpios",0);
	if(ledev.gpioled1<0){
		printk("of_get_named_gpio failed1!\n");
		return ENOTDIR;
	}
	printk("gpioled1 = %d \n",ledev.gpioled1);
	ledev.gpioled2 = of_get_named_gpio(ledev.dnode,"green-gpios",0);
	if(ledev.gpioled2<0){
		printk("of_get_named_gpio failed2!\n");
		return ENOTDIR;
	}
	printk("gpioled2 = %d \n",ledev.gpioled2);
	ledev.gpio3 = of_get_named_gpio(ledev.dnode,"irq-gpios",0);
	if(ledev.gpio3 < 0){
		printk("of_get_named_gpio failed3!\n");
		return ENOTDIR;
	}
	
	
	/*申请GPIO号*/
	err = gpio_request(ledev.gpioled1,"gpioled1");
	if(err < 0 )
	{
		printk("gpio_request1!\n");
		return ENOTBLK;
	}
	err = gpio_request(ledev.gpioled2,"gpioled2");
	if(err < 0 )
	{
		printk("gpio_request2!\n");
		return ENOTBLK;
	}
	err = gpio_request(ledev.gpio3,"gpio");
	if(err < 0 )
	{
		printk("gpio_request3!\n");
		return ENOTBLK;
	}
	/*设置GPIO方向为输出并默认输出低电平*/
	err = gpio_direction_output(ledev.gpioled1,0);
	if(err<0){
		printk("gpio_direction_output!\n");
		return EFAULT;
	}
	
    err = gpio_direction_output(ledev.gpioled2,0);
	if(err<0){
		printk("gpio_direction_output!\n");
		return EFAULT;
	}
	/*设置GPIO方向为输入*/
	gpio_direction_input(ledev.gpio3);
	//申请中断号码
	ledev.irqnum = gpio_to_irq(ledev.gpio3);
	ledev.handler = led_handler;
 
	ret = request_irq(ledev.irqnum,ledev.handler,
				IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING,"gpio3",&ledev);
	if(ret){
		printk("irq %d request failed!\r\n",ledev.irqnum);
		gpio_free(ledev.gpio3);
		return -1;
	}
	
	
	
	
	/*默认灯打开状况*/
	gpio_set_value(ledev.gpioled1,1);
    gpio_set_value(ledev.gpioled2,0);
 
 
	
	return 0;
	
	
 
}
 
static void gpio_led_shutdown()
{
	printk("shutdown\n");
}
 
static int gpio_led_remove(struct platform_device *pdev){
	gpio_set_value(ledev.gpioled1,0);
    gpio_set_value(ledev.gpioled2,0);
	
	gpio_free(ledev.gpioled1);
	gpio_free(ledev.gpioled2);
	/*删除设备的类*/
	device_destroy(ledev.class ,ledev.devid);
	/*删除类*/
	class_destroy(ledev.class);
	/*删除设备*/
	cdev_del(&ledev.cdev);
	/*注销设备号*/
	unregister_chrdev_region(ledev.devid, LED_CNT);
	//注销中断
	free_irq(ledev.irqnum,&ledev);
	//释放中断号
	gpio_free(ledev.gpio3);
	
	return 0;
}
 
static struct platform_driver gpio_led_driver={
	.probe		= gpio_led_probe,//探测方法和设备的初始化操作
	.shutdown	= gpio_led_shutdown,
	.remove     = gpio_led_remove,
	.driver		= {
		.name	= LED_NAME,//设备树节点名称
		
		.of_match_table = gpio_led_match,//定义兼容的驱动属性
	}
};
 
 
static int  __init led_init(){
	
	printk("led_init !\n");
	return platform_driver_register(&gpio_led_driver);
}
 
static void __exit led_exit(){
     printk("led_exit \n!");	
	
	
	platform_driver_unregister(&gpio_led_driver);
}
 
module_init(led_init);
module_exit(led_exit);
 
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Shakespeare");

3、应用程序

int main()
{
	int fd,ret,retvalue;
    unsigned int cmd;
	unsigned int arg;
	char str [100];
	
	char *filename;
	
	filename = "./dev/led";
	
	fd = open(filename,O_RDWR);
	
		printf("请输入cmd:");
		ret=scanf("%d",&cmd);
		if(ret !=1){
			return -1;
		}
		if(cmd == 1){
			ioctl(fd,RED_CMD,&arg);
		}else if(cmd == 2){
			ioctl(fd,GREEN_CMD,&arg);
		}else if(cmd == 3){
			while(1){
				arg=0;
				ret = ioctl(fd,RG_CMD,&arg);
				if(ret <0)
				{
					return -1;
				}
				sleep(1);
				arg=1;
				ret = ioctl(fd,RG_CMD,&arg);
				if(ret <0)
				{
					return -1;
				}
				sleep(1);
			}
			
		}

	close(fd);

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
# 智慧旅游解决方案摘要 智慧旅游解决方案旨在通过新一代信息网络技术和装备,实现旅游服务、管理、营销和体验的智能化。该方案响应国家政策背景,如国家旅游局和工业信息化部的指导意见,以及国家发改委的发展规划,强调数字化、网络化、智能化在旅游业的应用,推动5G和移动互联网技术在旅游领域的创新应用。 方案的建设目标围绕“一个中心、四个方面、五大平台”展开,即以智慧旅游数据中心为核心,面向服务、管理、商务和营销构建智慧景区管理平台、智慧旅游服务平台、智慧旅游商务平台和智慧旅游营销平台。这五大平台将整合全域旅游资源,提升旅游设施,拓展旅游空间,融合旅游产业链,提升旅游服务,定制旅游产品,推进旅游改革。 建设内容涵盖了整体架构的构建,包括智慧服务、智慧管理、电子商务和智慧营销等方面。通过云计算、人工智能、大数据、物联网、5G等技术,实现“云-管-端”服务能力,打造集时间、空间、层次为一体的体验平台。此外,还包括智慧景区管理平台的多个子系统,如视频监控、应急指挥调度、流量监测、舆情监督、线路SOS一键呼救、GIS人车调度、停车场管理、语音广播、环境监测管理、多媒体发布、电子巡更以及指挥调度大屏建设等。 智慧旅游服务平台则包括自助票务系统、人脸识别、扫码购票、景区门户网站、机游、WIFI覆盖系统、数字全景VR、AI机器人、智慧座椅、智慧厕所等,旨在提升游客体验,实现景区的智能化管理和服务。通过这些服务,游客可以享受到便捷的购票、入园、导览和信息服务,同时景区管理者能够更有效地监控和管理景区运营。 智慧旅游商务平台则侧重于旅行社团队申报、电子商城、综合票务系统、分销管理系统、大会员系统和景区聚合支付系统,为旅游企业提供全面的商务服务和营销支持。这些平台和系统帮助旅游企业拓宽分销渠道,实现财务管理和订单管理,同时为游客提供便捷的支付和会员服务。 最后,智慧营销平台通过综合票务系统、分销管理系统、大会员系统和景区聚合支付系统,为旅游行业提供精准的营销工具和策略。这些工具和策略有助于整合旅游资源,拓宽销售渠道,提升游客体验,实现旅游业务的数字化和智能化。 智慧旅游解决方案通过这些综合性的技术和平台,不仅提升了游客的旅游体验,还为旅游行业的可持续发展提供了强有力的技术支持和数据驱动的决策依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值