converted CF processing to run in foreground implemented CF sector read
Stefan Schuermans

Stefan Schuermans commited on 2012-05-02 20:53:14
Showing 6 changed files, with 343 additions and 351 deletions.

... ...
@@ -62,7 +62,7 @@ SRC = $(TARGET).c
62 62
 # uncomment the following:
63 63
 SRC += arp.c bus.c cf.c checksum.c config.c dhcp.c eeprom.c \
64 64
        ethernet.c http.c icmp.c ip.c random.c rtl8019.c \
65
-       ser62500.c status.c tcp.c timing.c uart.c udp.c \
65
+       ser62500.c status.c tasks.c tcp.c timing.c uart.c udp.c \
66 66
        xtea.c
67 67
 
68 68
 # You can also wrap lines by appending a backslash to the end of the line:
... ...
@@ -160,14 +160,14 @@ REBUILD_DEPS = Makefile.conf
160 160
 # Type: avrdude -c ?
161 161
 # to get a full listing.
162 162
 #
163
-#AVRDUDE_PROGRAMMER = stk200
164
-AVRDUDE_PROGRAMMER = avrisp2
163
+AVRDUDE_PROGRAMMER = stk200
164
+#AVRDUDE_PROGRAMMER = avrisp2
165 165
 
166 166
 
167 167
 #AVRDUDE_PORT = com1	# programmer connected to serial device
168 168
 #AVRDUDE_PORT = lpt1	# programmer connected to parallel port
169
-#AVRDUDE_PORT = /dev/parport0
170
-AVRDUDE_PORT = usb
169
+AVRDUDE_PORT = /dev/parport0
170
+#AVRDUDE_PORT = usb
171 171
 
172 172
 AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
173 173
 #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
... ...
@@ -11,6 +11,7 @@
11 11
 #include "debug.h"
12 12
 #include "macros.h"
13 13
 #include "status.h"
14
+#include "tasks.h"
14 15
 #include "timing.h"
15 16
 
16 17
 // IO pins of compact flash
... ...
@@ -57,13 +58,18 @@
57 58
 #define CF_SB_IDX (1)
58 59
 #define CF_SB_ERR (0)
59 60
 
61
+// timeout value for wait for ready after reset counter (in 20ms steps)
62
+#define CF_RESET_READY_TIMEOUT (50)    // 1s
63
+
64
+// timeout value for wait for ready counter (in 20ms steps)
65
+#define CF_READY_TIMEOUT (4)    // 80ms
66
+
60 67
 // compact flash commands
61 68
 #define CF_CMD_IDENTIFY (0xEC)
62 69
 #define CF_CMD_READ_SEC (0x20)
63 70
 #define CF_CMD_WRITE_SEC (0x30)
64 71
 
65 72
 // some number of bytes
66
-#define CF_BYTES_AT_ONCE (32)   // number of bytes to read/write at once
67 73
 #define CF_BYTES_IDENTIFY (124) // number of bytes to read for identify
68 74
 
69 75
 // interesting locations in identify data
... ...
@@ -77,61 +83,24 @@
77 83
 #define CF_CAPA_BIT_LBA (9)     // bit number of the LBA bit in the CF
78 84
                                 // capabilities
79 85
 
80
-// timeout value for wait for ready after reset counter (in 20ms steps)
81
-#define CF_WAIT_READY_RESET_20_TIMEOUT (50)    // 1s
86
+// compact flash error state (0 for no error, 1 for error)
87
+char CfErrorState = 1;
82 88
 
83
-// timeout value for wait for ready counter (in 20ms steps)
84
-#define CF_WAIT_READY_20_TIMEOUT (4)    // 80ms
85
-
86
-// compact flash insertion state
87
-enum CfInsertionState {
88
-  CfInsNone,    // no compact flash inserted
89
-  CfInsNew,     // new compact flash has been inserted, wait for powerup
90
-  CfInsReset,   // resetting new compact flash
91
-  CfInsWait,    // waiting for new compact flash to get ready after reset
92
-  CfInsReady,   // compact flash inserted and ready to work with
93
-  CfInsError,   // compact flash error occured, compact flash deactivated
94
-} CfInsState = CfInsNone;
95
-
96
-// compact flash working state
97
-enum CfWorkingState {
98
-  CfWorkNone,   // no compact flash work to do
99
-  CfWorkIdentify,       // identification of compact flash active
100
-} CfWorkState = CfWorkNone;
101
-
102
-// compact flash working step
103
-enum CfWorkingStep {
104
-  CfStepNone,   // no step in progress
105
-  CfStepCmdStatus,      // checking command status
106
-  CfStepDataTransfer,   // transferring (reading/writing) data
107
-  CfStepDataStatus,     // checking data status
108
-} CfWorkStep = CfStepNone;
89
+// tick/timeout counter of compact flash
90
+// - counts down in 20ms steps, stops at zero
91
+unsigned char CfTickCnt = 0;
109 92
 
110 93
 // number of sectors on compact flash card
111 94
 // - zero if no CF card is present, CF card has not yet been identified or CF 
112 95
 // card error occured
113 96
 unsigned long CfSectorCnt = 0;
114 97
 
115
-// state of active command
116
-unsigned long CfSectorNo = 0;   // current sector number of compact flash
117
-unsigned short CfNextOffset = 0;        // next offset in sector that is
118
-                                        // processed (read, written, ...)
119
-
120
-// wait for ready counter of compact flash
121
-// - counts down in 20ms steps
122
-// - zero if inactive
123
-unsigned char CfWaitReady20 = 0;
124
-
125 98
 // sector buffer
126
-unsigned char CfSectorBuffer[CF_SECTOR_SIZE];   // (extern)
99
+unsigned char CfSectorBuffer[CF_SECTOR_SIZE];   // FIXME
127 100
 
128 101
 // write a compact flash register (returns 1 if successful or 0 on error)
129 102
 // - returns 0 on success and -1 on error
130
-extern inline char CfWriteReg(unsigned char reg, unsigned char val)     // force 
131
-                                                                        // inlining 
132
-                                                                        // by 
133
-                                                                        // using 
134
-                                                                        // "extern"
103
+extern inline char CfWriteReg(unsigned char reg, unsigned char val)
135 104
 {
136 105
   if (!CF_IS_DETECT() || !CF_IS_READY())        // check that card is present 
137 106
                                                 // and ready
... ...
@@ -157,7 +126,6 @@ extern inline char CfWriteReg(unsigned char reg, unsigned char val)     // force
157 126
 // write buffer to compact flash register
158 127
 // (returns 1 if successful or 0 on error)
159 128
 // - returns 0 on success and -1 on error
160
-// - force inlining  by using "extern"
161 129
 extern inline char CfWriteRegBuf(unsigned char reg, unsigned char *p_buf,
162 130
                                  unsigned short len)
163 131
 {
... ...
@@ -192,11 +160,7 @@ extern inline char CfWriteRegBuf(unsigned char reg, unsigned char *p_buf,
192 160
 // write constant value to compact flash register multiple times (returns 1
193 161
 // if successful or 0 on error)
194 162
 // - returns 0 on success and -1 on error
195
-extern inline char CfWriteRegConst(unsigned char reg, unsigned char val, unsigned short cnt)    // force 
196
-                                                                                                // inlining 
197
-                                                                                                // by 
198
-                                                                                                // using 
199
-                                                                                                // "extern"
163
+extern inline char CfWriteRegConst(unsigned char reg, unsigned char val, unsigned short cnt)
200 164
 {
201 165
   if (!CF_IS_DETECT() || !CF_IS_READY())        // check that card is present 
202 166
                                                 // and ready
... ...
@@ -226,11 +190,7 @@ extern inline char CfWriteRegConst(unsigned char reg, unsigned char val, unsigne
226 190
 
227 191
 // read a compact flash register (returns 1 if successful or 0 on error)
228 192
 // - returns 0 on success and -1 on error
229
-extern inline char CfReadReg(unsigned char reg, unsigned char *p_var)   // force 
230
-                                                                        // inlining 
231
-                                                                        // by 
232
-                                                                        // using 
233
-                                                                        // "extern"
193
+extern inline char CfReadReg(unsigned char reg, unsigned char *p_var)
234 194
 {
235 195
   if (!CF_IS_DETECT() || !CF_IS_READY())        // check that card is present 
236 196
                                                 // and ready
... ...
@@ -253,11 +213,7 @@ extern inline char CfReadReg(unsigned char reg, unsigned char *p_var)   // force
253 213
 // read buffer from a compact flash register (returns 1 if successful or 0 on 
254 214
 // error)
255 215
 // - returns 0 on success and -1 on error
256
-extern inline char CfReadRegBuf(unsigned char reg, unsigned char *p_buf, unsigned short len)    // force 
257
-                                                                                                // inlining 
258
-                                                                                                // by 
259
-                                                                                                // using 
260
-                                                                                                // "extern"
216
+extern inline char CfReadRegBuf(unsigned char reg, unsigned char *p_buf, unsigned short len)
261 217
 {
262 218
   if (!CF_IS_DETECT() || !CF_IS_READY())        // check that card is present 
263 219
                                                 // and ready
... ...
@@ -285,11 +241,7 @@ extern inline char CfReadRegBuf(unsigned char reg, unsigned char *p_buf, unsigne
285 241
 // read a compact flash register multiple times and throw away data (returns
286 242
 // 1 if successful or 0 on error)
287 243
 // - returns 0 on success and -1 on error
288
-extern inline char CfReadRegMulti(unsigned char reg, unsigned short cnt)        // force 
289
-                                                                                // inlining 
290
-                                                                                // by 
291
-                                                                                // using 
292
-                                                                                // "extern"
244
+extern inline char CfReadRegMulti(unsigned char reg, unsigned short cnt)
293 245
 {
294 246
   if (!CF_IS_DETECT() || !CF_IS_READY())        // check that card is present 
295 247
                                                 // and ready
... ...
@@ -313,171 +265,184 @@ extern inline char CfReadRegMulti(unsigned char reg, unsigned short cnt)
313 265
   return cnt <= 0 ? 0 : -1;     // success if everything has been read
314 266
 }
315 267
 
316
-// compact flash work done
317
-static void CfDone(void)
268
+// compact flash error occured
269
+static void CfError(void)
318 270
 {
319
-  debug_cf_printf("CF done (%lu sectors)", CfSectorCnt);
271
+  debug_cf_printf("CF error");
320 272
 
321
-  // set working state and step to none
322
-  CfWorkState = CfWorkNone;
323
-  CfWorkStep = CfStepNone;
273
+  CfErrorState = 1;
274
+  CfTickCnt = 0;
324 275
 
325
-  // reset state of active command
326
-  CfSectorNo = 0;
327
-  CfNextOffset = 0;
276
+  CfSectorCnt = 0;
328 277
 
329
-  // disable wait for ready counter
330
-  CfWaitReady20 = 0;
278
+  // report no working CF present
279
+  StatusInfoCfPresent = 0;
331 280
 }
332 281
 
333
-// compact flash error occured
334
-static void CfError(void)
282
+// compact flash is gone
283
+static void CfGone(void)
335 284
 {
336
-  debug_cf_printf("CF error");
337
-
338
-  // set insertion state to error
339
-  CfInsState = CfInsError;
285
+  debug_cf_printf("CF gone");
340 286
 
341
-  // set working state and step to none
342
-  CfWorkState = CfWorkNone;
343
-  CfWorkStep = CfStepNone;
287
+  CfError();
288
+}
344 289
 
345
-  // reset all information about CF card
346
-  CfSectorCnt = 0;
290
+// compact flash timeout
291
+static void CfTimeout(void)
292
+{
293
+  debug_cf_printf("CF timeout");
347 294
 
348
-  // reset state of active command
349
-  CfSectorNo = 0;
350
-  CfNextOffset = 0;
295
+  CfError();
296
+}
351 297
 
352
-  // disable wait for ready counter
353
-  CfWaitReady20 = 0;
298
+// initialize
299
+void CfInit(void)       // (extern)
300
+{
301
+  // setup ports
302
+  bit_clear(CF_PORT_nCD, CF_BIT_nCD);   // pull-up of card detect pin off
303
+                                        // (external pull-up is present)
304
+  bit_clear(CF_DDR_nCD, CF_BIT_nCD);    // card detect pin to input
305
+  bit_set(CF_PORT_nRST, CF_BIT_nRST);   // reset not active
306
+  bit_set(CF_DDR_nRST, CF_BIT_nRST);    // reset pin to output
307
+  bit_clear(CF_PORT_RDY, CF_BIT_RDY);   // pull-up of ready pin pin off
308
+                                        // (external pull-up is present)
309
+  bit_clear(CF_DDR_RDY, CF_BIT_RDY);    // ready pin to input
310
+  bit_set(CF_PORT_nCE, CF_BIT_nCE);     // card not enabled
311
+  bit_set(CF_DDR_nCE, CF_BIT_nCE);      // card enable pin to output
354 312
 }
355 313
 
356
-// process compact flash insertion
357
-static void CfProcIns(void)
314
+// tick procedure - call every 20ms
315
+void CfTick20(void)     // (extern)
358 316
 {
359
-  switch (CfInsState) {
360
-
361
-    // no compact flash inserted
362
-  case CfInsNone:
363
-    // if compact flash is detected, set state to new CF
364
-    if (CF_IS_DETECT()) {
365
-      CfInsState = CfInsNew;
366
-      debug_cf_printf("new CF");
367
-      break;
317
+  // count down ticks
318
+  if (CfTickCnt > 0)
319
+    --CfTickCnt;
368 320
 }
369
-    break;
370 321
 
371
-    // new compact flash has been inserted, wait for powerup
372
-  case CfInsNew:
373
-    // if compact flash has been removed, set state to none
322
+/**
323
+ * @brief wait for CF to become ready
324
+ * @param[in] timeout timeout in 20ms steps
325
+ * @return 0 if CF ready, -1 if CF gone or timeout
326
+ */
327
+static int CfWaitReady(unsigned char timeout)
328
+{
329
+  CfTickCnt = timeout;
330
+
331
+  while (!CF_IS_READY()) {
332
+
333
+    // card gone -> error
374 334
     if (!CF_IS_DETECT()) {
375
-      CfInsState = CfInsNone;
376
-      break;
335
+      CfGone();
336
+      return -1;
377 337
     }
378
-    CfInsState = CfInsReset;
379
-    break;
380 338
 
381
-    // resetting new compact flash
382
-  case CfInsReset:
383
-    // set reset, wait, take back reset
384
-    CF_RESET_ACT();
385
-    nop();
386
-    nop();
387
-    nop();
388
-    CF_RESET_IDLE();
389
-    debug_cf_printf("CF reset");
390
-    // if compact flash has been removed, set state to none
391
-    if (!CF_IS_DETECT()) {
392
-      CfInsState = CfInsNone;
393
-      break;
339
+    // timeout -> error
340
+    if (CfTickCnt <= 0) {
341
+      CfTimeout();
342
+      return -1;
394 343
     }
395
-    // wait for CF to become ready
396
-    CfInsState = CfInsWait;
397
-    CfWaitReady20 = CF_WAIT_READY_RESET_20_TIMEOUT;
398
-    break;
399 344
 
400
-    // waiting for new compact flash to get ready after reset
401
-  case CfInsWait:
402
-    // if compact flash has been removed, set state to none
403
-    if (!CF_IS_DETECT()) {
404
-      CfInsState = CfInsNone;
405
-      break;
345
+    // execute other tasks while waiting
346
+    Tasks();
347
+
348
+  } // while (!CF_IS_READY())
349
+
350
+  return 0;
406 351
 }
407
-    // if compact flash card is ready, set state to ready
408
-    if (CF_IS_READY()) {
409
-      CfInsState = CfInsReady;
410
-      CfWaitReady20 = 0;
411
-      debug_cf_printf("CF ready");
412
-      break;
352
+
353
+/**
354
+ * @brief read bytes from CF card
355
+ * @param[in] ptr pointer to data buffer
356
+ * @param[in] sz size of data to read
357
+ * @return 0 if reading was successful, -1 if CF gon, timeout or error
358
+ */
359
+static int CfReadBytes(unsigned char *ptr, unsigned int sz)
360
+{
361
+  // read bytes
362
+  if (CfReadRegBuf(CF_REG_DATA, ptr, sz) != 0) {
363
+    debug_cf_printf("reading from CF failed (offset length 0x%03X)", sz);
364
+    CfError();
365
+    return -1;
413 366
   }
414
-    // count down timeout
415
-    CfWaitReady20--;
416
-    if (CfWaitReady20 <= 0) {
417
-      debug_cf_printf("timeout waiting for CF ready");
418
-      // start over
419
-      CfInsState = CfInsNone;
420
-      break;
367
+
368
+  return 0;
421 369
 }
422
-    break;
423 370
 
424
-    // compact flash inserted and ready to work with
425
-  case CfInsReady:
426
-    // do nothing here, card work is done by task procedure
427
-    // (task will detect CF removal or timeout and set state to error)
428
-    break;
371
+/**
372
+ * @brief check if CF card is present
373
+ * @return 1 if CF card is present, 0 if not
374
+ */
375
+char CfIsPresent(void) // (extern)
376
+{
377
+  if (CF_IS_DETECT())
378
+    return 1;
379
+  else
380
+    return 0;
381
+}
429 382
 
430
-    // compact flash error occured, compact flash deactivated
431
-  case CfInsError:
432
-    // if compact flash has been removed, set state to none
383
+/**
384
+ * @brief reset CF card
385
+ * @return 0 if CF card is present and could be reset, -1 if not
386
+ */
387
+char CfReset(void) // (extern)
388
+{
389
+  // wait one tick
433 390
   if (!CF_IS_DETECT()) {
434
-      CfInsState = CfInsNone;
435
-      debug_cf_printf("CF removed");
391
+    CfGone();
392
+    return -1;
436 393
   }
437
-    break;
394
+  CfTickCnt = 1;
395
+  while (CfTickCnt > 0)
396
+    Tasks();
438 397
 
439
-  }     // switch( CfInsState )
398
+  // set reset, wait, take back reset
399
+  if (!CF_IS_DETECT()) {
400
+    CfGone();
401
+    return -1;
440 402
   }
403
+  CF_RESET_ACT();
404
+  nop();
405
+  nop();
406
+  nop();
407
+  CF_RESET_IDLE();
408
+  debug_cf_printf("CF reset");
441 409
 
442
-// detect compact flash timeout
443
-// - called every 20ms
444
-static void CfDetectTimeout20(void)
445
-{
446
-  // only detect CF timeout if insertion state is ready
447
-  // (otherwise, the insertion processing is still doing some work)
448
-  if (CfInsState != CfInsReady)
449
-    return;
450
-
451
-  // wait for ready counter not active
452
-  if (CfWaitReady20 <= 0)
453
-    return;
410
+  // wait for CF to become ready
411
+  if (CfWaitReady(CF_RESET_READY_TIMEOUT) != 0)
412
+    return -1;
454 413
 
455
-  // decrement wait for ready counter
456
-  CfWaitReady20--;
414
+  // report working CF present
415
+  CfErrorState = 0;
416
+  StatusInfoCfPresent = 1;
417
+  debug_cf_printf("CF ready");
457 418
 
458
-  // timeout occured
459
-  if (CfWaitReady20 <= 0) {
460
-    debug_cf_printf("timeout while waiting for CF ready");
461
-    CfError();
462
-  }
419
+  return 0;
463 420
 }
464 421
 
465
-// continue with identifying compact flash
466
-static void CfProcWorkIdentify(void)
422
+/**
423
+ * @brief identify CF card
424
+ * @param[out] sectors number of sectors on CF card
425
+ * @return 0 if CF card could be identified, -1 if not
426
+ */
427
+char CfIdentify(unsigned long *sectors) // (extern)
467 428
 {
468
-  unsigned char status = 0;
469
-  unsigned short len, val16;
429
+  unsigned char status, identifyBuf[CF_BYTES_IDENTIFY];
430
+  unsigned short val16;
470 431
 
471
-  switch (CfWorkStep) {
432
+  debug_cf_printf("CF identify");
433
+  if (CfErrorState) {
434
+    debug_cf_printf("CF in error state");
435
+    return -1;
436
+  }
472 437
 
473
-    // no step
474
-  case CfStepNone:
475
-    debug_cf_printf("internal error (identify, CfStepNone)");
438
+  // issue identify drive command
439
+  if (CfWriteReg(CF_REG_CMD, CF_CMD_IDENTIFY) != 0) {
476 440
     CfError();
477
-    break;
441
+    return -1;
442
+  }
443
+  if (CfWaitReady(CF_READY_TIMEOUT) != 0)
444
+    return -1;
478 445
 
479
-    // checking command status
480
-  case CfStepCmdStatus:
481 446
   // read status register
482 447
   CfReadReg(CF_REG_STATUS, &status);
483 448
   // check that BUSY=0, RDY=1, DWF=0, DSC=1, IDX=0, ERR=0
... ...
@@ -487,178 +452,100 @@ static void CfProcWorkIdentify(void)
487 452
       (1 << CF_SB_RDY | 1 << CF_SB_DSC)) {
488 453
     debug_cf_printf("unexpected status 0x%02X (identify)", status);
489 454
     CfError();
455
+    return -1;
490 456
   }
491
-    // continue with data transfer
492
-    CfWorkStep = CfStepDataTransfer;
493
-    CfNextOffset = 0;
494
-    break;
495 457
 
496
-    // transferring data
497
-  case CfStepDataTransfer:
498
-    // still bytes to read
499
-    if (CfNextOffset < CF_BYTES_IDENTIFY) {
500
-      // get number of bytes to read
501
-      len = CF_BYTES_IDENTIFY - CfNextOffset;
502
-      if (len > CF_BYTES_AT_ONCE)
503
-        len = CF_BYTES_AT_ONCE;
504
-      // read bytes
505
-      if (CfReadRegBuf(CF_REG_DATA, &CfSectorBuffer[CfNextOffset], len) != 0) {
506
-        debug_cf_printf
507
-            ("reading from CF failed (identify, offset 0x%03X, length 0x%02X)",
508
-             CfNextOffset, len);
509
-        CfError();
510
-        break;
511
-      }
512
-      CfNextOffset += len;
513
-    }
514
-    // all bytes read
515
-    if (CfNextOffset >= CF_BYTES_IDENTIFY) {
458
+  // read identify bytes
459
+  if (CfReadBytes(identifyBuf, sizeof(identifyBuf)) != 0)
460
+    return -1;
461
+
516 462
   // check identifier
517
-      val16 = (unsigned short)CfSectorBuffer[CF_ID_OFS_ID_16 + 0]
518
-          | (unsigned short)CfSectorBuffer[CF_ID_OFS_ID_16 + 1] << 8;
463
+  val16 = (unsigned short)identifyBuf[CF_ID_OFS_ID_16 + 0] |
464
+          (unsigned short)identifyBuf[CF_ID_OFS_ID_16 + 1] << 8;
519 465
   if (val16 != CF_ID) {
520 466
     debug_cf_printf("invalid CF identifier: 0x%04X", val16);
521 467
     CfError();
522
-        break;
468
+    return -1;
523 469
   }
470
+
524 471
   // check if LBA mode is supported
525
-      val16 = (unsigned short)CfSectorBuffer[CF_ID_OFS_CAPA_16 + 0]
526
-          | (unsigned short)CfSectorBuffer[CF_ID_OFS_CAPA_16 + 1] << 8;
472
+  val16 = (unsigned short)identifyBuf[CF_ID_OFS_CAPA_16 + 0]
473
+      | (unsigned short)identifyBuf[CF_ID_OFS_CAPA_16 + 1] << 8;
527 474
   if ((val16 & 1 << CF_CAPA_BIT_LBA) == 0) {
528 475
     debug_cf_printf("CF does not support LBA mode");
529 476
     CfError();
530
-        break;
477
+    return -1;
531 478
   }
532 479
   // get number of sectors on CF
533
-      CfSectorCnt = (unsigned long)CfSectorBuffer[CF_ID_OFS_SEC_CNT_32 + 0]
534
-          | (unsigned long)CfSectorBuffer[CF_ID_OFS_SEC_CNT_32 + 1] << 8
535
-          | (unsigned long)CfSectorBuffer[CF_ID_OFS_SEC_CNT_32 + 2] << 16
536
-          | (unsigned long)CfSectorBuffer[CF_ID_OFS_SEC_CNT_32 + 3] << 24;
480
+  CfSectorCnt = (unsigned long)identifyBuf[CF_ID_OFS_SEC_CNT_32 + 0]
481
+      | (unsigned long)identifyBuf[CF_ID_OFS_SEC_CNT_32 + 1] << 8
482
+      | (unsigned long)identifyBuf[CF_ID_OFS_SEC_CNT_32 + 2] << 16
483
+      | (unsigned long)identifyBuf[CF_ID_OFS_SEC_CNT_32 + 3] << 24;
537 484
   if (CfSectorCnt <= 0) {
538 485
     debug_cf_printf("CF does not contain any sectors");
539 486
     CfError();
540
-        break;
541
-      }
542
-      // done
543
-      CfDone();
487
+    return -1;
544 488
   }
545
-    break;
546 489
 
547
-    // checking data status
548
-  case CfStepDataStatus:
549
-    debug_cf_printf("internal error (identify, CfStepDataStatus)");
550
-    CfError();
551
-    break;
490
+  debug_cf_printf("CF done (%lu sectors)", CfSectorCnt);
552 491
 
553
-  }     // switch( CfWorkStep )
492
+  return 0;
554 493
 }
555 494
 
556
-// do normal compact flash work
557
-static void CfProcWork(void)
495
+/**
496
+ * @brief read from CF card
497
+ * @param[in] sector number of sector to read
498
+ * @param[out] data data read from sector
499
+ * @return 0 if sector could be read, -1 if not
500
+ */
501
+char CfRead(unsigned long sector, unsigned char data[CF_SECTOR_SIZE]) // (extern)
558 502
 {
559
-  // only do CF processing if insertion state is ready
560
-  // (otherwise, the insertion processing is still doing some work)
561
-  if (CfInsState != CfInsReady)
562
-    return;
503
+  unsigned char status;
563 504
 
564
-  // compact flash has been removed -> error
565
-  if (!CF_IS_DETECT()) {
566
-    debug_cf_printf("CF no more present");
567
-    CfError();
568
-    return;
569
-  }
570
-  // compact flash is not ready
571
-  if (!CF_IS_READY()) {
572
-    // wait for ready not active --> error
573
-    if (CfWaitReady20 <= 0) {
574
-      debug_cf_printf("CF no more ready");
575
-      CfError();
576
-    }
577
-    // do nothing if CF is not ready
578
-    return;
505
+  debug_cf_printf("CF read (sector %lu)", sector);
506
+  if (CfErrorState) {
507
+    debug_cf_printf("CF in error state");
508
+    return -1;
579 509
   }
580
-
581
-  switch (CfWorkState) {
582
-
583
-    // no compact flash work to do
584
-  case CfWorkNone:
585
-    // nothing to do here
586
-    break;
587
-
588
-    // identification of compact flash active
589
-  case CfWorkIdentify:
590
-    CfProcWorkIdentify();
591
-    break;
592
-
593
-  }     // switch( CfWorkState )
510
+  if (sector >= CfSectorCnt) {
511
+    debug_cf_printf("sector does not exist");
512
+    return -1;
594 513
   }
595 514
 
596
-// identify compact flash
597
-// - returns 0 on success, 1 if not idle and -1 on error
598
-static char CfIdentify(void)
599
-{
600
-  // check that no command is being worked on
601
-  if (CfWorkState != CfWorkNone)
602
-    return 1;
603
-
604
-  debug_cf_printf("CF identify");
605
-
606
-  // issue identify drive command
607
-  if (CfWriteReg(CF_REG_CMD, CF_CMD_IDENTIFY) != 0) {
515
+  // set sector number (LBA mode) and sector count (1)
516
+  if (CfWriteReg(CF_REG_HEAD, 0xE0 | (sector >> 24 & 0x0F)) != 0 ||
517
+      CfWriteReg(CF_REG_CYL_H, sector >> 16) != 0 ||
518
+      CfWriteReg(CF_REG_CYL_L, sector >> 8) != 0 ||
519
+      CfWriteReg(CF_REG_SEC_NO, sector) != 0 ||
520
+      CfWriteReg(CF_REG_SEC_CNT, 1) != 0) {
608 521
     CfError();
609 522
     return -1;
610 523
   }
611
-  // now identifying compact flash
612
-  CfWorkState = CfWorkIdentify;
613
-  CfWorkStep = CfStepCmdStatus;
614
-  CfNextOffset = 0;
615
-  CfWaitReady20 = CF_WAIT_READY_20_TIMEOUT;
616
-  return 0;
617
-}
618 524
 
619
-// initialize
620
-void CfInit(void)       // (extern)
621
-{
622
-  // setup ports
623
-  bit_clear(CF_PORT_nCD, CF_BIT_nCD);   // pull-up of card detect pin off
624
-                                        // (external pull-up is present)
625
-  bit_clear(CF_DDR_nCD, CF_BIT_nCD);    // card detect pin to input
626
-  bit_set(CF_PORT_nRST, CF_BIT_nRST);   // reset not active
627
-  bit_set(CF_DDR_nRST, CF_BIT_nRST);    // reset pin to output
628
-  bit_clear(CF_PORT_RDY, CF_BIT_RDY);   // pull-up of ready pin pin off
629
-                                        // (external pull-up is present)
630
-  bit_clear(CF_DDR_RDY, CF_BIT_RDY);    // ready pin to input
631
-  bit_set(CF_PORT_nCE, CF_BIT_nCE);     // card not enabled
632
-  bit_set(CF_DDR_nCE, CF_BIT_nCE);      // card enable pin to output
525
+  // issue read sector command
526
+  if (CfWriteReg(CF_REG_CMD, CF_CMD_READ_SEC) != 0) {
527
+    CfError();
528
+    return -1;
633 529
   }
530
+  if (CfWaitReady(CF_READY_TIMEOUT) != 0)
531
+    return -1;
634 532
 
635
-// tick procedure - call every 20ms
636
-void CfTick20(void)     // (extern)
637
-{
638
-  // process compact flash insertion
639
-  CfProcIns();
640
-
641
-  // detect compact flash timeout
642
-  CfDetectTimeout20();
533
+  // read status register
534
+  CfReadReg(CF_REG_STATUS, &status);
535
+  // check that BUSY=0, RDY=1, DWF=0, DSC=1, IDX=0, ERR=0
536
+  if ((status &
537
+       (1 << CF_SB_BUSY | 1 << CF_SB_RDY | 1 << CF_SB_DWF | 1 << CF_SB_DSC |
538
+        1 << CF_SB_IDX | 1 << CF_SB_ERR)) !=
539
+      (1 << CF_SB_RDY | 1 << CF_SB_DSC)) {
540
+    debug_cf_printf("unexpected status 0x%02X (identify)", status);
541
+    CfError();
542
+    return -1;
643 543
   }
644 544
 
645
-// task function to do the work - call from main loop
646
-void CfTask(void)       // (extern)
647
-{
648
-  // do nothing if no CF is inserted
649
-  if (CfInsState != CfInsReady)
650
-    return;
545
+  // read sector bytes
546
+  if (CfReadBytes(data, CF_SECTOR_SIZE) != 0)
547
+    return -1;
651 548
 
652
-  // compact flash is ready but not yet identified
653
-  if (CfSectorCnt == 0) {
654
-    // identify compact flash
655
-    CfIdentify();
549
+  return 0;
656 550
 }
657
-  // do normal compact flash work
658
-  CfProcWork();
659 551
 
660
-  // update status
661
-  StatusInfoCfPresent = CfInsState == CfInsReady;       // report working CF
662
-                                                        // if insertion state
663
-                                                        // is ready
664
-}
... ...
@@ -9,16 +9,38 @@
9 9
 // size of a sector in bytes
10 10
 #define CF_SECTOR_SIZE (512)
11 11
 
12
-// sector buffer
13
-extern unsigned char CfSectorBuffer[CF_SECTOR_SIZE];
14
-
15 12
 // initialize
16 13
 extern void CfInit(void);
17 14
 
18 15
 // tick procedure - call every 20ms
19 16
 extern void CfTick20(void);
20 17
 
21
-// task function to do the work - call from main loop
22
-extern void CfTask(void);
18
+/**
19
+ * @brief check if CF card is present
20
+ * @return 1 if CF card is present, 0 if not
21
+ */
22
+extern char CfIsPresent(void);
23
+
24
+/**
25
+ * @brief reset CF card
26
+ * @return 0 if CF card could be reset, -1 if not
27
+ */
28
+extern char CfReset(void);
29
+
30
+/**
31
+ * @brief identify CF card
32
+ * @param[out] sectors number of sectors on CF card
33
+ * @return 0 if CF card could be identified, -1 if not
34
+ */
35
+extern char CfIdentify(unsigned long *sectors);
36
+
37
+/**
38
+ * @brief read from CF card
39
+ * @param[in] sector number of sector to read
40
+ * @param[out] data data read from sector
41
+ * @return 0 if sector could be read, -1 if not
42
+ */
43
+extern char CfRead(unsigned long sector, unsigned char data[CF_SECTOR_SIZE]);
23 44
 
24 45
 #endif // #ifndef INC_cf
46
+
... ...
@@ -15,10 +15,56 @@
15 15
 #include "random.h"
16 16
 #include "rtl8019.h"
17 17
 #include "status.h"
18
+#include "tasks.h"
18 19
 #include "tcp.h"
19 20
 #include "timing.h"
20 21
 #include "uart.h"
21 22
 
23
+// try to work with CF card
24
+static void mainWorkCf(void)
25
+{
26
+  unsigned long sectors, s;
27
+  unsigned char buf[CF_SECTOR_SIZE];
28
+
29
+  // reset card
30
+  if (CfReset() != 0)
31
+    return;
32
+
33
+  // identify card
34
+  if (CfIdentify(&sectors) != 0)
35
+    return;
36
+
37
+  // dump sectors
38
+  for (s = 0; s < sectors; ++s) {
39
+    if (CfRead(s, buf) != 0)
40
+      return;
41
+#if 0
42
+    unsigned int i;
43
+    for (i = 0; i < CF_SECTOR_SIZE; ++i) {
44
+      printf(" %02X", buf[i]);
45
+      if ((i & 15) == 15)
46
+        printf("\r\n");
47
+    }
48
+#endif
49
+    Tasks();
50
+  } // for s
51
+}
52
+
53
+// wait for CF card and work with it
54
+static void mainWaitCf(void)
55
+{
56
+  // wait for new card
57
+  while (!CfIsPresent())
58
+    Tasks();
59
+
60
+  // work with card
61
+  mainWorkCf();
62
+
63
+  // wait for failing card to be removed
64
+  while (CfIsPresent())
65
+    Tasks();
66
+}
67
+
22 68
 // main code entry point
23 69
 int main(void)
24 70
 {
... ...
@@ -66,18 +112,8 @@ int main(void)
66 112
   debug_init_printf("start");
67 113
 
68 114
   // main loop
69
-  while (1) {
70
-    wdt_reset();
71
-    CfTask();
72
-    wdt_reset();
73
-    EepromTask();
74
-    wdt_reset();
75
-    RandomTask();
76
-    wdt_reset();
77
-    //RtlTask();
78
-    wdt_reset();
79
-    TimingTask();
80
-  }
115
+  while (1)
116
+    mainWaitCf();
81 117
 
82 118
   return 0;
83 119
 }
... ...
@@ -0,0 +1,35 @@
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/wdt.h>
7
+
8
+#include "arp.h"
9
+#include "bus.h"
10
+#include "cf.h"
11
+#include "debug.h"
12
+#include "eeprom.h"
13
+#include "http.h"
14
+#include "random.h"
15
+#include "rtl8019.h"
16
+#include "status.h"
17
+#include "tasks.h"
18
+#include "tcp.h"
19
+#include "timing.h"
20
+#include "uart.h"
21
+
22
+// task function to call all tasks - call from main loop
23
+void Tasks(void) // (extern)
24
+{
25
+    wdt_reset();
26
+    EepromTask();
27
+    wdt_reset();
28
+    RandomTask();
29
+    wdt_reset();
30
+    RtlTask();
31
+    wdt_reset();
32
+    TimingTask();
33
+    wdt_reset();
34
+}
35
+
... ...
@@ -0,0 +1,12 @@
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_tasks
7
+#define INC_tasks
8
+
9
+// task function to call all tasks - call from main loop
10
+extern void Tasks(void);
11
+
12
+#endif // #ifndef INC_tasks
0 13