#include <const.h>
#include <string.h>
#include <arch/i386.h>
#include <arch/interrupt.h>
#include <kernel/console.h>
#include <kernel/keyboard.h>
#include <kernel/task.h>
#include <kernel/serial.h>
Go to the source code of this file.
Functions | |||||
void | rs232_handler (word port) | ||||
RS232 common handler routine.
| |||||
void | rs232_handler_port1 () | ||||
The COM1 interrupt handler. | |||||
void | rs232_handler_port2 () | ||||
The COM2 interrupt handler. | |||||
void | close_rs232 (word port) | ||||
Close a specific RS232 port.
| |||||
void | init_rs232 (word port, byte divisor) | ||||
Initialize the RS232 interface with a bps rate.
| |||||
byte | rs232_getchar () | ||||
Get a character from the current serial port.
| |||||
void | rs232_putchar (byte c) | ||||
Write a character to the current serial port.
| |||||
void | rs232_task () | ||||
Get permanently characters from the serial port and print it to the screen.
| |||||
void | rs232_chat (char *argv) | ||||
Chat with a modem or a serial device.
| |||||
Variables | |||||
int | rs232_read_head = 0 | ||||
RS232 buffer for read operations :: head pointer. | |||||
int | rs232_read_tail = 0 | ||||
RS232 buffer for read operations :: tail pointer. | |||||
byte | rs232_read_buf [RS232_BUF_DIM] | ||||
RS232 buffer for read operations. | |||||
int | rs232_write_head = 0 | ||||
RS232 buffer for write operations :: head pointer. | |||||
int | rs232_write_tail = 0 | ||||
RS232 buffer for write operations :: tail pointer. | |||||
byte | rs232_write_buf [RS232_BUF_DIM] | ||||
RS232 buffer for write operations. | |||||
word | curr_port = COM1 | ||||
RS232 current port. |
Definition in file serial.c.
|
Close a specific RS232 port.
Definition at line 122 of file serial.c.
|
|
Initialize the RS232 interface with a bps rate.
Definition at line 138 of file serial.c.
00139 { 00140 // Install the IRQ handler routine // 00141 if ( (port == COM1) || (port == COM3) ) 00142 install_irq_handler( RS232_1_IRQ, (void *)rs232_handler_port1 ); 00143 else if ( (port == COM2) || (port == COM4) ) 00144 install_irq_handler( RS232_2_IRQ, (void *)rs232_handler_port2 ); 00145 else 00146 return; 00147 00148 // Turn off rs232 interrupt // 00149 outportb(port+1, 0); 00150 00151 // Set DLAB on // 00152 outportb(port+3, 0x80); 00153 00154 // Set baud rate - Divisor Latch Low Byte // 00155 outportb(port, divisor); 00156 // Set baud rate - Divisor Latch High Byte // 00157 outportb(port+1, 0x00); 00158 00159 // 8 bits, no parity, 1 stop-bit // 00160 outportb(port+3, 0x03); 00161 00162 // FIFO Control Register // 00163 outportb(port+2, 0xC7); 00164 00165 // Turn on DTR, RTS and OUT2 // 00166 outportb(port+4, 0x0B); 00167 00168 // Enable interrupts when data is received // 00169 outportb(port+1, 0x01); 00170 00171 // Clear receiver // 00172 (void)inportb(port); 00173 // Clear line status // 00174 (void)inportb(port+5); 00175 // Clear modem status // 00176 (void)inportb(port+6); 00177 } |
|
Get a character from the current serial port.
Definition at line 183 of file serial.c.
00184 { 00185 byte temp; 00186 dword IF = GET_IF(); 00187 00188 // If the buffer is empty enable interrupts and wait... // 00189 while( rs232_read_head==rs232_read_tail ) 00190 { 00191 enable(); 00192 idle(); 00193 } 00194 00195 disable(); 00196 00197 // Update the RS232 buffer in mutual exclusion & get the char // 00198 temp = rs232_read_buf[rs232_read_head]; 00199 rs232_read_head = (rs232_read_head+1)%RS232_BUF_DIM; 00200 00201 SET_IF(IF); 00202 00203 return(temp); 00204 } |
|
RS232 common handler routine.
Definition at line 47 of file serial.c.
00048 { 00049 byte flag, ch; 00050 00051 while(TRUE) 00052 { 00053 // Get a char from the serial port // 00054 flag = inportb(port+2); 00055 00056 if (flag & 0x01) break; 00057 00058 switch(flag & 0x06) 00059 { 00060 // Modem status - clear intr by reading modem status reg // 00061 case 0x00: 00062 (void)inportb(port+6); 00063 break; 00064 00065 // Write char - Send the char to the serial port // 00066 case 0x02: 00067 if (rs232_write_head != rs232_write_tail) 00068 { 00069 ch = rs232_write_buf[rs232_write_head]; 00070 rs232_write_head = (rs232_write_head+1)%RS232_BUF_DIM; 00071 outportb(port, ch); 00072 } 00073 // Inhibit TX interrupts if write buffer is empty (leave RX enabled) // 00074 if (rs232_write_head == rs232_write_tail) 00075 outportb(port+1, 0x01); 00076 break; 00077 00078 // Read char - Get the char from the serial port // 00079 case 0x04: 00080 while(TRUE) 00081 { 00082 // Check for data ready // 00083 flag = inportb(port+5); 00084 if (!(flag & 0x01)) break; 00085 00086 // Get the character // 00087 ch = inportb(port); 00088 00089 // Store it into the buffer if it is not full // 00090 if (((rs232_read_tail+1)%RS232_BUF_DIM) != rs232_read_head) 00091 { 00092 rs232_read_buf[rs232_read_tail] = ch; 00093 rs232_read_tail = (rs232_read_tail+1)%RS232_BUF_DIM; 00094 } 00095 } 00096 break; 00097 00098 // Line status - clear intr by reading line status reg // 00099 case 0x06: 00100 (void)inportb(port+5); 00101 break; 00102 } 00103 } 00104 } |
|
Write a character to the current serial port.
Definition at line 210 of file serial.c.
00211 { 00212 dword IF = GET_IF(); 00213 00214 // Check if the write buffer is full // 00215 if (((rs232_write_tail+1)%RS232_BUF_DIM) == rs232_write_head) return; 00216 00217 disable(); 00218 00219 // Write the char to the buffer in mutual exclusion // 00220 rs232_write_buf[rs232_write_tail] = c; 00221 rs232_write_tail = (rs232_write_tail+1)%RS232_BUF_DIM; 00222 00223 SET_IF(IF); 00224 00225 // Enable RX & TX interrupts // 00226 outportb(curr_port+1, 0x03); 00227 } |