BBM play: add serial MCUF output 115200 8N1
Stefan Schuermans

Stefan Schuermans commited on 2012-05-06 20:04:32
Showing 11 changed files, with 194 additions and 7 deletions.

... ...
@@ -63,7 +63,7 @@ SRC = $(TARGET).c
63 63
 SRC += app_bbm.c app_cfg.c apps.c apps_tools.c \
64 64
        arp.c bus.c cf.c checksum.c config.c dhcp.c dosfs.c dosfs_user.c \
65 65
        eeprom.c ethernet.c http.c icmp.c ip.c random.c rtl8019.c \
66
-       ser62500.c status.c tasks.c tcp.c timing.c uart.c udp.c \
66
+       ser115200.c ser62500.c status.c tasks.c tcp.c timing.c uart.c udp.c \
67 67
        xtea.c
68 68
 
69 69
 # You can also wrap lines by appending a backslash to the end of the line:
... ...
@@ -79,7 +79,7 @@ SRC += app_bbm.c app_cfg.c apps.c apps_tools.c \
79 79
 # Even though the DOS/Win* filesystem matches both .s and .S the same,
80 80
 # it will preserve the spelling of the filenames, and gcc itself does
81 81
 # care about how the name is spelled on its command-line.
82
-ASRC = ser62500_asm.S
82
+ASRC = ser115200_asm.S ser62500_asm.S
83 83
 
84 84
 
85 85
 # List any extra directories to look for include files here.
... ...
@@ -12,6 +12,7 @@
12 12
 #include "dosfs.h"
13 13
 #include "nethelp.h"
14 14
 #include "udp.h"
15
+#include "ser115200.h"
15 16
 #include "timing.h"
16 17
 
17 18
 ///< BBM file header
... ...
@@ -243,6 +244,10 @@ static void AppBbmProcFrame(AppBbmState *state)
243 244
     UdpSend((unsigned char *)&pack, sizeof(pack));
244 245
   }
245 246
 
247
+  // serial output 115200 8N1
248
+  if (state->ser115k2)
249
+    Ser115200Send((unsigned char *)&pack.mcuf, sizeof(pack.mcuf));
250
+
246 251
   // frame duration not more than one second
247 252
   if (duration <= 1000) {
248 253
     // wait for frame duration
... ...
@@ -282,6 +287,7 @@ void AppBbmInit(AppBbmState *state) // (extern)
282 287
   state->isInit = 0;
283 288
 
284 289
   // get destination address for MCUF frames
290
+  {
285 291
     char filename[12];
286 292
     sprintf(filename, "bbm%hhu/addr", state->no);
287 293
     if (AppsToolsReadIp(*state->sectorBuf, state->vi,
... ...
@@ -294,6 +300,7 @@ void AppBbmInit(AppBbmState *state) // (extern)
294 300
       state->haveAddr = 0;
295 301
       debug_app_bbm_printf("%hhu: no address", state->no);
296 302
     }
303
+  }
297 304
 
298 305
   // get destination port for MCUF frames
299 306
   if (state->haveAddr) {
... ...
@@ -305,6 +312,16 @@ void AppBbmInit(AppBbmState *state) // (extern)
305 312
     debug_app_bbm_printf("%hhu: port %hu", state->no, state->port);
306 313
   }
307 314
 
315
+  // check if serial output 115200 8N1 is requested
316
+  {
317
+    char filename[13], serDummy[3];
318
+    sprintf(filename, "bbm%hhu/115k2", state->no);
319
+    state->ser115k2 = AppsToolsReadStr(*state->sectorBuf, state->vi, filename,
320
+                                       serDummy, sizeof(serDummy)) == 0;
321
+    debug_app_bbm_printf("%hhu: serial output 115200 8N1: %c",
322
+                         state->no, state->ser115k2 ? 'Y' : 'n');
323
+  }
324
+
308 325
   // initialize internal state
309 326
   state->idxFile = 0;
310 327
   state->haveFile = 0;
... ...
@@ -20,6 +20,7 @@ typedef struct app_bbm_state {
20 20
   char           haveAddr;    ///< if destination address for MCUF is known
21 21
   unsigned char  addr[4];     ///< destination address for MCUF packets
22 22
   unsigned short port;        ///< destination port for MCUF packets
23
+  char           ser115k2;    ///< if serial output 115200 8N1 is requested
23 24
   unsigned int   idxFile;     ///< index of file to open next
24 25
   char           haveFile;    ///< if a file is open
25 26
   FILEINFO       fi;          ///< information about open file
... ...
@@ -113,13 +113,16 @@ void AppsRun(void) // (extern)
113 113
   // initialize applications
114 114
   AppBbmState bbm0 = { .sectorBuf = &sectorBuf, .vi = &vi, .no = 0 };
115 115
   AppBbmState bbm1 = { .sectorBuf = &sectorBuf, .vi = &vi, .no = 1 };
116
+  AppBbmState bbm2 = { .sectorBuf = &sectorBuf, .vi = &vi, .no = 2 };
116 117
   AppBbmInit(&bbm0);
117 118
   AppBbmInit(&bbm1);
119
+  AppBbmInit(&bbm2);
118 120
 
119 121
   // run applications
120 122
   while (CfIsPresent()) {
121 123
     AppBbmRun(&bbm0);
122 124
     AppBbmRun(&bbm1);
125
+    AppBbmRun(&bbm2);
123 126
     Tasks();
124 127
   }
125 128
 }
... ...
@@ -15,6 +15,7 @@
15 15
 #include "http.h"
16 16
 #include "random.h"
17 17
 #include "rtl8019.h"
18
+#include "ser115200.h"
18 19
 #include "status.h"
19 20
 #include "tasks.h"
20 21
 #include "tcp.h"
... ...
@@ -79,6 +80,7 @@ int main(void)
79 80
   CfInit();
80 81
   RtlInit();
81 82
   StatusInit();
83
+  Ser115200Init();
82 84
   TimingInit();
83 85
 
84 86
   // initialize high level modules
... ...
@@ -0,0 +1,28 @@
1
+/* flaneth - flash and ethernet
2
+   Copyright (C) 2007-2012 Stefan Schuermans <stefan@schuermans.info>
3
+   Copyleft: GNU public license V2 - http://www.gnu.org/copyleft/gpl.html
4
+   a BlinkenArea project - http://www.blinkenarea.org/ */
5
+
6
+#include <avr/io.h>
7
+#include <avr/wdt.h>
8
+
9
+#include "ser115200.h"
10
+
11
+// initialize
12
+void Ser115200Init(void) // (extern)
13
+{
14
+  DDRD |= 1 << 3;
15
+  PORTD |= 1 << 3;
16
+}
17
+
18
+// send data with 115200 baud in 8N1 protocol
19
+void Ser115200Send(unsigned char *ptr, unsigned short len)
20
+{
21
+  while (len > 0) {
22
+    wdt_reset();
23
+    Ser115200Out(*ptr);
24
+    ++ptr;
25
+    --len;
26
+  }
27
+}
28
+
... ...
@@ -0,0 +1,19 @@
1
+/* flaneth - flash and ethernet
2
+   Copyright (C) 2007-2012 Stefan Schuermans <stefan@schuermans.info>
3
+   Copyleft: GNU public license V2 - http://www.gnu.org/copyleft/gpl.html
4
+   a BlinkenArea project - http://www.blinkenarea.org/ */
5
+
6
+#ifndef INC_ser115200
7
+#define INC_ser115200
8
+
9
+// initialize
10
+extern void Ser115200Init(void);
11
+
12
+// send data with 115200 baud in 8N1 protocol
13
+extern void Ser115200Send(unsigned char *ptr, unsigned short len);
14
+
15
+// output a byte item with 115200 baud in 8N1 protocol
16
+extern void Ser115200Out(unsigned char val);
17
+
18
+#endif // #ifdef INC_ser115200
19
+
... ...
@@ -0,0 +1,118 @@
1
+; flaneth - flash and ethernet
2
+; Copyright (C) 2007-2012 Stefan Schuermans <stefan@schuermans.info>
3
+; Copyleft: GNU public license V2 - http://www.gnu.org/copyleft/gpl.html
4
+; a BlinkenArea project - http://www.blinkenarea.org/ */
5
+
6
+
7
+#include <avr/io.h>
8
+
9
+.section .text
10
+
11
+
12
+
13
+; output = PD3
14
+
15
+
16
+
17
+; output a byte item with 115200 baud in 8N1 protocol
18
+; extern void Ser115200Out(unsigned char val);
19
+.global Ser115200Out
20
+.func Ser115200Out
21
+Ser115200Out:
22
+	push	R17
23
+	push	R16
24
+
25
+	; parameters: R24=val
26
+
27
+	in	R17,SREG-0x20			; interrupts off
28
+	cli
29
+
30
+	clt					; start bit
31
+	in	R16,PORTD-0x20
32
+	bld	R16,3
33
+	out	PORTD-0x20,R16
34
+
35
+	rcall	wait135
36
+
37
+	bst	R24,0				; bit 0
38
+	in	R16,PORTD-0x20
39
+	bld	R16,3
40
+	out	PORTD-0x20,R16
41
+
42
+	rcall	wait135
43
+
44
+	bst	R24,1				; bit 1
45
+	in	R16,PORTD-0x20
46
+	bld	R16,3
47
+	out	PORTD-0x20,R16
48
+
49
+	rcall	wait135
50
+
51
+	bst	R24,2				; bit 2
52
+	in	R16,PORTD-0x20
53
+	bld	R16,3
54
+	out	PORTD-0x20,R16
55
+
56
+	rcall	wait135
57
+
58
+	bst	R24,3				; bit 3
59
+	in	R16,PORTD-0x20
60
+	bld	R16,3
61
+	out	PORTD-0x20,R16
62
+
63
+	rcall	wait135
64
+
65
+	bst	R24,4				; bit 4
66
+	in	R16,PORTD-0x20
67
+	bld	R16,3
68
+	out	PORTD-0x20,R16
69
+
70
+	rcall	wait135
71
+
72
+	bst	R24,5				; bit 5
73
+	in	R16,PORTD-0x20
74
+	bld	R16,3
75
+	out	PORTD-0x20,R16
76
+
77
+	rcall	wait135
78
+
79
+	bst	R24,6				; bit 6
80
+	in	R16,PORTD-0x20
81
+	bld	R16,3
82
+	out	PORTD-0x20,R16
83
+
84
+	rcall	wait135
85
+
86
+	bst	R24,7				; bit 7
87
+	in	R16,PORTD-0x20
88
+	bld	R16,3
89
+	out	PORTD-0x20,R16
90
+
91
+	rcall	wait135
92
+
93
+	set					; stop bit
94
+	in	R16,PORTD-0x20
95
+	bld	R16,3
96
+	out	PORTD-0x20,R16
97
+
98
+	rcall	wait135
99
+
100
+	out	SREG-0x20,R17			; restore interrupt state
101
+
102
+	pop	R16
103
+	pop	R17
104
+	ret
105
+.endfunc
106
+
107
+
108
+
109
+; wait 135 cycles (including rcall and ret)
110
+wait135:
111
+	nop					; 2 cycles
112
+	nop
113
+	ldi	R16, 42				; 1 cycle, N := 42
114
+wait_loop:
115
+	dec	R16				; N cycles
116
+	brne	wait_loop			; 2N-1 cycles
117
+	ret					; 7 cycles (including rcall)
118
+
... ...
@@ -1,7 +1,7 @@
1
-; 8BitAmEthernet - serial output 250kbps
2
-; version 0.4.0 date 2006-04-13
3
-; Copyright 2005-2006 Stefan Schuermans <1stein@schuermans.info>
4
-; Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
1
+; flaneth - flash and ethernet
2
+; Copyright (C) 2007-2012 Stefan Schuermans <stefan@schuermans.info>
3
+; Copyleft: GNU public license V2 - http://www.gnu.org/copyleft/gpl.html
4
+; a BlinkenArea project - http://www.blinkenarea.org/ */
5 5
 
6 6
 
7 7
 #include <avr/io.h>
... ...
@@ -16,7 +16,6 @@
16 16
 
17 17
 ; output a data item with 62500 baud in 9N2 protocol
18 18
 ; extern void Ser62500Out9N2( unsigned short item );
19
-; extern void SerialOutput( unsigned char value );
20 19
 .global Ser62500Out9N2
21 20
 .func Ser62500Out9N2
22 21
 Ser62500Out9N2:
23 22