Stefan Schuermans commited on 2012-05-04 18:56:53
Showing 5 changed files, with 123 additions and 86 deletions.
... | ... |
@@ -60,7 +60,8 @@ SRC = $(TARGET).c |
60 | 60 |
|
61 | 61 |
# If there is more than one source file, append them above, or modify and |
62 | 62 |
# uncomment the following: |
63 |
-SRC += arp.c bus.c cf.c checksum.c config.c dhcp.c dosfs.c dosfs_user.c \ |
|
63 |
+SRC += apps.c \ |
|
64 |
+ arp.c bus.c cf.c checksum.c config.c dhcp.c dosfs.c dosfs_user.c \ |
|
64 | 65 |
eeprom.c ethernet.c http.c icmp.c ip.c random.c rtl8019.c \ |
65 | 66 |
ser62500.c status.c tasks.c tcp.c timing.c uart.c udp.c \ |
66 | 67 |
xtea.c |
... | ... |
@@ -0,0 +1,100 @@ |
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 <string.h> |
|
7 |
+ |
|
8 |
+#include "apps.h" |
|
9 |
+#include "debug.h" |
|
10 |
+#include "dosfs.h" |
|
11 |
+ |
|
12 |
+// list files and |
|
13 |
+static void AppsListDump(uint8_t sectorBuf[SECTOR_SIZE], VOLINFO *vi) |
|
14 |
+{ |
|
15 |
+ DIRINFO di; |
|
16 |
+ DIRENT de; |
|
17 |
+ uint8_t filename[12]; |
|
18 |
+ FILEINFO fi; |
|
19 |
+ uint8_t buf[64]; |
|
20 |
+ uint32_t len, i; |
|
21 |
+ |
|
22 |
+ // list files in root directory |
|
23 |
+ di.scratch = sectorBuf; |
|
24 |
+ if (DFS_OpenDir(vi, (uint8_t *)"", &di) != 0) { |
|
25 |
+ debug_apps_printf("cannot open root directory"); |
|
26 |
+ return; |
|
27 |
+ } |
|
28 |
+ debug_apps_printf("files in root directory:"); |
|
29 |
+ while (DFS_GetNext(vi, &di, &de) == 0) { |
|
30 |
+ if (de.attr == ATTR_LONG_NAME) { |
|
31 |
+ // ignore long names |
|
32 |
+ } else if (de.attr & ATTR_VOLUME_ID) { |
|
33 |
+ debug_apps_printf("volume ID: %-11.11s", de.name); |
|
34 |
+ } else if (de.attr & ATTR_DIRECTORY) { |
|
35 |
+ debug_apps_printf("directory: %-11.11s", de.name); |
|
36 |
+ } else { |
|
37 |
+ debug_apps_printf("file: %-11.11s", de.name); |
|
38 |
+ memcpy(filename, de.name, 11); // remember last filename |
|
39 |
+ filename[11] = 0; |
|
40 |
+ } |
|
41 |
+ } |
|
42 |
+ |
|
43 |
+ // dump last file |
|
44 |
+ if (DFS_OpenFile(vi, filename, DFS_READ, sectorBuf, &fi) != 0) { |
|
45 |
+ debug_apps_printf("cannot open file %s", filename); |
|
46 |
+ return; |
|
47 |
+ } |
|
48 |
+ debug_apps_printf("dumping file %s (max. %u bytes):", filename, sizeof(buf)); |
|
49 |
+ len = 0; |
|
50 |
+ DFS_ReadFile(&fi, sectorBuf, buf, &len, sizeof(buf)); |
|
51 |
+ for (i = 0; i < len; ++i) |
|
52 |
+ debug_apps_printf("%3lu: %02hX", i, buf[i]); |
|
53 |
+ debug_apps_printf("done", filename); |
|
54 |
+} |
|
55 |
+ |
|
56 |
+// run applications |
|
57 |
+void AppsRun(void) // (extern) |
|
58 |
+{ |
|
59 |
+ uint8_t sectorBuf[SECTOR_SIZE]; |
|
60 |
+ uint32_t partStart, partSize; |
|
61 |
+ uint8_t partAct, partType; |
|
62 |
+ VOLINFO vi; |
|
63 |
+ const char *sec_clus, *fstype; |
|
64 |
+ |
|
65 |
+ // get start of first partition |
|
66 |
+ partStart = DFS_GetPtnStart(0, sectorBuf, 0, &partAct, &partType, &partSize); |
|
67 |
+ if (partStart == 0xFFFFFFFF) { |
|
68 |
+ debug_apps_printf("cannot find first partition"); |
|
69 |
+ return; |
|
70 |
+ } |
|
71 |
+ debug_apps_printf("partition: start %lu size %lu", partStart, partSize); |
|
72 |
+ |
|
73 |
+ // get volume info |
|
74 |
+ if (DFS_GetVolInfo(0, sectorBuf, partStart, &vi) != 0) { |
|
75 |
+ debug_apps_printf("cannot get volume info"); |
|
76 |
+ return; |
|
77 |
+ } |
|
78 |
+ switch (vi.filesystem) { |
|
79 |
+ case FAT12: sec_clus = "sector: "; fstype = "FAT12"; break; |
|
80 |
+ case FAT16: sec_clus = "sector: "; fstype = "FAT16"; break; |
|
81 |
+ case FAT32: sec_clus = "cluster:"; fstype = "FAT32"; break; |
|
82 |
+ default: sec_clus = "sector: "; fstype = "unknown"; break; |
|
83 |
+ } |
|
84 |
+ debug_apps_printf("filesystem: %s", fstype); |
|
85 |
+ debug_apps_printf("volume label: %-11.11s", vi.label); |
|
86 |
+ debug_apps_printf("sector/s per cluster: %hu", vi.secperclus); |
|
87 |
+ debug_apps_printf("reserved sector/s: %hu", vi.reservedsecs); |
|
88 |
+ debug_apps_printf("volume total sectors: %lu", vi.numsecs); |
|
89 |
+ debug_apps_printf("sectors per FAT: %lu", vi.secperfat); |
|
90 |
+ debug_apps_printf("first FAT at sector: %lu", vi.fat1); |
|
91 |
+ debug_apps_printf("root dir at %s %lu", sec_clus, vi.rootdir); |
|
92 |
+ debug_apps_printf("root dir entries: %hu", vi.rootentries); |
|
93 |
+ debug_apps_printf("data area commences at sector: %lu", vi.dataarea); |
|
94 |
+ debug_apps_printf("clusters in data area: %lu", vi.numclusters); |
|
95 |
+ debug_apps_printf("sectors per cluster: %hu", vi.secperclus); |
|
96 |
+ |
|
97 |
+ // list directory, dump file |
|
98 |
+ AppsListDump(sectorBuf, &vi); |
|
99 |
+} |
|
100 |
+ |
... | ... |
@@ -0,0 +1,13 @@ |
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_apps |
|
7 |
+#define INC_apps |
|
8 |
+ |
|
9 |
+// run applications |
|
10 |
+extern void AppsRun(void); |
|
11 |
+ |
|
12 |
+#endif // #ifndef INC_apps |
|
13 |
+ |
... | ... |
@@ -22,25 +22,24 @@ |
22 | 22 |
#define DEBUG_DHCP 1 |
23 | 23 |
#define DEBUG_TCP 1 |
24 | 24 |
#define DEBUG_HTTP 1 |
25 |
+#define DEBUG_APPS 1 |
|
25 | 26 |
|
26 | 27 |
// debug version of printf |
27 | 28 |
#ifdef DEBUG |
28 |
-#define debug_printf_nolf( fmt, arg... ) \ |
|
29 |
+#define debug_printf( fmt, arg... ) \ |
|
29 | 30 |
do { \ |
30 |
- static const PROGMEM char fmt_pgm[] = fmt; \ |
|
31 |
+ static const PROGMEM char fmt_pgm[] = fmt"\r\n"; \ |
|
31 | 32 |
char fmt_buf[sizeof( fmt_pgm )]; \ |
32 | 33 |
for( int i = 0; i < sizeof( fmt_pgm ); i++ ) \ |
33 | 34 |
fmt_buf[i] = (char)pgm_read_byte_near( (uint16_t)fmt_pgm + i ); \ |
34 | 35 |
printf( fmt_buf, ##arg ); \ |
35 | 36 |
} while (0) |
36 |
-#define debug_printf( fmt, arg... ) debug_printf_nolf( fmt"\r\n", ##arg ) |
|
37 | 37 |
#else |
38 |
-#define debug_printf_nolf( fmt, arg... ) { } |
|
39 | 38 |
#define debug_printf( fmt, arg... ) { } |
40 | 39 |
#endif |
41 | 40 |
|
42 | 41 |
// specialized debug versions of printf |
43 |
-#define debug_specialized_printf( enabled, fmt, arg... ) { if( enabled ) debug_printf( fmt, ##arg ); } |
|
42 |
+#define debug_specialized_printf(enabled, fmt, arg...) do { if(enabled) debug_printf(fmt, ##arg); } while (0) |
|
44 | 43 |
#define debug_init_printf(fmt, arg...) debug_specialized_printf(DEBUG_INIT, "init: "fmt, ##arg) |
45 | 44 |
#define debug_eeprom_printf(fmt, arg...) debug_specialized_printf(DEBUG_EEPROM, "eeprom: "fmt, ##arg) |
46 | 45 |
#define debug_cf_printf(fmt, arg...) debug_specialized_printf(DEBUG_CF, "cf: "fmt, ##arg) |
... | ... |
@@ -53,5 +52,6 @@ |
53 | 52 |
#define debug_dhcp_printf(fmt, arg...) debug_specialized_printf(DEBUG_DHCP, "dhcp: "fmt, ##arg) |
54 | 53 |
#define debug_tcp_printf(fmt, arg...) debug_specialized_printf(DEBUG_TCP, "tcp: "fmt, ##arg) |
55 | 54 |
#define debug_http_printf(fmt, arg...) debug_specialized_printf(DEBUG_HTTP, "http: "fmt, ##arg) |
55 |
+#define debug_apps_printf(fmt, arg...) debug_specialized_printf(DEBUG_APPS, "apps: "fmt, ##arg) |
|
56 | 56 |
|
57 | 57 |
#endif // #ifndef INC_debug |
... | ... |
@@ -5,13 +5,12 @@ |
5 | 5 |
|
6 | 6 |
#include <avr/interrupt.h> |
7 | 7 |
#include <avr/wdt.h> |
8 |
-#include <string.h> |
|
9 | 8 |
|
9 |
+#include "apps.h" |
|
10 | 10 |
#include "arp.h" |
11 | 11 |
#include "bus.h" |
12 | 12 |
#include "cf.h" |
13 | 13 |
#include "debug.h" |
14 |
-#include "dosfs.h" |
|
15 | 14 |
#include "eeprom.h" |
16 | 15 |
#include "http.h" |
17 | 16 |
#include "random.h" |
... | ... |
@@ -26,17 +25,6 @@ |
26 | 25 |
static void mainWorkCf(void) |
27 | 26 |
{ |
28 | 27 |
unsigned long sectors; |
29 |
- uint8_t sectorBuf[SECTOR_SIZE]; |
|
30 |
- uint32_t partStart, partSize; |
|
31 |
- uint8_t partAct, partType; |
|
32 |
- VOLINFO vi; |
|
33 |
- const char *sec_clus, *fstype; |
|
34 |
- DIRINFO di; |
|
35 |
- DIRENT de; |
|
36 |
- uint8_t filename[12]; |
|
37 |
- FILEINFO fi; |
|
38 |
- uint8_t buf[16]; |
|
39 |
- uint32_t len, i; |
|
40 | 28 |
|
41 | 29 |
// reset card |
42 | 30 |
if (CfReset() != 0) |
... | ... |
@@ -46,73 +34,8 @@ static void mainWorkCf(void) |
46 | 34 |
if (CfIdentify(§ors) != 0) |
47 | 35 |
return; |
48 | 36 |
|
49 |
- // get start of first partition |
|
50 |
- partStart = DFS_GetPtnStart(0, sectorBuf, 0, &partAct, &partType, &partSize); |
|
51 |
- if (partStart == 0xFFFFFFFF) { |
|
52 |
- debug_printf("cannot find first partition"); |
|
53 |
- return; |
|
54 |
- } |
|
55 |
- debug_printf("partition: start %lu size %lu", partStart, partSize); |
|
56 |
- |
|
57 |
- // get volume info |
|
58 |
- if (DFS_GetVolInfo(0, sectorBuf, partStart, &vi) != 0) { |
|
59 |
- debug_printf("cannot get volume info"); |
|
60 |
- return; |
|
61 |
- } |
|
62 |
- switch (vi.filesystem) { |
|
63 |
- case FAT12: sec_clus = "sector: "; fstype = "FAT12"; break; |
|
64 |
- case FAT16: sec_clus = "sector: "; fstype = "FAT16"; break; |
|
65 |
- case FAT32: sec_clus = "cluster:"; fstype = "FAT32"; break; |
|
66 |
- default: sec_clus = "sector: "; fstype = "unknown"; break; |
|
67 |
- } |
|
68 |
- debug_printf("filesystem: %s", fstype); |
|
69 |
- debug_printf("volume label: %-11.11s", vi.label); |
|
70 |
- debug_printf("sector/s per cluster: %hu", vi.secperclus); |
|
71 |
- debug_printf("reserved sector/s: %hu", vi.reservedsecs); |
|
72 |
- debug_printf("volume total sectors: %lu", vi.numsecs); |
|
73 |
- debug_printf("sectors per FAT: %lu", vi.secperfat); |
|
74 |
- debug_printf("first FAT at sector: %lu", vi.fat1); |
|
75 |
- debug_printf("root dir at %s %lu", sec_clus, vi.rootdir); |
|
76 |
- debug_printf("root dir entries: %hu", vi.rootentries); |
|
77 |
- debug_printf("data area commences at sector: %lu", vi.dataarea); |
|
78 |
- debug_printf("clusters in data area: %lu", vi.numclusters); |
|
79 |
- debug_printf("sectors per cluster: %hu", vi.secperclus); |
|
80 |
- |
|
81 |
- // list files in root directory |
|
82 |
- di.scratch = sectorBuf; |
|
83 |
- if (DFS_OpenDir(&vi, (uint8_t *)"", &di) != 0) { |
|
84 |
- debug_printf("cannot open root directory"); |
|
85 |
- return; |
|
86 |
- } |
|
87 |
- debug_printf("files in root directory:"); |
|
88 |
- while (DFS_GetNext(&vi, &di, &de) == 0) { |
|
89 |
- if (de.attr == ATTR_LONG_NAME) { |
|
90 |
- // ignore long names |
|
91 |
- } else if (de.attr & ATTR_VOLUME_ID) { |
|
92 |
- debug_printf("volume ID: %-11.11s", de.name); |
|
93 |
- } else if (de.attr & ATTR_DIRECTORY) { |
|
94 |
- debug_printf("directory: %-11.11s", de.name); |
|
95 |
- } else { |
|
96 |
- debug_printf("file: %-11.11s", de.name); |
|
97 |
- memcpy(filename, de.name, 11); // remember last filename |
|
98 |
- filename[11] = 0; |
|
99 |
- } |
|
100 |
- } |
|
101 |
- |
|
102 |
- // dump last file |
|
103 |
- if (DFS_OpenFile(&vi, filename, DFS_READ, sectorBuf, &fi) != 0) { |
|
104 |
- debug_printf("cannot open file %s", filename); |
|
105 |
- return; |
|
106 |
- } |
|
107 |
- debug_printf("dumping file %s:", filename); |
|
108 |
- while (fi.pointer < fi.filelen) { |
|
109 |
- len = 0; |
|
110 |
- DFS_ReadFile(&fi, sectorBuf, buf, &len, sizeof(buf)); |
|
111 |
- for (i = 0; i < len; ++i) |
|
112 |
- debug_printf_nolf(" %02X", buf[i]); |
|
113 |
- debug_printf(""); |
|
114 |
- } |
|
115 |
- debug_printf("done", filename); |
|
37 |
+ // run applications |
|
38 |
+ AppsRun(); |
|
116 | 39 |
} |
117 | 40 |
|
118 | 41 |
// wait for CF card and work with it |
119 | 42 |