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(); }
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; }