mirror of
https://github.com/rvtr/twl_wrapsdk.git
synced 2025-10-31 06:11:10 -04:00
divide standby/resume functions
support dual activation mode fix result value change camera intialization to without output git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@247 4ee2a332-4b2b-5046-8439-1ba90f034370
This commit is contained in:
parent
3d1290d6c2
commit
1dadd63d17
@ -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
|
||||
|
||||
@ -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=<o> Mode : Landscape
|
||||
LOAD=<o> 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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
// サポートしないコマンド
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user