음...이제 GPIO 제어좀 해보려고 했더니.... 이게 또 말썽이네요...ㅜ.ㅜ

상황을 알려드리겠습니다.

제가 8핀을 제어하기위해서...

먼저 테스트를 위해

디버깅용 GPIO2~6 과 사용할 GPIO 24~31 을 OUTPUT으로 하여 신호 확인하려고 했습니다.
그런데 문제가
GPIO2~6과 GPIO24~27은 제어가 되는데... 1~16까지 카운터 하는것 출력
GPIO28~31은 깜깜 무소식이네요.ㅜ.ㅜ.
잉..!! 어떻게 해야할까요??


중요 부분 소스만 올릴께요
1. gpio.h
2. gpio.c
3. test.c


1. gpio.h   : define 부분

// GPIO 출력
#define GPIO_LED_1  2 // GPIO2
#define GPIO_LED_2  3 // GPIO3
#define GPIO_LED_3  4 // GPIO4
#define GPIO_LED_4  5 // GPIO5

//  GGUS  //

#define IN 0
#define OUT 1


#define GPIO_OUT_0  24
#define GPIO_OUT_1  25
#define GPIO_OUT_2  26
#define GPIO_OUT_3  27
#define GPIO_SEL  28
#define GPIO_IN_0  29
#define GPIO_IN_1  30
#define GPIO_IN_2  31

#define MASK_GPIO_OUT_0  ( OUT << GPIO_OUT_0 )
#define MASK_GPIO_OUT_1  ( OUT << GPIO_OUT_1 )
#define MASK_GPIO_OUT_2  ( OUT << GPIO_OUT_2 )
#define MASK_GPIO_OUT_3  ( OUT << GPIO_OUT_3 )

#define MASK_GPIO_SEL  ( OUT << GPIO_SEL )
#define MASK_GPIO_IN_0  ( OUT << GPIO_IN_0 )
#define MASK_GPIO_IN_1  ( OUT << GPIO_IN_1 )
#define MASK_GPIO_IN_2  ( OUT << GPIO_IN_2 )


//  GPIO 24~31을 OUTPUT으로 설정함
#define GPIO_ADD_MASK  (MASK_GPIO_OUT_0|MASK_GPIO_OUT_1|MASK_GPIO_OUT_2|MASK_GPIO_OUT_3|MASK_GPIO_SEL|MASK_GPIO_IN_0|MASK_GPIO_IN_1|MASK_GPIO_IN_2)

//  GGUS  //

// GPIO 출력 마스크
#define MASK_GPIO_LED_1  ( OUT << GPIO_LED_1 )
#define MASK_GPIO_LED_2  ( OUT << GPIO_LED_2 )
#define MASK_GPIO_LED_3  ( OUT << GPIO_LED_3 )
#define MASK_GPIO_LED_4  ( OUT << GPIO_LED_4 )


#define GPIO_OUTPUT_MASK ( MASK_GPIO_LED_1 | MASK_GPIO_LED_2 | MASK_GPIO_LED_3 | MASK_GPIO_LED_4 )
#define GPIO_INPUT_MASK  ( MASK_GPIO_LED_1 | MASK_GPIO_LED_2 | MASK_GPIO_LED_3 | MASK_GPIO_LED_4 )




참고로 GPDR0를 초기화 하면서  셋팅해놓고 더이상 안건들면 되더라고요..
그래서 출력부분에서 GPDR0 셋팅부분을 주석 처리했습니다.

2. gpio.c : 출력부분
ssize_t gpio_write(struct file *filp, const unsigned long *buf, size_t count, loff_t *f_pos)
{
 const unsigned int *gpiodata = buf;
 unsigned int data1,data2=0;
 get_user( data1, gpiodata );
 get_user( data2, gpiodata+1);
 //printk("%8x\n\r",data1);
 //printk("%8x\n\r",data2);
 int type=1;

 switch(type)
 {
  case 0:
   gpio_out_clear( data1);
   break;
  case 1:
   gpio_out_set( data1);
   break;
 }// 사용된 길이만큼 돌려 준다.

 return count;
}

int gpio_out_set( unsigned int data )
{
 //GPDR0 |= (  );
 
 //GPDR0 |= ( GPIO_ADD_MASK|GPIO_OUTPUT_MASK );
 //GPSR은 출력 SET 레지스터
 //GPSR0 |= ( GPIO_ADD_MASK);
 //GPDR0 |= ( GPIO_ADD_MASK|GPIO_OUTPUT_MASK );
 int a;
 a=(GPIO_ADD_MASK|GPIO_OUTPUT_MASK);
 printk("%8x\n\r",a);
 printk("%8x\n\r",data);
 GPCR0 |= (GPIO_ADD_MASK|GPIO_OUTPUT_MASK);
 
 GPSR0 |= (data);
}

3. test.c

for( lp = 0; lp < 16; lp++ )
 {
  buff[0] = lp<<2|lp<<24|lp<<28;       // 실제 출력할 데이터
  buff[1] = lp<<10 |lp<<24;
  //buff[1] = lp+8 ;
  write( dev, buff, 2);   // LED로 출력한다.
 
왜그럴까요????

4핀만 제어 안되는 증상...확인바랍니다...