[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Dalsa-1M30P / driver not working?




Hello Mike!

On Tue, 16 Jan 2001, Dr. Michael Albert wrote:

> Dear Friend:
> 
> Again, I'd like to thank Mr. Stein for his help.  But I still
> have problems.
> 
> The configuration:  a Dalsa 1M30P camera connected to an IC-PCI
> frame grabber with AM-DIG acquisition module and probably 4M
> of memory.  The system is a 2-processor pentium "passive
> backplane/single board" computer with 132M of memory.  The 
> computer has been lent to us while we evaluate the 1M30P, so 
> I don't have complete documentation (Windows on the machine at 
> arrival, but we were having other problems with Windows).  The 
> currently installed Linux is the Mandrake 7.1 distribution
> (2.2.15-4mdksmp), and I have the revision 0.7.1 devie driver.
> 
> The first problem is I don't have a proper .cam file for
> this camera, so I can't use test_itifg.  Has anyone tried 
> this camera before?

Can you send me a windows config file for this camera (builded by the
windows configurator or downloaded from iti)? - Then I can adjust it for
you.
 
> I was able to compile and load the device driver.  When 
> I open up the /dev/ic0idI device I get the following results
> for the following ioctl's (the ioctl calls return successfully
> also):
> 
>    GIOC_GE_GET_PAGEDSIZE    1576960
>    GIOC_GE_GET_RAWSIZE      1572864
>    GIOC_GE_GET_WIDTH           1024
>    GIOC_GE_GET_HEIGHT           768
>    GIOC_GE_GET_CAMERA             0
>    GIOC_GE_GET_DEPTH             16
> 
> The camera is supposed to have a 1024x1024 active area with 
> 12 bit digitization.  1024*1024*3/2 = 1572864 = 1024*768*2, 
> so the  RAWSIZE almost makes sense, except that there should be
> an additonal 2x20 light-shielded and 2x4 isolation pixels
> on each row, and there should be an extra 6 isolation rows.

These are the default settings of the driver, I strongly recommend to use
a config file and call ioctl GE_SET_CAMCNF (I know, this is not possible
without a config file).
  
> If I just run the above ioctl's things are ok.  If I 
> additionally mmap PAGED_SIZE of /dev/zero and try reading from 
> the camera, the read fails (I'll reproduce the code below,
> and I'm using the serial port on the camera to program it
> for an external trigger) with a "No data available" error. 
> After this, any program which I attempt to start immediately
> has a segmentation fault (and since I can't run shutdown, I
> cycle power on the system).

The code looks good (again: except of the lack to call GE_SET_CAMCNF).
Perhaps you should try a non-smp kernel and the debugging module
(itifg_g.o) to isolate the problems at first!
Also a clearing of the hole mmaped buffer before reading you should try.
(Usually this is not needed, but ...)
At last a mlock the buffer (see test_itifg.c) before reading is worth
testing. You have to be root to do this.

					matthias

> I thank you in advance for any advice or help you can render.
> I'd really like to get this to work and would be willing
> to experiment a quite a bit.
> 
> Sincerely,
>   Mike
> 
> P.S. Here is a listing of the code I was trying to use--note, running
> as a normal user, not root.
> 
> #include <iostream.h>
> #include <unistd.h>
> #include <stdlib.h>
> #include <fcntl.h>
> #include <errno.h>
> #include <string.h>
> #include <sys/mman.h>
> 
> #include "../CAMERA/itifg-0.7.1/itifgExt.h"
> 
> char buf[2048];
> 
> int main(int argc, char *argv[])
> {
>   int fd = open("/dev/ic0idI",O_RDONLY);
>   //int fd = open("/dev/ic2idI",O_RDONLY);
>   if(fd<0){ cerr << "open failed:" << strerror(errno) << endl; exit(1); }
> 
>   size_t paged_size;
>   if( ioctl(fd, GIOC_GE_GET_PAGEDSIZE, &paged_size) < 0 ){
>     cout << "GIOC_GE_GET_PAGEDSIZE: " << strerror(errno) << endl;
>     exit(1);
>   }
>   cout << "paged_size = " << paged_size << endl;
> 
>    
>   size_t raw_size;
>   if( ioctl(fd, GIOC_GE_GET_RAWSIZE, &raw_size) < 0 ){
>     cout << "GIOC_GE_GET_RAWSIZE: " << strerror(errno) << endl;
>     exit(1);
>   }
>   cout << "raw_size = " << raw_size << endl;
> 
>   short width;
>   if( ioctl(fd, GIOC_GE_GET_WIDTH, &width) < 0 ){
>     cout << "GIOC_GE_GET_WIDTH: " << strerror(errno) << endl;
>     exit(1);
>   }
>   cout << "width = " << width << endl;
>  
>   short height;
>   if( ioctl(fd, GIOC_GE_GET_HEIGHT, &height) < 0 ){
>     cout << "GIOC_GE_GET_HEIGHT: " << strerror(errno) << endl;
>     exit(1);
>   }
>   cout << "height = " << height << endl;
> 
>   int camera_id;
>   if( ioctl(fd, GIOC_GE_GET_CAMERA, &camera_id) < 0 ){
>     cout << "GIOC_GE_GET_CAMERA: " << strerror(errno) << endl;
>     exit(1);
>   }
>   cout << "camera_id = " << camera_id << endl;
> 
>   int depth;
>   if( ioctl(fd, GIOC_GE_GET_DEPTH, &depth) < 0 ){
>     cout << "GIOC_GE_GET_DEPTH: " << strerror(errno) << endl;
>     exit(1);
>   }
>   cout << "depth = " << depth << endl;
> 
>   int zerofd = open("/dev/zero",O_RDONLY);
>   if(zerofd<0){ cout << "can't open zero??" << endl; exit(1); }
>  
>   void* ptr = mmap(0, paged_size, PROT_READ|PROT_WRITE,
>                         MAP_PRIVATE, zerofd, 0);
>   if(ptr==0){ cout << "can't mmap zero???" << endl; exit(1); }
> 
>   struct timeval timeout;
>   timeout.tv_sec = 5; timeout.tv_usec = 0;
>   if( ioctl(fd, GIOC_GE_SET_TIMEOUT, &timeout) < 0 ){
>     cout << "GIOC_GE_SET_TIMEOUT: " << strerror(errno) << endl;
>     exit(1);
>   }
> 
> 
>   int nread = read(fd, ptr, paged_size);
>   if( nread<0 ){
>      cout << strerror(errno) << endl; 
>   }else{
>     cout << "nread = " << nread  << endl;
>   }
> }
> 
> 
> 
-------------------------------------------------------------------------------
GOM mbH                                                 Tel.: ++49 531/3804-330
Gesellschaft fuer optische Messtechnik                  Fax.: ++49 531/3804-333
Rebenring 33                                            Mail: M.Stein@gom.com
38106 Braunschweig GERMANY                              http://www.gom.com
-------------------------------------------------------------------------------