From 60d848702add727b1c6c8da3c079439fd129eca1 Mon Sep 17 00:00:00 2001 From: "Suren A. Chilingaryan" Date: Wed, 13 Apr 2011 20:35:32 +0200 Subject: Support simplified mode (slow) of writting CMOSIS sensors: issue 3 writes + delays and when start looking for status --- ipecamera/model.c | 107 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 84 insertions(+), 23 deletions(-) (limited to 'ipecamera/model.c') diff --git a/ipecamera/model.c b/ipecamera/model.c index 4e475b1..4830cf2 100644 --- a/ipecamera/model.c +++ b/ipecamera/model.c @@ -1,5 +1,7 @@ +#define _BSD_SOURCE #define _IPECAMERA_MODEL_C #include +#include #include #include "../tools.h" @@ -10,18 +12,27 @@ #define WRITE_BIT 0x8000 #define RETRIES 10 +//ToDo: check bot 1 and 2 bits for READY #define READ_READY_BIT 0x20000 #define READ_ERROR_BIT 0x40000 #define ipecamera_datacpy(dst, src, bank) pcilib_datacpy(dst, src, 4, 1, bank->raw_endianess) +#define IPECAMERA_SIMPLIFIED_READOUT + static pcilib_register_value_t ipecamera_bit_mask[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 }; 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) { - uint32_t val; + uint32_t val, tmp; char *wr, *rd; struct timeval start, cur; int retries = RETRIES; + +/* +#ifdef IPECAMERA_SIMPLIFIED_READOUT + uint32_t tmp; +#endif +*/ assert(addr < 128); @@ -32,13 +43,31 @@ int ipecamera_read(pcilib_t *ctx, pcilib_register_bank_description_t *bank, pcil return PCILIB_ERROR_INVALID_ADDRESS; } + //printf("%i %x %p %p\n", addr, val, wr, rd); + +/* +#ifdef IPECAMERA_SIMPLIFIED_READOUT + ipecamera_datacpy(&tmp, rd, bank); +#endif +*/ + retry: val = (addr << 8); - - //printf("%i %x %p %p\n", addr, val, wr, rd); - + ipecamera_datacpy(wr, &val, bank); - + +#ifdef IPECAMERA_SIMPLIFIED_READOUT + usleep(PCILIB_REGISTER_TIMEOUT); +// ipecamera_datacpy(&tmp, rd, bank); +// usleep(PCILIB_REGISTER_TIMEOUT); + ipecamera_datacpy(wr, &val, bank); + usleep(PCILIB_REGISTER_TIMEOUT); +// ipecamera_datacpy(&tmp, rd, bank); +// usleep(PCILIB_REGISTER_TIMEOUT); + ipecamera_datacpy(wr, &val, bank); + usleep(PCILIB_REGISTER_TIMEOUT); +#endif + gettimeofday(&start, NULL); ipecamera_datacpy(&val, rd, bank); @@ -50,27 +79,32 @@ retry: } if ((val & READ_READY_BIT) == 0) { - pcilib_error("Timeout reading register value"); + if (--retries > 0) { + pcilib_warning("Timeout reading register value (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES); + goto retry; + } + pcilib_error("Timeout reading register value (CMOSIS %lu, status: %lx)", addr, val); return PCILIB_ERROR_TIMEOUT; } if (val & READ_ERROR_BIT) { - pcilib_error("Error reading register value"); +/* if (--retries > 0) { + pcilib_warning("Error reading register (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES); + goto retry; + }*/ + pcilib_error("Error reading register value (CMOSIS %lu, status: %lx)", addr, val); return PCILIB_ERROR_FAILED; } if (((val&ADDR_MASK) >> 8) != addr) { if (--retries > 0) { - pcilib_warning("Address verification failed during register read, retrying (try %i of %i)...", RETRIES - retries, RETRIES); + pcilib_warning("Address verification failed during register read (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES); goto retry; } - pcilib_error("Address verification failed during register read"); + pcilib_error("Address verification failed during register read (CMOSIS %lu, status: %lx)", addr, val); return PCILIB_ERROR_VERIFY; } - -// printf("%i\n", val&ipecamera_bit_mask[bits]); - *value = val&ipecamera_bit_mask[bits]; return 0; @@ -81,7 +115,13 @@ int ipecamera_write(pcilib_t *ctx, pcilib_register_bank_description_t *bank, pci char *wr, *rd; struct timeval start, cur; int retries = RETRIES; - + +/* +#ifdef IPECAMERA_SIMPLIFIED_READOUT + uint32_t tmp; +#endif +*/ + assert(addr < 128); assert(value < 256); @@ -92,13 +132,30 @@ int ipecamera_write(pcilib_t *ctx, pcilib_register_bank_description_t *bank, pci return PCILIB_ERROR_INVALID_ADDRESS; } + //printf("%i %x %p %p\n", addr, val, wr, rd); + +/* +#ifdef IPECAMERA_SIMPLIFIED_READOUT + ipecamera_datacpy(&tmp, rd, bank); +#endif +*/ + retry: val = WRITE_BIT|(addr << 8)|(value&0xFF); - - //printf("%i %x %p %p\n", addr, val, wr, rd); - ipecamera_datacpy(wr, &val, bank); - + +#ifdef IPECAMERA_SIMPLIFIED_READOUT + usleep(PCILIB_REGISTER_TIMEOUT); +// ipecamera_datacpy(&tmp, rd, bank); +// usleep(PCILIB_REGISTER_TIMEOUT); + ipecamera_datacpy(wr, &val, bank); + usleep(PCILIB_REGISTER_TIMEOUT); +// ipecamera_datacpy(&tmp, rd, bank); +// usleep(PCILIB_REGISTER_TIMEOUT); + ipecamera_datacpy(wr, &val, bank); + usleep(PCILIB_REGISTER_TIMEOUT); +#endif + gettimeofday(&start, NULL); ipecamera_datacpy(&val, rd, bank); @@ -111,30 +168,34 @@ retry: if ((val & READ_READY_BIT) == 0) { if (--retries > 0) { - pcilib_warning("Timeout occured during register write, retrying (try %i of %i)...", RETRIES - retries, RETRIES); + pcilib_warning("Timeout occured during register write (CMOSIS %lu, value: %lu, status: %lx), retrying (try %i of %i)...", addr, value, val, RETRIES - retries, RETRIES); goto retry; } - pcilib_error("Timeout writting register value"); + pcilib_error("Timeout writting register value (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val); return PCILIB_ERROR_TIMEOUT; } if (val & READ_ERROR_BIT) { - pcilib_error("Error writting register value"); +/* if (--retries > 0) { + pcilib_warning("Register write has failed (CMOSIS %lu, value: %lu, status: %lx), retrying (try %i of %i)...", addr, value, val, RETRIES - retries, RETRIES); + goto retry; + }*/ + pcilib_error("Error writting register value (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val); return PCILIB_ERROR_FAILED; } if (((val&ADDR_MASK) >> 8) != addr) { if (--retries > 0) { - pcilib_warning("Address verification failed during register write, retrying (try %i of %i)...", RETRIES - retries, RETRIES); + 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); goto retry; } - pcilib_error("Address verification failed during register write"); + pcilib_error("Address verification failed during register write (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val); return PCILIB_ERROR_VERIFY; } if ((val&ipecamera_bit_mask[bits]) != value) { - pcilib_error("Value verification failed during register read (%lu != %lu)", val&ipecamera_bit_mask[bits], value); + pcilib_error("Value verification failed during register read (CMOSIS %lu, value: %lu != %lu)", addr, val&ipecamera_bit_mask[bits], value); return PCILIB_ERROR_VERIFY; } -- cgit v1.2.3