コード例 #1
0
ファイル: bypass.cpp プロジェクト: bearxiong99/new_swamm
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); 
}              
コード例 #2
0
ファイル: Transfer.cpp プロジェクト: bearxiong99/new_swamm
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;
}
コード例 #3
0
ファイル: qc.c プロジェクト: bearxiong99/new_swamm
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;
}
コード例 #4
0
ファイル: Transfer.cpp プロジェクト: bearxiong99/new_swamm
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	
}
コード例 #5
0
ファイル: fbtft-io.c プロジェクト: rm-hull/fbtft
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;
}
コード例 #6
0
ファイル: fbtft-io.c プロジェクト: rm-hull/fbtft
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;
}
コード例 #7
0
ファイル: fb_ili9327.c プロジェクト: ont/fbtft
/*
 * 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;
}
コード例 #8
0
ファイル: GpioControl.cpp プロジェクト: bearxiong99/new_swamm
/** 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;
}