2
#define _IPECAMERA_MODEL_C
11
#define ADDR_MASK 0x7F00
12
#define WRITE_BIT 0x8000
15
//ToDo: check bot 1 and 2 bits for READY
16
#define READ_READY_BIT 0x20000
17
#define READ_ERROR_BIT 0x40000
19
#define ipecamera_datacpy(dst, src, bank) pcilib_datacpy(dst, src, 4, 1, bank->raw_endianess)
21
//#define IPECAMERA_SIMPLIFIED_READOUT
22
#define IPECAMERA_MULTIREAD
24
//static pcilib_register_value_t ipecamera_bit_mask[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };
26
int ipecamera_read(pcilib_t *ctx, pcilib_register_bank_description_t *bank, pcilib_register_addr_t addr, pcilib_register_value_t *value) {
29
struct timeval start;//, cur;
30
int retries = RETRIES;
34
wr = pcilib_resolve_register_address(ctx, bank->bar, bank->write_addr);
35
rd = pcilib_resolve_register_address(ctx, bank->bar, bank->read_addr);
37
pcilib_error("Error resolving addresses of read & write registers");
38
return PCILIB_ERROR_INVALID_ADDRESS;
41
//printf("%i %x %p %p\n", addr, val, wr, rd);
44
#ifdef IPECAMERA_SIMPLIFIED_READOUT
45
ipecamera_datacpy(tmp, rd, bank);
52
ipecamera_datacpy(wr, &val, bank);
54
#ifdef IPECAMERA_SIMPLIFIED_READOUT
55
usleep(PCILIB_REGISTER_TIMEOUT);
56
// ipecamera_datacpy(tmp, rd, bank);
57
// usleep(PCILIB_REGISTER_TIMEOUT);
58
ipecamera_datacpy(wr, &val, bank);
59
usleep(PCILIB_REGISTER_TIMEOUT);
60
// ipecamera_datacpy(tmp, rd, bank);
61
// usleep(PCILIB_REGISTER_TIMEOUT);
62
ipecamera_datacpy(wr, &val, bank);
63
usleep(PCILIB_REGISTER_TIMEOUT);
64
#endif /* IPECAMERA_SIMPLIFIED_READOUT */
66
gettimeofday(&start, NULL);
68
#ifdef IPECAMERA_MULTIREAD
69
usleep(PCILIB_REGISTER_TIMEOUT);
70
pcilib_datacpy(tmp, rd, 4, 4, bank->raw_endianess);
72
#else /* IPECAMERA_MULTIREAD */
73
ipecamera_datacpy(&val, rd, bank);
75
while ((val & READ_READY_BIT) == 0) {
76
gettimeofday(&cur, NULL);
77
if (((cur.tv_sec - start.tv_sec)*1000000 + (cur.tv_usec - start.tv_usec)) > PCILIB_REGISTER_TIMEOUT) break;
79
ipecamera_datacpy(&val, rd, bank);
81
#endif /* IPECAMERA_MULTIREAD */
83
if ((val & READ_READY_BIT) == 0) {
85
pcilib_warning("Timeout reading register value (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES);
88
pcilib_error("Timeout reading register value (CMOSIS %lu, status: %lx)", addr, val);
89
return PCILIB_ERROR_TIMEOUT;
92
if (val & READ_ERROR_BIT) {
93
/* if (--retries > 0) {
94
pcilib_warning("Error reading register (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES);
97
pcilib_error("Error reading register value (CMOSIS %lu, status: %lx)", addr, val);
98
return PCILIB_ERROR_FAILED;
101
if (((val&ADDR_MASK) >> 8) != addr) {
103
pcilib_warning("Address verification failed during register read (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES);
106
pcilib_error("Address verification failed during register read (CMOSIS %lu, status: %lx)", addr, val);
107
return PCILIB_ERROR_VERIFY;
110
// *value = val&ipecamera_bit_mask[bits];
116
int ipecamera_write(pcilib_t *ctx, pcilib_register_bank_description_t *bank, pcilib_register_addr_t addr, pcilib_register_value_t value) {
117
uint32_t val, tmp[4];
119
struct timeval start;//, cur;
120
int retries = RETRIES;
125
wr = pcilib_resolve_register_address(ctx, bank->bar, bank->write_addr);
126
rd = pcilib_resolve_register_address(ctx, bank->bar, bank->read_addr);
128
pcilib_error("Error resolving addresses of read & write registers");
129
return PCILIB_ERROR_INVALID_ADDRESS;
132
//printf("%i %x %p %p\n", addr, val, wr, rd);
135
#ifdef IPECAMERA_SIMPLIFIED_READOUT
136
ipecamera_datacpy(tmp, rd, bank);
141
val = WRITE_BIT|(addr << 8)|(value&0xFF);
142
ipecamera_datacpy(wr, &val, bank);
144
#ifdef IPECAMERA_SIMPLIFIED_READOUT
145
usleep(PCILIB_REGISTER_TIMEOUT);
146
// ipecamera_datacpy(tmp, rd, bank);
147
// usleep(PCILIB_REGISTER_TIMEOUT);
148
ipecamera_datacpy(wr, &val, bank);
149
usleep(PCILIB_REGISTER_TIMEOUT);
150
// ipecamera_datacpy(tmp, rd, bank);
151
// usleep(PCILIB_REGISTER_TIMEOUT);
152
ipecamera_datacpy(wr, &val, bank);
153
usleep(PCILIB_REGISTER_TIMEOUT);
154
#endif /* IPECAMERA_SIMPLIFIED_READOUT */
156
gettimeofday(&start, NULL);
158
#ifdef IPECAMERA_MULTIREAD
159
usleep(PCILIB_REGISTER_TIMEOUT);
160
pcilib_datacpy(tmp, rd, 4, 4, bank->raw_endianess);
162
#else /* IPECAMERA_MULTIREAD */
163
ipecamera_datacpy(&val, rd, bank);
164
while ((val & READ_READY_BIT) == 0) {
165
gettimeofday(&cur, NULL);
166
if (((cur.tv_sec - start.tv_sec)*1000000 + (cur.tv_usec - start.tv_usec)) > PCILIB_REGISTER_TIMEOUT) break;
168
ipecamera_datacpy(&val, rd, bank);
170
#endif /* IPECAMERA_MULTIREAD */
172
if ((val & READ_READY_BIT) == 0) {
174
pcilib_warning("Timeout occured during register write (CMOSIS %lu, value: %lu, status: %lx), retrying (try %i of %i)...", addr, value, val, RETRIES - retries, RETRIES);
178
pcilib_error("Timeout writting register value (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val);
179
return PCILIB_ERROR_TIMEOUT;
182
if (val & READ_ERROR_BIT) {
183
/* if (--retries > 0) {
184
pcilib_warning("Register write has failed (CMOSIS %lu, value: %lu, status: %lx), retrying (try %i of %i)...", addr, value, val, RETRIES - retries, RETRIES);
187
pcilib_error("Error writting register value (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val);
188
return PCILIB_ERROR_FAILED;
191
if (((val&ADDR_MASK) >> 8) != addr) {
193
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);
196
pcilib_error("Address verification failed during register write (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val);
197
return PCILIB_ERROR_VERIFY;
200
if ((val&0xFF/*&ipecamera_bit_mask[bits]*/) != value) {
201
pcilib_error("Value verification failed during register read (CMOSIS %lu, value: %lu != %lu)", addr, val/*&ipecamera_bit_mask[bits]*/, value);
202
return PCILIB_ERROR_VERIFY;
205
//printf("%i\n", val&ipecamera_bit_mask[bits]);