void PowerControl(BOOL bOnOff) { int fd; fd = open("/dev/gpio", O_RDWR | O_NDELAY); if (fd <= 0) return; #if defined(__SUPPORT_NZC1__) ioctl(fd, GPIO_IOCTL_DIR, GPIOSET(GP_CODI_PCTL_OUT)); // Coordinator VDD #endif ioctl(fd, GPIO_IOCTL_DIR, GPIOSET(GP_CODI_RST_OUT)); // Coordinator RESET #if defined(__SUPPORT_NZC1__) if (bOnOff) { ioctl(fd, GPIO_IOCTL_OUT, GPIOHIGH(GP_CODI_PCTL_OUT)); #endif ioctl(fd, GPIO_IOCTL_OUT, GPIOLOW(GP_CODI_RST_OUT)); USLEEP(1000000); ioctl(fd, GPIO_IOCTL_OUT, GPIOHIGH(GP_CODI_RST_OUT)); #if defined(__SUPPORT_NZC1__) } else { ioctl(fd, GPIO_IOCTL_OUT, GPIOLOW(GP_CODI_PCTL_OUT)); } #endif close(fd); }
void CTransfer::DisconnectModem() { #if 0 int i, dcd, fd; fd = open("/dev/gpio", O_RDWR | O_NDELAY); if (fd <= 0) return; // GPIO Input Direction Setting ioctl(fd, GPIO_IOCTL_DIR, GPIOSET(GP_GSM_DTR_OUT)); // MOBILE DTR ioctl(fd, GPIO_IOCTL_DIR, GP_GSM_DCD_INPUT); // MOBILE DCD for(i=0; i<5; i++) { ioctl(fd, GPIO_IOCTL_OUT, GPIOHIGH(GP_GSM_DTR_OUT)); usleep(1000000); ioctl(fd, GPIO_IOCTL_OUT, GPIOLOW(GP_GSM_DTR_OUT)); usleep(1000000); dcd = ioctl(fd, GPIO_IOCTL_IN, GP_GSM_DCD_INPUT); if (dcd == 1) break; } close(fd); #endif return; }
void _powerTest(void) { INIT_DOT; INIT_ERROR; int i,j, toggle=1; int fd; SUCC_DOT("Waiting for Power Fail Signal"); if((fd=open("/dev/gpio", O_RDWR|O_NDELAY))<0) { ADD_ERROR("%s", "GPIO Device Open Fail"); return; } for(i=1;m_LedTable[i][0];i++) { if(m_LedTable[i][0]>0) ioctl(fd, GPIO_IOCTL_DIR, GPIOSET(m_LedTable[i][0])); if(m_LedTable[i][1]>0) ioctl(fd, GPIO_IOCTL_DIR, GPIOSET(m_LedTable[i][1])); } while(!kbhit()) { for(j=0;m_LedTable[j][0];j++) { if(m_LedTable[j][0]>0) GPIOAPI_WriteGpio(m_LedTable[j][0], toggle); if(m_LedTable[j][1]>0) GPIOAPI_WriteGpio(m_LedTable[j][1], 1 - toggle); } toggle = 1 - toggle; if(GPIOAPI_ReadGpio(GP_PWR_FAIL_INPUT)) { _teardownled(); if(OnOffHeater(0)) { ADD_ERROR("%s","Heater Off Fail"); } close(fd); CLOSE_DOT; return; } usleep(500000); } ADD_ERROR("%s", "PWR_FAIL Signal Fail"); readch(); _teardownled(); CLOSE_DOT; }
void CTransfer::ResetModem() { #if 0 int fd; XDEBUG("CIRCUIT: Modem no response. Reset modem.\r\n"); fd = open("/dev/gpio", O_RDWR | O_NDELAY); if (fd <= 0) return; ioctl(fd, GPIO_IOCTL_DIR, GPIOSET(GP_GSM_PCTL_OUT)); // MOBILE POWER (LOW - HIGH) ioctl(fd, GPIO_IOCTL_DIR, GPIOSET(GP_GSM_EMERGOFF_OUT)); // MOBILE EMERGY OFF (HIGH - LOW) ioctl(fd, GPIO_IOCTL_DIR, GPIOSET(GP_GSM_IGT_OUT)); // MOBILE RESET (IGT) (HIGH - LOW - HIGH) ioctl(fd, GPIO_IOCTL_DIR, GPIOSET(GP_GSM_DTR_OUT)); // MOBILE DTR (HIGH - LOW) // GSM Mobule Power Control ioctl(fd, GPIO_IOCTL_OUT, GPIOHIGH(GP_GSM_PCTL_OUT)); usleep(1000000); ioctl(fd, GPIO_IOCTL_OUT, GPIOHIGH(GP_GSM_EMERGOFF_OUT)); usleep(4000000); ioctl(fd, GPIO_IOCTL_OUT, GPIOLOW(GP_GSM_EMERGOFF_OUT)); ioctl(fd, GPIO_IOCTL_OUT, GPIOHIGH(GP_GSM_IGT_OUT)); usleep(1000000); ioctl(fd, GPIO_IOCTL_OUT, GPIOLOW(GP_GSM_IGT_OUT)); usleep(1000000); ioctl(fd, GPIO_IOCTL_OUT, GPIOHIGH(GP_GSM_IGT_OUT)); // GSM Module Disconnect ioctl(fd, GPIO_IOCTL_OUT, GPIOHIGH(GP_GSM_DTR_OUT)); usleep(1000000); ioctl(fd, GPIO_IOCTL_OUT, GPIOLOW(GP_GSM_DTR_OUT)); close(fd); usleep(2000000); #endif }
int fbtft_write_gpio16_wr(struct fbtft_par *par, void *buf, size_t len) { unsigned int set=0; unsigned int reset=0; u16 data; fbtft_dev_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len, "%s(len=%d): ", __func__, len); while (len) { len -= 2; data = *(u16 *) buf; buf +=2; /* Start writing by pulling down /WR */ gpio_set_value(par->gpio.wr, 0); /* Set data */ GPIOSET(par->gpio.db[0], (data&0x0001)); GPIOSET(par->gpio.db[1], (data&0x0002)); GPIOSET(par->gpio.db[2], (data&0x0004)); GPIOSET(par->gpio.db[3], (data&0x0008)); GPIOSET(par->gpio.db[4], (data&0x0010)); GPIOSET(par->gpio.db[5], (data&0x0020)); GPIOSET(par->gpio.db[6], (data&0x0040)); GPIOSET(par->gpio.db[7], (data&0x0080)); GPIOSET(par->gpio.db[8], (data&0x0100)); GPIOSET(par->gpio.db[9], (data&0x0200)); GPIOSET(par->gpio.db[10], (data&0x0400)); GPIOSET(par->gpio.db[11], (data&0x0800)); GPIOSET(par->gpio.db[12], (data&0x1000)); GPIOSET(par->gpio.db[13], (data&0x2000)); GPIOSET(par->gpio.db[14], (data&0x4000)); GPIOSET(par->gpio.db[15], (data&0x8000)); writel(set, __io_address(GPIO_BASE+0x1C)); writel(reset, __io_address(GPIO_BASE+0x28)); /* Pullup /WR */ gpio_set_value(par->gpio.wr, 1); set = 0; reset = 0; } return 0; }
int fbtft_read_spi(struct fbtft_par *par, void *buf, size_t len) { int ret; u8 txbuf[32] = { 0, }; struct spi_transfer t = { .speed_hz = 2000000, .rx_buf = buf, .len = len, }; struct spi_message m; if (!par->spi) { dev_err(par->info->device, "%s: par->spi is unexpectedly NULL\n", __func__); return -ENODEV; } if (par->startbyte) { if (len > 32) { dev_err(par->info->device, "%s: len=%d can't be larger than 32 when using 'startbyte'\n", __func__, len); return -EINVAL; } txbuf[0] = par->startbyte | 0x3; t.tx_buf = txbuf; fbtft_dev_dbg_hex(DEBUG_READ, par, par->info->device, u8, txbuf, len, "%s(len=%d) txbuf => ", __func__, len); } spi_message_init(&m); spi_message_add_tail(&t, &m); ret = spi_sync(par->spi, &m); fbtft_dev_dbg_hex(DEBUG_READ, par, par->info->device, u8, buf, len, "%s(len=%d) buf <= ", __func__, len); return ret; } EXPORT_SYMBOL(fbtft_read_spi); #ifdef CONFIG_ARCH_BCM2708 /* Raspberry Pi - writing directly to the registers is 40-50% faster than optimized use of gpiolib */ #define GPIOSET(no, ishigh) { if (ishigh) set|=(1<<no); else reset|=(1<<no); } while(0) int fbtft_write_gpio8_wr(struct fbtft_par *par, void *buf, size_t len) { unsigned int set=0; unsigned int reset=0; u8 data; fbtft_dev_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len, "%s(len=%d): ", __func__, len); while (len--) { data = *(u8 *) buf; buf++; /* Set data */ GPIOSET(par->gpio.db[0], (data&0x01)); GPIOSET(par->gpio.db[1], (data&0x02)); GPIOSET(par->gpio.db[2], (data&0x04)); GPIOSET(par->gpio.db[3], (data&0x08)); GPIOSET(par->gpio.db[4], (data&0x10)); GPIOSET(par->gpio.db[5], (data&0x20)); GPIOSET(par->gpio.db[6], (data&0x40)); GPIOSET(par->gpio.db[7], (data&0x80)); writel(set, __io_address(GPIO_BASE+0x1C)); writel(reset, __io_address(GPIO_BASE+0x28)); //Pulse /WR low writel((1<<par->gpio.wr), __io_address(GPIO_BASE+0x28)); writel(0, __io_address(GPIO_BASE+0x28)); //used as a delay writel((1<<par->gpio.wr), __io_address(GPIO_BASE+0x1C)); set = 0; reset = 0; } return 0; }
/* * Option to use direct gpio access to speed up display refresh * */ static int fbtft_ili9327_write_gpio8_wr(struct fbtft_par *par, void *buf, size_t len) { u8 data; static u8 prev_data = 0xff; #ifdef BYPASS_GPIOLIB unsigned int set = 0; unsigned int reset = 0; #else int i; #endif fbtft_par_dbg_hex(DEBUG_WRITE, par, par->info->device, u8, buf, len, "%s-OPTIMIZED(len=%d): ", __func__, len); #ifdef BYPASS_GPIOLIB while (len--) { data = *(u8 *) buf; if (data != prev_data) { /* Set data */ GPIOSET(par->gpio.db[0], (data&0x01)); GPIOSET(par->gpio.db[1], (data&0x02)); GPIOSET(par->gpio.db[2], (data&0x04)); GPIOSET(par->gpio.db[3], (data&0x08)); GPIOSET(par->gpio.db[4], (data&0x10)); GPIOSET(par->gpio.db[5], (data&0x20)); GPIOSET(par->gpio.db[6], (data&0x40)); GPIOSET(par->gpio.db[7], (data&0x80)); writel(set, __io_address(GPIO_BASE+0x1C)); writel(reset, __io_address(GPIO_BASE+0x28)); } /* Pulse /WR low */ writel((1<<par->gpio.wr), __io_address(GPIO_BASE+0x28)); writel(0, __io_address(GPIO_BASE+0x28)); /* used as a delay */ writel((1<<par->gpio.wr), __io_address(GPIO_BASE+0x1C)); set = 0; reset = 0; prev_data = data; buf++; } #else while (len--) { data = *(u8 *) buf; /* Start writing by pulling down /WR */ gpio_set_value(par->gpio.wr, 0); /* Set data */ #ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO if (data == prev_data) { gpio_set_value(par->gpio.wr, 0); /* used as delay */ } else { for (i = 0; i < 8; i++) { if ((data & 1) != (prev_data & 1)) gpio_set_value(par->gpio.db[i], data & 1); data >>= 1; prev_data >>= 1; } } #else for (i = 0; i < 8; i++) { gpio_set_value(par->gpio.db[i], data & 1); data >>= 1; } #endif /* Pullup /WR */ gpio_set_value(par->gpio.wr, 1); #ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO prev_data = *(u8 *) buf; #endif buf++; } #endif 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; }