PolledSerial.s 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. ;;; PolledSerial - simple serial I/O
  2. ;;;
  3. ;;; Copyright (c) 2009 Openmoko Inc.
  4. ;;;
  5. ;;; Authors Christopher Hall <hsw@openmoko.com>
  6. ;;;
  7. ;;; Redistribution and use in source and binary forms, with or without
  8. ;;; modification, are permitted provided that the following conditions are
  9. ;;; met:
  10. ;;;
  11. ;;; 1. Redistributions of source code must retain the above copyright
  12. ;;; notice, this list of conditions and the following disclaimer.
  13. ;;;
  14. ;;; 2. Redistributions in binary form must reproduce the above copyright
  15. ;;; notice, this list of conditions and the following disclaimer in
  16. ;;; the documentation and/or other materials provided with the
  17. ;;; distribution.
  18. ;;;
  19. ;;; THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY
  20. ;;; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. ;;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  22. ;;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE
  23. ;;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  24. ;;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  25. ;;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  26. ;;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  27. ;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  28. ;;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  29. ;;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. .include "regs.inc"
  31. ;;; register usage
  32. ;;; r0 .. r3 must be preserved
  33. ;;; r4 result low
  34. ;;; r5 result high
  35. ;;; r6 .. r9 arguments 1..4
  36. ;;; r10 ..r14 reserved
  37. ;;; r15 __dp value
  38. .section .text
  39. ;;; wait for serial output ready
  40. ;;; input:
  41. ;;; output:
  42. ;;; r4 = true if space in buffer, false if buffer is full
  43. .global PolledSerial_PutReady
  44. PolledSerial_PutReady:
  45. xld.w %r4, R8_EFSIF0_STATUS
  46. ld.ub %r5, [%r4]
  47. and %r5, TDBEx
  48. jreq PolledSerial_PutReady_done
  49. ld.w %r4, 1
  50. PolledSerial_PutReady_done:
  51. ret
  52. ;;; print a character
  53. ;;; input:
  54. ;;; r6 = char
  55. ;;; output:
  56. .global PolledSerial_PutChar
  57. PolledSerial_PutChar:
  58. xld.w %r4, R8_EFSIF0_STATUS
  59. PolledSerial_PutChar_wait:
  60. ld.ub %r5, [%r4]
  61. and %r5, TDBEx
  62. jreq PolledSerial_PutChar_wait
  63. xld.w %r5, R8_EFSIF0_TXD
  64. ld.b [%r5], %r6
  65. ret
  66. ;;; read a character
  67. ;;; input:
  68. ;;; output:
  69. ;;; r4 = char
  70. .global PolledSerial_GetChar
  71. PolledSerial_GetChar:
  72. call PolledSerial_InputAvailable
  73. or %r4, %r4
  74. jreq PolledSerial_GetChar
  75. xld.w %r4, R8_EFSIF0_RXD
  76. ld.ub %r4, [%r4]
  77. ret
  78. ;;; see if input is available
  79. ;;; input:
  80. ;;; output:
  81. ;;; r4 = 0 => not ready
  82. ;;; 1 => ready
  83. .global PolledSerial_InputAvailable
  84. PolledSerial_InputAvailable:
  85. xld.w %r4, R8_EFSIF0_STATUS
  86. ld.ub %r4, [%r4]
  87. and %r4, RDBFx
  88. jreq PolledSerial_InputAvailable_done
  89. ld.w %r4, 1
  90. PolledSerial_InputAvailable_done:
  91. ret