基于i.MX6ULL的掉电检测设计与软件测试

news2024/11/29 4:06:03

基于i.MX6ULL平台设计实现掉电检测功能,首先选择一路IO,利用IO电平变化触发中断,在编写驱动时捕获该路GPIO的中断,然后在中断响应函数中发送信号通知应用程序掉电发生了。

图 1.1 掉电信号IO

       驱动代码:

#include <linux/module.h>

#include <linux/init.h>

#include <linux/types.h>

#include <linux/fs.h>

#include <linux/mm.h>

#include <linux/cdev.h>

#include <linux/errno.h>

#include <linux/sched.h>

#include <linux/device.h>

#include <asm/io.h>

#include <asm/switch_to.h>

#include <asm/uaccess.h>

 

#include <asm/gpio.h>   

#include <linux/interrupt.h>

#include <linux/irq.h>

 

#define power_MAJOR 200

 

static struct class *my_class;

static struct fasync_struct *fasync_queue; //异步通知队列

 

#define GPIO_NUM 1  //中断引脚为:GPIO1_1

static unsigned int irq_num;

                                                                                         

/* 打开 */

int power_open(struct inode *inode,struct file *filp){

         return 0;

 

}

 

/* 关闭 */

int power_release(struct inode *inode,struct file *filp){

         return 0;

}

 

ssize_t power_read(struct file *filp,char __user *buf,size_t count,loff_t *f_pos){

 

         return count;

}

 

ssize_t power_write(struct file *file,const char __user *buf,size_t count,loff_t *f_pos){

 

         return count;

}

 

static int my_fasync(int fd, struct file * filp, int on)

{

    int retval;

    retval=fasync_helper(fd,filp,on,&fasync_queue);

    /*将该设备登记到fasync_queue队列中去*/

    if(retval<0)

      return retval;

    return 0;

}

static const struct file_operations simple_fops={

         .owner=THIS_MODULE,

         .open=power_open,

         .release=power_release,

    .read=power_read,

         .write=power_write,

    .fasync=my_fasync,

};

 

/* 在中断服务函数中向应用层发送消息-异步通知 */

static irqreturn_t irq_callback (int irqno, void *dev_id){

                  printk("irq power-detect working !\n");

                  if (fasync_queue) {

            kill_fasync(&fasync_queue, SIGIO, POLL_IN);

                  }

         return IRQ_HANDLED;

}

 

int power_init_module(void){

         int rtn;

         int ret;

         /* 注册设备驱动 */

         ret = register_chrdev(power_MAJOR,"power-detect-test",&simple_fops);

         if(ret<0){

                  printk("Unable to register character device %d!/n",ret);

                  return ret;

         }

 

         /* 自动创建设备节点 */

         my_class = class_create(THIS_MODULE, "my_class");

         device_create(my_class, NULL, MKDEV(power_MAJOR, 0), NULL,"powerdetect");

        

         /*gpio申请*/

         rtn = gpio_request(GPIO_NUM, "my_irq");

         if(rtn!=0){

                  printk("my_irq irq pin request io failed.\n");

         }

         rtn = gpio_direction_input(GPIO_NUM);

         if(rtn<0){

                  printk("gpio_direction_input() failed !\n"); 

         }

         /*获取gpio中断号*/

         irq_num = gpio_to_irq(GPIO_NUM);

        

         /*GPIO中断服务函数注册,*/                    /*下降沿触发*/              

         rtn = request_irq(irq_num, irq_callback,IRQF_TRIGGER_FALLING,"my_irq", NULL);

         if (rtn<0) {

                  printk("my_irq request irq false\n");

         } else {

                  printk("my_irq request irq success: %d\n",irq_num);

         }

        

    printk("module_init sucessful!!!\n");

         return 0;

}

 

/* 卸载 */

void power_cleanup_module(void){

         /* 卸载相应的设备驱动 */

         unregister_chrdev(power_MAJOR,"power-detect-test");    

         device_destroy(my_class,MKDEV(power_MAJOR, 0));

         class_destroy(my_class);

        

         /*释放GPIO*/

         gpio_free(GPIO_NUM);

 

    printk("module_exit sucessful!!!\n");

}

 

/* 宏实现 */

module_init(power_init_module);

module_exit(power_cleanup_module);

 

/* 开源许可声明 */ 

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Zou");

 应用代码:

#include <stdio.h>

#include <fcntl.h>

#include <stdlib.h>

#include <signal.h>

#include <unistd.h>

#include <fcntl.h>

 

static int fd;

 

/* 内核产生异步通知,调用该应用层函数处理 */

void sigterm_handler(int signo)

{

         printf("app irq work !!!\n");

}

 

int main(void)

 {

    int oflags;

 

    fd=open("/dev/powerdetect",O_RDWR);  //打开设备文件

        

    /* 启动异步通知信号驱动机制 */

    signal(SIGIO, sigterm_handler);

    fcntl(fd, F_SETOWN, getpid());

    oflags = fcntl(fd, F_GETFL);

    fcntl(fd, F_SETFL, oflags | FASYNC);

        

    /*建立一个死循环,防止程序结束 */

    while(1)

    {

        printf("sleep\n");

        usleep(200000);  //2ms

    }

        

    close(fd);

    return 0;

 }

将驱动编译成模块,上电加载并执行应用程序后,将电压缓慢下调至掉电临界点。触发GPIO下降沿中断,并提供应用程序掉电信号。

图1..2 掉电检测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1187752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC视频生成/编辑技术调研报告

人物AIGC&#xff1a;FaceChain人物写真生成工业级开源项目&#xff0c;欢迎上github体验。 简介&#xff1a; 随着图像生成领域的研究飞速发展&#xff0c;基于diffusion的生成式模型取得效果上的大突破。在图像生成/编辑产品大爆发的今天&#xff0c;视频生成/编辑技术也引起…

【多语言多商户跨境商城系统.源码开源无加密】—— 打破语言障碍,实现全球商业连接

随着全球电子商务的飞速发展&#xff0c;多语言多商户跨境商城系统已成为行业内的热门需求。这类系统能够有效地解决跨国交易中的语言沟通难题&#xff0c;同时为多商户提供公平的交易平台&#xff0c;实现全球商业连接。 今天&#xff0c;我们为您推荐一款多语言多商户跨境商城…

3、FFmpeg基础

1、FFmpeg 介绍 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库。 2、FFmpeg 组成 - libavformat&#xff1a;用于…

java项目之电子资源管理系统(ssm+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的电子资源管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; &#xff08;1&#xff09;在个…

Redis系列-Redis性能优化与安全【9】

目录 Redis系列-Redis性能优化与安全【9】Redis性能优化策略Redis安全设置与防护措施Redis监控与诊断工具介绍 七、Redis应用案例与实战八、Redis未来发展与趋势 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; Redis系列-Redis性能优化与安…

Milvus Cloud——什么是 Agent?

什么是 Agent? 根据 OpenAI 科学家 Lilian Weng 的一张 Agent 示意图 [1] 我们可以了解 Agent 由一些组件来组成。 规划模块 子目标分解:Agent 将目标分为更小的、易于管理的子目标,从而更高效地处理复杂的任务。 反省和调整:Agent 可以对过去的行为进行自我批评和自我反思…

【Linux】 awk命令使用

AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 语法 awk [选项] [文件] awk [选项] [程序] [文件] awk命令 -Linux手…

磁盘空间占用巨大的meta.db-wal文件缓存(tracker-miner-fs索引服务)彻底清除办法

磁盘命令参考本博客linux磁盘空间满了怎么办. 问题: 磁盘空间被盗 今天瞄了一下我的Ubuntu系统盘&#xff0c; nftdiggernftdigger-Ubuntu:~$ df -h 文件系统 容量 已用 可用 已用% 挂载点 udev 16G 0 16G 0% /dev tmpfs 3.2G 1.9…

3.5米分辨率地表温度图像——商业热红外遥感卫星HotSat-1第一批数据发布

最近几年上百颗的光学和雷达商业遥感卫星发射升空&#xff0c;空间分辨率更高&#xff0c;性能更强&#xff0c;竞争也越来越激烈。除了光学和雷达遥感卫星之外&#xff0c;也出现了不少多样化传感器的商业遥感卫星&#xff0c;高光谱、热红外、无线电掩星等。不同的传感器获取…

关于 DC电源模块的体积与功率达到平衡的关系

关于BOSHIDA DC电源模块的体积与功率达到平衡的关系 DC电源模块是一种将交流电转换为直流电的装置。它是许多电子设备中非常重要的部分&#xff0c;尤其是电子产品的便携性和用电时间方面&#xff0c;一直是DC电源模块必须考虑的因素。因此&#xff0c;电源模块的体积和功率之…

CAN2无法通信问题

文章目录 一、CAN2通信要注意的问题二、CAN中断无法进入的问题 一、CAN2通信要注意的问题 从这张图片不难看出can1为主机&#xff0c;can2为从机。因此can2的启动前提是已经启动了can1. can通讯can2是基于can1的 使用can2之前必须初始化can1 单独使用CAN2时一定要同时打开CAN1和…

数据采集代码示例

首先&#xff0c;你需要安装一个 Lua 的爬虫库&#xff0c;例如 Luanode 或者 Lush&#xff1a; lua local ltn12 require("ltn12") local http require("") local response http.request{ host "", port , path "/", …

MySQL 5.7停服你的数据库还没迁移怎么破?

10月底&#xff0c;MySQL5.7版本正式终止生命周期状态&#xff0c;即EOL&#xff08;End of Life&#xff09;&#xff0c;也就是俗称的“停服”&#xff0c;意味着该版本的用户将不能再获得新的安全补丁、版本迭代升级、维护和支持服务&#xff0c;众多使用MySQL 5.7的各个行业…

linux gdb 调试 常见调试命令介绍+总结

1.调试前准备 -g gcc arcg.c -g -oO -o app //必须添加-g 2.调试 gdb gdb app 3.常见调试命令 set args 1 2 3 4 5 6 //设置参数 show args //查看参数 3.1执行程序 1.start2. run gdb app set args 1 2 3 4 5 start //执行一行 c //继续执行 q…

了解千兆光模块和万兆光模块的标准规范

千兆光模块和万兆光模块作为数据中心和网络领域的关键设备&#xff0c;光模块生产需要遵循一些标准规范&#xff0c;为光模块的设计、制造和应用提供统一的规则和指导&#xff0c;确保光模块在各种设备和网络环境中能够正常工作&#xff0c;并满足用户的需求和期望&#xff0c;…

双十一全光谱灯哪个牌子好?双十一必备护眼台灯推荐

护眼台灯近些年来很受欢迎&#xff0c;它采用专业的技术能够帮助调节环境光的变化。尤其是在光线变化复杂的情况下&#xff0c;能够通过智能调光来改善环境&#xff0c;可以减少许多学生党上班族的近视风险&#xff0c;成为了许多学生党打工人的必备照明工具之一。不过随着它的…

移除元素(双指针)

27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改…

如何准备软考-软件设计师(上)

前言&#xff1a; 参加了2023年下半年的软考-软件设计师的考试&#xff0c;之所以参加这个考试&#xff0c;主要出于以下几个目的&#xff1a; 1.减税。虽然只有1500的额度&#xff0c;但是考虑到税率&#xff0c;其实也不少&#xff0c;而且也没有更好的省钱途径。 2.学习。…

Unit2_2:动态规划DP

文章目录 一、最长公共子序列分析填表伪代码过程时间复杂度 二、最长公共子串问题分析过程时间复杂度 最小编辑距离背景分析状态转移方程填表伪代码案例 一、最长公共子序列 子序列&#xff1a;指从原序列中选取出来的具有相对顺序的一组元素&#xff0c;而这些元素不一定是连…

内衣洗衣机和手洗哪个干净?家用小型洗衣机推荐

在最近的几年来&#xff0c;人们对生活和健康的追求越来越高&#xff0c;使得越来越多的内衣洗衣机也走进了我们日常生活的视线&#xff0c;许多研究显示&#xff0c;单纯只是手洗是不能彻底消除我们贴身衣物上的细菌&#xff0c;而机洗则可以有效地消除大部分的细菌&#xff0…