source: trunk/tools/bootloader_tsar/boot_tty_driver.c @ 359

Last change on this file since 359 was 6, checked in by alain, 8 years ago

Modify the boot_info_t struct to describe external peripherals in all clusters.

File size: 3.5 KB
RevLine 
[6]1/*
2 * boot_tty_driver.c - TSAR bootloader TTY driver implementation.
3 *
4 * Authors :   Alain Greiner / Vu Son  (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-MKH; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 */
[1]23
24#include <boot_config.h>
25#include <boot_tty_driver.h>
26#include <hal_types.h>
27#include <boot_utils.h>
28
[6]29#ifndef SEG_TXT_BASE
30# error "The SEG_TXT_BASE value should be defined in the 'hard_config.h' file"
[1]31#endif
32
[6]33#ifndef X_IO 
34# error "The X_IO value should be defined in the 'hard_config.h' file"
[1]35#endif
36
[6]37#ifndef Y_IO 
38# error "The Y_IO value should be defined in the 'hard_config.h' file"
39#endif
[1]40
[6]41#ifndef Y_WIDTH
42# error "The Y_WIDTH value should be defined in the 'hard_config.h' file"
43#endif
[1]44
[6]45
46/////////////////////////////////////////////////////////////////////////////
47// This function returns the value contained in a TTY0 register.
48// @ reg    : register to be read.
49// @ returns the value stored in 'reg'.
50/////////////////////////////////////////////////////////////////////////////
[1]51static uint32_t boot_tty_get_register( uint32_t reg )
52{
[6]53    cxy_t      cxy = (X_IO << Y_WIDTH) + Y_IO;
54    uint32_t * ptr = (uint32_t *)SEG_TXT_BASE + reg;
[1]55   
56    return boot_remote_lw( XPTR( cxy , ptr ) ); 
57   
58} // boot_tty_get_register()
59
[6]60/////////////////////////////////////////////////////////////////////////////
61// This function sets a new value to a TTY0 register.
62// @ reg    : register to be configured.
63// @ val    : new value to be written to 'reg'.
64/////////////////////////////////////////////////////////////////////////////
[1]65static void boot_tty_set_register( uint32_t reg, 
66                                   uint32_t val )
67{
[6]68    cxy_t      cxy = (X_IO << Y_WIDTH) + Y_IO;
69    uint32_t * ptr = (uint32_t *)SEG_TXT_BASE + reg;
[1]70
71    boot_remote_sw( XPTR( cxy , ptr ) , val ); 
72
73} // boot_tty_set_register()
74
[6]75//////////////////////////////////
[1]76int boot_tty_write( char    * buf,
77                    uint32_t  nbytes )
78{
[6]79    uint32_t nb_printed;
80    uint32_t nb_test;
81    uint32_t error; 
[1]82
[6]83    // Print nbytes to TTY0 terminal
[1]84    for (nb_printed = 0; nb_printed < nbytes; nb_printed++)
85    {
[6]86        // Poll the TTY0 status.
87        if ((boot_tty_get_register(TTY_STATUS_REG) & TTY_STATUS_TX_FULL))
[1]88        {
89            error = 1;
90            for (nb_test = 0; nb_test < 10000; nb_test++)
[6]91            {
92                if ((boot_tty_get_register(TTY_STATUS_REG) & TTY_STATUS_TX_FULL) == 0)
[1]93                {
94                    error = 0;
95                    break;
96                }
[6]97            }
[1]98
[6]99            // Report error after 10000 retries.
100            if (error) return -1;
[1]101        }
102
[6]103        // Write one character to TTY0 terminal.
[1]104        // Special treatment for a newline: Carriage Return before Line Feed.
[6]105        if (buf[nb_printed] == '\n') boot_tty_set_register(TTY_WRITE_REG , (uint32_t)'\r');
106        boot_tty_set_register(TTY_WRITE_REG , (uint32_t)buf[nb_printed]);
[1]107    }
108
109    return 0;
110
111} // boot_tty_write()
Note: See TracBrowser for help on using the repository browser.