00001 #include <stdio.h>
00002
00003 #include <sys/socket.h>
00004 #include <netinet/in.h>
00005
00006
00007 #include <sys/ioctl.h>
00008 #include <fcntl.h>
00009 #include <stdio.h>
00010 #include <stdlib.h>
00011 #include <ctype.h>
00012 #include <errno.h>
00013 #include <unistd.h>
00014 #include <string.h>
00015
00016
00017 #include <asm/elphel/c313a.h>
00018
00019 static int dfd;
00020 #if 0
00021 static unsigned long ishad;
00022 #endif
00023
00024 static char * usage = "rev R1_0_2\n"
00025 "Usage: hello \n-r\n-w addr(0..f) data (0..ffffffff)\n" \
00026 "-sr RA - read abstract sensor register\n"\
00027 "-sr - read all 64 abstract sensor registers\n"\
00028 "-sw RA RD - write abstract sensor register\n"\
00029 "-it delays - set delays for i2c (!=0) low byte - SCL high, byte1 - SCL low,\n"\
00030 " byte2 - salve->master, byte3 master->slave\n"\
00031 "-ir BUS SA RA - read i2c register RA from slave SA bus number BUS\n"\
00032 "-iw BUS SA RA DATA - write i2c register on BUS, slave address SA, register RA data DATA\n"\
00033 "-ir - read all relevant i2c registers from slave 0x60/0x66\n"\
00034 "-iw - write all relevant i2c registers from slave 0x60/0x66\n"\
00035 "-IR SA RA - read 16-bit i2c register RA from slave SA bus number 0\n"\
00036 "-IW SA RA DATA - write 16-bit i2c register on bus 0, slave address SA, register RA data DATA\n"\
00037 "-IR - read all relevant 16-bit i2c registers from slave 0xba\n"\
00038 "-ds INDEX - read DMA descriptors as long words (4/descriptor)\n"\
00039 "-db INDEX - read DMA buffer\n"\
00040 "-xs - reset zr32112, start exposure (will remove MRST also)\n"\
00041 "-xe - end exposure, start DMA\n"\
00042 "-xx - stop DMA\n"\
00043 "-x - stop DMA/start exposure/wait keypress/end exposure\n"\
00044 " -nr address number_of_words - read data from KAI11000 board\n"\
00045 " -nw address {data1...dataN} - write data to KAI11000 board\n"\
00046 " -mi init (reset on-off) MCP board, write sync table\n"\
00047 " -mr address number_of_words - read data from MCP board\n"\
00048 " -mw address {data1...dataN} - write data to MCP board\n"\
00049 " -md program demo sequence\n"\
00050 " -ml loop reenabling external sync till <cntrl-C>\n"\
00051 " -Mi (userspace processing) init (reset on-off) MCP board, write sync table\n"\
00052 " -Mr (userspace processing) address number_of_words - read data from MCP board\n"\
00053 " -Mw (userspace processing) address {data1...dataN} - write data to MCP board\n"\
00054 " -Md (userspace processing) program demo sequence\n"\
00055 " -Ml (userspace processing) loop reenabling external sync till <cntrl-C>\n"\
00056 " -z exposure - set exposure time, start waiting for xtrn (0-stop)\n"\
00057 " -z - return camera sequencer status:\n"\
00058 " 0- stopped, 1(5ms),2 - waiting trig, 3 -exposure, 4 - readout,6 - done)\n"\
00059 " -c bit(0..1f of CR) op(0 -nop, 1 - clr, 2 - set, 3 - toggle)\n"\
00060 " -req_io - return present of IO exctension board: 0 - not found, 1 - found\n";
00061
00062
00063
00064 # if 0
00065
00066 void initMCP(void) {
00067
00068 int i;
00069 ishad = (unsigned long) ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_CR_SHADOW), NULL);
00070 if ((ishad & 0x4000) == 0) {
00071 i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad = ((ishad & MCPOtherBits) | MCPReset)));
00072 i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad = ((ishad & MCPOtherBits) | MCPNoReset)));
00073 }
00074
00075 }
00076
00077 void resetMCP(void) {
00078
00079 int i;
00080 ishad = (unsigned long) ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_CR_SHADOW), NULL);
00081 i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad = ((ishad & MCPOtherBits) | MCPReset)));
00082 i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad = ((ishad & MCPOtherBits) | MCPNoReset)));
00083
00084 }
00085
00086
00087 void MCPSendDibit(int dibit) {
00088
00089
00090 int i;
00091 if (dibit & 2) i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad ^= MCPToggleB) );
00092 else i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad ^= MCPToggleA) );
00093 if (dibit & 1) i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad ^= MCPToggleB) );
00094 else i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad ^= MCPToggleA) );
00095
00096 }
00097
00098 int MCPSendGetDibit(int dibit) {
00099
00100 int i,d;
00101
00102
00103
00104
00105
00106 d = (ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0R(1)), NULL) >>2) & 1;
00107
00108
00109 if (dibit & 2) i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad ^= MCPToggleB) );
00110 else i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad ^= MCPToggleA) );
00111
00112
00113
00114
00115
00116 d |= (ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0R(1)), NULL) >>1) & 2;
00117
00118 if (dibit & 1) i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad ^= MCPToggleB) );
00119 else i=ioctl(dfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (1) ), (ishad ^= MCPToggleA) );
00120 return d;
00121 return dibit;
00122 }
00123
00124 int MCPSendA (int wnr, int a) {
00125 int d;
00126 initMCP();
00127 MCPSendDibit(0);
00128 d=MCPSendGetDibit((wnr & 1)+1);
00129
00130 do {
00131 MCPSendDibit((a & 1)+1);
00132 a = (a >> 1);
00133
00134 } while (a);
00135 if (wnr) MCPSendDibit(3);
00136 return d;
00137 }
00138
00139 void MCPWriteD (int d) {
00140 while (d) {
00141 MCPSendDibit((d & 1)+1);
00142 d = (d >> 1);
00143 }
00144 MCPSendDibit(3);
00145 }
00146
00147 int MCPReadD (void) {
00148 int d;
00149 MCPSendDibit(3);
00150 d = MCPSendGetDibit(1);
00151 d |= MCPSendGetDibit(1) << 2;
00152 d |= MCPSendGetDibit(1) << 4;
00153 d |= MCPSendGetDibit(1) << 6;
00154 d |= MCPSendGetDibit(1) << 8;
00155 d |= MCPSendGetDibit(1) << 10;
00156 return d;
00157 }
00158
00159 void MCPWriteSyncTab(void) {
00160 int i,d;
00161 MCPSendA(1,MCPwrsynctb);
00162 for (i=0;i<256;i++) {
00163 d=-1;
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 if ((i & 0xff) == 0xff) d = 0x0;
00183 else if ((i & 0xff) == 0x00) d = 0x8;
00184 else if ((i & 0x03) == 0x02) d = 0x1;
00185 else if ((i & 0x03) == 0x01) d = 0x9;
00186 else if ((i & 0x07) == 0x04) d = 0x2;
00187 else if ((i & 0x07) == 0x03) d = 0xa;
00188 else if ((i & 0x0f) == 0x08) d = 0x3;
00189 else if ((i & 0x0f) == 0x07) d = 0xb;
00190 else if ((i & 0x1f) == 0x10) d = 0x4;
00191 else if ((i & 0x1f) == 0x0f) d = 0xc;
00192 else if ((i & 0x3f) == 0x20) d = 0x5;
00193 else if ((i & 0x3f) == 0x1f) d = 0xd;
00194 else if ((i & 0x7f) == 0x40) d = 0x6;
00195 else if ((i & 0x7f) == 0x3f) d = 0xe;
00196 else if ((i & 0xff) == 0x80) d = 0x7;
00197 else if ((i & 0xff) == 0x7f) d = 0xf;
00198
00199 if (d<0) {printf ("incomplete case in MCPWriteSyncTab\r\n");return;}
00200 MCPWriteD (d);
00201 printf("%1x",d); if ((i & 0x1f) == 0x1f) printf ("\r\n");
00202 }
00203 }
00204
00205
00206 void MCPDemoSequencer(void) {
00207
00208
00209
00210
00211 MCPSendA(1,MCPwrseq);
00212 MCPWriteD ( 0x09);
00213 MCPWriteD (0x0018);
00214 MCPWriteD ( 0x04);
00215 MCPWriteD (0x00f9);
00216 MCPWriteD ( 0x38);
00217
00218
00219 MCPSendA(1,MCPwrsmsk);
00220 MCPWriteD ( 0x2);
00221
00222
00223 MCPSendA(1,MCPwrsup);
00224 MCPWriteD ( 0x1);
00225
00226
00227 MCPSendA(1,MCPwrdlys);
00228 MCPWriteD ( 0x0);
00229 MCPWriteD ( 0x0);
00230 MCPWriteD ( 0x0);
00231 MCPWriteD ( 0x0);
00232 MCPWriteD ( 0x0);
00233 MCPWriteD ( 0x0);
00234 MCPWriteD ( 0x0);
00235 MCPWriteD ( 0x0);
00236
00237 MCPSendA(1,MCPwinv);
00238 MCPWriteD ( 0x1000);
00239 MCPWriteD ( 0x4048);
00240 MCPWriteD ( 0x8048);
00241 MCPWriteD ( 0xc000);
00242
00243 MCPSendA(1,MCPwinvctl);
00244 MCPWriteD ( 4);
00245
00246
00247
00248
00249 }
00250 #endif
00251
00252 int main (int argc, char *argv[]) {
00253 #define zr_init_size 72
00254 short MCP_buf[MCP_W_size+MCP_R_size];
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279 char * cp;
00280 int i,j;
00281 int devfd;
00282
00283
00284
00285
00286 unsigned long a,d, bus, sa, ra, rd;
00287
00288
00289 int mcpa;
00290 if (argc<2) {printf(usage); return 0;}
00291 if (argv[1][0] != '-'){printf(usage); return 0;}
00292
00293
00294 if(strstr(argv[1], "-req_io")) {
00295 int io_present = 0;
00296 devfd = open("/dev/ccami2c", O_RDONLY);
00297 io_present = ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_EXT_BOARD_PRESENT), 0);
00298 close(devfd);
00299 if(io_present == 0)
00300 printf("0\n");
00301 else
00302 printf("1\n");
00303 return 0;
00304 }
00305 if (argv[1][1] == 'n') {
00306 if ((argv[1][2] == 'r') || (argv[1][2] == 'R')) {
00307 if (argc<3) {printf(" should be -nr address {number_of_words}\r\n");return 0;}
00308 mcpa= strtol (argv[2],&cp,16);
00309 if ((dfd = open("/dev/sensorfpgacomm", O_RDONLY))<0) {printf("open sensorfpgacomm returned %d\r\n",dfd); return -1;};
00310
00311 i=1;
00312 if (argc>3) i=strtol (argv[3],&cp,16);
00313 j=lseek(dfd,mcpa<<1,0);
00314 if (j<0) return j;
00315 j=read(dfd,&MCP_buf[mcpa],i<<1);
00316 printf("read returned %d\r\n",j);
00317 if (j<0) return j;
00318 i=j>>1;
00319 for (j=0;j<i;j++) {
00320 if ((j & 7) == 0) {
00321 if (j > 0) printf ("\r\n");
00322 printf("%3x: ",mcpa+j);
00323 } else printf (" ");
00324 printf("%3x",MCP_buf[mcpa+j]);
00325 }
00326 printf("\r\n");
00327 close(dfd);
00328 return 0;
00329 }
00330 if ((argv[1][2] == 'w') || (argv[1][2] == 'W')) {
00331 if (argc<3) {printf(" should be -nw address {data1...dataN}\r\n");return 0;}
00332 mcpa= strtol (argv[2],&cp,16);
00333 i=mcpa;
00334 for (j=3;(j<argc) && (i>=0) && (i<MCP_W_size);j++) MCP_buf[i++]= strtol (argv[j],&cp,16);
00335 i=i-mcpa;
00336 if (i==0) return 0;
00337 if ((dfd = open("/dev/sensorfpgacomm", O_WRONLY))<0) {printf("open sensorfpgacomm returned %d\r\n",dfd); return -1;};
00338 j=lseek(dfd,mcpa<<1,0);
00339 if (j<0) return j;
00340 j=write(dfd,&MCP_buf[mcpa],i<<1);
00341 printf("write returned %d\r\n",j);
00342 if (j<0) return j;
00343 close(dfd);
00344 return 0;
00345 }
00346 printf(" only -nr ,-nw are implemented\r\n");
00347 return 0;
00348 }
00349
00350
00351
00352
00353 #if 0
00354 if (argv[1][1] == 'M'){
00355 if ((argv[1][2] == 'r') || (argv[1][2] == 'R')) {
00356 if (argc<3) {printf(" should be -NR address {number_of_words}\r\n");return 0;}
00357 mcpa= strtol (argv[2],&cp,16);
00358 dfd = open("/dev/ccam_dma.raw", O_RDWR);
00359 mcpd= MCPSendA (0, mcpa);
00360 printf ("Multiprocessor status= %x\r\n",mcpd);
00361 i=1;
00362 if (argc>3) i=strtol (argv[3],&cp,16);
00363 for (j=0;j<i;j++) {
00364 if ((j & 7) == 0) {
00365 if (j > 0) printf ("\r\n");
00366 printf("%3x: ",mcpa+j);
00367 } else printf (" ");
00368 mcpd=MCPReadD ();
00369 printf("%3x",mcpd);
00370 }
00371 printf("\r\n");
00372 close(dfd);
00373 return 0;
00374 }
00375 if ((argv[1][2] == 'w') || (argv[1][2] == 'W')) {
00376 if (argc<3) {printf(" should be -NW address {data1...dataN}\r\n");return 0;}
00377 mcpa= strtol (argv[2],&cp,16);
00378 dfd = open("/dev/ccam_dma.raw", O_RDWR);
00379 mcpd= MCPSendA (1, mcpa);
00380 printf ("Multiprocessor status= %x\r\n",mcpd);
00381 for (j=3;j<argc;j++) {
00382 mcpd= strtol (argv[j],&cp,16);
00383 MCPWriteD (mcpd);
00384 }
00385 close(dfd);
00386 return 0;
00387 }
00388 if ((argv[1][2] == 'i') || (argv[1][2] == 'I')) {
00389 dfd = open("/dev/ccam_dma.raw", O_RDWR);
00390 resetMCP();
00391 MCPWriteSyncTab();
00392 close(dfd);
00393 return 0;
00394 }
00395 if ((argv[1][2] == 'd') || (argv[1][2] == 'D')) {
00396 dfd = open("/dev/ccam_dma.raw", O_RDWR);
00397 resetMCP();
00398 MCPWriteSyncTab();
00399 MCPDemoSequencer();
00400 close(dfd);
00401 return 0;
00402 }
00403
00404 if ((argv[1][2] == 'l') || (argv[1][2] == 'L')) {
00405 printf("Turn off external trigger to exit\r\n");
00406 dfd = open("/dev/ccam_dma.raw", O_RDWR);
00407
00408 mcpd= MCPSendA (1, MCPctlgate+1);
00409 MCPWriteD (0);
00410 j=0;
00411 while (1) {
00412
00413 mcpd= MCPSendA (1, MCPctlseq+1);
00414 MCPWriteD (0);
00415
00416 i=1000;
00417 do {
00418 mcpd= MCPSendA (0, 0);
00419 i--;
00420 } while ((!(MCPReadD () & 0x4)) && (i>0));
00421 if (i == 0) {
00422
00423 mcpd= MCPSendA (1, MCPctlseq+0);
00424 MCPWriteD (0);
00425
00426 if (j==0) printf("No external trigger - it should be running\r\n");
00427 close(dfd);
00428 return 0;
00429 }
00430 j++;
00431
00432 }
00433
00434 close(dfd);
00435 return 0;
00436 }
00437
00438 printf(" only -Mr ,-Mw, -Mi, -Md and -Ml are implemented\r\n");
00439 return 0;
00440 }
00441 #endif
00442
00443
00444
00445 if (argv[1][1] == 'm') {
00446 if ((argv[1][2] == 'r') || (argv[1][2] == 'R')) {
00447 if (argc<3) {printf(" should be -nr address {number_of_words}\r\n");return 0;}
00448 mcpa= strtol (argv[2],&cp,16);
00449 if ((dfd = open("/dev/ccammcp", O_RDONLY))<0) {printf("open ccammcp returned %d\r\n",dfd); return -1;};
00450
00451 i=1;
00452 if (argc>3) i=strtol (argv[3],&cp,16);
00453 j=lseek(dfd,mcpa<<1,0);
00454 if (j<0) return j;
00455 j=read(dfd,&MCP_buf[mcpa],i<<1);
00456 printf("read returned %d\r\n",j);
00457 if (j<0) return j;
00458 i=j>>1;
00459 for (j=0;j<i;j++) {
00460 if ((j & 7) == 0) {
00461 if (j > 0) printf ("\r\n");
00462 printf("%3x: ",mcpa+j);
00463 } else printf (" ");
00464 printf("%3x",MCP_buf[mcpa+j]);
00465 }
00466 printf("\r\n");
00467 close(dfd);
00468 return 0;
00469 }
00470
00471
00472 if ((argv[1][2] == 'w') || (argv[1][2] == 'W')) {
00473 if (argc<3) {printf(" should be -nw address {data1...dataN}\r\n");return 0;}
00474 mcpa= strtol (argv[2],&cp,16);
00475 i=mcpa;
00476 for (j=3;(j<argc) && (i>=0) && (i<MCP_W_size);j++) MCP_buf[i++]= strtol (argv[j],&cp,16);
00477 i=i-mcpa;
00478 if (i==0) return 0;
00479 if ((dfd = open("/dev/ccammcp", O_WRONLY))<0) {printf("open ccammcp returned %d\r\n",dfd); return -1;};
00480 j=lseek(dfd,mcpa<<1,0);
00481 if (j<0) return j;
00482 j=write(dfd,&MCP_buf[mcpa],i<<1);
00483 printf("write returned %d\r\n",j);
00484 if (j<0) return j;
00485 close(dfd);
00486 return 0;
00487 }
00488 #if 0
00489
00490
00491 if ((argv[1][2] == 'i') || (argv[1][2] == 'I')) {
00492 dfd = open("/dev/ccamrw", O_RDWR);
00493 resetMCP();
00494 close(dfd);
00495 return 0;
00496 }
00497 if ((argv[1][2] == 'd') || (argv[1][2] == 'D')) {
00498 dfd = open("/dev/ccam_dma.raw", O_RDWR);
00499 resetMCP();
00500 MCPWriteSyncTab();
00501 MCPDemoSequencer();
00502 close(dfd);
00503 return 0;
00504 }
00505
00506
00507 if ((argv[1][2] == 'l') || (argv[1][2] == 'L')) {
00508 printf("Turn off external trigger to exit\r\n");
00509 dfd = open("/dev/ccam_dma.raw", O_RDWR);
00510
00511 mcpd= MCPSendA (1, MCPctlgate+1);
00512 MCPWriteD (0);
00513 j=0;
00514 while (1) {
00515
00516 mcpd= MCPSendA (1, MCPctlseq+1);
00517 MCPWriteD (0);
00518
00519 i=1000;
00520 do {
00521 mcpd= MCPSendA (0, 0);
00522 i--;
00523 } while ((!(MCPReadD () & 0x4)) && (i>0));
00524 if (i == 0) {
00525
00526 mcpd= MCPSendA (1, MCPctlseq+0);
00527 MCPWriteD (0);
00528
00529 if (j==0) printf("No external trigger - it should be running\r\n");
00530 close(dfd);
00531 return 0;
00532 }
00533 j++;
00534
00535 }
00536
00537 close(dfd);
00538 return 0;
00539 }
00540 #endif
00541 printf(" only -mr ,-mw, -mi, -md and -ml are implemented\r\n");
00542 return 0;
00543 }
00544
00545
00546 #if 0
00547
00548 if ((argv[1][1] == 'r') || (argv[1][1] == 'R')) {
00549 devfd = open("/dev/ccam_dma.raw", O_RDONLY);
00550 printf ("open returned - %x\r\n",devfd);
00551 for (i=0;i<4;i++) {
00552 sdata[i] = ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0R(i)), NULL);
00553 }
00554 sdata[4] = (i=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_CR_SHADOW), NULL));
00555
00556 close(devfd);
00557
00558
00559 data[4]=(data[4] & 0x3fffffff) |((data[4] & 0x40000000) << 1);
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570 printf ("data %lx %lx %lx %lx\nshadow CR %lx\r\n",
00571 data[0],
00572 data[1],
00573 data[2],
00574 data[3],
00575 data[4]);
00576 return 0;
00577
00578 }
00579
00580 if ((argv[1][1] == 'w') || (argv[1][1] == 'w')) {
00581 if (argc<4) {printf("Needs more args...\r\n"); return 0;}
00582 a=(strtol (argv[2],&cp,16) & 0xf);
00583 d=strtol (argv[3],&cp,16);
00584 printf ("command arguments got - %lx %lx\r\n", a, d);
00585 devfd = open("/dev/ccam_dma.raw", O_WRONLY);
00586 printf ("open returned - %x\r\n",devfd);
00587 i=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CSP0W (a) ), d);
00588 printf ("ioctl returned - %x\r\n",i);
00589 close(devfd);
00590 printf ("devfd closed\r\n");
00591
00592 return 0;
00593 }
00594 #endif
00595 if ((argv[1][1] == 's') || (argv[1][1] == 'S')) {
00596 if ((argv[1][2] == 'r') || (argv[1][2] == 'R')) {
00597 if (argc<3) {
00598 devfd = open("/dev/ccam_dma.raw", O_RDONLY);
00599 printf ("open returned - %x\r\n",devfd);
00600 for (i=0;i<0x40;i++) {
00601 if ((i & 0x0f)==0) printf("\r\n%2x:",i);
00602 d=ioctl(devfd, _CCCMD( CCAM_RPARS , i ), 0);
00603 printf(" %4lx", d);
00604 }
00605 printf ("\r\n");
00606 close(devfd);
00607 printf ("devfd closed\r\n");
00608 return 0;
00609 }
00610 a= strtol (argv[2],&cp,16);
00611 devfd = open("/dev/ccam_dma.raw", O_RDONLY);
00612 printf ("open returned - %x\r\n",devfd);
00613 d=ioctl(devfd, _CCCMD( CCAM_RPARS , a ), 0);
00614 printf ("sensor register %lx = %lx\r\n", a,d);
00615 close(devfd);
00616 printf ("devfd closed\r\n");
00617 return 0;
00618
00619 } else if ((argv[1][2] == 'w') || (argv[1][2] == 'W')) {
00620 if (argc<4) {printf("Needs more args...\r\n"); return 0;}
00621 a= strtol (argv[2],&cp,16);
00622 d= strtol (argv[3],&cp,16);
00623 devfd = open("/dev/ccam_dma.raw", O_WRONLY);
00624 printf ("open returned - %x\r\n",devfd);
00625 i=ioctl(devfd, _CCCMD( CCAM_WPARS , a ), d);
00626 printf ("ioctl (%x,%lx,%lx) returned - %x\r\n",devfd, _CCCMD( CCAM_WPARS , a ), d, i);
00627
00628 close(devfd);
00629 printf ("devfd closed\r\n");
00630 return 0;
00631 }
00632 }
00633
00634
00635
00636 if (argv[1][1] == 'I') {
00637 if ((argv[1][2] == 'r') || (argv[1][2] == 'R')) {
00638 if (argc<3) {
00639 devfd = open("/dev/ccam_dma.raw", O_WRONLY);
00640 j=ioctl(devfd, _CCCMD( CCAM_RPARS , P_SENSOR ), 0);
00641 printf ("P_SENSOR - %x\r\n",j);
00642 close(devfd);
00643 bus=0;
00644 devfd = open("/dev/ccami2c", O_RDONLY);
00645 printf ("open returned - %x\r\n",devfd);
00646
00647
00648 sa=0xba;
00649 if (j==52) sa=0x90;
00650 j= 256;
00651 printf("dumping all i2c data from slave address %lx\r\n",sa);
00652
00653
00654 for (i=0;i<j;i++) {
00655 if ((i & 0x0f)==0) printf("\r\n%2x:",i);
00656 d=ioctl(devfd, _IO(CMOSCAM_IOCTYPE,I2C_16_READREG), I2C_16_READARG ( sa, i));
00657 printf(" %4lx", d);
00658 }
00659 printf ("\r\n");
00660 close(devfd);
00661 printf ("devfd closed\r\n");
00662 return 0;
00663 }
00664 if (argc<4) {printf("Needs more args...\r\n"); return 0;}
00665
00666 sa= (strtol (argv[2],&cp,16) & 0xff);
00667 ra= (strtol (argv[3],&cp,16) & 0xff);
00668 devfd = open("/dev/ccami2c", O_RDONLY);
00669 printf ("open returned - %x\r\n",devfd);
00670
00671 d=ioctl(devfd, _IO(CMOSCAM_IOCTYPE,I2C_16_READREG), I2C_16_READARG (sa, ra)) ;
00672 printf ("i2c 16-bit register = %lx\r\n", d);
00673 close(devfd);
00674 printf ("devfd closed\r\n");
00675 return 0;
00676 } else if ((argv[1][2] == 'w') || (argv[1][2] == 'W')) {
00677
00678 if (argc<5) {printf("Needs more args...\r\n"); return 0;}
00679 sa= (strtol (argv[2],&cp,16) & 0xff);
00680 ra= (strtol (argv[3],&cp,16) & 0xff);
00681 rd= (strtol (argv[4],&cp,16) & 0xffff);
00682 devfd = open("/dev/ccami2c", O_WRONLY);
00683 printf ("open returned - %x\r\n",devfd);
00684
00685 d=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, I2C_16_WRITEREG ),I2C_16_WRITEARG(sa, ra, rd));
00686 printf ("i2c returned - %lx\r\n",d);
00687 close(devfd); printf ("devfd closed\r\n");
00688
00689 return 0;
00690 } else if ((argv[1][2] == 't') || (argv[1][2] == 'T')) {
00691 rd=0;
00692 if (argc>2) rd= strtol (argv[2],&cp,16);
00693 devfd = open("/dev/ccami2c", O_RDWR);
00694 printf ("open returned - %x\r\n",devfd);
00695 d=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, I2C_DELAYS ), rd);
00696 printf ("i2c timing is - %lx\r\n",d);
00697 close(devfd); printf ("devfd closed\r\n");
00698
00699 return 0;
00700 }
00701
00702
00703
00704
00705 } else if (argv[1][1] == 'i') {
00706 if ((argv[1][2] == 'r') || (argv[1][2] == 'R')) {
00707 if (argc<3) {
00708 devfd = open("/dev/ccam_dma.raw", O_WRONLY);
00709 j=ioctl(devfd, _CCCMD( CCAM_RPARS , P_SENSOR ), 0);
00710 printf ("P_SENSOR - %x\r\n",j);
00711 close(devfd);
00712
00713
00714 bus=0;
00715 devfd = open("/dev/ccami2c", O_RDONLY);
00716 printf ("open returned - %x\r\n",devfd);
00717
00718
00719 if ((j!=4) && (j!=5) && (j!=8) && (j!=9)) {
00720
00721 sa=0x66;
00722 if ((j>=0x24) && (j<0x28)) j=256;
00723 else j=192;
00724 } else {
00725 sa=0x60;
00726 j=16;
00727 }
00728 printf("dumping all i2c data from slave address %lx\r\n",sa);
00729
00730
00731 for (i=0;i<j;i++) {
00732 if ((i & 0x0f)==0) printf("\r\n%2x:",i);
00733 d=ioctl(devfd, _IO(CMOSCAM_IOCTYPE,I2C_READREG), I2C_READARG ( bus, sa, i));
00734 printf(" %2lx", d);
00735 }
00736 printf ("\r\n");
00737 close(devfd);
00738 printf ("devfd closed\r\n");
00739 return 0;
00740 }
00741 if (argc<5) {printf("Needs more args...\r\n"); return 0;}
00742
00743 bus=(strtol (argv[2],&cp,16) & 0x1);
00744 sa= (strtol (argv[3],&cp,16) & 0xff);
00745 ra= (strtol (argv[4],&cp,16) & 0xff);
00746 devfd = open("/dev/ccami2c", O_RDONLY);
00747 printf ("open returned - %x\r\n",devfd);
00748
00749 d=ioctl(devfd, _IO(CMOSCAM_IOCTYPE,I2C_READREG), I2C_READARG (bus, sa, ra)) ;
00750 printf ("i2c register = %lx\r\n", d);
00751 close(devfd);
00752 printf ("devfd closed\r\n");
00753
00754 return 0;
00755 } else if ((argv[1][2] == 'w') || (argv[1][2] == 'W')) {
00756
00757 if (argc<3) {
00758 printf("initializing zoran/fpga\r\n");
00759 return 0;
00760 }
00761
00762 if (argc<6) {printf("Needs more args...\r\n"); return 0;}
00763 bus=(strtol (argv[2],&cp,16) & 0x1);
00764 sa= (strtol (argv[3],&cp,16) & 0xff);
00765 ra= (strtol (argv[4],&cp,16) & 0xff);
00766 rd= (strtol (argv[5],&cp,16) & 0xff);
00767 devfd = open("/dev/ccami2c", O_WRONLY);
00768 printf ("open returned - %x\r\n",devfd);
00769
00770 d=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, I2C_WRITEREG ),I2C_WRITEARG(bus, sa, ra, rd));
00771 printf ("i2c returned - %lx\r\n",d);
00772 close(devfd); printf ("devfd closed\r\n");
00773
00774 return 0;
00775 } else if ((argv[1][2] == 't') || (argv[1][2] == 'T')) {
00776 rd=0;
00777 if (argc>2) rd= strtol (argv[2],&cp,16);
00778 devfd = open("/dev/ccami2c", O_RDWR);
00779 printf ("open returned - %x\r\n",devfd);
00780 d=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, I2C_DELAYS ), rd);
00781 printf ("i2c timing is - %lx\r\n",d);
00782 close(devfd); printf ("devfd closed\r\n");
00783
00784 return 0;
00785 }
00786
00787
00788
00789 #if 0
00790 } else if ((argv[1][1] == 'd') || (argv[1][1] == 'D')) {
00791 if ((argv[1][2] == 's') || (argv[1][2] == 'S')) {
00792 if (argc<3) {
00793 devfd = open("/dev/ccam_dma.raw", O_RDONLY);
00794 printf ("open returned - %x\r\n",devfd);
00795 for (i=0; i< CCAM_DESCR_SIZE; i++) {
00796 for (j=0;j<4;j++) sdata[j]= \
00797 ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_MONITOR_DMA_DESCR ), (i<<2)+j);
00798 printf ("%2x: %8lx %8lx %8lx %8lx\r\n",i,data[0],data[1],data[2],data[3]);
00799 }
00800 close(devfd); printf ("devfd closed\r\n");
00801 return 0;
00802 } else {
00803 a=(strtol (argv[2],&cp,16));
00804 devfd = open("/dev/ccam_dma.raw", O_RDONLY);
00805 printf ("open returned - %x\r\n",devfd);
00806 d=(unsigned long) ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_MONITOR_DMA_DESCR ), a);
00807 printf ("DMA descriptor [%lx:%lx] = %lx\r\n", (a>>2), (a & 3), d);
00808 close(devfd); printf ("devfd closed\r\n");
00809 return 0;
00810 }
00811 }
00812 if ((argv[1][2] == 'b') || (argv[1][2] == 'B')) {
00813 if (argc<3) a=0;
00814 else a=(strtol (argv[2],&cp,16));
00815 devfd = open("/dev/ccam_dma.raw", O_RDONLY);
00816 printf ("open returned - %x\r\n",devfd);
00817 for (i=0; i< 20; i++) {
00818 for (j=0;j<4;j++) sdata[j]= \
00819 ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_MONITOR_DMA_BUFFER ), a+(i<<2)+j);
00820 printf ("%6lx: %8lx %8lx %8lx %8lx\r\n",a+(i <<2),data[0],data[1],data[2],data[3]);
00821 }
00822 close(devfd); printf ("devfd closed\r\n");
00823 return 0;
00824 }
00825 #endif
00826 } else if (argv[1][1] == 'z'){
00827 if (argc<3) {
00828 if ((devfd = open("/dev/ccam_dma.raw", O_RDONLY))<=0) return -1;
00829 printf ("open returned - %x\r\n",devfd);
00830 i=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_MONITOR_SEQ ), 0);
00831 errno=0;
00832 j=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_MONITOR_SEQ ), 1);
00833 if (j==-1) j=-errno;
00834 printf ("Cam-sequencer state - %x, count= %x\r\n",i,j);
00835 close(devfd);
00836 return 0;
00837 } else {
00838 j= strtol (argv[2],&cp,16);
00839
00840 if ((devfd = open("/dev/ccam_dma.raw", O_WRONLY))<=0) return -1;
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851 i=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_SET_EXT_EXPOSURE ), j);
00852 close(devfd);
00853 return 0;
00854 }
00855 } else if (argv[1][1] == 'Z') {
00856 if (argc<3) {
00857 if ((devfd = open("/dev/ccam_dma.raw", O_RDONLY))<=0) return -1;
00858 printf ("open returned - %x\r\n",devfd);
00859 i=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_MONITOR_SEQ ), 0);
00860 j=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_MONITOR_SEQ ), 1);
00861 printf ("(CLI) Cam-sequencer state - %x, count= %x\r\n",i,j);
00862 close(devfd);
00863 return 0;
00864 } else {
00865 j= strtol (argv[2],&cp,16);
00866
00867 if ((devfd = open("/dev/ccam_dma.raw", O_WRONLY))<=0) return -1;
00868 if (j) {
00869 ioctl(devfd, _CCCMD(CCAM_WPARS , P_EXPOS ), j);
00870 ioctl(devfd, _CCCMD(CCAM_WPARS , P_UPDATE ), 1);
00871 i=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_SET_EXT_EXPOSURE ), 1);
00872 } else
00873 i=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_SET_EXT_EXPOSURE ), 0);
00874 i=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_SET_EXT_EXPOSURE ), j);
00875 printf ("ioctl returned - %x\r\n",i);
00876 close(devfd);
00877 return 0;
00878 }
00879 } else if ((argv[1][1] == 'c') || (argv[1][1] == 'c')){
00880
00881 if (argc<3) {printf("Needs more args (bit #, [op])\r\n"); return 0;}
00882 a=(strtol (argv[2],&cp,16) & 0x1f);
00883 d=0;
00884 if (argc>3) d=(strtol (argv[3],&cp,16) & 0x3);
00885 if ((devfd = open("/dev/ccam_dma.raw", O_RDWR))<0) return -1;
00886 i=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_CR_MODIFY), d | (a<<2));
00887 j=ioctl(devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_CR_MODIFY), 0 | (a<<2));
00888 printf ("CR[%lx]=%x (was %x)\r\n",a,j,i);
00889 close(devfd);
00890 printf ("devfd closed\r\n");
00891
00892 return 0;
00893
00894
00895
00896
00897 #if 0
00898
00899 } else if ((argv[1][1] == 'x') || (argv[1][1] == 'X')) {
00900 if (argv[1][1] == 'X') devfd = open("/dev/ccam_dma.raw", O_WRONLY);
00901 else devfd = open("/dev/ccam_dma.raw", O_WRONLY);
00902 printf ("open returned - %x\r\n",devfd);
00903 switch (argv[1][2]){
00904 case ('x'):
00905 case ('X'):{
00906 d= (unsigned long) ioctl (devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_STOP_DMA ), NULL);
00907 printf ("Stop DMA returned %lx\r\n", d);
00908 close(devfd); printf ("devfd closed\r\n");
00909 return 0;
00910 }
00911 case ('s'):
00912 case ('S'):{
00913 d= ioctl (devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_EXPOS_START ), NULL);
00914 printf ("START EXPOSURE returned %lx\r\n", d);
00915 close(devfd); printf ("devfd closed\r\n");
00916 return 0;
00917 }
00918
00919 case ('e'):
00920 case ('E'):{
00921 d= ioctl (devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_EXPOS_END ), NULL);
00922 printf ("END EXPOSURE returned %lx\r\n", d);
00923 close(devfd); printf ("devfd closed\r\n");
00924 return 0;
00925 }
00926 default: {
00927 printf ("getting picture..\r\n");
00928 if (argc<3) t1=10000;
00929 else t1=(strtol (argv[2],&cp,10));
00930 if (argc<4) t2=1000;
00931 else t2=(strtol (argv[3],&cp,10));
00932 if (argc<5) a=2;
00933 else a=(strtol (argv[4],&cp,10));
00934 d= ioctl (devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_STOP_DMA ), NULL);
00935
00936 for (i=0;i<a;i++){
00937 d= ioctl (devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_EXPOS_START ), t2);
00938
00939 }
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949 d= ioctl (devfd, _IO(CMOSCAM_IOCTYPE, IO_CCAM_EXPOSE ), t1);
00950
00951
00952 close(devfd); printf ("devfd closed\r\n");
00953 return 0;
00954
00955 }
00956
00957 }
00958 #endif
00959
00960 }
00961
00962 printf(usage);
00963 return 0;
00964 }
00965