int MyGpio::gpioSetDir(unsigned int pin, unsigned int dir){ if(dir == Mode.INPUT){ return gpio_dir_in(pin); } else if(dir == Mode.OUTPUT){ return gpio_dir_out(pin); } }
static int gpio_open(PROGRAMMER *pgm, char *port) { int r,i; char filepath[60]; bitbang_check_prerequisites(pgm); for (i=0; i<N_GPIO; i++) gpio_fds[i]=-1; for (i=0; i<N_PINS; i++) { if (pgm->pinno[i] != 0) { if ((r=gpio_export(pgm->pinno[i])) < 0) return r; if (i == PIN_AVR_MISO) r=gpio_dir_in(pgm->pinno[i]); else r=gpio_dir_out(pgm->pinno[i]); if (r < 0) return r; if ((r=snprintf(filepath, sizeof(filepath), "/sys/class/gpio/gpio%d/value", pgm->pinno[i]))<0) return r; if ((gpio_fds[pgm->pinno[i]]=open(filepath, O_RDWR))<0) return gpio_fds[pgm->pinno[i]]; } } return(0); }
/** GPIO 초기화. * * @param bInitialize 초기화 여부 (다수의 Process에서 호출할 경우 최초 1회만 초기화 하면 된다) * @param nMobileType MOBILE_TYPE_CDMA, MOBILE_TYPE_GSM */ BOOL CGpioControl::Initialize(BOOL bInitialize, const char* pMobileType, BOOL bMonitoring) { if(pMobileType != NULL && strlen(pMobileType)>0) { m_pMobileType = (char*)MALLOC(strlen(pMobileType)+1); strcpy(m_pMobileType, pMobileType); } /** 초기화기 필요 없으면 바로 Return 한다 */ if(bInitialize == FALSE) return TRUE; #ifdef __TI_AM335X__ /** GPIO Epoll 추가 **/ m_nEpfd = epoll_create(INPUT_GPIO_MAX); /*---- INPUT ----*/ XDEBUG("** GPIO Initialize Start\r\n"); XDEBUG(" GP_GSM_SYNC_INPUT ................ %d\r\n", GP_GSM_SYNC_INPUT); gpio_export(GP_GSM_SYNC_INPUT); if(!gpio_dir_in(GP_GSM_SYNC_INPUT)) { if(bMonitoring) EpollAdd(GP_GSM_SYNC_INPUT, 1, GPIO_ON); // GPIO 번호, 초기값, GPIO State( gpio, ADC ) } XDEBUG(" GP_LOW_BATT_INPUT ................ %d\r\n", GP_LOW_BATT_INPUT); gpio_export(GP_LOW_BATT_INPUT); gpio_dir_in(GP_LOW_BATT_INPUT); if(bMonitoring) EpollAdd(GP_LOW_BATT_INPUT,1,GPIO_ON); XDEBUG(" GP_CASE_OPEN_INPUT ............... %d\r\n", GP_CASE_OPEN_INPUT); gpio_export(GP_CASE_OPEN_INPUT); gpio_dir_in(GP_CASE_OPEN_INPUT); if(bMonitoring) EpollAdd(GP_CASE_OPEN_INPUT,0,GPIO_ON); XDEBUG(" GP_PWR_FAIL_INPUT ................ %d\r\n", GP_PWR_FAIL_INPUT); gpio_export(GP_PWR_FAIL_INPUT); gpio_dir_in(GP_PWR_FAIL_INPUT); if(bMonitoring) EpollAdd(GP_PWR_FAIL_INPUT,0,GPIO_ON); XDEBUG(" GP_BATT_CHG_STATUS_INPUT ......... %d\r\n", GP_BATT_CHG_STATUS_INPUT); gpio_export(GP_BATT_CHG_STATUS_INPUT); gpio_dir_in(GP_BATT_CHG_STATUS_INPUT); if(bMonitoring) EpollAdd(GP_BATT_CHG_STATUS_INPUT,0,GPIO_ON); if(bMonitoring) EpollAdd(ADC_BATT_VOL_INPUT,4095,ADC_ON); // GPIO 번호, 초기값, GPIO State( gpio, ADC ) if(bMonitoring) EpollAdd(ADC_MAIN_VOL_INPUT,4040,ADC_ON); /*---- OUTPUT ----*/ #if 0 /** GPIO 중 SW Reset은 사용하지 않는다 */ XDEBUG(" GP_SW_RESET_OUT ....... HIGH ..... %d\r\n", GP_SW_RESET_OUT); gpio_export(GP_SW_RESET_OUT); gpio_dir_out(GP_SW_RESET_OUT , GPIO_DIR_OUT_HIGH); gpio_set_value(GP_SW_RESET_OUT , GPIO_HIGH ); #endif XDEBUG(" GP_STA_GREEN_OUT ...... LOW ..... %d\r\n", GP_STA_GREEN_OUT); gpio_export(GP_STA_GREEN_OUT); gpio_dir_out(GP_STA_GREEN_OUT , GPIO_DIR_OUT_LOW); //GPIO_DIR_OUT gpio_set_value(GP_STA_GREEN_OUT , GPIO_LOW ); XDEBUG(" GP_CODI_PCTL_OUT ...... HIGH ..... %d\r\n", GP_CODI_PCTL_OUT); gpio_export(GP_CODI_PCTL_OUT); gpio_dir_out(GP_CODI_PCTL_OUT , GPIO_DIR_OUT_HIGH); gpio_set_value(GP_CODI_PCTL_OUT , GPIO_HIGH ); XDEBUG(" GP_CODI_RST_OUT ....... HIGH ..... %d\r\n", GP_CODI_RST_OUT); gpio_export(GP_CODI_RST_OUT); gpio_dir_out(GP_CODI_RST_OUT , GPIO_DIR_OUT_HIGH); gpio_set_value(GP_CODI_RST_OUT , GPIO_HIGH ); XDEBUG(" GP_NPLC_PCTL_OUT ...... HIGH ..... %d\r\n", GP_NPLC_PCTL_OUT); gpio_export(GP_NPLC_PCTL_OUT); gpio_dir_out(GP_NPLC_PCTL_OUT , GPIO_DIR_OUT_HIGH); gpio_set_value(GP_NPLC_PCTL_OUT , GPIO_HIGH ); XDEBUG(" GP_NPLC_RST_OUT ....... HIGH ..... %d\r\n", GP_NPLC_RST_OUT); gpio_export(GP_NPLC_RST_OUT); gpio_dir_out(GP_NPLC_RST_OUT , GPIO_DIR_OUT_HIGH); gpio_set_value(GP_NPLC_RST_OUT , GPIO_HIGH ); /** Mobile Module Power Setting. * * AMTelecom Module의 경우 GSM_PCTL_OUT 일 Low로 설정하여 전원을 Off 시킨 후 * GSM_INIT_PCTL_OUT 값을 조정해 주어야 한다. */ gpio_export(GP_GSM_PCTL_OUT); XDEBUG(" GP_GSM_PCTL_OUT ....... HIGH ..... %d\r\n", GP_GSM_PCTL_OUT); gpio_dir_out(GP_GSM_PCTL_OUT , GPIO_DIR_OUT_HIGH); //GPIO_DIR_OUT gpio_set_value(GP_GSM_PCTL_OUT, GPIO_HIGH); XDEBUG(" GP_GSM_RST_OUT ........ LOW ..... %d\r\n", GP_GSM_RST_OUT); gpio_export(GP_GSM_RST_OUT); gpio_dir_out(GP_GSM_RST_OUT , GPIO_DIR_OUT_LOW); //GPIO_DIR_OUT gpio_set_value(GP_GSM_RST_OUT , GPIO_LOW ); gpio_export(GP_GSM_INIT_PCTL_OUT); if(m_pMobileType != NULL) { /** TI AM335x는 DTSS800, MC55 를 지원하지 않는다 */ if(!strcasecmp(MOBILE_MODULE_TYPE_AME5210, m_pMobileType)) { // AM Telecom XDEBUG(" GP_GSM_INIT_PCTL_OUT .. LOW ..... %d\r\n", GP_GSM_INIT_PCTL_OUT); gpio_dir_out(GP_GSM_INIT_PCTL_OUT , GPIO_DIR_OUT_LOW); //GPIO_DIR_OUT XDEBUG(" GP_GSM_PCTL_OUT ....... HIGH ..... %d\r\n", GP_GSM_PCTL_OUT); gpio_dir_out(GP_GSM_PCTL_OUT , GPIO_DIR_OUT_HIGH); //GPIO_DIR_OUT #if 0 gpio_set_value(GP_GSM_PCTL_OUT, GPIO_HIGH); #endif } else if(!strcasecmp(MOBILE_MODULE_TYPE_GE910, m_pMobileType) || !strcasecmp(MOBILE_MODULE_TYPE_UE910, m_pMobileType)) { XDEBUG(" GP_GSM_INIT_PCTL_OUT .. LOW ..... %d\r\n", GP_GSM_INIT_PCTL_OUT); gpio_dir_out(GP_GSM_INIT_PCTL_OUT , GPIO_DIR_OUT_LOW); //GPIO_DIR_OUT #if 0 XDEBUG(" GP_GSM_INIT_PCTL_OUT .. HIGH ..... %d\r\n", GP_GSM_INIT_PCTL_OUT); gpio_set_value(GP_GSM_INIT_PCTL_OUT, GPIO_HIGH); usleep(5000000); XDEBUG(" GP_GSM_INIT_PCTL_OUT .. LOW ..... %d\r\n", GP_GSM_INIT_PCTL_OUT); gpio_set_value(GP_GSM_INIT_PCTL_OUT, GPIO_LOW); #endif } } XDEBUG(" GP_RF_SIG_OUT ......... LOW ..... %d\r\n", GP_RF_SIG_OUT); gpio_export(GP_RF_SIG_OUT); gpio_dir_out(GP_RF_SIG_OUT , GPIO_DIR_OUT_LOW); // //GPIO_DIR_OUT gpio_set_value(GP_RF_SIG_OUT , GPIO_LOW ); XDEBUG(" GP_BATT_CHG_EN_OUT .... LOW ..... %d\r\n", GP_BATT_CHG_EN_OUT); gpio_export(GP_BATT_CHG_EN_OUT); gpio_dir_out(GP_BATT_CHG_EN_OUT , GPIO_DIR_OUT_LOW); //GPIO_DIR_OUT // Battery Charging Reset gpio_set_value(GP_BATT_CHG_EN_OUT , GPIO_HIGH ); USLEEP(500000); gpio_set_value(GP_BATT_CHG_EN_OUT , GPIO_LOW ); XDEBUG(" GP_BATT_SW_OUT ........ HIGH ..... %d\r\n", GP_BATT_SW_OUT); gpio_export(GP_BATT_SW_OUT); gpio_dir_out(GP_BATT_SW_OUT , GPIO_DIR_OUT_HIGH); // gpio_set_value(GP_BATT_SW_OUT , GPIO_HIGH ); XDEBUG(" GP_485_TX_EN_OUT ...... HIGH ..... %d\r\n", GP_485_TX_EN_OUT); gpio_export(GP_485_TX_EN_OUT); if(!gpio_dir_out(GP_485_TX_EN_OUT , GPIO_DIR_OUT_HIGH)) { gpio_set_value(GP_485_TX_EN_OUT , GPIO_HIGH ); } XDEBUG(" GP_DEBUG_LED1_OUT ..... LOW ..... %d\r\n", GP_DEBUG_LED1_OUT); gpio_export(GP_DEBUG_LED1_OUT); gpio_dir_out(GP_DEBUG_LED1_OUT , GPIO_DIR_OUT_LOW); // gpio_set_value(GP_DEBUG_LED1_OUT , GPIO_LOW ); XDEBUG(" GP_DEBUG_LED2_OUT ..... LOW ..... %d\r\n", GP_DEBUG_LED2_OUT); gpio_export(GP_DEBUG_LED2_OUT); gpio_dir_out(GP_DEBUG_LED2_OUT , GPIO_DIR_OUT_LOW); // gpio_set_value(GP_DEBUG_LED2_OUT , GPIO_LOW ); XDEBUG(" GP_DEBUG_LED3_OUT ..... LOW ..... %d\r\n", GP_DEBUG_LED3_OUT); gpio_export(GP_DEBUG_LED3_OUT); gpio_dir_out(GP_DEBUG_LED3_OUT , GPIO_DIR_OUT_LOW); // gpio_set_value(GP_DEBUG_LED3_OUT , GPIO_LOW ); XDEBUG("** GPIO Initialize End\r\n"); #else if (m_nFD != -1) return FALSE; m_nFD = open("/dev/gpio", O_RDWR | O_NDELAY); if (m_nFD < 0) { printf(" -------- GPIO Devive Open Fail -------\n"); m_nFD = -1; return FALSE; } // GPIO 입력 다이렉션 ioctl(m_nFD, GPIO_IOCTL_DIR, GP_PWR_FAIL_INPUT); // PWR FAIL ioctl(m_nFD, GPIO_IOCTL_DIR, GP_LOW_BATT_INPUT); // LOW BATTERY ioctl(m_nFD, GPIO_IOCTL_DIR, GP_GSM_DCD_INPUT); // MOBILE DCD ioctl(m_nFD, GPIO_IOCTL_DIR, GP_GSM_SYNC_INPUT); // MOBILE SYNC ioctl(m_nFD, GPIO_IOCTL_DIR, GP_GSM_RI_INPUT); // MOBILE RI ioctl(m_nFD, GPIO_IOCTL_DIR, GP_DOOR_OPEN_INPUT); // DOOR OPEN/CLOSE ioctl(m_nFD, GPIO_IOCTL_DIR, GP_TEMP_OS_INPUT); // HEATER ON/OFF ioctl(m_nFD, GPIO_IOCTL_DIR, GP_BATT_CHG_STATUS_INPUT); // BATT CHG STS // GPIO 포트 초기값 설정 ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOHIGH(GP_SW_RST_OUT)); // PWR RESET ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOHIGH(GP_CODI_RST_OUT)); // COORDINATOR RESET // GPIO Output Direction Setting ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_SW_RST_OUT)); // SW RESET ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_CODI_RST_OUT)); // COORDINATOR RESET ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_BATT_SW_OUT)); // PWR CTRL ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_BATT_CHG_EN_OUT)); // BATT CHG EN if(m_pMobileType != NULL) { /** PXA는 GE910, UE910 를 지원하지 않는다 */ if(!strcasecmp(MOBILE_MODULE_TYPE_DTSS800, m_pMobileType)) { ioctl(m_nFD, GPIO_IOCTL_DIR, GP_GSM_IGT_OUT); // MOBILE RESET (IGT) } else if(!strcasecmp(MOBILE_MODULE_TYPE_MC55, m_pMobileType)) { ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_GSM_EMERGOFF_OUT)); // EMERGENCY OFF ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_GSM_IGT_OUT)); // MOBILE RESET (IGT) } } ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_GSM_PCTL_OUT)); // MOBILE POWER ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_GSM_DTR_OUT)); // MOBILE DTR ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_LED_READY_OUT)); // LED READY ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_STA_GREEN_OUT)); // STATUS GREEN LED ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_STA_RED_OUT)); // STATUS RED LED ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_DEBUG_LED1_OUT)); // LED DEBUG1 ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_DEBUG_LED2_OUT)); // LED DEBUG2 ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_DEBUG_LED3_OUT)); // LED DEBUG3 ioctl(m_nFD, GPIO_IOCTL_DIR, GPIOSET(GP_DEBUG_LED4_OUT)); // LED DEBUG4 // 신규 보드는 HIGH, 영국, 스웨덴은 LOW, 구형은 HIGH #if defined(__SUPPORT_NZC1__) ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOLOW(GP_BATT_SW_OUT)); // BATTERY ENABLE/DISABLE CONTROL #elif defined(__SUPPORT_NZC2__) ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOHIGH(GP_BATT_SW_OUT)); // BATTERY ENABLE/DISABLE CONTROL #else assert(0); #endif if(m_pMobileType != NULL && !strcasecmp(MOBILE_MODULE_TYPE_MC55, m_pMobileType)) { ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOLOW(GP_GSM_EMERGOFF_OUT)); // GSM RESET ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOLOW(GP_GSM_IGT_OUT)); // GSM IGT } ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOHIGH(GP_LED_READY_OUT)); // READY LED OFF ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOHIGH(GP_STA_GREEN_OUT)); // GREEN LED OFF ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOHIGH(GP_STA_RED_OUT)); // RED LED OFF XDEBUG("** Mobile Power OFF\xd\xa"); ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOLOW(GP_BATT_CHG_EN_OUT)); // BATT CHARGE DISABLE ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOLOW(GP_GSM_PCTL_OUT)); // GSM Power Off usleep(1000000); XDEBUG("** Mobile Power ON\xd\xa"); ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOHIGH(GP_BATT_CHG_EN_OUT)); // BATT CHARGE ENABLE ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOHIGH(GP_GSM_PCTL_OUT)); usleep(1000000); if(m_pMobileType != NULL && !strcasecmp(MOBILE_MODULE_TYPE_MC55, m_pMobileType)) { XDEBUG("** Mobile IGT or Reset\xd\xa"); ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOHIGH(GP_GSM_IGT_OUT)); // IGT HIGH usleep(1000000); ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOLOW(GP_GSM_IGT_OUT)); // IGT LOW usleep(1000000); ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOHIGH(GP_GSM_IGT_OUT)); // IGT HIGH } XDEBUG("** Mobile DTR Control\xd\xa"); ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOHIGH(GP_GSM_DTR_OUT)); // DTR HIGH usleep(1000000); ioctl(m_nFD, GPIO_IOCTL_OUT, GPIOLOW(GP_GSM_DTR_OUT)); // DTR LOW #endif /** Monitoring이 필요 없으면 바로 Return 한다 */ if(bMonitoring == FALSE) return TRUE; // 상태 모니터링 쓰레드 생성 m_bExitPending = FALSE; if (pthread_create(&m_gpioThreadID, NULL, gpioWatchThread, (void *)this) != 0) return FALSE; pthread_detach(m_gpioThreadID); return TRUE; }