1\ *****************************************************************************
2\ * Copyright (c) 2016 IBM Corporation
3\ * All rights reserved.
4\ * This program and the accompanying materials
5\ * are made available under the terms of the BSD License
6\ * which accompanies this distribution, and is available at
7\ * http://www.opensource.org/licenses/bsd-license.php
8\ *
9\ * Contributors:
10\ *     IBM Corporation - initial implementation
11\ ****************************************************************************/
12
13s" serial" device-type
14
15FALSE VALUE initialized?
16
17virtio-setup-vd VALUE virtiodev
18
19\ Quiescence the virtqueue of this device so that no more background
20\ transactions can be pending.
21: shutdown  ( -- )
22    initialized? IF
23        my-phandle node>path open-dev ?dup IF
24            virtiodev virtio-serial-shutdown
25            close-dev
26        THEN
27        FALSE to initialized?
28    THEN
29;
30
31: virtio-serial-term-emit
32    virtiodev SWAP virtio-serial-putchar
33;
34
35: virtio-serial-term-key?  virtiodev virtio-serial-haschar ;
36: virtio-serial-term-key   BEGIN virtio-serial-term-key? UNTIL virtiodev virtio-serial-getchar ;
37
38\ Basic device initialization - which has only to be done once
39: init  ( -- )
40virtiodev virtio-serial-init drop
41    TRUE to initialized?
42    ['] virtio-serial-term-emit to emit
43    ['] virtio-serial-term-key  to key
44    ['] virtio-serial-term-key? to key?
45    ['] shutdown add-quiesce-xt
46;
47
480 VALUE open-count
49
50\ Standard node "open" function
51: open  ( -- okay? )
52    open-count 0= IF
53        open IF initialized? 0= IF init THEN
54            true
55        ELSE false exit
56        THEN
57    ELSE true THEN
58    open-count 1 + to open-count
59;
60
61: close
62    open-count 0> IF
63        open-count 1 - dup to open-count
64        0= IF close THEN
65    THEN
66    close
67;
68
69: write ( addr len -- actual )
70    tuck
71    0 ?DO
72        dup c@ virtiodev SWAP virtio-serial-putchar
73        1 +
74    LOOP
75    drop
76;
77
78: read ( addr len -- actual )
79    0= IF drop 0 EXIT THEN
80    virtiodev virtio-serial-haschar 0= IF 0 swap c! -2 EXIT THEN
81    virtiodev virtio-serial-getchar swap c! 1
82;
83
84: setup-alias
85    " vsterm" find-alias 0= IF
86        " vsterm" get-node node>path set-alias
87    ELSE drop THEN
88;
89setup-alias
90
91\ Override serial methods to make term-io.fs happy
92: serial-emit virtio-serial-term-emit ;
93: serial-key? virtio-serial-term-key? ;
94: serial-key  virtio-serial-term-key  ;
95