Пример #1
0
/**
 * @brief s_open - open a serial port
 *
 * @param t_port -port number
 *
 * @return success/fail
 */
signed char s_open(char *t_port)
{
	int x;
	char cmd[200];
	if (fd) {
		S_ERROR("Port is already open\n");
		return SERIAL_FAILED;
	}
	/* Check if serial port is used by other process */

	/* NOTE: it is a bad idea to use lsof, but the alternative
	 * is to write large amount of code..
	 */
	sprintf(cmd, "lsof |grep %s 2>&1 >/dev/null", t_port);
	x = system(cmd);
	if (x == 0) {
		S_ERROR("device %s being used already?\n", t_port);
		sprintf(cmd, "lsof |grep %s", t_port);
		system(cmd);
		return SERIAL_FAILED;
	}
	fd = open(t_port, O_RDWR | O_NOCTTY);
	if (fd < 0) {
		S_ERROR("failed to open %s\n", t_port);
		perror(t_port);
		return SERIAL_FAILED;
	}
	strncpy((char *)port, t_port, 30);
	S_INFO("Serial port %s opend fine\n", port);
	return SERIAL_OK;
}
Пример #2
0
void __init rockchip_timer_clock_source_init( int apb_clk )
{
        int             v =  apb_clk / TIMER_MIN_PCLK;

        /* 20101008,HSL,do not warn for 2818.*/
        //WARN_ON(v * TIMER_MIN_PCLK != apb_clk);  /* have bug */

        S_INFO("%s::apb=%d,timer apb=%d\n",__func__,apb_clk,v);
        spin_lock( &rockchip_timer_spinlock );
        rockchip_apb_clk = v ;
        
        RK_TIMER_DISABLE(TIMER_CLKSRC);
        TIMER_SET_ROUNDUS();
        #if !CHIP_RK281X
        RK_TIMER_INT_ENABLE( TIMER_CLKSRC );
        #else
        RK_TIMER_INT_DISABLE( TIMER_CLKSRC );
        #endif
        RK_TIMER_SETMODE_USER( TIMER_CLKSRC );

        RK_TIMER_DISABLE(TIMER_CLKEVT);
        RK_TIMER_INT_ENABLE( TIMER_CLKEVT );
        RK_TIMER_SETMODE_USER( TIMER_CLKEVT );

        spin_unlock( &rockchip_timer_spinlock );
}
Пример #3
0
RpcStringBinding::RpcStringBinding
    (
    DUALSTRINGARRAY*    pdsa,
    int			portNumber
    )
  : m_ipAddress (0),
    m_portNumber (portNumber),
    m_protocolSeq (0),
    m_strFormat (0),
    m_strFormatNoPortNumber (0)
    {
    // Check the DUALSTRINGARRAY entries, to find one which can be
    // 'resolved' into an IP address on this machine. Win2K sometimes
    // provides hostnames as well as the IP numbers that NT usually
    // sends, so we need to scan the array to find an IP number...
    OLECHAR* pStart = pdsa->aStringArray;
    OLECHAR* pCurr = pStart;
    
    while ((pCurr - pStart) < pdsa->wNumEntries)
        {
        // Make a string-binding out of the DSA entry...
	char * pStr = new char [comWideStrLen (pCurr + 1) + 1];
	comWideToAscii (pStr, pCurr + 1, comWideStrLen (pCurr + 1) + 1);
        initialiseFromString (pStr);
	delete []pStr;
        m_protocolSeq  = *pCurr;

        // See if it can be 'resolved' into a viable IP number...
        if (! resolve ())
            {
            S_ERR (LOG_DCOM, "Could not resolve " << ipAddress ());

            // Free up the allocated strings.
            delString (m_ipAddress);
            delString (m_strFormat);
            delString (m_strFormatNoPortNumber);

            // Could not make sense of the address, so move on through
            // the array to the next entry, or the end of the array...
            while (((pCurr - pStart) < pdsa->wNumEntries) && (*pCurr))
                ++pCurr;

            ++pCurr;
            }
        else
            {
            S_INFO (LOG_DCOM, "Resolved " << ipAddress ());

            // Take the first one that is viable...
            break;
            }
        }
    // at this point the string binding may have worked or not so the calling
    // routine must make a call to resolve to determine if a valid address was
    // bound since the constructor can't /init
    }
Пример #4
0
/**
 * @brief s_putc - put a character into serial port
 *
 * @param x - character to write
 *
 * @return character written or error
 */
signed int s_putc(char x)
{
	int ret = 0;
	S_INFO("[%c] 0x%02x", x, (unsigned char)x);
	ret = s_write((unsigned char *)&x, 1);
	if (ret < 0) {
		S_ERROR("putc failed-%d\n", ret);
		return ret;
	}
	return x;
}
Пример #5
0
/**
 * @brief s_getc - get a character from serial port
 *
 * @return character read or error
 */
signed int s_getc(void)
{
	unsigned char x = 0;
	int ret = 0;
	ret = s_read(&x, 1);
	if (ret < 0) {
		S_ERROR("getc failed-%d\n", ret);
		return ret;
	}
	S_INFO("[%c]%x", x, x);
	return x;
}
Пример #6
0
/* 
 * return 1:need to quit suspend , 0 :reenter suspend 
 * 20091010,由于拔掉USB会产生我们不希望的中断,因此USB只能通过
 * VBUS的变化来判断,不能通过中断判断.
 * 关于VBUS的判断,统一放到 dwc_otg_pcd.c 文件里面.
 */
int rockchip_timer_clocksource_irq_checkandclear( void )
{
        unsigned int  t0,t;
        volatile unsigned int *intc_reg = (volatile unsigned int *)(INTC_BASE_ADDR_VA);      // +0x28
#if 0
        printk("intc regs0:\n0x%08x 0x%08x 0x%08x 0x%08x\n"
                "0x%08x 0x%08x 0x%08x 0x%08x\n"
                "0x%08x 0x%08x 0x%08x 0x%08x\n"
                "0x%08x 0x%08x\n"
                ,
                intc_reg[0],intc_reg[1],intc_reg[2],intc_reg[3],
                intc_reg[4],intc_reg[5],intc_reg[6],intc_reg[7],
                intc_reg[8],intc_reg[9],intc_reg[10],intc_reg[11],
                intc_reg[12],intc_reg[13]
                );
        t0 = intc_reg[IRQ_REG_MASKSTATUS_L/4];
        t = intc_reg[IRQ_REG_MASKSTATUS_H/4];

        //debug_gpio_reverse();
        printk("irq0=0x%x!,irq1=0x%x(%d)!\n" ,
                 t0 , t , (t>>IRQ_NR_TIMER2)&1 );
        if( t0 == 0 && t == 0 ) {
                intc_reg[IRQ_REG_INTEN_L/4] = (1<<IRQ_NR_GPIO1);
                intc_reg[IRQ_REG_INTEN_H/4] = 0;
         }
        printk("intc regs1:\n0x%08x 0x%08x 0x%08x 0x%08x\n"
                "0x%08x 0x%08x 0x%08x 0x%08x\n"
                "0x%08x 0x%08x 0x%08x 0x%08x\n"
                "0x%08x 0x%08x\n"
                ,
                intc_reg[0],intc_reg[1],intc_reg[2],intc_reg[3],
                intc_reg[4],intc_reg[5],intc_reg[6],intc_reg[7],
                intc_reg[8],intc_reg[9],intc_reg[10],intc_reg[11],
                intc_reg[12],intc_reg[13]
                );
#else
        t0 = intc_reg[IRQ_REG_MASKSTATUS_L/4];
        t = intc_reg[IRQ_REG_MASKSTATUS_H/4];
#endif
        S_INFO("wake up,t0=0x%x,t1=0x%x\n" , t0,t);
        /* clock source irq */
        if( t0&(1<<(IRQ_NR_TIMER1+TIMER_CLKEVT)) ) {
                RK_TIMER_INT_CLEAR(TIMER_CLKEVT);
                rktimer_update_suspend_ms(CHECK_VBUS_MS);
                t0 &= ~(1<<(IRQ_NR_TIMER1+TIMER_CLKEVT)); // remove for test deep sleep and wakeup.
        }

        /* 20091103,HSL@RK,all irq must be handle !*/
        t0 |= (t&0xffff);
        return t0; 
}
Пример #7
0
/**
 * @brief Flush the serial port data
 *
 * @param rx_bytes return bytes that remains(TBD)
 * @param tx_bytes the bytes that are to be send(TBD)
 *
 * @return error/fail
 */
signed int s_flush(unsigned int *rx_bytes, unsigned int *tx_bytes)
{
	int ret;
	if (!fd) {
		S_ERROR("terminal is not open!\n");
		return SERIAL_FAILED;
	}
	ret = tcflush(fd, TCIFLUSH);
	if (ret < 0) {
		S_ERROR("failed to flush buffers2\n");
		return SERIAL_FAILED;
	}
	S_INFO("Serial port %s flushed fine\n", port);

	return SERIAL_OK;
}
Пример #8
0
/*
 * 20091120,HSL@RK,disable irq for enable timer and set count . 
 *
 */
void rockchip_timer_clocksource_suspend_resume(int suspend )
{
	unsigned long flags;
	local_irq_save( flags );
	
	RK_TIMER_DISABLE(TIMER_CLKEVT);
#if 0
	if( suspend ) {
		RK_TIMER_SETCOUNT(TIMER_CLKEVT,RK_CHECK_VBUS_COUNT*rockchip_apb_clk); 
		RK_TIMER_ENABLE(TIMER_CLKEVT);
	} else {
		int cyl = RK_TIMER_GETCOUNT(TIMER_CLKEVT) -
		RK_TIMER_READVALUE(TIMER_CLKEVT);
		rktimer_update_suspend_ms( CHECK_VBUS_MS*cyl / RK_TIMER_GETCOUNT(TIMER_CLKEVT) );
	}
	S_INFO("r/s timer,load cnt=0x%x,clk_source_suspend=%ld\n" , 
	RK_TIMER_GETCOUNT(TIMER_CLKEVT), clk_source_suspend_second);
#endif
	local_irq_restore(flags);
}
Пример #9
0
static inline cputime64_t rkusb_get_cpu_idle_time(unsigned int cpu)
{
	cputime64_t idle_time;
	cputime64_t cur_jiffies;
	cputime64_t busy_time;
	cur_jiffies = jiffies64_to_cputime64(get_jiffies_64());
	busy_time = cputime64_add(kstat_cpu(cpu).cpustat.user,
			kstat_cpu(cpu).cpustat.system);

	busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.irq);
	busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.softirq);
	busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.steal);

	busy_time = cputime64_add(busy_time,	kstat_cpu(cpu).cpustat.nice);

	idle_time = cputime64_sub(cur_jiffies, busy_time);
	S_INFO("%s:jiffies=%Ld,busy=%Ld,idle=%Ld" , __FILE__,
	        cur_jiffies,busy_time,idle_time);
	return idle_time;
}
Пример #10
0
/**
 * @brief s_read - serial port read
 *
 * @param p_buffer buffer
 * @param size buffer length
 *
 * @return bytes read if ok, else SERIAL_FAILED
 */
signed int s_read(unsigned char *p_buffer, unsigned long size)
{
	int ret = 0;
	if (!fd) {
		S_ERROR("terminal is not open!\n");
		return SERIAL_FAILED;
	}
	/* read entire chunk.. no giving up! */
	newtio.c_cc[VMIN] = size;
	newtio.c_cc[VTIME] = VTIME_SET;
	ret = tcsetattr(fd, TCSANOW, &newtio);
	ret = read(fd, p_buffer, size);
	if (ret < 0) {
		S_ERROR("failed to read data\n");
		return SERIAL_FAILED;
	}

	S_INFO("Serial read requested=%d, read=%d\n", size, ret);
	return ret;
}
Пример #11
0
int rockchip_timer_change_pclk( ip_id ip , int input_clk , int stage )
{
        int clk;
        //unsigned int cur_cyl0;
        //S_INFO("%s::new clk=%d,old rockchip_apb_clk=%d\n" ,__func__,input_clk, rockchip_apb_clk);
        #ifdef CONFIG_CHIP_RK2818
        if( stage != STAGE_AFTER_CHG )
                return 0;
        #endif
        clk = input_clk/TIMER_MIN_PCLK;
        if( clk == rockchip_apb_clk )
                return 0;
         spin_lock( &rockchip_timer_spinlock );
        rockchip_apb_clk = clk ;
        spin_unlock( &rockchip_timer_spinlock );

        TIMER_SET_ROUNDUS();
        S_INFO("%s::apb clk=%d,rockchip_apb_clk=%d\n" ,__func__ , 
                input_clk , rockchip_apb_clk);
        return 0;
}
Пример #12
0
/**
 * @brief s_write - write to serial port
 *
 * @param p_buffer - buffer pointer
 * @param size -size of buffer
 *
 * @return bytes wrote if ok, else SERIAL_FAILED
 */
signed int s_write(unsigned char *p_buffer, unsigned long size)
{
	int ret = 0, ret1;
	if (!fd) {
		S_ERROR("terminal is not open!\n");
		return SERIAL_FAILED;
	}
	ret = write(fd, p_buffer, size);
	if (ret < 0) {
		S_ERROR("failed to write data\n");
		return SERIAL_FAILED;
	}
	/* Wait till it is emptied */
	ret1 = tcdrain(fd);
	if (ret1 < 0) {
		S_ERROR("failed in datai drain\n");
		perror(NULL);
		return ret1;
	}
	S_INFO("Serial wrote Requested=%ld wrote=%d\n", size, ret);
	return ret;
}
Пример #13
0
/**
 * @brief s_close - close the serial port
 *
 * @return sucess/fail
 */
signed char s_close(void)
{
	int ret = 0;
	if (!fd) {
		S_ERROR("terminal is not open!\n");
		return SERIAL_FAILED;
	}
	/*
	 * To prevent switching modes before the last vestiges
	 * of the data bits have been send, sleep a second.
	 * This seems to be especially true for usb2serial
	 * convertors.. it does look as if the data is buffered
	 * at the usb2serial device itself and closing/changing
	 * attribs before the final data is pushed is going to
	 * kill the last bits which need to be send
	 */
	sleep(1);
	/* restore the old port settings */
	ret = tcsetattr(fd, TCSANOW, &oldtio);
	if (ret < 0) {
		S_ERROR("failed to rest old settings\n");
		return SERIAL_FAILED;
	}
	ret = tcflush(fd, TCIFLUSH);
	if (ret < 0) {
		S_ERROR("failed to flush serial file handle\n");
	}
	ret = close(fd);
	fd = 0;
	if (ret < 0) {
		S_ERROR("failed to close serial file handle\n");
		return SERIAL_FAILED;
	}
	S_INFO("Serial closed %s fine\n", port);
	return SERIAL_OK;
}
Пример #14
0
/**
 * @brief s_configure - configure the serial port
 *
 * @param s_baud_rate -baudrate
 * @param s_parity -parity
 * @param s_stop_bits -num stop bits
 * @param s_data_bits -data bits
 *
 * @return -success/failure
 */
signed char s_configure(unsigned long s_baud_rate, unsigned char s_parity,
			unsigned char s_stop_bits, unsigned char s_data_bits)
{
	int ret;

	if (!fd) {
		S_ERROR("terminal is not open!\n");
		return SERIAL_FAILED;
	}
	/* save current port settings */
	ret = tcgetattr(fd, &oldtio);
	if (ret < 0) {
		S_ERROR("failed to set get old attribs\n");
		return SERIAL_FAILED;
	}

	/* get current settings, and modify as needed */
	ret = tcgetattr(fd, &newtio);
	if (ret < 0) {
		S_ERROR("failed to get current attribs\n");
		return SERIAL_FAILED;
	}

	switch (s_baud_rate) {
	case 57600:
		s_baud_rate = B57600;
		break;
	case 115200:
		s_baud_rate = B115200;
		break;
		/* Add other baudrates - see /usr/include/bits/termios.h */
	default:
		S_ERROR("Unknown baudrate %d\n", (unsigned int)s_baud_rate);
		return SERIAL_FAILED;
	}
	cfsetospeed(&newtio, s_baud_rate);
	cfsetispeed(&newtio, s_baud_rate);

	newtio.c_cflag &= ~(CS5 | CS6 | CS7 | CS8);
	switch (s_data_bits) {
	case 5:
		newtio.c_cflag |= CS5;
		break;
	case 6:
		newtio.c_cflag |= CS6;
		break;
	case 7:
		newtio.c_cflag |= CS7;
		break;
	case 8:
		newtio.c_cflag |= CS8;
		break;
	default:
		S_ERROR("unknown data bit %d\n", s_data_bits);
		return SERIAL_FAILED;
	}

	switch (s_stop_bits) {
	case ONE_STOP_BIT:
		newtio.c_cflag &= ~CSTOPB;
		break;
	case TWO_STOP_BIT:
		newtio.c_cflag |= CSTOPB;
		break;
	default:
		S_ERROR("unknown stop bit %d\n", s_stop_bits);
		return SERIAL_FAILED;
	}

	newtio.c_cflag &= ~(PARENB | PARODD);
	newtio.c_iflag &= ~(IGNPAR);
	switch (s_parity) {
	case ODDPARITY:	/* odd */
		newtio.c_cflag |= PARENB | PARODD;
		newtio.c_iflag |= IGNPAR;
		break;
	case EVENPARITY:	/* even */
		newtio.c_cflag |= PARENB;
		newtio.c_iflag = 0;
		break;
	case NOPARITY:		/* none */
		break;
	default:
		S_ERROR("unknown parity %d", s_parity);
		return SERIAL_FAILED;
	}

	newtio.c_iflag |= IGNBRK;
	newtio.c_cflag |= CLOCAL | CREAD;

	S_INFO("c_cflag: 0x%08x\n", (unsigned int)(newtio.c_cflag));

	newtio.c_oflag = 0;
	/* set input mode (non-canonical, no echo,...) */
	newtio.c_lflag = 0;
	newtio.c_cc[VTIME] = VTIME_SET;
	newtio.c_cc[VMIN] = 1;
	newtio.c_cc[VSWTC] = 0;
	ret = tcflush(fd, TCIFLUSH);
	if (ret < 0) {
		S_ERROR("failed to set flush buffers\n");
		return SERIAL_FAILED;
	}
	ret = tcsetattr(fd, TCSANOW, &newtio);
	if (ret < 0) {
		S_INFO("tcsetattr -> %s (%d) fd=%d", strerror(errno), ret, fd);
		S_ERROR("failed to set new attribs\n");
		return SERIAL_FAILED;
	}
	S_INFO("Serial port %s configured fine\n", port);
	return SERIAL_OK;
}