diff --git a/build/libraries/camera/ARM7/MT9V113-MTM10-3.ini b/build/libraries/camera/ARM7/MT9V113-MTM10-3.ini index 61d202a..8d8b85a 100644 --- a/build/libraries/camera/ARM7/MT9V113-MTM10-3.ini +++ b/build/libraries/camera/ARM7/MT9V113-MTM10-3.ini @@ -82,8 +82,8 @@ LOAD=Auto Exposure LOAD=Auto White Balance LOAD=Gamma Correction LOAD=Sharpness : 0 -LOAD=Refresh - +//LOAD=Refresh +LOAD=Image Size : QVGA [Initialize Camera] REG = 0x001A, 0x0003// Activate Soft Reset & MIPI Reset @@ -91,7 +91,7 @@ DELAY = 1 // Wait 1ms for internal reset cycle (6000 EXTCLK cycles) using a 6.75 REG = 0x001A, 0x0000 // Deactivate both soft reset, MIPI reset DELAY = 1 REG = 0x0018, 0x4028 // Enable STANDBY mode, Bit(3) -REG = 0x001A, 0x0200 // Enable parallel port:bit(9) & Output enable: Bit(8) +//REG = 0x001A, 0x0200 // Enable parallel port:bit(9) & Output enable: Bit(8) // Yutaka: no output REG = 0x001E, 0x0777 // Program to slowest SLEW rate REG = 0x0016, 0x42DF // Invert PIXCLK output to interface with Micron DEMO2 board // Enable EXTCLK bit9 diff --git a/build/libraries/camera/ARM7/MT9V113-MTM11.ini b/build/libraries/camera/ARM7/MT9V113-MTM11.ini index 4d5cb22..345daec 100644 --- a/build/libraries/camera/ARM7/MT9V113-MTM11.ini +++ b/build/libraries/camera/ARM7/MT9V113-MTM11.ini @@ -71,15 +71,16 @@ [Default Registers] LOAD=Initialize Camera -LOAD=Image Setting ExtClk=6.75MHz Op_Pix=27.5MHz 15fps +//LOAD=Image Setting ExtClk=6.75MHz Op_Pix=27.5MHz 15fps //LOAD=Image Setting ExtClk=16.76MHz Op_Pix=27.5MHz 15fps -//LOAD=Image Setting ExtClk=16.76MHz Op_Pix=8.38MHz +LOAD=Image Setting ExtClk=16.76MHz Op_Pix=8.38MHz LOAD=Lens Correction V2-95% LOAD=Auto Exposure LOAD=Auto White Balance LOAD=Gamma Correction LOAD= Mode : Landscape +LOAD= Image Size : QVGA [Initialize Camera] REG = 0x001A, 0x0003// Activate Soft Reset & MIPI Reset @@ -87,7 +88,7 @@ DELAY = 1 // Wait 1ms for internal reset cycle (6000 EXTCLK cycles) using a 6.75 REG = 0x001A, 0x0000 // Deactivate both soft reset, MIPI reset DELAY = 1 REG = 0x0018, 0x4028 // Enable STANDBY mode, Bit(3) -REG = 0x001A, 0x0200 // Enable parallel port:bit(9) & Output enable: Bit(8) +//REG = 0x001A, 0x0200 // Enable parallel port:bit(9) & Output enable: Bit(8) // Yutaka: no output REG = 0x001E, 0x0777 // Program to slowest SLEW rate REG = 0x0016, 0x42DF // Invert PIXCLK output to interface with Micron DEMO2 board // Enable EXTCLK bit9 diff --git a/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_QVGA_23Jul07_1676MHz.dat b/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_QVGA_23Jul07_1676MHz.dat index de6ff31..1546fe4 100644 --- a/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_QVGA_23Jul07_1676MHz.dat +++ b/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_QVGA_23Jul07_1676MHz.dat @@ -15,7 +15,7 @@ 0A 03 #PLL1 0B 00 #PLL2 04 10 -04 90 +#04 98 # Yutaka: no output C9 B0 #frame height 15fps C8 04 #1200 diff --git a/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_QVGA_23Jul07_1676MHz_Improve.dat b/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_QVGA_23Jul07_1676MHz_Improve.dat index 8a73773..1e48889 100644 --- a/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_QVGA_23Jul07_1676MHz_Improve.dat +++ b/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_QVGA_23Jul07_1676MHz_Improve.dat @@ -257,5 +257,5 @@ D4 08 # 01D4 referense gain1 0A 02 #03 #pre PLL1 0B 01 #03 00 #post PLL2 04 10 -04 90 +#04 98 # Yutaka: no output diff --git a/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_VGA_23Jul07_1676MHz_Improve.dat b/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_VGA_23Jul07_1676MHz_Improve.dat index 01a9d47..4be59c0 100644 --- a/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_VGA_23Jul07_1676MHz_Improve.dat +++ b/build/libraries/camera/ARM7/VGA_15fps_5fps_x8_CC_FilterKIM_MatrixOn3_PLL_VGA_23Jul07_1676MHz_Improve.dat @@ -257,5 +257,5 @@ D4 08 # 01D4 referense gain1 0A 02 #03 #pre PLL1 0B 01 #03 00 #post PLL2 04 10 -04 90 +#04 98 # Yutaka: no output diff --git a/build/libraries/camera/ARM7/camera_control.c b/build/libraries/camera/ARM7/camera_control.c index aa1e568..bc3f2b3 100644 --- a/build/libraries/camera/ARM7/camera_control.c +++ b/build/libraries/camera/ARM7/camera_control.c @@ -134,6 +134,7 @@ static void CameraPxiCallback(PXIFifoTag tag, u32 data, BOOL err) // 既知のコマンド群 case CAMERA_PXI_COMMAND_INIT: case CAMERA_PXI_COMMAND_ACTIVATE: + case CAMERA_PXI_COMMAND_OUTPUT_WITH_DUAL_ACTIVATION: case CAMERA_PXI_COMMAND_RESIZE: case CAMERA_PXI_COMMAND_FRAME_RATE: case CAMERA_PXI_COMMAND_EFFECT: @@ -232,41 +233,74 @@ static void CameraThread(void *arg) { case CAMERA_PXI_COMMAND_INIT: CAMERA_PXI_SIZE_CHECK(CAMERA_PXI_SIZE_INIT); - // NONEでなければNONE状態にする + // 両方StandbyでなければStandby状態にする (TODO: 出力なしのまま初期化できるようになればいらなくなる!) if (cameraWork.camera != CAMERA_SELECT_NONE) { - if (FALSE == CAMERA_I2CStandby(cameraWork.camera, TRUE)) + if (FALSE == CAMERA_I2CStandby(cameraWork.camera)) { - CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_SUCCESS_FALSE); // ARM9に処理の失敗を通達 + CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_ILLEGAL_STATUS); // ARM9に処理の失敗を通達 + break; } } - cameraWork.camera = CAMERA_SELECT_NONE; result = CAMERA_I2CInit((CameraSelect)cameraWork.data[0]); - CameraReturnResult(cameraWork.command, result ? CAMERA_PXI_RESULT_SUCCESS_TRUE : CAMERA_PXI_RESULT_SUCCESS_FALSE); // ARM9に処理の成功を通達 + cameraWork.camera = CAMERA_SELECT_NONE; // 初期状態は両方Standby + CameraReturnResult(cameraWork.command, result ? CAMERA_PXI_RESULT_SUCCESS : CAMERA_PXI_RESULT_ILLEGAL_STATUS); // ARM9に処理の成功を通達 break; case CAMERA_PXI_COMMAND_ACTIVATE: CAMERA_PXI_SIZE_CHECK(CAMERA_PXI_SIZE_ACTIVATE); + // ここでは、BOTHは設定不可 + if (CAMERA_SELECT_BOTH == cameraWork.data[0]) + { + CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_INVALID_PARAMETER); // ARM9に処理の失敗を通達 + break; + } + // 変更があるなら切り替える if (cameraWork.camera != cameraWork.data[0]) { - // NONEでなければNONE状態にする + // 両方StandbyでなければStandby状態にする if (cameraWork.camera != CAMERA_SELECT_NONE) { - if (FALSE == CAMERA_I2CStandby(cameraWork.camera, TRUE)) + if (FALSE == CAMERA_I2CStandby(cameraWork.camera)) { - CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_SUCCESS_FALSE); // ARM9に処理の失敗を通達 + CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_ILLEGAL_STATUS); // ARM9に処理の失敗を通達 + break; } } - cameraWork.camera = (CameraSelect)cameraWork.data[0]; + cameraWork.camera = (CameraSelect)cameraWork.data[0]; // アクティブなカメラの記録 + // 両方Standbyにするのではなければ、指定された方をアクティブにする if (cameraWork.camera != CAMERA_SELECT_NONE) { - if (FALSE == CAMERA_I2CStandby(cameraWork.camera, FALSE)) + if (FALSE == CAMERA_I2CResume(cameraWork.camera)) // Standby解除 { - CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_SUCCESS_FALSE); // ARM9に処理の失敗を通達 + CAMERA_I2CStandby(CAMERA_SELECT_BOTH); // 中途半端な状態対策 + cameraWork.camera = CAMERA_SELECT_NONE; // NONEに戻しておく + CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_ILLEGAL_STATUS); // ARM9に処理の失敗を通達 + break; } } } - CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_SUCCESS_TRUE); // ARM9に処理の成功を通達 + CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達 + break; + + case CAMERA_PXI_COMMAND_OUTPUT_WITH_DUAL_ACTIVATION: + CAMERA_PXI_SIZE_CHECK(CAMERA_PXI_SIZE_OUTPUT_WITH_DUAL_ACTIVATION); + // ここでは、IN/OUTのみ設定可 + if (CAMERA_SELECT_IN != cameraWork.data[0] && CAMERA_SELECT_OUT != cameraWork.data[0]) + { + CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_INVALID_PARAMETER); // ARM9に処理の失敗を通達 + break; + } + // (いちいち状態を保存せず) 常に設定する + cameraWork.camera = CAMERA_SELECT_BOTH; // アクティブなカメラの記録 + if (FALSE == CAMERA_I2CResumeBoth((CameraSelect)cameraWork.data[0])) + { + CAMERA_I2CStandby(CAMERA_SELECT_BOTH); // 中途半端な状態対策 + cameraWork.camera = CAMERA_SELECT_NONE; // NONEに戻しておく + CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_ILLEGAL_STATUS); // ARM9に処理の失敗を通達 + break; + } + CameraReturnResult(cameraWork.command, CAMERA_PXI_RESULT_SUCCESS); // ARM9に処理の成功を通達 break; case CAMERA_PXI_COMMAND_RESIZE: @@ -274,25 +308,25 @@ static void CameraThread(void *arg) CAMERA_UNPACK_U16(&data16a, &cameraWork.data[1]); CAMERA_UNPACK_U16(&data16b, &cameraWork.data[3]); result = CAMERA_I2CResize((CameraSelect)cameraWork.data[0], data16a, data16b); - CameraReturnResult(cameraWork.command, result ? CAMERA_PXI_RESULT_SUCCESS_TRUE : CAMERA_PXI_RESULT_SUCCESS_FALSE); // ARM9に処理の成功を通達 + CameraReturnResult(cameraWork.command, result ? CAMERA_PXI_RESULT_SUCCESS : CAMERA_PXI_RESULT_ILLEGAL_STATUS); // ARM9に処理の成否を通達 break; case CAMERA_PXI_COMMAND_FRAME_RATE: CAMERA_PXI_SIZE_CHECK(CAMERA_PXI_SIZE_FRAME_RATE); result = CAMERA_I2CFrameRate((CameraSelect)cameraWork.data[0], cameraWork.data[1]); - CameraReturnResult(cameraWork.command, result ? CAMERA_PXI_RESULT_SUCCESS_TRUE : CAMERA_PXI_RESULT_SUCCESS_FALSE); // ARM9に処理の成功を通達 + CameraReturnResult(cameraWork.command, result ? CAMERA_PXI_RESULT_SUCCESS : CAMERA_PXI_RESULT_ILLEGAL_STATUS); // ARM9に処理の成否を通達 break; case CAMERA_PXI_COMMAND_EFFECT: CAMERA_PXI_SIZE_CHECK(CAMERA_PXI_SIZE_EFFECT); result = CAMERA_I2CEffect((CameraSelect)cameraWork.data[0], (CameraEffect)cameraWork.data[1]); - CameraReturnResult(cameraWork.command, result ? CAMERA_PXI_RESULT_SUCCESS_TRUE : CAMERA_PXI_RESULT_SUCCESS_FALSE); // ARM9に処理の成功を通達 + CameraReturnResult(cameraWork.command, result ? CAMERA_PXI_RESULT_SUCCESS : CAMERA_PXI_RESULT_ILLEGAL_STATUS); // ARM9に処理の成否を通達 break; case CAMERA_PXI_COMMAND_FLIP: CAMERA_PXI_SIZE_CHECK(CAMERA_PXI_SIZE_FLIP); result = CAMERA_I2CFlip((CameraSelect)cameraWork.data[0], (CameraFlip)cameraWork.data[1]); - CameraReturnResult(cameraWork.command, result ? CAMERA_PXI_RESULT_SUCCESS_TRUE : CAMERA_PXI_RESULT_SUCCESS_FALSE); // ARM9に処理の成功を通達 + CameraReturnResult(cameraWork.command, result ? CAMERA_PXI_RESULT_SUCCESS : CAMERA_PXI_RESULT_ILLEGAL_STATUS); // ARM9に処理の成否を通達 break; // サポートしないコマンド diff --git a/build/libraries/camera/ARM7/camera_i2c.c b/build/libraries/camera/ARM7/camera_i2c.c index 9d51420..3f655ad 100644 --- a/build/libraries/camera/ARM7/camera_i2c.c +++ b/build/libraries/camera/ARM7/camera_i2c.c @@ -58,7 +58,7 @@ BOOL CAMERA_I2CInit(CameraSelect camera) result = CAMERAi_S_I2CInit(camera); if (result == FALSE) { - cameraType = CAMERA_TYPE_MICRON; // rotate for next try + //cameraType = CAMERA_TYPE_MICRON; // rotate for next try //cameraType = CAMERA_TYPE_UNKNOWN; // annihilate camera I2C } } @@ -69,24 +69,75 @@ BOOL CAMERA_I2CInit(CameraSelect camera) /*---------------------------------------------------------------------------* Name: CAMERA_I2CStandby - Description: standby or resume CAMERA + Description: goto standby - Arguments: camera : one of CameraSelect - standby : TRUE if goto standby mode + Arguments: camera : one of CameraSelect (IN/OUT/BOTH) to goto standby Returns: TRUE if success *---------------------------------------------------------------------------*/ -BOOL CAMERA_I2CStandby(CameraSelect camera, BOOL standby) +BOOL CAMERA_I2CStandby(CameraSelect camera) { BOOL result = FALSE; (void)I2C_Lock(); switch (cameraType) { case CAMERA_TYPE_MICRON: - result = CAMERAi_M_I2CStandby(camera, standby); + result = CAMERAi_M_I2CStandby(camera); break; case CAMERA_TYPE_SHARP: - result = CAMERAi_S_I2CStandby(camera, standby); + result = CAMERAi_S_I2CStandby(camera); + break; + } + (void)I2C_Unlock(); + return result; +} + +/*---------------------------------------------------------------------------* + Name: CAMERA_I2CResume + + Description: resume from standby + + Arguments: camera : one of CameraSelect (IN/OUT) to resume + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERA_I2CResume(CameraSelect camera) +{ + BOOL result = FALSE; + (void)I2C_Lock(); + switch (cameraType) + { + case CAMERA_TYPE_MICRON: + result = CAMERAi_M_I2CResume(camera); + break; + case CAMERA_TYPE_SHARP: + result = CAMERAi_S_I2CResume(camera); + break; + } + (void)I2C_Unlock(); + return result; +} + +/*---------------------------------------------------------------------------* + Name: CAMERA_I2CResumeBoth + + Description: resume both CAMERAs, but only one will output + + Arguments: camera : one of CameraSelect (IN/OUT) to output + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERA_I2CResumeBoth(CameraSelect camera) +{ + BOOL result = FALSE; + (void)I2C_Lock(); + switch (cameraType) + { + case CAMERA_TYPE_MICRON: + result = CAMERAi_S_I2CResumeBoth(camera); + break; + case CAMERA_TYPE_SHARP: + result = CAMERAi_S_I2CResumeBoth(camera); break; } (void)I2C_Unlock(); @@ -121,7 +172,6 @@ BOOL CAMERA_I2CResize(CameraSelect camera, u16 width, u16 height) return result; } - /*---------------------------------------------------------------------------* Name: CAMERA_I2CFrameRate @@ -203,3 +253,8 @@ BOOL CAMERA_I2CFlip(CameraSelect camera, CameraFlip flip) return result; } +#if 0 + その他のAPI候補 + ホワイトバランス、露光 + フォーマット(YUYVの順番、RGB444もあり?) +#endif diff --git a/build/libraries/camera/ARM7/camera_i2c_micron.c b/build/libraries/camera/ARM7/camera_i2c_micron.c index 44c9fd7..79be7d0 100644 --- a/build/libraries/camera/ARM7/camera_i2c_micron.c +++ b/build/libraries/camera/ARM7/camera_i2c_micron.c @@ -31,50 +31,83 @@ *---------------------------------------------------------------------------*/ BOOL CAMERAi_M_I2CInit(CameraSelect camera) { +#if 0 BOOL rIn = TRUE; BOOL rOut = TRUE; - // should not send init command same time + // should not send init command same time (TODO:出力なしで初期化できるなら同時に処理するように変える) if (camera & CAMERA_SELECT_IN) { rIn = CAMERAi_M_Default_Registers(CAMERA_SELECT_IN) && CAMERAi_M_WriteMCU(CAMERA_SELECT_IN, 0x2755, 0x0002) // YUYV format (required to refresh) - && CAMERAi_M_I2CResize(CAMERA_SELECT_IN, 320, 240) - && CAMERAi_M_I2CStandby(CAMERA_SELECT_IN, TRUE); + && CAMERAi_M_I2CStandby(CAMERA_SELECT_IN); } if (camera & CAMERA_SELECT_OUT) { rOut = CAMERAi_M_Default_Registers(CAMERA_SELECT_OUT) && CAMERAi_M_WriteMCU(CAMERA_SELECT_OUT, 0x2755, 0x0002) // YUYV format (required to refresh) - && CAMERAi_M_I2CResize(CAMERA_SELECT_OUT, 320, 240) - && CAMERAi_M_I2CStandby(CAMERA_SELECT_OUT, TRUE); + && CAMERAi_M_I2CStandby(CAMERA_SELECT_OUT); } return (rIn && rOut); +#else + return CAMERAi_M_Default_Registers(camera) + && CAMERAi_M_WriteMCU(camera, 0x2755, 0x0002) // YUYV format (required to refresh) + && CAMERAi_M_SetFlags(camera, 0x0018, 0x0001); // goto standby +#endif } /*---------------------------------------------------------------------------* Name: CAMERAi_M_I2CStandby - Description: standby or resume CAMERA + Description: goto standby - Arguments: camera : one of CameraSelect - standby : TRUE if goto standby mode + Arguments: camera : one of CameraSelect (IN/OUT/BOTH) to goto standby Returns: TRUE if success *---------------------------------------------------------------------------*/ -BOOL CAMERAi_M_I2CStandby(CameraSelect camera, BOOL standby) +BOOL CAMERAi_M_I2CStandby(CameraSelect camera) { - if (standby) + return CAMERAi_M_ClearFlags(camera, 0x001A, 0x0200) // disable to output + && CAMERAi_M_SetFlags(camera, 0x0018, 0x0001); // goto standby +} + +/*---------------------------------------------------------------------------* + Name: CAMERAi_M_I2CResume + + Description: resume from standby + + Arguments: camera : one of CameraSelect (IN/OUT) to resume + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERAi_M_I2CResume(CameraSelect camera) +{ + if (camera == CAMERA_SELECT_BOTH) { - return CAMERAi_M_ClearFlags(camera, 0x001A, 0x0200) // stop to output -// return CAMERAi_M_Stop(camera) - && CAMERAi_M_SetFlags(camera, 0x0018, 0x0001); // go to standby + return FALSE; } - else + return CAMERAi_M_SetFlags(camera, 0x001A, 0x0200) // enable to output + && CAMERAi_M_ClearFlags(camera, 0x0018, 0x0001);// resume from standby +} + +/*---------------------------------------------------------------------------* + Name: CAMERAi_M_I2CResumeBoth + + Description: resume both CAMERAs, but only one will output + + Arguments: camera : one of CameraSelect (IN/OUT) to output + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERAi_M_I2CResumeBoth(CameraSelect camera) +{ + CameraSelect alternative = (camera == CAMERA_SELECT_IN ? CAMERA_SELECT_OUT : CAMERA_SELECT_IN); + if (camera == CAMERA_SELECT_BOTH) { - return CAMERAi_M_ClearFlags(camera, 0x0018, 0x0001) // leave standby - && CAMERAi_M_SetFlags(camera, 0x001A, 0x0200); // start to output -// && CAMERAi_M_Start(camera); + return FALSE; } + return CAMERAi_M_ClearFlags(alternative, 0x001A, 0x0200) // disable to output + && CAMERAi_M_SetFlags(camera, 0x001A, 0x0200) // enable to output + && CAMERAi_M_ClearFlags(CAMERA_SELECT_BOTH, 0x0018, 0x0001);// resume from standby } /*---------------------------------------------------------------------------* @@ -135,16 +168,13 @@ BOOL CAMERAi_M_I2CEffect(CameraSelect camera, CameraEffect effect) { case CAMERA_EFFECT_NONE: return CAMERAi_M_Effect_Off(camera); -// return CAMERAi_M_Option_Effect_Off(camera); case CAMERA_EFFECT_MONO: return CAMERAi_M_Effect_Mono(camera); -// return CAMERAi_M_Option_Effect_Mono(camera); case CAMERA_EFFECT_SEPIA: return CAMERAi_M_Effect_Sepia(camera); -// return CAMERAi_M_Option_Effect_Sepia(camera); case CAMERA_EFFECT_NEGATIVE: - return CAMERAi_M_WriteMCU(camera, 0x2759, 0x6443) //NEVATIVE_SPEC_EFFECTS_A - && CAMERAi_M_WriteMCU(camera, 0x275B, 0x6443) //NEVATIVE_SPEC_EFFECTS_B + return CAMERAi_M_WriteMCU(camera, 0x2759, 0x6443) //NEGATIVE_SPEC_EFFECTS_A + && CAMERAi_M_WriteMCU(camera, 0x275B, 0x6443) //NEGATIVE_SPEC_EFFECTS_B && CAMERAi_M_Refresh(camera); } return FALSE; @@ -173,67 +203,3 @@ BOOL CAMERAi_M_I2CFlip(CameraSelect camera, CameraFlip flip) } return FALSE; } -#if 0 -/*---------------------------------------------------------------------------* - Name: CAMERAi_M_I2CWhiteBalance - - Description: set CAMERA white balance - - Arguments: camera : one of CameraSelect - type : preset number (0: auto) - - Returns: TRUE if success - *---------------------------------------------------------------------------*/ -BOOL CAMERAi_M_I2CWhiteBalance(CameraSelect camera, int type) -{ - switch (type) - { - case 0: - return CAMERAi_M_Manual_WB_To_Auto_WB(camera); - case 1: - return CAMERAi_M_Manual_White_Balance_P1(camera); - case 2: - return CAMERAi_M_Manual_White_Balance_P2(camera); - case 3: - return CAMERAi_M_Manual_White_Balance_P3(camera); - case 4: - return CAMERAi_M_Manual_White_Balance_P4(camera); - case 5: - return CAMERAi_M_Manual_White_Balance_P5(camera); - case 6: - return CAMERAi_M_Manual_White_Balance_P6(camera); - case 7: - return CAMERAi_M_Manual_White_Balance_P7(camera); - case 8: - return CAMERAi_M_Manual_White_Balance_P8(camera); - } - return FALSE; -} -/*---------------------------------------------------------------------------* - Name: CAMERAi_M_I2CExposure - - Description: set CAMERA exposure - - Arguments: camera : one of CameraSelect - type : preset number (0: auto) - - Returns: TRUE if success - *---------------------------------------------------------------------------*/ -BOOL CAMERAi_M_I2CExposure(CameraSelect camera, int type) -{ - switch (type) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - return TRUE; - } - return FALSE; -} -#endif diff --git a/build/libraries/camera/ARM7/camera_i2c_sharp.c b/build/libraries/camera/ARM7/camera_i2c_sharp.c index 9cd84a1..3a28ee3 100644 --- a/build/libraries/camera/ARM7/camera_i2c_sharp.c +++ b/build/libraries/camera/ARM7/camera_i2c_sharp.c @@ -41,16 +41,17 @@ BankGroup; *---------------------------------------------------------------------------*/ BOOL CAMERAi_S_I2CInit(CameraSelect camera) { +#if 0 BOOL rIn = TRUE; BOOL rOut = TRUE; - // should not send init command same time + // should not send init command same time (TODO:出力なしで初期化できるなら同時に処理するように変える) if (camera & CAMERA_SELECT_IN) { rIn = CAMERAi_S_Initialize(CAMERA_SELECT_IN) && CAMERAi_S_WriteRegister(CAMERA_SELECT_IN, BANK_ADDR, BANK_GROUP_B) && CAMERAi_S_SetFlags(CAMERA_SELECT_IN, 0x1A, 0x08) // reverse RCLK polarity && CAMERAi_S_WriteRegister(CAMERA_SELECT_IN, 0x18, 0x02) // force to order YUYV - && CAMERAi_S_I2CStandby(CAMERA_SELECT_IN, TRUE); + && CAMERAi_S_I2CStandby(CAMERA_SELECT_IN); } if (camera & CAMERA_SELECT_OUT) { @@ -58,33 +59,71 @@ BOOL CAMERAi_S_I2CInit(CameraSelect camera) && CAMERAi_S_WriteRegister(CAMERA_SELECT_OUT, BANK_ADDR, BANK_GROUP_B) && CAMERAi_S_SetFlags(CAMERA_SELECT_OUT, 0x1A, 0x08) // reverse RCLK polarity && CAMERAi_S_WriteRegister(CAMERA_SELECT_OUT, 0x18, 0x02) // force to order YUYV - && CAMERAi_S_I2CStandby(CAMERA_SELECT_OUT, TRUE); + && CAMERAi_S_I2CStandby(CAMERA_SELECT_OUT); } return (rIn && rOut); +#else + return CAMERAi_S_Initialize(camera) + && CAMERAi_S_WriteRegister(camera, BANK_ADDR, BANK_GROUP_B) + && CAMERAi_S_SetFlags(camera, 0x1A, 0x08) // reverse RCLK polarity + && CAMERAi_S_WriteRegister(camera, 0x18, 0x02) // force to order YUYV + && CAMERAi_S_ClearFlags(camera, 0x04, 0x88); // goto standby (maybe already into) +#endif } /*---------------------------------------------------------------------------* Name: CAMERAi_S_I2CStandby - Description: standby or resume CAMERA + Description: goto standby - Arguments: camera : one of CameraSelect - standby : TRUE if goto standby mode + Arguments: camera : one of CameraSelect (IN/OUT/BOTH) to goto standby Returns: TRUE if success *---------------------------------------------------------------------------*/ -BOOL CAMERAi_S_I2CStandby(CameraSelect camera, BOOL standby) +BOOL CAMERAi_S_I2CStandby(CameraSelect camera) { - if (standby) + return CAMERAi_S_WriteRegister(camera, BANK_ADDR, BANK_GROUP_B) + && CAMERAi_S_ClearFlags(camera, 0x04, 0x88); // goto standby and disable to output +} + +/*---------------------------------------------------------------------------* + Name: CAMERAi_S_I2CResume + + Description: resume from standby + + Arguments: camera : one of CameraSelect (IN/OUT) to resume + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERAi_S_I2CResume(CameraSelect camera) +{ + if (camera == CAMERA_SELECT_BOTH) { - return CAMERAi_S_WriteRegister(camera, BANK_ADDR, BANK_GROUP_B) - && CAMERAi_S_ClearFlags(camera, 0x04, 0x80); + return FALSE; } - else + return CAMERAi_S_WriteRegister(camera, BANK_ADDR, BANK_GROUP_B) + && CAMERAi_S_SetFlags(camera, 0x04, 0x88); // resume from standby and enable to output +} + +/*---------------------------------------------------------------------------* + Name: CAMERAi_S_I2CResumeBoth + + Description: resume both CAMERAs, but only one will output + + Arguments: camera : one of CameraSelect (IN/OUT) to output + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERAi_S_I2CResumeBoth(CameraSelect camera) +{ + CameraSelect alternative = (camera == CAMERA_SELECT_IN ? CAMERA_SELECT_OUT : CAMERA_SELECT_IN); + if (camera == CAMERA_SELECT_BOTH) { - return CAMERAi_S_WriteRegister(camera, BANK_ADDR, BANK_GROUP_B) - && CAMERAi_S_SetFlags(camera, 0x04, 0x80); + return FALSE; } + return CAMERAi_S_WriteRegister(CAMERA_SELECT_BOTH, BANK_ADDR, BANK_GROUP_B) + && CAMERAi_S_SetParams(alternative, 0x04, 0x80, 0x88) // resume but no output + && CAMERAi_S_SetFlags(camera, 0x04, 0x88); // resume and output } /*---------------------------------------------------------------------------* @@ -174,7 +213,7 @@ BOOL CAMERAi_S_I2CFlip(CameraSelect camera, CameraFlip flip) u8 data = 0; switch (flip) { - case CAMERA_FLIP_NONE: data = 0x00; break; + //case CAMERA_FLIP_NONE: data = 0x00; break; case CAMERA_FLIP_VERTICAL: data = 0x02; break; case CAMERA_FLIP_HORIZONTAL:data = 0x01; break; case CAMERA_FLIP_REVERSE: data = 0x03; break; diff --git a/build/libraries/camera/ARM9/camera_api.c b/build/libraries/camera/ARM9/camera_api.c index cf2d929..20f14c2 100644 --- a/build/libraries/camera/ARM9/camera_api.c +++ b/build/libraries/camera/ARM9/camera_api.c @@ -100,8 +100,7 @@ void CAMERA_Init(void) CAMERA_PowerOn(); // カメラ初期化 - //CAMERA_I2CInit(CAMERA_SELECT_BOTH); - CAMERA_I2CInit(CAMERA_SELECT_IN); + CAMERA_I2CInit(CAMERA_SELECT_BOTH); } /*---------------------------------------------------------------------------* @@ -246,9 +245,10 @@ CAMERAResult CAMERA_I2CInit(CameraSelect camera) Name: CAMERA_I2CActivateAsync Description: activate specified CAMERA (goto standby if NONE is specified) + if you want to activate both cameras, use CAMERA_I2COutputWithDualActivation[Async] async version - Arguments: camera - one of CameraSelect + Arguments: camera - one of CameraSelect (BOTH is not valid) callback - 非同期処理が完了した再に呼び出す関数を指定 arg - コールバック関数の呼び出し時の引数を指定。 @@ -286,9 +286,10 @@ CAMERAResult CAMERA_I2CActivateAsync(CameraSelect camera, CAMERACallback callbac Name: CAMERA_I2CActivate Description: activate specified CAMERA (goto standby if NONE is specified) + if you want to activate both cameras, use CAMERA_I2COutputWithDualActivation[Async] sync version. - Arguments: camera - one of CameraSelect + Arguments: camera - one of CameraSelect (BOTH is not valid) Returns: CAMERAResult *---------------------------------------------------------------------------*/ @@ -302,6 +303,66 @@ CAMERAResult CAMERA_I2CActivate(CameraSelect camera) return cameraWork.result; } +/*---------------------------------------------------------------------------* + Name: CAMERA_I2COutputWithDualActivationAsync + + Description: activate both camera and output specified CAMERA + async version + + Arguments: camera - one of CameraSelect (IN or OUT) + callback - 非同期処理が完了した再に呼び出す関数を指定 + arg - コールバック関数の呼び出し時の引数を指定。 + + Returns: CAMERAResult + *---------------------------------------------------------------------------*/ +CAMERAResult CAMERA_I2COutputWithDualActivationAsync(CameraSelect camera, CAMERACallback callback, void *arg) +{ + const CAMERAPxiCommand command = CAMERA_PXI_COMMAND_OUTPUT_WITH_DUAL_ACTIVATION; + const u8 size = CAMERA_PXI_SIZE_OUTPUT_WITH_DUAL_ACTIVATION; + OSIntrMode enabled; + + SDK_NULL_ASSERT(callback); + + if (CAMERA_SELECT_BOTH == camera || CAMERA_SELECT_NONE == camera) + { + return CAMERA_RESULT_ILLEGAL_PARAMETER; + } + + enabled = OS_DisableInterrupts(); + if (cameraWork.lock) + { + (void)OS_RestoreInterrupts(enabled); + return CAMERA_RESULT_BUSY; + } + cameraWork.lock = TRUE; + (void)OS_RestoreInterrupts(enabled); + // コールバック設定 + cameraWork.callback = callback; + cameraWork.callbackArg = arg; + + return CameraSendPxiCommand(command, size, (u8)camera) ? CAMERA_RESULT_SUCCESS : CAMERA_RESULT_SEND_ERROR; +} + +/*---------------------------------------------------------------------------* + Name: CAMERA_I2COutputWithDualActivation + + Description: activate both camera and output specified CAMERA + sync version. + + Arguments: camera - one of CameraSelect (IN or OUT) + + Returns: CAMERAResult + *---------------------------------------------------------------------------*/ +CAMERAResult CAMERA_I2COutputWithDualActivation(CameraSelect camera) +{ + cameraWork.result = CAMERA_I2COutputWithDualActivationAsync(camera, CameraSyncCallback, 0); + if (cameraWork.result == CAMERA_RESULT_SUCCESS) + { + CameraWaitBusy(); + } + return cameraWork.result; +} + /*---------------------------------------------------------------------------* Name: CAMERA_I2CResizeAsync @@ -721,11 +782,8 @@ static void CameraPxiCallback(PXIFifoTag tag, u32 data, BOOL err) // 処理結果を確認 switch (cameraWork.pxiResult) { - case CAMERA_PXI_RESULT_SUCCESS: - result = CAMERA_RESULT_SUCCESS; - break; - case CAMERA_PXI_RESULT_SUCCESS_TRUE: - result = CAMERA_RESULT_SUCCESS_TRUE; + case CAMERA_PXI_RESULT_SUCCESS: // alias CAMERA_PXI_RESULT_SUCCESS_TRUE + result = CAMERA_RESULT_SUCCESS; // alias CAMERA_RESULT_SUCCESS_TRUE break; case CAMERA_PXI_RESULT_SUCCESS_FALSE: result = CAMERA_RESULT_SUCCESS_FALSE; diff --git a/build/tests/camera/camera-1/ARM9/src/main.c b/build/tests/camera/camera-1/ARM9/src/main.c index 14eafaa..d618769 100644 --- a/build/tests/camera/camera-1/ARM9/src/main.c +++ b/build/tests/camera/camera-1/ARM9/src/main.c @@ -20,7 +20,29 @@ #define DMA_NO 5 // 使用するDMA番号(4-7) #define WIDTH 256 // イメージの幅 #define HEIGHT 192 // イメージの高さ -#define NUMS 1 // バッファ数 + +#define DEFAULT_CAMERA CAMERA_SELECT_IN +//#define DEFAULT_CAMERA CAMERA_SELECT_OUT + +//#define DUAL_MODE // 両方アクティブ状態での使用 +#if 0 + DUAL_MODEはテストのために用意しているだけで、切り替えの瞬間に画面が + 崩れるのは仕様です。CAMERA_I2COutputWithDualActivation()の目的は、 + 両者のFPSを固定しておき、ほぼ同時にStandbyから解除させることで、 + フレーム同期している状態にしておき、上下のLCDにIN/OUTの両方の画像を + カメラに設定した半分のFPSで表示させるということが可能となるように + するためのものです。VRAM表示は1画面しか使えないので、FPGAでは検証 + できません。(TSのタイミングで別サンプル作成予定) + + 切り替え時の自動露光の時間がもったいないときにも利用可能ではあります + が、消費電力の 観点から見て、CAMERA_I2COutputWithDualActivation()の + 利用は最低限に限定すべきです。 + (IN/OUT共通でフレームレート固定なので、片側の画面がかなり暗くなる + 恐れがあることも踏まえておく必要があります) + + 最終的に、この仕様を残すかどうかは難しいところですね。 + (削るならARM7側の仕様をもう少し整理できるのですが) +#endif #define LINES_AT_ONCE CAMERA_GET_MAX_LINES(WIDTH) // 一回の転送ライン数 #define BYTES_PER_LINE CAMERA_GET_LINE_BYTES(WIDTH) // 一ラインの転送バイト数 @@ -29,6 +51,7 @@ static void VBlankIntr(void); static void CameraIntr(void); static BOOL startRequest = FALSE; +static CameraSelect current; /*---------------------------------------------------------------------------* Name: TwlMain @@ -64,16 +87,25 @@ void TwlMain() GX_DispOn(); // カメラ初期化 - CAMERA_Init(); // wakeup camera module + { + OSTick begin = OS_GetTick(); + CAMERA_Init(); // wakeup camera module + OS_TPrintf("CAMERA_Init took %d msec\n", (int)OS_TicksToMilliSeconds(OS_GetTick()-begin)); + } + current = DEFAULT_CAMERA; - result = CAMERA_I2CActivate(CAMERA_SELECT_IN); - if (result != CAMERA_RESULT_SUCCESS_TRUE) +#ifdef DUAL_MODE + result = CAMERA_I2COutputWithDualActivation(current); +#else + result = CAMERA_I2CActivate(current); +#endif + if (result != CAMERA_RESULT_SUCCESS) { OS_TPrintf("CAMERA_I2CActivate was failed. (%d)\n", result); } #if 0 - result = CAMERA_I2CResize(CAMERA_SELECT_IN, 320, 240); - if (result != CAMERA_RESULT_SUCCESS_TRUE) + result = CAMERA_I2CResize(current, 320, 240); + if (result != CAMERA_RESULT_SUCCESS) { OS_TPrintf("CAMERA_I2CResize was failed. (%d)\n", result); } @@ -91,8 +123,15 @@ void TwlMain() OS_SetIrqFunction(OS_IE_CAM, CameraIntr); (void)OS_EnableIrqMask(OS_IE_CAM); - // カメラスタート (リクエストのみ) + // カメラスタート (割り込みハンドラで代用) startRequest = TRUE; + CameraIntr(); + /* + (シャープカメラのみ確認済み事項) + Acitavate後、約30msec間VBlank期間が続く仕様なので、Activate直後は + 実際の開始処理をしてしまって問題ない + (結局1枚目を捨てるつもりならフラグを立てるだけでいいけど・・・) + */ OS_TPrintf("Camera is shooting a movie...\n"); while (1) @@ -107,23 +146,26 @@ void TwlMain() trg = (u16)(pad & ~old); old = pad; + if (trg & PAD_BUTTON_A) { - OS_TPrintf("call CAMERA_I2CActivate(CAMERA_SELECT_IN)... "); - result = CAMERA_I2CActivate(CAMERA_SELECT_IN); - OS_TPrintf("%s\n", result == CAMERA_RESULT_SUCCESS_TRUE ? "SUCCESS" : "FAILED"); } if (trg & PAD_BUTTON_B) { - OS_TPrintf("call CAMERA_I2CActivate(CAMERA_SELECT_OUT)... "); - result = CAMERA_I2CActivate(CAMERA_SELECT_OUT); - OS_TPrintf("%s\n", result == CAMERA_RESULT_SUCCESS_TRUE ? "SUCCESS" : "FAILED"); + current = (current == CAMERA_SELECT_IN ? CAMERA_SELECT_OUT : CAMERA_SELECT_IN); + OS_TPrintf("call CAMERA_I2CActivate(%s)... ", (current == CAMERA_SELECT_IN ? "CAMERA_SELECT_IN" : "CAMERA_SELECT_OUT")); +#ifdef DUAL_MODE + result = CAMERA_I2COutputWithDualActivation(current); +#else + result = CAMERA_I2CActivate(current); +#endif + OS_TPrintf("%s\n", result == CAMERA_RESULT_SUCCESS ? "SUCCESS" : "FAILED"); } if (trg & PAD_BUTTON_R) { OS_TPrintf("call CAMERA_I2CActivate(CAMERA_SELECT_NONE)... "); result = CAMERA_I2CActivate(CAMERA_SELECT_NONE); - OS_TPrintf("%s\n", result == CAMERA_RESULT_SUCCESS_TRUE ? "SUCCESS" : "FAILED"); + OS_TPrintf("%s\n", result == CAMERA_RESULT_SUCCESS ? "SUCCESS" : "FAILED"); } if (trg & PAD_BUTTON_START) // start/stop to capture w/o Activate API { @@ -162,14 +204,14 @@ void TwlMain() OS_TPrintf("Done.\n"); #if 0 // resize - OS_TPrintf("call CAMERA_I2CResize(CAMERA_SELECT_IN)... "); - result = CAMERA_I2CResize(CAMERA_SELECT_IN, 320, 240); - OS_TPrintf("%s\n", result == CAMERA_RESULT_SUCCESS_TRUE ? "SUCCESS" : "FAILED"); + OS_TPrintf("call CAMERA_I2CResize(current)... "); + result = CAMERA_I2CResize(current, 320, 240); + OS_TPrintf("%s\n", result == CAMERA_RESULT_SUCCESS ? "SUCCESS" : "FAILED"); #endif // activate inside camera first - OS_TPrintf("call CAMERA_I2CActivate(CAMERA_SELECT_IN)... "); - result = CAMERA_I2CActivate(CAMERA_SELECT_IN); - OS_TPrintf("%s\n", result == CAMERA_RESULT_SUCCESS_TRUE ? "SUCCESS" : "FAILED"); + OS_TPrintf("call CAMERA_I2CActivate(current)... "); + result = CAMERA_I2CActivate(current); + OS_TPrintf("%s\n", result == CAMERA_RESULT_SUCCESS ? "SUCCESS" : "FAILED"); } } } @@ -236,7 +278,8 @@ void CameraIntr(void) if (MIi_IsExDmaBusy(DMA_NO)) // NOT done to capture last frame? { OS_TPrintf("DMA was not done until VBlank.\n"); - return; // waiting next frame (skip current frame) + MIi_StopExDma(DMA_NO); // DMA停止 +// return; // waiting next frame (skip current frame) } // start to capture for next frame CAMERA_DmaRecvAsync(DMA_NO, (void *)HW_LCDC_VRAM_A, BYTES_PER_LINE * LINES_AT_ONCE, BYTES_PER_LINE * HEIGHT); diff --git a/build/tests/camera/camera-2/ARM9/src/main.c b/build/tests/camera/camera-2/ARM9/src/main.c index 147b736..7f6a0bb 100644 --- a/build/tests/camera/camera-2/ARM9/src/main.c +++ b/build/tests/camera/camera-2/ARM9/src/main.c @@ -76,13 +76,13 @@ void TwlMain() CAMERA_Init(); // wakeup camera module result = CAMERA_I2CActivate(CAMERA_SELECT_IN); - if (result != CAMERA_RESULT_SUCCESS_TRUE) + if (result != CAMERA_RESULT_SUCCESS) { OS_TPrintf("CAMERA_I2CActivate was failed. (%d)\n", result); } #if 0 result = CAMERA_I2CResize(CAMERA_SELECT_IN, 320, 240); - if (result != CAMERA_RESULT_SUCCESS_TRUE) + if (result != CAMERA_RESULT_SUCCESS) { OS_TPrintf("CAMERA_I2CResize was failed. (%d)\n", result); } diff --git a/build/tests/camera/camera-3/ARM9/src/main.c b/build/tests/camera/camera-3/ARM9/src/main.c index 33b5a72..3820950 100644 --- a/build/tests/camera/camera-3/ARM9/src/main.c +++ b/build/tests/camera/camera-3/ARM9/src/main.c @@ -146,13 +146,13 @@ void TwlMain() CAMERA_Init(); // wakeup camera module result = CAMERA_I2CActivate(CAMERA_SELECT_IN); - if (result != CAMERA_RESULT_SUCCESS_TRUE) + if (result != CAMERA_RESULT_SUCCESS) { OS_TPrintf("CAMERA_I2CActivate was failed. (%d)\n", result); } #if 0 result = CAMERA_I2CResize(CAMERA_SELECT_IN, 320, 240); - if (result != CAMERA_RESULT_SUCCESS_TRUE) + if (result != CAMERA_RESULT_SUCCESS) { OS_TPrintf("CAMERA_I2CResize was failed. (%d)\n", result); } @@ -170,8 +170,9 @@ void TwlMain() OS_SetIrqFunction(OS_IE_CAM, CameraIntr); (void)OS_EnableIrqMask(OS_IE_CAM); - // カメラスタート (リクエストのみ) + // カメラスタート (割り込みハンドラで代用) startRequest = TRUE; + CameraIntr(); OS_TPrintf("Camera is shooting a movie...\n"); while (1) @@ -241,7 +242,8 @@ void CameraIntr(void) if (MIi_IsExDmaBusy(DMA_NO)) // NOT done to capture last frame? { OS_TPrintf("DMA was not done until VBlank.\n"); - return; // waiting next frame (skip current frame) + MIi_StopExDma(DMA_NO); // DMA停止 +// return; // waiting next frame (skip current frame) } // start to capture for next frame CAMERA_DmaRecvAsync(DMA_NO, GetNextCaptureAddr(), BYTES_PER_LINE * LINES_AT_ONCE, BYTES_PER_LINE * HEIGHT); diff --git a/build/tests/camera/camera-4/ARM9/src/main.c b/build/tests/camera/camera-4/ARM9/src/main.c index ccd6de7..1459afb 100644 --- a/build/tests/camera/camera-4/ARM9/src/main.c +++ b/build/tests/camera/camera-4/ARM9/src/main.c @@ -86,13 +86,13 @@ void TwlMain() CAMERA_Init(); // wakeup camera module result = CAMERA_I2CActivate(CAMERA_SELECT_IN); - if (result != CAMERA_RESULT_SUCCESS_TRUE) + if (result != CAMERA_RESULT_SUCCESS) { OS_TPrintf("CAMERA_I2CActivate was failed. (%d)\n", result); } #if 0 result = CAMERA_I2CResize(CAMERA_SELECT_IN, 320, 240); - if (result != CAMERA_RESULT_SUCCESS_TRUE) + if (result != CAMERA_RESULT_SUCCESS) { OS_TPrintf("CAMERA_I2CResize was failed. (%d)\n", result); } @@ -110,8 +110,9 @@ void TwlMain() OS_SetIrqFunction(OS_IE_CAM, CameraIntr); (void)OS_EnableIrqMask(OS_IE_CAM); - // カメラスタート (リクエストのみ) + // カメラスタート (割り込みハンドラで代用) startRequest = TRUE; + CameraIntr(); OS_TPrintf("Camera is shooting a movie...\n"); while (1) @@ -187,7 +188,8 @@ void CameraIntr(void) if (MIi_IsExDmaBusy(DMA_NO)) // NOT done to capture last frame? { OS_TPrintf("DMA was not done until VBlank.\n"); - return; // waiting next frame (skip current frame) + MIi_StopExDma(DMA_NO); // DMA停止 +// return; // waiting next frame (skip current frame) } // start to capture for next frame if (wp_pending) diff --git a/include/twl/camera/ARM7/i2c.h b/include/twl/camera/ARM7/i2c.h index e757b0e..60d88f4 100644 --- a/include/twl/camera/ARM7/i2c.h +++ b/include/twl/camera/ARM7/i2c.h @@ -41,14 +41,35 @@ BOOL CAMERA_I2CInit(CameraSelect camera); /*---------------------------------------------------------------------------* Name: CAMERA_I2CStandby - Description: standby or resume CAMERA + Description: goto standby - Arguments: camera : one of CameraSelect - standby : TRUE if goto standby mode + Arguments: camera : one of CameraSelect (IN/OUT/BOTH) to goto standby Returns: TRUE if success *---------------------------------------------------------------------------*/ -BOOL CAMERA_I2CStandby(CameraSelect camera, BOOL standby); +BOOL CAMERA_I2CStandby(CameraSelect camera); + +/*---------------------------------------------------------------------------* + Name: CAMERA_I2CResume + + Description: resume from standby + + Arguments: camera : one of CameraSelect (IN/OUT) to resume + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERA_I2CResume(CameraSelect camera); + +/*---------------------------------------------------------------------------* + Name: CAMERA_I2CResumeBoth + + Description: resume both CAMERAs, but only one will output + + Arguments: camera : one of CameraSelect (IN/OUT) to output + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERA_I2CResumeBoth(CameraSelect camera); /*---------------------------------------------------------------------------* Name: CAMERA_I2CResize @@ -63,7 +84,6 @@ BOOL CAMERA_I2CStandby(CameraSelect camera, BOOL standby); *---------------------------------------------------------------------------*/ BOOL CAMERA_I2CResize(CameraSelect camera, u16 width, u16 height); - /*---------------------------------------------------------------------------* Name: CAMERA_I2CFrameRate diff --git a/include/twl/camera/ARM7/i2c_micron.h b/include/twl/camera/ARM7/i2c_micron.h index fcf20aa..dfa2289 100644 --- a/include/twl/camera/ARM7/i2c_micron.h +++ b/include/twl/camera/ARM7/i2c_micron.h @@ -282,14 +282,35 @@ BOOL CAMERAi_M_I2CInit(CameraSelect camera); /*---------------------------------------------------------------------------* Name: CAMERAi_M_I2CStandby - Description: standby or resume CAMERA + Description: goto standby - Arguments: camera : one of CameraSelect - standby : TRUE if goto standby mode + Arguments: camera : one of CameraSelect (IN/OUT/BOTH) to goto standby Returns: TRUE if success *---------------------------------------------------------------------------*/ -BOOL CAMERAi_M_I2CStandby(CameraSelect camera, BOOL standby); +BOOL CAMERAi_M_I2CStandby(CameraSelect camera); + +/*---------------------------------------------------------------------------* + Name: CAMERAi_M_I2CResume + + Description: resume from standby + + Arguments: camera : one of CameraSelect (IN/OUT) to resume + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERAi_M_I2CResume(CameraSelect camera); + +/*---------------------------------------------------------------------------* + Name: CAMERAi_M_I2CResumeBoth + + Description: resume both CAMERAs, but only one will output + + Arguments: camera : one of CameraSelect (IN/OUT) to output + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERAi_M_I2CResumeBoth(CameraSelect camera); /*---------------------------------------------------------------------------* Name: CAMERAi_M_I2CResize diff --git a/include/twl/camera/ARM7/i2c_sharp.h b/include/twl/camera/ARM7/i2c_sharp.h index d48e422..ed4d528 100644 --- a/include/twl/camera/ARM7/i2c_sharp.h +++ b/include/twl/camera/ARM7/i2c_sharp.h @@ -282,14 +282,35 @@ BOOL CAMERAi_S_I2CInit(CameraSelect camera); /*---------------------------------------------------------------------------* Name: CAMERAi_S_I2CStandby - Description: standby or resume CAMERA + Description: goto standby - Arguments: camera : one of CameraSelect - standby : TRUE if goto standby mode + Arguments: camera : one of CameraSelect (IN/OUT/BOTH) to goto standby Returns: TRUE if success *---------------------------------------------------------------------------*/ -BOOL CAMERAi_S_I2CStandby(CameraSelect camera, BOOL standby); +BOOL CAMERAi_S_I2CStandby(CameraSelect camera); + +/*---------------------------------------------------------------------------* + Name: CAMERAi_S_I2CResume + + Description: resume from standby + + Arguments: camera : one of CameraSelect (IN/OUT) to resume + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERAi_S_I2CResume(CameraSelect camera); + +/*---------------------------------------------------------------------------* + Name: CAMERAi_S_I2CResumeBoth + + Description: resume both CAMERAs, but only one will output + + Arguments: camera : one of CameraSelect (IN/OUT) to output + + Returns: TRUE if success + *---------------------------------------------------------------------------*/ +BOOL CAMERAi_S_I2CResumeBoth(CameraSelect camera); /*---------------------------------------------------------------------------* Name: CAMERAi_S_I2CResize diff --git a/include/twl/camera/ARM9/camera_api.h b/include/twl/camera/ARM9/camera_api.h index 6e08cf0..be428bb 100644 --- a/include/twl/camera/ARM9/camera_api.h +++ b/include/twl/camera/ARM9/camera_api.h @@ -120,9 +120,10 @@ CAMERAResult CAMERA_I2CInit(CameraSelect camera); Name: CAMERA_I2CActivateAsync Description: activate specified CAMERA (goto standby if NONE is specified) + if you want to activate both cameras, use CAMERA_I2COutputWithDualActivation[Async] async version - Arguments: camera - one of CameraSelect + Arguments: camera - one of CameraSelect (BOTH is not valid) callback - 非同期処理が完了した再に呼び出す関数を指定 arg - コールバック関数の呼び出し時の引数を指定。 @@ -134,14 +135,41 @@ CAMERAResult CAMERA_I2CActivateAsync(CameraSelect camera, CAMERACallback callbac Name: CAMERA_I2CActivate Description: activate specified CAMERA (goto standby if NONE is specified) + if you want to activate both cameras, use CAMERA_I2COutputWithDualActivation[Async] sync version. - Arguments: camera - one of CameraSelect + Arguments: camera - one of CameraSelect (BOTH is not valid) Returns: CAMERAResult *---------------------------------------------------------------------------*/ CAMERAResult CAMERA_I2CActivate(CameraSelect camera); +/*---------------------------------------------------------------------------* + Name: CAMERA_I2COutputWithDualActivationAsync + + Description: activate both camera and output specified CAMERA + async version + + Arguments: camera - one of CameraSelect (IN or OUT) + callback - 非同期処理が完了した再に呼び出す関数を指定 + arg - コールバック関数の呼び出し時の引数を指定。 + + Returns: CAMERAResult + *---------------------------------------------------------------------------*/ +CAMERAResult CAMERA_I2COutputWithDualActivationAsync(CameraSelect camera, CAMERACallback callback, void *arg); + +/*---------------------------------------------------------------------------* + Name: CAMERA_I2COutputWithDualActivation + + Description: activate both camera and output specified CAMERA + sync version. + + Arguments: camera - one of CameraSelect (IN or OUT) + + Returns: CAMERAResult + *---------------------------------------------------------------------------*/ +CAMERAResult CAMERA_I2COutputWithDualActivation(CameraSelect camera); + /*---------------------------------------------------------------------------* Name: CAMERAi_I2CResizeAsync diff --git a/include/twl/camera/common/fifo.h b/include/twl/camera/common/fifo.h index 502d16e..e8e5333 100644 --- a/include/twl/camera/common/fifo.h +++ b/include/twl/camera/common/fifo.h @@ -50,6 +50,7 @@ typedef enum CAMERAPxiCommand CAMERA_PXI_COMMAND_INIT = 0x00, // 初期化 CAMERA_PXI_COMMAND_ACTIVATE = 0x10, // アクティブ選択 + CAMERA_PXI_COMMAND_OUTPUT_WITH_DUAL_ACTIVATION = 0x11, // 出力選択(両方アクティブ) CAMERA_PXI_COMMAND_RESIZE = 0x30, // サイズ設定 CAMERA_PXI_COMMAND_FRAME_RATE = 0x31, // フレームレート設定 @@ -66,6 +67,7 @@ typedef enum CAMERAPxiSize CAMERA_PXI_SIZE_INIT = 1, // camera CAMERA_PXI_SIZE_ACTIVATE = 1, // camera + CAMERA_PXI_SIZE_OUTPUT_WITH_DUAL_ACTIVATION = 1, // camera CAMERA_PXI_SIZE_RESIZE = 5, // camera, (u16)width, (u16)height CAMERA_PXI_SIZE_FRAME_RATE = 2, // camera, rate @@ -80,11 +82,11 @@ CAMERAPxiSize; typedef enum CAMERAPxiResult { CAMERA_PXI_RESULT_SUCCESS = 0, // 処理成功 (void/void*型) // 場合により後続パケットあり - CAMERA_PXI_RESULT_SUCCESS_TRUE, // 処理成功 (BOOL型) + CAMERA_PXI_RESULT_SUCCESS_TRUE = 0, // 処理成功 (BOOL型) CAMERA_PXI_RESULT_SUCCESS_FALSE, // 処理成功 (BOOL型) CAMERA_PXI_RESULT_INVALID_COMMAND, // 不正なPXIコマンド CAMERA_PXI_RESULT_INVALID_PARAMETER, // 不正なパラメータ - CAMERA_PXI_RESULT_ILLEGAL_STATUS, // RTCの状態により処理を実行不能 + CAMERA_PXI_RESULT_ILLEGAL_STATUS, // CAMERAの状態により処理を実行不可 CAMERA_PXI_RESULT_BUSY, // 他のリクエストを実行中 CAMERA_PXI_RESULT_FATAL_ERROR, // その他何らかの原因で処理に失敗 CAMERA_PXI_RESULT_MAX