반응형
어플리케이션 없이 insmod만으로 동작하는 모듈 프로그램으로 커널 타이머 인터럽트 구현
/dev에 등록하는 과정이 없는거임.
timerVal를
ubuntu@ubuntu8:~/pi_bsp/drivers/p335_kerneltimer$ vi kerneltimer.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/slab.h>
#include <asm/uaccess.h>
#include <linux/time.h>
#include <linux/timer.h>
#include <linux/gpio.h>
#include <linux/moduleparam.h>
#define DEBUG 1
static int timerVal = 100;
module_param(timerVal,int ,0);
static int ledVal =0;
module_param(ledVal,int,0);
struct timer_list timerLed;
void kerneltimer_func(struct timer_list *t);
void kerneltimer_registertimer(unsigned long timeover)
{
timer_setup(&timerLed, kerneltimer_func,0);
timerLed.expires = get_jiffies_64() + timeover;
add_timer(&timerLed);
}
void kerneltimer_func(struct timer_list *t)
{
#if DEBUG
printk("ledVal : %#04x\n",(unsigned int)(ledVal));
#endif
ledVal = ~ledVal & 0xff;
mod_timer(t,get_jiffies_64() + timerVal);
}
int kerneltimer_init(void)
{
#if DEBUG
printk("timerVal : %d, sec : %d \n",timerVal,timerVal/HZ);
#endif
kerneltimer_registertimer(timerVal);
return 0;
}
void kerneltimer_exit(void)
{
if(timer_pending(&timerLed))
del_timer(&timerLed);
}
module_init(kerneltimer_init);
module_exit(kerneltimer_exit);
MODULE_AUTHOR("AIOT WCM");
MODULE_DESCRIPTION("led key test module");
MODULE_LICENSE("Dual BSD/GPL");
ubuntu@ubuntu8:~/pi_bsp/drivers/p335_kerneltimer$ vi Makefile
MOD := kerneltimer
obj-m := $(MOD).o
CROSS = ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
#KDIR := /lib/modules/$(shell uname -r)/build
KDIR := /home/ubuntu/pi_bsp/kernel/linux
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules $(CROSS)
cp $(MOD).ko /srv/nfs
clean:
rm -rf *.ko
rm -rf *.mod.*
rm -rf .*.cmd
rm -rf *.o
rm -rf modules.order
rm -rf Module.symvers
rm -rf $(MOD).mod
rm -rf .tmp_versions
pi@pi08:/mnt/ubuntu_nfs $ sudo cat /proc/kmsg
kerneltimer를 등록할 때 2초단위로 하기 위해, timerVal, ledVal을 넣어주자.
pi@pi08:/mnt/ubuntu_nfs $ sudo rmmod kerneltimer
pi@pi08:/mnt/ubuntu_nfs $ sudo insmod kerneltimer.ko timerVal=200 ledVal=0x55
pi@pi08:/mnt/ubuntu_nfs $ sudo cat /proc/kmsg
지금은 커널 메시지만 출력되도록 되는데, led를 실제로 호출하고 key 관련된 코드를 가져와서 해보자.
반응형
'Linux BSP' 카테고리의 다른 글
[Linux Device Driver] Kernel Timer (0) | 2024.02.27 |
---|---|
[Device Driver] 어플리케이션 없이 insmod만으로 동작하는 모듈 프로그램으로 커널 타이머 GPIO제어 (0) | 2024.02.26 |
[Device Driver] ioctl 함수 (1) | 2024.02.26 |
[Linux Device Driver] 주번호, 부번호의 개념과 예제 (1) | 2024.02.26 |
[Linux Device Driver] application-> 디바이스 드라이버 8바이트 매개변수 입력 (0) | 2024.02.26 |