Zimin Wang / Mbed 2 deprecated DDRO_Farrari

Dependencies:   mbed-rtos mbed

Fork of DDRO_Farrari by Liangzhen Lai

Committer:
josewang
Date:
Tue Feb 25 02:14:41 2014 +0000
Revision:
10:95e9932f7990
Read from ram buffer and print

Who changed what in which revision?

UserRevisionLine numberNew contents of line
josewang 10:95e9932f7990 1 /*
josewang 10:95e9932f7990 2 * Implementation of a family of print and scan functions
josewang 10:95e9932f7990 3 *
josewang 10:95e9932f7990 4 * Written by Zimin Wang
josewang 10:95e9932f7990 5 */
josewang 10:95e9932f7990 6 #include <stdarg.h>
josewang 10:95e9932f7990 7 #include <stdio.h>
josewang 10:95e9932f7990 8 #include "mbed.h"
josewang 10:95e9932f7990 9 #include "rtos.h"
josewang 10:95e9932f7990 10 #include "mmap.h"
josewang 10:95e9932f7990 11 #include "signal.h"
josewang 10:95e9932f7990 12 #include "pinout.h"
josewang 10:95e9932f7990 13 #include "basic_io.h"
josewang 10:95e9932f7990 14
josewang 10:95e9932f7990 15 #define TERMBUF_SIZE (256)
josewang 10:95e9932f7990 16
josewang 10:95e9932f7990 17 // mutex to serialize terminal read and write so that input/output won't be interleaved
josewang 10:95e9932f7990 18 static Mutex term_write_mutex;
josewang 10:95e9932f7990 19 static Mutex term_read_mutex;
josewang 10:95e9932f7990 20 // mutex to lock ram buffer
josewang 10:95e9932f7990 21 static Mutex rambuf_mutex;
josewang 10:95e9932f7990 22
josewang 10:95e9932f7990 23 // buffer for read from or write to terminal
josewang 10:95e9932f7990 24 static char term_txbuffer[TERMBUF_SIZE];
josewang 10:95e9932f7990 25 static char term_rxbuffer[TERMBUF_SIZE];
josewang 10:95e9932f7990 26
josewang 10:95e9932f7990 27 // Each time we can only read/write 4 bytes of data from/to ram buffer through JTAG
josewang 10:95e9932f7990 28 static union byte_chunk_union {
josewang 10:95e9932f7990 29 unsigned int word;
josewang 10:95e9932f7990 30 char bytes[4];
josewang 10:95e9932f7990 31 } byte_chunk;
josewang 10:95e9932f7990 32
josewang 10:95e9932f7990 33
josewang 10:95e9932f7990 34 // Actual function called when read from or write to terminal.
josewang 10:95e9932f7990 35 // Send buffer to stdout.
josewang 10:95e9932f7990 36 static void term_sendbuffer(const char *buffer, size_t size);
josewang 10:95e9932f7990 37 // Read stdin and write a maximum of size bytes data to buffer.
josewang 10:95e9932f7990 38 static void term_readbuffer(char *buffer, size_t size);
josewang 10:95e9932f7990 39
josewang 10:95e9932f7990 40
josewang 10:95e9932f7990 41 int mbed_printf(const char *format, ...) {
josewang 10:95e9932f7990 42 int size;
josewang 10:95e9932f7990 43 va_list args;
josewang 10:95e9932f7990 44
josewang 10:95e9932f7990 45 va_start(args, format);
josewang 10:95e9932f7990 46 size = mbed_vprintf(format, args);
josewang 10:95e9932f7990 47 va_end(args);
josewang 10:95e9932f7990 48
josewang 10:95e9932f7990 49 return size;
josewang 10:95e9932f7990 50 }
josewang 10:95e9932f7990 51
josewang 10:95e9932f7990 52 int mbed_vprintf(const char *format, va_list args) {
josewang 10:95e9932f7990 53 int size;
josewang 10:95e9932f7990 54
josewang 10:95e9932f7990 55 // tx_line is in critical section. We need a mutex to protect it.
josewang 10:95e9932f7990 56 term_write_mutex.lock();
josewang 10:95e9932f7990 57 size = vsnprintf(term_txbuffer, TERMBUF_SIZE, format, args);
josewang 10:95e9932f7990 58 term_sendbuffer(term_txbuffer, TERMBUF_SIZE);
josewang 10:95e9932f7990 59 term_write_mutex.unlock();
josewang 10:95e9932f7990 60
josewang 10:95e9932f7990 61 return size;
josewang 10:95e9932f7990 62 }
josewang 10:95e9932f7990 63
josewang 10:95e9932f7990 64 // prompt user to input data from terminal
josewang 10:95e9932f7990 65 int mbed_scanf(const char *format, ...) {
josewang 10:95e9932f7990 66 int size;
josewang 10:95e9932f7990 67 va_list args;
josewang 10:95e9932f7990 68
josewang 10:95e9932f7990 69 va_start(args, format);
josewang 10:95e9932f7990 70 size = mbed_vscanf(format, args);
josewang 10:95e9932f7990 71 va_end(args);
josewang 10:95e9932f7990 72
josewang 10:95e9932f7990 73 return size;
josewang 10:95e9932f7990 74 }
josewang 10:95e9932f7990 75
josewang 10:95e9932f7990 76 int mbed_vscanf(const char *format, va_list args) {
josewang 10:95e9932f7990 77 int size;
josewang 10:95e9932f7990 78
josewang 10:95e9932f7990 79 // rx_line is in critical section, we need a mutex to protect it.
josewang 10:95e9932f7990 80 term_read_mutex.lock();
josewang 10:95e9932f7990 81 term_readbuffer(term_rxbuffer, TERMBUF_SIZE);
josewang 10:95e9932f7990 82 size = vsscanf(term_rxbuffer, format, args);
josewang 10:95e9932f7990 83 term_read_mutex.unlock();
josewang 10:95e9932f7990 84 return size;
josewang 10:95e9932f7990 85 }
josewang 10:95e9932f7990 86
josewang 10:95e9932f7990 87 int term_printf(JTAG *pJtag) {
josewang 10:95e9932f7990 88 // acquire locks
josewang 10:95e9932f7990 89 rambuf_mutex.lock();
josewang 10:95e9932f7990 90 term_write_mutex.lock();
josewang 10:95e9932f7990 91 // read data from ram buffer
josewang 10:95e9932f7990 92 char *cp = term_txbuffer;
josewang 10:95e9932f7990 93 bool finished = false;
josewang 10:95e9932f7990 94 int len = 0;
josewang 10:95e9932f7990 95 for (unsigned int i = RAMBUF_BEGIN; i < RAMBUF_END; i += 4) {
josewang 10:95e9932f7990 96 byte_chunk.word = pJtag->readMemory(i);
josewang 10:95e9932f7990 97 for (int j = 0; j < 4; ++j) {
josewang 10:95e9932f7990 98 if (byte_chunk.bytes[j] != '\0') {
josewang 10:95e9932f7990 99 *cp++ = byte_chunk.bytes[j];
josewang 10:95e9932f7990 100 ++len;
josewang 10:95e9932f7990 101 }
josewang 10:95e9932f7990 102 else {
josewang 10:95e9932f7990 103 finished = true;
josewang 10:95e9932f7990 104 break;
josewang 10:95e9932f7990 105 }
josewang 10:95e9932f7990 106 }
josewang 10:95e9932f7990 107 if (finished)
josewang 10:95e9932f7990 108 break;
josewang 10:95e9932f7990 109 }
josewang 10:95e9932f7990 110 *cp = '\0';
josewang 10:95e9932f7990 111
josewang 10:95e9932f7990 112 term_sendbuffer(term_txbuffer, TERMBUF_SIZE);
josewang 10:95e9932f7990 113 // release locks
josewang 10:95e9932f7990 114 term_write_mutex.unlock();
josewang 10:95e9932f7990 115 rambuf_mutex.unlock();
josewang 10:95e9932f7990 116 return len;
josewang 10:95e9932f7990 117 }
josewang 10:95e9932f7990 118
josewang 10:95e9932f7990 119 int term_scanf(JTAG *pJtag) {
josewang 10:95e9932f7990 120 // acquire locks
josewang 10:95e9932f7990 121 rambuf_mutex.lock();
josewang 10:95e9932f7990 122 term_read_mutex.lock();
josewang 10:95e9932f7990 123 // read from terminal and write to ram buffer
josewang 10:95e9932f7990 124 term_readbuffer(term_rxbuffer, RAMBUF_SIZE);
josewang 10:95e9932f7990 125 char *cp = term_rxbuffer;
josewang 10:95e9932f7990 126 bool finished = false;
josewang 10:95e9932f7990 127 int len = 0;
josewang 10:95e9932f7990 128 for (int i = RAMBUF_BEGIN; i < RAMBUF_END; i+= 4) {
josewang 10:95e9932f7990 129 for (int j = 0; j < 4; ++j) {
josewang 10:95e9932f7990 130 if (*cp) {
josewang 10:95e9932f7990 131 byte_chunk.bytes[j] = *cp++;
josewang 10:95e9932f7990 132 ++len;
josewang 10:95e9932f7990 133 } else {
josewang 10:95e9932f7990 134 byte_chunk.bytes[j] = '\0';
josewang 10:95e9932f7990 135 finished = true;
josewang 10:95e9932f7990 136 }
josewang 10:95e9932f7990 137 }
josewang 10:95e9932f7990 138 pJtag->writeMemory(i, byte_chunk.word);
josewang 10:95e9932f7990 139 if (finished)
josewang 10:95e9932f7990 140 break;
josewang 10:95e9932f7990 141 }
josewang 10:95e9932f7990 142 // release locks
josewang 10:95e9932f7990 143 term_read_mutex.unlock();
josewang 10:95e9932f7990 144 rambuf_mutex.unlock();
josewang 10:95e9932f7990 145 return len;
josewang 10:95e9932f7990 146 }
josewang 10:95e9932f7990 147
josewang 10:95e9932f7990 148 void debug_print(JTAG *pJtag) {
josewang 10:95e9932f7990 149 // print the content of ram buffer
josewang 10:95e9932f7990 150 unsigned int value;
josewang 10:95e9932f7990 151 for (unsigned int i = RAMBUF_BEGIN; i < RAMBUF_END; i+=4) {
josewang 10:95e9932f7990 152 value = pJtag->readMemory(i);
josewang 10:95e9932f7990 153 mbed_printf("%08x\r\n", value);
josewang 10:95e9932f7990 154 }
josewang 10:95e9932f7990 155 value = pJtag->readMemory(IO_TYPE);
josewang 10:95e9932f7990 156 mbed_printf("%8x\r\n", value);
josewang 10:95e9932f7990 157 }
josewang 10:95e9932f7990 158
josewang 10:95e9932f7990 159 static void term_sendbuffer(const char *buffer, size_t size) {
josewang 10:95e9932f7990 160 int i;
josewang 10:95e9932f7990 161
josewang 10:95e9932f7990 162 i = 0;
josewang 10:95e9932f7990 163 while (i < size) {
josewang 10:95e9932f7990 164 if (buffer[i] != '\0' && pc.writeable()) {
josewang 10:95e9932f7990 165 pc.putc(buffer[i++]);
josewang 10:95e9932f7990 166 } else if (buffer[i] == '\0') {
josewang 10:95e9932f7990 167 break;
josewang 10:95e9932f7990 168 }
josewang 10:95e9932f7990 169 }
josewang 10:95e9932f7990 170 return;
josewang 10:95e9932f7990 171 }
josewang 10:95e9932f7990 172
josewang 10:95e9932f7990 173 static void term_readbuffer(char *buffer, size_t size) {
josewang 10:95e9932f7990 174 int i;
josewang 10:95e9932f7990 175 char temp;
josewang 10:95e9932f7990 176
josewang 10:95e9932f7990 177 i = 0;
josewang 10:95e9932f7990 178 while (i < size-1) { // save for null character
josewang 10:95e9932f7990 179 if (pc.readable()) {
josewang 10:95e9932f7990 180 temp = pc.getc();
josewang 10:95e9932f7990 181 if (temp == '\r')
josewang 10:95e9932f7990 182 break;
josewang 10:95e9932f7990 183 else
josewang 10:95e9932f7990 184 buffer[i++] = temp;
josewang 10:95e9932f7990 185 }
josewang 10:95e9932f7990 186 }
josewang 10:95e9932f7990 187 buffer[i] = '\0';
josewang 10:95e9932f7990 188 return;
josewang 10:95e9932f7990 189 }