驅動程式 - Linux Device Driver (LDD) - 使用範例 - C/C++ (PocketBeagle) - Timer



Timer是一種Callback機制,提供使用者設定片段時間後觸發的方式,Timer有區分一次性或者週期性,Linux Kernel提供的mod_timer()是屬於一次性,而Timer時間則是使用jiffies計算,jiffies是一個Global變數,該變數用來紀錄時間的中斷次數(從開機後),可以搭配msecs_to_jiffies()計算出需要的時間間隔

使用步驟:

1. setup_timer()
2. mod_timer()
3. del_timer()

main.c

#include <linux/init.h>
#include <linux/device.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/gpio.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Steward Fu");
MODULE_DESCRIPTION("Linux Driver");
  
#define USR3_LED ((32 * 1) + 24)
 
static int period = 300;
static struct timer_list timer = {0};
 
void timer_handler(unsigned long unused)
{
    static int state = 0;
      
    state ^= 1;
    gpio_set_value(USR3_LED, state);
    mod_timer(&timer, jiffies + msecs_to_jiffies(period));
}
  
int ldd_init(void)
{
    gpio_request(USR3_LED, "USR3");
    gpio_direction_output(USR3_LED, 1);
    setup_timer(&timer, timer_handler, 0);
    mod_timer(&timer, jiffies + msecs_to_jiffies(period));
    return 0;
}
  
void ldd_exit(void)
{
    del_timer(&timer);
    gpio_free(USR3_LED);
}
  
module_init(ldd_init);
module_exit(ldd_exit);

ldd_init: 設定GPIO以及Timer,msecs_to_jiffies()設定的內容,司徒直接使用PERIOD常數設定
timer_handler: 閃爍LED之外,由於mod_timer()是屬於一次性,因此,只要再次設定就可以變成週期性Timer
ldd_exit: 刪除GPIO以及Timer資源

完成