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; } } }
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; }
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 }
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 ); }