2
* Copyright (c) 2009 Jakub Jermar
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
9
* - Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* - Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
14
* - The name of the author may not be used to endorse or promote products
15
* derived from this software without specific prior written permission.
17
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
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
26
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
/** @addtogroup genarch
34
* @brief Serial line processing.
37
#include <genarch/srln/srln.h>
38
#include <console/chardev.h>
39
#include <console/console.h>
40
#include <proc/thread.h>
44
static indev_operations_t srln_raw_ops = {
48
static void ksrln(void *arg)
50
srln_instance_t *instance = (srln_instance_t *) arg;
55
wchar_t ch = indev_pop_character(&instance->raw);
57
/* ANSI escape sequence processing */
62
if ((escape == 0x1b4f) || (escape == 0x1b5b) || (escape == 0x1b5b33))
106
/* Replace carriage return with line feed
107
and suppress any following line feed */
108
if ((ch == '\n') && (cr)) {
123
indev_push_character(instance->sink, ch);
127
srln_instance_t *srln_init(void)
129
srln_instance_t *instance
130
= malloc(sizeof(srln_instance_t), FRAME_ATOMIC);
133
= thread_create(ksrln, (void *) instance, TASK, 0, "ksrln", false);
135
if (!instance->thread) {
140
instance->sink = NULL;
141
indev_initialize("srln", &instance->raw, &srln_raw_ops);
147
indev_t *srln_wire(srln_instance_t *instance, indev_t *sink)
152
instance->sink = sink;
153
thread_ready(instance->thread);
155
return &instance->raw;