skeleton.c
1 #include <linux/init.h>
2 #include <linux/kernel.h>
3 #include <linux/module.h>
4 #include <linux/fs.h>
5 #include <asm/uaccess.h>
6 #include <asm/io.h>
7
8 #define SK_MAJOR 240
9
10 int sk_open(struct inode *inode, struct file *filep)
11 {
12 printk("skeleton open\n");
13 return 0;
14 }
15
16 int sk_release(struct inode *inode, struct file *filp)
17 {
18 printk("skeleton release \n");
19 return 0;
20 }
21
22 ssize_t sk_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos)
23 {
24 char data[11];
25 __copy_from_user(data, buf, count);
26 printk("data is >>>> %s\n", data);
27
28 return count;
29 }
30 ssize_t sk_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
31 {
32 char data[30] = "this is read func...";
33 __copy_to_user(buf, data, count);
34 // count 어플에서 넘어올 데이터의 크기
35 return count;
36 }
37
38 struct file_operations sk_fops = {
39 .owner = THIS_MODULE,
40 .open = sk_open,
41 .release = sk_release,
42 .write = sk_write,
43 .read = sk_read,
44 };
45
46 static int __init skeleton_init(void)
47 {
48 printk("skelelton module init\n");
49 register_chrdev(SK_MAJOR, "SK", &sk_fops);
50 return 0;
51 }
52
53 static void __exit skeleton_exit(void)
54 {
55 printk("skeleton module exit\n");
56 unregister_chrdev(SK_MAJOR, "SK");
57 }
58
59 module_init(skeleton_init);
60 module_exit(skeleton_exit);
61
62 MODULE_LICENSE("Dual BSD/GPL");
sk_app.c
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <fcntl.h>
5
6 int main()
7 {
8 int fd=0;
9 int retn=0;
10 //char buf[10] = "Write...";
11 char buf[30] ={0};
12
13 fd = open("/dev/SK", O_RDWR);
14
15 printf("fd = %d\n", fd);
16
17 if(fd<0)
18 {
19 perror("/dev/SK");
20 exit(-1);
21 }
22 else
23 printf("SK has been detected...\n");
24
25 //retn = write(fd, buf, 10);
26 retn = read(fd, buf, 30);
27 printf("read data is %s\n", buf);
28
29 getchar();
30 close(fd);
31
32 return 0;
33 }
Makefile
1 CC = gcc
2 KDIR = /lib/modules/$(shell uname -r)/build
3 PWD = $(shell pwd)
4 TARGET = sk_app
5
6 obj-m = skeleton.o
7
8 build: $(TARGET)
9 make -C $(KDIR) M=$(PWD) modules
10
11 $(TARGET):
12 $(CC) -o $@ sk_app.c
13
14 clean:
15 make -C $(KDIR) M=$(PWD) clean
16 rm -f $(TARGET)
실행순서
1. skeleton.c 작성
2. sk_app.c 작성
3. Makefile 작성
4. insmod skeleton.ko
5. lsmod | grep skeleton
6. vi /proc/devices 에서 SK가 등록된지 확인 (240에 등록됨)
7. Device file
#mknod /dev/SK c 240 0
8. ./sk_app
9.rmmod skeleton
'Study > 리눅스' 카테고리의 다른 글
리눅스 c언어로 시리얼 통신하기 (0) | 2014.10.30 |
---|---|
프로세서기반 임베디드 리눅스 디바이스 드라이버 (1) (0) | 2014.10.01 |
리눅스로 c언어 컴파일하기 Java (2) (0) | 2014.09.19 |
리눅스로 c언어 컴파일하기 Java (1) (0) | 2014.09.19 |
리눅스로 c언어 컴파일하기 Linked List (2) (0) | 2014.09.19 |