이번 강좌에는 저번의 회로를 구성한 것으로 GPIO 디바이스 드라이버의 가장 기본적인 모듈 적재와 모듈 제거를 하는 부분을 작성해보겠습니다. 

 

 1. 준비조건

 - 작업 디렉토리는 /home/falinux 로 임의로 설정한다.
 - 커널 소스가 있는 위치는  /home/falinux/kernel/linux-2.6.29 이다.
 - 디바이스 드라이버 소스 위치는 /home/falinux/gpio 로 한다.
 
 - 크로스 컴파일러가 설치되어 있어야 한다.
   설치가 되어있지 않다면 아래의 주소에서 다운로드 받아서 설치하면 됩니다.
   
    http://ftp.falinux.com/toolchain_ramdisk/recommendation/gcc-4.3.2/
   
    arm-linux-gnueabi-4.3.2.tar.gz

 

 

 2. 소스 작성

 

1) dev-gpio.h

 

#ifndef _DEV_GPIO_H_
#define _DEV_GPIO_H_

/* 모듈관련 -------------------------------------------------------------------*/
#define GPIO_MAJOR_DEF 203
#define GPIO_DEV_NAME "S3C6410 GPIO Ver 1.0"

#endif // _DEV_GPIO_H_

 

 

2) dev-gpio.c

 

#ifndef __KERNEL__
 #define __KERNEL__
 #endif
 
 #ifndef MODULE
 #define MODULE
 #endif
 
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/version.h>
 #include <linux/init.h>
 #include <linux/fs.h>
 #include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/wait.h>
 #include <linux/ioport.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
 #include <linux/proc_fs.h>
 #include <linux/irq.h>
 #include <linux/io.h>
 #include <linux/delay.h>
 
 #include <asm/system.h>    
 #include <asm/uaccess.h>
 #include <asm/irq.h>
 #include <asm/ioctl.h>
 #include <asm/unistd.h>
 #include <asm/io.h>
 #include <asm/delay.h>
 
 #include <mach/gpio.h>
 #include <mach/map.h>
 #include <mach/regs-mem.h>
 
 #include <plat/clock.h>
 #include <plat/gpio-cfg.h>
 #include <plat/regs-gpio.h>
 #include <plat/regs-timer.h>
 
 
 #include  "dev-gpio.h"
 
 static int major  = GPIO_MAJOR_DEF;
 
 //------------------------------------------------------------------------------
 /** @brief   드라이버에 사용되는 접근 함수에 대한 함수 포인터 구조체를 정의 한다.
     이 구조체는 fs.h에 정의 되어 있다.
     @remark
 *///----------------------------------------------------------------------------
 static struct file_operations s3c6410_gpio_fops =
 {
 // .open     = s3c6410_gpio_open,
 // .release = s3c6410_gpio_release,
 // .poll  = s3c6410_gpio_poll,
 // .ioctl    = s3c6410_gpio_ioctl,
 };
 
 //------------------------------------------------------------------------------
 /** @brief  Module Init
  @return  0 : Success
     -1: Fail
 *///----------------------------------------------------------------------------       
 static __init int s3c6410_gpio_init( void )
 {
  /// 장치를 등록한다. ============================================
  major &= 0xff;
  if( !register_chrdev( major, GPIO_DEV_NAME, &s3c6410_gpio_fops ) )
  {
   printk("\nRgister device %s Ok (major=%d)\n", GPIO_DEV_NAME, major );
   printk( "Last Modify %s\n\n", __DATE__);
  }
  else
  {
   printk("\nUnable to get major %d for %s \n", major, GPIO_DEV_NAME );
   return -EBUSY;
  }
  return 0;
 }
 
 //------------------------------------------------------------------------------
 /** @brief  Module Exit
 *///----------------------------------------------------------------------------       
 static __exit void s3c6410_gpio_free( void )
 {
  /// 장치등록을 해지한다.
  unregister_chrdev( major, GPIO_DEV_NAME );
  printk("\nUnregister %s Ok\n\n", GPIO_DEV_NAME );
 }
 
 module_init(s3c6410_gpio_init);
 module_exit(s3c6410_gpio_free);
 
 MODULE_AUTHOR("falinux.com");
 MODULE_LICENSE("GPL");

 

 

3) Makefile

 

#
 # kernel 2.6 driver Makefile
 #
 
 obj-m  := dev-gpio.o
 
 KDIR  := /home/falinux/kernel/linux-2.6.29
 PWD    := $(shell pwd)
 
 default:
  $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
 
 clean : 
   rm -rf *.ko
   rm -rf *.mod.*
   rm -rf .*.cmd
   rm -rf *.o

 

 

 

 3. 컴파일하기

  

root@tsheaven:gpio# make
 make -C /home/falinux/kernel/linux-2.6.29 SUBDIRS=/home/falinux/gpio modules
 make[1]: Entering directory `/home/falinux/kernel/linux-2.6.29'
   CC [M]  /home/falinux/gpio/dev-gpio.o
   Building modules, stage 2.
   MODPOST 1 modules
   CC      /home/falinux/gpio/dev-gpio.mod.o
   LD [M]  /home/falinux/gpio/dev-gpio.ko
 make[1]: Leaving directory `/home/falinux/kernel/linux-2.6.29'

 

 

 4.  EZ-S3C6410 보드에 Test 하기

 

       nfs 가 연결되어 있다면 nfs에서 바로 모듈을 적재하면 됩니다.
       만약 nfs 시스템이 구축되어 있지 않다면 zmodem으로 다운로드 하면 됩니다. 명령은 lrz 입니다.

 

       [모듈 적재하기]

 [root@falinux gpio]$ insmod dev-gpio.ko

Rgister device S3C6410 GPIO Ver 1.0 Ok (major=203)
Last Modify Sep 23 2011

 

 

       [모듈 적재 확인 하기]

  [root@falinux gpio]$ lsmod
Module Size Used by Tainted:
Dev_gpio 1412 0

 


      [모듈 제거하기]

  [root@falinux gpio]$ rmmod dev-gpio.ko

Unregister S3C6410 GPIO Ver 1.0 Ok

 


다음 강좌에는 LED를 제어하는 나머지 코드를작성하도록 하겠습니다.