Files
VK035_Template/platform/retarget/retarget.c

180 lines
4.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*==============================================================================
* Перенаправление printf(). Переопределение системных функций.
*------------------------------------------------------------------------------
* НИИЭТ, Богдан Колбов <kolbov@niiet.ru>
*==============================================================================
* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
* ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ
* ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ
* НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
* ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА
* ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ
* ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
* ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ
* ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
* ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
*
* 2018 АО "НИИЭТ"
*==============================================================================
*/
//-- Includes ------------------------------------------------------------------
#include "retarget_conf.h"
//-- Functions -----------------------------------------------------------------
#ifdef RETARGET
#if defined(__GNUC__)
int _write(int fd, char* ptr, int len)
{
(void)fd;
int i = 0;
while (ptr[i] && (i < len)) {
retarget_put_char((int)ptr[i]);
if (ptr[i] == '\n') {
retarget_put_char((int)'\r');
}
i++;
}
return len;
}
void _ttywrch(int ch)
{
retarget_put_char(ch);
}
int _read(int file, char* ptr, int len)
{
(void)file;
int i = 0;
for (/* Empty */; len > 0; --len) {
char c = (char)retarget_get_char();
*ptr++ = c;
++i;
if (c == '\n')
break;
}
return i;
}
#elif defined(__ICCARM__)
#include <yfuns.h>
size_t __write(int handle, const unsigned char* buffer, size_t size)
{
size_t nChars = 0;
if (buffer == 0) {
return 0;
}
if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR) {
return _LLIO_ERROR;
}
for (; size != 0; --size) {
if (retarget_put_char(*buffer++) < 0) {
return _LLIO_ERROR;
}
++nChars;
}
return nChars;
}
size_t __read(int handle, unsigned char* buffer, size_t size)
{
int nChars = 0;
if (handle != _LLIO_STDIN) {
return _LLIO_ERROR;
}
for (; size > 0; --size) {
int c = retarget_get_char();
if (c < 0)
break;
*buffer++ = c;
++nChars;
}
return nChars;
}
#elif defined(__CC_ARM)
#include <rt_misc.h>
#include <stdio.h>
#pragma import(__use_no_semihosting_swi)
#ifdef __DBG_ITM
volatile int ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* CMSIS Debug Input */
#endif
struct __FILE {
int handle; /* Add whatever you need here */
};
FILE __stdout;
FILE __stdin;
int fputc(int c, FILE* f)
{
#ifdef __DBG_ITM
ITM_SendChar(c);
return 0;
#else
return (retarget_put_char(c));
#endif
}
int fgetc(FILE* f)
{
return (retarget_get_char());
}
int ferror(FILE* f)
{
/* Your implementation of ferror */
return EOF;
}
void _ttywrch(int c)
{
#ifdef __DBG_ITM
ITM_SendChar(c);
#else
retarget_put_char(c);
#endif
}
void _sys_exit(int return_code)
{
label:
goto label; /* endless loop */
}
#elif defined(__CMCPPARM__)
/* Serial port UART as STDIN/STDOUT */
FILE hRetarget = {
_STREAM_RW,
0,
retarget_get_char,
retarget_put_char,
NULL,
NULL
};
#endif
#endif //RETARGET