📄 serial.c
字号:
#include <pxa250regs.S>#include <stdarg.h>#include "serial.h"void serial_send_byte(int byte){ volatile int * const lsr= (volatile int *)(FFUART_BASE+UART_LSR); volatile int * const thr= (volatile int *)(FFUART_BASE+UART_THR); while (((*lsr) & SIO_LSR_THRE) == 0) ; *thr = byte;}int printf(const char *format, ...){ va_list ap; char c; va_start(ap, format); while (1) { c=*format; switch (c) { // end of string case 0: { goto stopPrintf; } break; // special char case '%': { c=*(++format); switch (c) { // end of string case 0: { goto stopPrintf; } break; // display % case '%': { serial_send_byte('%'); } break; // char case 'c': { char typeC=va_arg(ap, int); serial_send_byte(typeC); } break; // string case 's': { char *typeCP=va_arg(ap, char *); if (typeCP) { while (*typeCP) { serial_send_byte(*typeCP); typeCP++; } } else { serial_send_byte('n'); serial_send_byte('u'); serial_send_byte('l'); serial_send_byte('l'); } } break; // hexadecimal unsigned int case 'x': case 'X': { int i, v; unsigned int typeUI=va_arg(ap, unsigned int); char baseChar; if (c=='x') baseChar='a'; else baseChar='A'; for (i=28; i>=0; i-=4) { v=(typeUI>>i)&0xF; serial_send_byte(v < 10 ? ('0'+v) : (baseChar+(v-10))); } } break; // binary case 'b': { int i, v; unsigned int typeB=va_arg(ap, unsigned int); for (i=31; i>=0; i--) { v=(typeB>>i)&0x1; serial_send_byte(v == 1 ? '1' : '0'); } } break; // decimal unsigned int case 'u': { unsigned int typeUI=va_arg(ap, unsigned int); unsigned int div; int hasPut=0; for (div=1000000000; div>0; div/=10) { unsigned int aff=typeUI/div; typeUI%=div; if ((aff!=0) || (hasPut)) { hasPut=1; serial_send_byte('0'+aff); } } if (!hasPut) serial_send_byte('0'); } break; // decimal signed int case 'd': { int typeI=va_arg(ap, int); unsigned int vAbs; unsigned int div; int hasPut=0; if (typeI<0) { vAbs=(unsigned)(-typeI); serial_send_byte('-'); } else { vAbs=(unsigned)typeI; } for (div=1000000000; div>0; div/=10) { unsigned int aff=vAbs/div; vAbs%=div; if ((aff!=0) || (hasPut)) { hasPut=1; serial_send_byte('0'+aff); } } if (!hasPut) serial_send_byte('0'); } break; // display char if not handled default: { serial_send_byte(c); } break; } } break; // other default: { serial_send_byte(c); } break; } format++; }// clean stack and returnstopPrintf: va_end(ap); // TODO : return number of printed character return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -