packages/web/353/php_top/syncslave354.php

Go to the documentation of this file.
00001 <?php 
00002 function fpga_read($addr) {
00003        $fpga  = fopen('/dev/fpgaio', 'r');
00004        fseek ($fpga, $addr) ; // 32-bit registers
00005        $d = fread($fpga, 4);
00006        fclose($fpga);
00007        $regs=unpack('V*',$d); // unsigned long, little endian
00008        return $regs[1];
00009      }
00010 function fpga_write($addr,$data) {
00011        $fpga  = fopen('/dev/fpgaio', 'w');
00012        fseek ($fpga, $addr) ; // 32-bit registers
00013        fwrite($fpga, chr($data & 0xff).chr(($data>>8) & 0xff).chr(($data>>16) & 0xff).chr(($data>>24) & 0xff));
00014        fclose($fpga);
00015     }
00016 
00017 function sendi2c16($register_address,$d0=0) {
00018    $i2c  = fopen('/dev/xi2c16', 'w');
00019    fseek ($i2c, 2*$register_address) ; //Micron sensor slave 0xba
00020    fwrite($i2c, chr (floor($d0/256)).chr ($d0-256*floor($d0/256)));
00021    fclose($i2c);
00022 }
00023 
00024 function i2cread16 ($start,$length=256) {
00025    $i2c  = fopen('/dev/xi2c16', 'r');
00026    fseek ($i2c, 2*$start) ; // 16-bit registers
00027    $data = fread($i2c, 2*$length);
00028    fclose($i2c);
00029    $regs=unpack('n*',$data);
00030 //   print_r($regs);
00031    echo "<table>\n";
00032    for ($i=0; $i<$length; $i+=16){
00033      printf("<tr><td>%x</td>",$i);
00034      for ($j=1; $j<17; $j++){
00035        printf("<td>%x</td>",$regs[$i+$j]);
00036      }
00037      echo "</tr>\n";
00038    }
00039    echo "</table>\n";
00040 }
00041 
00042  $trigger=$_GET['trigger'];
00043  $delay=$_GET['delay'];
00044  $exit=$_GET['exit']; // exit sync mode, resume continuous acquisition (may need to increase vblank!)
00045 
00046  if ($exit) {
00047    $cmdfile=fopen('/dev/sensorpars', 'r');
00048    fseek ($cmdfile,0x0d, SEEK_END) ; // stop compressor, 0x0a - start
00049    fclose($cmdfile);
00050 
00051     exec ("fpcf -c c 1"); // reset bit 12 of the control register,ARO (TRIGGER) output will just follow level on CR[10]
00052    sendi2c16(0x4806,0x400); //should be enough, but maybe too slow - ccam.cgi will change that
00053 // continuous mode
00054    sendi2c16(0x481e,0x4006); //snapshot - 0x4106
00055 //set continuous compression
00056   exit (0);
00057  }
00058 
00059 
00060  if ($trigger && is_numeric ($trigger)) $trigger=$trigger+0;
00061  else $trigger=0xb00000; // gpio[11] -\_, gpio[100 _/-
00062 
00063  if ($delay && is_numeric ($delay))   $delay=$delay+0;
00064  else $delay=0;
00065 
00066 
00067 
00068     fpga_write(0x7b, 0x1); // actually it is a bug in FPGA - needed to ennable delay counter
00069 
00070 //program trigger condition to be 10 on 2 MSBs
00071 $trigger_delay=$delay;
00072     fpga_write(0x78, $trigger);
00073 // program trigger delay
00074     fpga_write(0x79, $trigger_delay);
00075 // enable trigger output
00076     exec ("fpcf -c c 2"); // set bit 12 of the control register
00077 // change sensor to snapshot mode:
00078 // set minimal vblank
00079    sendi2c16(0x4806,0x19);
00080 // snapshot mode
00081    sendi2c16(0x481e,0x4106); //continuous - 0x4006
00082 //wait pending frames to finish (not really important, but makes sure useful frames in circbuf start from 0)
00083    sleep (1);
00084 //set continuous compression
00085    $cmdfile=fopen('/dev/sensorpars', 'r');
00086    fseek ($cmdfile,0x0a, SEEK_END) ; // run compressor, 0x0d - stop
00087    fclose($cmdfile);
00088 //i2cread16(0x4800,0x100);
00089 ?> 

Generated on Fri Nov 28 00:06:25 2008 for elphel by  doxygen 1.5.1