25
29
//#define IPECAMERA_RETRY_ERRORS
26
30
#define IPECAMERA_MULTIREAD
28
int ipecamera_cmosis_read(pcilib_t *ctx, pcilib_register_bank_context_t *bank_ctx, pcilib_register_addr_t addr, pcilib_register_value_t *value) {
33
typedef struct ipecamera_cmosis_context_s ipecamera_cmosis_context_t;
35
struct ipecamera_cmosis_context_s {
36
pcilib_register_bank_context_t bank_ctx; /**< the bank context associated with the software registers */
37
pcilib_lock_t *lock; /**< the lock to serialize access through GPIO */
40
void ipecamera_cmosis_close(pcilib_t *ctx, pcilib_register_bank_context_t *reg_bank_ctx) {
41
ipecamera_cmosis_context_t *bank_ctx = (ipecamera_cmosis_context_t*)reg_bank_ctx;
44
pcilib_return_lock(ctx, PCILIB_LOCK_FLAGS_DEFAULT, bank_ctx->lock);
48
pcilib_register_bank_context_t* ipecamera_cmosis_open(pcilib_t *ctx, pcilib_register_bank_t bank, const char* model, const void *args) {
50
ipecamera_cmosis_context_t *bank_ctx;
52
bank_ctx = calloc(1, sizeof(ipecamera_cmosis_context_t));
54
pcilib_error("Memory allocation for bank context has failed");
58
bank_ctx->lock = pcilib_get_lock(ctx, PCILIB_LOCK_FLAGS_DEFAULT, "cmosis");
59
if (!bank_ctx->lock) {
60
ipecamera_cmosis_close(ctx, (pcilib_register_bank_context_t*)bank_ctx);
61
pcilib_error("Failed to initialize a lock to protect CMOSIS register bank");
65
return (pcilib_register_bank_context_t*)bank_ctx;
68
int ipecamera_cmosis_read(pcilib_t *ctx, pcilib_register_bank_context_t *reg_bank_ctx, pcilib_register_addr_t addr, pcilib_register_value_t *value) {
29
70
uint32_t val, tmp[4];
31
72
struct timeval start;
32
73
int retries = RETRIES;
33
const pcilib_register_bank_description_t *bank = bank_ctx->bank;
74
ipecamera_cmosis_context_t *bank_ctx = (ipecamera_cmosis_context_t*)reg_bank_ctx;
75
const pcilib_register_bank_description_t *bank = reg_bank_ctx->bank;
35
77
assert(addr < 128);
37
79
wr = pcilib_resolve_register_address(ctx, bank->bar, bank->write_addr);
87
err = pcilib_lock(bank_ctx->lock);
89
pcilib_error("Error (%i) obtaining a lock to serialize access to CMOSIS registers ", err);
47
95
ipecamera_datacpy(wr, &val, bank);
72
120
#endif /* IPECAMERA_MULTIREAD */
122
pcilib_unlock(bank_ctx->lock);
74
124
if ((val & READ_READY_BIT) == 0) {
75
125
if (--retries > 0) {
76
126
pcilib_warning("Timeout reading register value (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES);
79
130
pcilib_error("Timeout reading register value (CMOSIS %lu, status: %lx)", addr, val);
80
131
return PCILIB_ERROR_TIMEOUT;
83
134
if (val & READ_ERROR_BIT) {
84
135
#ifdef IPECAMERA_RETRY_ERRORS
85
136
if (--retries > 0) {
112
int ipecamera_cmosis_write(pcilib_t *ctx, pcilib_register_bank_context_t *bank_ctx, pcilib_register_addr_t addr, pcilib_register_value_t value) {
163
int ipecamera_cmosis_write(pcilib_t *ctx, pcilib_register_bank_context_t *reg_bank_ctx, pcilib_register_addr_t addr, pcilib_register_value_t value) {
113
165
uint32_t val, tmp[4];
115
167
struct timeval start;
116
168
int retries = RETRIES;
117
const pcilib_register_bank_description_t *bank = bank_ctx->bank;
169
ipecamera_cmosis_context_t *bank_ctx = (ipecamera_cmosis_context_t*)reg_bank_ctx;
170
const pcilib_register_bank_description_t *bank = reg_bank_ctx->bank;
119
172
assert(addr < 128);
120
173
assert(value < 256);
183
err = pcilib_lock(bank_ctx->lock);
185
pcilib_error("Error (%i) obtaining a lock to serialize access to CMOSIS registers ", err);
130
189
val = WRITE_BIT|(addr << 8)|(value&0xFF);
131
190
ipecamera_datacpy(wr, &val, bank);
186
247
pcilib_error("Address verification failed during register write (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val);
187
248
return PCILIB_ERROR_VERIFY;
190
251
if ((val&0xFF) != value) {
191
252
pcilib_error("Value verification failed during register read (CMOSIS %lu, value: %lu != %lu)", addr, val/*&ipecamera_bit_mask[bits]*/, value);
192
253
return PCILIB_ERROR_VERIFY;