Ejemplo n.º 1
0
void proses_c(char *c)
{
	xSerialPutChar(0, *c);
	
	if (*c == 0x0D)  /* jika enter dari gtkterm */
	{		
		process_string( kar, jum );
		
		memset( kar, 0, sizeof (kar));
		jum = 0;
	}
	else if ( *c == 0x0A )
	{
		//xSerialPutChar(0, 'A');
		process_string( kar, jum );
		
		memset( kar, 0, sizeof (kar));
		jum = 0;
	}
	else
	{
		kar[ jum++ ] = (char *) *c;
		
		
		
		if (jum > 128) 
		{
			ser_out("Penuh !\r\n");
			jum = 0;
		}
	}
}
Ejemplo n.º 2
0
Archivo: serial.c Proyecto: PyroOS/Pyro
static int set_modem_info( SerPort_s* psPort, int cmd, uint32* value, bool bFromKernel )
{
    int error;
    unsigned int arg;
    unsigned long flags;

    if ( bFromKernel ) {
	arg = *value;
	error = 0;
    } else {
	error = memcpy_from_user( &arg, value, sizeof(uint32) );
    }
    if (error)
	return error;
  
    switch (cmd) {
	case TIOCMBIS: 
	    if (arg & TIOCM_RTS)
		psPort->sp_nMCR |= UART_MCR_RTS;
	    if (arg & TIOCM_DTR)
		psPort->sp_nMCR |= UART_MCR_DTR;
#ifdef TIOCM_OUT1
	    if (arg & TIOCM_OUT1)
		psPort->sp_nMCR |= UART_MCR_OUT1;
	    if (arg & TIOCM_OUT2)
		psPort->sp_nMCR |= UART_MCR_OUT2;
#endif
	    break;
	case TIOCMBIC:
	    if (arg & TIOCM_RTS)
		psPort->sp_nMCR &= ~UART_MCR_RTS;
	    if (arg & TIOCM_DTR)
		psPort->sp_nMCR &= ~UART_MCR_DTR;
#ifdef TIOCM_OUT1
	    if (arg & TIOCM_OUT1)
		psPort->sp_nMCR &= ~UART_MCR_OUT1;
	    if (arg & TIOCM_OUT2)
		psPort->sp_nMCR &= ~UART_MCR_OUT2;
#endif
	    break;
	case TIOCMSET:
	    psPort->sp_nMCR = ((psPort->sp_nMCR & ~(UART_MCR_RTS |
#ifdef TIOCM_OUT1
						    UART_MCR_OUT1 |UART_MCR_OUT2 |
#endif
						    UART_MCR_DTR)) | ((arg & TIOCM_RTS) ? UART_MCR_RTS : 0)
#ifdef TIOCM_OUT1
			       | ((arg & TIOCM_OUT1) ? UART_MCR_OUT1 : 0)
			       | ((arg & TIOCM_OUT2) ? UART_MCR_OUT2 : 0)
#endif
			       | ((arg & TIOCM_DTR) ? UART_MCR_DTR : 0));
	    break;
	default:
	    return -EINVAL;
    }
    flags = spinlock_disable( &g_sSPinLock );
    ser_out( psPort, UART_MCR, psPort->sp_nMCR );
    spinunlock_enable( &g_sSPinLock, flags );
    return 0;
}
Ejemplo n.º 3
0
Archivo: serial.c Proyecto: PyroOS/Pyro
static int set_termios( SerPort_s* psPort, struct termios* psInfo )
{
    struct termios sTermios;
    int	 nError;

    nError = memcpy_from_user( &sTermios, psInfo, sizeof( sTermios ) );

    if ( nError < 0 ) {
	return( nError );
    }
  
    if ( (psPort->sp_sTermios.c_cflag & CBAUD) != (sTermios.c_cflag & CBAUD) ) {
	uint32 nFlg;
	switch( sTermios.c_cflag & CBAUD )
	{
	    case B0:		psPort->sp_nBaudRate = 0;
	    case B50:		psPort->sp_nBaudRate = 50;
	    case B75:		psPort->sp_nBaudRate = 75;
	    case B110:	psPort->sp_nBaudRate = 110;
	    case B134:	psPort->sp_nBaudRate = 134;
	    case B150:	psPort->sp_nBaudRate = 150;
	    case B200:	psPort->sp_nBaudRate = 200;
	    case B300:	psPort->sp_nBaudRate = 300;
	    case B600:	psPort->sp_nBaudRate = 600;
	    case B1200:	psPort->sp_nBaudRate = 1200;
	    case B1800:	psPort->sp_nBaudRate = 1800;
	    case B2400:	psPort->sp_nBaudRate = 2400;
	    case B4800:	psPort->sp_nBaudRate = 4800;
	    case B9600:	psPort->sp_nBaudRate = 9600;
	    case B19200:	psPort->sp_nBaudRate = 19200;
	    case B38400:	psPort->sp_nBaudRate = 38400;
	    case B57600:	psPort->sp_nBaudRate = 57600;
	    case B115200:	psPort->sp_nBaudRate = 115200;
//      case B230400:	psPort->sp_nBaudRate = 230400;
//      case B460800:	psPort->sp_nBaudRate = 460800;
	    default:
		printk( "serial: set_termios() invalid baudrate %08x\n", sTermios.c_cflag & CBAUD );
		return( -EINVAL );
	}
	nFlg = spinlock_disable( &g_sSPinLock );
	if ( psPort->sp_nBaudRate > 0 ) {
	    uint nDivisor = 115200 / psPort->sp_nBaudRate;
	    ser_out( psPort, UART_LCR, 0x83 ); // Set bit 7 to enable baud rate divisors
	    ser_out( psPort, UART_DLL, nDivisor & 0xff ); // Baud rate divisor LSB
	    ser_out( psPort, UART_DLM, nDivisor >> 8  ); // Baud rate divisor MSB
	    ser_out( psPort, UART_LCR, 0x03 ); // Clr bit 7 to disable baud rate divisors
	}
Ejemplo n.º 4
0
Archivo: serial.c Proyecto: PyroOS/Pyro
status_t ser_open( void* pNode, uint32 nFlags, void **pCookie )
{
    SerPort_s* psPort = pNode;
    uint	     nDivisor = 115200 / psPort->sp_nBaudRate;
    uint32     nFlg;

    if ( psPort->sp_bOpen == true ) {
	printk( "ser_open(): port is already open\n" );
	return( -EBUSY );
    }
    psPort->sp_bOpen = true;
    psPort->sp_nFlags         = nFlags;
    psPort->sp_hRecvMutex	    = create_semaphore( "ser_recv_mutex", 1, 0 );
    psPort->sp_hRecvWaitQueue = create_semaphore( "ser_recv_queue", 0, 0 );
    psPort->sp_nRecvInPos	    = 0;
    psPort->sp_nRecvOutPos    = 0;
    psPort->sp_nRecvSize	    = 0;
    psPort->sp_nMCR	    = 0x0f;
  
    nFlg = spinlock_disable( &g_sSPinLock );
  
    ser_out( psPort, UART_LCR, UART_LCR_DLAB | UART_LCR_WLEN7 | UART_LCR_STOP ); // Set UART_LCR_DLAB to enable baud rate divisors
  
    ser_out( psPort, UART_DLL, nDivisor & 0xff ); // Baud rate divisor LSB
    ser_out( psPort, UART_DLM, nDivisor >> 8  ); // Baud rate divisor MSB
 
    ser_out( psPort, UART_LCR, UART_LCR_WLEN7 | UART_LCR_STOP ); // Clr UART_LCR_DLAB to disable baud rate divisors


      // Enable FIFO, IRQ when 8 bytes received
    ser_out( psPort, UART_FCR, /*UART_FCR_ENABLE_FIFO | UART_FCR6_R_TRIGGER_24*/ 0 ); 
    ser_out( psPort, UART_IER, UART_IER_RDI ); // receive irq enabled

    ser_out( psPort, UART_MCR, psPort->sp_nMCR );
  


      // Clear interrupt registers
    ser_in( psPort, UART_LSR );  // Line status (LSR)
    ser_in( psPort, UART_RX );
    ser_in( psPort, UART_IIR );  // Check interrupt type (IIR)
    ser_in( psPort, UART_MSR );  // Check modem status (MSR)

    spinunlock_enable( &g_sSPinLock, nFlg );
  
    return( 0 );
}