/alps/ipecamera

To get this branch, use:
bzr branch http://darksoft.org/webbzr/alps/ipecamera

« back to all changes in this revision

Viewing changes to ipecamera/model.c

  • Committer: Suren A. Chilingaryan
  • Date: 2011-04-13 18:35:32 UTC
  • Revision ID: csa@dside.dyndns.org-20110413183532-trmlwmwvgp18og9i
Support simplified mode (slow) of writting CMOSIS sensors: issue 3 writes + delays and when start looking for status

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#define _BSD_SOURCE
1
2
#define _IPECAMERA_MODEL_C
2
3
#include <sys/time.h>
 
4
#include <unistd.h>
3
5
#include <assert.h>
4
6
 
5
7
#include "../tools.h"
10
12
#define WRITE_BIT 0x8000
11
13
#define RETRIES 10
12
14
 
 
15
//ToDo: check bot 1 and 2 bits for READY
13
16
#define READ_READY_BIT 0x20000
14
17
#define READ_ERROR_BIT 0x40000
15
18
 
16
19
#define ipecamera_datacpy(dst, src, bank)   pcilib_datacpy(dst, src, 4, 1, bank->raw_endianess)
17
20
 
 
21
#define IPECAMERA_SIMPLIFIED_READOUT
 
22
 
18
23
static pcilib_register_value_t ipecamera_bit_mask[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };
19
24
 
20
25
int ipecamera_read(pcilib_t *ctx, pcilib_register_bank_description_t *bank, pcilib_register_addr_t addr, uint8_t bits, pcilib_register_value_t *value) {
21
 
    uint32_t val;
 
26
    uint32_t val, tmp;
22
27
    char *wr, *rd;
23
28
    struct timeval start, cur;
24
29
    int retries = RETRIES;
 
30
 
 
31
/*
 
32
#ifdef IPECAMERA_SIMPLIFIED_READOUT
 
33
    uint32_t tmp;
 
34
#endif
 
35
*/
25
36
    
26
37
    assert(addr < 128);
27
38
    
32
43
        return PCILIB_ERROR_INVALID_ADDRESS;
33
44
    }
34
45
 
 
46
    //printf("%i %x %p %p\n", addr,  val, wr, rd);
 
47
 
 
48
/*
 
49
#ifdef IPECAMERA_SIMPLIFIED_READOUT
 
50
    ipecamera_datacpy(&tmp, rd, bank);
 
51
#endif
 
52
*/
 
53
 
35
54
retry:
36
55
    val = (addr << 8);
37
 
    
38
 
    //printf("%i %x %p %p\n", addr,  val, wr, rd);
39
 
    
40
 
    ipecamera_datacpy(wr, &val, bank);
41
 
    
 
56
 
 
57
    ipecamera_datacpy(wr, &val, bank);
 
58
 
 
59
#ifdef IPECAMERA_SIMPLIFIED_READOUT
 
60
    usleep(PCILIB_REGISTER_TIMEOUT);
 
61
//    ipecamera_datacpy(&tmp, rd, bank);
 
62
//    usleep(PCILIB_REGISTER_TIMEOUT);
 
63
    ipecamera_datacpy(wr, &val, bank);
 
64
    usleep(PCILIB_REGISTER_TIMEOUT);
 
65
//    ipecamera_datacpy(&tmp, rd, bank);
 
66
//    usleep(PCILIB_REGISTER_TIMEOUT);
 
67
    ipecamera_datacpy(wr, &val, bank);
 
68
    usleep(PCILIB_REGISTER_TIMEOUT);
 
69
#endif
 
70
 
42
71
    gettimeofday(&start, NULL);
43
72
 
44
73
    ipecamera_datacpy(&val, rd, bank);
50
79
    }
51
80
 
52
81
    if ((val & READ_READY_BIT) == 0) {
53
 
        pcilib_error("Timeout reading register value");
 
82
        if (--retries > 0) {
 
83
            pcilib_warning("Timeout reading register value (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES);
 
84
            goto retry;
 
85
        }
 
86
        pcilib_error("Timeout reading register value (CMOSIS %lu, status: %lx)", addr, val);
54
87
        return PCILIB_ERROR_TIMEOUT;
55
88
    }
56
89
    
57
90
    if (val & READ_ERROR_BIT) {
58
 
        pcilib_error("Error reading register value");
 
91
/*      if (--retries > 0) {
 
92
            pcilib_warning("Error reading register (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES);
 
93
            goto retry;
 
94
        }*/
 
95
        pcilib_error("Error reading register value (CMOSIS %lu, status: %lx)", addr, val);
59
96
        return PCILIB_ERROR_FAILED;
60
97
    }
61
98
 
62
99
    if (((val&ADDR_MASK) >> 8) != addr) {
63
100
        if (--retries > 0) {
64
 
            pcilib_warning("Address verification failed during register read, retrying (try %i of %i)...", RETRIES - retries, RETRIES);
 
101
            pcilib_warning("Address verification failed during register read (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES);
65
102
            goto retry;
66
103
        }
67
 
        pcilib_error("Address verification failed during register read");
 
104
        pcilib_error("Address verification failed during register read (CMOSIS %lu, status: %lx)", addr, val);
68
105
        return PCILIB_ERROR_VERIFY;
69
106
    }
70
107
 
71
 
    
72
 
//    printf("%i\n", val&ipecamera_bit_mask[bits]);
73
 
 
74
108
    *value = val&ipecamera_bit_mask[bits];
75
109
 
76
110
    return 0;
81
115
    char *wr, *rd;
82
116
    struct timeval start, cur;
83
117
    int retries = RETRIES;
84
 
    
 
118
 
 
119
/*
 
120
#ifdef IPECAMERA_SIMPLIFIED_READOUT
 
121
    uint32_t tmp;
 
122
#endif
 
123
*/
 
124
 
85
125
    assert(addr < 128);
86
126
    assert(value < 256);
87
127
    
92
132
        return PCILIB_ERROR_INVALID_ADDRESS;
93
133
    }
94
134
 
 
135
    //printf("%i %x %p %p\n", addr,  val, wr, rd);
 
136
 
 
137
/*
 
138
#ifdef IPECAMERA_SIMPLIFIED_READOUT
 
139
    ipecamera_datacpy(&tmp, rd, bank);
 
140
#endif
 
141
*/
 
142
 
95
143
retry:
96
144
    val = WRITE_BIT|(addr << 8)|(value&0xFF);
97
 
    
98
 
    //printf("%i %x %p %p\n", addr,  val, wr, rd);
99
 
    
100
 
    ipecamera_datacpy(wr, &val, bank);
101
 
    
 
145
    ipecamera_datacpy(wr, &val, bank);
 
146
 
 
147
#ifdef IPECAMERA_SIMPLIFIED_READOUT
 
148
    usleep(PCILIB_REGISTER_TIMEOUT);
 
149
//    ipecamera_datacpy(&tmp, rd, bank);
 
150
//    usleep(PCILIB_REGISTER_TIMEOUT);
 
151
    ipecamera_datacpy(wr, &val, bank);
 
152
    usleep(PCILIB_REGISTER_TIMEOUT);
 
153
//    ipecamera_datacpy(&tmp, rd, bank);
 
154
//    usleep(PCILIB_REGISTER_TIMEOUT);
 
155
    ipecamera_datacpy(wr, &val, bank);
 
156
    usleep(PCILIB_REGISTER_TIMEOUT);
 
157
#endif
 
158
 
102
159
    gettimeofday(&start, NULL);
103
160
 
104
161
    ipecamera_datacpy(&val, rd, bank);
111
168
 
112
169
    if ((val & READ_READY_BIT) == 0) {
113
170
        if (--retries > 0) {
114
 
            pcilib_warning("Timeout occured during register write, retrying (try %i of %i)...", RETRIES - retries, RETRIES);
 
171
            pcilib_warning("Timeout occured during register write (CMOSIS %lu, value: %lu, status: %lx), retrying (try %i of %i)...", addr, value, val, RETRIES - retries, RETRIES);
115
172
            goto retry;
116
173
        }
117
174
 
118
 
        pcilib_error("Timeout writting register value");
 
175
        pcilib_error("Timeout writting register value (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val);
119
176
        return PCILIB_ERROR_TIMEOUT;
120
177
    }
121
178
    
122
179
    if (val & READ_ERROR_BIT) {
123
 
        pcilib_error("Error writting register value");
 
180
/*      if (--retries > 0) {
 
181
            pcilib_warning("Register write has failed (CMOSIS %lu, value: %lu, status: %lx), retrying (try %i of %i)...", addr, value, val, RETRIES - retries, RETRIES);
 
182
            goto retry;
 
183
        }*/
 
184
        pcilib_error("Error writting register value (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val);
124
185
        return PCILIB_ERROR_FAILED;
125
186
    }
126
187
 
127
188
    if (((val&ADDR_MASK) >> 8) != addr) {
128
189
        if (--retries > 0) {
129
 
            pcilib_warning("Address verification failed during register write, retrying (try %i of %i)...", RETRIES - retries, RETRIES);
 
190
            pcilib_warning("Address verification failed during register write (CMOSIS %lu, value: %lu, status: %lx), retrying (try %i of %i)...", addr, value, val, RETRIES - retries, RETRIES);
130
191
            goto retry;
131
192
        }
132
 
        pcilib_error("Address verification failed during register write");
 
193
        pcilib_error("Address verification failed during register write (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val);
133
194
        return PCILIB_ERROR_VERIFY;
134
195
    }
135
196
    
136
197
    if ((val&ipecamera_bit_mask[bits]) != value) {
137
 
        pcilib_error("Value verification failed during register read (%lu != %lu)", val&ipecamera_bit_mask[bits], value);
 
198
        pcilib_error("Value verification failed during register read (CMOSIS %lu, value: %lu != %lu)", addr, val&ipecamera_bit_mask[bits], value);
138
199
        return PCILIB_ERROR_VERIFY;
139
200
    }
140
201