}
+static int _camera_v4l2_g_ctrl(int device_fd, int cid, int *value)
+{
+ int ret = 0;
+ struct v4l2_control ctrl;
+
+ if (!value) {
+ LOGE("NULL param");
+ return CAMERA_ERROR_INVALID_PARAMETER;
+ }
+
+ memset(&ctrl, 0x0, sizeof(struct v4l2_control));
+
+ ctrl.id = cid;
+
+ ret = ioctl(device_fd, VIDIOC_G_CTRL, &ctrl);
+
+ *value = ctrl.value;
+
+ LOGD("G_CTRL id 0x%x, value %d, ret %d", cid, *value, ret);
+
+ return ret;
+}
+
+
+static int _camera_v4l2_s_ctrl(int device_fd, int cid, int value)
+{
+ int ret = 0;
+ struct v4l2_control ctrl;
+
+ memset(&ctrl, 0x0, sizeof(struct v4l2_control));
+
+ ctrl.id = cid;
+ ctrl.value = value;
+
+ ret = ioctl(device_fd, VIDIOC_S_CTRL, &ctrl);
+
+ LOGD("S_CTRL id 0x%x, value %d, ret %d", cid, value, ret);
+
+ return ret;
+}
+
+
static int _camera_v4l2_stream(int device_fd, int type, gboolean onoff)
{
if (device_fd < 0) {
int camera_set_command(void *camera_handle, int64_t command, void *value)
{
+ int ret = CAMERA_ERROR_NONE;
+ int cid = 0;
+ int ctrl_ret = 0;
camera_hal_handle *handle = NULL;
if (!camera_handle) {
return CAMERA_ERROR_INVALID_STATE;
}
- LOGD("set command %lld - state %d", command, handle->state);
+ LOGD("set command %llx - state %d", command, handle->state);
- /* TODO: to be implemented */
+ switch (command) {
+ case CAMERA_COMMAND_EXPOSURE:
+ cid = V4L2_CID_BRIGHTNESS;
+ break;
+ case CAMERA_COMMAND_CONTRAST:
+ cid = V4L2_CID_CONTRAST;
+ break;
+ case CAMERA_COMMAND_SATURATION:
+ cid = V4L2_CID_SATURATION;
+ break;
+ case CAMERA_COMMAND_SHARPNESS:
+ cid = V4L2_CID_SHARPNESS;
+ break;
+ default:
+ LOGE("NOT_SUPPORTED %llx", command);
+ g_mutex_unlock(&handle->lock);
+ return CAMERA_ERROR_DEVICE_NOT_SUPPORTED;
+ }
+
+ ctrl_ret = _camera_v4l2_s_ctrl(handle->device_fd, cid, (int)value);
+ if (ctrl_ret < 0) {
+ switch (errno) {
+ case EACCES:
+ case EPERM:
+ LOGE("Permission denied %d", errno);
+ ret = CAMERA_ERROR_PERMISSION_DENIED;
+ break;
+ case EINVAL:
+ LOGE("Invalid argument");
+ ret = CAMERA_ERROR_INVALID_PARAMETER;
+ break;
+ case EBUSY:
+ LOGE("Device busy");
+ ret = CAMERA_ERROR_DEVICE_BUSY;
+ break;
+ case ENOTSUP:
+ LOGE("Not supported");
+ ret = CAMERA_ERROR_DEVICE_NOT_SUPPORTED;
+ break;
+ default:
+ LOGE("Unknown errro %d", errno);
+ ret = CAMERA_ERROR_INTERNAL;
+ break;
+ }
+ }
g_mutex_unlock(&handle->lock);
- return CAMERA_ERROR_NONE;
+ return ret;
}
int camera_get_command(void *camera_handle, int64_t command, void **value)
{
+ int ret = CAMERA_ERROR_NONE;
+ int cid = 0;
+ int ctrl_ret = 0;
camera_hal_handle *handle = NULL;
if (!camera_handle) {
g_mutex_lock(&handle->lock);
- LOGD("get command %lld - state %d", command, handle->state);
+ LOGD("get command %llx - state %d", command, handle->state);
- /* TODO: to be implemented */
+ switch (command) {
+ case CAMERA_COMMAND_EXPOSURE:
+ cid = V4L2_CID_BRIGHTNESS;
+ break;
+ case CAMERA_COMMAND_CONTRAST:
+ cid = V4L2_CID_CONTRAST;
+ break;
+ case CAMERA_COMMAND_SATURATION:
+ cid = V4L2_CID_SATURATION;
+ break;
+ case CAMERA_COMMAND_SHARPNESS:
+ cid = V4L2_CID_SHARPNESS;
+ break;
+ default:
+ LOGE("NOT_SUPPORTED %llx", command);
+ g_mutex_unlock(&handle->lock);
+ return CAMERA_ERROR_DEVICE_NOT_SUPPORTED;
+ }
+
+ ctrl_ret = _camera_v4l2_g_ctrl(handle->device_fd, cid, (int *)value);
+ if (ctrl_ret < 0) {
+ switch (errno) {
+ case EACCES:
+ case EPERM:
+ LOGE("Permission denied %d", errno);
+ ret = CAMERA_ERROR_PERMISSION_DENIED;
+ break;
+ case EINVAL:
+ LOGE("Invalid argument");
+ ret = CAMERA_ERROR_INVALID_PARAMETER;
+ break;
+ case EBUSY:
+ LOGE("Device busy");
+ ret = CAMERA_ERROR_DEVICE_BUSY;
+ break;
+ case ENOTSUP:
+ LOGE("Not supported");
+ ret = CAMERA_ERROR_DEVICE_NOT_SUPPORTED;
+ break;
+ default:
+ LOGE("Unknown errro %d", errno);
+ ret = CAMERA_ERROR_INTERNAL;
+ break;
+ }
+ }
g_mutex_unlock(&handle->lock);
- return CAMERA_ERROR_NONE;
+ return ret;
}
int camera_set_batch_command(void *camera_handle, camera_batch_command_control_t *batch_command, int64_t *error_command)