Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00045 #include <cfg/uart.h>
00046 #include <arch/arm/atmel/debug_at91.h>
00047 
00048 #include <dev/debug.h>
00049 #include <sys/timer.h>
00050 
00051 
00056 
00064 uint32_t At91BaudRateDiv(uint32_t baud)
00065 {
00066     return (NutClockGet(NUT_HWCLK_PERIPHERAL) / (8 * baud) + 1) / 2;
00067 }
00068 
00076 int At91DevDebugIOCtl(NUTDEVICE * dev, int req, void *conf)
00077 {
00078     if(req == UART_SETSPEED) {
00079         outr(dev->dev_base + US_BRGR_OFF, At91BaudRateDiv(*((uint32_t *)conf)));
00080         return 0;
00081     }
00082     return -1;
00083 }
00084 
00091 static void DebugPut(CONST NUTDEVICE * dev, char ch)
00092 {
00093     if (ch == '\n') {
00094             while ((inr(dev->dev_base + US_CSR_OFF) & US_TXRDY) == 0);
00095         outr(dev->dev_base + US_THR_OFF, '\r');
00096     }
00097     while ((inr(dev->dev_base + US_CSR_OFF) & US_TXRDY) == 0);
00098     outr(dev->dev_base + US_THR_OFF, ch);
00099 }
00100 
00109 int At91DevDebugWrite(NUTFILE * fp, CONST void *buffer, int len)
00110 {
00111     int c = len;
00112     CONST char *cp = buffer;
00113 
00114     while (c--) {
00115         DebugPut(fp->nf_dev, *cp++);
00116     }
00117     return len;
00118 }
00119 
00120 #ifdef NUT_DEV_DEBUG_READ
00121 
00142 int At91DevDebugRead(NUTFILE * fp, void *buffer, int size)
00143 {
00144     int rc;
00145     unsigned int ch;
00146     char *bp = (char *) buffer;
00147 
00148     
00149     for (rc = 0; rc < size; rc++) {
00150         while ((inr(fp->nf_dev->dev_base + US_CSR_OFF) & US_RXRDY) == 0) {
00151             NutSleep(1);
00152             if ((rc || bp == NULL) && 
00153                 (inr(fp->nf_dev->dev_base + US_CSR_OFF) & US_RXRDY) == 0) {
00154                 return rc;
00155             }
00156         }
00157         ch = inr(fp->nf_dev->dev_base + US_RHR_OFF);
00158         if (bp) {
00159             if (ch == '\r') {
00160                 *bp++ = '\n';
00161             } else {
00162                 *bp++ = (char) ch;
00163             }
00164         }
00165     }
00166     return rc;
00167 }
00168 
00180 long At91DevDebugSize(NUTFILE *fp)
00181 {
00182     if (inr(fp->nf_dev->dev_base + US_CSR_OFF) & US_RXRDY) {
00183         return 1;
00184     }
00185     return 0;
00186 }
00187 
00188 #endif
00189 
00195 NUTFILE *At91DevDebugOpen(NUTDEVICE * dev, CONST char *name, int mode, int acc)
00196 {
00197     NUTFILE *fp = (NUTFILE *) (dev->dev_dcb);
00198 
00199     fp->nf_next = 0;
00200     fp->nf_dev = dev;
00201     fp->nf_fcb = 0;
00202 
00203     return fp;
00204 }
00205 
00211 int At91DevDebugClose(NUTFILE * fp)
00212 {
00213     return 0;
00214 }
00215