0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

武汉万象奥科 2023-11-09 10:40 次阅读

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

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

wKgaomVMRH6ABtVLAABTQ_BeDQs250.png

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

wKgZomVMRI-AUhYrAABRAjOFBuU101.png

图1..2掉电检测

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    11

    文章

    1717

    浏览量

    84345
  • 软件测试
    +关注

    关注

    2

    文章

    207

    浏览量

    18381
  • 掉电检测
    +关注

    关注

    0

    文章

    7

    浏览量

    2899
收藏 人收藏

    评论

    相关推荐

    i.MX6ULL——ElfBoard ELF1板卡 网络更新镜像

    ubuntu的tftpboot目录下。 2.赋予权限: elf@ubuntu:~/tftpboot$ chmod 777 imx6ull-elf1-emmc.dtb elf@ubuntu:~/tftpboot
    发表于 11-03 09:49

    单片机掉电检测与数据掉电保存方案

    单片机掉电检测与数据掉电保存方案
    的头像 发表于 09-18 10:59 2544次阅读
    单片机<b class='flag-5'>掉电检测</b>与数据<b class='flag-5'>掉电</b>保存方案

    已知的HAB漏洞是否会影响i.MX6ULL版本1.1?

    我有一个 NXP iMX6ULL rev 1.1,发现i.MX6ULL 的 HAB 机制中存在两个已知漏洞。但是,我所指的文档并未指定芯片版本。因此,我不确定这些漏洞是否会影响我的设备。你能帮我澄清一下吗?
    发表于 06-02 09:07

    线程边界路由器i.mx6ull otbr-agent处于非活动状态是什么原因造成的?怎么解决?

    我关注 https://github.com/nxp-imx/meta-matter “如何在目标上设置 OpenThread 边界路由器”以在 i.mx6ull(定制板,非 EVK)上运行线程边界
    发表于 05-31 06:37

    如何确定i.MX6ULL上引脚的电源域?

    例如引脚: MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 如果将 GPIO_IO05 用作 VSelect 引脚,它使用的电压是多少? 例如
    发表于 05-29 07:47

    一种机载电源掉电检测电路设计

    ,为提高安全性,通过控制电容的充放电,使检测电路延时发送正常信号而在掉电情况下迅速发出掉电信号;最后,设计掉电激励电路,能够在维护状态时通过外加激励
    发表于 05-25 09:38 680次阅读
    一种机载电源<b class='flag-5'>掉电检测</b>电路设计

    一种机载电源掉电检测电路设计

    针对传统机载电源掉电检测电路抗干扰能力差、易误触发的缺点,提出了一种抗干扰能力强、安全性更好的掉电检测电路。
    发表于 05-25 09:37 693次阅读
    一种机载电源<b class='flag-5'>掉电检测</b>电路设计

    如何在i.MX6ULL上为PF1510配置i2c?

    我们计划将 PF1510 与 i.MX6ULL 处理器一起使用。我看到这个设备树示例: https://github.com/Freescale/linux-fslc/blob
    发表于 05-17 14:02

    飞凌嵌入式技术帖——i.MX9352的GPIO怎么用?

    让我们一起走近i.MX9352处理器,深入了解这位i.MX系列新成员的GPIO该如何操作,以及它与前辈i.MX6ULL处理器又有哪些异同。
    的头像 发表于 05-16 15:07 610次阅读
    飞凌嵌入式技术帖——i.<b class='flag-5'>MX</b>9352的GPIO怎么用?

    i.MX6ULL上电序列是怎样的?

    请告诉我们 iMX6ULL 的上电顺序中的以下几点。 1. IMX6ULLIEC.pdf (DataSheet) 没有以下电源的序列描述。你介意认为如果在VDD_SNVS_IN之后就没有序列顺序
    发表于 05-09 10:09

    如何使用Linux版本在i.mx6ull上启用USB网络共享?

    我从 lf-5.10-y 分支为 i.mx6ull evk 构建了 Linux。我将我的 android 手机连接到 usb otg 端口并在我的手机上启用网络共享。但是我没有看到 USB0 接口
    发表于 05-09 08:06

    是否有人通过这些测试并获得Linux 4.14.98的TAHI IPv6认证?

    我们用 i.MX6ULL 和 Linux 4.14.98 SDK 构建了一个家庭网关,并进入量产阶段多年。 几个月前,我们接到通知说我们无法通过 TAHI IPv6 一致性测试套件获得 IPv
    发表于 05-06 06:04

    I.MX6ULL的SPI延迟问题如何解决?

    我们使用 NXP 的 I.MX6ULL 处理器和 TCAN4550 进行 CANFD 通信。我们在传输 CAN 数据时面临 SPI 延迟问题。CAN 数据传输/接收是根据 SPI 中断发生的。我们
    发表于 05-05 10:29

    i.MX6ULL u-boot中一些U盘访问失败怎么解决?

    :49:03 +0000) CPU:i.MX6ULL rev1.1 792 MHz(以 396 MHz 运行) CPU:工业温度等级(-40C 至 105C)在 50C 复位原因:POR 型号:i.MX6
    发表于 05-05 09:00

    I.MX6ULL官方SDK驱动LED灯

    本章学习如何使用NXP官方的imx6ull的SDK。
    的头像 发表于 05-03 20:53 44.8w次阅读
    <b class='flag-5'>I.MX6ULL</b>官方SDK驱动LED灯