저번 강좌에 이어 GPIO를 제어하기 함수에 대하여 알아 보기로 하겠습니다.

 

GPIO 신호를 초기화하기 위해서는 다음의 두 함수를 통하여 할 수 있습니다.

 

1)  s3c_gpio_cfgpin( unsigned int pin, unsigned int config )

     gpio의 입력/출력/인터럽트 등 부가적인 기능을 선택하기 위해 사용 되는 함수 이다.

    

    pin

            S3C64XX_GPN(5)

    config

           입력         : S3C64XX_GPN_INPUT(5)

           출력         ; S3C64XX_GPN_OUT(5)

           인터럽트 ; S3C64XX_GPN5_EINT5

           부가기능 ; S3C64XX_GPN5_KP_ROW5

 

2) s3c_gpio_setpull( unsigned int pin, s 3c-gpio-pull_t pull )

 

    pin

             S3C64XX_GPN(5)

    pull 

             S3C-GPIO_PULL-NONE

             S3C-GPIO_PULL_DOWN

             S3C_GPIO_PULL-UP

 

 

저번 소스에 이어서 위의 함수를 추가하여 GPIO를 출력으로 설정하도록 하겠습니다.

 

 

1. 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   하드웨어 초기화
    @remark  인터럽트 설정은 반드시 초기화 순서를 지켜야 함
*///----------------------------------------------------------------------------
static void hw_gpio_init( void )
{
 /// 출력설정 GPN5
 s3c_gpio_cfgpin (S3C64XX_GPN(5), S3C64XX_GPN_OUTPUT(5));
 s3c_gpio_setpull(S3C64XX_GPN(5), S3C_GPIO_PULL_NONE);
}
 
 //------------------------------------------------------------------------------
 /** @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;
  }
  
  hw_gpio_init();
  
  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");

 

굵게 표시한 부분이 추가된 부분이다.

 

위의 소스가 예전에 부져를 동작하기 위해 쓴 강좌의 내용과 거의 유사하네요...

하지만 LED의 제어와 다른 느낌을 가지는 분들을 위해서 그냥 계속 진행을 하도록 하겠습니다.

 

다음 강좌에는 GPIO 출력을 위한 함수를 소개하도록 하겠습니다.