디바이스 드라이버를 커널에 포함시키려면 어떻게 해야 하나요?

제 나름대로는 여러 곳에서 찾아보고 테스트 해봤습니다.

그런데 결과는 왜? 안 되는지 모르겠네요 ㅠㅠ; 아마도 아주 약간 먼가 다른것이 아닌가 생각하는데, 그게 정말 먼지 잘 모르겠네요...고수님들의 친절한 답변 부탁드립니다.

(아마도 저와 같은 고민을 하고 있는 분이 있다면 분명 제가 한 방법이 도움이 되실거 같에요 ^^;)

우선 제가 해본 것은 아래와 같습니다.

1) Linux/driver/char폴더의 kconfig수정

아래 빨간색 블럭으로 표시한 것이 제가 추가할 임시 드라이버 입니다.

여기서는 TEMPlATE_DRIVER입니다.

kconfig.jpg

2) Linux/driver/char폴더의 Makefile수정

char폴더 밑에 넣은 제 드라이버 dev_in_kernel.c파일의 object파일을 추가한다.

(obj-$(CONFIG_TEMPLATE_DRIVER) += dev_in_kernel.o)

makefile.jpg

3) menuconfig를 수행하여 생성한 드라이버를 커널에 삽입한다.

A driver template which dose nothing help부분이 제가 만든 드라이버 입니다.

menuconfig.jpg

4) 커널을 컴파일하여 uImage생성(현재 제 보드 NAND FLASH에 binary형태로 다운로드해서 사용)

uImage.jpg

위의 로그를 보듯이 uImage는 잘 생성이 되었습니다.

그래서 저는 만들어진 커널을 SAM-ICE를 통해 NAND FLASH에 라이팅을 하고 정상적인 부팅을 하는 것을 확인했습니다.

그런데...제가 mknod를 통해 디바이스 노드를 생성하고 제 드라이버가 정상적으로 리눅스 커널에 포함이 되었나 테스트를

해봤지만,,ㅠㅠ; 포함이 되지 않은 것처럼 결과가 나왔습니다.

혹시나 해서 제 드라이버 코드는 아래와 같습니다.

저는 아래에 보이는 빨간색 usage부분 처럼

mknod /dev/template c 192 0 으로 노드를 생성 후에

application을 작성해서 단순히 open을 해봤습니다. 그렇다면 드라이버가 open()시에 printk()함수를

통해 메세지를 출력하게 되어있는데 ㅠㅠ; 출력이 되지 않더군요..

제가 무슨 실수를 했는지 도저히 모르겠습니다. ㅠㅠ; 고수님들의 친절한 답변 부탁드립니다.

================================= [ dev_in_kernel.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>
#define CALL_DEV_NAME "template"
#define CALL_DEV_MAJOR 192
#define CALL_DEV_SUB 0
/*
Note:
check device name and major device number before test.
usage: mknod /dev/template c 192 0
*/

int template_open (struct inode *inode, struct file *fp)
{
printk ("open function has been called -> minor: \n");
return 0;
}
int template_release (struct inode *inode, struct file *fp)
{
printk ("release function has been called\n");
return 0;
}

struct file_operations template_fops = {
.owner = THIS_MODULE,
.open = template_open,
.release = template_release,
};

static int template_init (void)
{
int res;
printk ("initializer has been called\n");
res = register_chrdev(CALL_DEV_MAJOR, CALL_DEV_NAME, &template_fops);
if (res < 0) return res;
return 0;
};
static void template_exit (void)
{
printk ("finalizer has been called\n");
unregister_chrdev (CALL_DEV_MAJOR, CALL_DEV_NAME);
};

__initcal(template_init);
MODULE_LICENSE("Dual BSD/GPL");