모션센서 모듈 예제 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/miscdevice.h> #include <linux/mutex.h> #include <asm/uaccess.h> #include <linux/gpio.h> #define DEBUG 1 // 모션센서 GPIO PIN 번호 #define PIR 24 static ssize_t drv_hw_pir_read(struct file * file, char * buf, size_t length, loff_t * ofs) { int ret; int stat; stat = gpio_get_value(PIR); // stat 을 buf 로 stat size 만큼 복사. ret = copy_to_user(buf, &stat, sizeof(stat)); #if DEBUG printk("### [%s] stat = %d\n", __FUNCTION__, stat); #endif return (ret == 0) ? sizeof(stat) : ret; } static struct file_operations drv_hw_pir_fops = { .owner = THIS_MODULE, .read = drv_hw_pir_read, }; static struct miscdevice drv_hw_pir_driver = { .minor = MISC_DYNAMIC_MINOR, .name = "drv_hw_pir", .fops = &drv_hw_pir_fops, }; static int drv_hw_pir_init(void) { int ret; ret = gpio_request(PIR, "gpio pir"); if(ret) printk("#### FAILED Request gpio %d. error : %d \n", PIR, ret); else gpio_direction_input(PIR); return misc_register(&drv_hw_pir_driver); } static void drv_hw_pir_exit(void) { gpio_free(PIR); misc_deregister(&drv_hw_pir_driver); } module_init(drv_hw_pir_init); module_exit(drv_hw_pir_exit); MODULE_AUTHOR("PlanX Studio"); MODULE_DESCRIPTION("drv_hw_pir"); MODULE_LICENSE("Dual BSD/GPL"); | cs |
모션센서 어플리케이션 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/time.h> #include <fcntl.h> #include <pthread.h> pthread_t thread; /* User Thread */ int thread_start_flag = 1; int thr_id; #define NODE_NAME "/dev/drv_hw_pir" void *pir_thread(void * unuse) { int fd; int ret; int stat; int cnt=0; fd = open(NODE_NAME, O_RDONLY); // 0.1초마다 모션센서의 값을 읽어온다. while(thread_start_flag) { // 모듈에서 처리 결과 stat에 현재 모듈센서 값이 복사된다. ret = read(fd, &stat, sizeof(stat)); if (stat == 1) cnt++; printf("--------------> %dbyte read, stat = %d cnt=%d\n", ret, stat,cnt); usleep(100000); // 0.1sec } close(fd); printf("#### Terminate thead...\n"); pthread_exit((void *)fd); } int main(int argc, char * argv[]) { int status, i; thr_id = pthread_create(&thread, 0, pir_thread, 0); if (thr_id < 0) { printf("#### ERROR pthread_create\n"); exit(0); } for(i = 0; i < 10; ++i){ printf("count = %d\n", 9 - i); sleep(1); } thread_start_flag = 0; pthread_join(thread, (void **)&status); printf("#### Exit program, status = %d\n", status); exit(0); } | cs |
출처 : 인지소프트웨어 기술포럼 ( 전유진 강사님 수업자료)
'임베디드 > 디바이스 드라이버' 카테고리의 다른 글
디바이스 드라이버 모션센터 인터럽트 예 (0) | 2018.01.02 |
---|---|
디바이스 드라이버 인터럽트 (0) | 2017.12.28 |
디바이스 드라이버 GPIO 조이스틱 예제 (0) | 2017.12.28 |
Misc 디바이스 드라이버2 (0) | 2017.12.27 |
Misc 디바이스 드라이버1 (0) | 2017.12.26 |