~ubuntu-branches/ubuntu/raring/avr-libc/raring-proposed

« back to all changes in this revision

Viewing changes to tests/simulate/avr/eeprom-1.c

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2008-08-10 09:59:16 UTC
  • mfrom: (1.1.7 upstream) (4.1.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080810095916-wwyigh3vt0e9s7ud
Tags: 1:1.6.2.cvs20080610-2
Added build-depends on texlive-extra-utils (closes: #493454)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: eeprom-1.c,v 1.2.2.3 2008/04/04 08:14:45 dmix Exp $     */
 
2
 
 
3
#include <avr/eeprom.h>
 
4
#include <stdlib.h>
 
5
#include <string.h>
 
6
 
 
7
/* Note: GCC permits arithmetic with 'void *'.  */
 
8
 
 
9
int main ()
 
10
{
 
11
    void *p;
 
12
#define MAXLEN  (RAMEND > 0x15F ? 260 : (RAMEND - 0x60 - 30))
 
13
    unsigned char s[E2END > MAXLEN ? MAXLEN : E2END];
 
14
 
 
15
    /* Fill all EEPROM. */
 
16
    for (p = 0; p <= (void *)E2END; p++)
 
17
        eeprom_write_byte (p, ~(int)p);
 
18
 
 
19
    /* Read bytes.      */
 
20
    for (p = 0; p <= (void *)E2END; p++)
 
21
        if (eeprom_read_byte (p) != (~(int)p & 0xFF))
 
22
            exit (__LINE__);
 
23
 
 
24
    /* Read words.      */
 
25
    for (p = 0; p <= (void *)E2END - 1; p += 2) {
 
26
        if (eeprom_read_word (p)
 
27
            != ((~(unsigned)p & 0xFF) | (~(unsigned)(p+1) & 0xFF) << 8))
 
28
        {
 
29
            exit (__LINE__);
 
30
        }
 
31
    }
 
32
 
 
33
    /* Read double words.       */
 
34
    for (p = 0; p <= (void *)E2END - 3; p += 4) {
 
35
        if (eeprom_read_dword (p)
 
36
            != ((~(unsigned)p & 0xFF)
 
37
                | (~(unsigned)(p+1) & 0xFF) << 8
 
38
                | (unsigned long)(~(unsigned)(p+2) & 0xFF) << 16
 
39
                | (unsigned long)(~(unsigned)(p+3) & 0xFF) << 24))
 
40
        {
 
41
            exit (__LINE__);
 
42
        }
 
43
    }
 
44
 
 
45
    /* Read blocks.     */
 
46
    for (p = 0; p <= (void *)E2END; ) {
 
47
        size_t i, n;
 
48
        if ( (n = E2END + 1 - (unsigned)p) > sizeof(s))
 
49
            n = sizeof(s);
 
50
        eeprom_read_block (s, p, n);
 
51
        for (i = 0; i < n; i++) {
 
52
            if (s[i] != (~(int)p & 0xFF))
 
53
                exit (__LINE__);
 
54
            p += 1;
 
55
        }
 
56
    }
 
57
 
 
58
    /* Write only 1 byte.       */
 
59
    eeprom_write_byte ((unsigned char *)5, 1);
 
60
    for (p = 0; p <= (void *)E2END; p++) {
 
61
        if ((unsigned)p != 5
 
62
            && eeprom_read_byte (p) != (~(int)p & 0xFF))
 
63
        {
 
64
            exit (__LINE__);
 
65
        }
 
66
    }
 
67
    if (eeprom_read_byte ((unsigned char *)5) != 1)
 
68
        exit (__LINE__);
 
69
 
 
70
    /* Write only 1 word.       */
 
71
    /* Avr-gcc 4.2.2 produces incorrect code: the comparison of address
 
72
       with 5 and 6 values is omited. In result exit with error.
 
73
       Versions 3.3.6, 3.4.6, 4.0.4, 4.1.2, 4.2.3, 4.3.0(pre) give
 
74
       correct code and are simulated OK.       */
 
75
    eeprom_write_word ((unsigned *)5, 0x1234);
 
76
    for (p = 0; p <= (void *)E2END; p++) {
 
77
        if ((unsigned)p != 5
 
78
            && (unsigned)p != 6
 
79
            && eeprom_read_byte (p) != (~(int)p & 0xFF))
 
80
        {
 
81
            exit (__LINE__);
 
82
        }
 
83
    }
 
84
    if (eeprom_read_word ((unsigned *)5) != 0x1234)
 
85
        exit (__LINE__);
 
86
 
 
87
    /* Write only 1 double word.        */
 
88
    eeprom_write_dword ((unsigned long *)5, 0x12345678);
 
89
    for (p = 0; p <= (void *)E2END; p++) {
 
90
        if (((unsigned)p < 5 || (unsigned)p > 8)
 
91
            && eeprom_read_byte (p) != (~(int)p & 0xFF))
 
92
        {
 
93
            exit (__LINE__);
 
94
        }
 
95
    }
 
96
    if (eeprom_read_dword ((unsigned long *)5) != 0x12345678)
 
97
        exit (__LINE__);
 
98
 
 
99
    /* Write block.     */
 
100
    eeprom_write_block ("\x90\xAB\xCD\xEF\x01", (void *)5, 5);
 
101
    for (p = 0; p <= (void *)E2END; p++) {
 
102
        if (((unsigned)p < 5 || (unsigned)p > 9)
 
103
            && eeprom_read_byte (p) != (~(int)p & 0xFF))
 
104
        {
 
105
            exit (__LINE__);
 
106
        }
 
107
    }
 
108
    eeprom_read_block (s, (const void *)5, 5);
 
109
    if (memcmp (s, "\x90\xAB\xCD\xEF\x01", 3))
 
110
        exit (__LINE__);
 
111
 
 
112
    return 0;
 
113
}