Browse Source

Support HighFlex-based ipecamera

Suren A. Chilingaryan 6 years ago
parent
commit
70350338f8
4 changed files with 22 additions and 21 deletions
  1. 6 11
      base.c
  2. 1 1
      cmosis.c
  3. 8 2
      private.h
  4. 7 7
      reader.c

+ 6 - 11
base.c

@@ -290,14 +290,6 @@ int ipecamera_reset(pcilib_context_t *vctx) {
 	pcilib_warning("Reset procedure is not implemented");
     }
 
-	// Set default parameters
-    err = pcilib_write_register_by_id(pcilib, control, IPECAMERA_IDLE);
-    if (err) {
-	UNLOCK(run);
-	pcilib_error("Error bringing FPGA in default mode");
-	return err;
-    }
-
     usleep(10000);
 
 
@@ -362,11 +354,14 @@ int ipecamera_start(pcilib_context_t *vctx, pcilib_event_t event_mask, pcilib_ev
      case IPECAMERA_FIRMWARE_UFO5:
 	ctx->dim.width = CMOSIS_WIDTH;
 	ctx->dim.height = CMOSIS_MAX_LINES;
+
+	ctx->data_line_size = (1 + CMOSIS_PIXELS_PER_CHANNEL) * 32; 
 	break;
      case IPECAMERA_FIRMWARE_CMOSIS20:
 	ctx->dim.width = CMOSIS20_WIDTH;
 	ctx->dim.height = CMOSIS20_MAX_LINES;
-	ctx->cmosis_outputs = CMOSIS20_MAX_CHANNELS;
+
+	ctx->data_line_size = (2 + CMOSIS20_PIXELS_PER_CHANNEL) * 32;
 	break;
      default:
 	UNLOCK(run);
@@ -374,7 +369,7 @@ int ipecamera_start(pcilib_context_t *vctx, pcilib_event_t event_mask, pcilib_ev
 	return PCILIB_ERROR_INVALID_REQUEST;
     }
 
-    if (ctx->firmware == IPECAMERA_FIRMWARE_UFO5) {
+    if ((1)||(ctx->firmware == IPECAMERA_FIRMWARE_UFO5)) {
 	GET_REG(output_mode_reg, value);
 	switch (value) {
 	 case IPECAMERA_MODE_16_CHAN_IO:
@@ -388,7 +383,7 @@ int ipecamera_start(pcilib_context_t *vctx, pcilib_event_t event_mask, pcilib_ev
 	    pcilib_error("IPECamera reporting invalid output_mode 0x%lx", value);
 	    return PCILIB_ERROR_INVALID_STATE;
 	}
-    }
+    } 
 
 	// We should be careful here (currently firmware matches format, but this may not be the case in future)
     ipecamera_compute_buffer_size(ctx, ctx->firmware, CMOSIS_FRAME_HEADER_SIZE, ctx->dim.height);

+ 1 - 1
cmosis.c

@@ -28,7 +28,7 @@
 #define ipecamera_datacpy(dst, src, bank)   pcilib_datacpy(dst, src, 4, 1, bank->raw_endianess)
 
 //#define IPECAMERA_SIMPLIFIED_READOUT
-//#define IPECAMERA_RETRY_ERRORS
+#define IPECAMERA_RETRY_ERRORS
 #define IPECAMERA_MULTIREAD
 
 

+ 8 - 2
private.h

@@ -63,13 +63,18 @@
 #define CMOSIS_WIDTH (CMOSIS_MAX_CHANNELS * CMOSIS_PIXELS_PER_CHANNEL)
 //#define IPECAMERA_MAX_LINES 1088
 #define CMOSIS_MAX_LINES 2048
+
+/*
 #define CMOSIS20_MAX_CHANNELS 8
 #define CMOSIS20_PIXELS_PER_CHANNEL 640
 #define CMOSIS20_WIDTH (CMOSIS20_MAX_CHANNELS * CMOSIS20_PIXELS_PER_CHANNEL)
+*/
+#define CMOSIS20_PIXELS_PER_CHANNEL 320
+#define CMOSIS20_WIDTH (CMOSIS_MAX_CHANNELS * CMOSIS_PIXELS_PER_CHANNEL)
 #define CMOSIS20_MAX_LINES 3840
 
-#define IPECAMERA_FRAME_REQUEST 		0x80000209 // 0x1E9
-#define IPECAMERA_IDLE 				0x80000201 // 0x1E1
+#define IPECAMERA_FRAME_REQUEST 		0x209 // 0x80000209 // 0x1E9
+#define IPECAMERA_IDLE 				0x201 // 0x80000201 // 0x1E1
 #define IPECAMERA_START_INTERNAL_STIMULI 	0x1F1
 
 #define IPECAMERA_MODE_16_CHAN_IO		0
@@ -243,6 +248,7 @@ struct ipecamera_s {
     char saved_header[CMOSIS_FRAME_HEADER_SIZE];	/**< If it happened that the frame header is split between 2 DMA packets, this variable holds the part containing in the first packet */
 #endif /* IPECAMERA_BUG_MULTIFRAME_HEADERS */
 
+    size_t data_line_size;
     ipecamera_image_dimensions_t dim;
 
     pthread_t rthread;

+ 7 - 7
reader.c

@@ -61,12 +61,9 @@ int ipecamera_compute_buffer_size(ipecamera_t *ctx, ipecamera_format_t format, s
 
     switch (format) {
      case IPECAMERA_FORMAT_CMOSIS:
-	max_channels = CMOSIS_MAX_CHANNELS;
-	line_size = (1 + CMOSIS_PIXELS_PER_CHANNEL) * 32; 
-	break;
      case IPECAMERA_FORMAT_CMOSIS20:
-	max_channels = CMOSIS20_MAX_CHANNELS;
-	line_size = (1 + CMOSIS20_PIXELS_PER_CHANNEL) * 32 / 2;
+	max_channels = CMOSIS_MAX_CHANNELS;
+	line_size = ctx->data_line_size;
 	break;
      default:
 	pcilib_warning("Unsupported version (%u) of frame format...", format);
@@ -92,6 +89,7 @@ int ipecamera_compute_buffer_size(ipecamera_t *ctx, ipecamera_format_t format, s
 
 
 static int ipecamera_parse_header(ipecamera_t *ctx, ipecamera_payload_t *buf, size_t buf_size) {
+    int err;
     int last = buf[0] & 1;
     int version = (buf[0] >> 1) & 7;
     size_t size = 0, n_lines;
@@ -129,7 +127,9 @@ static int ipecamera_parse_header(ipecamera_t *ctx, ipecamera_payload_t *buf, si
     }
 
     size += CMOSIS_FRAME_HEADER_SIZE;
-    ipecamera_compute_buffer_size(ctx, format, size, n_lines);
+
+    err = ipecamera_compute_buffer_size(ctx, format, size, n_lines);
+    if (err) return 0;
 
 	// Returns total size of found headers or 0 on the error
     return size;
@@ -348,7 +348,7 @@ void *ipecamera_reader_thread(void *user) {
 		if ((!err)&&(value&0x2FFFFFFF)) {
 		    pcilib_warning("Camera stuck in busy, trying to recover...");
 		    GET_REG(control_reg, saved);
-		    SET_REG(control_reg, IPECAMERA_IDLE);
+		    SET_REG(control_reg, IPECAMERA_IDLE|(saved&0xFFFF0000));
 		    while ((value&0x2FFFFFFF)&&(ctx->run_reader)) {
 			usleep(IPECAMERA_NOFRAME_SLEEP);
 		    }