source: trunk/hal/x86_64/drivers/soclib_tty.h @ 194

Last change on this file since 194 was 75, checked in by max@…, 8 years ago

Create the drivers/ sub-directory in each hal, and move soclib
into it. Note that soclib is not valid for x86_64, but more
changes will come.

File size: 4.8 KB
Line 
1/*
2 * soclib_tty.c - soclib tty driver definition.
3 *
4 * Author  Alain Greiner (2016)
5 *
6 * Copyright (c)  UPMC Sorbonne Universites
7 *
8 * This file is part of ALMOS-MKH.
9 *
10 * ALMOS-MKH is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2.0 of the License.
13 *
14 * ALMOS-MKH is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with ALMOS-kernel; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#include <dev_txt.h>
25#include <chdev.h>
26#include <spinlock.h>
27
28
29/****************************************************************************************
30 * This driver supports the soclib_multi_tty component.
31 * It implements the generic TXT device API:
32 * - transfer one single character from TTY to command "buffer" if to_mem is non-zero.
33 * - transfer "count" characters from command "buffer" to TTY if "to_mem is zero.
34 ***************************************************************************************/
35
36/****************************************************************************************
37 *     SOCLIB_TTY registers offsets
38 ***************************************************************************************/
39
40#define TTY_WRITE_REG          0
41#define TTY_STATUS_REG         1
42#define TTY_READ_REG           2
43#define TTY_CONFIG_REG         3
44
45#define TTY_SPAN               4       // number of registers per channel
46
47/****************************************************************************************
48 * masks for TTY_STATUS_REG
49 ***************************************************************************************/
50
51#define TTY_STATUS_RX_FULL     1       // TTY_READ_REG full if 1
52#define TTY_STATUS_TX_FULL     2       // TTY_WRITE_REG full if 1
53
54/****************************************************************************************
55 * masks for TTY_CONFIG_REG
56 ***************************************************************************************/
57
58#define TTY_CONFIG_RX_ENABLE   1       // TTY_RX IRQ enabled if 1
59#define TTY_CONFIG_TX_ENABLE   2       // TTY_TX IRQ enabled if 1
60
61/****************************************************************************************
62 * This function masks both the TTY_RX and TTY_TX IRQs.
63 * These IRQs are unmasked by the soclib_tty_cmd() function.
64 ****************************************************************************************
65 * @ chdev     : pointer on the TXT chdev descriptor.
66 ***************************************************************************************/
67void soclib_tty_init( chdev_t * chdev );
68
69/****************************************************************************************
70 * This function handles the command registered in the thread descriptor identified
71 * by the <xp_thread> argument.
72 * - For the TXT_READ and TXT_WRITE commands, it only unmask the proper TTY_RX / TTY_TX
73 *   IRQ, and blocks the TXT device server thread on the THREAD_BLOCKED_DEV_ISR, as the
74 *   data transfer is done by the ISR.
75 * - For the TXT_SYNC_READ command, that should be only used by the kernel do display
76 *   log or debug messages, it directly access the SOCLIB_TTY registers, using
77 *   a busy waiting policy if required.
78 ****************************************************************************************
79 * @ thread_xp : extended pointer on client thread descriptor.
80 ***************************************************************************************/
81void soclib_tty_cmd( xptr_t thread_xp );
82
83/****************************************************************************************
84 * This ISR should be executed only for the TXT_READ and TXT_WRITE commands.
85 * It gets the command arguments from the first client thread in the TXT chdev queue:
86 * - if TXT_READ, it transfers one byte from the TTY_READ_REG to the command buffer.
87 *   It simply returns for retry if TTY_READ_REG is empty.
88 * - if TXT_WRITE, it tries to transfer several bytes from the command buffer to the
89 *   TTY_WRITE_REG. If the TTY_WRITE_REG is full, it updates the "count" and "buffer"
90 *   command arguments and returns for retry.
91 * When the I/O operation is completed, it sets the status field in the command, unblocks
92 * the server thread, and unblocks the client thread.
93 ****************************************************************************************
94 * @ chdev     : local pointer on TXT chdev descriptor.
95 ***************************************************************************************/
96void soclib_tty_isr( chdev_t * chdev );
97
Note: See TracBrowser for help on using the repository browser.