<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    瀏覽量

    84343
  • 軟件測試
    +關注

    關注

    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 ?2540次閱讀
    單片機<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 ?679次閱讀
    一種機載電源<b class='flag-5'>掉電檢測</b>電路設計

    一種機載電源掉電檢測電路設計

    針對傳統機載電源掉電檢測電路抗干擾能力差、易誤觸發的缺點,提出了一種抗干擾能力強、安全性更好的掉電檢測電路。
    發表于 05-25 09:37 ?691次閱讀
    一種機載電源<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燈
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>