Commit dda8fb0a authored by Oleg Dzhimiev's avatar Oleg Dzhimiev
Browse files

added frame in video buffer selecting

parent dc96fe17
Loading
Loading
Loading
Loading
+24 −2
Original line number Original line Diff line number Diff line
@@ -94,6 +94,7 @@ static struct elphel_video_buf_t buffer_settings = { ///< some default settings,
        .frames_in_buffer = {         2,          2,          2,          2}  /* Number of frames in channel 3 buffer */
        .frames_in_buffer = {         2,          2,          2,          2}  /* Number of frames in channel 3 buffer */
};
};


static int video_frame_number = 0;
static int membridge_direction = 0; // 0 - from pl to ps, 1 - from ps to pl
static int membridge_direction = 0; // 0 - from pl to ps, 1 - from ps to pl
static int hardware_initialized = 0;
static int hardware_initialized = 0;


@@ -139,6 +140,7 @@ int setup_membridge_system_memory(
int setup_membridge_memory(
int setup_membridge_memory(
		int num_sensor,       ///< sensor port number (0..3)
		int num_sensor,       ///< sensor port number (0..3)
		int write_direction,  ///< 0 - from fpga mem to system mem, 1 - otherwise
		int write_direction,  ///< 0 - from fpga mem to system mem, 1 - otherwise
		int video_frame_number, ///< 0 or 1 for now
        int window_width,     ///< 13-bit - in 8*16=128 bit bursts
        int window_width,     ///< 13-bit - in 8*16=128 bit bursts
        int window_height,    ///< 16-bit window height (in scan lines)
        int window_height,    ///< 16-bit window height (in scan lines)
        int window_left,      ///< 13-bit window left margin in 8-bursts (16 bytes)
        int window_left,      ///< 13-bit window left margin in 8-bursts (16 bytes)
@@ -162,6 +164,12 @@ int setup_membridge_memory(
   x393_mcntrl_window_left_top_t          window_left_top =       {.d32=0};
   x393_mcntrl_window_left_top_t          window_left_top =       {.d32=0};
   x393_mcntrl_window_startx_starty_t     window_startx_starty =  {.d32=0};
   x393_mcntrl_window_startx_starty_t     window_startx_starty =  {.d32=0};


   if (video_frame_number>last_frame_num){
	   video_frame_number = last_frame_num;
   }

   frame_sa += frame_sa_inc*video_frame_number;

   window_frame_sa.frame_sa =             frame_sa;
   window_frame_sa.frame_sa =             frame_sa;
   window_frame_sa_inc.frame_sa_inc =     frame_sa_inc;
   window_frame_sa_inc.frame_sa_inc =     frame_sa_inc;
   window_last_frame_num.last_frame_num = last_frame_num;
   window_last_frame_num.last_frame_num = last_frame_num;
@@ -744,6 +752,7 @@ int membridge_start(int sensor_port, unsigned long target_frame){


     setup_membridge_memory(sensor_port, ///< sensor port number (0..3)
     setup_membridge_memory(sensor_port, ///< sensor port number (0..3)
     					   0,                     ///< 0 - from fpga mem to system mem, 1 - otherwise
     					   0,                     ///< 0 - from fpga mem to system mem, 1 - otherwise
     					   video_frame_number,    ///< 0/1 - for now, frame number in video memory
 						   width_bursts,          ///< 13-bit - in 8*16=128 bit bursts
 						   width_bursts,          ///< 13-bit - in 8*16=128 bit bursts
 						   height_marg,           ///< 16-bit window height (in scan lines)
 						   height_marg,           ///< 16-bit window height (in scan lines)
 						   0,                     ///< 13-bit window left margin in 8-bursts (16 bytes)
 						   0,                     ///< 13-bit window left margin in 8-bursts (16 bytes)
@@ -776,11 +785,11 @@ int membridge_start(int sensor_port, unsigned long target_frame){
	*/
	*/


	wait_event_interruptible(videomem_wait_queue, membridge_is_busy()==0);
	wait_event_interruptible(videomem_wait_queue, membridge_is_busy()==0);
	pr_debug("Got back from interrupt\n");


	status = x393_membridge_status();
	status = x393_membridge_status();
	pr_debug("membridge status is %d\n",status.busy);
	pr_debug("membridge status is %d\n",status.busy);



	//NOTES:
	//NOTES:


	//// get this frame number
	//// get this frame number
@@ -1057,7 +1066,6 @@ static irqreturn_t videomem_irq_handler(int irq, ///< [in] irq interru
    ctrl_interrupts.interrupt_cmd = X393_IRQ_RESET;
    ctrl_interrupts.interrupt_cmd = X393_IRQ_RESET;


    //TODO: Do what is needed here
    //TODO: Do what is needed here
    pr_info("Wake up, videomem interrupt received!!!\n");
    x393_membridge_ctrl_irq(ctrl_interrupts); // reset interrupt
    x393_membridge_ctrl_irq(ctrl_interrupts); // reset interrupt
    membridge_locked = 0;
    membridge_locked = 0;
    wake_up_interruptible(&videomem_wait_queue);
    wake_up_interruptible(&videomem_wait_queue);
@@ -1101,6 +1109,11 @@ static ssize_t get_membridge_status(struct device *dev, struct device_attribute
    return sprintf(buf,"0x%08x\n", status);
    return sprintf(buf,"0x%08x\n", status);
}
}


static ssize_t get_video_frame_num(struct device *dev, struct device_attribute *attr, char *buf)
{
    return sprintf(buf,"%d\n", video_frame_number);
}

static ssize_t store_frame_start(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
static ssize_t store_frame_start(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
{
    sscanf(buf, "%i", &buffer_settings.frame_start[get_channel_from_name(attr)]);
    sscanf(buf, "%i", &buffer_settings.frame_start[get_channel_from_name(attr)]);
@@ -1171,6 +1184,12 @@ static ssize_t set_membridge3(struct device *dev, struct device_attribute *attr,
    return count;
    return count;
}
}


static ssize_t set_video_frame_num(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
	sscanf(buf, "%i", &video_frame_number);
    return count;
}

static DEVICE_ATTR(frame_start0,               SYSFS_PERMISSIONS,     show_frame_start,                store_frame_start);
static DEVICE_ATTR(frame_start0,               SYSFS_PERMISSIONS,     show_frame_start,                store_frame_start);
static DEVICE_ATTR(frame_start1,               SYSFS_PERMISSIONS,     show_frame_start,                store_frame_start);
static DEVICE_ATTR(frame_start1,               SYSFS_PERMISSIONS,     show_frame_start,                store_frame_start);
static DEVICE_ATTR(frame_start2,               SYSFS_PERMISSIONS,     show_frame_start,                store_frame_start);
static DEVICE_ATTR(frame_start2,               SYSFS_PERMISSIONS,     show_frame_start,                store_frame_start);
@@ -1194,6 +1213,8 @@ static DEVICE_ATTR(membridge_start1, SYSFS_PERMISSIONS, NULL,
static DEVICE_ATTR(membridge_start2,           SYSFS_PERMISSIONS,     NULL,            set_membridge2);
static DEVICE_ATTR(membridge_start2,           SYSFS_PERMISSIONS,     NULL,            set_membridge2);
static DEVICE_ATTR(membridge_start3,           SYSFS_PERMISSIONS,     NULL,            set_membridge3);
static DEVICE_ATTR(membridge_start3,           SYSFS_PERMISSIONS,     NULL,            set_membridge3);


static DEVICE_ATTR(video_frame_number,           SYSFS_PERMISSIONS,     get_video_frame_num,           set_video_frame_num);

static struct attribute *root_dev_attrs[] = {
static struct attribute *root_dev_attrs[] = {
        &dev_attr_frame_start0.attr,
        &dev_attr_frame_start0.attr,
        &dev_attr_frame_start1.attr,
        &dev_attr_frame_start1.attr,
@@ -1216,6 +1237,7 @@ static struct attribute *root_dev_attrs[] = {
		&dev_attr_membridge_start2.attr,
		&dev_attr_membridge_start2.attr,
		&dev_attr_membridge_start3.attr,
		&dev_attr_membridge_start3.attr,
		&dev_attr_membridge_status.attr,
		&dev_attr_membridge_status.attr,
		&dev_attr_video_frame_number.attr,
        NULL
        NULL
};
};