diff options
| -rw-r--r-- | ipecamera/image.c | 94 | ||||
| -rw-r--r-- | ipecamera/model.h | 1 | 
2 files changed, 63 insertions, 32 deletions
| diff --git a/ipecamera/image.c b/ipecamera/image.c index 0e4a849..29ca9c1 100644 --- a/ipecamera/image.c +++ b/ipecamera/image.c @@ -23,31 +23,36 @@  #endif /* IPECAMERA_DEBUG */ -#define IPECAMERA_SLEEP_TIME 250000 +#define IPECAMERA_SLEEP_TIME 250000 // Michele thinks 250 should be enough, but reset failing in this case +#define IPECAMERA_NEXT_FRAME_DELAY 30000 // please don't change this value --> sync between End Of Readout and next Frame Req, by Michele  +#define IPECAMERA_WAIT_FRAME_RCVD_TIME 0 /* by Uros ,wait 6 ms */  #define IPECAMERA_MAX_LINES 1088  #define IPECAMERA_DEFAULT_BUFFER_SIZE 10  #define IPECAMERA_EXPECTED_STATUS 0x08409FFFF -//#define IPECAMERA_EXPECTED_STATUS 0x0049FFFF +#define IPECAMERA_END_OF_SEQUENCE 0x1F001001  #define IPECAMERA_MAX_CHANNELS 16  #define IPECAMERA_PIXELS_PER_CHANNEL 128  #define IPECAMERA_WIDTH (IPECAMERA_MAX_CHANNELS * IPECAMERA_PIXELS_PER_CHANNEL) -#define IPECAMERA_HEIGHT 1088 +#define IPECAMERA_HEIGHT 1088 //1088 + +#if IPECAMERA_HEIGHT < IPECAMERA_MAX_LINES +# undef IPECAMERA_MAX_LINES +# define IPECAMERA_MAX_LINES IPECAMERA_HEIGHT +#endif   //#define IPECAMERA_MEMORY  -//#define IPECAMERA_FRAME_REQUEST 0x149 -//#define IPECAMERA_IDLE 		0x141 -#define IPECAMERA_FRAME_REQUEST 0x1E9 -#define IPECAMERA_READOUT	0x3E1 -#define IPECAMERA_IDLE 		0x1E1 +#define IPECAMERA_FRAME_REQUEST 		0x1E9 +#define IPECAMERA_READOUT			0x3E1 +#define IPECAMERA_IDLE 				0x1E1 +#define IPECAMERA_START_INTERNAL_STIMULI 	0x1F1 +  #define IPECAMERA_WRITE_RAW  #define IPECAMERA_REORDER_CHANNELS -  #ifdef IPECAMERA_REORDER_CHANNELS -//int ipecamera_channel_order[10] = { 9, 7, 8, 6, 4, 2, 5, 1, 3, 0 };  int ipecamera_channel_order[IPECAMERA_MAX_CHANNELS] = { 15, 13, 14, 12, 10, 8, 11, 7, 9, 6, 5, 2, 4, 3, 0, 1 };  #endif  @@ -156,7 +161,10 @@ pcilib_context_t *ipecamera_init(pcilib_t *pcilib) {  	ctx->buffer_size = IPECAMERA_DEFAULT_BUFFER_SIZE;  	ctx->dim.bpp = sizeof(ipecamera_pixel_t) * 8; -#ifndef IPECAMERA_DMA_ADDRESS +#ifdef IPECAMERA_DMA_ADDRESS +	    // We need DMA engine initialized to resolve DMA registers +//	FIND_REG(packet_len_reg, "fpga", "xrawdata_packet_length"); +#else  /* IPECAMERA_DMA_ADDRESS */  	ctx->data = pcilib_resolve_data_space(pcilib, 0, &ctx->size);  	if (!ctx->data) {  	    err = -1; @@ -174,8 +182,6 @@ pcilib_context_t *ipecamera_init(pcilib_t *pcilib) {  	FIND_REG(exposure_reg, "cmosis", "exp_time");  	FIND_REG(flip_reg, "cmosis", "image_flipping"); -	FIND_REG(packet_len_reg, "dma", "xrawdata_packet_length"); -  	ctx->rdma = PCILIB_DMA_ENGINE_INVALID;  	ctx->wdma = PCILIB_DMA_ENGINE_INVALID; @@ -206,6 +212,7 @@ pcilib_dma_context_t *ipecamera_init_dma(pcilib_context_t *vctx) {  	return NULL;      } +  #ifdef IPECAMERA_DMA_R3      return model_info->dma_api->init(ctx->pcilib, PCILIB_NWL_MODIFICATION_IPECAMERA, NULL);  #else @@ -322,10 +329,10 @@ int ipecamera_start(pcilib_context_t *vctx, pcilib_event_t event_mask, pcilib_ev      if (err) return err; -#ifdef IPECAMERA_DMA_ADDRESS -    SET_REG(packet_len_reg, IPECAMERA_DMA_PACKET_LENGTH); -    if (err) return err; -#endif /* IPECAMERA_DMA_ADDRESS */ +//#ifdef IPECAMERA_DMA_ADDRESS +//    SET_REG(packet_len_reg, IPECAMERA_DMA_PACKET_LENGTH); +//    if (err) return err; +//#endif /* IPECAMERA_DMA_ADDRESS */      ctx->cb = cb;      ctx->cb_user = user; @@ -440,10 +447,10 @@ static int ipecamera_get_payload(ipecamera_t *ctx, ipecamera_pixel_t *pbuf, ipec      ipecamera_payload_t info = payload[0];      int channel = info&0x0F;		// 4 bits -    int line = (info>>4)&0x7FF;		// 11 bits +    const int line = (info>>4)&0x7FF;	// 11 bits  					// 1 bit is reserved -    int bpp = (info>>16)&0x0F;		// 4 bits -    int pixels = (info>>20)&0xFF;	// 8 bits +    const int bpp = (info>>16)&0x0F;	// 4 bits +    const int pixels = (info>>20)&0xFF;	// 8 bits  					// 2 bits are reserved      int header = (info>>30)&0x03;	// 2 bits @@ -451,6 +458,9 @@ static int ipecamera_get_payload(ipecamera_t *ctx, ipecamera_pixel_t *pbuf, ipec      int pix;      int pix_offset = 0; +     +    const int chan_offset = channel * IPECAMERA_PIXELS_PER_CHANNEL; +          ipecamera_payload_t data;  #ifdef IPECAMERA_REORDER_CHANNELS @@ -466,9 +476,10 @@ static int ipecamera_get_payload(ipecamera_t *ctx, ipecamera_pixel_t *pbuf, ipec      CHECK_FLAG("channel, duplicate entry for channel", ((*cbuf)&(1<<channel)) == 0, channel);  	// Fixing first lines bug +	// Matthias: Using unlikely() saves 1ms       if ((line < 2)&&(pixels == (IPECAMERA_PIXELS_PER_CHANNEL - 1))) {  	pix_offset = 1; -	pbuf[channel*IPECAMERA_PIXELS_PER_CHANNEL] = 0; +	pbuf[chan_offset] = 0;      } else {  	CHECK_FLAG("number of pixels, %li is expected", pixels == IPECAMERA_PIXELS_PER_CHANNEL, pixels, IPECAMERA_PIXELS_PER_CHANNEL);      } @@ -488,8 +499,9 @@ static int ipecamera_get_payload(ipecamera_t *ctx, ipecamera_pixel_t *pbuf, ipec          CHECK_FLAG("payload data magick", header == 3, header);  	if (err) return err; +	    // DS: Unroll          for (j = 0; j < 3; j++, pix++) { -            pbuf[channel*IPECAMERA_PIXELS_PER_CHANNEL + pix] = (data >> (10 * (2 - j))) & 0x3FF; +            pbuf[chan_offset + pix] = (data >> (10 * (2 - j))) & 0x3FF;          }      } @@ -505,7 +517,7 @@ static int ipecamera_get_payload(ipecamera_t *ctx, ipecamera_pixel_t *pbuf, ipec      for (j = 0; j < ppw; j++, pix++) {  //	pbuf[channel*IPECAMERA_PIXELS_PER_CHANNEL + pix] = (data >> (10 * (ppw - j - 1))) & 0x3FF; -        pbuf[channel*IPECAMERA_PIXELS_PER_CHANNEL + pix] = (data >> (10 * (ppw - j))) & 0x3FF; +        pbuf[chan_offset + pix] = (data >> (10 * (ppw - j))) & 0x3FF;      }          *cbuf |= (1 << channel); @@ -571,7 +583,7 @@ static int ipecamera_get_image(ipecamera_t *ctx) {      pcilib_t *pcilib = ctx->pcilib;      int num_lines; -    const int max_lines = 1;//1088;//IPECAMERA_MAX_LINES; +    const int max_lines = IPECAMERA_MAX_LINES;      const size_t line_size = (IPECAMERA_MAX_CHANNELS * (2 + IPECAMERA_PIXELS_PER_CHANNEL / 3));      const size_t hf_size = 16;      const size_t max_size = hf_size + max_lines * line_size; @@ -591,6 +603,14 @@ static int ipecamera_get_image(ipecamera_t *ctx) {      linebuf = (ipecamera_payload_t*)malloc(max_packet_size * sizeof(ipecamera_payload_t));      if (!linebuf) return PCILIB_ERROR_MEMORY; +	// DS: test +    err = pcilib_skip_dma(ctx->pcilib, ctx->rdma); +    if (err) { +	pcilib_error("Can't start benchmark, devices continuously writes unexpected data using DMA engine"); +	return err; +    } + +  #ifdef IPECAMERA_WRITE_RAW      FILE *f = fopen("raw/image.raw", "w");      if (f) fclose(f); @@ -614,7 +634,7 @@ static int ipecamera_get_image(ipecamera_t *ctx) {  	SET_REG(line_reg, i);  	SET_REG(control_reg, IPECAMERA_FRAME_REQUEST); -	usleep(IPECAMERA_SLEEP_TIME); +	usleep(IPECAMERA_WAIT_FRAME_RCVD_TIME);  	CHECK_REG(status_reg, IPECAMERA_EXPECTED_STATUS);  	SET_REG(control_reg, IPECAMERA_IDLE); @@ -632,7 +652,16 @@ static int ipecamera_get_image(ipecamera_t *ctx) {  	if (err) break;  	SET_REG(control_reg, IPECAMERA_READOUT); -		 +	    // sync between End Of Readout and next Frame Req +	usleep(IPECAMERA_NEXT_FRAME_DELAY);   + +//	usleep(1000000); +	 +//	pcilib_start_dma(ctx->pcilib, ctx->rdma, PCILIB_DMA_FLAG_PERSISTENT); +//	pcilib_stop_dma(ctx->pcilib, ctx->rdma, PCILIB_DMA_FLAGS_DEFAULT); +//	pcilib_start_dma(ctx->pcilib, ctx->rdma, PCILIB_DMA_FLAGS_DEFAULT); + +	  #ifdef IPECAMERA_DMA_ADDRESS  	size = 0;  	do { @@ -641,18 +670,19 @@ static int ipecamera_get_image(ipecamera_t *ctx) {  //	    printf("%lu %lu\n", bytes_read, size);  	} while ((err == 0)&&(size < max_packet_size * sizeof(ipecamera_payload_t))); +  #ifdef DEBUG_HARDWARE  	uint32_t regval;  	printf("===========Lines: %i - %i =========================\n", i, i + num_lines - 1); -	err = pcilib_read_register(ctx->pcilib, NULL, "reg9050", ®val); +	err = pcilib_read_register(ctx->pcilib, NULL, "status", ®val);  	printf("Status1: %i 0x%lx\n", err, regval); -	err = pcilib_read_register(ctx->pcilib, NULL, "reg9080", ®val); +	err = pcilib_read_register(ctx->pcilib, NULL, "start_address", ®val);  	printf("Start address: %i 0x%lx\n", err,  regval); -	err = pcilib_read_register(ctx->pcilib, NULL, "reg9090", ®val); +	err = pcilib_read_register(ctx->pcilib, NULL, "end_address", ®val);  	printf("End address: %i 0x%lx\n", err,  regval); -	err = pcilib_read_register(ctx->pcilib, NULL, "reg9100", ®val); +	err = pcilib_read_register(ctx->pcilib, NULL, "last_write_address", ®val);  	printf("Status2: %i 0x%lx\n", err,  regval); -	err = pcilib_read_register(ctx->pcilib, NULL, "reg9110", ®val); +	err = pcilib_read_register(ctx->pcilib, NULL, "last_write_value", ®val);  	printf("Status3: %i 0x%lx\n", err,  regval);  	err = pcilib_read_register(ctx->pcilib, NULL, "reg9160", ®val);  	printf("Add_rd_ddr: %i 0x%lx\n", err, regval); @@ -691,7 +721,7 @@ static int ipecamera_get_image(ipecamera_t *ctx) {  #endif /* IPECAMERA_DMA_ADDRESS */  	SET_REG(control_reg, IPECAMERA_IDLE); -	usleep(IPECAMERA_SLEEP_TIME); +//	usleep(IPECAMERA_SLEEP_TIME);  	CHECK_REG(status_reg, IPECAMERA_EXPECTED_STATUS);  	if (err) break; diff --git a/ipecamera/model.h b/ipecamera/model.h index 91f68ed..17f9d45 100644 --- a/ipecamera/model.h +++ b/ipecamera/model.h @@ -84,6 +84,7 @@ pcilib_register_description_t ipecamera_registers[] = {  {0x90,	0, 	32, 	0,	0, PCILIB_REGISTER_R,  PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "end_address", ""},  {0x100,	0, 	32, 	0,	0, PCILIB_REGISTER_R,  PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "last_write_address", ""},  {0x110,	0, 	32, 	0,	0, PCILIB_REGISTER_R,  PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "last_write_value", ""}, +{0x160,	0, 	32, 	0, 	0, PCILIB_REGISTER_R , PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "reg9160",  ""},  {0,	0,	0,	0,	0, 0,                  0,                        0,                     NULL, NULL}  }; | 
