1 /* 2 * spinconsole.c 3 * 4 * Author: Maksym Sobolyev <sobomax@sippysoft.com> 5 * Copyright (c) 2009 Sippy Software, Inc. 6 * All rights reserved. 7 * 8 * Subject to the following obligations and disclaimer of warranty, use and 9 * redistribution of this software, in source or object code forms, with or 10 * without modifications are expressly permitted by Whistle Communications; 11 * provided, however, that: 12 * 1. Any and all reproductions of the source or object code must include the 13 * copyright notice above and the following disclaimer of warranties; and 14 * 2. No rights are granted, in any manner or form, to use Whistle 15 * Communications, Inc. trademarks, including the mark "WHISTLE 16 * COMMUNICATIONS" on advertising, endorsements, or otherwise except as 17 * such appears in the above copyright notice or in the software. 18 * 19 * THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND 20 * TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO 21 * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE, 22 * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF 23 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. 24 * WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY 25 * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS 26 * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE. 27 * IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES 28 * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING 29 * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 30 * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR 31 * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY 32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 34 * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY 35 * OF SUCH DAMAGE. 36 */ 37 38 #include <sys/cdefs.h> 39 40 #include <stand.h> 41 #include <bootstrap.h> 42 43 44 static void spinc_probe(struct console *cp); 45 static int spinc_init(struct console *cp, int arg); 46 static void spinc_putchar(struct console *cp, int c); 47 static int spinc_getchar(struct console *cp); 48 static int spinc_ischar(struct console *cp); 49 static void spinc_devinfo(struct console *cp); 50 51 struct console spinconsole = { 52 .c_name = "spin", 53 .c_desc = "spin port", 54 .c_flags = 0, 55 .c_probe = spinc_probe, 56 .c_init = spinc_init, 57 .c_out = spinc_putchar, 58 .c_in = spinc_getchar, 59 .c_ready = spinc_ischar, 60 .c_ioctl = NULL, 61 .c_devinfo = spinc_devinfo, 62 .c_private = NULL 63 }; 64 65 static void 66 spinc_devinfo(struct console *cp __unused) 67 { 68 printf("\tsoftware device"); 69 } 70 71 static void 72 spinc_probe(struct console *cp) 73 { 74 int i; 75 struct console *parent; 76 77 if (cp->c_private == NULL) { 78 for (i = 0; consoles[i] != NULL; i++) 79 if (strcmp(consoles[i]->c_name, "text") == 0) 80 break; 81 cp->c_private = consoles[i]; 82 } 83 84 parent = cp->c_private; 85 if (parent != NULL) 86 parent->c_probe(cp); 87 } 88 89 static int 90 spinc_init(struct console *cp, int arg) 91 { 92 struct console *parent; 93 94 parent = cp->c_private; 95 if (parent != NULL) 96 return (parent->c_init(cp, arg)); 97 else 98 return (0); 99 } 100 101 static void 102 spinc_putchar(struct console *cp, int c __unused) 103 { 104 static unsigned tw_chars = 0x5C2D2F7C; /* "\-/|" */ 105 static time_t lasttime = 0; 106 struct console *parent; 107 time_t now; 108 109 now = time(NULL); 110 if (now < (lasttime + 1)) 111 return; 112 lasttime = now; 113 parent = cp->c_private; 114 if (parent == NULL) 115 return; 116 117 parent->c_out(parent, (char)tw_chars); 118 parent->c_out(parent, '\b'); 119 tw_chars = (tw_chars >> 8) | ((tw_chars & (unsigned long)0xFF) << 24); 120 } 121 122 static int 123 spinc_getchar(struct console *cp __unused) 124 { 125 126 return (-1); 127 } 128 129 static int 130 spinc_ischar(struct console *cp __unused) 131 { 132 133 return (0); 134 } 135