The Pedigree Project  0.1
malta/Serial.cc
1 /*
2  * Copyright (c) 2008-2014, Pedigree Developers
3  *
4  * Please see the CONTRIB file in the root of the source tree for a full
5  * list of contributors.
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #include "pedigree/kernel/Log.h"
21 #include "pedigree/kernel/machine/Machine.h"
22 #include "pedigree/kernel/machine/types.h"
23 #include "pedigree/kernel/utilities/StaticString.h"
24 #include <machine/malta/Serial.h>
25 MaltaSerial::MaltaSerial() : m_pBuffer(0), m_pRegs(0)
26 {
27 }
28 
30 {
31 }
32 
33 void MaltaSerial::setBase(uintptr_t nBaseAddr)
34 {
35  // We use KSEG1 (uncached physical) for our IO accesses.
36  m_pRegs = reinterpret_cast<serial *>(KSEG1(nBaseAddr));
37 }
38 
39 void MaltaSerial::write(char c)
40 {
41  while (!(m_pRegs->lstat & 0x20))
42  ;
43  m_pRegs->rxtx = static_cast<uint8_t>(c);
44 }
45 
47 {
48  if (!isConnected())
49  return 0;
50  while (!(m_pRegs->lstat & 0x1))
51  ;
52  return static_cast<char>(m_pRegs->rxtx);
53 }
54 
55 char MaltaSerial::readNonBlock()
56 {
57  if (!isConnected())
58  return 0;
59  if (m_pRegs->lstat & 0x1)
60  return m_pRegs->rxtx;
61  else
62  return '\0';
63 }
64 
65 bool MaltaSerial::isConnected()
66 {
67  return true;
68  uint8_t nStatus = m_pRegs->mstat;
69  // Bits 0x30 = Clear to send & Data set ready.
70  // Mstat seems to be 0xFF when the device isn't present.
71  if ((nStatus & 0x30) && nStatus != 0xFF)
72  return true;
73  else
74  return false;
75 }
virtual void setBase(uintptr_t nBaseAddr)
Definition: malta/Serial.cc:33
virtual void write(char c)
Definition: malta/Serial.cc:39
volatile serial * m_pRegs
virtual char read()
Definition: malta/Serial.cc:46