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

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

    关注

    12

    文章

    1928

    浏览量

    88201
  • 软件测试
    +关注

    关注

    2

    文章

    245

    浏览量

    19876
  • 掉电检测
    +关注

    关注

    0

    文章

    8

    浏览量

    3053
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【飞凌OK-T153 开发板试用】实时性测试

    I.MX6ULL(1 X A7@792M)的对比 从测试结果可以看出T153实时性要明显高于I.MX6ULL 另外需要注意上述测试无论是T153还是
    发表于 11-22 05:29

    一种简单的电源掉电检测电路设计

    需求:由于目前产品对于电源上电与掉电时序要求较高,在产品运行过程中,如果突然掉电,没有及时关闭运行的产品。会导致损坏产品内部的器件。因此电路上需要对掉电进行检测,然后再控制器上关闭产品
    的头像 发表于 11-20 14:40 1798次阅读
    一种简单的电源<b class='flag-5'>掉电检测</b>电路设计

    瑞芯微RK3506 vs NXP i.MX6ULL

    NXPi.MX6ULL核心板进行多方面对比。性能与能效对比性能优势对比:RK3506在接口方面比i.MX6ULL少2个UART,其他性能方面,RK3506以三核A7(1.
    的头像 发表于 06-19 16:26 968次阅读
    瑞芯微RK3506 vs NXP <b class='flag-5'>i.MX6ULL</b>

    618盛夏狂欢,米尔电子携手恩智浦开启年度技术盛宴!

    即日起-2025.06.30,米尔恩智浦多系列开发板限时折扣!米尔基于i.MX91、i.MX93、i.MX8MPlus、i.MX6UL/i.MX6U
    的头像 发表于 06-13 08:03 716次阅读
    618盛夏狂欢,米尔电子携手恩智浦开启年度技术盛宴!

    飞凌嵌入式ElfBoard ELF 1板卡-Uboot

    /SourceCode下载。不过我们目前使用的uboot源码不是在这个网站下载的,而是由NXP公司提供的。NXP公司在推广i.MX6ULL芯片时,会开发出一套i.MX6ULL EVK评估板给客户进行评估,同时也有
    发表于 05-22 10:44

    「2025恩智浦创新技术峰会」飞凌嵌入式亮相上海首站

    ,展示其在低成本人工智能、工业物联网等领域的创新成果。此次峰会,飞凌嵌入式带来了基于恩智浦i.MX95xx、i.MX9352、i.MX8MPlus和i.MX6ULL
    的头像 发表于 05-15 13:38 1059次阅读
    「2025恩智浦创新技术峰会」飞凌嵌入式亮相上海首站

    ECB20-PG6Y28C-I 单板机深度测评报告 ——工业级嵌入式开发的强力助手

    ECB20-PG6Y28C-I 是成都亿佰特电子科技基于 i.MX6ULL 处理器推出的工业级测试底板,搭配 ECK20-6Y28C 系列核心板,专为高性能嵌入式场景设计。其核心亮点在
    的头像 发表于 04-22 11:49 893次阅读

    如何在i.MX6ULL睡眠时停止刷新LCD?

    为了更好的 EMC,我们需要在 i.MX6ULL 进入睡眠状态时停止 LCD 刷新。 能否实现 ? 平台: i.MX6ULL 系统: Linux
    发表于 04-03 07:14

    如何维护i.MX6ULL的安全内核?

    随着即将出台的 EU RED 3(3)def 和 EN 18031 法规,修复已知的漏洞至关重要。对于基于 i.MX 6ULL 的系统,在实践中如何做到这一点? 我们目前
    发表于 04-01 08:28

    如何在i.MX6ULL定制板上启用IO Expander PCA6416A的控制?

    我想知道如何在 i.MX6ULL 定制板上启用 IO Expander PCA6416A 的控制。 我尝试修改 imx6ul-14x14-evk.dtsi,将 pca6416 节点添加到 i
    发表于 03-26 07:10

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之USB_OTG

    ,这里不展开讲)引脚接地了,并没有连接到SOC检测引脚,所以使用OTG功能,i.MX6ULL只能工作在device模式,当做从设备使用。当然也可以通过修改软件,将此接口用作host模式。 将
    发表于 02-28 09:29

    飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之USB_OTG

    展开讲)引脚接地了,并没有连接到SOC检测引脚,所以使用OTG功能,i.MX6ULL只能工作在device模式,当做从设备使用。当然也可以通过修改软件,将此接口用作host模式。将USB_OTG2作为
    发表于 02-27 09:16

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之ENET

    ELF 1开发板网络方案跟NXP i.MX6ULL EVK评估板的一样,所以这里就简单说明一下网络在内核设备树的配置。 硬件原理 由于两个网口涉及的引脚较多,而ELF 1开发板跟i.MX6ULL
    发表于 02-21 09:32

    飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之ENET

    ELF 1开发板网络方案跟NXP i.MX6ULL EVK评估板的一样,所以这里就简单说明一下网络在内核设备树的配置。 硬件原理 由于两个网口涉及的引脚较多,而ELF 1开发板跟i.MX6ULL
    发表于 02-20 08:47

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-初识设备树之Makefile修改

    /Makefile:我们使用的是i.MX6ULL平台,所以,编译器会编译生成CONFIG_SOC_IMX6ULL命令下.dtb文件,这些.dtb都应有其对应的.dts文件。如果我们因为板子硬件改动或硬件外设配置
    发表于 01-13 09:09