首页 > 其他分享 >基于i.MX6ULL的掉电检测设计与软件测试

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

时间:2023-11-09 11:12:04浏览次数:40  
标签:return power irq 掉电 fasync MX6ULL include my 软件测试

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

3.png

图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>

 

 

#definepower_MAJOR 200

 

staticstruct class *my_class;

staticstruct fasync_struct *fasync_queue; //异步通知队列

 

#defineGPIO_NUM 1  //中断引脚为:GPIO1_1

staticunsigned int irq_num;

 

                                                                                          

/* 打开 */

intpower_open(struct inode *inode,struct file *filp){

         return 0;

 

}

 

/* 关闭 */

intpower_release(struct inode *inode,struct file *filp){

         return 0;

}

 

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

 

         return count;

}

 

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

 

         return count;

}

 

staticint 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;

}

 

staticconst struct file_operations simple_fops={

         .owner=THIS_MODULE,

         .open=power_open,

         .release=power_release,

    .read=power_read,

         .write=power_write,

    .fasync=my_fasync,

};

 

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

staticirqreturn_t irq_callback (int irqno, void *dev_id){

                  printk("irq power-detectworking !\n");

                  if (fasync_queue) {

            kill_fasync(&fasync_queue, SIGIO,POLL_IN);

                  }

         return IRQ_HANDLED;

}

 

intpower_init_module(void){

         int rtn;

         int ret;

         /* 注册设备驱动 */ 

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

         if(ret<0){

                  printk("Unable toregister 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 pinrequest 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 requestirq false\n");

         } else {

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

         }

         

    printk("module_initsucessful!!!\n");

         return 0;

}

 

/* 卸载 */ 

voidpower_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_exitsucessful!!!\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>

 

staticint fd;

 

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

voidsigterm_handler(int signo)

{

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

}

 

intmain(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下降沿中断,并提供应用程序掉电信号。

4.png

图1..2掉电检测

 

标签:return,power,irq,掉电,fasync,MX6ULL,include,my,软件测试
From: https://www.cnblogs.com/vanxoak/p/17819264.html

相关文章

  • 软件测试|好用的pycharm插件推荐(三)——Rainbow Brackets
    简介我们平时写代码的时候,括号是让我们非常头疼的地方,特别是代码逻辑很多,层层嵌套的情况。一眼很难看出,代码是从哪个括号开始,到哪个反括号结束的。这个时候要是有一款工具能够让我们一眼就看出代码从哪个括号开始,到哪个反括号结束,无疑对我们会有很大帮助。PyCharmRainbowBra......
  • 软件测试|MySQL BETWEEN AND:范围查询详解
    简介在MySQL数据库中,使用BETWEENAND操作符可以进行范围查询,即根据某个字段的值在指定范围内进行检索数据。这个操作符非常有用,因为它可以让我们轻松地筛选出位于两个特定值之间的数据,而不需要使用复杂的条件语句。BETWEENAND操作符的语法BETWEENAND操作符的基本语法如下:SE......
  • 软件测试|MySQL LIKE:深入了解模糊查询
    简介在数据库查询中,模糊查询是一种强大的技术,可以用来搜索与指定模式匹配的数据。MySQL数据库提供了一个灵活而强大的LIKE操作符,使得模糊查询变得简单和高效。本文将详细介绍MySQL中的LIKE操作符以及它的用法,并通过示例演示其功能。基本语法MySQL中的LIKE操作符用于模糊匹配数......
  • 软件测试|如何在Pycharm中配置文件头部信息
    简介PyCharm是一款功能强大的Python集成开发环境(IDE),在开发过程中,我们经常需要在代码文件的开头添加固定的文件说明信息,例如版权声明、作者信息、创建日期等。手动添加这些信息可能会很繁琐,但是PyCharm提供了一个方便的功能,可以自动生成固定文件说明信息。本文将详细介绍在PyChar......
  • 软件测试|好用的pycharm插件推荐(一)——Indent Rainbow
    简介在Python中,缩进至关重要,缩进关系着我们的代码层级和逻辑的实现,一旦缩进错误,整个代码的运行就会报错,但是对于初学者来说,又不太容易注意到这一点,所以要是能够有一款提示代码缩进的插件能够使用的话,对我们是很有帮助的。PyCharm作为一款功能强大的Python集成开发环境(IDE),提供了......
  • 软件测试|MySQL DISTINCT关键字过滤重复数据
    简介在MySQL中,有时候我们需要从表中检索唯一的、不重复的数据。这时,我们可以使用DISTINCT关键字来过滤掉重复的数据行。在本文中,我们将深入探讨MySQL中DISTINCT的用法以及如何在查询中使用它来得到不重复的结果集。基本语法DISTINCT关键字用于在SELECT语句中指示查询结果中去......
  • 软件测试|Chrome 115之后的版本,如何更新driver?
    问题描述前两天在运行一个web自动化测试脚本时,报了如下的错误,ThisversionofChromeDriveronlysupportsChromeversion113Currentbrowserversionis115.0.5790.110withbinary,如下图所示:该报错提示我,当前的driver只支持113版本的Chrome浏览器,但是我的Chrome已经自动......
  • 软件测试|Selenium 自动化处理授权框、登录框和握手框
    简介Selenium是一个广泛用于自动化web浏览器操作的工具,可以用于模拟用户在浏览器中的交互。在自动化测试和网页数据抓取中,经常会遇到需要处理授权框、登录框和握手框的情况。在本文中,我们将详细介绍如何使用Selenium处理这些常见的弹出框,并提供示例代码。弹框分类在web自动化......
  • 软件测试|Selenium Expected Conditions 模块使用
    简介在自动化测试中,页面元素可能需要一些时间才能加载或完成某种操作,为了确保测试的稳定性,我们需要等待特定条件变为真。Selenium提供了一个ExpectedConditions模块,用于智能等待页面元素的出现、可见、可点击等条件。本文将详细介绍如何使用Selenium的ExpectedConditions......
  • 软件测试需求分析是什么?为什么需要进行测试需求分析?
    在软件开发中,软件测试是确保软件质量的重要环节之一。而软件测试需求分析作为软件测试的前置工作,对于保证软件测试的顺利进行具有重要意义。软件测试需求分析是指对软件测试的需求进行细致的分析和规划,以明确测试的目标、任务和范围,为后续的测试工作提供指导和支持。一、软......