Commit 9ca3b91f authored by Andrey Filippov's avatar Andrey Filippov

made late histogram driver init (so php can be started early), added options for ASAP parameters

parent dd32d2b0
...@@ -197,6 +197,7 @@ ...@@ -197,6 +197,7 @@
*! *!
*/ */
#define DELAY_HISTOGRAMS_INIT 1
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include "config.h" #include "config.h"
...@@ -292,7 +293,7 @@ PHP_INI_END() ...@@ -292,7 +293,7 @@ PHP_INI_END()
//!call before any access to sensor parameters/functions //!call before any access to sensor parameters/functions
static void init_sens() { static void init_sens() {
} }
static void php_elphel_init_histograms(void);
/** /**
* @brief See if the name ends with __A,__B,__c,__a,__b.__c * @brief See if the name ends with __A,__B,__c,__a,__b.__c
* @param name constant name, possibly ending with a suffix __A,__B,__c,__a,__b or __c * @param name constant name, possibly ending with a suffix __A,__B,__c,__a,__b or __c
...@@ -736,13 +737,14 @@ PHP_FUNCTION(elphel_get_P_arr) ...@@ -736,13 +737,14 @@ PHP_FUNCTION(elphel_get_P_arr)
* @brief common part of elphel_set_P_value() and elphel_compressor_*() * @brief common part of elphel_set_P_value() and elphel_compressor_*()
* @param addr register address (with possible flags) * @param addr register address (with possible flags)
* @param data data to write * @param data data to write
* @param frame frame to write (<0) - use current + FRAME_DEAFAULT_AHEAD * @param frame frame to write (-1 - use current + FRAME_DEAFAULT_AHEAD, < -1: use ASAP
* @param flags additional flags (0) - none * @param flags additional flags (0) - none
* @return <0 - -errno ( error), otherwise frame used * @return <0 - -errno ( error), otherwise frame used
*/ */
long elphel_set_P_value_common(long port, long addr, long data, long frame, long flags) { long elphel_set_P_value_common(long port, long addr, long data, long frame, long flags) {
unsigned long write_data[4]; unsigned long write_data[4];
unsigned long uframe;
long maddr; long maddr;
///shortcut for global parameters - directly mmaped ///shortcut for global parameters - directly mmaped
if ((port < 0) || (port > SENSOR_PORTS)) if ((port < 0) || (port > SENSOR_PORTS))
...@@ -755,22 +757,22 @@ long elphel_set_P_value_common(long port, long addr, long data, long frame, long ...@@ -755,22 +757,22 @@ long elphel_set_P_value_common(long port, long addr, long data, long frame, long
ELPHEL_GLOBALPARS(port, maddr)=data; ELPHEL_GLOBALPARS(port, maddr)=data;
return 0; return 0;
} }
if (frame <0) { if (frame == -1) uframe = ELPHEL_GLOBALPARS(port, G_THIS_FRAME) + FRAME_DEAFAULT_AHEAD; // old: use earliest frame
frame=ELPHEL_GLOBALPARS(port, G_THIS_FRAME) + FRAME_DEAFAULT_AHEAD; else if (frame == -2) uframe = 0xffffffffL; // (new nc393: use ASAP mode)
} else uframe = (unsigned long) frame;
flags |= (flags << 16); /// will accept flags both shifted and not shifted flags |= (flags << 16); /// will accept flags both shifted and not shifted
flags &=0xffff0000; flags &=0xffff0000;
if ((addr<0) ||((maddr >= (sizeof (struct framepars_t) >>2)) && ( (addr & 0xff00) != 0xff00 ) )) { if ((addr<0) ||((maddr >= (sizeof (struct framepars_t) >>2)) && ( (addr & 0xff00) != 0xff00 ) )) {
return -1; return -1;
} }
write_data[0]=FRAMEPARS_SETFRAME; write_data[0]=FRAMEPARS_SETFRAME;
write_data[1]=frame; write_data[1]=uframe;
write_data[2]= addr | flags; write_data[2]= addr | flags;
write_data[3]= data; write_data[3]= data;
long rslt=write(ELPHEL_G(fd_fparmsall[port]), write_data, sizeof(write_data)); long rslt=write(ELPHEL_G(fd_fparmsall[port]), write_data, sizeof(write_data));
// if (rslt<0) rslt =-errno; // if (rslt<0) rslt =-errno;
if (rslt<0) return -errno; if (rslt<0) return -errno;
if (rslt == sizeof( write_data )) return frame; if (rslt == sizeof( write_data )) return (frame >=0)? frame : 0; // does not work with frame> 0x7fffffff;
return -1; return -1;
} }
...@@ -1287,6 +1289,10 @@ PHP_FUNCTION(elphel_histogram_get_raw) ...@@ -1287,6 +1289,10 @@ PHP_FUNCTION(elphel_histogram_get_raw)
frame=ELPHEL_GLOBALPARS(port, G_THIS_FRAME)-1; frame=ELPHEL_GLOBALPARS(port, G_THIS_FRAME)-1;
} }
#ifdef DELAY_HISTOGRAMS_INIT
if (ELPHEL_G(fd_histogram_cache) <0) php_elphel_init_histograms();
#endif
needed &= 0xfff; needed &= 0xfff;
total_hist_entries = lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_SET_CHN + (4 * port) + sub_chn, SEEK_END); /// specify port/sub-channel is needed total_hist_entries = lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_SET_CHN + (4 * port) + sub_chn, SEEK_END); /// specify port/sub-channel is needed
lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_WAIT_C, SEEK_END); /// wait for all histograms, not just Y (G1) lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_WAIT_C, SEEK_END); /// wait for all histograms, not just Y (G1)
...@@ -1345,6 +1351,9 @@ PHP_FUNCTION(elphel_histogram_get) ...@@ -1345,6 +1351,9 @@ PHP_FUNCTION(elphel_histogram_get)
if (frame <0) { if (frame <0) {
frame=ELPHEL_GLOBALPARS(port, G_THIS_FRAME)-1; frame=ELPHEL_GLOBALPARS(port, G_THIS_FRAME)-1;
} }
#ifdef DELAY_HISTOGRAMS_INIT
if (ELPHEL_G(fd_histogram_cache) <0) php_elphel_init_histograms();
#endif
needed &= 0xfff; needed &= 0xfff;
total_hist_entries= lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_SET_CHN + (4 * port) + sub_chn, SEEK_END); /// specify port/sub-channel is needed total_hist_entries= lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_SET_CHN + (4 * port) + sub_chn, SEEK_END); /// specify port/sub-channel is needed
...@@ -2101,6 +2110,9 @@ int get_histogram_index (long port, long sub_chn, long color,long frame, long ne ...@@ -2101,6 +2110,9 @@ int get_histogram_index (long port, long sub_chn, long color,long frame, long ne
if ((color<0) || (color >= 4)) return -1; /// wrong color if ((color<0) || (color >= 4)) return -1; /// wrong color
if ((port <0) || (port >= SENSOR_PORTS)) return -1; if ((port <0) || (port >= SENSOR_PORTS)) return -1;
if ((sub_chn <0) || (sub_chn >= MAX_SENSORS)) return -1; if ((sub_chn <0) || (sub_chn >= MAX_SENSORS)) return -1;
#ifdef DELAY_HISTOGRAMS_INIT
if (ELPHEL_G(fd_histogram_cache) <0) php_elphel_init_histograms();
#endif
lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_SET_CHN + (4 * port) + sub_chn, SEEK_END); /// specify port/sub-channel is needed lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_SET_CHN + (4 * port) + sub_chn, SEEK_END); /// specify port/sub-channel is needed
if (color == COLOR_Y_NUMBER) lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_WAIT_Y, SEEK_END); /// wait for just Y (G1) if (color == COLOR_Y_NUMBER) lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_WAIT_Y, SEEK_END); /// wait for just Y (G1)
else lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_WAIT_C, SEEK_END); /// wait for all histograms, not just Y (G1) else lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_WAIT_C, SEEK_END); /// wait for all histograms, not just Y (G1)
...@@ -2165,6 +2177,9 @@ PHP_FUNCTION(elphel_histogram) ...@@ -2165,6 +2177,9 @@ PHP_FUNCTION(elphel_histogram)
if (frame <0) { if (frame <0) {
frame=ELPHEL_GLOBALPARS(port, G_THIS_FRAME)-1; frame=ELPHEL_GLOBALPARS(port, G_THIS_FRAME)-1;
} }
#ifdef DELAY_HISTOGRAMS_INIT
if (!ELPHEL_G(histogram_cache)) php_elphel_init_histograms();
#endif
if (((hist_index=get_histogram_index (port, sub_chn, color, frame, 0)))<0) RETURN_LONG (-1); if (((hist_index=get_histogram_index (port, sub_chn, color, frame, 0)))<0) RETURN_LONG (-1);
llevel=0x10000*dlevel; llevel=0x10000*dlevel;
if (llevel< -0.5) RETURN_LONG(-1) ; /// if input level was ==-1 - error, don't try if (llevel< -0.5) RETURN_LONG(-1) ; /// if input level was ==-1 - error, don't try
...@@ -2212,6 +2227,9 @@ PHP_FUNCTION(elphel_reverse_histogram) ...@@ -2212,6 +2227,9 @@ PHP_FUNCTION(elphel_reverse_histogram)
if (frame <0) { if (frame <0) {
frame=ELPHEL_GLOBALPARS(port, G_THIS_FRAME)-1; frame=ELPHEL_GLOBALPARS(port, G_THIS_FRAME)-1;
} }
#ifdef DELAY_HISTOGRAMS_INIT
if (!ELPHEL_G(histogram_cache)) php_elphel_init_histograms();
#endif
if (((hist_index=get_histogram_index (port, sub_chn, color, frame, 1)))<0) RETURN_LONG (-1); if (((hist_index=get_histogram_index (port, sub_chn, color, frame, 1)))<0) RETURN_LONG (-1);
///interpolate ///interpolate
hist_cumul= &(((struct histogram_stuct_t *) ELPHEL_G(histogram_cache))[hist_index].cumul_hist[color<<8]); hist_cumul= &(((struct histogram_stuct_t *) ELPHEL_G(histogram_cache))[hist_index].cumul_hist[color<<8]);
...@@ -2366,6 +2384,50 @@ static void php_elphel_init_globals(zend_elphel_globals *elphel_globals) ...@@ -2366,6 +2384,50 @@ static void php_elphel_init_globals(zend_elphel_globals *elphel_globals)
} }
#else #else
static void php_elphel_init_histograms(void){
int i, total_hist_entries;
/// (histogram.c) access to gammas
// elphel_globals->histogram_cache = NULL;
ELPHEL_G(histogram_cache) = NULL;
// elphel_globals->fd_histogram_cache= open(DEV393_PATH(DEV393_HISTOGRAM), O_RDWR); // "/dev/histogram_cache", O_RDWR);
ELPHEL_G(fd_histogram_cache)= open(DEV393_PATH(DEV393_HISTOGRAM), O_RDWR); // "/dev/histogram_cache", O_RDWR);
// if (elphel_globals->fd_histogram_cache <0) {
if (ELPHEL_G(fd_histogram_cache) <0) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not open file %s",DEV393_PATH(DEV393_HISTOGRAM));
return ;
}
for (i=0;i<16;i++) {
// Channel 0 is not always present (lseek returns -1)
// total_hist_entries = lseek(elphel_globals->fd_histogram_cache, LSEEK_HIST_SET_CHN + i, SEEK_END); /// specify port/sub-channel is needed
total_hist_entries = lseek(ELPHEL_G(fd_histogram_cache), LSEEK_HIST_SET_CHN + i, SEEK_END); /// specify port/sub-channel is needed
if (total_hist_entries>0) break;
}
//! now try to mmap
// elphel_globals->histogram_cache = (struct histogram_stuct_t *) mmap(0, sizeof (struct histogram_stuct_t) * total_hist_entries, PROT_READ, MAP_SHARED, elphel_globals->fd_histogram_cache, 0);
ELPHEL_G(histogram_cache)= (struct histogram_stuct_t *) mmap(0,
sizeof (struct histogram_stuct_t) * total_hist_entries,
PROT_READ,
MAP_SHARED,
ELPHEL_G(fd_histogram_cache),
0);
// ELPHEL_G(histogram_cache)= mmap(0, sizeof (struct histogram_stuct_t) * total_hist_entries, PROT_READ, MAP_SHARED, elphel_globals->fd_histogram_cache, 0);
// if((int)elphel_globals->histogram_cache == -1) {
if((int) ELPHEL_G(histogram_cache) == -1) {
// elphel_globals->histogram_cache=NULL;
ELPHEL_G(histogram_cache)=NULL;
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Error in mmap histogram_cache, total_hist_entries=0x%x",total_hist_entries);
// close (elphel_globals->fd_histogram_cache);
close (ELPHEL_G(fd_histogram_cache));
// elphel_globals->fd_histogram_cache = -1;
ELPHEL_G(fd_histogram_cache) = -1;
return ;
}
}
static void php_elphel_init_globals(zend_elphel_globals *elphel_globals) static void php_elphel_init_globals(zend_elphel_globals *elphel_globals)
{ {
const char *frameparsPaths[] = { DEV393_PATH(DEV393_FRAMEPARS0), DEV393_PATH(DEV393_FRAMEPARS1), const char *frameparsPaths[] = { DEV393_PATH(DEV393_FRAMEPARS0), DEV393_PATH(DEV393_FRAMEPARS1),
...@@ -2430,6 +2492,9 @@ static void php_elphel_init_globals(zend_elphel_globals *elphel_globals) ...@@ -2430,6 +2492,9 @@ static void php_elphel_init_globals(zend_elphel_globals *elphel_globals)
///debug ///debug
/// (histogram.c) access to gammas /// (histogram.c) access to gammas
elphel_globals->histogram_cache = NULL; elphel_globals->histogram_cache = NULL;
#ifdef DELAY_HISTOGRAMS_INIT
elphel_globals->fd_histogram_cache= -1;
#else
elphel_globals->fd_histogram_cache= open(DEV393_PATH(DEV393_HISTOGRAM), O_RDWR); // "/dev/histogram_cache", O_RDWR); elphel_globals->fd_histogram_cache= open(DEV393_PATH(DEV393_HISTOGRAM), O_RDWR); // "/dev/histogram_cache", O_RDWR);
if (elphel_globals->fd_histogram_cache <0) { if (elphel_globals->fd_histogram_cache <0) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not open file %s",DEV393_PATH(DEV393_HISTOGRAM)); php_error_docref(NULL TSRMLS_CC, E_ERROR, "Can not open file %s",DEV393_PATH(DEV393_HISTOGRAM));
...@@ -2449,7 +2514,7 @@ static void php_elphel_init_globals(zend_elphel_globals *elphel_globals) ...@@ -2449,7 +2514,7 @@ static void php_elphel_init_globals(zend_elphel_globals *elphel_globals)
elphel_globals->fd_histogram_cache = -1; elphel_globals->fd_histogram_cache = -1;
return ; return ;
} }
#endif
//! Now - same for /dev/circbuf //! Now - same for /dev/circbuf
// int dbg_i; // int dbg_i;
for (port = 0; port < SENSOR_PORTS; port++){ for (port = 0; port < SENSOR_PORTS; port++){
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment