国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

基于i.MX6ULL的掉電檢測(cè)設(shè)計(jì)與軟件測(cè)試

發(fā)布時(shí)間:2023-11-9 11:08    發(fā)布者:武漢萬(wàn)象奧科
關(guān)鍵詞: i.MX6ULL , 掉電檢測(cè)
基于i.MX6ULL的掉電檢測(cè)設(shè)計(jì)與軟件測(cè)試
基于i.MX6ULL平臺(tái)設(shè)計(jì)實(shí)現(xiàn)掉電檢測(cè)功能,首先選擇一路IO,利用IO電平變化觸發(fā)中斷,在編寫驅(qū)動(dòng)時(shí)捕獲該路GPIO的中斷,然后在中斷響應(yīng)函數(shù)中發(fā)送信號(hào)通知應(yīng)用程序掉電發(fā)生了。
圖1.1掉電信號(hào)IO
       驅(qū)動(dòng)代碼:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include   
#include
#include


#definepower_MAJOR 200

staticstruct class *my_class;
staticstruct fasync_struct *fasync_queue; //異步通知隊(duì)列

#defineGPIO_NUM 1  //中斷引腳為:GPIO1_1
staticunsigned int irq_num;


/* 打開 */
intpower_open(struct inode *inode,struct file *filp){
         return 0;

}

/* 關(guān)閉 */
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);
    /*將該設(shè)備登記到fasync_queue隊(duì)列中去*/
    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,
};

/* 在中斷服務(wù)函數(shù)中向應(yīng)用層發(fā)送消息-異步通知 */
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;
         /* 注冊(cè)設(shè)備驅(qū)動(dòng) */
         ret =register_chrdev(power_MAJOR,"power-detect-test",&simple_fops);
         if(ret<0){
                  printk("Unable toregister character device %d!/n",ret);
                  return ret;
         }

         /* 自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn) */
         my_class = class_create(THIS_MODULE,"my_class");
         device_create(my_class, NULL,MKDEV(power_MAJOR, 0), NULL,"powerdetect");

         /*gpio申請(qǐng)*/
         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中斷號(hào)*/
         irq_num = gpio_to_irq(GPIO_NUM);

         /*GPIO中斷服務(wù)函數(shù)注冊(cè),*/                    /*下降沿觸發(fā)*/               
         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){
         /* 卸載相應(yīng)的設(shè)備驅(qū)動(dòng) */
         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");
}

/* 宏實(shí)現(xiàn) */
module_init(power_init_module);
module_exit(power_cleanup_module);

/* 開源許可聲明 */  
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Zou");
應(yīng)用代碼:
#include
#include
#include
#include
#include
#include

staticint fd;

/* 內(nèi)核產(chǎn)生異步通知,調(diào)用該應(yīng)用層函數(shù)處理 */
voidsigterm_handler(int signo)
{
         printf("app irq work !!!\n");
}

intmain(void)
{
    int oflags;

   fd=open("/dev/powerdetect",O_RDWR);  //打開設(shè)備文件

    /* 啟動(dòng)異步通知信號(hào)驅(qū)動(dòng)機(jī)制 */
    signal(SIGIO, sigterm_handler);
    fcntl(fd, F_SETOWN, getpid());
    oflags = fcntl(fd, F_GETFL);
    fcntl(fd, F_SETFL, oflags | FASYNC);

    /*建立一個(gè)死循環(huán),防止程序結(jié)束 */
    while(1)
    {
        printf("sleep\n");
        usleep(200000);  //2ms
    }

    close(fd);
    return 0;
}
將驅(qū)動(dòng)編譯成模塊,上電加載并執(zhí)行應(yīng)用程序后,將電壓緩慢下調(diào)至掉電臨界點(diǎn)。觸發(fā)GPIO下降沿中斷,并提供應(yīng)用程序掉電信號(hào)。
圖1..2掉電檢測(cè)







本文地址:http://m.qingdxww.cn/thread-845523-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點(diǎn)宏來(lái)節(jié)省時(shí)間和空間
  • Dev Tool Bits——使用DVRT協(xié)議查看項(xiàng)目中的數(shù)據(jù)
  • Dev Tool Bits——使用MPLAB® Data Visualizer進(jìn)行功率監(jiān)視
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久精品日本一区二区三区 | 成人黄色在线视频 | 国产不卡免费视频 | 男同在线免费观看 | 精品日韩一区二区三区 | 四虎国产精品永久地址48 | 国产精品七七在线播放 | 亚洲高清成人欧美动作片 | 精品一区二区三区免费毛片爱 | 狠狠色综合久久久久尤物 | 国产在线91区精品 | 在线不卡一区 | 思思99精品国产自在现线 | 91国自产精品中文字幕亚洲 | 国产精品自产拍在线观看2019 | 日本久久久久久久中文字幕 | 第四色男人天堂 | www.天堂在线观看 | 特黄特黄 | 欧美亚洲国产另类在线观看 | 亚洲欧美精品一区二区 | 另类国产精品一区二区 | 青青草华人在线 | 97在线观看免费视频 | 91麻豆最新在线人成免费观看 | 啊用力点国产嗯快在线观看 | 日韩在线观看视频网站 | 亚洲视频在线观看视频 | 国产麻豆91网在线看 | 亚洲日本一区二区三区在线 | 黑粗硬大欧美视频 | 天堂a视频| 欧美成人一级片 | 婷婷久久五月天 | 九九视频在线免费观看 | 视频一本大道香蕉久在线播放 | 欧美呜巴又大粗又长 | 国产亚洲精品午夜高清影院 | 日韩中文字幕高清在线专区 | 永久免费看黄在线播放 | 在线观看视频日本 |