1
#define _IPECAMERA_IMAGE_C
19
#define IPECAMERA_SLEEP_TIME 250000
33
pcilib_event_id_t event_id;
35
pcilib_register_t control_reg, status_reg;
36
pcilib_register_t start_reg, end_reg;
37
pcilib_register_t lines_reg;
38
pcilib_register_t exposure_reg;
44
#define FIND_REG(var, bank, name) \
45
ctx->var = pcilib_find_register(pcilib, bank, name); \
46
if (ctx->var == PCILIB_REGISTER_INVALID) { \
48
pcilib_error("Unable to find a %s register", name); \
52
#define GET_REG(reg, var) \
53
err = pcilib_read_register_by_id(pcilib, ctx->reg, &var); \
55
pcilib_error("Error reading %s register", ipecamera_registers[ctx->reg].name); \
59
#define SET_REG(reg, val) \
60
err = pcilib_write_register_by_id(pcilib, ctx->reg, val); \
62
pcilib_error("Error writting %s register", ipecamera_registers[ctx->reg].name); \
66
#define CHECK_REG(reg, check) \
67
err = pcilib_read_register_by_id(pcilib, ctx->reg, &value); \
69
pcilib_error("Error reading %s register", ipecamera_registers[ctx->reg].name); \
73
pcilib_error("Unexpected value (%li) of register %s", value, ipecamera_registers[ctx->reg].name); \
78
void *ipecamera_init(pcilib_t *pcilib) {
81
ipecamera_t *ctx = malloc(sizeof(ipecamera_t));
86
ctx->data = pcilib_resolve_data_space(pcilib, 0, &ctx->size);
89
pcilib_error("Unable to resolve the data space");
92
ctx->buffer = malloc(1088 * 2048 * 2);
95
pcilib_error("Unable to allocate ring buffer");
98
FIND_REG(status_reg, "fpga", "status");
99
FIND_REG(control_reg, "fpga", "control");
100
FIND_REG(start_reg, "fpga", "start_address");
101
FIND_REG(end_reg, "fpga", "end_address");
103
FIND_REG(lines_reg, "cmosis", "number_lines");
104
FIND_REG(exposure_reg, "cmosis", "exp_time");
115
void ipecamera_free(void *vctx) {
117
ipecamera_t *ctx = (ipecamera_t*)vctx;
119
if (ctx->buffer) free(ctx->buffer);
124
int ipecamera_reset(void *vctx) {
127
ipecamera_t *ctx = (ipecamera_t*)vctx;
129
pcilib_register_t control, status;
130
pcilib_register_value_t value;
133
pcilib_error("IPECamera imaging is not initialized");
134
return PCILIB_ERROR_NOTINITIALIZED;
137
pcilib = ctx->pcilib;
138
control = ctx->control_reg;
139
status = ctx->status_reg;
141
// Set Reset bit to CMOSIS
142
err = pcilib_write_register_by_id(pcilib, control, 5);
144
pcilib_error("Error setting CMOSIS reset bit");
147
usleep(IPECAMERA_SLEEP_TIME);
149
// Remove Reset bit to CMOSIS
150
err = pcilib_write_register_by_id(pcilib, control, 1);
152
pcilib_error("Error reseting CMOSIS reset bit");
155
usleep(IPECAMERA_SLEEP_TIME);
157
// Special settings for CMOSIS v.2
158
value = 01; err = pcilib_write_register_space(pcilib, "cmosis", 115, 1, &value);
160
pcilib_error("Error setting CMOSIS configuration");
163
usleep(IPECAMERA_SLEEP_TIME);
165
value = 07; err = pcilib_write_register_space(pcilib, "cmosis", 82, 1, &value);
167
pcilib_error("Error setting CMOSIS configuration");
170
usleep(IPECAMERA_SLEEP_TIME);
172
// This is temporary for verification purposes
173
memset(ctx->data, 0, ctx->size);
175
err = pcilib_read_register_by_id(pcilib, status, &value);
177
pcilib_error("Error reading status register");
181
if (value != 0x0849FFFF) {
182
pcilib_error("Unexpected value (%lx) of status register", value);
183
return PCILIB_ERROR_VERIFY;
189
int ipecamera_start(void *vctx, pcilib_event_t event_mask, pcilib_callback_t cb, void *user) {
190
ipecamera_t *ctx = (ipecamera_t*)vctx;
193
pcilib_error("IPECamera imaging is not initialized");
194
return PCILIB_ERROR_NOTINITIALIZED;
204
ctx->height = 1088; //GET_REG(lines_reg, lines);
212
int ipecamera_stop(void *vctx) {
213
ipecamera_t *ctx = (ipecamera_t*)vctx;
216
pcilib_error("IPECamera imaging is not initialized");
217
return PCILIB_ERROR_NOTINITIALIZED;
224
static int ipecamera_get_line(ipecamera_t *ctx, int line) {
226
pcilib_t *pcilib = ctx->pcilib;
227
pcilib_register_value_t ptr, size, value;
229
ipecamera_reset((void*)ctx);
231
SET_REG(lines_reg, 1);
233
SET_REG(control_reg, 149);
234
usleep(IPECAMERA_SLEEP_TIME);
235
CHECK_REG(status_reg, 0x0849FFFF);
237
GET_REG(start_reg, ptr);
238
GET_REG(end_reg, size);
241
printf("%i: %i %i\n", line, ptr, size);
243
SET_REG(control_reg, 141);
244
usleep(IPECAMERA_SLEEP_TIME);
245
CHECK_REG(status_reg, 0x0849FFFF);
249
static int ipecamera_get_image(ipecamera_t *ctx) {
252
pcilib_t *pcilib = ctx->pcilib;
254
for (i = 0; i < 1088; i++) {
255
ipecamera_get_line(ctx, i);
262
int ipecamera_trigger(void *vctx, pcilib_event_t event, size_t trigger_size, void *trigger_data) {
265
ipecamera_t *ctx = (ipecamera_t*)vctx;
268
pcilib_error("IPECamera imaging is not initialized");
269
return PCILIB_ERROR_NOTINITIALIZED;
273
err = ipecamera_get_image(ctx);
274
if (!err) err = ctx->cb(event, ctx->event_id, ctx->cb_user);
280
void* ipecamera_get(void *ctx, pcilib_event_id_t event_id, pcilib_event_data_type_t data_type, size_t *size) {
281
if (size) *size = ctx->width * ctx->height * 2;
285
int ipecamera_return(void *ctx, pcilib_event_id_t event_id) {