2
6
#include "ipecamera.h"
9
#define ADDR_MASK 0x7F00
10
#define WRITE_BIT 0x8000
13
#define READ_READY_BIT 0x20000
14
#define READ_ERROR_BIT 0x40000
16
#define ipecamera_datacpy(dst, src, bank) pcilib_datacpy(dst, src, 4, 1, bank->raw_endianess)
19
int ipecamera_read_register_space(int handle, pcilib_model_t model, pcilib_register_t addr, pcilib_register_value_t *value) {
21
//(void *buf, int handle, pcilib_bar_t bar, uintptr_t addr, size_t size);
25
int ipecamera_write_register_space(int handle, pcilib_model_t model, pcilib_register_t addr, pcilib_register_value_t value) {
29
static int ipecamera_read_byte(int handle, int reg, int bits, uint8_t *value) {
32
static int ipecamera_write_byte(int handle, int reg, int bits, uint8_t value) {
36
static pcilib_register_value_t ipecamera_bit_mask[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };
38
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) {
41
struct timeval start, cur;
42
int retries = RETRIES;
46
wr = pcilib_resolve_register_address(ctx, bank->write_addr);
47
rd = pcilib_resolve_register_address(ctx, bank->read_addr);
49
pcilib_error("Error resolving addresses of read & write registers");
50
return PCILIB_ERROR_INVALID_ADDRESS;
56
//printf("%i %x %p %p\n", addr, val, wr, rd);
58
ipecamera_datacpy(wr, &val, bank);
60
gettimeofday(&start, NULL);
62
ipecamera_datacpy(&val, rd, bank);
63
while ((val & READ_READY_BIT) == 0) {
64
gettimeofday(&cur, NULL);
65
if (((cur.tv_sec - start.tv_sec)*1000000 + (cur.tv_usec - start.tv_usec)) > PCILIB_REGISTER_TIMEOUT) break;
67
ipecamera_datacpy(&val, rd, bank);
70
if ((val & READ_READY_BIT) == 0) {
71
pcilib_error("Timeout reading register value");
72
return PCILIB_ERROR_TIMEOUT;
75
if (val & READ_ERROR_BIT) {
76
pcilib_error("Error reading register value");
77
return PCILIB_ERROR_FAILED;
80
if (((val&ADDR_MASK) >> 8) != addr) {
82
pcilib_warning("Address verification failed during register read, retrying (try %i of %i)...", RETRIES - retries, RETRIES);
85
pcilib_error("Address verification failed during register read");
86
return PCILIB_ERROR_VERIFY;
90
// printf("%i\n", val&ipecamera_bit_mask[bits]);
92
*value = val&ipecamera_bit_mask[bits];
97
int ipecamera_write(pcilib_t *ctx, pcilib_register_bank_description_t *bank, pcilib_register_addr_t addr, uint8_t bits, pcilib_register_value_t value) {
100
struct timeval start, cur;
101
int retries = RETRIES;
106
wr = pcilib_resolve_register_address(ctx, bank->write_addr);
107
rd = pcilib_resolve_register_address(ctx, bank->read_addr);
109
pcilib_error("Error resolving addresses of read & write registers");
110
return PCILIB_ERROR_INVALID_ADDRESS;
114
val = WRITE_BIT|(addr << 8)|(value&0xFF);
116
//printf("%i %x %p %p\n", addr, val, wr, rd);
118
ipecamera_datacpy(wr, &val, bank);
120
gettimeofday(&start, NULL);
122
ipecamera_datacpy(&val, rd, bank);
123
while ((val & READ_READY_BIT) == 0) {
124
gettimeofday(&cur, NULL);
125
if (((cur.tv_sec - start.tv_sec)*1000000 + (cur.tv_usec - start.tv_usec)) > PCILIB_REGISTER_TIMEOUT) break;
127
ipecamera_datacpy(&val, rd, bank);
130
if ((val & READ_READY_BIT) == 0) {
131
pcilib_error("Timeout writting register value");
132
return PCILIB_ERROR_TIMEOUT;
135
if (val & READ_ERROR_BIT) {
136
pcilib_error("Error writting register value");
137
return PCILIB_ERROR_FAILED;
140
if (((val&ADDR_MASK) >> 8) != addr) {
142
pcilib_warning("Address verification failed during register read, retrying (try %i of %i)...", RETRIES - retries, RETRIES);
145
pcilib_error("Address verification failed during register write");
146
return PCILIB_ERROR_VERIFY;
149
if ((val&ipecamera_bit_mask[bits]) != value) {
150
pcilib_error("Value verification failed during register read (%lu != %lu)", val&ipecamera_bit_mask[bits], value);
151
return PCILIB_ERROR_VERIFY;
154
//printf("%i\n", val&ipecamera_bit_mask[bits]);