Ejemplo n.º 1
0
int main(int argc,char** argv)
{
    bool result;

    result = gpiolib_init();
    if(result != true){
	printf("gpiolib init error\n");
	return(-1);
    }
    gpiolib_setDirectionGpio17(false);

    result = fb_init();
    if(result != true){
	printf("fb init error\n");
	return(-1);
    }

    oled_main();
}
Ejemplo n.º 2
0
Archivo: main.cpp Proyecto: ryuz/jelly
int main()
{
//	return i2c_test();
	
	UioMmap um_pl_peri("my_pl_peri", 0x00200000);
	if ( !um_pl_peri.IsMapped() ) {
		printf("map error : my_pl_peri\n");
		return 1;
	}
	
	UioMmap um_pl_mem("my_pl_ddr3", 0x10000000);
	if ( !um_pl_mem.IsMapped() ) {
		printf("map error : my_pl_ddr3\n");
		return 1;
	}
	
	// normalizer stop
	um_pl_peri.WriteWord32(0x00011000, 0);
	usleep(1000);
	while ( um_pl_peri.ReadWord32(0x00011004) != 0 ) {
		usleep(1000);
	}
	
	
	// demosaic param_phase
	um_pl_peri.WriteWord32(0x00012000, 0);
	
	
	oled_init(&um_pl_peri);
	oled_main();
	
	
//	volatile uint32_t *peri_addr = (volatile uint32_t *)um_pl_peri.GetAddress();
//	printf("hello:%x\n", peri_addr[0]);
	
	
//	cv::Mat img(IMAGE_HEIGHT, IMAGE_WIDTH, CV_16U);
	
	
	int w = 640;
	int h = 132;
	
	I2cAccess	i2c;
	
	if ( !i2c.Open("/dev/i2c-0", 0x10) ) {
		printf("I2C open error\n");
		return 1;
	}
	
//	printf("0x00 : %02x\n", i2c.ReadAddr16Byte(0x00));
//	printf("0x01 : %02x\n", i2c.ReadAddr16Byte(0x01));
	
	i2c.WriteAddr16Byte(0x0103, 0x01);
	usleep(10000);
	i2c.WriteAddr16Byte(0x0103, 0x00);
	usleep(10000);
	printf("0x00 : %02x\n", i2c.ReadAddr16Byte(0x00));
	printf("0x01 : %02x\n", i2c.ReadAddr16Byte(0x01));
	printf("%02x\n", i2c.ReadAddr16Byte(0x0103));
	
	
	i2c.WriteAddr16Byte(0x0102, 0x01  );   // ???? (Reserved)
//	i2c.WriteAddr16Word();
	i2c.WriteAddr16Byte(0x0100, 0x00  );   // mode_select [4:0]  (0: SW standby, 1: Streaming)
	i2c.WriteAddr16Word(0x6620, 0x0101);   // ????
	i2c.WriteAddr16Word(0x6622, 0x0101);
	
	/*
	i2c.WriteAddr16Byte(0x30EB, 0x0C  );   // Access command sequence Seq. No. 2
	i2c.WriteAddr16Byte(0x30EB, 0x05);
	i2c.WriteAddr16Word(0x300A, 0xFFFF);
	i2c.WriteAddr16Byte(0x30EB, 0x05);
	i2c.WriteAddr16Byte(0x30EB, 0x09);
	*/
	
	i2c.WriteAddr16Byte(0x30EB, 0x05);   // Access command sequence Seq.
	i2c.WriteAddr16Byte(0x30EB, 0x0C);
	i2c.WriteAddr16Byte(0x300A, 0xFF);
	i2c.WriteAddr16Byte(0x300B, 0xFF);
	i2c.WriteAddr16Byte(0x30EB, 0x05);
	i2c.WriteAddr16Byte(0x30EB, 0x09);
	
	i2c.WriteAddr16Byte(0x0114, 0x01  );   // * CSI_LANE_MODE (03: 4Lane 01: 2Lane)
	i2c.WriteAddr16Byte(0x0128, 0x00  );   //   DPHY_CTRL (MIPI Global timing setting 0: auto mode, 1: manual mode)
	i2c.WriteAddr16Word(0x012a, 0x1800);   // * INCK frequency [MHz] 6,144MHz
	i2c.WriteAddr16Byte(0x0157, 0x00  );   //      ANA_GAIN_GLOBAL_A
	i2c.WriteAddr16Word(0x015A, 0x09BD);   // 0x9bd=2493     COARSE_INTEGRATION_TIME_A
	i2c.WriteAddr16Word(0x0160, 0x0372);   // 0x372= 882     FRM_LENGTH_A
	
#if 0
	i2c.WriteAddr16Word(0x0162, 0x0D78);   // 0xD78=3448     LINE_LENGTH_A (line_length_pck Units: Pixels)  
	i2c.WriteAddr16Word(0x0164, 0x0000);   //      X_ADD_STA_A  x_addr_start  X-address of the top left corner of the visible pixel data Units: Pixels
	i2c.WriteAddr16Word(0x0166, 0x0CCF);   // 0xccf=3279     X_ADD_END_A
	i2c.WriteAddr16Word(0x0168, 0x0000);   //      Y_ADD_STA_A
	i2c.WriteAddr16Word(0x016A, 0x099F);   // 0x99f=2463     Y_ADD_END_A
	i2c.WriteAddr16Word(0x016C, 0x0668);   // 0x668=1640     x_output_size
	i2c.WriteAddr16Word(0x016E, 0x04D0);   // 0x4d0=1232     y_output_size
#else
	i2c.WriteAddr16Word(0x0164, 3280/2 - w);    //      X_ADD_STA_A  x_addr_start  X-address of the top left corner of the visible pixel data Units: Pixels
	i2c.WriteAddr16Word(0x0166, 3280/2 + w-1);  // 0xccf=3279     X_ADD_END_A
	i2c.WriteAddr16Word(0x0168, 2464/2 - h);    //      Y_ADD_STA_A
	i2c.WriteAddr16Word(0x016A, 2464/2 + h-1);  // 0x99f=2463     Y_ADD_END_A
	i2c.WriteAddr16Word(0x016C, w);   // 0x668=1640     x_output_size
	i2c.WriteAddr16Word(0x016E, h);   // 0x4d0=1232     y_output_size
#endif
	
	
	i2c.WriteAddr16Word(0x0170, 0x0101);   //      X_ODD_INC_A  Increment for odd pixels 1, 3
	
//	i2c.WriteAddr16Word(0x0170, 0x0303);   // r     X_ODD_INC_A  Increment for odd pixels 1, 3
//	i2c.WriteAddr16Word(0x0174, 0x0101);   //      BINNING_MODE_H_A  0: no-binning, 1: x2-binning, 2: x4-binning, 3: x2-analog (special) binning
	i2c.WriteAddr16Word(0x0174, 0x0303);   // r     BINNING_MODE_H_A  0: no-binning, 1: x2-binning, 2: x4-binning, 3: x2-analog (special) binning
	i2c.WriteAddr16Word(0x018C, 0x0A0A);   //      CSI_DATA_FORMAT_A   CSI-2 data format
	i2c.WriteAddr16Byte(0x0301, 0x05  );   // * VTPXCK_DIV  Video Timing Pixel Clock Divider Value
	i2c.WriteAddr16Word(0x0303, 0x0103);   // * VTSYCK_DIV  PREPLLCK_VT_DIV(3: EXCK_FREQ 24 MHz to 27 MHz)
	i2c.WriteAddr16Word(0x0305, 0x0300);   // * PREPLLCK_OP_DIV(3: EXCK_FREQ 24 MHz to 27 MHz)  / PLL_VT_MPY 区切りがおかしい次に続く
//	i2c.WriteAddr16Byte(0x0307, 0x39  );   // * PLL_VT_MPY
//	i2c.WriteAddr16Byte(0x0307, 84  );   // r PLL_VT_MPY
	i2c.WriteAddr16Byte(0x0307, 87  );   // r PLL_VT_MPY
	i2c.WriteAddr16Byte(0x0309, 0x0A  );   // * OPPXCK_DIV
	i2c.WriteAddr16Word(0x030B, 0x0100);   // * OPSYCK_DIV PLL_OP_MPY[10:8] / 区切りがおかしい次に続く
	i2c.WriteAddr16Byte(0x030D, 0x72  );   // * PLL_OP_MPY[10:8]
	
	i2c.WriteAddr16Byte(0x455E, 0x00  );   //
	i2c.WriteAddr16Byte(0x471E, 0x4B  );   //
	i2c.WriteAddr16Byte(0x4767, 0x0F  );   //
	i2c.WriteAddr16Byte(0x4750, 0x14  );   //
	i2c.WriteAddr16Byte(0x4540, 0x00  );   //
	i2c.WriteAddr16Byte(0x47B4, 0x14  );   //
	i2c.WriteAddr16Byte(0x4713, 0x30  );   //
	i2c.WriteAddr16Byte(0x478B, 0x10  );   //
	i2c.WriteAddr16Byte(0x478F, 0x10  );   //
	i2c.WriteAddr16Byte(0x4793, 0x10  );   //
	i2c.WriteAddr16Byte(0x4797, 0x0E  );   //
	i2c.WriteAddr16Byte(0x479B, 0x0E  );   //

	i2c.WriteAddr16Byte(0x0172, 0x00  );   //      IMG_ORIENTATION_A
	
//	i2c.WriteAddr16Word(0x0160, 0x06E3);   //      FRM_LENGTH_A[15:8]
//	i2c.WriteAddr16Word(0x0162, 0x0D78);   //      LINE_LENGTH_A
//	i2c.WriteAddr16Word(0x015A, 0x0422);   //      COARSE_INTEGRATION_TIME_A
//	i2c.WriteAddr16Byte(0x0157, 0x00  );   //      ANA_GAIN_GLOBAL_A

//	i2c.WriteAddr16Byte(0x0157, 0x00  );   //      ANA_GAIN_GLOBAL_A
//	i2c.WriteAddr16Word(0x0160, 0x06E3);   //      FRM_LENGTH_A
//	i2c.WriteAddr16Word(0x0162, 0x0D78);   //      LINE_LENGTH_A (line_length_pck Units: Pixels)
//	i2c.WriteAddr16Word(0x015A, 0x0422);   //      COARSE_INTEGRATION_TIME_A

	i2c.WriteAddr16Byte(0x0100, 0x01  );   //      mode_select [4:0] 0: SW standby, 1: Streaming

//	i2c.WriteAddr16Byte(0x0157, 0x00  );   //      ANA_GAIN_GLOBAL_A
//	i2c.WriteAddr16Word(0x0160, 0x06E3);   // 0x06E3=3330   FRM_LENGTH_A
//	i2c.WriteAddr16Word(0x0162, 0x0D78);   // 0x0D78=3448   LINE_LENGTH_A
//	i2c.WriteAddr16Word(0x015A, 0x0421);   // 0x0421=1057   COARSE_INTEGRATION_TIME_A

#if 0
	i2c.WriteAddr16Byte(0x0157, 0x00  );   //      ANA_GAIN_GLOBAL_A
	i2c.WriteAddr16Word(0x0160, 0x0D02);   // 0x0D02=3330   FRM_LENGTH_A
	i2c.WriteAddr16Word(0x0162, 0x0D78);   // 0x0D78=3448   INE_LENGTH_A (line_length_pck Units: Pixels)
	i2c.WriteAddr16Word(0x015A, 0x0D02);   // 0x0D02=3330   COARSE_INTEGRATION_TIME_A
	i2c.WriteAddr16Byte(0x0157, 0xE0  );   //      ANA_GAIN_GLOBAL_A
#else
	i2c.WriteAddr16Byte(0x0157, 0x00  );   //      ANA_GAIN_GLOBAL_A
	i2c.WriteAddr16Word(0x0160, 80);       // 0x0D02=3330   FRM_LENGTH_A
	i2c.WriteAddr16Word(0x0162, 0x0D78);   // 0x0D78=3448   LINE_LENGTH_A (line_length_pck Units: Pixels)
	i2c.WriteAddr16Word(0x015A, 50);       // 0x0D02=3330   COARSE_INTEGRATION_TIME_A
	i2c.WriteAddr16Byte(0x0157, 0xE0  );   //      ANA_GAIN_GLOBAL_A
//	i2c.WriteAddr16Byte(0x0157, 0xFF  );   //      ANA_GAIN_GLOBAL_A
	i2c.WriteAddr16Word(0x0158, 0x0FFF);   //      ANA_GAIN_GLOBAL_A
#endif
	
	
	
//	int width  = 640; // IMAGE_WIDTH;
//	int height = 120; // IMAGE_HEIGHT;
//	int width  = 0x48e; // 640; // IMAGE_WIDTH;
//	int height = 0xD78; // 120; // IMAGE_HEIGHT;
	int width  = w;
	int height = h; // IMAGE_HEIGHT / 2;
	
	int mnist_th  = 127;
	int mcol_mode = 2;
	int mcol_th   = 3;
	
	void* mem_addr = um_pl_mem.GetAddress();
	
	{
		int		frame_num = 1;
		int		key;
		while ( (key = (cv::waitKey(10) & 0xff)) != 0x1b ) {
			cv::Mat img(height*frame_num, width, CV_8UC4);
			memcpy(img.data, (void *)mem_addr, width * height * 4 * frame_num);
			cv::imshow("img", img);
			cv::imwrite("img.png", img);
			cv::createTrackbar("width",  "img", &width,     IMAGE_WIDTH);
			cv::createTrackbar("height", "img", &height,    IMAGE_HEIGHT);
	//		cv::createTrackbar("frame",  "img", &frame_num, 10);
			cv::createTrackbar("m_th",   "img", &mnist_th, 255);
			cv::createTrackbar("mode",   "img", &mcol_mode, 3);
			cv::createTrackbar("col_th", "img", &mcol_th, 8);
			
			width &= 0xfffffff0;
			if ( width  < 16 ) { width  = 16; }
			if ( height < 2 )  { height = 2; }
			
			capture_still_image(um_pl_peri, width, height, frame_num);
			
			um_pl_peri.WriteWord32(0x00018000, mnist_th);
			um_pl_peri.WriteWord32(0x00019000, mcol_mode);
			um_pl_peri.WriteWord32(0x00019004, mcol_th);
			
			if ( key == 'r' ) {
				printf("record\n");
				capture_still_image(um_pl_peri, width, height, 100);
				char* p = (char*)mem_addr;
				for ( int i = 0; i< 100; i++ ) {
					char fname[64];
					sprintf(fname, "rec_%04d.png", i);
					cv::Mat imgRec(height, width, CV_8UC4);
					memcpy(imgRec.data, p, width * height * 4);	p += width * height * 4;
					cv::Mat imgRgb;
					cv::cvtColor(imgRec, imgRgb, CV_BGRA2BGR);
					cv::imwrite(fname, imgRgb);
				}
			}
		}
	}
	
	return 0;
}