source: soft/giet_vm/giet_drivers/tty_driver.c @ 569

Last change on this file since 569 was 496, checked in by alain, 10 years ago

1) Introduce access functions to MMC intrumentation registers.
2) Use _printf for error or debug messages.

File size: 3.7 KB
RevLine 
[258]1///////////////////////////////////////////////////////////////////////////////////
2// File     : tty_driver.c
3// Date     : 23/05/2013
4// Author   : alain greiner
5// Copyright (c) UPMC-LIP6
6///////////////////////////////////////////////////////////////////////////////////
7
8#include <giet_config.h>
[437]9#include <hard_config.h>
[258]10#include <tty_driver.h>
[295]11#include <xcu_driver.h>
[258]12#include <ctx_handler.h>
13#include <utils.h>
[456]14#include <tty0.h>
[258]15
[320]16#if !defined(SEG_TTY_BASE)
17# error: You must define SEG_TTY_BASE in the hard_config.h file
18#endif
19
[456]20////////////////////////////////////////////////////////////////////////////////////
[496]21//               global variables
22////////////////////////////////////////////////////////////////////////////////////
23
24__attribute__((section(".kdata")))
25unsigned int   _tty_rx_buf[NB_TTY_CHANNELS];
26
27__attribute__((section(".kdata")))
28unsigned int   _tty_rx_full[NB_TTY_CHANNELS]; 
29
30////////////////////////////////////////////////////////////////////////////////////
[437]31//               access functions
[456]32////////////////////////////////////////////////////////////////////////////////////
[437]33
34/////////////////////////////////////////////////////
[295]35unsigned int _tty_get_register( unsigned int channel,
36                                unsigned int index )
37{
[320]38    unsigned int* vaddr = (unsigned int*)SEG_TTY_BASE + channel*TTY_SPAN + index;
[295]39    return _io_extended_read( vaddr );
40}
41
[437]42/////////////////////////////////////////////
[295]43void _tty_set_register( unsigned int channel,
44                        unsigned int index,
45                        unsigned int value )
46{
[320]47    unsigned int* vaddr = (unsigned int*)SEG_TTY_BASE + channel*TTY_SPAN + index;
[295]48    _io_extended_write( vaddr, value );
49}
50
[456]51//////////////////////////////////////
52void _tty_init( unsigned int channel )
53{
54    _tty_rx_full[channel] = 0;
55}
[258]56
[437]57////////////////////////////////////////
[295]58void _tty_rx_isr( unsigned int irq_type,   // HWI / WTI
59                  unsigned int irq_id,     // index returned by XCU
60                  unsigned int channel )   // TTY channel
[258]61{
[426]62    unsigned int gpid       = _get_procid();
63    unsigned int cluster_xy = gpid >> P_WIDTH;
[258]64
[297]65    // get TTY status
66    unsigned int status = _tty_get_register( channel, TTY_STATUS );
67
68    // check both TTY status and kernel buffer status:
69    // does nothing if kernel buffer full or tty_buffer empty
70    if ( ((status & 0x1) == 0) || 
71         (_tty_rx_full[channel] != 0) )  return;
72 
73    // reset WTI in XCU if WTI type
74    if ( irq_type == IRQ_TYPE_WTI ) 
[258]75    {
[295]76        unsigned int value;
77        _xcu_get_wti_value( cluster_xy, irq_id, &value );
[258]78    }
79
[297]80    // transfer character to kernel buffer and acknowledge TTY IRQ
81    _tty_rx_buf[channel]  = _tty_get_register( channel, TTY_READ ); 
82
83    // set kernel buffer status
84    asm volatile( "sync" );
85    _tty_rx_full[channel] = 1;
86
[295]87#if GIET_DEBUG_IRQS  // we don't take the TTY lock to avoid deadlock
88unsigned int x              = cluster_xy >> Y_WIDTH;
89unsigned int y              = cluster_xy & ((1<<Y_WIDTH)-1);
[426]90unsigned int lpid           = gpid & ((1<<P_WIDTH)-1);
[295]91_puts("\n[IRQS DEBUG] Processor[");
92_putd(x );
93_puts(",");
94_putd(y );
95_puts(",");
96_putd(lpid );
97_puts("] enters _tty_rx_isr() at cycle ");
98_putd(_get_proctime() );
99_puts("\n  read byte = ");
100_putx(_tty_rx_buf[channel] );
101_puts("\n");
102#endif
[258]103
104}
105
[437]106/////////////////////////////////////////
[295]107void _tty_tx_isr( unsigned int irq_type,   // HWI / WTI
108                  unsigned int irq_id,     // index returned by XCU
109                  unsigned int channel )   // TTY channel
[258]110{
[295]111    _puts("\n[GIET ERROR] the _tty_tx_isr() is not implemented\n");
112    _exit();
[258]113}
114
115// Local Variables:
116// tab-width: 4
117// c-basic-offset: 4
118// c-file-offsets:((innamespace . 0)(inline-open . 0))
119// indent-tabs-mode: nil
120// End:
121// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
122
Note: See TracBrowser for help on using the repository browser.