summaryrefslogtreecommitdiff
path: root/firmware/target/arm/tms320dm320/uart-dm320.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/tms320dm320/uart-dm320.c')
-rw-r--r--firmware/target/arm/tms320dm320/uart-dm320.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/firmware/target/arm/tms320dm320/uart-dm320.c b/firmware/target/arm/tms320dm320/uart-dm320.c
index 5671e47a9f..151ad2921c 100644
--- a/firmware/target/arm/tms320dm320/uart-dm320.c
+++ b/firmware/target/arm/tms320dm320/uart-dm320.c
@@ -62,39 +62,53 @@ void uart1_putc(char ch)
62 IO_UART1_DTRR=ch; 62 IO_UART1_DTRR=ch;
63} 63}
64 64
65void uart1_puts(const char *str) 65void uart1_puts(const char *str, int size)
66{ 66{
67 char ch; 67 int count=0;
68 while ((ch = *str++) != '\0') { 68 while (count<size)
69 uart1_putc(ch); 69 {
70 uart1_putc(str[count]);
71 count++;
70 } 72 }
71} 73}
72 74
73/* This function returns the number of bytes left in the queue after a read is done (negative if fail)*/ 75/* This function returns the number of bytes left in the queue after a read is done (negative if fail)*/
74int uart1_gets_queue(char *str, unsigned int size) 76int uart1_gets_queue(char *str, unsigned int size)
75{ 77{
78 IO_INTC_EINT0 &= ~(1<<IRQ_UART1);
79 int retval;
80
76 if(uart1_recieve_count<size) 81 if(uart1_recieve_count<size)
77 return -uart1_recieve_count;
78
79 if(uart1_recieve_read+size<RECIEVE_RING_SIZE)
80 { 82 {
81 memcpy(str,uart1_recieve_buffer_ring+uart1_recieve_read,size); 83 retval= -1;
82 } 84 }
83 else 85 else
84 { 86 {
85 int tempcount=(RECIEVE_RING_SIZE-uart1_recieve_read); 87 if(uart1_recieve_read+size<RECIEVE_RING_SIZE)
86 memcpy(str,uart1_recieve_buffer_ring+uart1_recieve_read,tempcount); 88 {
87 memcpy(str+tempcount,uart1_recieve_buffer_ring,size-tempcount); 89 memcpy(str,uart1_recieve_buffer_ring+uart1_recieve_read,size);
90 }
91 else
92 {
93 int tempcount=(RECIEVE_RING_SIZE-uart1_recieve_read);
94 memcpy(str,uart1_recieve_buffer_ring+uart1_recieve_read,tempcount);
95 memcpy(str+tempcount,uart1_recieve_buffer_ring,size-tempcount);
96 }
97
98 uart1_recieve_count-=size;
99
100 if(uart1_recieve_read+size<RECIEVE_RING_SIZE)
101 uart1_recieve_read+=size;
102 else
103 uart1_recieve_read=size-(RECIEVE_RING_SIZE-uart1_recieve_read);
104
105 retval=uart1_recieve_count;
88 } 106 }
89 107
90 uart1_recieve_count-=size; 108 /* Enable the interrupt */
91 109 IO_INTC_EINT0 |= (1<<IRQ_UART1);
92 if(uart1_recieve_read+size<RECIEVE_RING_SIZE)
93 uart1_recieve_read+=size;
94 else
95 uart1_recieve_read=size-(RECIEVE_RING_SIZE-uart1_recieve_read);
96 110
97 return uart1_recieve_count; 111 return retval;
98} 112}
99 113
100/* UART1 receive interupt handler */ 114/* UART1 receive interupt handler */
@@ -109,7 +123,8 @@ void UART1(void)
109 if(uart1_recieve_write==RECIEVE_RING_SIZE) 123 if(uart1_recieve_write==RECIEVE_RING_SIZE)
110 uart1_recieve_write=0; 124 uart1_recieve_write=0;
111 125
112 uart1_recieve_buffer_ring[uart1_recieve_write++] = IO_UART1_DTRR & 0xff; 126 uart1_recieve_buffer_ring[uart1_recieve_write] = IO_UART1_DTRR & 0xff;
127 uart1_recieve_write++;
113 uart1_recieve_count++; 128 uart1_recieve_count++;
114 } 129 }
115 } 130 }