国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[驅(qū)動開發(fā)]gpio子系統(tǒng)及中斷實現(xiàn)led亮滅

這篇具有很好參考價值的文章主要介紹了[驅(qū)動開發(fā)]gpio子系統(tǒng)及中斷實現(xiàn)led亮滅。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

編寫LED燈的驅(qū)動,使用GPIO子系統(tǒng),里面添加按鍵的中斷處理

1.應用程序發(fā)送指令控制發(fā)光二極管亮滅

2.按鍵1按下,led1電位反轉(zhuǎn);按鍵2按下,led2電位反轉(zhuǎn);按鍵3按下,led3電位反轉(zhuǎn)? ?

//頭文件
#ifndef __LED_H__
#define __LED_H__

//功能碼
#define LED_ON _IOW('l',1,int)
#define LED_OFF _IOW('l',0,int)
#endif
//應用程序?qū)崿F(xiàn)LED的亮滅
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include "led.h"
int main(int argc, const char *argv[])
{
	int a,b;
	while(1)
	{
		int fd_led = open("/dev/myled0",O_RDWR);	
		if(fd_led < 0)
		{
			printf("打開設備文件失敗\n");
			exit(-1);
		}
		printf("請輸入要控制的燈:1 2 3>>");
		scanf("%d",&b);
		printf("輸入控制命令:0熄滅 1開燈>>>");
		scanf("%d",&a);
		switch(a)
		{
		case 1:
			ioctl(fd_led,LED_ON,&b);
			break;
		case 0:
			ioctl(fd_led,LED_OFF,&b);
			break;
		}
		close(fd_led);
	}
	return 0;
}
//驅(qū)動程序
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/io.h>
#include<linux/of_irq.h>
#include<linux/interrupt.h>
#include "led.h"
/*  leds{
	led1-gpios=<&gpioe 10 0>;//10表示引腳編號  0表示默認
	led2-gpios=<&gpiof 10 0>;
	led3-gpios=<&gpioe 8 0>;
	};*/
struct device_node *dnode1;
struct device_node *dnode2;
struct gpio_desc *gpiono1;
struct gpio_desc *gpiono2;
struct gpio_desc *gpiono3;
struct cdev *cdev;
int major=168;
int minor=0;
struct class *cls;
struct device *dev;
dev_t devno;
int i;
unsigned int irqno[3];      //軟中斷號

//中斷處理函數(shù)
irqreturn_t myirq_handler(int irqno, void *dev_id)
{
	unsigned int id=(unsigned int)dev_id;
	switch(id)
	{
		case 0:
			printk("KEY1_INTERRUPT\n");
			gpiod_set_value(gpiono1,!gpiod_get_value(gpiono1));
			break;
		case 1:
			printk("KEY2_INTERRUPT\n");
			gpiod_set_value(gpiono2,!gpiod_get_value(gpiono2));
			break;
		case 2:
			printk("KEY3_INTERRUPT\n");
			gpiod_set_value(gpiono3,!gpiod_get_value(gpiono3));
			break;
	}

	return IRQ_HANDLED;
}
/*********************封裝操作方法***************************/
int mycdev_open(struct inode *inode, struct file *file)
{
	//printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
	return 0;
}


long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	int which;
	copy_from_user(&which,(void *)arg,4);
	switch(cmd)
	{
	case LED_ON:         // 亮燈
		switch(which)
		{
		case 1:   
			gpiod_set_value(gpiono1, 1);
			break;
		case 2:
			gpiod_set_value(gpiono2, 1);
			break;
		case 3:
			gpiod_set_value(gpiono3, 1);
			break;
		}
		break;
	case LED_OFF:
		switch(which)
		{
		case 1:
			gpiod_set_value(gpiono1, 0);
			break;
		case 2:
			gpiod_set_value(gpiono2, 0);
			break;
		case 3:
			gpiod_set_value(gpiono3, 0);
		}
		break;
	}
	//printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
	return 0;
}

int mycdev_close(struct inode *inode, struct file *file)
{
	//printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
	return 0;
}
/***********************************************************************/

//定義一個操作方法結(jié)構(gòu)體變量并初始化
struct file_operations fops =
{
	.open    =  mycdev_open,
	.release =  mycdev_close,
	.unlocked_ioctl = mycdev_ioctl,
};
static int __init mycdev_init(void)
{
	int ret,i;
	//1.申請對象空間 cdev_alloc
	cdev = cdev_alloc();
	if(cdev == NULL)
	{
		printk("申請對象空間失敗\n");
		ret=-EFAULT;
		goto out1;
	}
	printk("申請對象空間成功\n");
	//2.初始化對象 cdev_init
	cdev_init(cdev,&fops);
	printk("初始化對象成功\n");
	//3.申請設備號 register_chrdev_region()或clloc_chrdev_region()
	if(major != 0)  //靜態(tài)申請
	{
		ret=register_chrdev_region(MKDEV(major,minor),3,"myled");
		if(ret)
		{
			printk("申請靜態(tài)設備號失敗\n");
			goto out2;
		}
		printk("申請靜態(tài)設備號成功major=%d\n",major);
	}
	else    //動態(tài)申請
	{
		ret=alloc_chrdev_region(&devno,minor,3,"myled");
		if(ret)
		{
			printk("申請動態(tài)設備號失敗\n");
			goto out2;
		}
		major=MAJOR(devno);
		minor=MINOR(devno);
		printk("申請動態(tài)設備號成功major=%d\n",major);
	}

	//4.注冊驅(qū)動對象 cdev_add()
	ret=cdev_add(cdev,MKDEV(major,minor),3);
	if(ret)
	{
		printk("注冊驅(qū)動對象失敗\n");
		goto out3;
	}
	printk("注冊驅(qū)動對象成功\n");
	//5.向上提交目錄 class_create()
	cls=class_create(THIS_MODULE,"myled");
	if(IS_ERR(cls))
	{
		printk("向上提交目錄失敗\n");
		ret = -PTR_ERR(cls);
		goto out4;
	}
	printk("向上提交目錄成功\n");
	//6.向上提交設備信息 device_create()
	for(i=0;i<3;i++)
	{
		dev=device_create(cls,NULL,MKDEV(major,i),NULL,"myled%d",i);
		if(IS_ERR(dev))
		{
			printk("向上提交設備節(jié)點失敗\n");
			ret = -PTR_ERR(dev);
			goto out5;
		}
	}
	printk("向上提交設備信息成功\n");
	// 根據(jù)設備樹節(jié)點的路徑解析設備樹信息
	dnode1 = of_find_node_by_path("/leds");
	if (dnode1 == NULL)
	{
		printk("解析設備樹節(jié)點led失敗\n");
		return -EFAULT;
	}
	printk("解析設備樹節(jié)點led成功\n");
	// 申請gpio_desc對象并設置輸出為低電平
	gpiono1 = gpiod_get_from_of_node(dnode1, "led1-gpios", 0, GPIOD_OUT_LOW, NULL);
	if (IS_ERR(gpiono1))
	{
		printk("申請gpio1對象失敗\n");
		return -PTR_ERR(gpiono1);
	}
	printk("申請gpio1對象成功\n");
	gpiono2 = gpiod_get_from_of_node(dnode1, "led2-gpios", 0, GPIOD_OUT_LOW, NULL);
	if (IS_ERR(gpiono2))
	{
		printk("申請gpio2對象失敗\n");
		return -PTR_ERR(gpiono2);
	}
	printk("申請gpio2對象成功\n");
	gpiono3 = gpiod_get_from_of_node(dnode1, "led3-gpios", 0, GPIOD_OUT_LOW, NULL);
	if (IS_ERR(gpiono3))
	{
		printk("申請gpio3對象失敗\n");
		return -PTR_ERR(gpiono3);
	}
	printk("申請gpio3對象成功\n");

	// 根據(jù)設備樹節(jié)點的路徑解析設備樹信息
	dnode2 = of_find_node_by_path("/myirq");
	if (dnode2 == NULL)
	{
		printk("解析設備樹節(jié)點myirq失敗\n");
		return -EFAULT;
	}
	printk("解析設備樹節(jié)點myirq成功\n");
	for(i=0;i<3;i++)
	{
		//獲取軟中斷號
		irqno[i]=irq_of_parse_and_map(dnode2,i);
		if(!irqno[i])
		{
			printk("軟中斷號irqno[%d]獲取失敗\n",i);
			return -ENXIO;
		}
		printk("軟中斷號獲取成功irqno[%d]=%d\n",i,irqno[i]);

		//注冊中斷
		ret=request_irq(irqno[i],myirq_handler,IRQF_TRIGGER_FALLING,"key",(void *)i);
		if(ret)
		{
			printk("注冊驅(qū)動失敗\n");
			return ret;
		}
		printk("key%d中斷注冊成功\n",i);
	}
	return 0;
out5:
	for(--i;i>=0;i--)
	{
		//銷毀上面提交的設備信息
		device_destroy(cls,MKDEV(major,i));
	}
	class_destroy(cls);
out4:
	cdev_del(cdev);
out3:
	unregister_chrdev_region(MKDEV(major,minor),3);
out2:
	kfree(cdev);
out1:
	return ret;
}
static void __exit mycdev_exit(void)
{
	// 滅燈
	gpiod_set_value(gpiono1, 0);
	gpiod_set_value(gpiono2, 0);
	gpiod_set_value(gpiono3, 0);
	// 釋放gpio編號
	gpiod_put(gpiono1);
	gpiod_put(gpiono2);
	gpiod_put(gpiono3);
	//注銷中斷
	for(i=0;i<3;i++)
	{
		free_irq(irqno[i],NULL);
	}
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

文章來源地址http://www.zghlxwxcb.cn/news/detail-622576.html

到了這里,關(guān)于[驅(qū)動開發(fā)]gpio子系統(tǒng)及中斷實現(xiàn)led亮滅的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Linux驅(qū)動開發(fā):gpio子系統(tǒng)

    目錄 1、GPIO配置流程 2、GPIO子系統(tǒng)API 2.1?of_find_node_by_path 2.2 of_get_named_gpio 2.3 gpio_request 與?gpiod_get 與?gpiod_get_index 2.4?gpio_direction_input 與?gpiod_direction_input 2.5?gpio_direction_output 與?gpiod_direction_output 2.6?gpio_get_value 與?gpiod_get_value 2.7?gpio_set_value 與?gpiod_set_value 2.8? gpiod_get_from

    2024年02月12日
    瀏覽(17)
  • 【Linux驅(qū)動開發(fā)】011 gpio子系統(tǒng)

    【Linux驅(qū)動開發(fā)】011 gpio子系統(tǒng)

    前面我們編寫了基于設備樹的 LED 驅(qū)動,但是驅(qū)動的本質(zhì)還是沒變,都是配置 LED 燈所使用的 GPIO 寄存器,驅(qū)動開發(fā)方式和裸機基本沒啥區(qū)別。本章我們就來學習一下如何借助 pinctrl 和 gpio 子系統(tǒng)來簡化 GPIO 驅(qū)動開發(fā)。? ?Linux 內(nèi)核針對 PIN 的配置推出了 pinctrl 子系統(tǒng),對于

    2024年02月03日
    瀏覽(18)
  • 【Linux驅(qū)動開發(fā)】012 gpio子系統(tǒng)API函數(shù)

    設置好設備樹以后, 在驅(qū)動程序中就可以使用 gpio 子系統(tǒng)提供的 API 函數(shù)來操作指定的 GPIO, gpio 子系統(tǒng)向驅(qū)動開發(fā)人員屏蔽了具體的讀寫寄存器過程。這就是驅(qū)動分層與分離的好處,大家各司其職,做好自己的本職工作即可。 gpio 子系統(tǒng)提供的常用的 API 函數(shù)有下面幾個:

    2023年04月18日
    瀏覽(24)
  • Linux驅(qū)動開發(fā)之【pinctrl和gpio子系統(tǒng)】

    Linux驅(qū)動開發(fā)之【pinctrl和gpio子系統(tǒng)】

    目錄 一、?pinctrl和gpio子系統(tǒng) 1.pinctrl子系統(tǒng) 1.1 pinctrl子系統(tǒng)簡介 1.2 pinctrl子系統(tǒng)驅(qū)動 1.3 設備樹中添加pinctrl節(jié)點模版 2. gpio子系統(tǒng) 2.1 gpio子系統(tǒng)簡介 2.2 gpio子系統(tǒng)驅(qū)動 2.3 gpio子系統(tǒng)API函數(shù) 2.4 設備樹中添加gpio節(jié)點模板 2.5 與gpio相關(guān)的OF函數(shù) 3. 驅(qū)動程序編寫 3.1 驅(qū)動入口函數(shù) 3

    2024年02月06日
    瀏覽(17)
  • <Linux開發(fā)>驅(qū)動開發(fā) -之-基于pinctrl/gpio子系統(tǒng)的beep驅(qū)動

    <Linux開發(fā)>驅(qū)動開發(fā) -之-基于pinctrl/gpio子系統(tǒng)的beep驅(qū)動

    <Linux開發(fā)>驅(qū)動開發(fā) -之-基于pinctrl/gpio子系統(tǒng)的beep驅(qū)動 交叉編譯環(huán)境搭建: <Linux開發(fā)> linux開發(fā)工具-之-交叉編譯環(huán)境搭建 uboot移植可參考以下: <Linux開發(fā)> -之-系統(tǒng)移植 uboot移植過程詳細記錄(第一部分) <Linux開發(fā)> -之-系統(tǒng)移植 uboot移植過程詳細記錄(第二部分

    2024年02月13日
    瀏覽(18)
  • 【LED子系統(tǒng)深度剖析】一、開篇詞|Linux驅(qū)動開發(fā)必讀

    我的圈子: 高級工程師聚集地 我是董哥,高級嵌入式軟件開發(fā)工程師,從事嵌入式Linux驅(qū)動開發(fā)和系統(tǒng)開發(fā),曾就職于世界500強公司! 創(chuàng)作理念:專注分享高質(zhì)量嵌入式文章,讓大家讀有所得!

    2024年02月09日
    瀏覽(19)
  • RK3568驅(qū)動指南|第十二篇 GPIO子系統(tǒng)-第128章 GPIO入門實驗

    RK3568驅(qū)動指南|第十二篇 GPIO子系統(tǒng)-第128章 GPIO入門實驗

    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工藝,搭載一顆四核Cortex-A55處理器和Mali G52 2EE 圖形處理器。RK3568 支持4K 解碼和 1080P 編碼,支持SATA/PCIE/USB3.0 外圍接口。RK3568內(nèi)置獨立NPU,可用于輕量級人工智能應用。RK3568 支持安卓 11 和 linux 系統(tǒng),主要面向物聯(lián)網(wǎng)

    2024年01月21日
    瀏覽(30)
  • 【LED子系統(tǒng)深度剖析】三、硬件驅(qū)動層詳解

    個人主頁:董哥聊技術(shù) 我是董哥,嵌入式領(lǐng)域新星創(chuàng)作者 創(chuàng)作理念:專注分享高質(zhì)量嵌入式文章,讓大家讀有所得!

    2024年02月07日
    瀏覽(42)
  • HCIA-HarmonyOS設備開發(fā)認證V2.0-IOT硬件子系統(tǒng)-GPIO

    HCIA-HarmonyOS設備開發(fā)認證V2.0-IOT硬件子系統(tǒng)-GPIO

    輕量系統(tǒng)設備通常需要進行外設控制,例如溫濕度數(shù)據(jù)的采集、燈開關(guān)的控制,因此在完成內(nèi)核開發(fā)后,需要進行設備驅(qū)動的開發(fā)。 主要Hi3861芯片介紹如何運用 IoT 硬件子系統(tǒng)進行輕量系統(tǒng)設備的驅(qū)動開發(fā)。 在輕量系統(tǒng)的聯(lián)接模組中,智能家居遠程控制能力的實現(xiàn),最終是通

    2024年02月21日
    瀏覽(27)
  • Linux驅(qū)動開發(fā):SPI子系統(tǒng)

    Linux驅(qū)動開發(fā):SPI子系統(tǒng)

    MISO:主設備數(shù)據(jù)輸入,從設備數(shù)據(jù)輸出。 MOSI:主設備數(shù)據(jù)輸出,從設備數(shù)據(jù)輸入。 SCLK:時鐘信號,由主設備產(chǎn)生。 CS:? ? 從設備片選信號,由主設備控制。 CPOL(時鐘極性) :? ?0:時鐘起始位低電平 ? ? ?1:時鐘起始為高電平 ? CPHA(時鐘相位) :0:第一個時鐘周期采樣? ?1

    2024年02月06日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包