[imx227][camera] Add return status to Camera APIs
- Need to add status message return for testing
Camera Sensor APIs
Test: Compiles, tests added in subsequent CLs
Change-Id: Ib4fdee40366b71ad39815d064dfe834bc4fd78e5
diff --git a/zircon/system/banjo/ddk.protocol.camerasensor/camerasensor.banjo b/zircon/system/banjo/ddk.protocol.camerasensor/camerasensor.banjo
index 958c03e..85626f4 100644
--- a/zircon/system/banjo/ddk.protocol.camerasensor/camerasensor.banjo
+++ b/zircon/system/banjo/ddk.protocol.camerasensor/camerasensor.banjo
@@ -97,15 +97,15 @@
// Sets the Camera Sensor Mode to one of the supported modes.
SetMode(uint8 mode) -> (zx.status s);
// Start streaming from the camera sensor.
- StartStreaming() -> ();
+ StartStreaming() -> (zx.status s);
// Stop steaming.
- StopStreaming() -> ();
+ StopStreaming() -> (zx.status s);
// Change Analog Gain.
SetAnalogGain(int32 gain) -> (int32 gain);
// Change Digital Gain.
SetDigitalGain(int32 gain) -> (int32 gain);
// Set Integration Time.
- SetIntegrationTime(int32 int_time, int32 int_time_M, int32 int_time_L) -> ();
+ SetIntegrationTime(int32 int_time) -> (zx.status s);
// Update the sensor with new parameters.
Update() -> (zx.status s);
// Gets the Sensor Parameters.
diff --git a/zircon/system/dev/camera/arm-isp/modules/sensor.cpp b/zircon/system/dev/camera/arm-isp/modules/sensor.cpp
index 98236af..c50dce6 100644
--- a/zircon/system/dev/camera/arm-isp/modules/sensor.cpp
+++ b/zircon/system/dev/camera/arm-isp/modules/sensor.cpp
@@ -212,18 +212,16 @@
return camera_sensor_.SetDigitalGain(gain);
}
-void Sensor::StartStreaming() {
- camera_sensor_.StartStreaming();
+zx_status_t Sensor::StartStreaming() {
+ return camera_sensor_.StartStreaming();
}
-void Sensor::StopStreaming() {
- camera_sensor_.StopStreaming();
+zx_status_t Sensor::StopStreaming() {
+ return camera_sensor_.StopStreaming();
}
-void Sensor::SetIntegrationTime(int32_t int_time,
- int32_t int_time_M,
- int32_t int_time_L) {
- camera_sensor_.SetIntegrationTime(int_time, int_time_M, int_time_L);
+zx_status_t Sensor::SetIntegrationTime(int32_t int_time) {
+ return camera_sensor_.SetIntegrationTime(int_time);
}
zx_status_t Sensor::Update() {
diff --git a/zircon/system/dev/camera/arm-isp/modules/sensor.h b/zircon/system/dev/camera/arm-isp/modules/sensor.h
index 2c4443b..06ea025 100644
--- a/zircon/system/dev/camera/arm-isp/modules/sensor.h
+++ b/zircon/system/dev/camera/arm-isp/modules/sensor.h
@@ -37,11 +37,9 @@
size_t modes_count);
int32_t SetAnalogGain(int32_t gain);
int32_t SetDigitalGain(int32_t gain);
- void StartStreaming();
- void StopStreaming();
- void SetIntegrationTime(int32_t int_time,
- int32_t int_time_M,
- int32_t int_time_L);
+ zx_status_t StartStreaming();
+ zx_status_t StopStreaming();
+ zx_status_t SetIntegrationTime(int32_t int_time);
private:
zx_status_t HwInit();
diff --git a/zircon/system/dev/camera/imx227/imx227.cpp b/zircon/system/dev/camera/imx227/imx227.cpp
index bcf7530..e754331 100644
--- a/zircon/system/dev/camera/imx227/imx227.cpp
+++ b/zircon/system/dev/camera/imx227/imx227.cpp
@@ -182,12 +182,19 @@
ctx_.param.integration_time_apply_delay = 2;
ctx_.param.isp_exposure_channel_delay = 0;
+ initialized_ = true;
zxlogf(INFO, "%s IMX227 Camera Sensor Brought out of reset\n", __func__);
return ZX_OK;
}
void Imx227Device::CameraSensorDeInit() {
mipi_.DeInit();
+ // Enable 24M clock for sensor.
+ clk24_.Disable();
+ // Reference code has it, mostly likely needed for the clock to
+ // stabalize. No other way of knowing for sure if sensor is now off.
+ zx_nanosleep(zx_deadline_after(ZX_MSEC(10)));
+ initialized_ = false;
}
zx_status_t Imx227Device::CameraSensorGetInfo(sensor_info_t* out_info) {
@@ -219,7 +226,7 @@
zxlogf(INFO, "%s IMX227 Camera Sensor Mode Set request to %d\n", __func__, mode);
// Get Sensor ID to see if sensor is initialized.
- if (!ValidateSensorID()) {
+ if (!IsSensorInitialized() || !ValidateSensorID()) {
return ZX_ERR_INTERNAL;
}
@@ -294,15 +301,23 @@
return mipi_.Init(&mipi_info, &adap_info);
}
-void Imx227Device::CameraSensorStartStreaming() {
+zx_status_t Imx227Device::CameraSensorStartStreaming() {
+ if (!IsSensorInitialized()) {
+ return ZX_ERR_BAD_STATE;
+ }
zxlogf(INFO, "%s Camera Sensor Start Streaming\n", __func__);
ctx_.streaming_flag = 1;
WriteReg(0x0100, 0x01);
+ return ZX_OK;
}
-void Imx227Device::CameraSensorStopStreaming() {
+zx_status_t Imx227Device::CameraSensorStopStreaming() {
+ if (!IsSensorInitialized()) {
+ return ZX_ERR_BAD_STATE;
+ }
ctx_.streaming_flag = 0;
WriteReg(0x0100, 0x00);
+ return ZX_OK;
}
int32_t Imx227Device::CameraSensorSetAnalogGain(int32_t gain) {
@@ -313,9 +328,9 @@
return ZX_ERR_NOT_SUPPORTED;
}
-void Imx227Device::CameraSensorSetIntegrationTime(int32_t int_time,
- int32_t int_time_M,
- int32_t int_time_L) {
+zx_status_t Imx227Device::CameraSensorSetIntegrationTime(int32_t int_time) {
+ // TODO(braval): Add support for this.
+ return ZX_ERR_NOT_SUPPORTED;
}
zx_status_t Imx227Device::CameraSensorUpdate() {
@@ -357,14 +372,12 @@
return status;
}
-
zx_device_prop_t props[] = {
{BIND_PLATFORM_DEV_VID, 0, PDEV_VID_SONY},
{BIND_PLATFORM_DEV_PID, 0, PDEV_PID_SONY_IMX227},
{BIND_PLATFORM_DEV_DID, 0, PDEV_DID_CAMERA_SENSOR},
};
-
status = sensor_device->DdkAdd("imx227", 0, props, countof(props));
if (status != ZX_OK) {
zxlogf(ERROR, "imx227: Could not create imx227 sensor device: %d\n", status);
diff --git a/zircon/system/dev/camera/imx227/imx227.h b/zircon/system/dev/camera/imx227/imx227.h
index d3e94f2..cf80fbd 100644
--- a/zircon/system/dev/camera/imx227/imx227.h
+++ b/zircon/system/dev/camera/imx227/imx227.h
@@ -77,15 +77,19 @@
void DdkUnbind();
void DdkRelease();
+ // Testing interface will need to use this to check
+ // the status of the sensor.
+ bool IsSensorInitialized() { return initialized_; }
+
// Methods for ZX_PROTOCOL_CAMERA_SENSOR.
zx_status_t CameraSensorInit();
void CameraSensorDeInit();
zx_status_t CameraSensorSetMode(uint8_t mode);
- void CameraSensorStartStreaming();
- void CameraSensorStopStreaming();
+ zx_status_t CameraSensorStartStreaming();
+ zx_status_t CameraSensorStopStreaming();
int32_t CameraSensorSetAnalogGain(int32_t gain);
int32_t CameraSensorSetDigitalGain(int32_t gain);
- void CameraSensorSetIntegrationTime(int32_t int_time, int32_t int_time_M, int32_t int_time_L);
+ zx_status_t CameraSensorSetIntegrationTime(int32_t int_time);
zx_status_t CameraSensorUpdate();
zx_status_t CameraSensorGetInfo(sensor_info_t* out_info);
zx_status_t CameraSensorGetSupportedModes(sensor_mode_t* out_modes_list,
@@ -104,6 +108,9 @@
ddk::ClockProtocolClient clk24_;
ddk::MipiCsiProtocolClient mipi_;
+ // Sensor Status.
+ bool initialized_ = false;
+
// I2C Helpers.
uint8_t ReadReg(uint16_t addr);
void WriteReg(uint16_t addr, uint8_t val);
@@ -113,5 +120,4 @@
void ShutDown();
bool ValidateSensorID();
};
-
} // namespace camera