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

发表时间:2023-11-09 09:30

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

基于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掉电检测


文章列表
`overlayroot` 是一种使用 OverlayFS 实现的功能,可将根文件系统挂载为只读,并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例,介绍制作 overlayroot 的详细步骤。1. 制作精简文件系统ramdisk1.1   环境准备1. 目标系统:确保系统支持 OverlayFS(内核...
RK3506是一款高性能三核Cortex-A7处理器,内部集成Cortex-M0核心, 适合于工业控制、工业通信、人机交互等应用场景。为方便开发、使用,万象奥科推出HD-RK3506G-MINI单板机,仅需99元即可入手。单板机接口包含:以太网、RS232/RS485、CAN总线、液晶屏,支持接口扩展!产品特点:  多核异构3xCortex-A7+Cortex-M0,低功耗、高实时  外设接...
RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,...
RK3506单板机(卡片电脑)是一款高性能三核Cortex-A7处理器,内部集成Cortex-M0核心,RK3506单板机具有接口丰富、实时性高、显示开发简单、低功耗及多系统支持等特点,非常适合于工业控制、工业通信、人机交互等应用场景。 多核异构3xCortex-A7+Cortex-M0 外设接口丰富,板载网络、串口、CAN总线 支持Buildroot、Yocto系统,支持AMP混合部署 支...
作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!
UGFC是Unified Gold Finger Core Board的缩写(意指:统一接口定义金手指核心板),为武汉万象奥科电子有限公司基于企业标准定义的一种针对嵌入式、低功耗、通用型的小型计算机模块标准,采用204Pin金手指连接器,基于ARM架构的MPU平台,主要面向泛工业领域的数据采集、边缘数据处理、接口通讯与人机交互等应用场景。
1. 概念SMARC(Smart Mobility ARChitecture,智能移动架构)是一种通用的小型计算机模块定义,基于ARM和X86技术的模块化计算机低功耗嵌入式架构平台,旨在满足低功耗、低成本和高性能的应用需求。这些模块通常使用与平板电脑和智能手机中相似的ARM SOC,或其他低功耗SOC和CPU。  图片(314 Pin金手指)2. 起源SMARC最初名为ULP-COM,主要发...
网络时间协议NTP(Network TimeProtocol)是用于互联网中时间同步的标准互联网协议,可以把计算机的时间同步到某些时间标准。NTP对于我们产品来说有什么用呢,简单的讲,当你的设备时间不准确了,你可以接入到互联网,从网上同步一下时间,非常方便。
在 Android 开发中,源码管理是一项至关重要且颇具挑战性的任务。面对包含数百个 git 库的 Android 源码,如何高效地进行下载、管理和协作开发成为了开发者们必须攻克的难题!
加密芯片是一种专门设计用于保护信息安全的硬件设备,它通过内置的加密算法对数据进行加密和解密,以防止敏感数据被窃取或篡改。如下图HD-RK3568-IOT工控板,搭载ATSHA204A加密芯片,常用于有安全防护要求的工商业场景,下文将为大家介绍安卓APP开发中,如何使用此类加密芯片。1. Android Studio工具配置JNI(Java Native Interface,Java 本地接口...
武汉万象奥科电子有限公司
服务热线:027-59218026
销售邮箱:sales@vanxoak.com
主营产品:ARM核心板、ARM工控板
工业网关、软硬件定制设计
地址:武汉东湖新技术开发区大学园路长城园路8号海容基孵化园B5

扫描二维码
关注公众号
产品及方案咨询
专业专注   合作共赢
移动电话:181 2058 0511 (湖北)
移动电话:175 7010 9551 (华南、华中)
移动电话:133 0386 9667 (华东、华北)
移动电话:187 3812 7320 (其他)