SW 개발

[Linux Device Driver] 레비스보드용 2.6 커널 디바이스 드라이버 제작하기..

. . . 2009. 2. 26. 23:30
반응형

먼저 makefile 작성

make file
CC = arm-linux-gcc
obj-m+=button_dev.o  // 만들 목적파일!!!!!
KDIR=/root/my_kernel_test/my_kernel_source/linux-2.6.17.13-rebis  // 커널 소스!!!!
PWD:=$(shell pwd)
default :
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

흠;;; 기본적으로 CC 하고 obj-m 으로 등록한다음 MAKE 옵션으로 컴파일!!!

그담에 소스코드작성.

먼저 2.6 커널용 드라이버를 작성하기 위해서 꼭 포함시켜야 할 해더 파일들입니다. (귀찮으니 그냥 다 붙여서 코딩추천ㅋㅋ)

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/config.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/sched.h>
#include <linux/smp_lock.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/fcntl.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/arch/irqs.h>
#include <asm/arch/map.h>

그담에.. 드라이버 작성형식입니다.

일반적인 디바이스 드라이버의 형식..

소스코드에서 쓸때.. rGPGCON 와 같은 메크로들.. 즉 레지스터 관련 메크로는 직접 작성해줘야 한다.! 레비스 보드에 딸려있는 2.6 BSP 어디에도!! 저걸 정의해논 해더파일들이 없습니다!!

가상주소로 매핑되어있는것을 쓰시던가.. 물리주소로 바꾸시던가 해서 해더파일을 하나 만들어서 쓰면된다.

참고로.. 실제로 커널안에 포함되어있는 드라이버 소스를 살펴보면

#define rGPBCON   (*(volatile unsigned *)(S3C24XX_VA_GPIO+0x10)) //Port B control
#define rGPBDAT   (*(volatile unsigned *)(S3C24XX_VA_GPIO+0x14)) //Port B data
#define rGPBUP    (*(volatile unsigned *)(S3C24XX_VA_GPIO+0x18)) //Pull-up control B

#define rGPFCON   (*(volatile unsigned *)(S3C24XX_VA_GPIO+0x50)) //Port F control
#define rGPFDAT   (*(volatile unsigned *)(S3C24XX_VA_GPIO+0x54)) //Port F data
#define rGPFUP    (*(volatile unsigned *)(S3C24XX_VA_GPIO+0x58)) //Pull-up control F

소스코드 초반에 위와같이 직접정의해서 레지스터들을 접근하고 있다.

그럼 승리하시길..ㅋㅋㅋ

드라이버 예제소스코드

hello 찍는 모듈 예제.

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>

#include <linux/config.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/sched.h>
#include <linux/smp_lock.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/fcntl.h>
#include <linux/delay.h>
#include <linux/poll.h>

#include <asm/uaccess.h>
#include <asm/system.h>

#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/arch/irqs.h>
#include <asm/arch/map.h>

int init_module_1(void)
{
    printk("<0>hello\n");
}

void cleanup_module_1(void)
    printk("<0>bye\n");
}


module_init(init_module_1);
module_exit(cleanup_module_1);

MODULE_LICENSE("Dual BSD/GPL");
반응형