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} }; |