10
12
#define WRITE_BIT 0x8000
15
//ToDo: check bot 1 and 2 bits for READY
13
16
#define READ_READY_BIT 0x20000
14
17
#define READ_ERROR_BIT 0x40000
16
19
#define ipecamera_datacpy(dst, src, bank) pcilib_datacpy(dst, src, 4, 1, bank->raw_endianess)
21
#define IPECAMERA_SIMPLIFIED_READOUT
18
23
static pcilib_register_value_t ipecamera_bit_mask[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };
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) {
23
28
struct timeval start, cur;
24
29
int retries = RETRIES;
32
#ifdef IPECAMERA_SIMPLIFIED_READOUT
26
37
assert(addr < 128);
32
43
return PCILIB_ERROR_INVALID_ADDRESS;
46
//printf("%i %x %p %p\n", addr, val, wr, rd);
49
#ifdef IPECAMERA_SIMPLIFIED_READOUT
50
ipecamera_datacpy(&tmp, rd, bank);
38
//printf("%i %x %p %p\n", addr, val, wr, rd);
40
ipecamera_datacpy(wr, &val, bank);
57
ipecamera_datacpy(wr, &val, bank);
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);
42
71
gettimeofday(&start, NULL);
44
73
ipecamera_datacpy(&val, rd, bank);
52
81
if ((val & READ_READY_BIT) == 0) {
53
pcilib_error("Timeout reading register value");
83
pcilib_warning("Timeout reading register value (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES);
86
pcilib_error("Timeout reading register value (CMOSIS %lu, status: %lx)", addr, val);
54
87
return PCILIB_ERROR_TIMEOUT;
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);
95
pcilib_error("Error reading register value (CMOSIS %lu, status: %lx)", addr, val);
59
96
return PCILIB_ERROR_FAILED;
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);
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;
72
// printf("%i\n", val&ipecamera_bit_mask[bits]);
74
108
*value = val&ipecamera_bit_mask[bits];
92
132
return PCILIB_ERROR_INVALID_ADDRESS;
135
//printf("%i %x %p %p\n", addr, val, wr, rd);
138
#ifdef IPECAMERA_SIMPLIFIED_READOUT
139
ipecamera_datacpy(&tmp, rd, bank);
96
144
val = WRITE_BIT|(addr << 8)|(value&0xFF);
98
//printf("%i %x %p %p\n", addr, val, wr, rd);
100
ipecamera_datacpy(wr, &val, bank);
145
ipecamera_datacpy(wr, &val, bank);
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);
102
159
gettimeofday(&start, NULL);
104
161
ipecamera_datacpy(&val, rd, bank);
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);
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;
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);
184
pcilib_error("Error writting register value (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val);
124
185
return PCILIB_ERROR_FAILED;
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);
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;
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;