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

基于i.mx6ull的掉电检测设计与软件测试
基于i.mx6ull平台设计实现掉电检测功能,首先选择一路io,利用io电平变化触发中断,在编写驱动时捕获该路gpio的中断,然后在中断响应函数中发送信号通知应用程序掉电发生了。
图 1.1 掉电信号io
       驱动代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include     
#include
#include
#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
#include
#include
#include
#include
#include
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 掉电检测

中兴通讯将携手中国移动推出全场景UPF部署方案
Garmin逐渐将其服务恢复在线
模块化夹紧系统:加速度数据记录仪CFRP零件加工工艺动态监测
腾讯已悄然大面积开拓市场的小程序产品——“ETC助手小程序”
都是上午10点开售,OPPOR11和荣耀9你打算入手谁?OPPOR11和荣耀9评测对比
基于i.MX6ULL的掉电检测设计与软件测试
嵌入式系统为什么选择C语言作为开发语言
小米5X和MIUI9什么时候上市?雷军亲自确认:7月26日小米5X和MIUI9齐发布,确定吴亦凡代言
Mosfet驱动电路开发进阶之路
比小米6还要惊艳,红米Pro 2惊人曝光!全面屏 售价1999 屏占比极夸张!
德国英飞凌专家:功率元器件市场将会增长
详解MOS的I/V特性方程
为什么要选择兼容光模块,兼容光模块比原装品牌光模块有优势吗?
天合储能打造全面兼容多种应用场景的储能系统设备
加入语音模块的摇摆机方案运用
锂离子电池电解液多功能添加剂
最坏情况的电路设计对元件容差的考虑
赛麟汽车携手中国移动 联手打造车联网平台
日本要求在自动驾驶汽车中也安装一种“黑匣子” 确定各方的责任
LED光源与LED灯具效能的区别