Changeset 6 for trunk/tools/bootloader_tsar/boot_tty_driver.c
- Timestamp:
- Apr 26, 2017, 2:14:33 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/bootloader_tsar/boot_tty_driver.c
r1 r6 1 /////////////////////////////////////////////////////////////////////////////////// 2 // File : boot_tty_driver.c 3 // Date : 18/01/2017 4 // Author : Alain Greiner / Vu Son 5 // Copyright (c) UPMC-LIP6 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 */ 7 23 8 24 #include <boot_config.h> … … 11 27 #include <boot_utils.h> 12 28 13 #ifndef SEG_T TY_BASE14 # error "The SEG_T TY_BASE value should be defined in the 'boot_config.h' file"29 #ifndef SEG_TXT_BASE 30 # error "The SEG_TXT_BASE value should be defined in the 'hard_config.h' file" 15 31 #endif 16 32 17 #ifndef IO_CXY 18 # error "The IO_CXY value should be defined in the 'boot_config.h' file" 33 #ifndef X_IO 34 # error "The X_IO value should be defined in the 'hard_config.h' file" 35 #endif 36 37 #ifndef Y_IO 38 # error "The Y_IO value should be defined in the 'hard_config.h' file" 39 #endif 40 41 #ifndef Y_WIDTH 42 # error "The Y_WIDTH value should be defined in the 'hard_config.h' file" 19 43 #endif 20 44 21 45 22 /**************************************************************************** 23 * Internal functions. * 24 ****************************************************************************/ 25 26 /**************************************************************************** 27 * This function returns the value of the a TTY register. * 28 * @ reg : TTY register to be read. * 29 * @ returns the value stored in 'reg'. * 30 ****************************************************************************/ 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 ///////////////////////////////////////////////////////////////////////////// 31 51 static uint32_t boot_tty_get_register( uint32_t reg ) 32 52 { 33 cxy_t cxy = IO_CXY;34 uint32_t * ptr = (uint32_t *)SEG_T TY_BASE + reg;53 cxy_t cxy = (X_IO << Y_WIDTH) + Y_IO; 54 uint32_t * ptr = (uint32_t *)SEG_TXT_BASE + reg; 35 55 36 56 return boot_remote_lw( XPTR( cxy , ptr ) ); … … 38 58 } // boot_tty_get_register() 39 59 40 / ****************************************************************************41 * This function sets a new value to a TTY register. * 42 * @ reg : TTY register to be configured. * 43 * @ val : new value to be written to 'reg'. * 44 ****************************************************************************/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 ///////////////////////////////////////////////////////////////////////////// 45 65 static void boot_tty_set_register( uint32_t reg, 46 66 uint32_t val ) 47 67 { 48 cxy_t cxy = IO_CXY;49 uint32_t * ptr = (uint32_t *)SEG_T TY_BASE + reg;68 cxy_t cxy = (X_IO << Y_WIDTH) + Y_IO; 69 uint32_t * ptr = (uint32_t *)SEG_TXT_BASE + reg; 50 70 51 71 boot_remote_sw( XPTR( cxy , ptr ) , val ); … … 53 73 } // boot_tty_set_register() 54 74 55 /**************************************************************************** 56 * Driver API functions. * 57 ****************************************************************************/ 58 75 ////////////////////////////////// 59 76 int boot_tty_write( char * buf, 60 77 uint32_t nbytes ) 61 78 { 62 uint32_t nb_printed; /* Iterator for printing loop. */63 uint32_t nb_test; /* Iterator for retry loop. */64 uint32_t error; /* Used to detect if an error occurs. */79 uint32_t nb_printed; 80 uint32_t nb_test; 81 uint32_t error; 65 82 66 / * Printing to the boot TTY terminal. */83 // Print nbytes to TTY0 terminal 67 84 for (nb_printed = 0; nb_printed < nbytes; nb_printed++) 68 85 { 69 // Poll ing the TTY driverstatus.70 if ((boot_tty_get_register(TTY_STATUS ) & TTY_WRITE_BUSY))86 // Poll the TTY0 status. 87 if ((boot_tty_get_register(TTY_STATUS_REG) & TTY_STATUS_TX_FULL)) 71 88 { 72 // TTY_WRITE_BUSY bit of TTY_STATUS register is set, keeps polling.73 89 error = 1; 74 90 for (nb_test = 0; nb_test < 10000; nb_test++) 75 if ((boot_tty_get_register(TTY_STATUS) & TTY_WRITE_BUSY) == 0) 91 { 92 if ((boot_tty_get_register(TTY_STATUS_REG) & TTY_STATUS_TX_FULL) == 0) 76 93 { 77 94 error = 0; 78 95 break; 79 96 } 97 } 80 98 81 // Reporting an error if the TTY_WRITE_BUSY bit is still set after 82 // 10000 retries. 83 if (error) 84 return -1; 99 // Report error after 10000 retries. 100 if (error) return -1; 85 101 } 86 102 87 // Writ ing a character to the boot TTYterminal.103 // Write one character to TTY0 terminal. 88 104 // Special treatment for a newline: Carriage Return before Line Feed. 89 if (buf[nb_printed] == '\n') 90 boot_tty_set_register(TTY_WRITE, (uint32_t)'\r'); 91 boot_tty_set_register(TTY_WRITE, (uint32_t)buf[nb_printed]); 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]); 92 107 } 93 108
Note: See TracChangeset
for help on using the changeset viewer.