Rev 2089 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2089 | Rev 3844 | ||
---|---|---|---|
Line 24... | Line 24... | ||
24 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | */ |
27 | */ |
28 | 28 | ||
29 | /** @addtogroup mips32 |
29 | /** @addtogroup mips32 |
30 | * @{ |
30 | * @{ |
31 | */ |
31 | */ |
32 | /** @file |
32 | /** @file |
33 | */ |
33 | */ |
34 | 34 | ||
Line 44... | Line 44... | ||
44 | static irq_t serial_irq; |
44 | static irq_t serial_irq; |
45 | static chardev_t console; |
45 | static chardev_t console; |
46 | static serial_t sconf[SERIAL_MAX]; |
46 | static serial_t sconf[SERIAL_MAX]; |
47 | static bool kb_enabled; |
47 | static bool kb_enabled; |
48 | 48 | ||
49 | static void serial_write(chardev_t *d, const char ch) |
49 | static void serial_write(chardev_t *d, const char ch, bool silent) |
50 | { |
50 | { |
- | 51 | if (!silent) { |
|
51 | serial_t *sd = (serial_t *)d->data; |
52 | serial_t *sd = (serial_t *)d->data; |
52 | 53 | ||
53 | if (ch == '\n') |
54 | if (ch == '\n') |
54 | serial_write(d, '\r'); |
55 | serial_write(d, '\r'); |
- | 56 | ||
55 | /* Wait until transmit buffer empty */ |
57 | /* Wait until transmit buffer empty */ |
56 | while (! (SERIAL_READ_LSR(sd->port) & (1<<TRANSMIT_EMPTY_BIT))) |
58 | while (!(SERIAL_READ_LSR(sd->port) & (1 << TRANSMIT_EMPTY_BIT))); |
57 | ; |
- | |
58 | SERIAL_WRITE(sd->port, ch); |
59 | SERIAL_WRITE(sd->port, ch); |
- | 60 | } |
|
59 | } |
61 | } |
60 | 62 | ||
61 | static void serial_enable(chardev_t *d) |
63 | static void serial_enable(chardev_t *d) |
62 | { |
64 | { |
63 | kb_enabled = true; |
65 | kb_enabled = true; |
Line 131... | Line 133... | ||
131 | }; |
133 | }; |
132 | 134 | ||
133 | void serial_console(devno_t devno) |
135 | void serial_console(devno_t devno) |
134 | { |
136 | { |
135 | serial_t *sd = &sconf[0]; |
137 | serial_t *sd = &sconf[0]; |
136 | - | ||
137 | 138 | ||
138 | chardev_initialize("serial_console", &console, &serial_ops); |
139 | chardev_initialize("serial_console", &console, &serial_ops); |
139 | console.data = sd; |
140 | console.data = sd; |
140 | kb_enabled = true; |
141 | kb_enabled = true; |
141 | 142 | ||
142 | irq_initialize(&serial_irq); |
143 | irq_initialize(&serial_irq); |
143 | serial_irq.devno = devno; |
144 | serial_irq.devno = devno; |
144 | serial_irq.inr = SERIAL_IRQ; |
145 | serial_irq.inr = SERIAL_IRQ; |
145 | serial_irq.claim = serial_claim; |
146 | serial_irq.claim = serial_claim; |
146 | serial_irq.handler = serial_irq_handler; |
147 | serial_irq.handler = serial_irq_handler; |
147 | irq_register(&serial_irq); |
148 | irq_register(&serial_irq); |
148 | 149 | ||
149 | /* I don't know why, but the serial interrupts simply |
150 | /* I don't know why, but the serial interrupts simply |
150 | * don't work on simics |
151 | don't work on simics */ |
151 | */ |
- | |
152 | virtual_timer_fnc = &serial_handler; |
152 | virtual_timer_fnc = &serial_handler; |
153 | 153 | ||
154 | stdin = &console; |
154 | stdin = &console; |
155 | stdout = &console; |
155 | stdout = &console; |
156 | } |
156 | } |