1 /********************************************************************* 2 * SEGGER Microcontroller GmbH * 3 * The Embedded Experts * 4 ********************************************************************** 5 * * 6 * (c) 1995 - 2019 SEGGER Microcontroller GmbH * 7 * * 8 * www.segger.com Support: [email protected] * 9 * * 10 ********************************************************************** 11 * * 12 * SEGGER RTT * Real Time Transfer for embedded targets * 13 * * 14 ********************************************************************** 15 * * 16 * All rights reserved. * 17 * * 18 * SEGGER strongly recommends to not make any changes * 19 * to or modify the source code of this software in order to stay * 20 * compatible with the RTT protocol and J-Link. * 21 * * 22 * Redistribution and use in source and binary forms, with or * 23 * without modification, are permitted provided that the following * 24 * condition is met: * 25 * * 26 * o Redistributions of source code must retain the above copyright * 27 * notice, this condition and the following disclaimer. * 28 * * 29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * 30 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * 31 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * 32 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * 33 * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * 34 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * 35 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * 36 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * 37 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * 38 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * 39 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * 40 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * 41 * DAMAGE. * 42 * * 43 ********************************************************************** 44 ---------------------------END-OF-HEADER------------------------------ 45 File : RTT_Syscalls_KEIL.c 46 Purpose : Retargeting module for KEIL MDK-CM3. 47 Low-level functions for using printf() via RTT 48 Revision: $Rev: 24316 $ 49 Notes : (1) https://wiki.segger.com/Keil_MDK-ARM#RTT_in_uVision 50 ---------------------------------------------------------------------- 51 */ 52 #if (defined __CC_ARM) || (defined __ARMCC_VERSION) 53 54 #include <stdio.h> 55 #include <stdlib.h> 56 #include <string.h> 57 #include <rt_sys.h> 58 #include <rt_misc.h> 59 60 #include "SEGGER_RTT.h" 61 /********************************************************************* 62 * 63 * #pragmas 64 * 65 ********************************************************************** 66 */ 67 #if __ARMCC_VERSION < 6000000 68 #pragma import(__use_no_semihosting) 69 #endif 70 71 #ifdef _MICROLIB 72 #pragma import(__use_full_stdio) 73 #endif 74 75 /********************************************************************* 76 * 77 * Defines non-configurable 78 * 79 ********************************************************************** 80 */ 81 82 /* Standard IO device handles - arbitrary, but any real file system handles must be 83 less than 0x8000. */ 84 #define STDIN 0x8001 // Standard Input Stream 85 #define STDOUT 0x8002 // Standard Output Stream 86 #define STDERR 0x8003 // Standard Error Stream 87 88 /********************************************************************* 89 * 90 * Public const 91 * 92 ********************************************************************** 93 */ 94 #if __ARMCC_VERSION < 5000000 95 //const char __stdin_name[] = "STDIN"; 96 const char __stdout_name[] = "STDOUT"; 97 const char __stderr_name[] = "STDERR"; 98 #endif 99 100 /********************************************************************* 101 * 102 * Public code 103 * 104 ********************************************************************** 105 */ 106 107 /********************************************************************* 108 * 109 * _ttywrch 110 * 111 * Function description: 112 * Outputs a character to the console 113 * 114 * Parameters: 115 * c - character to output 116 * 117 */ 118 void _ttywrch(int c) { 119 fputc(c, stdout); // stdout 120 fflush(stdout); 121 } 122 123 /********************************************************************* 124 * 125 * _sys_open 126 * 127 * Function description: 128 * Opens the device/file in order to do read/write operations 129 * 130 * Parameters: 131 * sName - sName of the device/file to open 132 * OpenMode - This parameter is currently ignored 133 * 134 * Return value: 135 * != 0 - Handle to the object to open, otherwise 136 * == 0 -"device" is not handled by this module 137 * 138 */ 139 FILEHANDLE _sys_open(const char * sName, int OpenMode) { 140 (void)OpenMode; 141 // Register standard Input Output devices. 142 if (strcmp(sName, __stdout_name) == 0) { 143 return (STDOUT); 144 } else if (strcmp(sName, __stderr_name) == 0) { 145 return (STDERR); 146 } else 147 return (0); // Not implemented 148 } 149 150 /********************************************************************* 151 * 152 * _sys_close 153 * 154 * Function description: 155 * Closes the handle to the open device/file 156 * 157 * Parameters: 158 * hFile - Handle to a file opened via _sys_open 159 * 160 * Return value: 161 * 0 - device/file closed 162 * 163 */ 164 int _sys_close(FILEHANDLE hFile) { 165 (void)hFile; 166 return 0; // Not implemented 167 } 168 169 /********************************************************************* 170 * 171 * _sys_write 172 * 173 * Function description: 174 * Writes the data to an open handle. 175 * Currently this function only outputs data to the console 176 * 177 * Parameters: 178 * hFile - Handle to a file opened via _sys_open 179 * pBuffer - Pointer to the data that shall be written 180 * NumBytes - Number of bytes to write 181 * Mode - The Mode that shall be used 182 * 183 * Return value: 184 * Number of bytes *not* written to the file/device 185 * 186 */ 187 int _sys_write(FILEHANDLE hFile, const unsigned char * pBuffer, unsigned NumBytes, int Mode) { 188 int r = 0; 189 190 (void)Mode; 191 if (hFile == STDOUT) { 192 SEGGER_RTT_Write(0, (const char*)pBuffer, NumBytes); 193 return 0; 194 } 195 return r; 196 } 197 198 /********************************************************************* 199 * 200 * _sys_read 201 * 202 * Function description: 203 * Reads data from an open handle. 204 * Currently this modules does nothing. 205 * 206 * Parameters: 207 * hFile - Handle to a file opened via _sys_open 208 * pBuffer - Pointer to buffer to store the read data 209 * NumBytes - Number of bytes to read 210 * Mode - The Mode that shall be used 211 * 212 * Return value: 213 * Number of bytes read from the file/device 214 * 215 */ 216 int _sys_read(FILEHANDLE hFile, unsigned char * pBuffer, unsigned NumBytes, int Mode) { 217 (void)hFile; 218 (void)pBuffer; 219 (void)NumBytes; 220 (void)Mode; 221 return (0); // Not implemented 222 } 223 224 /********************************************************************* 225 * 226 * _sys_istty 227 * 228 * Function description: 229 * This function shall return whether the opened file 230 * is a console device or not. 231 * 232 * Parameters: 233 * hFile - Handle to a file opened via _sys_open 234 * 235 * Return value: 236 * 1 - Device is a console 237 * 0 - Device is not a console 238 * 239 */ 240 int _sys_istty(FILEHANDLE hFile) { 241 if (hFile > 0x8000) { 242 return (1); 243 } 244 return (0); // Not implemented 245 } 246 247 /********************************************************************* 248 * 249 * _sys_seek 250 * 251 * Function description: 252 * Seeks via the file to a specific position 253 * 254 * Parameters: 255 * hFile - Handle to a file opened via _sys_open 256 * Pos - 257 * 258 * Return value: 259 * int - 260 * 261 */ 262 int _sys_seek(FILEHANDLE hFile, long Pos) { 263 (void)hFile; 264 (void)Pos; 265 return (0); // Not implemented 266 } 267 268 /********************************************************************* 269 * 270 * _sys_ensure 271 * 272 * Function description: 273 * 274 * 275 * Parameters: 276 * hFile - Handle to a file opened via _sys_open 277 * 278 * Return value: 279 * int - 280 * 281 */ 282 int _sys_ensure(FILEHANDLE hFile) { 283 (void)hFile; 284 return (-1); // Not implemented 285 } 286 287 /********************************************************************* 288 * 289 * _sys_flen 290 * 291 * Function description: 292 * Returns the length of the opened file handle 293 * 294 * Parameters: 295 * hFile - Handle to a file opened via _sys_open 296 * 297 * Return value: 298 * Length of the file 299 * 300 */ 301 long _sys_flen(FILEHANDLE hFile) { 302 (void)hFile; 303 return (0); // Not implemented 304 } 305 306 /********************************************************************* 307 * 308 * _sys_tmpnam 309 * 310 * Function description: 311 * This function converts the file number fileno for a temporary 312 * file to a unique filename, for example, tmp0001. 313 * 314 * Parameters: 315 * pBuffer - Pointer to a buffer to store the name 316 * FileNum - file number to convert 317 * MaxLen - Size of the buffer 318 * 319 * Return value: 320 * 1 - Error 321 * 0 - Success 322 * 323 */ 324 int _sys_tmpnam(char * pBuffer, int FileNum, unsigned MaxLen) { 325 (void)pBuffer; 326 (void)FileNum; 327 (void)MaxLen; 328 return (1); // Not implemented 329 } 330 331 /********************************************************************* 332 * 333 * _sys_command_string 334 * 335 * Function description: 336 * This function shall execute a system command. 337 * 338 * Parameters: 339 * cmd - Pointer to the command string 340 * len - Length of the string 341 * 342 * Return value: 343 * == NULL - Command was not successfully executed 344 * == sCmd - Command was passed successfully 345 * 346 */ 347 char * _sys_command_string(char * cmd, int len) { 348 (void)len; 349 return cmd; // Not implemented 350 } 351 352 /********************************************************************* 353 * 354 * _sys_exit 355 * 356 * Function description: 357 * This function is called when the application returns from main 358 * 359 * Parameters: 360 * ReturnCode - Return code from the main function 361 * 362 * 363 */ 364 void _sys_exit(int ReturnCode) { 365 (void)ReturnCode; 366 while (1); // Not implemented 367 } 368 369 #if __ARMCC_VERSION >= 5000000 370 /********************************************************************* 371 * 372 * stdout_putchar 373 * 374 * Function description: 375 * Put a character to the stdout 376 * 377 * Parameters: 378 * ch - Character to output 379 * 380 * 381 */ 382 int stdout_putchar(int ch) { 383 (void)ch; 384 return ch; // Not implemented 385 } 386 #endif 387 388 #endif 389 /*************************** End of file ****************************/ 390