From e3534476f7ac554a92599ec2c48680aedb2625d4 Mon Sep 17 00:00:00 2001 From: TO21Consortium <51391510+TO21Consortium@users.noreply.github.com> Date: Tue, 11 Jun 2019 18:50:50 +0900 Subject: [PATCH] import exynos 7570 bsp * source taken from https://github.com/TO21Consortium/SGSWPlatform Change-Id: Ieb7de313efec30c402ef125c2c94697c49d5760d --- Android.mk | 25 + CleanSpec.mk | 50 + NOTICE | 190 ++ exynos5.mk | 29 + include/Exynos.h | 77 + include/ExynosCamera.h | 939 ++++++ include/ExynosRect.h | 172 + include/content_protect.h | 49 + include/exynos_mem.h | 28 + include/s3c_lcd.h | 84 + include/sec_g2d.h | 251 ++ include/sec_g2ddrm.h | 37 + include/videodev2_exynos_camera.h | 1225 +++++++ include/videodev2_exynos_camera_ext.h | 2914 +++++++++++++++++ libgscaler/Android.mk | 43 + libgscaler/libgscaler_obj.cpp | 1661 ++++++++++ libkeymaster/Android.mk | 33 + libkeymaster/NOTICE | 190 ++ libkeymaster/keymaster_mobicore.cpp | 503 +++ libkeymaster/tci.h | 85 + libkeymaster/tlTeeKeymaster_Api.h | 262 ++ libkeymaster/tlTeeKeymaster_log.h | 48 + libkeymaster/tlcTeeKeymaster_if.c | 1092 ++++++ libkeymaster/tlcTeeKeymaster_if.h | 324 ++ libscaler/libscaler-m2m1shot.cpp | 217 ++ libscaler/libscaler-v4l2.cpp | 433 +++ .../linux/fimc-is-metadata.h | 804 +++++ original-kernel-headers/linux/media.h | 125 + original-kernel-headers/linux/v4l2-mediabus.h | 100 + original-kernel-headers/linux/v4l2-subdev.h | 94 + .../linux/videodev2_exynos_media.h | 189 ++ 31 files changed, 12273 insertions(+) create mode 100644 Android.mk create mode 100644 CleanSpec.mk create mode 100644 NOTICE create mode 100644 exynos5.mk create mode 100644 include/Exynos.h create mode 100644 include/ExynosCamera.h create mode 100644 include/ExynosRect.h create mode 100644 include/content_protect.h create mode 100644 include/exynos_mem.h create mode 100644 include/s3c_lcd.h create mode 100644 include/sec_g2d.h create mode 100644 include/sec_g2ddrm.h create mode 100644 include/videodev2_exynos_camera.h create mode 100644 include/videodev2_exynos_camera_ext.h create mode 100644 libgscaler/Android.mk create mode 100644 libgscaler/libgscaler_obj.cpp create mode 100644 libkeymaster/Android.mk create mode 100644 libkeymaster/NOTICE create mode 100644 libkeymaster/keymaster_mobicore.cpp create mode 100644 libkeymaster/tci.h create mode 100644 libkeymaster/tlTeeKeymaster_Api.h create mode 100644 libkeymaster/tlTeeKeymaster_log.h create mode 100644 libkeymaster/tlcTeeKeymaster_if.c create mode 100644 libkeymaster/tlcTeeKeymaster_if.h create mode 100644 libscaler/libscaler-m2m1shot.cpp create mode 100644 libscaler/libscaler-v4l2.cpp create mode 100644 original-kernel-headers/linux/fimc-is-metadata.h create mode 100644 original-kernel-headers/linux/media.h create mode 100644 original-kernel-headers/linux/v4l2-mediabus.h create mode 100644 original-kernel-headers/linux/v4l2-subdev.h create mode 100644 original-kernel-headers/linux/videodev2_exynos_media.h diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..6154f91 --- /dev/null +++ b/Android.mk @@ -0,0 +1,25 @@ +# +# +# Copyright (C) 2009 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +ifeq ($(TARGET_BOARD_PLATFORM),exynos5) + +exynos5_dirs := \ + libkeymaster + +include $(call all-named-subdir-makefiles,$(exynos5_dirs)) + +endif diff --git a/CleanSpec.mk b/CleanSpec.mk new file mode 100644 index 0000000..461cf26 --- /dev/null +++ b/CleanSpec.mk @@ -0,0 +1,50 @@ +# Copyright (C) 2007 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# If you don't need to do a full clean build but would like to touch +# a file or delete some intermediate files, add a clean step to the end +# of the list. These steps will only be run once, if they haven't been +# run before. +# +# E.g.: +# $(call add-clean-step, touch -c external/sqlite/sqlite3.h) +# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates) +# +# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with +# files that are missing or have been moved. +# +# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory. +# Use $(OUT_DIR) to refer to the "out" directory. +# +# If you need to re-do something that's already mentioned, just copy +# the command and add it to the bottom of the list. E.g., if a change +# that you made last week required touching a file and a change you +# made today requires touching the same file, just copy the old +# touch step and add it to the end of the list. +# +# ************************************************ +# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST +# ************************************************ + +# For example: +#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates) +#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates) +#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f) +#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*) + +# ************************************************ +# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST +# ************************************************ +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libMcClient_intermediates) diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..316b4eb --- /dev/null +++ b/NOTICE @@ -0,0 +1,190 @@ + + Copyright (c) 2014, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/exynos5.mk b/exynos5.mk new file mode 100644 index 0000000..3218933 --- /dev/null +++ b/exynos5.mk @@ -0,0 +1,29 @@ +# +# Copyright (C) 2012 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# hw composer HAL +PRODUCT_PACKAGES += \ + hwcomposer.exynos5 + +PRODUCT_PACKAGES += \ + gralloc.exynos5 + +PRODUCT_PACKAGES += \ + memtrack.exynos5 + +# MobiCore +#PRODUCT_PACKAGES += \ +# mcDriverDaemon diff --git a/include/Exynos.h b/include/Exynos.h new file mode 100644 index 0000000..bca11c8 --- /dev/null +++ b/include/Exynos.h @@ -0,0 +1,77 @@ +/* + * Copyright Samsung Electronics Co.,LTD. + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*! + * \file Exynos.h + * \brief header file for Exynos + * \author Sangwoo, Park(sw5771.park@samsung.com) + * \date 2012/03/14 + * + * Revision History: + * - 2012/03/14 : Sangwoo, Park(sw5771.park@samsung.com) \n + * Initial version + * + */ + +/** + * @mainpage Exynos SDK API Reference + * + * @section Introduction + * This library is common development API on S.LSI chip of Samsung. + * + * @section Sub-module + * + * @subpage ExynosBuffer + * \n + * @subpage ExynosRect + * \n + * @subpage ExynosMutex + * \n + * @subpage ExynosJpegEncoder + * \n + * @subpage ExynosJpegDecoder + * \n + * @subpage ExynosCamera + * \n + * @subpage ExynosHdmi + * \n + * @subpage ExynosDC + * \n + * @subpage exynos_gscaler + * \n + * @subpage exynos_v4l2 + * \n + * @subpage exynos_rotator + * \n + * + * @section Copyright + * Copyright (c) 2008-2011 Samsung Electronics Co., Ltd.All rights reserved. \n + * Proprietary and Confidential + * + * @image html samsung.png + */ + +/*! + * \defgroup Exynos S/W Platform + * \brief Exynos SDK for S.LSI's chip + */ + +#ifndef EXYNOS_H_ +#define EXYNOS_H_ + +#endif //EXYNOS_H_ + diff --git a/include/ExynosCamera.h b/include/ExynosCamera.h new file mode 100644 index 0000000..0d28021 --- /dev/null +++ b/include/ExynosCamera.h @@ -0,0 +1,939 @@ +/* +** +** Copyright 2008, The Android Open Source Project +** Copyright 2010, Samsung Electronics Co. LTD +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed toggle an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +/*! + * \file ExynosCamera.h + * \brief hearder file for CAMERA HAL MODULE + * \author thun.hwang(thun.hwang@samsung.com) + * \date 2010/06/03 + * + * Revision History: + * - 2011/12/31 : thun.hwang(thun.hwang@samsung.com) \n + * Initial version + * + * - 2012/01/18 : Sangwoo, Park(sw5771.park@samsung.com) \n + * Adjust Doxygen Document + * + * - 2012/02/01 : Sangwoo, Park(sw5771.park@samsung.com) \n + * Adjust libv4l2 + * Adjust struct ExynosCameraInfo + * External ISP feature + * + * - 2012/03/14 : sangwoo.park(sw5771.park@samsung.com) \n + * Change file, class name to ExynosXXX. + */ + +#ifndef EXYNOS_CAMERA_H__ +#define EXYNOS_CAMERA_H__ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include "cutils/properties.h" + +#include "exynos_format.h" +#include "ExynosBuffer.h" +#include "ExynosRect.h" +#include "ExynosJpegEncoderForCamera.h" +#include "ExynosExif.h" +#include "exynos_v4l2.h" + +#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) +namespace android { + +#define GAIA_FW_BETA 1 +/* FIXME: This is for test. We remove this after test */ +#define USE_DIGITAL_ZOOM + +//! struct for Camera sensor information +/*! + * \ingroup Exynos + */ +struct ExynosCameraInfo +{ +public: + // Google Official API : Camera.Parameters + // http://developer.android.com/reference/android/hardware/Camera.Parameters.html + int previewW; + int previewH; + int previewColorFormat; + int videoW; + int videoH; + int videoColorFormat; + int pictureW; + int pictureH; + int pictureColorFormat; + int thumbnailW; + int thumbnailH; + + int antiBandingList; + int antiBanding; + + int effectList; + int effect; + + int flashModeList; + int flashMode; + + int focusModeList; + int focusMode; + + int sceneModeList; + int sceneMode; + + int whiteBalanceList; + int whiteBalance; + bool autoWhiteBalanceLockSupported; + bool autoWhiteBalanceLock; + + int rotation; + int minExposure; + int maxExposure; + int exposure; + + bool autoExposureLockSupported; + bool autoExposureLock; + + int fps; + int focalLengthNum; + int focalLengthDen; + bool supportVideoStabilization; + bool applyVideoStabilization; + bool videoStabilization; + int maxNumMeteringAreas; + int maxNumDetectedFaces; + int maxNumFocusAreas; + int maxZoom; + bool hwZoomSupported; + int zoom; + + long gpsLatitude; + long gpsLongitude; + long gpsAltitude; + long gpsTimestamp; + + // Additional API. + int angle; + bool antiShake; + bool beautyShot; + int brightness; + int contrast; + bool gamma; + bool odc; + int hue; + int iso; + int metering; + bool objectTracking; + bool objectTrackingStart; + + int saturation; + int sharpness; + int shotMode; + bool slowAE; + bool smartAuto; + bool touchAfStart; + bool wdr; + bool tdnr; + +public: + ExynosCameraInfo(); +}; + +struct ExynosCameraInfoM5M0 : public ExynosCameraInfo +{ +public: + ExynosCameraInfoM5M0(); +}; + +struct ExynosCameraInfoS5K6A3 : public ExynosCameraInfo +{ +public: + ExynosCameraInfoS5K6A3(); +}; + +struct ExynosCameraInfoS5K4E5 : public ExynosCameraInfo +{ +public: + ExynosCameraInfoS5K4E5(); +}; + +struct ExynosCameraInfoS5K3H7 : public ExynosCameraInfo +{ +public: + ExynosCameraInfoS5K3H7(); +}; + +//! ExynosCamera +/*! + * \ingroup Exynos + */ +class ExynosCamera : public virtual RefBase { + +/////////////////////////////////////////////////// +// Google Official API : Camera.Parameters +// http://developer.android.com/reference/android/hardware/Camera.Parameters.html +/////////////////////////////////////////////////// +public: + //! Camera ID + enum CAMERA_ID { + CAMERA_ID_BACK = 0, //!< + CAMERA_ID_FRONT = 1, //!< + }; + + //! Anti banding + enum { + ANTIBANDING_AUTO = (1 << 0), //!< \n + ANTIBANDING_50HZ = (1 << 1), //!< \n + ANTIBANDING_60HZ = (1 << 2), //!< \n + ANTIBANDING_OFF = (1 << 3), //!< \n + }; + + //! Effect + enum { + EFFECT_NONE = (1 << 0), //!< \n + EFFECT_MONO = (1 << 1), //!< \n + EFFECT_NEGATIVE = (1 << 2), //!< \n + EFFECT_SOLARIZE = (1 << 3), //!< \n + EFFECT_SEPIA = (1 << 4), //!< \n + EFFECT_POSTERIZE = (1 << 5), //!< \n + EFFECT_WHITEBOARD = (1 << 6), //!< \n + EFFECT_BLACKBOARD = (1 << 7), //!< \n + EFFECT_AQUA = (1 << 8), //!< \n + }; + + //! Flash mode + enum { + FLASH_MODE_OFF = (1 << 0), //!< \n + FLASH_MODE_AUTO = (1 << 1), //!< \n + FLASH_MODE_ON = (1 << 2), //!< \n + FLASH_MODE_RED_EYE = (1 << 3), //!< \n + FLASH_MODE_TORCH = (1 << 4), //!< \n + }; + + //! Focus mode + enum { + FOCUS_MODE_AUTO = (1 << 0), //!< \n + FOCUS_MODE_INFINITY = (1 << 1), //!< \n + FOCUS_MODE_MACRO = (1 << 2), //!< \n + FOCUS_MODE_FIXED = (1 << 3), //!< \n + FOCUS_MODE_EDOF = (1 << 4), //!< \n + FOCUS_MODE_CONTINUOUS_VIDEO = (1 << 5), //!< \n + FOCUS_MODE_CONTINUOUS_PICTURE = (1 << 6), //!< \n + FOCUS_MODE_TOUCH = (1 << 7), //!< \n + }; + + //! Scene mode + enum { + SCENE_MODE_AUTO = (1 << 0), //!< \n + SCENE_MODE_ACTION = (1 << 1), //!< \n + SCENE_MODE_PORTRAIT = (1 << 2), //!< \n + SCENE_MODE_LANDSCAPE = (1 << 3), //!< \n + SCENE_MODE_NIGHT = (1 << 4), //!< \n + SCENE_MODE_NIGHT_PORTRAIT = (1 << 5), //!< \n + SCENE_MODE_THEATRE = (1 << 6), //!< \n + SCENE_MODE_BEACH = (1 << 7), //!< \n + SCENE_MODE_SNOW = (1 << 8), //!< \n + SCENE_MODE_SUNSET = (1 << 9), //!< \n + SCENE_MODE_STEADYPHOTO = (1 << 10), //!< \n + SCENE_MODE_FIREWORKS = (1 << 11), //!< \n + SCENE_MODE_SPORTS = (1 << 12), //!< \n + SCENE_MODE_PARTY = (1 << 13), //!< \n + SCENE_MODE_CANDLELIGHT = (1 << 14), //!< \n + }; + + //! White balance + enum { + WHITE_BALANCE_AUTO = (1 << 0), //!< \n + WHITE_BALANCE_INCANDESCENT = (1 << 1), //!< \n + WHITE_BALANCE_FLUORESCENT = (1 << 2), //!< \n + WHITE_BALANCE_WARM_FLUORESCENT = (1 << 3), //!< \n + WHITE_BALANCE_DAYLIGHT = (1 << 4), //!< \n + WHITE_BALANCE_CLOUDY_DAYLIGHT = (1 << 5), //!< \n + WHITE_BALANCE_TWILIGHT = (1 << 6), //!< \n + WHITE_BALANCE_SHADE = (1 << 7), //!< \n + }; + + //! Jpeg Qualtiy + enum JPEG_QUALITY { + JPEG_QUALITY_MIN = 0, //!< + JPEG_QUALITY_ECONOMY = 70, //!< + JPEG_QUALITY_NORMAL = 80, //!< + JPEG_QUALITY_SUPERFINE = 90, //!< + JPEG_QUALITY_MAX = 100, //!< + }; + +private: + //! Constructor + ExynosCamera(); + //! Destructor + virtual ~ExynosCamera(); + +public: + //! Gets the Camera instance + static ExynosCamera* createInstance(void) + { + static ExynosCamera singleton; + return &singleton; + } + + //! Create the instance + bool create(int cameraId); + //! Destroy the instance + bool destroy(void); + //! Check if the instance was created + bool flagCreate(void); + + //! Gets current camera_id + int getCameraId(void); + //! Gets camera sensor name + char *getCameraName(void); + + //! Gets file descriptor by gotten open() for preview + int getPreviewFd(void); + //! Gets file descriptor by gotten open() for recording + int getVideoFd(void); + //! Gets file descriptor by gotten open() for snapshot + int getPictureFd(void); + + //! Starts capturing and drawing preview frames to the screen. + bool startPreview(void); + //! Stop preview + bool stopPreview(void); + //! Check preview start + bool flagStartPreview(void); + //! Gets preview's max buffer + int getPreviewMaxBuf(void); + //! Sets preview's buffer + bool setPreviewBuf(ExynosBuffer *buf); + //! Gets preview's buffer + bool getPreviewBuf(ExynosBuffer *buf); + //! Put(dq) preview's buffer + bool putPreviewBuf(ExynosBuffer *buf); + + //! Sets video's width, height + bool setVideoSize(int w, int h); + //! Gets video's width, height + bool getVideoSize(int *w, int *h); + + //! Sets video's color format + bool setVideoFormat(int colorFormat); + //! Gets video's color format + int getVideoFormat(void); + + //! Start video + bool startVideo(void); + //! Stop video + bool stopVideo(void); + //! Check video start + bool flagStartVideo(void); + //! Gets video's buffer + int getVideoMaxBuf(void); + //! Sets video's buffer + bool setVideoBuf(ExynosBuffer *buf); + //! Gets video's buffer + bool getVideoBuf(ExynosBuffer *buf); + //! Put(dq) video's buffer + bool putVideoBuf(ExynosBuffer *buf); + + //! Start snapshot + bool startPicture(void); + //! Stop snapshot + bool stopPicture(void); + //! Check snapshot start + bool flagStartPicture(void); + //! Gets snapshot's buffer + int getPictureMaxBuf(void); + //! Sets snapshot's buffer + bool setPictureBuf(ExynosBuffer *buf); + //! Gets snapshot's buffer + bool getPictureBuf(ExynosBuffer *buf); + //! Put(dq) snapshot's buffer + bool putPictureBuf(ExynosBuffer *buf); + + //! Encode JPEG from YUV + bool yuv2Jpeg(ExynosBuffer *yuvBuf, ExynosBuffer *jpegBuf, ExynosRect *rect); + + //! Starts camera auto-focus and registers a callback function to run when the camera is focused. + bool autoFocus(void); + //! Cancel auto-focus operation + bool cancelAutoFocus(void); + //! Gets auto-focus result whether success or not + int getFucusModeResult(void); + + //! Starts the face detection. + bool startFaceDetection(void); + //! Stop face detection + bool stopFaceDetection(void); + //! Gets the face detection started + bool flagStartFaceDetection(void); + //! Lock or unlock face detection operation + bool setFaceDetectLock(bool toggle); + + //! Zooms to the requested value smoothly. + bool startSmoothZoom(int value); + //! Stop the face detection. + bool stopSmoothZoom(void); + + //! Gets the current antibanding setting. + int getAntibanding(void); + + //! Gets the state of the auto-exposure lock. + bool getAutoExposureLock(void); + + //! Gets the state of the auto-white balance lock. + bool getAutoWhiteBalanceLock(void); + + //! Gets the current color effect setting. + int getColorEffect(void); + + //! Gets the detected faces areas. + int getDetectedFacesAreas(int num, int *id, int *score, ExynosRect *face, ExynosRect *leftEye, ExynosRect *rightEye, ExynosRect *mouth); + + //! Gets the detected faces areas. (Using ExynosRect2) + int getDetectedFacesAreas(int num, int *id, int *score, ExynosRect2 *face, ExynosRect2 *leftEye, ExynosRect2 *rightEye, ExynosRect2 *mouth); + + //! Gets the current exposure compensation index. + int getExposureCompensation(void); + + //! Gets the exposure compensation step. + float getExposureCompensationStep(void); + + //! Gets the current flash mode setting. + int getFlashMode(void); + + //! Gets the focal length (in millimeter) of the camera. + bool getFocalLength(int *num, int *den); + + //! Gets the current focus areas. + int getFocusAreas(ExynosRect *rects); + + //! Gets the distances from the camera to where an object appears to be in focus. + int getFocusDistances(float *output); + + //! Gets the current focus mode setting. + int getFocusMode(void); + + //! Gets the horizontal angle of view in degrees. + float getHorizontalViewAngle(void); + + //int getInt(String key); + + //! Returns the quality setting for the JPEG picture. + int getJpegQuality(void); + + //! Returns the quality setting for the EXIF thumbnail in Jpeg picture. + int getJpegThumbnailQuality(void); + + //! Returns the dimensions for EXIF thumbnail in Jpeg picture. + bool getJpegThumbnailSize(int *w, int *h); + + //! Gets the maximum exposure compensation index. + int getMaxExposureCompensation(void); + + //! Gets the maximum number of detected faces supported. + int getMaxNumDetectedFaces(void); + + //! Gets the maximum number of focus areas supported. + int getMaxNumFocusAreas(void); + + //! Gets the maximum number of metering areas supported. + int getMaxNumMeteringAreas(void); + + //! Gets the maximum zoom value allowed for snapshot. + int getMaxZoom(void); + + //! Gets the current metering areas. + int getMeteringAreas(ExynosRect *rects); + + //! Gets the minimum exposure compensation index. + int getMinExposureCompensation(void); + + //! Returns the image format for pictures. + int getPictureFormat(void); + + //! Returns the dimension setting for pictures. + bool getPictureSize(int *w, int *h); + + //Camera.Size getPreferredPreviewSizeForVideo(); + + //! Returns the image format for preview frames got from Camera.PreviewCallback. + int getPreviewFormat(void); + + //! Returns the current minimum and maximum preview fps. + bool getPreviewFpsRange(int *min, int *max); + + //! This method is deprecated. replaced by getPreviewFpsRange(int[]) + int getPreviewFrameRate(void); + + //! Returns the dimensions setting for preview pictures. + bool getPreviewSize(int *w, int *h); + + //! Gets scene mode + int getSceneMode(void); + + //! Gets the supported antibanding values. + int getSupportedAntibanding(void); + + //! Gets the supported color effects. + int getSupportedColorEffects(void); + + //! Check whether the target support Flash + int getSupportedFlashModes(void); + + //! Gets the supported focus modes. + int getSupportedFocusModes(void); + + //! Gets the supported jpeg thumbnail sizes. + bool getSupportedJpegThumbnailSizes(int *w, int *h); + + // List getSupportedPictureFormats() + + //! Gets the supported picture sizes. + bool getSupportedPictureSizes(int *w, int *h); + + //List getSupportedPreviewFormats() + + //List getSupportedPreviewFpsRange() + + //List getSupportedPreviewFrameRates() + + //! Gets the supported preview sizes. + bool getSupportedPreviewSizes(int *w, int *h); + + //! Gets the supported scene modes. + int getSupportedSceneModes(void); + + //! Gets the supported video frame sizes that can be used by MediaRecorder. + bool getSupportedVideoSizes(int *w, int *h); + + //! Gets the supported white balance. + int getSupportedWhiteBalance(void); + + //! Gets the vertical angle of view in degrees. + float getVerticalViewAngle(void); + + //! Gets the current state of video stabilization. + bool getVideoStabilization(void); + + //! Gets the current white balance setting. + int getWhiteBalance(void); + + //! Gets current zoom value. + int getZoom(void); + + //List getZoomRatios() + //! Gets max zoom ratio + int getMaxZoomRatio(void); + + //! Returns true if auto-exposure locking is supported. + bool isAutoExposureLockSupported(void); + + //! Returns true if auto-white balance locking is supported. + bool isAutoWhiteBalanceLockSupported(void); + + //! Returns true if smooth zoom is supported. + bool isSmoothZoomSupported(void); + + //! Returns true if video snapshot is supported. + bool isVideoSnapshotSupported(void); + + //! Returns true if video stabilization is supported. + bool isVideoStabilizationSupported(void); + + //! Returns true if zoom is supported. + bool isZoomSupported(void); + + //void remove(String key) + + //void removeGpsData() + + //void set(String key, String value) + + //void set(String key, int value) + + //! Sets the antibanding. + bool setAntibanding(int value); + + //! Sets the auto-exposure lock state. + bool setAutoExposureLock(bool toggle); + + //! Sets the auto-white balance lock state. + bool setAutoWhiteBalanceLock(bool toggle); + + //! Sets the current color effect setting. + bool setColorEffect(int value); + + //! Sets the exposure compensation index. + bool setExposureCompensation(int value); + + //! Sets the flash mode. + bool setFlashMode(int value); + + //! Sets focus z. + bool setFocusAreas(int num, ExynosRect* rects, int *weights); + + //! Sets focus areas. (Using ExynosRect2) + bool setFocusAreas(int num, ExynosRect2* rect2s, int *weights); + + //! Sets the focus mode. + bool setFocusMode(int value); + + //! Sets GPS altitude. + bool setGpsAltitude(const char *gpsAltitude); + + //! Sets GPS latitude coordinate. + bool setGpsLatitude(const char *gpsLatitude); + + //! Sets GPS longitude coordinate. + bool setGpsLongitude(const char *gpsLongitude); + + //! Sets GPS processing method. + bool setGpsProcessingMethod(const char *gpsProcessingMethod); + + //! Sets GPS timestamp. + bool setGpsTimeStamp(const char *gpsTimestamp); + + //! Sets Jpeg quality of captured picture. + bool setJpegQuality(int quality); + + //! Sets the quality of the EXIF thumbnail in Jpeg picture. + bool setJpegThumbnailQuality(int quality); + + //! Sets the dimensions for EXIF thumbnail in Jpeg picture. + bool setJpegThumbnailSize(int w, int h); + + //! Sets metering areas. + bool setMeteringAreas(int num, ExynosRect *rects, int *weights); + + //! Sets metering areas.(Using ExynosRect2) + bool setMeteringAreas(int num, ExynosRect2 *rect2s, int *weights); + + //! Cancel metering areas. + bool cancelMeteringAreas(); + + //! Sets the image format for pictures. + bool setPictureFormat(int colorFormat); + + //! Sets the dimensions for pictures. + bool setPictureSize(int w, int h); + + //! Sets the image format for preview pictures. + bool setPreviewFormat(int colorFormat); + + //void setPreviewFpsRange(int min, int max) + + // ! This method is deprecated. replaced by setPreviewFpsRange(int, int) + bool setPreviewFrameRate(int fps); + + //! Sets the dimensions for preview pictures. + bool setPreviewSize(int w, int h); + + //! Sets recording mode hint. + bool setRecordingHint(bool hint); + + //! Sets the rotation angle in degrees relative to the orientation of the camera. + bool setRotation(int rotation); + + //! Gets the rotation angle in degrees relative to the orientation of the camera. + int getRotation(void); + + //! Sets the scene mode. + bool setSceneMode(int value); + + //! Enables and disables video stabilization. + bool setVideoStabilization(bool toggle); + + //! Sets the white balance. + bool setWhiteBalance(int value); + + //! Sets current zoom value. + bool setZoom(int value); + + //void unflatten(String flattened) + +private: + enum MODE + { + PREVIEW_MODE = 0, + VIDEO_MODE, + PICTURE_MODE, + }; + + struct devInfo { + int fd; + pollfd events; + bool flagStart; + }; + + bool m_flagCreate; + + int m_cameraId; + + ExynosCameraInfo *m_defaultCameraInfo; + ExynosCameraInfo *m_curCameraInfo; + + int m_jpegQuality; + int m_jpegThumbnailQuality; + + int m_currentZoom; + bool m_recordingHint; + + // v4l2 sub-dev file description + devInfo m_sensorDev; + devInfo m_mipiDev; + devInfo m_fliteDev; + devInfo m_gscPreviewDev; + devInfo m_gscVideoDev; + devInfo m_gscPictureDev; + +#ifdef USE_DIGITAL_ZOOM + devInfo m_gscBayerDev; + devInfo *m_bayerDev; +#endif + + devInfo *m_previewDev; + devInfo *m_videoDev; + devInfo *m_pictureDev; + + bool m_tryPreviewStop; + bool m_tryVideoStop; + bool m_tryPictureStop; + + bool m_flagStartFaceDetection; + bool m_flagAutoFocusRunning; + + char m_cameraName[32]; + bool m_internalISP; + bool m_touchAFMode; + bool m_isTouchMetering; + + bool m_focusIdle; + + // media controller variable + struct media_device *m_media; + struct media_entity *m_sensorEntity; + struct media_entity *m_mipiEntity; + struct media_entity *m_fliteSdEntity; + struct media_entity *m_fliteVdEntity; + struct media_entity *m_gscSdEntity; + struct media_entity *m_gscVdEntity; + struct media_entity *m_ispSensorEntity; + struct media_entity *m_ispFrontEntity; + struct media_entity *m_ispBackEntity; + struct media_entity *m_ispBayerEntity; + struct media_entity *m_ispScalercEntity; + struct media_entity *m_ispScalerpEntity; + struct media_entity *m_isp3dnrEntity; + + bool m_validPreviewBuf[VIDEO_MAX_FRAME]; + bool m_validVideoBuf[VIDEO_MAX_FRAME]; + bool m_validPictureBuf[VIDEO_MAX_FRAME]; + + struct ExynosBuffer m_previewBuf[VIDEO_MAX_FRAME]; + struct ExynosBuffer m_videoBuf[VIDEO_MAX_FRAME]; + struct ExynosBuffer m_pictureBuf[VIDEO_MAX_FRAME]; + + exif_attribute_t mExifInfo; + +private: + bool m_setWidthHeight(int mode, + int fd, + struct pollfd *event, + int w, + int h, + int colorFormat, + struct ExynosBuffer *buf, + bool *validBuf); + bool m_setZoom(int fd, int zoom, int w, int h); + bool m_setCrop(int fd, int w, int h, int zoom); + bool m_getCropRect(unsigned int src_w, unsigned int src_h, + unsigned int dst_w, unsigned int dst_h, + unsigned int *crop_x, unsigned int *crop_y, + unsigned int *crop_w, unsigned int *crop_h, + int zoom); + + void m_setExifFixedAttribute(void); + void m_setExifChangedAttribute(exif_attribute_t *exifInfo, ExynosRect *rect); + void m_secRect2SecRect2(ExynosRect *rect, ExynosRect2 *rect2); + void m_secRect22SecRect(ExynosRect2 *rect2, ExynosRect *rect); + void m_printFormat(int colorFormat, const char *arg); + +/////////////////////////////////////////////////// +// Additional API. +/////////////////////////////////////////////////// +public: + //! Focus mode + enum { + FOCUS_MODE_CONTINUOUS_PICTURE_MACRO = (1 << 8), //!< \n + }; + + //! Metering + enum { + METERING_MODE_AVERAGE = (1 << 0), //!< \n + METERING_MODE_CENTER = (1 << 1), //!< \n + METERING_MODE_MATRIX = (1 << 2), //!< \n + METERING_MODE_SPOT = (1 << 3), //!< \n + }; + + //! Contrast + enum { + CONTRAST_AUTO = (1 << 0), //!< \n + CONTRAST_MINUS_2 = (1 << 1), //!< \n + CONTRAST_MINUS_1 = (1 << 2), //!< \n + CONTRAST_DEFAULT = (1 << 3), //!< \n + CONTRAST_PLUS_1 = (1 << 4), //!< \n + CONTRAST_PLUS_2 = (1 << 5), //!< \n + }; + //! Camera Shot mode + enum SHOT_MODE { + SHOT_MODE_SINGLE = 0, //!< + SHOT_MODE_CONTINUOUS = 1, //!< + SHOT_MODE_PANORAMA = 2, //!< + SHOT_MODE_SMILE = 3, //!< + SHOT_MODE_SELF = 6, //!< + }; + + //! Sets camera angle + bool setAngle(int angle); + + //! Gets camera angle + int getAngle(void); + + //! Sets metering areas. + bool setMeteringMode(int value); + //! Gets metering + int getMeteringMode(void); + + //! Sets Top-down mirror + bool setTopDownMirror(void); + //! Sets Left-right mirror + bool setLRMirror(void); + + //! Sets brightness + bool setBrightness(int brightness); + //! Gets brightness + int getBrightness(void); + + //! Sets ISO + bool setISO(int iso); + //! Gets ISO + int getISO(void); + + //! Sets Contrast + bool setContrast(int value); + //! Gets Contrast + int getContrast(void); + + //! Sets Saturation + bool setSaturation(int saturation); + //! Gets Saturation + int getSaturation(void); + + //! Sets Sharpness + bool setSharpness(int sharpness); + //! Gets Sharpness + int getSharpness(void); + + // ! Sets Hue + bool setHue(int hue); + // ! Gets Hue + int getHue(void); + + //! Sets WDR + bool setWDR(bool toggle); + //! Gets WDR + bool getWDR(void); + + //! Sets anti shake + bool setAntiShake(bool toggle); + //! Gets anti shake + bool getAntiShake(void); + + //! Sets object tracking + bool setObjectTracking(bool toggle); + //! Gets object tracking + bool getObjectTracking(void); + //! Start or stop object tracking operation + bool setObjectTrackingStart(bool toggle); + //! Gets status of object tracking operation + int getObjectTrackingStatus(void); + //! Sets x, y position for object tracking operation + bool setObjectPosition(int x, int y); + + //! Sets smart auto + bool setSmartAuto(bool toggle); + //! Gets smart auto + bool getSmartAuto(void); + //! Gets the status of smart auto operation + int getSmartAutoStatus(void); + + //! Sets beauty shot + bool setBeautyShot(bool toggle); + //! Gets beauty shot + bool getBeautyShot(void); + + //! Start or stop the touch auto focus operation + bool setTouchAFStart(bool toggle); + + //! Sets gamma + bool setGamma(bool toggle); + //! Gets gamma + bool getGamma(void); + + //! Sets ODC + bool setODC(bool toggle); + //! Gets ODC + bool getODC(void); + + //! Sets Slow AE + bool setSlowAE(bool toggle); + //! Gets Slow AE + bool getSlowAE(void); + + //! Sets Shot mode + bool setShotMode(int shotMode); + //! Gets Shot mode + int getShotMode(void); + + //! Sets 3DNR + bool set3DNR(bool toggle); + //! Gets 3DNR + bool get3DNR(void); +}; + +}; // namespace android + +#endif // EXYNOS_CAMERA_H__ diff --git a/include/ExynosRect.h b/include/ExynosRect.h new file mode 100644 index 0000000..177d96e --- /dev/null +++ b/include/ExynosRect.h @@ -0,0 +1,172 @@ +/* + * Copyright@ Samsung Electronics Co. LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +/*! + * \file ExynosRect.h + * \brief header file for ExynosRect + * \author Sangwoo, Park(sw5771.park@samsung.com) + * \date 2011/06/02 + * + * Revision History: + * - 2010/06/03 : Sangwoo, Park(sw5771.park@samsung.com) \n + * Initial version + * + * - 2012/03/14 : sangwoo.park(sw5771.park@samsung.com) \n + * Change file, struct name to ExynosXXX. + * + */ + +#ifndef EXYNOS_RECT_H_ +#define EXYNOS_RECT_H_ + +//! Rectangle information +/*! + * \ingroup Exynos + */ +struct ExynosRect +{ + int x; //!< x pos + int y; //!< y pos + int w; //!< width + int h; //!< height + int fullW; //!< full width of image + int fullH; //!< full height of image + int colorFormat; //!< V4L2_PIX_FMT_XXX + +#ifdef __cplusplus + //! Constructor + ExynosRect(int _x_ = 0, + int _y_ = 0, + int _w_ = 0, + int _h_ = 0, + int _fullW_ = 0, + int _fullH_ = 0, + int _colorFormat_ = 0) + { + x = _x_; + y = _y_; + w = _w_; + h = _h_; + fullW = _fullW_; + fullH = _fullH_; + colorFormat = _colorFormat_; + } + + //! Constructor + ExynosRect(const ExynosRect *other) + { + x = other->x; + y = other->y; + w = other->w; + h = other->h; + fullW = other->fullW; + fullH = other->fullH; + colorFormat = other->colorFormat; + } + + //! Operator(=) override + ExynosRect& operator =(const ExynosRect &other) + { + x = other.x; + y = other.y; + w = other.w; + h = other.h; + fullW = other.fullW; + fullH = other.fullH; + colorFormat = other.colorFormat; + return *this; + } + + //! Operator(==) override + bool operator ==(const ExynosRect &other) const + { + return ( x == other.x + && y == other.y + && w == other.w + && h == other.h + && fullW == other.fullW + && fullH == other.fullH + && colorFormat == other.colorFormat); + } + + //! Operator(!=) override + bool operator !=(const ExynosRect &other) const + { + // use operator(==) + return !(*this == other); + } +#endif +}; + +//! Clip information +/*! + * \ingroup Exynos + */ +struct ExynosRect2 +{ + int x1; //!< Left (The x-coordinate value of upper-left corner) + int y1; //!< Top (The y-coordinate value of upper-left corner) + int x2; //!< Right (The x-coordinate value of lower-right corner) + int y2; //!< Bottom (The y-coordinate value of lower-right corner) + +#ifdef __cplusplus + //! Constructor + ExynosRect2(int _x1_ = 0, int _y1_ = 0, int _x2_ = 0, int _y2_ = 0) + { + x1 = _x1_; + y1 = _y1_; + x2 = _x2_; + y2 = _y2_; + } + + //! Constructor + ExynosRect2(const ExynosRect2 *other) + { + x1 = other->x1; + y1 = other->y1; + x2 = other->x2; + y2 = other->y2; + } + + //! Operator(=) override + ExynosRect2& operator =(const ExynosRect2 &other) + { + x1 = other.x1; + y1 = other.y1; + x2 = other.x2; + y2 = other.y2; + return *this; + } + + //! Operator(==) override + bool operator ==(const ExynosRect2 &other) const + { + return ( x1 == other.x1 + && y1 == other.y1 + && x2 == other.x2 + && y2 == other.y2); + } + + //! Operator(!=) override + bool operator !=(const ExynosRect2 &other) const + { + // use operator(==) + return !(*this == other); + } +#endif +}; + +#endif //EXYNOS_RECT_H_ diff --git a/include/content_protect.h b/include/content_protect.h new file mode 100644 index 0000000..9266123 --- /dev/null +++ b/include/content_protect.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2012 Samsung Electronics Co., LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CONTENT_PROTECT_H__ +#define __CONTENT_PROTECT_H__ + +__BEGIN_DECLS + +typedef enum { + CP_SUCCESS = 0, + CP_ERROR_ENABLE_PATH_PROTECTION_FAILED, + CP_ERROR_DISABLE_PATH_PROTECTION_FAILED, +} cpResult_t; + + +/** + * protection IP + */ +#define CP_PROTECT_MFC (1 << 0) +#define CP_PROTECT_GSC0 (1 << 1) +#define CP_PROTECT_GSC3 (1 << 2) +#define CP_PROTECT_FIMD (1 << 3) +#define CP_PROTECT_MIXER (1 << 4) + +#define CP_PROTECT_MFC1 (1 << 5) +#define CP_PROTECT_GSC1 (1 << 6) +#define CP_PROTECT_GSC2 (1 << 7) +#define CP_PROTECT_HDMI (1 << 8) + + +cpResult_t CP_Enable_Path_Protection(uint32_t); +cpResult_t CP_Disable_Path_Protection(uint32_t); + +__END_DECLS + +#endif diff --git a/include/exynos_mem.h b/include/exynos_mem.h new file mode 100644 index 0000000..a65f030 --- /dev/null +++ b/include/exynos_mem.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef __INCLUDE_EXYNOS_MEM_H +#define __INCLUDE_EXYNOS_MEM_H __FILE__ + +/* IOCTL commands */ +#define EXYNOS_MEM_SET_CACHEABLE _IOW('M', 200, bool) +#define EXYNOS_MEM_PADDR_CACHE_FLUSH _IOW('M', 201, struct exynos_mem_flush_range) + +struct exynos_mem_flush_range { + dma_addr_t start; + size_t length; +}; + +#endif /* __INCLUDE_EXYNOS_MEM_H */ diff --git a/include/s3c_lcd.h b/include/s3c_lcd.h new file mode 100644 index 0000000..cd313e9 --- /dev/null +++ b/include/s3c_lcd.h @@ -0,0 +1,84 @@ +/* + * Copyright@ Samsung Electronics Co. LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _S3CFB_LCD_ +#define _S3CFB_LCD_ + +/* + * S T R U C T U R E S F O R C U S T O M I O C T L S + * +*/ +struct s3cfb_user_window { + int x; + int y; +}; + +struct s3cfb_user_plane_alpha { + int channel; + unsigned char red; + unsigned char green; + unsigned char blue; +}; + +struct s3cfb_user_chroma { + int enabled; + unsigned char red; + unsigned char green; + unsigned char blue; +}; + +typedef struct { + unsigned int phy_start_addr; + unsigned int xres; /* visible resolution*/ + unsigned int yres; + unsigned int xres_virtual; /* virtual resolution*/ + unsigned int yres_virtual; + unsigned int xoffset; /* offset from virtual to visible */ + unsigned int yoffset; /* resolution */ + unsigned int lcd_offset_x; + unsigned int lcd_offset_y; +} s3c_fb_next_info_t; + +struct s3c_fb_user_ion_client { + int fd; + int offset; +}; + +/* + * C U S T O M I O C T L S + * +*/ + +#define S3CFB_WIN_POSITION _IOW ('F', 203, struct s3cfb_user_window) +#define S3CFB_WIN_SET_PLANE_ALPHA _IOW ('F', 204, struct s3cfb_user_plane_alpha) +#define S3CFB_WIN_SET_CHROMA _IOW ('F', 205, struct s3cfb_user_chroma) +#define S3CFB_SET_VSYNC_INT _IOW ('F', 206, unsigned int) +#define S3CFB_SET_SUSPEND_FIFO _IOW ('F', 300, unsigned long) +#define S3CFB_SET_RESUME_FIFO _IOW ('F', 301, unsigned long) +#define S3CFB_GET_LCD_WIDTH _IOR ('F', 302, int) +#define S3CFB_GET_LCD_HEIGHT _IOR ('F', 303, int) +#define S3CFB_GET_FB_PHY_ADDR _IOR ('F', 310, unsigned int) +#define S3C_FB_GET_CURR_FB_INFO _IOR ('F', 305, s3c_fb_next_info_t) +#define S3CFB_GET_ION_USER_HANDLE _IOWR('F', 208, struct s3c_fb_user_ion_client) + +/***************** LCD frame buffer *****************/ +#define FB0_NAME "/dev/fb0" +#define FB1_NAME "/dev/fb1" +#define FB2_NAME "/dev/fb2" +#define FB3_NAME "/dev/fb3" +#define FB4_NAME "/dev/fb4" + +#endif diff --git a/include/sec_g2d.h b/include/sec_g2d.h new file mode 100644 index 0000000..772cbf8 --- /dev/null +++ b/include/sec_g2d.h @@ -0,0 +1,251 @@ +/* + * Copyright@ Samsung Electronics Co. LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SEC_G2D_DRIVER_H_ +#define _SEC_G2D_DRIVER_H_ +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned long u32; + +#define SEC_G2D_DEV_NAME "/dev/fimg2d" + +#define G2D_IOCTL_MAGIC 'G' + +#define G2D_BLIT _IO(G2D_IOCTL_MAGIC,0) +#define G2D_GET_VERSION _IO(G2D_IOCTL_MAGIC,1) +#define G2D_GET_MEMORY _IOR(G2D_IOCTL_MAGIC,2, unsigned int) +#define G2D_GET_MEMORY_SIZE _IOR(G2D_IOCTL_MAGIC,3, unsigned int) +#define G2D_DMA_CACHE_CLEAN _IOWR(G2D_IOCTL_MAGIC,4, struct g2d_dma_info) +#define G2D_DMA_CACHE_FLUSH _IOWR(G2D_IOCTL_MAGIC,5, struct g2d_dma_info) +#define G2D_SYNC _IO(G2D_IOCTL_MAGIC,6) +#define G2D_RESET _IO(G2D_IOCTL_MAGIC,7) + +#define G2D_MAX_WIDTH (2048) +#define G2D_MAX_HEIGHT (2048) + +#define G2D_ALPHA_VALUE_MAX (255) + +#define G2D_POLLING (1<<0) +#define G2D_INTERRUPT (0<<0) +#define G2D_CACHE_OP (1<<1) +#define G2D_NONE_INVALIDATE (0<<1) +#define G2D_HYBRID_MODE (1<<2) + +typedef enum { + G2D_ROT_0 = 0, + G2D_ROT_90, + G2D_ROT_180, + G2D_ROT_270, + G2D_ROT_X_FLIP, + G2D_ROT_Y_FLIP +} G2D_ROT_DEG; + +typedef enum { + G2D_ALPHA_BLENDING_MIN = 0, // wholly transparent + G2D_ALPHA_BLENDING_MAX = 255, // 255 + G2D_ALPHA_BLENDING_OPAQUE = 256, // opaque +} G2D_ALPHA_BLENDING_MODE; + +typedef enum { + G2D_COLORKEY_NONE = 0, + G2D_COLORKEY_SRC_ON, + G2D_COLORKEY_DST_ON, + G2D_COLORKEY_SRC_DST_ON, +} G2D_COLORKEY_MODE; + +typedef enum { + G2D_BLUE_SCREEN_NONE = 0, + G2D_BLUE_SCREEN_TRANSPARENT, + G2D_BLUE_SCREEN_WITH_COLOR, +} G2D_BLUE_SCREEN_MODE; + +typedef enum { + G2D_ROP_SRC = 0, + G2D_ROP_DST, + G2D_ROP_SRC_AND_DST, + G2D_ROP_SRC_OR_DST, + G2D_ROP_3RD_OPRND, + G2D_ROP_SRC_AND_3RD_OPRND, + G2D_ROP_SRC_OR_3RD_OPRND, + G2D_ROP_SRC_XOR_3RD_OPRND, + G2D_ROP_DST_OR_3RD, +} G2D_ROP_TYPE; + +typedef enum { + G2D_THIRD_OP_NONE = 0, + G2D_THIRD_OP_PATTERN, + G2D_THIRD_OP_FG, + G2D_THIRD_OP_BG +} G2D_THIRD_OP_MODE; + +typedef enum { + G2D_BLACK = 0, + G2D_RED, + G2D_GREEN, + G2D_BLUE, + G2D_WHITE, + G2D_YELLOW, + G2D_CYAN, + G2D_MAGENTA +} G2D_COLOR; + +typedef enum { + G2D_RGB_565 = ((0<<4)|2), + + G2D_ABGR_8888 = ((2<<4)|1), + G2D_BGRA_8888 = ((3<<4)|1), + G2D_ARGB_8888 = ((0<<4)|1), + G2D_RGBA_8888 = ((1<<4)|1), + + G2D_XBGR_8888 = ((2<<4)|0), + G2D_BGRX_8888 = ((3<<4)|0), + G2D_XRGB_8888 = ((0<<4)|0), + G2D_RGBX_8888 = ((1<<4)|0), + + G2D_ABGR_1555 = ((2<<4)|4), + G2D_BGRA_5551 = ((3<<4)|4), + G2D_ARGB_1555 = ((0<<4)|4), + G2D_RGBA_5551 = ((1<<4)|4), + + G2D_XBGR_1555 = ((2<<4)|3), + G2D_BGRX_5551 = ((3<<4)|3), + G2D_XRGB_1555 = ((0<<4)|3), + G2D_RGBX_5551 = ((1<<4)|3), + + G2D_ABGR_4444 = ((2<<4)|6), + G2D_BGRA_4444 = ((3<<4)|6), + G2D_ARGB_4444 = ((0<<4)|6), + G2D_RGBA_4444 = ((1<<4)|6), + + G2D_XBGR_4444 = ((2<<4)|5), + G2D_BGRX_4444 = ((3<<4)|5), + G2D_XRGB_4444 = ((0<<4)|5), + G2D_RGBX_4444 = ((1<<4)|5), + + G2D_PACKED_BGR_888 = ((2<<4)|7), + G2D_PACKED_RGB_888 = ((0<<4)|7), + + G2D_MAX_COLOR_SPACE +} G2D_COLOR_SPACE; + +typedef enum { + G2D_Clear_Mode, //!< [0, 0] + G2D_Src_Mode, //!< [Sa, Sc] + G2D_Dst_Mode, //!< [Da, Dc] + G2D_SrcOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc] + G2D_DstOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc] + G2D_SrcIn_Mode, //!< [Sa * Da, Sc * Da] + G2D_DstIn_Mode, //!< [Sa * Da, Sa * Dc] + G2D_SrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] + G2D_DstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] + G2D_SrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] + G2D_DstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] + G2D_Xor_Mode, //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] + + // these modes are defined in the SVG Compositing standard + // http://www.w3.org/TR/2009/WD-SVGCompositing-20090430/ + G2D_Plus_Mode, + G2D_Multiply_Mode, + G2D_Screen_Mode, + G2D_Overlay_Mode, + G2D_Darken_Mode, + G2D_Lighten_Mode, + G2D_ColorDodge_Mode, + G2D_ColorBurn_Mode, + G2D_HardLight_Mode, + G2D_SoftLight_Mode, + G2D_Difference_Mode, + G2D_Exclusion_Mode, + + kLastMode = G2D_Exclusion_Mode +} G2D_PORTTERDUFF_MODE; + +typedef enum { + G2D_MEMORY_KERNEL, + G2D_MEMORY_USER +} G2D_MEMORY_TYPE; + +typedef struct { + int x; + int y; + unsigned int w; + unsigned int h; + unsigned int full_w; + unsigned int full_h; + int color_format; + unsigned int bytes_per_pixel; + unsigned char * addr; +} g2d_rect; + +typedef struct { + unsigned int rotate_val; + unsigned int alpha_val; + + unsigned int blue_screen_mode; //true : enable, false : disable + unsigned int color_key_val; //screen color value + unsigned int color_switch_val; //one color + + unsigned int src_color; // when set one color on SRC + + unsigned int third_op_mode; + unsigned int rop_mode; + unsigned int mask_mode; + unsigned int render_mode; + unsigned int potterduff_mode; + unsigned int memory_type; +} g2d_flag; + +typedef struct { + unsigned int t; + unsigned int b; + unsigned int l; + unsigned int r; +} g2d_clip; + +typedef struct { + g2d_rect src_rect; + g2d_rect dst_rect; + g2d_clip clip; + g2d_flag flag; +} g2d_params; + +struct g2d_dma_info { + unsigned long addr; + unsigned int size; +}; + +typedef struct _sec_g2d_t { + int dev_fd; + g2d_params params; +}sec_g2d_t; + +typedef struct __s5p_rect { + uint32_t x; + uint32_t y; + uint32_t w; + uint32_t h; +} __s5p_rect; + +typedef struct __s5p_img { + uint32_t width; + uint32_t height; + uint32_t format; + uint32_t offset; + uint32_t base; + int memory_id; +} __s5p_img; + +#endif /*_SEC_G2D_DRIVER_H_*/ diff --git a/include/sec_g2ddrm.h b/include/sec_g2ddrm.h new file mode 100644 index 0000000..77da716 --- /dev/null +++ b/include/sec_g2ddrm.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2012 Samsung Electronics Co., LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SEC_G2DDRM_H__ +#define __SEC_G2DDRM_H__ + +__BEGIN_DECLS + +typedef enum { + G2DDRM_SUCCESS = 0, + G2DDRM_ERROR_INIT_FAILED, + G2DDRM_ERROR_EXIT_FAILED, + G2DDRM_ERROR_TCI_WSM_FAILED, + G2DDRM_ERROR_TCI_MAP_FAILED, + G2DDRM_ERROR_BLIT_FAILED, +} g2ddrmResult_t; + +g2ddrmResult_t G2DDRM_Initialize(void); +g2ddrmResult_t G2DDRM_Blit(struct fimg2d_blit_raw *cmd); +g2ddrmResult_t G2DDRM_Terminate(void); + +__END_DECLS + +#endif diff --git a/include/videodev2_exynos_camera.h b/include/videodev2_exynos_camera.h new file mode 100644 index 0000000..9860a93 --- /dev/null +++ b/include/videodev2_exynos_camera.h @@ -0,0 +1,1225 @@ +/* + * Video for Linux Two header file for samsung + * + * Copyright (C) 2009, Dongsoo Nathaniel Kim + * + * This header file contains several v4l2 APIs to be proposed to v4l2 + * community and until bein accepted, will be used restrictly in Samsung's + * camera interface driver FIMC. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +/* + * Copyright 2008, The Android Open Source Project + * Copyright 2010, Samsung Electronics Co. LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed toggle an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LINUX_VIDEODEV2_EXYNOS_CAMERA_H +#define __LINUX_VIDEODEV2_EXYNOS_CAMERA_H + +/* Values for 'capabilities' field */ +/* Object detection device */ +#define V4L2_CAP_OBJ_RECOGNITION 0x10000000 +/* strobe control */ +#define V4L2_CAP_STROBE 0x20000000 + +#define V4L2_CID_FOCUS_MODE (V4L2_CID_CAMERA_CLASS_BASE+17) +/* Focus Methods */ +enum v4l2_focus_mode { + V4L2_FOCUS_MODE_AUTO = 0, + V4L2_FOCUS_MODE_MACRO = 1, + V4L2_FOCUS_MODE_MANUAL = 2, + V4L2_FOCUS_MODE_LASTP = 2, +}; + +#define V4L2_CID_ZOOM_MODE (V4L2_CID_CAMERA_CLASS_BASE+18) +/* Zoom Methods */ +enum v4l2_zoom_mode { + V4L2_ZOOM_MODE_CONTINUOUS = 0, + V4L2_ZOOM_MODE_OPTICAL = 1, + V4L2_ZOOM_MODE_DIGITAL = 2, + V4L2_ZOOM_MODE_LASTP = 2, +}; + +/* Exposure Methods */ +#define V4L2_CID_PHOTOMETRY (V4L2_CID_CAMERA_CLASS_BASE+19) +enum v4l2_photometry_mode { + V4L2_PHOTOMETRY_MULTISEG = 0, /*Multi Segment*/ + V4L2_PHOTOMETRY_CWA = 1, /*Centre Weighted Average*/ + V4L2_PHOTOMETRY_SPOT = 2, + V4L2_PHOTOMETRY_AFSPOT = 3, /*Spot metering on focused point*/ + V4L2_PHOTOMETRY_LASTP = V4L2_PHOTOMETRY_AFSPOT, +}; + +/* Manual exposure control items menu type: iris, shutter, iso */ +#define V4L2_CID_CAM_APERTURE (V4L2_CID_CAMERA_CLASS_BASE+20) +#define V4L2_CID_CAM_SHUTTER (V4L2_CID_CAMERA_CLASS_BASE+21) +#define V4L2_CID_CAM_ISO (V4L2_CID_CAMERA_CLASS_BASE+22) + +/* Following CIDs are menu type */ +#define V4L2_CID_SCENEMODE (V4L2_CID_CAMERA_CLASS_BASE+23) +#define V4L2_CID_CAM_STABILIZE (V4L2_CID_CAMERA_CLASS_BASE+24) +#define V4L2_CID_CAM_MULTISHOT (V4L2_CID_CAMERA_CLASS_BASE+25) + +/* Control dynamic range */ +#define V4L2_CID_CAM_DR (V4L2_CID_CAMERA_CLASS_BASE+26) + +/* White balance preset control */ +#define V4L2_CID_WHITE_BALANCE_PRESET (V4L2_CID_CAMERA_CLASS_BASE+27) +#define V4L2_CID_CAM_SENSOR_FW_VER (V4L2_CID_CAMERA_CLASS_BASE + 28) +#define V4L2_CID_CAM_PHONE_FW_VER (V4L2_CID_CAMERA_CLASS_BASE + 29) + +/* CID extensions */ +#define V4L2_CID_ROTATION (V4L2_CID_PRIVATE_BASE + 0) +#define V4L2_CID_PADDR_Y (V4L2_CID_PRIVATE_BASE + 1) +#define V4L2_CID_PADDR_CB (V4L2_CID_PRIVATE_BASE + 2) +#define V4L2_CID_PADDR_CR (V4L2_CID_PRIVATE_BASE + 3) +#define V4L2_CID_PADDR_CBCR (V4L2_CID_PRIVATE_BASE + 4) +#define V4L2_CID_OVERLAY_AUTO (V4L2_CID_PRIVATE_BASE + 5) +#define V4L2_CID_OVERLAY_VADDR0 (V4L2_CID_PRIVATE_BASE + 6) +#define V4L2_CID_OVERLAY_VADDR1 (V4L2_CID_PRIVATE_BASE + 7) +#define V4L2_CID_OVERLAY_VADDR2 (V4L2_CID_PRIVATE_BASE + 8) +#define V4L2_CID_OVLY_MODE (V4L2_CID_PRIVATE_BASE + 9) +#define V4L2_CID_DST_INFO (V4L2_CID_PRIVATE_BASE + 10) +/* UMP secure id control */ +#define V4L2_CID_GET_UMP_SECURE_ID (V4L2_CID_PRIVATE_BASE + 11) +#define V4L2_CID_GET_PHY_SRC_YADDR (V4L2_CID_PRIVATE_BASE + 12) +#define V4L2_CID_GET_PHY_SRC_CADDR (V4L2_CID_PRIVATE_BASE + 13) +#define V4L2_CID_IMAGE_EFFECT_FN (V4L2_CID_PRIVATE_BASE + 16) +#define V4L2_CID_IMAGE_EFFECT_APPLY (V4L2_CID_PRIVATE_BASE + 17) +#define V4L2_CID_IMAGE_EFFECT_CB (V4L2_CID_PRIVATE_BASE + 18) +#define V4L2_CID_IMAGE_EFFECT_CR (V4L2_CID_PRIVATE_BASE + 19) +#define V4L2_CID_RESERVED_MEM_BASE_ADDR (V4L2_CID_PRIVATE_BASE + 20) +#define V4L2_CID_FIMC_VERSION (V4L2_CID_PRIVATE_BASE + 21) + +#define V4L2_CID_STREAM_PAUSE (V4L2_CID_PRIVATE_BASE + 53) +#define V4L2_CID_CACHE_FLUSH (V4L2_CID_PRIVATE_BASE + 61) +#define V4L2_CID_RESERVED_MEM_SIZE (V4L2_CID_PRIVATE_BASE + 63) + +/* CID Extensions for camera sensor operations */ +#define V4L2_CID_CAM_PREVIEW_ONOFF (V4L2_CID_PRIVATE_BASE + 64) +#define V4L2_CID_CAM_CAPTURE (V4L2_CID_PRIVATE_BASE + 65) +/* #define V4L2_CID_CAM_JPEG_MEMSIZE (V4L2_CID_PRIVATE_BASE + 66) */ + +#define V4L2_CID_CAM_DATE_INFO_YEAR (V4L2_CID_PRIVATE_BASE + 14) +#define V4L2_CID_CAM_DATE_INFO_MONTH (V4L2_CID_PRIVATE_BASE + 15) +#define V4L2_CID_CAM_DATE_INFO_DATE (V4L2_CID_PRIVATE_BASE + 22) +#define V4L2_CID_CAM_SENSOR_VER (V4L2_CID_PRIVATE_BASE + 23) +#define V4L2_CID_CAM_FW_MINOR_VER (V4L2_CID_PRIVATE_BASE + 24) +#define V4L2_CID_CAM_FW_MAJOR_VER (V4L2_CID_PRIVATE_BASE + 25) +#define V4L2_CID_CAM_PRM_MINOR_VER (V4L2_CID_PRIVATE_BASE + 26) +#define V4L2_CID_CAM_PRM_MAJOR_VER (V4L2_CID_PRIVATE_BASE + 27) +#define V4L2_CID_CAM_FW_VER (V4L2_CID_PRIVATE_BASE + 28) +#define V4L2_CID_CAM_SET_FW_ADDR (V4L2_CID_PRIVATE_BASE + 29) +#define V4L2_CID_CAM_SET_FW_SIZE (V4L2_CID_PRIVATE_BASE + 30) +#define V4L2_CID_CAM_UPDATE_FW (V4L2_CID_PRIVATE_BASE + 31) +enum v4l2_firmware_mode { + FW_MODE_UPDATE, + FW_MODE_VERSION, + FW_MODE_DUMP, +}; + +#define V4L2_CID_CAM_JPEG_MAIN_SIZE (V4L2_CID_PRIVATE_BASE + 32) +#define V4L2_CID_CAM_JPEG_MAIN_OFFSET (V4L2_CID_PRIVATE_BASE + 33) +#define V4L2_CID_CAM_JPEG_THUMB_SIZE (V4L2_CID_PRIVATE_BASE + 34) +#define V4L2_CID_CAM_JPEG_THUMB_OFFSET (V4L2_CID_PRIVATE_BASE + 35) +#define V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET (V4L2_CID_PRIVATE_BASE + 36) +#define V4L2_CID_CAM_JPEG_QUALITY (V4L2_CID_PRIVATE_BASE + 37) +#define V4L2_CID_CAM_SENSOR_MAKER (V4L2_CID_PRIVATE_BASE + 38) +#define V4L2_CID_CAM_SENSOR_OPTICAL (V4L2_CID_PRIVATE_BASE + 39) +#define V4L2_CID_CAM_AF_VER_LOW (V4L2_CID_PRIVATE_BASE + 40) +#define V4L2_CID_CAM_AF_VER_HIGH (V4L2_CID_PRIVATE_BASE + 41) +#define V4L2_CID_CAM_GAMMA_RG_LOW (V4L2_CID_PRIVATE_BASE + 42) +#define V4L2_CID_CAM_GAMMA_RG_HIGH (V4L2_CID_PRIVATE_BASE + 43) +#define V4L2_CID_CAM_GAMMA_BG_LOW (V4L2_CID_PRIVATE_BASE + 44) +#define V4L2_CID_CAM_GAMMA_BG_HIGH (V4L2_CID_PRIVATE_BASE + 45) +#define V4L2_CID_CAM_DUMP_FW (V4L2_CID_PRIVATE_BASE + 46) +#define V4L2_CID_CAM_GET_DUMP_SIZE (V4L2_CID_PRIVATE_BASE + 47) +#define V4L2_CID_CAMERA_VT_MODE (V4L2_CID_PRIVATE_BASE + 48) +#define V4L2_CID_CAMERA_VGA_BLUR (V4L2_CID_PRIVATE_BASE + 49) +#define V4L2_CID_CAMERA_CAPTURE (V4L2_CID_PRIVATE_BASE + 50) +#define V4L2_CID_CAMERA_HDR (V4L2_CID_PRIVATE_BASE + 51) + +#define V4L2_CID_MAIN_SW_DATE_INFO_YEAR (V4L2_CID_PRIVATE_BASE + 54) +#define V4L2_CID_MAIN_SW_DATE_INFO_MONTH (V4L2_CID_PRIVATE_BASE + 55) +#define V4L2_CID_MAIN_SW_DATE_INFO_DATE (V4L2_CID_PRIVATE_BASE + 56) +#define V4L2_CID_MAIN_SW_FW_MINOR_VER (V4L2_CID_PRIVATE_BASE + 57) +#define V4L2_CID_MAIN_SW_FW_MAJOR_VER (V4L2_CID_PRIVATE_BASE + 58) +#define V4L2_CID_MAIN_SW_PRM_MINOR_VER (V4L2_CID_PRIVATE_BASE + 59) +#define V4L2_CID_MAIN_SW_PRM_MAJOR_VER (V4L2_CID_PRIVATE_BASE + 60) + +#define V4L2_CID_FIMC_IS_BASE (V4L2_CTRL_CLASS_CAMERA | 0x1000) +#define V4L2_CID_FIMC_IS_TUNE_BASE (V4L2_CTRL_CLASS_CAMERA | 0x2000) + +#define V4L2_CID_IS_LOAD_FW (V4L2_CID_FIMC_IS_BASE + 10) +#define V4L2_CID_IS_INIT_PARAM (V4L2_CID_FIMC_IS_BASE + 11) +#define V4L2_CID_IS_RESET (V4L2_CID_FIMC_IS_BASE + 12) +#define V4L2_CID_IS_S_POWER (V4L2_CID_FIMC_IS_BASE + 13) +enum is_set_power { + IS_POWER_OFF, + IS_POWER_ON +}; + +#define V4L2_CID_IS_S_STREAM (V4L2_CID_FIMC_IS_BASE + 14) +enum is_set_stream { + IS_DISABLE_STREAM, + IS_ENABLE_STREAM +}; + +#define V4L2_CID_IS_S_SCENARIO_MODE (V4L2_CID_FIMC_IS_BASE + 15) +#define V4L2_CID_IS_S_FORMAT_SCENARIO (V4L2_CID_FIMC_IS_BASE + 16) +enum scenario_mode { + IS_MODE_PREVIEW_STILL, + IS_MODE_PREVIEW_VIDEO, + IS_MODE_CAPTURE_STILL, + IS_MODE_CAPTURE_VIDEO, + IS_MODE_MAX +}; + +#define V4L2_CID_IS_G_COMPLETES (V4L2_CID_FIMC_IS_BASE + 18) + +/* global */ +#define V4L2_CID_IS_CAMERA_SHOT_MODE_NORMAL (V4L2_CID_FIMC_IS_BASE + 101) +/* value : 1 : single shot , >=2 : continuous shot */ + +#define V4L2_CID_IS_CAMERA_SENSOR_NUM (V4L2_CID_FIMC_IS_BASE + 201) + +#define V4L2_CID_IS_CAMERA_FOCUS_MODE (V4L2_CID_FIMC_IS_BASE + 401) +enum is_focus_mode { + IS_FOCUS_MODE_AUTO, + IS_FOCUS_MODE_MACRO, + IS_FOCUS_MODE_INFINITY, + IS_FOCUS_MODE_CONTINUOUS, + IS_FOCUS_MODE_TOUCH, + IS_FOCUS_MODE_FACEDETECT, + IS_FOCUS_MODE_IDLE, + IS_FOCUS_MODE_MAX, +}; + +#define V4L2_CID_IS_CAMERA_FLASH_MODE (V4L2_CID_FIMC_IS_BASE + 402) +enum is_flash_mode { + IS_FLASH_MODE_OFF, + IS_FLASH_MODE_AUTO, + IS_FLASH_MODE_AUTO_REDEYE, + IS_FLASH_MODE_ON, + IS_FLASH_MODE_TORCH, + IS_FLASH_MODE_MAX +}; + +#define V4L2_CID_IS_CAMERA_AWB_MODE (V4L2_CID_FIMC_IS_BASE + 403) +enum is_awb_mode { + IS_AWB_AUTO, + IS_AWB_DAYLIGHT, + IS_AWB_CLOUDY, + IS_AWB_TUNGSTEN, + IS_AWB_FLUORESCENT, + IS_AWB_MAX +}; + +#define V4L2_CID_IS_CAMERA_IMAGE_EFFECT (V4L2_CID_FIMC_IS_BASE + 404) +enum is_image_effect { + IS_IMAGE_EFFECT_DISABLE, + IS_IMAGE_EFFECT_MONOCHROME, + IS_IMAGE_EFFECT_NEGATIVE_MONO, + IS_IMAGE_EFFECT_NEGATIVE_COLOR, + IS_IMAGE_EFFECT_SEPIA, + IS_IMAGE_EFFECT_SEPIA_CB, + IS_IMAGE_EFFECT_SEPIA_CR, + IS_IMAGE_EFFECT_NEGATIVE, + IS_IMAGE_EFFECT_ARTFREEZE, + IS_IMAGE_EFFECT_EMBOSSING, + IS_IMAGE_EFFECT_SILHOUETTE, + IS_IMAGE_EFFECT_MAX +}; + +#define V4L2_CID_IS_CAMERA_ISO (V4L2_CID_FIMC_IS_BASE + 405) +enum is_iso { + IS_ISO_AUTO, + IS_ISO_50, + IS_ISO_100, + IS_ISO_200, + IS_ISO_400, + IS_ISO_800, + IS_ISO_1600, + IS_ISO_MAX +}; + +#define V4L2_CID_IS_CAMERA_CONTRAST (V4L2_CID_FIMC_IS_BASE + 406) +enum is_contrast { + IS_CONTRAST_AUTO, + IS_CONTRAST_MINUS_2, + IS_CONTRAST_MINUS_1, + IS_CONTRAST_DEFAULT, + IS_CONTRAST_PLUS_1, + IS_CONTRAST_PLUS_2, + IS_CONTRAST_MAX +}; + +#define V4L2_CID_IS_CAMERA_SATURATION (V4L2_CID_FIMC_IS_BASE + 407) +enum is_saturation { + IS_SATURATION_MINUS_2, + IS_SATURATION_MINUS_1, + IS_SATURATION_DEFAULT, + IS_SATURATION_PLUS_1, + IS_SATURATION_PLUS_2, + IS_SATURATION_MAX +}; + +#define V4L2_CID_IS_CAMERA_SHARPNESS (V4L2_CID_FIMC_IS_BASE + 408) +enum is_sharpness { + IS_SHARPNESS_MINUS_2, + IS_SHARPNESS_MINUS_1, + IS_SHARPNESS_DEFAULT, + IS_SHARPNESS_PLUS_1, + IS_SHARPNESS_PLUS_2, + IS_SHARPNESS_MAX +}; + +#define V4L2_CID_IS_CAMERA_EXPOSURE (V4L2_CID_FIMC_IS_BASE + 409) +enum is_exposure { + IS_EXPOSURE_MINUS_4, + IS_EXPOSURE_MINUS_3, + IS_EXPOSURE_MINUS_2, + IS_EXPOSURE_MINUS_1, + IS_EXPOSURE_DEFAULT, + IS_EXPOSURE_PLUS_1, + IS_EXPOSURE_PLUS_2, + IS_EXPOSURE_PLUS_3, + IS_EXPOSURE_PLUS_4, + IS_EXPOSURE_MAX +}; + +#define V4L2_CID_IS_CAMERA_BRIGHTNESS (V4L2_CID_FIMC_IS_BASE + 410) +enum is_brightness { + IS_BRIGHTNESS_MINUS_2, + IS_BRIGHTNESS_MINUS_1, + IS_BRIGHTNESS_DEFAULT, + IS_BRIGHTNESS_PLUS_1, + IS_BRIGHTNESS_PLUS_2, + IS_BRIGHTNESS_MAX +}; + +#define V4L2_CID_IS_CAMERA_HUE (V4L2_CID_FIMC_IS_BASE + 411) +enum is_hue { + IS_HUE_MINUS_2, + IS_HUE_MINUS_1, + IS_HUE_DEFAULT, + IS_HUE_PLUS_1, + IS_HUE_PLUS_2, + IS_HUE_MAX +}; + +#define V4L2_CID_IS_CAMERA_METERING (V4L2_CID_FIMC_IS_BASE + 412) +enum is_metering { + IS_METERING_AVERAGE, + IS_METERING_SPOT, + IS_METERING_MATRIX, + IS_METERING_CENTER, + IS_METERING_MAX +}; +#define V4L2_CID_IS_CAMERA_METERING_POSITION_X (V4L2_CID_FIMC_IS_BASE + 500) +#define V4L2_CID_IS_CAMERA_METERING_POSITION_Y (V4L2_CID_FIMC_IS_BASE + 501) +#define V4L2_CID_IS_CAMERA_METERING_WINDOW_X (V4L2_CID_FIMC_IS_BASE + 502) +#define V4L2_CID_IS_CAMERA_METERING_WINDOW_Y (V4L2_CID_FIMC_IS_BASE + 503) + +#define V4L2_CID_IS_CAMERA_AFC_MODE (V4L2_CID_FIMC_IS_BASE + 413) +enum is_afc_mode { + IS_AFC_DISABLE, + IS_AFC_AUTO, + IS_AFC_MANUAL_50HZ, + IS_AFC_MANUAL_60HZ, + IS_AFC_MAX +}; + +#define V4L2_CID_IS_AWB_LOCK_UNLOCK (V4L2_CID_FIMC_IS_BASE + 496) +enum is_awb_lock_unlock { + IS_AWB_LOCK, + IS_AWB_UNLOCK, + IS_AWB_LOCK_UNLOCK_MAX +}; + +#define V4L2_CID_IS_AE_LOCK_UNLOCK (V4L2_CID_FIMC_IS_BASE + 497) +enum is_ae_lock_unlock { + IS_AE_LOCK, + IS_AE_UNLOCK, + IS_AE_LOCK_UNLOCK_MAX +}; + +#define V4L2_CID_IS_FD_GET_FACE_COUNT (V4L2_CID_FIMC_IS_BASE + 600) +#define V4L2_CID_IS_FD_GET_FACE_FRAME_NUMBER (V4L2_CID_FIMC_IS_BASE + 601) +#define V4L2_CID_IS_FD_GET_FACE_CONFIDENCE (V4L2_CID_FIMC_IS_BASE + 602) +#define V4L2_CID_IS_FD_GET_FACE_SMILE_LEVEL (V4L2_CID_FIMC_IS_BASE + 603) +#define V4L2_CID_IS_FD_GET_FACE_BLINK_LEVEL (V4L2_CID_FIMC_IS_BASE + 604) +#define V4L2_CID_IS_FD_GET_FACE_TOPLEFT_X (V4L2_CID_FIMC_IS_BASE + 605) +#define V4L2_CID_IS_FD_GET_FACE_TOPLEFT_Y (V4L2_CID_FIMC_IS_BASE + 606) +#define V4L2_CID_IS_FD_GET_FACE_BOTTOMRIGHT_X (V4L2_CID_FIMC_IS_BASE + 607) +#define V4L2_CID_IS_FD_GET_FACE_BOTTOMRIGHT_Y (V4L2_CID_FIMC_IS_BASE + 608) +#define V4L2_CID_IS_FD_GET_LEFT_EYE_TOPLEFT_X (V4L2_CID_FIMC_IS_BASE + 609) +#define V4L2_CID_IS_FD_GET_LEFT_EYE_TOPLEFT_Y (V4L2_CID_FIMC_IS_BASE + 610) +#define V4L2_CID_IS_FD_GET_LEFT_EYE_BOTTOMRIGHT_X (V4L2_CID_FIMC_IS_BASE + 611) +#define V4L2_CID_IS_FD_GET_LEFT_EYE_BOTTOMRIGHT_Y (V4L2_CID_FIMC_IS_BASE + 612) +#define V4L2_CID_IS_FD_GET_RIGHT_EYE_TOPLEFT_X (V4L2_CID_FIMC_IS_BASE + 613) +#define V4L2_CID_IS_FD_GET_RIGHT_EYE_TOPLEFT_Y (V4L2_CID_FIMC_IS_BASE + 614) +#define V4L2_CID_IS_FD_GET_RIGHT_EYE_BOTTOMRIGHT_X (V4L2_CID_FIMC_IS_BASE + 615) +#define V4L2_CID_IS_FD_GET_RIGHT_EYE_BOTTOMRIGHT_Y (V4L2_CID_FIMC_IS_BASE + 616) +#define V4L2_CID_IS_FD_GET_MOUTH_TOPLEFT_X (V4L2_CID_FIMC_IS_BASE + 617) +#define V4L2_CID_IS_FD_GET_MOUTH_TOPLEFT_Y (V4L2_CID_FIMC_IS_BASE + 618) +#define V4L2_CID_IS_FD_GET_MOUTH_BOTTOMRIGHT_X (V4L2_CID_FIMC_IS_BASE + 619) +#define V4L2_CID_IS_FD_GET_MOUTH_BOTTOMRIGHT_Y (V4L2_CID_FIMC_IS_BASE + 620) +#define V4L2_CID_IS_FD_GET_ANGLE (V4L2_CID_FIMC_IS_BASE + 621) +#define V4L2_CID_IS_FD_GET_YAW_ANGLE (V4L2_CID_FIMC_IS_BASE + 622) +#define V4L2_CID_IS_FD_GET_NEXT (V4L2_CID_FIMC_IS_BASE + 623) +#define V4L2_CID_IS_FD_GET_DATA (V4L2_CID_FIMC_IS_BASE + 624) + +#define V4L2_CID_IS_FD_SET_MAX_FACE_NUMBER (V4L2_CID_FIMC_IS_BASE + 650) +#define V4L2_CID_IS_FD_SET_ROLL_ANGLE (V4L2_CID_FIMC_IS_BASE + 651) +enum is_fd_roll_angle { + /* 0, 45, 0, -45 */ + IS_FD_ROLL_ANGLE_BASIC = 0, + /* 0, 30, 0, -30, 0, 45, 0, -45 */ + IS_FD_ROLL_ANGLE_PRECISE_BASIC = 1, + /* 0, 90, 0, -90 */ + IS_FD_ROLL_ANGLE_SIDES = 2, + /* 0, 90, 0, -90 0, 45, 0, -45 */ + IS_FD_ROLL_ANGLE_PRECISE_SIDES = 3, + /* 0, 90, 0, -90, 0, 180 */ + IS_FD_ROLL_ANGLE_FULL = 4, + /* 0, 90, 0, -90, 0, 180, 0, 135, 0, -135 */ + IS_FD_ROLL_ANGLE_PRECISE_FULL = 5, +}; + +#define V4L2_CID_IS_FD_SET_YAW_ANGLE (V4L2_CID_FIMC_IS_BASE + 652) +enum is_fd_yaw_angle { + IS_FD_YAW_ANGLE_0 = 0, + IS_FD_YAW_ANGLE_45 = 1, + IS_FD_YAW_ANGLE_90 = 2, + IS_FD_YAW_ANGLE_45_90 = 3, +}; + +#define V4L2_CID_IS_FD_SET_SMILE_MODE (V4L2_CID_FIMC_IS_BASE + 653) +enum is_fd_smile_mode { + IS_FD_SMILE_MODE_DISABLE = 0, + IS_FD_SMILE_MODE_ENABLE = 1, +}; + +#define V4L2_CID_IS_FD_SET_BLINK_MODE (V4L2_CID_FIMC_IS_BASE + 654) +enum is_fd_blink_mode { + IS_FD_BLINK_MODE_DISABLE = 0, + IS_FD_BLINK_MODE_ENABLE = 1, +}; + +#define V4L2_CID_IS_FD_SET_EYE_DETECT_MODE (V4L2_CID_FIMC_IS_BASE + 655) +enum is_fd_eye_detect_mode { + IS_FD_EYE_DETECT_DISABLE = 0, + IS_FD_EYE_DETECT_ENABLE = 1, +}; + +#define V4L2_CID_IS_FD_SET_MOUTH_DETECT_MODE (V4L2_CID_FIMC_IS_BASE + 656) +enum is_fd_mouth_detect_mode { + IS_FD_MOUTH_DETECT_DISABLE = 0, + IS_FD_MOUTH_DETECT_ENABLE = 1, +}; + +#define V4L2_CID_IS_FD_SET_ORIENTATION_MODE (V4L2_CID_FIMC_IS_BASE + 657) +enum is_fd_orientation_mode { + IS_FD_ORIENTATION_DISABLE = 0, + IS_FD_ORIENTATION_ENABLE = 1, +}; + +#define V4L2_CID_IS_FD_SET_ORIENTATION (V4L2_CID_FIMC_IS_BASE + 658) +#define V4L2_CID_IS_FD_SET_DATA_ADDRESS (V4L2_CID_FIMC_IS_BASE + 659) + +#define V4L2_CID_IS_SET_ISP (V4L2_CID_FIMC_IS_BASE + 440) +enum is_isp_bypass_mode { + IS_ISP_BYPASS_DISABLE, + IS_ISP_BYPASS_ENABLE, + IS_ISP_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_DRC (V4L2_CID_FIMC_IS_BASE + 441) +enum is_drc_bypass_mode { + IS_DRC_BYPASS_DISABLE, + IS_DRC_BYPASS_ENABLE, + IS_DRC_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_FD (V4L2_CID_FIMC_IS_BASE + 442) +enum is_fd_bypass_mode { + IS_FD_BYPASS_DISABLE, + IS_FD_BYPASS_ENABLE, + IS_FD_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_ODC (V4L2_CID_FIMC_IS_BASE + 443) +enum is_odc_bypass_mode { + IS_ODC_BYPASS_DISABLE, + IS_ODC_BYPASS_ENABLE, + IS_ODC_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_DIS (V4L2_CID_FIMC_IS_BASE + 444) +enum is_dis_bypass_mode { + IS_DIS_BYPASS_DISABLE, + IS_DIS_BYPASS_ENABLE, + IS_DIS_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_3DNR (V4L2_CID_FIMC_IS_BASE + 445) +enum is_tdnr_bypass_mode { + IS_TDNR_BYPASS_DISABLE, + IS_TDNR_BYPASS_ENABLE, + IS_TDNR_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_SCALERC (V4L2_CID_FIMC_IS_BASE + 446) +enum is_scalerc_bypass_mode { + IS_SCALERC_BYPASS_DISABLE, + IS_SCALERC_BYPASS_ENABLE, + IS_SCALERC_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_SCALERP (V4L2_CID_FIMC_IS_BASE + 446) +enum is_scalerp_bypass_mode { + IS_SCALERP_BYPASS_DISABLE, + IS_SCALERP_BYPASS_ENABLE, + IS_SCALERP_BYPASS_MAX +}; + +#define V4L2_CID_IS_ROTATION_MODE (V4L2_CID_FIMC_IS_BASE + 450) +enum is_rotation_mode { + IS_ROTATION_0, + IS_ROTATION_90, + IS_ROTATION_180, + IS_ROTATION_270, + IS_ROTATION_MAX +}; + +#define V4L2_CID_IS_3DNR_1ST_FRAME_MODE (V4L2_CID_FIMC_IS_BASE + 451) +enum is_tdnr_1st_frame_mode { + IS_TDNR_1ST_FRAME_NOPROCESSING, + IS_TDNR_1ST_FRAME_2DNR, + IS_TDNR_MAX +}; + +#define V4L2_CID_IS_CAMERA_OBJECT_POSITION_X (V4L2_CID_FIMC_IS_BASE + 452) +#define V4L2_CID_IS_CAMERA_OBJECT_POSITION_Y (V4L2_CID_FIMC_IS_BASE + 453) +#define V4L2_CID_IS_CAMERA_WINDOW_SIZE_X (V4L2_CID_FIMC_IS_BASE + 454) +#define V4L2_CID_IS_CAMERA_WINDOW_SIZE_Y (V4L2_CID_FIMC_IS_BASE + 455) + +#define V4L2_CID_IS_CAMERA_EXIF_EXPTIME (V4L2_CID_FIMC_IS_BASE + 456) +#define V4L2_CID_IS_CAMERA_EXIF_FLASH (V4L2_CID_FIMC_IS_BASE + 457) +#define V4L2_CID_IS_CAMERA_EXIF_ISO (V4L2_CID_FIMC_IS_BASE + 458) +#define V4L2_CID_IS_CAMERA_EXIF_SHUTTERSPEED (V4L2_CID_FIMC_IS_BASE + 459) +#define V4L2_CID_IS_CAMERA_EXIF_BRIGHTNESS (V4L2_CID_FIMC_IS_BASE + 460) + +#define V4L2_CID_IS_CAMERA_ISP_SEL_INPUT (V4L2_CID_FIMC_IS_BASE + 461) +enum is_isp_sel_input { + IS_ISP_INPUT_OTF, + IS_ISP_INPUT_DMA1, + IS_ISP_INPUT_DMA2, + IS_ISP_INPUT_DMA12, + IS_ISP_INPUT_MAX +}; + +#define V4L2_CID_IS_CAMERA_ISP_SEL_OUTPUT (V4L2_CID_FIMC_IS_BASE + 462) +enum is_isp_sel_output { + IS_ISP_OUTPUT_OTF, + IS_ISP_OUTPUT_DMA1, + IS_ISP_OUTPUT_DMA2, + IS_ISP_OUTPUT_DMA12, + IS_ISP_OUTPUT_OTF_DMA1, + IS_ISP_OUTPUT_OTF_DMA2, + IS_ISP_OUTPUT_OTF_DMA12, + IS_ISP_OUTPUT_MAX +}; + +#define V4L2_CID_IS_CAMERA_DRC_SEL_INPUT (V4L2_CID_FIMC_IS_BASE + 463) +enum is_drc_sel_input { + IS_DRC_INPUT_OTF, + IS_DRC_INPUT_DMA, + IS_DRC_INPUT_MAX +}; + +#define V4L2_CID_IS_CAMERA_FD_SEL_INPUT (V4L2_CID_FIMC_IS_BASE + 464) +enum is_fd_sel_input { + IS_FD_INPUT_OTF, + IS_FD_INPUT_DMA, + IS_FD_INPUT_MAX +}; + +#define V4L2_CID_IS_CAMERA_INIT_WIDTH (V4L2_CID_FIMC_IS_BASE + 465) +#define V4L2_CID_IS_CAMERA_INIT_HEIGHT (V4L2_CID_FIMC_IS_BASE + 466) + +#define V4L2_CID_IS_CMD_ISP (V4L2_CID_FIMC_IS_BASE + 467) +enum is_isp_cmd_mode { + IS_ISP_COMMAND_STOP, + IS_ISP_COMMAND_START, + IS_ISP_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_DRC (V4L2_CID_FIMC_IS_BASE + 468) +enum is_drc_cmd_mode { + IS_DRC_COMMAND_STOP, + IS_DRC_COMMAND_START, + IS_DRC_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_FD (V4L2_CID_FIMC_IS_BASE + 469) +enum is_fd_cmd_mode { + IS_FD_COMMAND_STOP, + IS_FD_COMMAND_START, + IS_FD_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_ODC (V4L2_CID_FIMC_IS_BASE + 470) +enum is_odc_cmd_mode { + IS_ODC_COMMAND_STOP, + IS_ODC_COMMAND_START, + IS_ODC_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_DIS (V4L2_CID_FIMC_IS_BASE + 471) +enum is_dis_cmd_mode { + IS_DIS_COMMAND_STOP, + IS_DIS_COMMAND_START, + IS_DIS_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_TDNR (V4L2_CID_FIMC_IS_BASE + 472) +enum is_tdnr_cmd_mode { + IS_TDNR_COMMAND_STOP, + IS_TDNR_COMMAND_START, + IS_TDNR_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_SCALERC (V4L2_CID_FIMC_IS_BASE + 473) +enum is_scalerc_cmd_mode { + IS_SCALERC_COMMAND_STOP, + IS_SCALERC_COMMAND_START, + IS_SCALERC_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_SCALERP (V4L2_CID_FIMC_IS_BASE + 474) +enum is_scalerp_cmd_mode { + IS_SCALERP_COMMAND_STOP, + IS_SCALERP_COMMAND_START, + IS_SCALERP_COMMAND_MAX +}; + +#define V4L2_CID_IS_GET_SENSOR_OFFSET_X (V4L2_CID_FIMC_IS_BASE + 480) +#define V4L2_CID_IS_GET_SENSOR_OFFSET_Y (V4L2_CID_FIMC_IS_BASE + 481) +#define V4L2_CID_IS_GET_SENSOR_WIDTH (V4L2_CID_FIMC_IS_BASE + 482) +#define V4L2_CID_IS_GET_SENSOR_HEIGHT (V4L2_CID_FIMC_IS_BASE + 483) + +#define V4L2_CID_IS_GET_FRAME_VALID (V4L2_CID_FIMC_IS_BASE + 484) +#define V4L2_CID_IS_SET_FRAME_VALID (V4L2_CID_FIMC_IS_BASE + 485) +#define V4L2_CID_IS_GET_FRAME_BADMARK (V4L2_CID_FIMC_IS_BASE + 486) +#define V4L2_CID_IS_SET_FRAME_BADMARK (V4L2_CID_FIMC_IS_BASE + 487) +#define V4L2_CID_IS_GET_FRAME_CAPTURED (V4L2_CID_FIMC_IS_BASE + 488) +#define V4L2_CID_IS_SET_FRAME_CAPTURED (V4L2_CID_FIMC_IS_BASE + 489) +#define V4L2_CID_IS_SET_FRAME_NUMBER (V4L2_CID_FIMC_IS_BASE + 490) +#define V4L2_CID_IS_GET_FRAME_NUMBER (V4L2_CID_FIMC_IS_BASE + 491) +#define V4L2_CID_IS_CLEAR_FRAME_NUMBER (V4L2_CID_FIMC_IS_BASE + 492) +#define V4L2_CID_IS_GET_LOSTED_FRAME_NUMBER (V4L2_CID_FIMC_IS_BASE + 493) +#define V4L2_CID_IS_ISP_DMA_BUFFER_NUM (V4L2_CID_FIMC_IS_BASE + 494) +#define V4L2_CID_IS_ISP_DMA_BUFFER_ADDRESS (V4L2_CID_FIMC_IS_BASE + 495) + +#define V4L2_CID_IS_ZOOM_STATE (V4L2_CID_FIMC_IS_BASE + 660) +#define V4L2_CID_IS_ZOOM_MAX_LEVEL (V4L2_CID_FIMC_IS_BASE + 661) +#define V4L2_CID_IS_ZOOM (V4L2_CID_FIMC_IS_BASE + 662) +#define V4L2_CID_IS_FW_DEBUG_REGION_ADDR (V4L2_CID_FIMC_IS_BASE + 663) + +#define V4L2_CID_IS_TUNE_SEL_ENTRY (V4L2_CID_FIMC_IS_TUNE_BASE) +#define V4L2_CID_IS_TUNE_SENSOR_EXPOSURE (V4L2_CID_FIMC_IS_TUNE_BASE + 1) +#define V4L2_CID_IS_TUNE_SENSOR_ANALOG_GAIN (V4L2_CID_FIMC_IS_TUNE_BASE + 2) +#define V4L2_CID_IS_TUNE_SENSOR_FRAME_RATE (V4L2_CID_FIMC_IS_TUNE_BASE + 3) +#define V4L2_CID_IS_TUNE_SENSOR_ACTUATOR_POS (V4L2_CID_FIMC_IS_TUNE_BASE + 4) + +enum v4l2_blur { + BLUR_LEVEL_0 = 0, + BLUR_LEVEL_1, + BLUR_LEVEL_2, + BLUR_LEVEL_3, + BLUR_LEVEL_MAX, +}; + +#if 1 +#define V4L2_CID_CAMERA_SCENE_MODE (V4L2_CID_PRIVATE_BASE+70) +enum v4l2_camera_scene_mode { + SCENE_MODE_BASE, + SCENE_MODE_NONE, + SCENE_MODE_PORTRAIT, + SCENE_MODE_NIGHTSHOT, + SCENE_MODE_BACK_LIGHT, + SCENE_MODE_LANDSCAPE, + SCENE_MODE_SPORTS, + SCENE_MODE_PARTY_INDOOR, + SCENE_MODE_BEACH_SNOW, + SCENE_MODE_SUNSET, + SCENE_MODE_DUSK_DAWN, + SCENE_MODE_FALL_COLOR, + SCENE_MODE_FIREWORKS, + SCENE_MODE_TEXT, + SCENE_MODE_CANDLE_LIGHT, + SCENE_MODE_LOW_LIGHT, + SCENE_MODE_MAX, +}; + +#define V4L2_CID_CAMERA_FLASH_MODE (V4L2_CID_PRIVATE_BASE+71) +enum v4l2_flash_mode { + FLASH_MODE_BASE, + FLASH_MODE_OFF, + FLASH_MODE_AUTO, + FLASH_MODE_ON, + FLASH_MODE_TORCH, + FLASH_MODE_MAX, +}; + +#define V4L2_CID_CAMERA_BRIGHTNESS (V4L2_CID_PRIVATE_BASE+72) +enum v4l2_ev_mode { + EV_MINUS_4 = -4, + EV_MINUS_3 = -3, + EV_MINUS_2 = -2, + EV_MINUS_1 = -1, + EV_DEFAULT = 0, + EV_PLUS_1 = 1, + EV_PLUS_2 = 2, + EV_PLUS_3 = 3, + EV_PLUS_4 = 4, + EV_MAX, +}; + +#define V4L2_CID_CAMERA_WHITE_BALANCE (V4L2_CID_PRIVATE_BASE+73) +enum v4l2_wb_mode { + WHITE_BALANCE_BASE = 0, + WHITE_BALANCE_AUTO, + WHITE_BALANCE_SUNNY, + WHITE_BALANCE_CLOUDY, + WHITE_BALANCE_TUNGSTEN, + WHITE_BALANCE_FLUORESCENT, + WHITE_BALANCE_MAX, +}; + +#define V4L2_CID_CAMERA_EFFECT (V4L2_CID_PRIVATE_BASE+74) +enum v4l2_effect_mode { + IMAGE_EFFECT_BASE = 0, + IMAGE_EFFECT_NONE, + IMAGE_EFFECT_BNW, + IMAGE_EFFECT_SEPIA, + IMAGE_EFFECT_AQUA, + IMAGE_EFFECT_ANTIQUE, + IMAGE_EFFECT_NEGATIVE, + IMAGE_EFFECT_SHARPEN, + IMAGE_EFFECT_MAX, +}; + +#define V4L2_CID_CAMERA_ISO (V4L2_CID_PRIVATE_BASE+75) +enum v4l2_iso_mode { + ISO_AUTO = 0, + ISO_50, + ISO_100, + ISO_200, + ISO_400, + ISO_800, + ISO_1600, + ISO_SPORTS, + ISO_NIGHT, + ISO_MOVIE, + ISO_MAX, +}; + +#define V4L2_CID_CAMERA_METERING (V4L2_CID_PRIVATE_BASE+76) +enum v4l2_metering_mode { + METERING_BASE = 0, + METERING_MATRIX, + METERING_CENTER, + METERING_SPOT, + METERING_MAX, +}; + +#define V4L2_CID_CAMERA_CONTRAST (V4L2_CID_PRIVATE_BASE+77) +enum v4l2_contrast_mode { + CONTRAST_MINUS_2 = 0, + CONTRAST_MINUS_1, + CONTRAST_DEFAULT, + CONTRAST_PLUS_1, + CONTRAST_PLUS_2, + CONTRAST_MAX, +}; + +#define V4L2_CID_CAMERA_SATURATION (V4L2_CID_PRIVATE_BASE+78) +enum v4l2_saturation_mode { + SATURATION_MINUS_2 = 0, + SATURATION_MINUS_1, + SATURATION_DEFAULT, + SATURATION_PLUS_1, + SATURATION_PLUS_2, + SATURATION_MAX, +}; + +#define V4L2_CID_CAMERA_SHARPNESS (V4L2_CID_PRIVATE_BASE+79) +enum v4l2_sharpness_mode { + SHARPNESS_MINUS_2 = 0, + SHARPNESS_MINUS_1, + SHARPNESS_DEFAULT, + SHARPNESS_PLUS_1, + SHARPNESS_PLUS_2, + SHARPNESS_MAX, +}; + +#define V4L2_CID_CAMERA_WDR (V4L2_CID_PRIVATE_BASE+80) +enum v4l2_wdr_mode { + WDR_OFF, + WDR_ON, + WDR_MAX, +}; + +#define V4L2_CID_CAMERA_ANTI_SHAKE (V4L2_CID_PRIVATE_BASE+81) +enum v4l2_anti_shake_mode { + ANTI_SHAKE_OFF, + ANTI_SHAKE_STILL_ON, + ANTI_SHAKE_MOVIE_ON, + ANTI_SHAKE_MAX, +}; + +#define V4L2_CID_CAMERA_TOUCH_AF_START_STOP (V4L2_CID_PRIVATE_BASE+82) +enum v4l2_touch_af { + TOUCH_AF_STOP = 0, + TOUCH_AF_START, + TOUCH_AF_MAX, +}; + +#define V4L2_CID_CAMERA_SMART_AUTO (V4L2_CID_PRIVATE_BASE+83) +enum v4l2_smart_auto { + SMART_AUTO_OFF = 0, + SMART_AUTO_ON, + SMART_AUTO_MAX, +}; + +#define V4L2_CID_CAMERA_VINTAGE_MODE (V4L2_CID_PRIVATE_BASE+84) +enum v4l2_vintage_mode { + VINTAGE_MODE_BASE, + VINTAGE_MODE_OFF, + VINTAGE_MODE_NORMAL, + VINTAGE_MODE_WARM, + VINTAGE_MODE_COOL, + VINTAGE_MODE_BNW, + VINTAGE_MODE_MAX, +}; + +#define V4L2_CID_CAMERA_JPEG_QUALITY (V4L2_CID_PRIVATE_BASE+85) +/* (V4L2_CID_PRIVATE_BASE+86) */ +#define V4L2_CID_CAMERA_GPS_LATITUDE (V4L2_CID_CAMERA_CLASS_BASE+30) +/* (V4L2_CID_PRIVATE_BASE+87) */ +#define V4L2_CID_CAMERA_GPS_LONGITUDE (V4L2_CID_CAMERA_CLASS_BASE + 31) +/* (V4L2_CID_PRIVATE_BASE+88) */ +#define V4L2_CID_CAMERA_GPS_TIMESTAMP (V4L2_CID_CAMERA_CLASS_BASE + 32) +/* (V4L2_CID_PRIVATE_BASE+89)*/ +#define V4L2_CID_CAMERA_GPS_ALTITUDE (V4L2_CID_CAMERA_CLASS_BASE + 33) +#define V4L2_CID_CAMERA_EXIF_TIME_INFO (V4L2_CID_CAMERA_CLASS_BASE + 34) +#define V4L2_CID_CAMERA_GPS_PROCESSINGMETHOD (V4L2_CID_CAMERA_CLASS_BASE+35) + +#define V4L2_CID_FOCUS_AUTO_MODE (V4L2_CID_CAMERA_CLASS_BASE+36) +enum v4l2_focus_mode_type { + V4L2_FOCUS_AUTO_NORMAL = 0, + V4L2_FOCUS_AUTO_MACRO, + V4L2_FOCUS_AUTO_CONTINUOUS, + V4L2_FOCUS_AUTO_FACE_DETECTION, + V4L2_FOCUS_AUTO_RECTANGLE, + V4L2_FOCUS_AUTO_MAX, +}; +#define V4L2_CID_FOCUS_AUTO_RECTANGLE_LEFT (V4L2_CID_CAMERA_CLASS_BASE+37) +#define V4L2_CID_FOCUS_AUTO_RECTANGLE_TOP (V4L2_CID_CAMERA_CLASS_BASE+38) +#define V4L2_CID_FOCUS_AUTO_RECTANGLE_WIDTH (V4L2_CID_CAMERA_CLASS_BASE+39) +#define V4L2_CID_FOCUS_AUTO_RECTANGLE_HEIGHT (V4L2_CID_CAMERA_CLASS_BASE+40) + +#define V4L2_CID_CAMERA_ZOOM (V4L2_CID_PRIVATE_BASE+90) +enum v4l2_zoom_level { + ZOOM_LEVEL_0 = 0, + ZOOM_LEVEL_1, + ZOOM_LEVEL_2, + ZOOM_LEVEL_3, + ZOOM_LEVEL_4, + ZOOM_LEVEL_5, + ZOOM_LEVEL_6, + ZOOM_LEVEL_7, + ZOOM_LEVEL_8, + ZOOM_LEVEL_9, + ZOOM_LEVEL_10, + ZOOM_LEVEL_11, + ZOOM_LEVEL_12, + ZOOM_LEVEL_MAX = 31, +}; + +#define V4L2_CID_CAMERA_FACE_DETECTION (V4L2_CID_PRIVATE_BASE+91) +enum v4l2_face_detection { + FACE_DETECTION_OFF = 0, + FACE_DETECTION_ON, + FACE_DETECTION_NOLINE, + FACE_DETECTION_ON_BEAUTY, + FACE_DETECTION_MAX, +}; + +#define V4L2_CID_CAMERA_SMART_AUTO_STATUS (V4L2_CID_PRIVATE_BASE+92) +enum v4l2_smart_auto_status { + SMART_AUTO_STATUS_AUTO = 0, + SMART_AUTO_STATUS_LANDSCAPE, + SMART_AUTO_STATUS_PORTRAIT, + SMART_AUTO_STATUS_MACRO, + SMART_AUTO_STATUS_NIGHT, + SMART_AUTO_STATUS_PORTRAIT_NIGHT, + SMART_AUTO_STATUS_BACKLIT, + SMART_AUTO_STATUS_PORTRAIT_BACKLIT, + SMART_AUTO_STATUS_ANTISHAKE, + SMART_AUTO_STATUS_PORTRAIT_ANTISHAKE, + SMART_AUTO_STATUS_MAX, +}; + +#define V4L2_CID_CAMERA_SET_AUTO_FOCUS (V4L2_CID_PRIVATE_BASE+93) +enum v4l2_auto_focus { + AUTO_FOCUS_OFF = 0, + AUTO_FOCUS_ON, + AUTO_FOCUS_MAX, +}; + +#define V4L2_CID_CAMERA_BEAUTY_SHOT (V4L2_CID_PRIVATE_BASE+94) +enum v4l2_beauty_shot { + BEAUTY_SHOT_OFF = 0, + BEAUTY_SHOT_ON, + BEAUTY_SHOT_MAX, +}; + +#define V4L2_CID_CAMERA_AEAWB_LOCK_UNLOCK (V4L2_CID_PRIVATE_BASE+95) +enum v4l2_ae_awb_lockunlock { + AE_UNLOCK_AWB_UNLOCK = 0, + AE_LOCK_AWB_UNLOCK, + AE_UNLOCK_AWB_LOCK, + AE_LOCK_AWB_LOCK, + AE_AWB_MAX +}; + +#define V4L2_CID_CAMERA_FACEDETECT_LOCKUNLOCK (V4L2_CID_PRIVATE_BASE+96) +enum v4l2_face_lock { + FACE_LOCK_OFF = 0, + FACE_LOCK_ON, + FIRST_FACE_TRACKING, + FACE_LOCK_MAX, +}; + +#define V4L2_CID_CAMERA_OBJECT_POSITION_X (V4L2_CID_PRIVATE_BASE+97) +#define V4L2_CID_CAMERA_OBJECT_POSITION_Y (V4L2_CID_PRIVATE_BASE+98) +#define V4L2_CID_CAMERA_FOCUS_MODE (V4L2_CID_PRIVATE_BASE+99) +enum v4l2_focusmode { + FOCUS_MODE_AUTO = 0, + FOCUS_MODE_MACRO, + FOCUS_MODE_FACEDETECT, + FOCUS_MODE_AUTO_DEFAULT, + FOCUS_MODE_MACRO_DEFAULT, + FOCUS_MODE_FACEDETECT_DEFAULT, + FOCUS_MODE_INFINITY, + FOCUS_MODE_FIXED, + FOCUS_MODE_CONTINUOUS, + FOCUS_MODE_CONTINUOUS_PICTURE, + FOCUS_MODE_CONTINUOUS_PICTURE_MACRO, + FOCUS_MODE_CONTINUOUS_VIDEO, + FOCUS_MODE_TOUCH, + FOCUS_MODE_MAX, + FOCUS_MODE_DEFAULT = (1 << 8), +}; + +#define V4L2_CID_CAMERA_OBJ_TRACKING_STATUS (V4L2_CID_PRIVATE_BASE+100) +enum v4l2_obj_tracking_status { + OBJECT_TRACKING_STATUS_BASE, + OBJECT_TRACKING_STATUS_PROGRESSING, + OBJECT_TRACKING_STATUS_SUCCESS, + OBJECT_TRACKING_STATUS_FAIL, + OBJECT_TRACKING_STATUS_MISSING, + OBJECT_TRACKING_STATUS_MAX, +}; + +#define V4L2_CID_CAMERA_OBJ_TRACKING_START_STOP (V4L2_CID_PRIVATE_BASE+101) +enum v4l2_ot_start_stop { + OT_STOP = 0, + OT_START, + OT_MAX, +}; + +#define V4L2_CID_CAMERA_CAF_START_STOP (V4L2_CID_PRIVATE_BASE+102) +enum v4l2_caf_start_stop { + CAF_STOP = 0, + CAF_START, + CAF_MAX, +}; + +#define V4L2_CID_CAMERA_AUTO_FOCUS_RESULT (V4L2_CID_PRIVATE_BASE+103) +enum v4l2_af_status { + CAMERA_AF_STATUS_IN_PROGRESS = 0, + CAMERA_AF_STATUS_SUCCESS, + CAMERA_AF_STATUS_FAIL, + CAMERA_AF_STATUS_1ST_SUCCESS, + CAMERA_AF_STATUS_MAX, +}; +#define V4L2_CID_CAMERA_FRAME_RATE (V4L2_CID_PRIVATE_BASE+104) +enum v4l2_frame_rate { + FRAME_RATE_AUTO = 0, + FRAME_RATE_7 = 7, + FRAME_RATE_15 = 15, + FRAME_RATE_20 = 20, + FRAME_RATE_30 = 30, + FRAME_RATE_60 = 60, + FRAME_RATE_120 = 120, + FRAME_RATE_MAX +}; + +#define V4L2_CID_CAMERA_ANTI_BANDING (V4L2_CID_PRIVATE_BASE+105) +enum v4l2_anti_banding{ + ANTI_BANDING_AUTO = 0, + ANTI_BANDING_50HZ = 1, + ANTI_BANDING_60HZ = 2, + ANTI_BANDING_OFF = 3, +}; + +#define V4L2_CID_CAMERA_SET_GAMMA (V4L2_CID_PRIVATE_BASE+106) +enum v4l2_gamma_mode{ + GAMMA_OFF = 0, + GAMMA_ON = 1, + GAMMA_MAX, +}; + +#define V4L2_CID_CAMERA_SET_SLOW_AE (V4L2_CID_PRIVATE_BASE+107) +enum v4l2_slow_ae_mode{ + SLOW_AE_OFF, + SLOW_AE_ON, + SLOW_AE_MAX, +}; + +#define V4L2_CID_CAMERA_BATCH_REFLECTION (V4L2_CID_PRIVATE_BASE+108) +#define V4L2_CID_CAMERA_EXIF_ORIENTATION (V4L2_CID_PRIVATE_BASE+109) + +/* s1_camera [ Defense process by ESD input ] */ +#define V4L2_CID_CAMERA_RESET (V4L2_CID_PRIVATE_BASE+111) +#define V4L2_CID_CAMERA_CHECK_DATALINE (V4L2_CID_PRIVATE_BASE+112) +#define V4L2_CID_CAMERA_CHECK_DATALINE_STOP (V4L2_CID_PRIVATE_BASE+113) + +#endif + +/* Modify NTTS1 */ +#if defined(CONFIG_ARIES_NTT) +#define V4L2_CID_CAMERA_AE_AWB_DISABLE_LOCK (V4L2_CID_PRIVATE_BASE+114) +#endif +#define V4L2_CID_CAMERA_THUMBNAIL_NULL (V4L2_CID_PRIVATE_BASE+115) +#define V4L2_CID_CAMERA_SENSOR_MODE (V4L2_CID_PRIVATE_BASE+116) +enum v4l2_sensor_mode { + SENSOR_CAMERA, + SENSOR_MOVIE, +}; + +typedef enum { + STREAM_MODE_CAM_OFF, + STREAM_MODE_CAM_ON, + STREAM_MODE_MOVIE_OFF, + STREAM_MODE_MOVIE_ON, +} stream_mode_t; + +#define V4L2_CID_CAMERA_EXIF_EXPTIME (V4L2_CID_PRIVATE_BASE+117) +#define V4L2_CID_CAMERA_EXIF_FLASH (V4L2_CID_PRIVATE_BASE+118) +#define V4L2_CID_CAMERA_EXIF_ISO (V4L2_CID_PRIVATE_BASE+119) +#define V4L2_CID_CAMERA_EXIF_TV (V4L2_CID_PRIVATE_BASE+120) +#define V4L2_CID_CAMERA_EXIF_BV (V4L2_CID_PRIVATE_BASE+121) +#define V4L2_CID_CAMERA_EXIF_EBV (V4L2_CID_PRIVATE_BASE+122) +#define V4L2_CID_CAMERA_CHECK_ESD (V4L2_CID_PRIVATE_BASE+123) +#define V4L2_CID_CAMERA_APP_CHECK (V4L2_CID_PRIVATE_BASE+124) +#define V4L2_CID_CAMERA_BUSFREQ_LOCK (V4L2_CID_PRIVATE_BASE+125) +#define V4L2_CID_CAMERA_BUSFREQ_UNLOCK (V4L2_CID_PRIVATE_BASE+126) + +#define V4L2_CID_CAMERA_FACE_ZOOM (V4L2_CID_PRIVATE_BASE + 132) +enum v4l2_face_zoom { + FACE_ZOOM_STOP = 0, + FACE_ZOOM_START +}; + +/* control for post processing block in ISP */ +#define V4L2_CID_CAMERA_SET_ODC (V4L2_CID_PRIVATE_BASE+127) +enum set_odc_mode { + CAMERA_ODC_ON, + CAMERA_ODC_OFF +}; + +#define V4L2_CID_CAMERA_SET_DIS (V4L2_CID_PRIVATE_BASE+128) +enum set_dis_mode { + CAMERA_DIS_ON, + CAMERA_DIS_OFF +}; + +#define V4L2_CID_CAMERA_SET_3DNR (V4L2_CID_PRIVATE_BASE+129) +enum set_3dnr_mode { + CAMERA_3DNR_ON, + CAMERA_3DNR_OFF +}; + +#define V4L2_CID_EMBEDDEDDATA_ENABLE (V4L2_CID_PRIVATE_BASE+130) + +#define V4L2_CID_CAMERA_CHECK_SENSOR_STATUS (V4L2_CID_PRIVATE_BASE+150) +#define V4L2_CID_CAMERA_DEFAULT_FOCUS_POSITION (V4L2_CID_PRIVATE_BASE+151) + +/* Pixel format FOURCC depth Description */ +enum v4l2_pix_format_mode { + V4L2_PIX_FMT_MODE_PREVIEW, + V4L2_PIX_FMT_MODE_CAPTURE, + V4L2_PIX_FMT_MODE_HDR, + V4L2_PIX_FMT_MODE_VT_MIRROR, + V4L2_PIX_FMT_MODE_VT_NONMIRROR, +}; + +/* 12 Y/CbCr 4:2:0 64x32 macroblocks */ +#define V4L2_PIX_FMT_NV12T v4l2_fourcc('T', 'V', '1', '2') +#define V4L2_PIX_FMT_NV21T v4l2_fourcc('T', 'V', '2', '1') +#define V4L2_PIX_FMT_INTERLEAVED v4l2_fourcc('I', 'T', 'L', 'V') + +/* + * * V4L2 extention for digital camera + * */ +/* Strobe flash light */ +enum v4l2_strobe_control { + /* turn off the flash light */ + V4L2_STROBE_CONTROL_OFF = 0, + /* turn on the flash light */ + V4L2_STROBE_CONTROL_ON = 1, + /* act guide light before splash */ + V4L2_STROBE_CONTROL_AFGUIDE = 2, + /* charge the flash light */ + V4L2_STROBE_CONTROL_CHARGE = 3, +}; + +enum v4l2_strobe_conf { + V4L2_STROBE_OFF = 0, /* Always off */ + V4L2_STROBE_ON = 1, /* Always splashes */ + /* Auto control presets */ + V4L2_STROBE_AUTO = 2, + V4L2_STROBE_REDEYE_REDUCTION = 3, + V4L2_STROBE_SLOW_SYNC = 4, + V4L2_STROBE_FRONT_CURTAIN = 5, + V4L2_STROBE_REAR_CURTAIN = 6, + /* Extra manual control presets */ + /* keep turned on until turning off */ + V4L2_STROBE_PERMANENT = 7, + V4L2_STROBE_EXTERNAL = 8, +}; + +enum v4l2_strobe_status { + V4L2_STROBE_STATUS_OFF = 0, + /* while processing configurations */ + V4L2_STROBE_STATUS_BUSY = 1, + V4L2_STROBE_STATUS_ERR = 2, + V4L2_STROBE_STATUS_CHARGING = 3, + V4L2_STROBE_STATUS_CHARGED = 4, +}; + +/* capabilities field */ +/* No strobe supported */ +#define V4L2_STROBE_CAP_NONE 0x0000 +/* Always flash off mode */ +#define V4L2_STROBE_CAP_OFF 0x0001 +/* Always use flash light mode */ +#define V4L2_STROBE_CAP_ON 0x0002 +/* Flashlight works automatic */ +#define V4L2_STROBE_CAP_AUTO 0x0004 +/* Red-eye reduction */ +#define V4L2_STROBE_CAP_REDEYE 0x0008 +/* Slow sync */ +#define V4L2_STROBE_CAP_SLOWSYNC 0x0010 +/* Front curtain */ +#define V4L2_STROBE_CAP_FRONT_CURTAIN 0x0020 +/* Rear curtain */ +#define V4L2_STROBE_CAP_REAR_CURTAIN 0x0040 +/* keep turned on until turning off */ +#define V4L2_STROBE_CAP_PERMANENT 0x0080 +/* use external strobe */ +#define V4L2_STROBE_CAP_EXTERNAL 0x0100 + +/* Set mode and Get status */ +struct v4l2_strobe { + /* off/on/charge:0/1/2 */ + enum v4l2_strobe_control control; + /* supported strobe capabilities */ + __u32 capabilities; + enum v4l2_strobe_conf mode; + enum v4l2_strobe_status status; /* read only */ + /* default is 0 and range of value varies from each models */ + __u32 flash_ev; + __u32 reserved[4]; +}; + +#define VIDIOC_S_STROBE _IOWR('V', 83, struct v4l2_strobe) +#define VIDIOC_G_STROBE _IOR('V', 84, struct v4l2_strobe) + +/* Object recognition and collateral actions */ +enum v4l2_recog_mode { + V4L2_RECOGNITION_MODE_OFF = 0, + V4L2_RECOGNITION_MODE_ON = 1, + V4L2_RECOGNITION_MODE_LOCK = 2, +}; + +enum v4l2_recog_action { + V4L2_RECOGNITION_ACTION_NONE = 0, /* only recognition */ + V4L2_RECOGNITION_ACTION_BLINK = 1, /* Capture on blinking */ + V4L2_RECOGNITION_ACTION_SMILE = 2, /* Capture on smiling */ +}; + +enum v4l2_recog_pattern { + V4L2_RECOG_PATTERN_FACE = 0, /* Face */ + V4L2_RECOG_PATTERN_HUMAN = 1, /* Human */ + V4L2_RECOG_PATTERN_CHAR = 2, /* Character */ +}; + +struct v4l2_recog_rect { + enum v4l2_recog_pattern p; /* detected pattern */ + struct v4l2_rect o; /* detected area */ + __u32 reserved[4]; +}; + +struct v4l2_recog_data { + __u8 detect_cnt; /* detected object counter */ + struct v4l2_rect o; /* detected area */ + __u32 reserved[4]; +}; + +struct v4l2_recognition { + enum v4l2_recog_mode mode; + + /* Which pattern to detect */ + enum v4l2_recog_pattern pattern; + + /* How many object to detect */ + __u8 obj_num; + + /* select detected object */ + __u32 detect_idx; + + /* read only :Get object coordination */ + struct v4l2_recog_data data; + + enum v4l2_recog_action action; + __u32 reserved[4]; +}; + +#define VIDIOC_S_RECOGNITION _IOWR('V', 85, struct v4l2_recognition) +#define VIDIOC_G_RECOGNITION _IOR('V', 86, struct v4l2_recognition) + +#endif /* __LINUX_VIDEODEV2_EXYNOS_CAMERA_H */ diff --git a/include/videodev2_exynos_camera_ext.h b/include/videodev2_exynos_camera_ext.h new file mode 100644 index 0000000..3bac352 --- /dev/null +++ b/include/videodev2_exynos_camera_ext.h @@ -0,0 +1,2914 @@ +/* + * Video for Linux Two header file for samsung + * + * Copyright (C) 2013, teahyung kim + * + * This header file contains several v4l2 APIs to be proposed to v4l2 + * community and until bein accepted, will be used restrictly in Samsung's + * camera interface driver FIMC. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +/* + * Copyright 2008, The Android Open Source Project + * Copyright 2010, Samsung Electronics Co. LTD + * + * Alternatively, Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed toggle an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LINUX_VIDEODEV2_SAMSUNG_H +#define __LINUX_VIDEODEV2_SAMSUNG_H + +/* Values for 'capabilities' field */ +/* Object detection device */ +#define V4L2_CAP_OBJ_RECOGNITION 0x10000000 +/* strobe control */ +#define V4L2_CAP_STROBE 0x20000000 + +#define V4L2_CID_FOCUS_MODE (V4L2_CID_CAMERA_CLASS_BASE + 17) +/* Focus Methods */ +typedef enum { + V4L2_FOCUS_MODE_AUTO = 0, + V4L2_FOCUS_MODE_MACRO = 1, + V4L2_FOCUS_MODE_MANUAL = 2, + V4L2_FOCUS_MODE_LASTP = 2, + V4L2_FOCUS_MODE_FACEDETECT, + V4L2_FOCUS_MODE_AUTO_DEFAULT, + V4L2_FOCUS_MODE_MACRO_DEFAULT, + V4L2_FOCUS_MODE_FACEDETECT_DEFAULT, + V4L2_FOCUS_MODE_INFINITY, + V4L2_FOCUS_MODE_FIXED, + V4L2_FOCUS_MODE_CONTINUOUS, + V4L2_FOCUS_MODE_CONTINUOUS_PICTURE, + V4L2_FOCUS_MODE_CONTINUOUS_PICTURE_MACRO, + V4L2_FOCUS_MODE_CONTINUOUS_VIDEO, + V4L2_FOCUS_MODE_TOUCH, + V4L2_FOCUS_MODE_MULTI, + V4L2_FOCUS_MODE_OBJECT_TRACKING, + V4L2_FOCUS_MODE_SINGLE, + V4L2_FOCUS_MODE_SELFSHOT, + V4L2_FOCUS_MODE_MAX, + V4L2_FOCUS_MODE_DEFAULT = (1 << 8), +} cam_focus_mode; + +#define V4L2_CID_ZOOM_MODE (V4L2_CID_CAMERA_CLASS_BASE + 18) +/* Zoom Methods */ +enum v4l2_zoom_mode { + V4L2_ZOOM_MODE_CONTINUOUS = 0, + V4L2_ZOOM_MODE_OPTICAL = 1, + V4L2_ZOOM_MODE_DIGITAL = 2, + V4L2_ZOOM_MODE_LASTP = 2, +}; + +/* Exposure Methods */ +#define V4L2_CID_PHOTOMETRY (V4L2_CID_CAMERA_CLASS_BASE + 19) +enum v4l2_photometry_mode { + V4L2_PHOTOMETRY_MULTISEG = 0, /*Multi Segment*/ + V4L2_PHOTOMETRY_CWA = 1, /*Centre Weighted Average*/ + V4L2_PHOTOMETRY_SPOT = 2, + V4L2_PHOTOMETRY_AFSPOT = 3, /*Spot metering on focused point*/ + V4L2_PHOTOMETRY_LASTP = V4L2_PHOTOMETRY_AFSPOT, +}; + +/* Manual exposure control items menu type: iris, shutter, iso */ +#define V4L2_CID_CAM_APERTURE (V4L2_CID_CAMERA_CLASS_BASE + 20) +#define V4L2_CID_CAM_SHUTTER (V4L2_CID_CAMERA_CLASS_BASE + 21) +#define V4L2_CID_CAM_ISO (V4L2_CID_CAMERA_CLASS_BASE + 22) +enum v4l2_iso { + V4L2_ISO_AUTO, + V4L2_ISO_50, + V4L2_ISO_100, + V4L2_ISO_125, + V4L2_ISO_160, + V4L2_ISO_200, + V4L2_ISO_250, + V4L2_ISO_320, + V4L2_ISO_400, + V4L2_ISO_500, + V4L2_ISO_640, + V4L2_ISO_800, + V4L2_ISO_1000, + V4L2_ISO_1250, + V4L2_ISO_1600, + V4L2_ISO_2000, + V4L2_ISO_2500, + V4L2_ISO_3200, + V4L2_ISO_4000, + V4L2_ISO_5000, + V4L2_ISO_6400, + V4L2_ISO_8000, + V4L2_ISO_10000, + V4L2_ISO_12800, + V4L2_ISO_16000, + V4L2_ISO_20000, + V4L2_ISO_25600, + V4L2_ISO_SPORTS, + V4L2_ISO_NIGHT, + V4L2_ISO_MOVIE, + V4L2_ISO_MAX +}; + +#if 0//##mmkim -- to fix compile error +/* Following CIDs are menu type */ +#define V4L2_CID_SCENEMODE (V4L2_CID_CAMERA_CLASS_BASE + 23) +enum v4l2_camera_scene_mode { + V4L2_SCENE_MODE_BASE, + V4L2_SCENE_MODE_NONE, + V4L2_SCENE_MODE_PORTRAIT, + V4L2_SCENE_MODE_NIGHTSHOT, + V4L2_SCENE_MODE_BACK_LIGHT, + V4L2_SCENE_MODE_LANDSCAPE, + V4L2_SCENE_MODE_SPORTS, + V4L2_SCENE_MODE_PARTY_INDOOR, + V4L2_SCENE_MODE_BEACH_SNOW, + V4L2_SCENE_MODE_SUNSET, + V4L2_SCENE_MODE_DUSK_DAWN, + V4L2_SCENE_MODE_FALL_COLOR, + V4L2_SCENE_MODE_FIREWORKS, + V4L2_SCENE_MODE_TEXT, + V4L2_SCENE_MODE_CANDLE_LIGHT, + V4L2_SCENE_MODE_MAX, +}; +#endif +#define V4L2_CID_CAM_STABILIZE (V4L2_CID_CAMERA_CLASS_BASE + 24) +#define V4L2_CID_CAM_MULTISHOT (V4L2_CID_CAMERA_CLASS_BASE + 25) + +/* Control dynamic range */ +#define V4L2_CID_CAM_DR (V4L2_CID_CAMERA_CLASS_BASE + 26) + +/* White balance preset control */ +#define V4L2_CID_WHITE_BALANCE_PRESET (V4L2_CID_CAMERA_CLASS_BASE + 27) +#if 0 //##mmkim -- to fix compile error +enum v4l2_wb_preset { + V4L2_WHITE_BALANCE_BASE = 0, + V4L2_WHITE_BALANCE_AUTO, + V4L2_WHITE_BALANCE_SUNNY, + V4L2_WHITE_BALANCE_CLOUDY, + V4L2_WHITE_BALANCE_TUNGSTEN, + V4L2_WHITE_BALANCE_FLUORESCENT, + V4L2_WHITE_BALANCE_FLUORESCENT_H, + V4L2_WHITE_BALANCE_FLUORESCENT_L, + V4L2_WHITE_BALANCE_FLASH, + V4L2_WHITE_BALANCE_CUSTOM, + V4L2_WHITE_BALANCE_K, + V4L2_WHITE_BALANCE_INCANDESCENT, + V4L2_WHITE_BALANCE_PROHIBITION, + V4L2_WHITE_BALANCE_HORIZON, + V4L2_WHITE_BALANCE_LEDLIGHT, + V4L2_WHITE_BALANCE_MAX, +}; +#endif +#define V4L2_CID_CAM_SENSOR_FW_VER (V4L2_CID_CAMERA_CLASS_BASE + 28) +#define V4L2_CID_CAM_PHONE_FW_VER (V4L2_CID_CAMERA_CLASS_BASE + 29) + +/* CID extensions */ +#define V4L2_CID_ROTATION (V4L2_CID_PRIVATE_BASE + 0) +#define V4L2_CID_PADDR_Y (V4L2_CID_PRIVATE_BASE + 1) +#define V4L2_CID_PADDR_CB (V4L2_CID_PRIVATE_BASE + 2) +#define V4L2_CID_PADDR_CR (V4L2_CID_PRIVATE_BASE + 3) +#define V4L2_CID_PADDR_CBCR (V4L2_CID_PRIVATE_BASE + 4) +#define V4L2_CID_OVERLAY_AUTO (V4L2_CID_PRIVATE_BASE + 5) +#define V4L2_CID_OVERLAY_VADDR0 (V4L2_CID_PRIVATE_BASE + 6) +#define V4L2_CID_OVERLAY_VADDR1 (V4L2_CID_PRIVATE_BASE + 7) +#define V4L2_CID_OVERLAY_VADDR2 (V4L2_CID_PRIVATE_BASE + 8) +#define V4L2_CID_OVLY_MODE (V4L2_CID_PRIVATE_BASE + 9) +#define V4L2_CID_DST_INFO (V4L2_CID_PRIVATE_BASE + 10) +/* UMP secure id control */ +#define V4L2_CID_GET_UMP_SECURE_ID (V4L2_CID_PRIVATE_BASE + 11) +#define V4L2_CID_GET_PHY_SRC_YADDR (V4L2_CID_PRIVATE_BASE + 12) +#define V4L2_CID_GET_PHY_SRC_CADDR (V4L2_CID_PRIVATE_BASE + 13) +#define V4L2_CID_IMAGE_EFFECT_FN (V4L2_CID_PRIVATE_BASE + 16) +#define V4L2_CID_IMAGE_EFFECT_APPLY (V4L2_CID_PRIVATE_BASE + 17) +#define V4L2_CID_IMAGE_EFFECT_CB (V4L2_CID_PRIVATE_BASE + 18) +#define V4L2_CID_IMAGE_EFFECT_CR (V4L2_CID_PRIVATE_BASE + 19) +#define V4L2_CID_RESERVED_MEM_BASE_ADDR (V4L2_CID_PRIVATE_BASE + 20) +#define V4L2_CID_FIMC_VERSION (V4L2_CID_PRIVATE_BASE + 21) + +#define V4L2_CID_CACHE_FLUSH (V4L2_CID_PRIVATE_BASE + 61) +#define V4L2_CID_RESERVED_MEM_SIZE (V4L2_CID_PRIVATE_BASE + 63) +#define V4L2_CID_STREAM_PAUSE (V4L2_CID_PRIVATE_BASE + 53) + +/* CID Extensions for camera sensor operations */ +#define V4L2_CID_CAM_PREVIEW_ONOFF (V4L2_CID_PRIVATE_BASE + 64) +#define V4L2_CID_CAM_CAPTURE (V4L2_CID_PRIVATE_BASE + 65) +/* #define V4L2_CID_CAM_JPEG_MEMSIZE (V4L2_CID_PRIVATE_BASE + 66) */ + +#define V4L2_CID_CAM_DATE_INFO_YEAR (V4L2_CID_PRIVATE_BASE + 14) +#define V4L2_CID_CAM_DATE_INFO_MONTH (V4L2_CID_PRIVATE_BASE + 15) +#define V4L2_CID_CAM_DATE_INFO_DATE (V4L2_CID_PRIVATE_BASE + 22) +#define V4L2_CID_CAM_SENSOR_VER (V4L2_CID_PRIVATE_BASE + 23) +#define V4L2_CID_CAM_FW_MINOR_VER (V4L2_CID_PRIVATE_BASE + 24) +#define V4L2_CID_CAM_FW_MAJOR_VER (V4L2_CID_PRIVATE_BASE + 25) +#define V4L2_CID_CAM_PRM_MINOR_VER (V4L2_CID_PRIVATE_BASE + 26) +#define V4L2_CID_CAM_PRM_MAJOR_VER (V4L2_CID_PRIVATE_BASE + 27) +#define V4L2_CID_CAM_FW_VER (V4L2_CID_PRIVATE_BASE + 28) +#define V4L2_CID_CAM_SET_FW_ADDR (V4L2_CID_PRIVATE_BASE + 29) +#define V4L2_CID_CAM_SET_FW_SIZE (V4L2_CID_PRIVATE_BASE + 30) + + +#define V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET (V4L2_CID_PRIVATE_BASE + 36) +#define V4L2_CID_CAM_JPEG_QUALITY (V4L2_CID_PRIVATE_BASE + 37) +#define V4L2_CID_CAM_SENSOR_MAKER (V4L2_CID_PRIVATE_BASE + 38) +#define V4L2_CID_CAM_SENSOR_OPTICAL (V4L2_CID_PRIVATE_BASE + 39) +#define V4L2_CID_CAM_AF_VER_LOW (V4L2_CID_PRIVATE_BASE + 40) +#define V4L2_CID_CAM_AF_VER_HIGH (V4L2_CID_PRIVATE_BASE + 41) +#define V4L2_CID_CAM_GAMMA_RG_LOW (V4L2_CID_PRIVATE_BASE + 42) +#define V4L2_CID_CAM_GAMMA_RG_HIGH (V4L2_CID_PRIVATE_BASE + 43) +#define V4L2_CID_CAM_GAMMA_BG_LOW (V4L2_CID_PRIVATE_BASE + 44) +#define V4L2_CID_CAM_GAMMA_BG_HIGH (V4L2_CID_PRIVATE_BASE + 45) +#define V4L2_CID_CAM_DUMP_FW (V4L2_CID_PRIVATE_BASE + 46) +#define V4L2_CID_CAM_GET_DUMP_SIZE (V4L2_CID_PRIVATE_BASE + 47) +#define V4L2_CID_CAMERA_VT_MODE (V4L2_CID_PRIVATE_BASE + 48) +typedef enum { + CAM_VT_MODE_NONE , + CAM_VT_MODE_3G , + CAM_VT_MODE_VOIP , +} cam_vt_mode; + +#define V4L2_CID_CAMERA_VGA_BLUR (V4L2_CID_PRIVATE_BASE + 49) +#define V4L2_CID_CAMERA_CAPTURE (V4L2_CID_PRIVATE_BASE + 50) +#define V4L2_CID_CAMERA_HDR (V4L2_CID_PRIVATE_BASE + 51) +#define V4L2_CID_CAMERA_HYBRID (V4L2_CID_PRIVATE_BASE + 52) + +#define V4L2_CID_MAIN_SW_DATE_INFO_YEAR (V4L2_CID_PRIVATE_BASE + 54) +#define V4L2_CID_MAIN_SW_DATE_INFO_MONTH (V4L2_CID_PRIVATE_BASE + 55) +#define V4L2_CID_MAIN_SW_DATE_INFO_DATE (V4L2_CID_PRIVATE_BASE + 56) +#define V4L2_CID_MAIN_SW_FW_MINOR_VER (V4L2_CID_PRIVATE_BASE + 57) +#define V4L2_CID_MAIN_SW_FW_MAJOR_VER (V4L2_CID_PRIVATE_BASE + 58) +#define V4L2_CID_MAIN_SW_PRM_MINOR_VER (V4L2_CID_PRIVATE_BASE + 59) +#define V4L2_CID_MAIN_SW_PRM_MAJOR_VER (V4L2_CID_PRIVATE_BASE + 60) +#define V4L2_CID_CAMERA_HYBRID_CAPTURE (V4L2_CID_PRIVATE_BASE + 62) +#define V4L2_CID_CAMERA_FAST_MODE (V4L2_CID_PRIVATE_BASE + 66) +enum cam_fast_mode { + FAST_MODE_SUBSAMPLING_NONE , + FAST_MODE_SUBSAMPLING_HALF , + FAST_MODE_SUBSAMPLING_QUARTER , +}; +#define V4L2_CID_CAMERA_YUV_CAPTURE (V4L2_CID_PRIVATE_BASE + 69) + +#define V4L2_CID_FIMC_IS_BASE (V4L2_CTRL_CLASS_CAMERA | 0x1000) +#define V4L2_CID_FIMC_IS_TUNE_BASE (V4L2_CTRL_CLASS_CAMERA | 0x2000) +#define V4L2_CID_SENSOR_BASE (V4L2_CTRL_CLASS_CAMERA | 0x3000) + +#define V4L2_CID_IS_LOAD_FW (V4L2_CID_FIMC_IS_BASE + 10) +#define V4L2_CID_IS_INIT_PARAM (V4L2_CID_FIMC_IS_BASE + 11) +#define V4L2_CID_IS_RESET (V4L2_CID_FIMC_IS_BASE + 12) +#define V4L2_CID_IS_S_POWER (V4L2_CID_FIMC_IS_BASE + 13) +enum is_set_power { + IS_POWER_OFF, + IS_POWER_ON +}; + +#define V4L2_CID_IS_S_STREAM (V4L2_CID_FIMC_IS_BASE + 14) +enum is_set_stream { + IS_DISABLE_STREAM, + IS_ENABLE_STREAM +}; + +#define V4L2_CID_IS_S_SCENARIO_MODE (V4L2_CID_FIMC_IS_BASE + 15) +#define V4L2_CID_IS_S_FORMAT_SCENARIO (V4L2_CID_FIMC_IS_BASE + 16) +enum scenario_mode { + IS_MODE_PREVIEW_STILL, + IS_MODE_PREVIEW_VIDEO, + IS_MODE_CAPTURE_STILL, + IS_MODE_CAPTURE_VIDEO, + IS_MODE_MAX +}; + +#define V4L2_CID_IS_G_CAPABILITY (V4L2_CID_FIMC_IS_BASE + 17) +#define V4L2_CID_IS_G_COMPLETES (V4L2_CID_FIMC_IS_BASE + 18) +#define V4L2_CID_IS_BDS_WIDTH (V4L2_CID_FIMC_IS_BASE + 19) +#define V4L2_CID_IS_BDS_HEIGHT (V4L2_CID_FIMC_IS_BASE + 20) +#define V4L2_CID_IS_DVFS_LOCK (V4L2_CID_FIMC_IS_BASE + 21) +#define V4L2_CID_IS_DVFS_UNLOCK (V4L2_CID_FIMC_IS_BASE + 22) +#define V4L2_CID_IS_FORCE_DONE (V4L2_CID_FIMC_IS_BASE + 50) +#define V4L2_CID_IS_SET_SETFILE (V4L2_CID_FIMC_IS_BASE + 51) +#define V4L2_CID_IS_S_BNS (V4L2_CID_FIMC_IS_BASE + 52) +#define V4L2_CID_IS_G_BNS_SIZE (V4L2_CID_FIMC_IS_BASE + 53) +#define V4L2_CID_IS_COLOR_RANGE (V4L2_CID_FIMC_IS_BASE + 54) +#define V4L2_CID_IS_MIN_TARGET_FPS (V4L2_CID_FIMC_IS_BASE + 55) +#define V4L2_CID_IS_MAX_TARGET_FPS (V4L2_CID_FIMC_IS_BASE + 56) + +/* global */ +#define V4L2_CID_IS_CAMERA_SHOT_MODE_NORMAL (V4L2_CID_FIMC_IS_BASE + 101) +/* value : 1 : single shot , >=2 : continuous shot */ + +#define V4L2_CID_IS_CAMERA_SENSOR_NUM (V4L2_CID_FIMC_IS_BASE + 201) + +#define V4L2_CID_IS_CAMERA_FOCUS_MODE (V4L2_CID_FIMC_IS_BASE + 401) +enum is_focus_mode { + IS_FOCUS_MODE_AUTO, + IS_FOCUS_MODE_MACRO, + IS_FOCUS_MODE_INFINITY, + IS_FOCUS_MODE_CONTINUOUS, + IS_FOCUS_MODE_TOUCH, + IS_FOCUS_MODE_FACEDETECT, + IS_FOCUS_MODE_IDLE, + IS_FOCUS_MODE_MAX, +}; + +#define V4L2_CID_IS_CAMERA_FLASH_MODE (V4L2_CID_FIMC_IS_BASE + 402) +enum is_flash_mode { + IS_FLASH_MODE_OFF, + IS_FLASH_MODE_AUTO, + IS_FLASH_MODE_AUTO_REDEYE, + IS_FLASH_MODE_ON, + IS_FLASH_MODE_TORCH, + IS_FLASH_MODE_MAX +}; + +#define V4L2_CID_IS_CAMERA_AWB_MODE (V4L2_CID_FIMC_IS_BASE + 403) +enum is_awb_mode { + IS_AWB_AUTO, + IS_AWB_DAYLIGHT, + IS_AWB_CLOUDY, + IS_AWB_TUNGSTEN, + IS_AWB_FLUORESCENT, + IS_AWB_MAX +}; + +#define V4L2_CID_IS_CAMERA_IMAGE_EFFECT (V4L2_CID_FIMC_IS_BASE + 404) +enum is_image_effect { + IS_IMAGE_EFFECT_DISABLE, + IS_IMAGE_EFFECT_MONOCHROME, + IS_IMAGE_EFFECT_NEGATIVE_MONO, + IS_IMAGE_EFFECT_NEGATIVE_COLOR, + IS_IMAGE_EFFECT_SEPIA, + IS_IMAGE_EFFECT_SEPIA_CB, + IS_IMAGE_EFFECT_SEPIA_CR, + IS_IMAGE_EFFECT_NEGATIVE, + IS_IMAGE_EFFECT_ARTFREEZE, + IS_IMAGE_EFFECT_EMBOSSING, + IS_IMAGE_EFFECT_SILHOUETTE, + IS_IMAGE_EFFECT_MAX +}; + +#define V4L2_CID_IS_CAMERA_ISO (V4L2_CID_FIMC_IS_BASE + 405) +enum is_iso { + IS_ISO_AUTO, + IS_ISO_50, + IS_ISO_100, + IS_ISO_200, + IS_ISO_400, + IS_ISO_800, + IS_ISO_1600, + IS_ISO_MAX +}; + +#define V4L2_CID_IS_CAMERA_CONTRAST (V4L2_CID_FIMC_IS_BASE + 406) +enum is_contrast { + IS_CONTRAST_AUTO, + IS_CONTRAST_MINUS_2, + IS_CONTRAST_MINUS_1, + IS_CONTRAST_DEFAULT, + IS_CONTRAST_PLUS_1, + IS_CONTRAST_PLUS_2, + IS_CONTRAST_MAX +}; + +#define V4L2_CID_IS_CAMERA_SATURATION (V4L2_CID_FIMC_IS_BASE + 407) +enum is_saturation { + IS_SATURATION_MINUS_2, + IS_SATURATION_MINUS_1, + IS_SATURATION_DEFAULT, + IS_SATURATION_PLUS_1, + IS_SATURATION_PLUS_2, + IS_SATURATION_MAX +}; + +#define V4L2_CID_IS_CAMERA_SHARPNESS (V4L2_CID_FIMC_IS_BASE + 408) +enum is_sharpness { + IS_SHARPNESS_MINUS_2, + IS_SHARPNESS_MINUS_1, + IS_SHARPNESS_DEFAULT, + IS_SHARPNESS_PLUS_1, + IS_SHARPNESS_PLUS_2, + IS_SHARPNESS_MAX +}; + +#define V4L2_CID_IS_CAMERA_EXPOSURE (V4L2_CID_FIMC_IS_BASE + 409) +enum is_exposure { + IS_EXPOSURE_MINUS_4, + IS_EXPOSURE_MINUS_3, + IS_EXPOSURE_MINUS_2, + IS_EXPOSURE_MINUS_1, + IS_EXPOSURE_DEFAULT, + IS_EXPOSURE_PLUS_1, + IS_EXPOSURE_PLUS_2, + IS_EXPOSURE_PLUS_3, + IS_EXPOSURE_PLUS_4, + IS_EXPOSURE_MAX +}; + +#define V4L2_CID_IS_CAMERA_BRIGHTNESS (V4L2_CID_FIMC_IS_BASE + 410) +enum is_brightness { + IS_BRIGHTNESS_MINUS_2, + IS_BRIGHTNESS_MINUS_1, + IS_BRIGHTNESS_DEFAULT, + IS_BRIGHTNESS_PLUS_1, + IS_BRIGHTNESS_PLUS_2, + IS_BRIGHTNESS_MAX +}; + +#define V4L2_CID_IS_CAMERA_HUE (V4L2_CID_FIMC_IS_BASE + 411) +enum is_hue { + IS_HUE_MINUS_2, + IS_HUE_MINUS_1, + IS_HUE_DEFAULT, + IS_HUE_PLUS_1, + IS_HUE_PLUS_2, + IS_HUE_MAX +}; + +#define V4L2_CID_IS_CAMERA_METERING (V4L2_CID_FIMC_IS_BASE + 412) +enum is_metering { + IS_METERING_AVERAGE, + IS_METERING_SPOT, + IS_METERING_MATRIX, + IS_METERING_CENTER, + IS_METERING_MAX +}; +#define V4L2_CID_IS_CAMERA_METERING_POSITION_X (V4L2_CID_FIMC_IS_BASE + 500) +#define V4L2_CID_IS_CAMERA_METERING_POSITION_Y (V4L2_CID_FIMC_IS_BASE + 501) +#define V4L2_CID_IS_CAMERA_METERING_WINDOW_X (V4L2_CID_FIMC_IS_BASE + 502) +#define V4L2_CID_IS_CAMERA_METERING_WINDOW_Y (V4L2_CID_FIMC_IS_BASE + 503) + +#define V4L2_CID_IS_CAMERA_AFC_MODE (V4L2_CID_FIMC_IS_BASE + 413) +enum is_afc_mode { + IS_AFC_DISABLE, + IS_AFC_AUTO, + IS_AFC_MANUAL_50HZ, + IS_AFC_MANUAL_60HZ, + IS_AFC_MAX +}; + +#define V4L2_CID_IS_AWB_LOCK_UNLOCK (V4L2_CID_FIMC_IS_BASE + 496) +enum is_awb_lock_unlock { + IS_AWB_LOCK, + IS_AWB_UNLOCK, + IS_AWB_LOCK_UNLOCK_MAX +}; + +#define V4L2_CID_IS_AE_LOCK_UNLOCK (V4L2_CID_FIMC_IS_BASE + 497) +enum is_ae_lock_unlock { + IS_AE_LOCK, + IS_AE_UNLOCK, + IS_AE_LOCK_UNLOCK_MAX +}; + +#define V4L2_CID_IS_FD_GET_FACE_COUNT (V4L2_CID_FIMC_IS_BASE + 600) +#define V4L2_CID_IS_FD_GET_FACE_FRAME_NUMBER (V4L2_CID_FIMC_IS_BASE + 601) +#define V4L2_CID_IS_FD_GET_FACE_CONFIDENCE (V4L2_CID_FIMC_IS_BASE + 602) +#define V4L2_CID_IS_FD_GET_FACE_SMILE_LEVEL (V4L2_CID_FIMC_IS_BASE + 603) +#define V4L2_CID_IS_FD_GET_FACE_BLINK_LEVEL (V4L2_CID_FIMC_IS_BASE + 604) +#define V4L2_CID_IS_FD_GET_FACE_TOPLEFT_X (V4L2_CID_FIMC_IS_BASE + 605) +#define V4L2_CID_IS_FD_GET_FACE_TOPLEFT_Y (V4L2_CID_FIMC_IS_BASE + 606) +#define V4L2_CID_IS_FD_GET_FACE_BOTTOMRIGHT_X (V4L2_CID_FIMC_IS_BASE + 607) +#define V4L2_CID_IS_FD_GET_FACE_BOTTOMRIGHT_Y (V4L2_CID_FIMC_IS_BASE + 608) +#define V4L2_CID_IS_FD_GET_LEFT_EYE_TOPLEFT_X (V4L2_CID_FIMC_IS_BASE + 609) +#define V4L2_CID_IS_FD_GET_LEFT_EYE_TOPLEFT_Y (V4L2_CID_FIMC_IS_BASE + 610) +#define V4L2_CID_IS_FD_GET_LEFT_EYE_BOTTOMRIGHT_X (V4L2_CID_FIMC_IS_BASE + 611) +#define V4L2_CID_IS_FD_GET_LEFT_EYE_BOTTOMRIGHT_Y (V4L2_CID_FIMC_IS_BASE + 612) +#define V4L2_CID_IS_FD_GET_RIGHT_EYE_TOPLEFT_X (V4L2_CID_FIMC_IS_BASE + 613) +#define V4L2_CID_IS_FD_GET_RIGHT_EYE_TOPLEFT_Y (V4L2_CID_FIMC_IS_BASE + 614) +#define V4L2_CID_IS_FD_GET_RIGHT_EYE_BOTTOMRIGHT_X (V4L2_CID_FIMC_IS_BASE + 615) +#define V4L2_CID_IS_FD_GET_RIGHT_EYE_BOTTOMRIGHT_Y (V4L2_CID_FIMC_IS_BASE + 616) +#define V4L2_CID_IS_FD_GET_MOUTH_TOPLEFT_X (V4L2_CID_FIMC_IS_BASE + 617) +#define V4L2_CID_IS_FD_GET_MOUTH_TOPLEFT_Y (V4L2_CID_FIMC_IS_BASE + 618) +#define V4L2_CID_IS_FD_GET_MOUTH_BOTTOMRIGHT_X (V4L2_CID_FIMC_IS_BASE + 619) +#define V4L2_CID_IS_FD_GET_MOUTH_BOTTOMRIGHT_Y (V4L2_CID_FIMC_IS_BASE + 620) +#define V4L2_CID_IS_FD_GET_ANGLE (V4L2_CID_FIMC_IS_BASE + 621) +#define V4L2_CID_IS_FD_GET_YAW_ANGLE (V4L2_CID_FIMC_IS_BASE + 622) +#define V4L2_CID_IS_FD_GET_NEXT (V4L2_CID_FIMC_IS_BASE + 623) +#define V4L2_CID_IS_FD_GET_DATA (V4L2_CID_FIMC_IS_BASE + 624) + +#define V4L2_CID_IS_FD_SET_MAX_FACE_NUMBER (V4L2_CID_FIMC_IS_BASE + 650) +#define V4L2_CID_IS_FD_SET_ROLL_ANGLE (V4L2_CID_FIMC_IS_BASE + 651) +enum is_fd_roll_angle { + /* 0, 45, 0, -45 */ + IS_FD_ROLL_ANGLE_BASIC = 0, + /* 0, 30, 0, -30, 0, 45, 0, -45 */ + IS_FD_ROLL_ANGLE_PRECISE_BASIC = 1, + /* 0, 90, 0, -90 */ + IS_FD_ROLL_ANGLE_SIDES = 2, + /* 0, 90, 0, -90 0, 45, 0, -45 */ + IS_FD_ROLL_ANGLE_PRECISE_SIDES = 3, + /* 0, 90, 0, -90, 0, 180 */ + IS_FD_ROLL_ANGLE_FULL = 4, + /* 0, 90, 0, -90, 0, 180, 0, 135, 0, -135 */ + IS_FD_ROLL_ANGLE_PRECISE_FULL = 5, +}; + +#define V4L2_CID_IS_FD_SET_YAW_ANGLE (V4L2_CID_FIMC_IS_BASE + 652) +enum is_fd_yaw_angle { + IS_FD_YAW_ANGLE_0 = 0, + IS_FD_YAW_ANGLE_45 = 1, + IS_FD_YAW_ANGLE_90 = 2, + IS_FD_YAW_ANGLE_45_90 = 3, +}; + +#define V4L2_CID_IS_FD_SET_SMILE_MODE (V4L2_CID_FIMC_IS_BASE + 653) +enum is_fd_smile_mode { + IS_FD_SMILE_MODE_DISABLE = 0, + IS_FD_SMILE_MODE_ENABLE = 1, +}; + +#define V4L2_CID_IS_FD_SET_BLINK_MODE (V4L2_CID_FIMC_IS_BASE + 654) +enum is_fd_blink_mode { + IS_FD_BLINK_MODE_DISABLE = 0, + IS_FD_BLINK_MODE_ENABLE = 1, +}; + +#define V4L2_CID_IS_FD_SET_EYE_DETECT_MODE (V4L2_CID_FIMC_IS_BASE + 655) +enum is_fd_eye_detect_mode { + IS_FD_EYE_DETECT_DISABLE = 0, + IS_FD_EYE_DETECT_ENABLE = 1, +}; + +#define V4L2_CID_IS_FD_SET_MOUTH_DETECT_MODE (V4L2_CID_FIMC_IS_BASE + 656) +enum is_fd_mouth_detect_mode { + IS_FD_MOUTH_DETECT_DISABLE = 0, + IS_FD_MOUTH_DETECT_ENABLE = 1, +}; + +#define V4L2_CID_IS_FD_SET_ORIENTATION_MODE (V4L2_CID_FIMC_IS_BASE + 657) +enum is_fd_orientation_mode { + IS_FD_ORIENTATION_DISABLE = 0, + IS_FD_ORIENTATION_ENABLE = 1, +}; + +#define V4L2_CID_IS_FD_SET_ORIENTATION (V4L2_CID_FIMC_IS_BASE + 658) +#define V4L2_CID_IS_FD_SET_DATA_ADDRESS (V4L2_CID_FIMC_IS_BASE + 659) + +#define V4L2_CID_IS_SET_ISP (V4L2_CID_FIMC_IS_BASE + 440) +enum is_isp_bypass_mode { + IS_ISP_BYPASS_DISABLE, + IS_ISP_BYPASS_ENABLE, + IS_ISP_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_DRC (V4L2_CID_FIMC_IS_BASE + 441) +enum is_drc_bypass_mode { + IS_DRC_BYPASS_DISABLE, + IS_DRC_BYPASS_ENABLE, + IS_DRC_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_FD (V4L2_CID_FIMC_IS_BASE + 442) +enum is_fd_bypass_mode { + IS_FD_BYPASS_DISABLE, + IS_FD_BYPASS_ENABLE, + IS_FD_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_ODC (V4L2_CID_FIMC_IS_BASE + 443) +enum is_odc_bypass_mode { + IS_ODC_BYPASS_DISABLE, + IS_ODC_BYPASS_ENABLE, + IS_ODC_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_DIS (V4L2_CID_FIMC_IS_BASE + 444) +enum is_dis_bypass_mode { + IS_DIS_BYPASS_DISABLE, + IS_DIS_BYPASS_ENABLE, + IS_DIS_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_3DNR (V4L2_CID_FIMC_IS_BASE + 445) +enum is_tdnr_bypass_mode { + IS_TDNR_BYPASS_DISABLE, + IS_TDNR_BYPASS_ENABLE, + IS_TDNR_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_SCALERC (V4L2_CID_FIMC_IS_BASE + 446) +enum is_scalerc_bypass_mode { + IS_SCALERC_BYPASS_DISABLE, + IS_SCALERC_BYPASS_ENABLE, + IS_SCALERC_BYPASS_MAX +}; + +#define V4L2_CID_IS_SET_SCALERP (V4L2_CID_FIMC_IS_BASE + 446) +enum is_scalerp_bypass_mode { + IS_SCALERP_BYPASS_DISABLE, + IS_SCALERP_BYPASS_ENABLE, + IS_SCALERP_BYPASS_MAX +}; + +#define V4L2_CID_IS_ROTATION_MODE (V4L2_CID_FIMC_IS_BASE + 450) +enum is_rotation_mode { + IS_ROTATION_0, + IS_ROTATION_90, + IS_ROTATION_180, + IS_ROTATION_270, + IS_ROTATION_MAX +}; + +#define V4L2_CID_IS_3DNR_1ST_FRAME_MODE (V4L2_CID_FIMC_IS_BASE + 451) +enum is_tdnr_1st_frame_mode { + IS_TDNR_1ST_FRAME_NOPROCESSING, + IS_TDNR_1ST_FRAME_2DNR, + IS_TDNR_MAX +}; + +#define V4L2_CID_IS_CAMERA_OBJECT_POSITION_X (V4L2_CID_FIMC_IS_BASE + 452) +#define V4L2_CID_IS_CAMERA_OBJECT_POSITION_Y (V4L2_CID_FIMC_IS_BASE + 453) +#define V4L2_CID_IS_CAMERA_WINDOW_SIZE_X (V4L2_CID_FIMC_IS_BASE + 454) +#define V4L2_CID_IS_CAMERA_WINDOW_SIZE_Y (V4L2_CID_FIMC_IS_BASE + 455) + +#define V4L2_CID_IS_CAMERA_EXIF_EXPTIME (V4L2_CID_FIMC_IS_BASE + 456) +#define V4L2_CID_IS_CAMERA_EXIF_FLASH (V4L2_CID_FIMC_IS_BASE + 457) +#define V4L2_CID_IS_CAMERA_EXIF_ISO (V4L2_CID_FIMC_IS_BASE + 458) +#define V4L2_CID_IS_CAMERA_EXIF_SHUTTERSPEED (V4L2_CID_FIMC_IS_BASE + 459) +#define V4L2_CID_IS_CAMERA_EXIF_BRIGHTNESS (V4L2_CID_FIMC_IS_BASE + 460) + +#define V4L2_CID_IS_CAMERA_ISP_SEL_INPUT (V4L2_CID_FIMC_IS_BASE + 461) +enum is_isp_sel_input { + IS_ISP_INPUT_OTF, + IS_ISP_INPUT_DMA1, + IS_ISP_INPUT_DMA2, + IS_ISP_INPUT_DMA12, + IS_ISP_INPUT_MAX +}; + +#define V4L2_CID_IS_CAMERA_ISP_SEL_OUTPUT (V4L2_CID_FIMC_IS_BASE + 462) +enum is_isp_sel_output { + IS_ISP_OUTPUT_OTF, + IS_ISP_OUTPUT_DMA1, + IS_ISP_OUTPUT_DMA2, + IS_ISP_OUTPUT_DMA12, + IS_ISP_OUTPUT_OTF_DMA1, + IS_ISP_OUTPUT_OTF_DMA2, + IS_ISP_OUTPUT_OTF_DMA12, + IS_ISP_OUTPUT_MAX +}; + +#define V4L2_CID_IS_CAMERA_DRC_SEL_INPUT (V4L2_CID_FIMC_IS_BASE + 463) +enum is_drc_sel_input { + IS_DRC_INPUT_OTF, + IS_DRC_INPUT_DMA, + IS_DRC_INPUT_MAX +}; + +#define V4L2_CID_IS_CAMERA_FD_SEL_INPUT (V4L2_CID_FIMC_IS_BASE + 464) +enum is_fd_sel_input { + IS_FD_INPUT_OTF, + IS_FD_INPUT_DMA, + IS_FD_INPUT_MAX +}; + +#define V4L2_CID_IS_CAMERA_INIT_WIDTH (V4L2_CID_FIMC_IS_BASE + 465) +#define V4L2_CID_IS_CAMERA_INIT_HEIGHT (V4L2_CID_FIMC_IS_BASE + 466) + +#define V4L2_CID_IS_CMD_ISP (V4L2_CID_FIMC_IS_BASE + 467) +enum is_isp_cmd_mode { + IS_ISP_COMMAND_STOP, + IS_ISP_COMMAND_START, + IS_ISP_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_DRC (V4L2_CID_FIMC_IS_BASE + 468) +enum is_drc_cmd_mode { + IS_DRC_COMMAND_STOP, + IS_DRC_COMMAND_START, + IS_DRC_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_FD (V4L2_CID_FIMC_IS_BASE + 469) +enum is_fd_cmd_mode { + IS_FD_COMMAND_STOP, + IS_FD_COMMAND_START, + IS_FD_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_ODC (V4L2_CID_FIMC_IS_BASE + 470) +enum is_odc_cmd_mode { + IS_ODC_COMMAND_STOP, + IS_ODC_COMMAND_START, + IS_ODC_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_DIS (V4L2_CID_FIMC_IS_BASE + 471) +enum is_dis_cmd_mode { + IS_DIS_COMMAND_STOP, + IS_DIS_COMMAND_START, + IS_DIS_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_TDNR (V4L2_CID_FIMC_IS_BASE + 472) +enum is_tdnr_cmd_mode { + IS_TDNR_COMMAND_STOP, + IS_TDNR_COMMAND_START, + IS_TDNR_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_SCALERC (V4L2_CID_FIMC_IS_BASE + 473) +enum is_scalerc_cmd_mode { + IS_SCALERC_COMMAND_STOP, + IS_SCALERC_COMMAND_START, + IS_SCALERC_COMMAND_MAX +}; + +#define V4L2_CID_IS_CMD_SCALERP (V4L2_CID_FIMC_IS_BASE + 474) +enum is_scalerp_cmd_mode { + IS_SCALERP_COMMAND_STOP, + IS_SCALERP_COMMAND_START, + IS_SCALERP_COMMAND_MAX +}; + +#define V4L2_CID_IS_GET_SENSOR_OFFSET_X (V4L2_CID_FIMC_IS_BASE + 480) +#define V4L2_CID_IS_GET_SENSOR_OFFSET_Y (V4L2_CID_FIMC_IS_BASE + 481) +#define V4L2_CID_IS_GET_SENSOR_WIDTH (V4L2_CID_FIMC_IS_BASE + 482) +#define V4L2_CID_IS_GET_SENSOR_HEIGHT (V4L2_CID_FIMC_IS_BASE + 483) + +#define V4L2_CID_IS_GET_FRAME_VALID (V4L2_CID_FIMC_IS_BASE + 484) +#define V4L2_CID_IS_SET_FRAME_VALID (V4L2_CID_FIMC_IS_BASE + 485) +#define V4L2_CID_IS_GET_FRAME_BADMARK (V4L2_CID_FIMC_IS_BASE + 486) +#define V4L2_CID_IS_SET_FRAME_BADMARK (V4L2_CID_FIMC_IS_BASE + 487) +#define V4L2_CID_IS_GET_FRAME_CAPTURED (V4L2_CID_FIMC_IS_BASE + 488) +#define V4L2_CID_IS_SET_FRAME_CAPTURED (V4L2_CID_FIMC_IS_BASE + 489) +#define V4L2_CID_IS_SET_FRAME_NUMBER (V4L2_CID_FIMC_IS_BASE + 490) +#define V4L2_CID_IS_GET_FRAME_NUMBER (V4L2_CID_FIMC_IS_BASE + 491) +#define V4L2_CID_IS_CLEAR_FRAME_NUMBER (V4L2_CID_FIMC_IS_BASE + 492) +#define V4L2_CID_IS_GET_LOSTED_FRAME_NUMBER (V4L2_CID_FIMC_IS_BASE + 493) +#define V4L2_CID_IS_ISP_DMA_BUFFER_NUM (V4L2_CID_FIMC_IS_BASE + 494) +#define V4L2_CID_IS_ISP_DMA_BUFFER_ADDRESS (V4L2_CID_FIMC_IS_BASE + 495) + +#define V4L2_CID_IS_ZOOM_STATE (V4L2_CID_FIMC_IS_BASE + 660) +#define V4L2_CID_IS_ZOOM_MAX_LEVEL (V4L2_CID_FIMC_IS_BASE + 661) +#define V4L2_CID_IS_ZOOM (V4L2_CID_FIMC_IS_BASE + 662) +#define V4L2_CID_IS_FW_DEBUG_REGION_ADDR (V4L2_CID_FIMC_IS_BASE + 663) + +#define V4L2_CID_IS_TUNE_SEL_ENTRY (V4L2_CID_FIMC_IS_TUNE_BASE) +#define V4L2_CID_IS_TUNE_SENSOR_EXPOSURE (V4L2_CID_FIMC_IS_TUNE_BASE + 1) +#define V4L2_CID_IS_TUNE_SENSOR_ANALOG_GAIN (V4L2_CID_FIMC_IS_TUNE_BASE + 2) +#define V4L2_CID_IS_TUNE_SENSOR_FRAME_RATE (V4L2_CID_FIMC_IS_TUNE_BASE + 3) +#define V4L2_CID_IS_TUNE_SENSOR_ACTUATOR_POS (V4L2_CID_FIMC_IS_TUNE_BASE + 4) + +enum v4l2_blur { + BLUR_LEVEL_0 = 0, + BLUR_LEVEL_1, + BLUR_LEVEL_2, + BLUR_LEVEL_3, + BLUR_LEVEL_MAX, +}; + +#if 1 +#define V4L2_CID_CAMERA_SCENE_MODE (V4L2_CID_PRIVATE_BASE + 70) +typedef enum { + SCENE_MODE_BASE, + SCENE_MODE_NONE, + SCENE_MODE_PORTRAIT, + SCENE_MODE_NIGHTSHOT, + SCENE_MODE_BACK_LIGHT, + SCENE_MODE_LANDSCAPE, + SCENE_MODE_SPORTS, + SCENE_MODE_PARTY_INDOOR, + SCENE_MODE_BEACH_SNOW, + SCENE_MODE_SUNSET, + SCENE_MODE_DUSK_DAWN, + SCENE_MODE_FALL_COLOR, + SCENE_MODE_FIREWORKS, + SCENE_MODE_TEXT, + SCENE_MODE_CANDLE_LIGHT, + SCENE_MODE_LOW_LIGHT, + SCENE_MODE_MAX, +} cam_scene_mode; + +#define V4L2_CID_CAMERA_FLASH_MODE (V4L2_CID_PRIVATE_BASE+71) +enum v4l2_flash_mode { + FLASH_MODE_BASE, + FLASH_MODE_OFF, + FLASH_MODE_AUTO, + FLASH_MODE_ON, + FLASH_MODE_TORCH, + FLASH_MODE_MAX, +}; + +#define V4L2_CID_CAMERA_BRIGHTNESS (V4L2_CID_PRIVATE_BASE+72) +enum v4l2_ev_mode { + EV_MINUS_4 = -4, + EV_MINUS_3 = -3, + EV_MINUS_2 = -2, + EV_MINUS_1 = -1, + EV_DEFAULT = 0, + EV_PLUS_1 = 1, + EV_PLUS_2 = 2, + EV_PLUS_3 = 3, + EV_PLUS_4 = 4, + EV_MAX, +}; + +#define V4L2_CID_CAMERA_WHITE_BALANCE (V4L2_CID_PRIVATE_BASE+73) +enum v4l2_wb_mode { + WHITE_BALANCE_BASE = 0, + WHITE_BALANCE_AUTO, + WHITE_BALANCE_SUNNY, + WHITE_BALANCE_CLOUDY, + WHITE_BALANCE_TUNGSTEN, + WHITE_BALANCE_FLUORESCENT, + WHITE_BALANCE_MAX, +}; + +enum v4l2_exposure { + EXPOSURE_MINUS_6 = -6, + EXPOSURE_MINUS_5 = -5, + EXPOSURE_MINUS_4 = -4, + EXPOSURE_MINUS_3 = -3, + EXPOSURE_MINUS_2 = -2, + EXPOSURE_MINUS_1 = -1, + EXPOSURE_DEFAULT = 0, + EXPOSURE_PLUS_1 = 1, + EXPOSURE_PLUS_2 = 2, + EXPOSURE_PLUS_3 = 3, + EXPOSURE_PLUS_4 = 4, + EXPOSURE_PLUS_5 = 5, + EXPOSURE_PLUS_6 = 6, + EXPOSURE_MAX, +}; + +#define V4L2_CID_CAMERA_EFFECT (V4L2_CID_PRIVATE_BASE + 74) +enum v4l2_effect_mode { + IMAGE_EFFECT_BASE = 0, + IMAGE_EFFECT_NONE, + IMAGE_EFFECT_BNW, + IMAGE_EFFECT_SEPIA, + IMAGE_EFFECT_AQUA, + IMAGE_EFFECT_ANTIQUE, + IMAGE_EFFECT_NEGATIVE, + IMAGE_EFFECT_SHARPEN, + IMAGE_EFFECT_SKETCH, + IMAGE_EFFECT_WASHED, + IMAGE_EFFECT_VINTAGE_WARM, + IMAGE_EFFECT_VINTAGE_COLD, + IMAGE_EFFECT_SOLARIZE, + IMAGE_EFFECT_POSTERIZE, + IMAGE_EFFECT_POINT_BLUE, + IMAGE_EFFECT_POINT_RED_YELLOW, + IMAGE_EFFECT_POINT_COLOR_3, + IMAGE_EFFECT_POINT_GREEN, + IMAGE_EFFECT_POINT_RED, + IMAGE_EFFECT_POINT_YELLOW, + IMAGE_EFFECT_CARTOONIZE, + IMAGE_EFFECT_MAX, +}; + +#define V4L2_CID_CAMERA_ISO (V4L2_CID_PRIVATE_BASE + 75) +enum v4l2_iso_mode { + ISO_AUTO = 0, + ISO_50, + ISO_100, + ISO_200, + ISO_400, + ISO_800, + ISO_1600, + ISO_SPORTS, + ISO_NIGHT, + ISO_MOVIE, + ISO_MAX, +}; + +#define V4L2_CID_CAMERA_METERING (V4L2_CID_PRIVATE_BASE + 76) +enum v4l2_metering_mode { + METERING_BASE = 0, + METERING_MATRIX, + METERING_CENTER, + METERING_SPOT, + METERING_MAX, +}; + +#define V4L2_CID_CAMERA_CONTRAST (V4L2_CID_PRIVATE_BASE + 77) +enum v4l2_contrast_mode { + CONTRAST_MINUS_2 = 0, + CONTRAST_MINUS_1, + CONTRAST_DEFAULT, + CONTRAST_PLUS_1, + CONTRAST_PLUS_2, + CONTRAST_MAX, +}; + +#define V4L2_CID_CAMERA_SATURATION (V4L2_CID_PRIVATE_BASE + 78) +enum v4l2_saturation_mode { + SATURATION_MINUS_2 = 0, + SATURATION_MINUS_1, + SATURATION_DEFAULT, + SATURATION_PLUS_1, + SATURATION_PLUS_2, + SATURATION_MAX, +}; + +#define V4L2_CID_CAMERA_SHARPNESS (V4L2_CID_PRIVATE_BASE + 79) +enum v4l2_sharpness_mode { + SHARPNESS_MINUS_2 = 0, + SHARPNESS_MINUS_1, + SHARPNESS_DEFAULT, + SHARPNESS_PLUS_1, + SHARPNESS_PLUS_2, + SHARPNESS_MAX, +}; + +#define V4L2_CID_CAMERA_WDR (V4L2_CID_PRIVATE_BASE + 80) +enum v4l2_wdr_mode { + WDR_OFF, + WDR_ON, + WDR_MAX, +}; + +#define V4L2_CID_CAMERA_ANTI_SHAKE (V4L2_CID_PRIVATE_BASE + 81) +enum v4l2_anti_shake_mode { + ANTI_SHAKE_OFF, + ANTI_SHAKE_STILL_ON, + ANTI_SHAKE_MOVIE_ON, + ANTI_SHAKE_MAX, +}; + +#define V4L2_CID_CAMERA_TOUCH_AF_START_STOP (V4L2_CID_PRIVATE_BASE + 82) +enum v4l2_touch_af { + TOUCH_AF_STOP = 0, + TOUCH_AF_START, + TOUCH_AF_MAX, +}; + +#define V4L2_CID_CAMERA_SMART_AUTO (V4L2_CID_PRIVATE_BASE + 83) +enum v4l2_smart_auto { + SMART_AUTO_OFF = 0, + SMART_AUTO_ON, + SMART_AUTO_MAX, +}; + +#define V4L2_CID_CAMERA_VINTAGE_MODE (V4L2_CID_PRIVATE_BASE + 84) +enum v4l2_vintage_mode { + VINTAGE_MODE_BASE, + VINTAGE_MODE_OFF, + VINTAGE_MODE_NORMAL, + VINTAGE_MODE_WARM, + VINTAGE_MODE_COOL, + VINTAGE_MODE_BNW, + VINTAGE_MODE_MAX, +}; + +#define V4L2_CID_CAMERA_JPEG_QUALITY (V4L2_CID_PRIVATE_BASE + 85) +#define V4L2_CID_CAMERA_CAPTURE_THUMB (V4L2_CID_PRIVATE_BASE + 86) +#define V4L2_CID_CAMERA_YUV_SNAPSHOT (V4L2_CID_PRIVATE_BASE + 87) +#define V4L2_CID_CAMERA_LOW_LIGHT_MODE (V4L2_CID_PRIVATE_BASE + 88) +#define V4L2_CID_CAMERA_GPS_LATITUDE (V4L2_CID_CAMERA_CLASS_BASE + 30) +/* (V4L2_CID_PRIVATE_BASE + 87) */ +#define V4L2_CID_CAMERA_GPS_LONGITUDE (V4L2_CID_CAMERA_CLASS_BASE + 31) +/* (V4L2_CID_PRIVATE_BASE + 88) */ +#define V4L2_CID_CAMERA_GPS_TIMESTAMP (V4L2_CID_CAMERA_CLASS_BASE + 32) +/* (V4L2_CID_PRIVATE_BASE + 89)*/ +#define V4L2_CID_CAMERA_GPS_ALTITUDE (V4L2_CID_CAMERA_CLASS_BASE + 33) +#define V4L2_CID_CAMERA_EXIF_TIME_INFO (V4L2_CID_CAMERA_CLASS_BASE + 34) +#define V4L2_CID_CAMERA_GPS_PROCESSINGMETHOD (V4L2_CID_CAMERA_CLASS_BASE + 35) + +#define V4L2_CID_FOCUS_AUTO_MODE (V4L2_CID_CAMERA_CLASS_BASE + 36) +enum v4l2_focus_mode_type { + V4L2_FOCUS_AUTO_NORMAL = 0, + V4L2_FOCUS_AUTO_MACRO, + V4L2_FOCUS_AUTO_CONTINUOUS, + V4L2_FOCUS_AUTO_FACE_DETECTION, + V4L2_FOCUS_AUTO_RECTANGLE, + V4L2_FOCUS_AUTO_MAX, +}; +#define V4L2_CID_FOCUS_AUTO_RECTANGLE_LEFT (V4L2_CID_CAMERA_CLASS_BASE + 37) +#define V4L2_CID_FOCUS_AUTO_RECTANGLE_TOP (V4L2_CID_CAMERA_CLASS_BASE + 38) +#define V4L2_CID_FOCUS_AUTO_RECTANGLE_WIDTH (V4L2_CID_CAMERA_CLASS_BASE + 39) +#define V4L2_CID_FOCUS_AUTO_RECTANGLE_HEIGHT (V4L2_CID_CAMERA_CLASS_BASE + 40) +#define V4L2_CID_IMAGE_EFFECT (V4L2_CID_CAMERA_CLASS_BASE + 41) +enum v4l2_image_effect { + V4L2_IMAGE_EFFECT_BASE = 0, + V4L2_IMAGE_EFFECT_NONE, + V4L2_IMAGE_EFFECT_BNW, + V4L2_IMAGE_EFFECT_SEPIA, + V4L2_IMAGE_EFFECT_AQUA, + V4L2_IMAGE_EFFECT_ANTIQUE, + V4L2_IMAGE_EFFECT_NEGATIVE, + V4L2_IMAGE_EFFECT_SHARPEN, + V4L2_IMAGE_EFFECT_SOLARIZE, + V4L2_IMAGE_EFFECT_MAX, +}; + +#define V4L2_CID_CAM_CONTRAST (V4L2_CID_CAMERA_CLASS_BASE + 42) +enum v4l2_contrast { + V4L2_CONTRAST_AUTO, + V4L2_CONTRAST_MINUS_4, + V4L2_CONTRAST_MINUS_3, + V4L2_CONTRAST_MINUS_2, + V4L2_CONTRAST_MINUS_1, + V4L2_CONTRAST_DEFAULT, + V4L2_CONTRAST_PLUS_1, + V4L2_CONTRAST_PLUS_2, + V4L2_CONTRAST_PLUS_3, + V4L2_CONTRAST_PLUS_4, + V4L2_CONTRAST_MAX +}; + +#define V4L2_CID_CAM_SATURATION (V4L2_CID_CAMERA_CLASS_BASE + 43) +enum v4l2_saturation { + V4L2_SATURATION_MINUS_3, + V4L2_SATURATION_MINUS_2, + V4L2_SATURATION_MINUS_1, + V4L2_SATURATION_DEFAULT, + V4L2_SATURATION_PLUS_1, + V4L2_SATURATION_PLUS_2, + V4L2_SATURATION_PLUS_3, + V4L2_SATURATION_MAX +}; + +#define V4L2_CID_CAM_SHARPNESS (V4L2_CID_CAMERA_CLASS_BASE + 44) +enum v4l2_sharpness { + V4L2_SHARPNESS_MINUS_2, + V4L2_SHARPNESS_MINUS_1, + V4L2_SHARPNESS_DEFAULT, + V4L2_SHARPNESS_PLUS_1, + V4L2_SHARPNESS_PLUS_2, + V4L2_SHARPNESS_MAX, +}; + +#define V4L2_CID_CAM_BRIGHTNESS (V4L2_CID_CAMERA_CLASS_BASE + 45) +enum v4l2_brightness { + V4L2_BRIGHTNESS_MINUS_9 = -9, + V4L2_BRIGHTNESS_MINUS_8 = -8, + V4L2_BRIGHTNESS_MINUS_7 = -7, + V4L2_BRIGHTNESS_MINUS_6 = -6, + V4L2_BRIGHTNESS_MINUS_5 = -5, + V4L2_BRIGHTNESS_MINUS_4 = -4, + V4L2_BRIGHTNESS_MINUS_3 = -3, + V4L2_BRIGHTNESS_MINUS_2 = -2, + V4L2_BRIGHTNESS_MINUS_1 = -1, + V4L2_BRIGHTNESS_DEFAULT = 0, + V4L2_BRIGHTNESS_PLUS_1 = 1, + V4L2_BRIGHTNESS_PLUS_2 = 2, + V4L2_BRIGHTNESS_PLUS_3 = 3, + V4L2_BRIGHTNESS_PLUS_4 = 4, + V4L2_BRIGHTNESS_PLUS_5 = 5, + V4L2_BRIGHTNESS_PLUS_6 = 6, + V4L2_BRIGHTNESS_PLUS_7 = 7, + V4L2_BRIGHTNESS_PLUS_8 = 8, + V4L2_BRIGHTNESS_PLUS_9 = 9, + V4L2_BRIGHTNESS_MAX, +}; + +#define V4L2_CID_CAPTURE (V4L2_CID_CAMERA_CLASS_BASE + 46) +#define V4L2_CID_CAM_METERING (V4L2_CID_CAMERA_CLASS_BASE + 47) +enum v4l2_cam_metering_mode { + V4L2_METERING_BASE = 0, + V4L2_METERING_MATRIX, + V4L2_METERING_CENTER, + V4L2_METERING_SPOT, + V4L2_METERING_MAX, +}; + +#define V4L2_CID_CAM_SET_AUTO_FOCUS (V4L2_CID_CAMERA_CLASS_BASE + 48) +enum v4l2_cam_auto_focus { + V4L2_AUTO_FOCUS_OFF = 0, + V4L2_AUTO_FOCUS_ON, + V4L2_AUTO_FOCUS_MAX, +}; + +#define V4L2_CID_CAM_FRAME_RATE (V4L2_CID_CAMERA_CLASS_BASE + 49) +typedef enum v4l2_cam_frame_rate { + FRAME_RATE_AUTO = 0, + FRAME_RATE_7 = 7, + FRAME_RATE_15 = 15, + FRAME_RATE_20 = 20, + FRAME_RATE_25 = 25, + FRAME_RATE_30 = 30, + FRAME_RATE_60 = 60, + FRAME_RATE_120 = 120, + FRAME_RATE_MAX, +}cam_frame_rate; + +#define V4L2_CID_CAM_OBJECT_POSITION_X (V4L2_CID_CAMERA_CLASS_BASE + 50) +#define V4L2_CID_CAM_OBJECT_POSITION_Y (V4L2_CID_CAMERA_CLASS_BASE + 51) +#define V4L2_CID_CAM_FACE_DETECTION (V4L2_CID_CAMERA_CLASS_BASE + 52) +enum v4l2_cam_face_detection { + V4L2_FACE_DETECTION_OFF = 0, + V4L2_FACE_DETECTION_ON, + V4L2_FACE_DETECTION_NOLINE, + V4L2_FACE_DETECTION_ON_BEAUTY, + V4L2_FACE_DETECTION_NORMAL, + V4L2_FACE_DETECTION_SMILE_SHOT, + V4L2_FACE_DETECTION_BLINK, + V4L2_FACE_DETECTION_MAX, +}; + +#define V4L2_CID_CAM_WDR (V4L2_CID_CAMERA_CLASS_BASE + 53) +enum v4l2_cam_wdr_mode { + V4L2_WDR_OFF = 0, + V4L2_WDR_ON, + V4L2_WDR_MAX, +}; +#define V4L2_CID_CAMERA_SENSOR_MODE (V4L2_CID_CAMERA_CLASS_BASE+54) +typedef enum v4l2_cam_sensor_mode { + V4L2_SENSOR_CAMERA, + V4L2_SENSOR_MOVIE, + V4L2_SENSOR_MAX, +}cam_sensor_mode; + +#define V4L2_CID_JPEG_QUALITY (V4L2_CID_CAMERA_CLASS_BASE + 55) +#define V4L2_CID_CAM_GET_ISO (V4L2_CID_CAMERA_CLASS_BASE + 56) +#define V4L2_CID_CAM_GET_SHT_TIME (V4L2_CID_CAMERA_CLASS_BASE + 57) +#define V4L2_CID_CAM_AEAWB_LOCK_UNLOCK (V4L2_CID_CAMERA_CLASS_BASE + 58) +enum v4l2_cam_ae_awb_lockunlock { + V4L2_AE_UNLOCK_AWB_UNLOCK = 0, + V4L2_AE_LOCK_AWB_UNLOCK, + V4L2_AE_UNLOCK_AWB_LOCK, + V4L2_AE_LOCK_AWB_LOCK, + V4L2_AE_AWB_MAX +}; +#define V4L2_CID_CAM_ZOOM (V4L2_CID_CAMERA_CLASS_BASE + 59) +enum v4l2_cam_zoom_level { + V4L2_ZOOM_LEVEL_0 = 0, + V4L2_ZOOM_LEVEL_1, + V4L2_ZOOM_LEVEL_2, + V4L2_ZOOM_LEVEL_3, + V4L2_ZOOM_LEVEL_4, + V4L2_ZOOM_LEVEL_5, + V4L2_ZOOM_LEVEL_6, + V4L2_ZOOM_LEVEL_7, + V4L2_ZOOM_LEVEL_8, + V4L2_ZOOM_LEVEL_9, + V4L2_ZOOM_LEVEL_10, + V4L2_ZOOM_LEVEL_11, + V4L2_ZOOM_LEVEL_12, + V4L2_ZOOM_LEVEL_MAX = 31, +}; + +#define V4L2_CID_CAM_GET_FRAME_COUNT (V4L2_CID_CAMERA_CLASS_BASE + 60) +#define V4L2_CID_CAM_CAF_START_STOP (V4L2_CID_CAMERA_CLASS_BASE + 61) +enum v4l2_cam_caf_start_stop { + V4L2_CAF_STOP = 0, + V4L2_CAF_START, + V4L2_CAF_MAX, +}; +#define V4L2_CID_CAM_FLASH_MODE (V4L2_CID_CAMERA_CLASS_BASE + 62) +typedef enum v4l2_cam_flash_mode { + V4L2_FLASH_MODE_BASE, + V4L2_FLASH_MODE_OFF, + V4L2_FLASH_MODE_AUTO, + V4L2_FLASH_MODE_ON, + V4L2_FLASH_MODE_TORCH, + V4L2_FLASH_MODE_RED_EYE, + V4L2_FLASH_MODE_FILL_IN, + V4L2_FLASH_MODE_SLOW_SYNC, + V4L2_FLASH_MODE_RED_EYE_FIX, + V4L2_FLASH_MODE_FILL_IN_RED_EYE, + V4L2_FLASH_MODE_SMART, + V4L2_FLASH_MODE_1st_CURTAIN, + V4L2_FLASH_MODE_2nd_CURTAIN, + V4L2_FLASH_MODE_MAX, +}cam_flash_mode; + +#define V4L2_CID_CAM_SINGLE_AUTO_FOCUS (V4L2_CID_CAMERA_CLASS_BASE + 63) + +#define V4L2_CID_CAMERA_FACTORY_EEP_WRITE_VERSION (V4L2_CID_CAMERA_CLASS_BASE + 64) +#define V4L2_CID_CAMERA_FACTORY_EEP_WRITE_SN (V4L2_CID_CAMERA_CLASS_BASE + 65) + +#define V4L2_CID_CAMERA_FAST_CAPTURE (V4L2_CID_CAMERA_CLASS_BASE + 66) + +#define V4L2_CID_CAMERA_TRANSFER (V4L2_CID_CAMERA_CLASS_BASE + 67) + +#define V4L2_CID_CAMERA_S1_PUSH (V4L2_CID_CAMERA_CLASS_BASE + 68) + +#define V4L2_CID_CAMERA_AUTO_FOCUS_DONE (V4L2_CID_CAMERA_CLASS_BASE+69) +#define V4L2_CID_CAM_AUTO_FOCUS_RESULT (V4L2_CID_CAMERA_CLASS_BASE + 70) +enum v4l2_cam_af_status { + V4L2_CAMERA_AF_STATUS_IN_PROGRESS = 0, + V4L2_CAMERA_AF_STATUS_SUCCESS, + V4L2_CAMERA_AF_STATUS_FAIL, + V4L2_CAMERA_AF_STATUS_1ST_SUCCESS, + V4L2_CAMERA_AF_STATUS_MAX, +}; + +#define V4L2_CID_CAM_UPDATE_FW (V4L2_CID_CAMERA_CLASS_BASE + 71) +typedef enum { + CAM_FW_MODE_NONE, + CAM_FW_MODE_VERSION, + CAM_FW_MODE_UPDATE, + CAM_FW_MODE_DUMP, +} cam_fw_mode; + +#define V4L2_CID_BURSTSHOT_PROC (V4L2_CID_CAMERA_CLASS_BASE + 72) +enum v4l2_burst_proc_state { + V4L2_INT_STATE_BURST_START = 0, + V4L2_INT_STATE_BURST_SYNC, + V4L2_INT_STATE_BURST_STOP, + V4L2_INT_STATE_BURST_SOUND, + V4L2_INT_STATE_BURST_STOP_REQ, +}; + +#define V4L2_CID_CAMERA_FOCUS_AREA_MODE (V4L2_CID_CAMERA_CLASS_BASE + 73) +typedef enum set_fouce_area { + V4L2_FOCUS_AREA_CENTER = 0, + V4L2_FOCUS_AREA_MULTI = 1, + V4L2_FOCUS_AREA_SMART_TOUCH = 2, + V4L2_FOCUS_AREA_FACE_DETECTION = 3, + V4L2_FOCUS_AREA_TRACKING = 4, + V4L2_FOCUS_AREA_ONE_TOUCH_SHOT = 5, +} cam_focus_area; + +#define V4L2_CID_CAMERA_SHUTTER_SPEED (V4L2_CID_CAMERA_CLASS_BASE + 74) +#define V4L2_CID_CAMERA_F_NUMBER (V4L2_CID_CAMERA_CLASS_BASE + 75) + +#define V4L2_CID_ISP_MAIN_FORMAT (V4L2_CID_CAMERA_CLASS_BASE + 76) +#define V4L2_CID_CONTINUESHOT_PROC (V4L2_CID_CAMERA_CLASS_BASE + 77) +enum v4l2_continuecshot_proc_state { + V4L2_INT_STATE_FRAME_SYNC = 0, + V4L2_INT_STATE_CAPTURE_SYNC, + V4L2_INT_STATE_CONTINUE_CANCEL, + V4L2_INT_STATE_CONTINUE_END, + V4L2_INT_STATE_START_CAPTURE, +}; + +#define V4L2_CID_EXIF_SHUTTER_SPEED_NUM (V4L2_CID_CAMERA_CLASS_BASE + 78) +#define V4L2_CID_EXIF_SHUTTER_SPEED_DEN (V4L2_CID_CAMERA_CLASS_BASE + 79) + +#define V4L2_CID_EXIF_EXPOSURE_TIME_NUM (V4L2_CID_CAMERA_CLASS_BASE + 80) +#define V4L2_CID_EXIF_EXPOSURE_TIME_DEN (V4L2_CID_CAMERA_CLASS_BASE + 81) + +#define V4L2_CID_EXIF_F_NUMBER (V4L2_CID_CAMERA_CLASS_BASE + 82) + +#define V4L2_CID_CAMERA_ZOOM (V4L2_CID_PRIVATE_BASE + 90) +enum v4l2_zoom_level { + ZOOM_LEVEL_0 = 0, + ZOOM_LEVEL_1, + ZOOM_LEVEL_2, + ZOOM_LEVEL_3, + ZOOM_LEVEL_4, + ZOOM_LEVEL_5, + ZOOM_LEVEL_6, + ZOOM_LEVEL_7, + ZOOM_LEVEL_8, + ZOOM_LEVEL_9, + ZOOM_LEVEL_10, + ZOOM_LEVEL_11, + ZOOM_LEVEL_12, + ZOOM_LEVEL_MAX, +}; + +#define V4L2_CID_CAMERA_SMART_AUTO_STATUS (V4L2_CID_PRIVATE_BASE + 92) +enum v4l2_smart_auto_status { + SMART_AUTO_STATUS_AUTO = 0, + SMART_AUTO_STATUS_LANDSCAPE, + SMART_AUTO_STATUS_PORTRAIT, + SMART_AUTO_STATUS_MACRO, + SMART_AUTO_STATUS_NIGHT, + SMART_AUTO_STATUS_PORTRAIT_NIGHT, + SMART_AUTO_STATUS_BACKLIT, + SMART_AUTO_STATUS_PORTRAIT_BACKLIT, + SMART_AUTO_STATUS_ANTISHAKE, + SMART_AUTO_STATUS_PORTRAIT_ANTISHAKE, + SMART_AUTO_STATUS_MAX, +}; + +#define V4L2_CID_CAMERA_SET_AUTO_FOCUS (V4L2_CID_PRIVATE_BASE + 93) +enum v4l2_auto_focus { + AUTO_FOCUS_OFF = 0, + AUTO_FOCUS_ON, + AUTO_FOCUS_MAX, +}; + +#define V4L2_CID_CAMERA_BEAUTY_SHOT (V4L2_CID_PRIVATE_BASE + 94) +enum v4l2_beauty_shot { + BEAUTY_SHOT_OFF = 0, + BEAUTY_SHOT_ON, + BEAUTY_SHOT_MAX, +}; + +#define V4L2_CID_CAMERA_AEAWB_LOCK_UNLOCK (V4L2_CID_PRIVATE_BASE + 95) +enum v4l2_ae_awb_lockunlock { + AE_UNLOCK_AWB_UNLOCK = 0, + AE_LOCK_AWB_UNLOCK, + AE_UNLOCK_AWB_LOCK, + AE_LOCK_AWB_LOCK, + AE_AWB_MAX +}; + +#define V4L2_CID_CAMERA_FACEDETECT_LOCKUNLOCK (V4L2_CID_PRIVATE_BASE + 96) +enum v4l2_face_lock { + FACE_LOCK_OFF = 0, + FACE_LOCK_ON, + FIRST_FACE_TRACKING, + FACE_LOCK_MAX, +}; + +#define V4L2_CID_CAMERA_OBJECT_POSITION_X (V4L2_CID_PRIVATE_BASE + 97) +#define V4L2_CID_CAMERA_OBJECT_POSITION_Y (V4L2_CID_PRIVATE_BASE + 98) +#define V4L2_CID_CAMERA_FOCUS_MODE (V4L2_CID_PRIVATE_BASE + 99) +typedef enum { + FOCUS_MODE_AUTO = 0, + FOCUS_MODE_MACRO, + FOCUS_MODE_FACEDETECT, + FOCUS_MODE_AUTO_DEFAULT, + FOCUS_MODE_MACRO_DEFAULT, + FOCUS_MODE_FACEDETECT_DEFAULT, + FOCUS_MODE_INFINITY, + FOCUS_MODE_FIXED, + FOCUS_MODE_CONTINOUS, + FOCUS_MODE_CONTINOUS_PICTURE, + FOCUS_MODE_CONTINOUS_PICTURE_MACRO, + FOCUS_MODE_CONTINOUS_VIDEO, + FOCUS_MODE_TOUCH, + FOCUS_MODE_MAX, + FOCUS_MODE_DEFAULT = (1 << 8), +} focus_mode; + +#define V4L2_CID_CAMERA_OBJ_TRACKING_STATUS (V4L2_CID_PRIVATE_BASE + 100) +enum v4l2_obj_tracking_status { + OBJECT_TRACKING_STATUS_BASE, + OBJECT_TRACKING_STATUS_PROGRESSING, + OBJECT_TRACKING_STATUS_SUCCESS, + OBJECT_TRACKING_STATUS_FAIL, + OBJECT_TRACKING_STATUS_MISSING, + OBJECT_TRACKING_STATUS_MAX, +}; + +#define V4L2_CID_CAMERA_OBJ_TRACKING_START_STOP (V4L2_CID_PRIVATE_BASE + 101) +enum v4l2_ot_start_stop { + OT_STOP = 0, + OT_START, + OT_MAX, +}; + +#define V4L2_CID_CAMERA_CAF_START_STOP (V4L2_CID_PRIVATE_BASE + 102) +enum v4l2_caf_start_stop { + CAF_STOP = 0, + CAF_START, + CAF_MAX, +}; + +#define V4L2_CID_CAMERA_ANTI_BANDING (V4L2_CID_PRIVATE_BASE + 105) +enum v4l2_anti_banding{ + ANTI_BANDING_AUTO = 0, + ANTI_BANDING_50HZ = 1, + ANTI_BANDING_60HZ = 2, + ANTI_BANDING_OFF = 3, +}; + +#define V4L2_CID_CAMERA_SET_GAMMA (V4L2_CID_PRIVATE_BASE + 106) +enum v4l2_gamma_mode{ + GAMMA_OFF = 0, + GAMMA_ON = 1, + GAMMA_MAX, +}; + +#define V4L2_CID_CAMERA_SET_SLOW_AE (V4L2_CID_PRIVATE_BASE + 107) +enum v4l2_slow_ae_mode{ + SLOW_AE_OFF, + SLOW_AE_ON, + SLOW_AE_MAX, +}; + +#define V4L2_CID_CAMERA_BATCH_REFLECTION (V4L2_CID_PRIVATE_BASE + 108) +#define V4L2_CID_CAMERA_EXIF_ORIENTATION (V4L2_CID_PRIVATE_BASE + 109) +#define V4L2_CID_CAMERA_GET_LUX (V4L2_CID_PRIVATE_BASE + 110) +/* s1_camera [ Defense process by ESD input ] */ +#define V4L2_CID_CAMERA_RESET (V4L2_CID_PRIVATE_BASE + 111) +#define V4L2_CID_CAMERA_CHECK_DATALINE (V4L2_CID_PRIVATE_BASE + 112) +#define V4L2_CID_CAMERA_CHECK_DATALINE_STOP (V4L2_CID_PRIVATE_BASE + 113) + +#endif + +/* Modify NTTS1 */ +#if defined(CONFIG_ARIES_NTT) +#define V4L2_CID_CAMERA_AE_AWB_DISABLE_LOCK (V4L2_CID_PRIVATE_BASE + 114) +#endif +#define V4L2_CID_CAMERA_THUMBNAIL_NULL (V4L2_CID_PRIVATE_BASE + 115) + +typedef enum { + STREAM_MODE_CAM_OFF, + STREAM_MODE_CAM_ON, + STREAM_MODE_MOVIE_OFF, + STREAM_MODE_MOVIE_ON, + STREAM_MODE_WAIT_OFF +} stream_mode_t; + +#define V4L2_CID_CAMERA_EXIF_EXPTIME (V4L2_CID_PRIVATE_BASE+117) +#define V4L2_CID_CAMERA_CHECK_ESD (V4L2_CID_PRIVATE_BASE+123) +#define V4L2_CID_CAMERA_APP_CHECK (V4L2_CID_PRIVATE_BASE+124) + + +#define V4L2_CID_CAMERA_BUSFREQ_LOCK (V4L2_CID_PRIVATE_BASE+125) +#define V4L2_CID_CAMERA_BUSFREQ_UNLOCK (V4L2_CID_PRIVATE_BASE+126) + +/* control for post processing block in ISP */ +#define V4L2_CID_CAMERA_SET_ODC (V4L2_CID_PRIVATE_BASE + 127) +enum set_odc_mode { + CAMERA_ODC_ON, + CAMERA_ODC_OFF +}; + +#define V4L2_CID_CAMERA_SET_DIS (V4L2_CID_PRIVATE_BASE + 128) +enum set_dis_mode { + CAMERA_DIS_ON, + CAMERA_DIS_OFF +}; + +#define V4L2_CID_CAMERA_SET_3DNR (V4L2_CID_PRIVATE_BASE + 129) +enum set_3dnr_mode { + CAMERA_3DNR_ON, + CAMERA_3DNR_OFF +}; +#define V4L2_CID_EMBEDDEDDATA_ENABLE (V4L2_CID_PRIVATE_BASE + 130) +#define V4L2_CID_CAMERA_JPEG_RESOLUTION (V4L2_CID_PRIVATE_BASE + 131) +#define V4L2_CID_CAMERA_FACE_ZOOM (V4L2_CID_PRIVATE_BASE + 132) +enum v4l2_face_zoom { + FACE_ZOOM_STOP = 0, + FACE_ZOOM_START +}; + +#define V4L2_CID_CAMERA_BRACKET (V4L2_CID_PRIVATE_BASE+134) +enum v4l2_face_bracket_mode { + BRACKET_MODE_OFF = 0, + BRACKET_MODE_AEB, + BRACKET_MODE_WBB, + BRACKET_MODE_MAX, +}; + +#define V4L2_CID_CAMERA_BRACKET_AEB (V4L2_CID_PRIVATE_BASE+135) +enum v4l2_face_bracket_aeb_value { + BRACKET_AEB_VALUE0 = 0, + BRACKET_AEB_VALUE1, + BRACKET_AEB_VALUE2, + BRACKET_AEB_VALUE3, + BRACKET_AEB_VALUE4, + BRACKET_AEB_VALUE5, + BRACKET_AEB_VALUE6, +}; + +#define V4L2_CID_CAMERA_BRACKET_WBB (V4L2_CID_PRIVATE_BASE+136) +enum v4l2_face_bracket_wbb_value { + BRACKET_WBB_OFF = 0, + BRACKET_WBB_VALUE1 = 1, + BRACKET_WBB_VALUE2, + BRACKET_WBB_VALUE3, + BRACKET_WBB_VALUE4, + BRACKET_WBB_VALUE5, + BRACKET_WBB_VALUE6, +}; + +#define V4L2_CID_CAMERA_DRIVE_DIAL (V4L2_CID_PRIVATE_BASE+137) +enum v4l2_drive_dial { + DRIVEDIAL_SINGLE = 1, + DRIVEDIAL_BKT = 2, + DRIVEDIAL_CONTI_3 = 3, + DRIVEDIAL_CONTI_5 = 5, + DRIVEDIAL_CONTI_10 = 10, +}; + +enum v4l2_running_cap_mode { + RUNNING_MODE_SINGLE = 0, + RUNNING_MODE_CONTINUOUS, + RUNNING_MODE_CONTINUOUS_9FPS, + RUNNING_MODE_CONTINUOUS_5FPS, + RUNNING_MODE_BEST, + RUNNING_MODE_LOWLIGHT, + RUNNING_MODE_AE_BRACKET, + RUNNING_MODE_WB_BRACKET, + RUNNING_MODE_PW_BRACKET, + RUNNING_MODE_HDR, + RUNNING_MODE_BLINK, + RUNNING_MODE_RAW, + RUNNING_MODE_BURST, + RUNNING_MODE_BURST_10FPS, + RUNNING_MODE_BURST_15FPS, + RUNNING_MODE_BURST_30FPS, + RUNNING_MODE_SMART, + RUNNING_MODE_BULB, + RUNNING_MODE_CUSTOM_WB, + RUNNING_MODE_DUMP, + RUNNING_MODE_MAX +}; + +enum v4l2_continuous_mode { + CONTINUOUS_MODE_OFF = 0, + CONTINUOUS_MODE_ON, + CONTINUOUS_MODE_MAX, +}; + +enum v4l2_continuous_fps { + MULTI_CAPTURE_FPS_1 = 0, + MULTI_CAPTURE_FPS_10, + MULTI_CAPTURE_FPS_5, + MULTI_CAPTURE_FPS_3, + MULTI_CAPTURE_FPS_MAX, +}; + +enum v4l2_burst_mode { + BURST_MODE_OFF = 0, + BURST_MODE_ON, +}; + +enum v4l2_best_mode { + BEST_MODE_OFF = 0, + BEST_MODE_ON, + BEST_MODE_MAX,}; + +enum v4l2_lowlight_mode { + LOWLIGHT_MODE_OFF = 0, + LOWLIGHT_MODE_ON, + LOWLIGHT_MODE_MAX,}; + +enum v4l2_raw_mode { + RAW_MODE_OFF = 0, + RAW_MODE_ON, + RAW_MODE_MAX,}; + +#define V4L2_CID_CAMERA_FD_EYE_BLINK_RESULT (V4L2_CID_PRIVATE_BASE+138) + +#define V4L2_CID_CAMERA_OPTICAL_ZOOM_STEP (V4L2_CID_PRIVATE_BASE + 139) +#define V4L2_CID_CAMERA_OPTICAL_ZOOM_CTRL (V4L2_CID_PRIVATE_BASE + 140) +enum v4l2_optical_zoom_ctrl { + V4L2_OPTICAL_ZOOM_STOP, + V4L2_OPTICAL_ZOOM_TELE_START, + V4L2_OPTICAL_ZOOM_WIDE_START, + V4L2_OPTICAL_ZOOM_SLOW_TELE_START, + V4L2_OPTICAL_ZOOM_SLOW_WIDE_START, + V4L2_OPTICAL_ZOOM_PINCH_START, + V4L2_OPTICAL_ZOOM_PINCH_STOP, + V4L2_OPTICAL_ZOOM_NONE, +}; + +#define V4L2_CID_CAMERA_LDC (V4L2_CID_PRIVATE_BASE+142) +enum set_LDC_mode { + LDC_SET_OFF = 0, + LDC_SET_ON = 1, +}; + +#define V4L2_CID_CAMERA_LSC (V4L2_CID_PRIVATE_BASE+143) +enum set_LSC_mode { + LSC_SET_OFF = 0, + LSC_SET_ON = 1, +}; + +/* If you would like to control AE and AWB lock with signle command, + * use V4L2_CID_CAMERA_AEAWB_LOCK_UNLOCK above. + */ +#define V4L2_CID_CAMERA_AE_LOCK_UNLOCK (V4L2_CID_PRIVATE_BASE + 144) +enum v4l2_ae_lockunlock { + AE_UNLOCK = 0, + AE_LOCK, + AE_LOCK_MAX +}; + +#define V4L2_CID_CAMERA_AWB_LOCK_UNLOCK (V4L2_CID_PRIVATE_BASE + 145) +enum v4l2_awb_lockunlock { + AWB_UNLOCK = 0, + AWB_LOCK, + AWB_LOCK_MAX +}; + +#define V4L2_CID_CAMERA_SENSOR_OUTPUT_SIZE (V4L2_CID_PRIVATE_BASE + 146) + +#define V4L2_CID_CAMERA_FACTORY_OIS (V4L2_CID_PRIVATE_BASE+147) +enum set_Factory_OIS { + FACTORY_OIS_RETURN_TO_CENTER = 0, + FACTORY_OIS_RUN = 1, + FACTORY_OIS_START = 2, + FACTORY_OIS_STOP = 3, + FACTORY_OIS_MODE_ON = 4, + FACTORY_OIS_MODE_OFF = 5, + FACTORY_OIS_LOG = 6, + FACTORY_OIS_ON = 7, + FACTORY_OIS_DECENTER_LOG = 8, +}; + +#define V4L2_CID_CAMERA_FACTORY_ZOOM_RANGE_CHECK_DATA_MIN \ + (V4L2_CID_PRIVATE_BASE+148) +#define V4L2_CID_CAMERA_FACTORY_ZOOM_RANGE_CHECK_DATA_MAX \ + (V4L2_CID_PRIVATE_BASE+149) + +#define V4L2_CID_CAMERA_CHECK_SENSOR_STATUS (V4L2_CID_PRIVATE_BASE+150) +#define V4L2_CID_CAMERA_DEFAULT_FOCUS_POSITION (V4L2_CID_PRIVATE_BASE+151) + +#define V4L2_CID_CAMERA_FACTORY_ZOOM_SLOPE_CHECK_DATA_MIN \ + (V4L2_CID_PRIVATE_BASE+152) +#define V4L2_CID_CAMERA_FACTORY_ZOOM_SLOPE_CHECK_DATA_MAX \ + (V4L2_CID_PRIVATE_BASE+153) +#define V4L2_CID_CAMERA_FACTORY_ZOOM_STEP (V4L2_CID_PRIVATE_BASE+154) +#define V4L2_CID_CAMERA_FACTORY_ZOOM (V4L2_CID_PRIVATE_BASE+155) +enum set_Factory_Zoom { + FACTORY_ZOOM_MOVE_STEP = 0, + FACTORY_ZOOM_RANGE_CHECK_START = 1, + FACTORY_ZOOM_RANGE_CHECK_STOP = 2, + FACTORY_ZOOM_SLOPE_CHECK_START = 3, + FACTORY_ZOOM_SLOPE_CHECK_STOP = 4, + FACTORY_ZOOM_SET_RANGE_CHECK_DATA = 5, + FACTORY_ZOOM_SET_SLOPE_CHECK_DATA = 6, + FACTORY_ZOOM_STEP_TELE = 7, + FACTORY_ZOOM_STEP_WIDE = 8, + FACTORY_ZOOM_MOVE_END_CHECK = 9, +}; + +#define V4L2_CID_CAMERA_FACTORY_PUNT_RANGE_DATA_MIN \ + (V4L2_CID_PRIVATE_BASE+156) +#define V4L2_CID_CAMERA_FACTORY_PUNT_RANGE_DATA_MAX \ + (V4L2_CID_PRIVATE_BASE+157) +#define V4L2_CID_CAMERA_FACTORY_PUNT_RANGE_DATA_NUM \ + (V4L2_CID_PRIVATE_BASE+158) +#define V4L2_CID_CAMERA_FACTORY_PUNT (V4L2_CID_PRIVATE_BASE+159) +enum set_Factory_Punt { + FACTORY_PUNT_RANGE_START = 0, + FACTORY_PUNT_RANGE_STOP = 1, + FACTORY_PUNT_SHORT_SCAN_DATA = 2, + FACTORY_PUNT_SHORT_SCAN_START = 3, + FACTORY_PUNT_SHORT_SCAN_STOP = 4, + FACTORY_PUNT_LONG_SCAN_DATA = 5, + FACTORY_PUNT_LONG_SCAN_START = 6, + FACTORY_PUNT_LONG_SCAN_STOP = 7, + FACTORY_PUNT_LOG = 8, + FACTORY_PUNT_SET_RANGE_DATA = 9, + FACTORY_PUNT_EEP_WRITE = 10, +}; + +#define V4L2_CID_CAMERA_FACTORY_FAIL_STOP (V4L2_CID_PRIVATE_BASE+160) +enum set_Factory_Fail_Stop { + FACTORY_FAIL_STOP_ON = 0, + FACTORY_FAIL_STOP_OFF = 1, + FACTORY_FAIL_STOP_RUN = 2, + FACTORY_FAIL_STOP_STOP = 3, +}; + +#define V4L2_CID_CAMERA_FACTORY_NODEFOCUS (V4L2_CID_PRIVATE_BASE+161) +enum set_Factory_NoDeFocus { + FACTORY_NODEFOCUSYES_ON = 0, + FACTORY_NODEFOCUSYES_OFF = 1, + FACTORY_NODEFOCUSYES_RUN = 2, + FACTORY_NODEFOCUSYES_STOP = 3, +}; + +#define V4L2_CID_CAMERA_FACTORY_INTERPOLATION (V4L2_CID_PRIVATE_BASE+162) +enum set_Factory_Interpolation { + FACTORY_INTERPOLATION_USE = 0, + FACTORY_INTERPOLATION_RELEASE = 1, +}; + +#define V4L2_CID_CAMERA_FACTORY_DOWN_RESULT (V4L2_CID_PRIVATE_BASE+163) +#define V4L2_CID_CAMERA_FACTORY_END_RESULT (V4L2_CID_PRIVATE_BASE+164) +#define V4L2_CID_CAMERA_FACTORY_COMMON (V4L2_CID_PRIVATE_BASE+165) +enum set_Factory_Common { + FACTORY_FIRMWARE_DOWNLOAD = 0, + FACTORY_DOWNLOAD_CHECK = 1, + FACTORY_END_CHECK = 2, + FACTORY_COMMON_SET_FOCUS_ZONE_MACRO = 3, + FACTORY_FPS30_ON = 4, + FACTORY_FPS30_OFF = 5, +}; + +#define V4L2_CID_CAMERA_FACTORY_VIB (V4L2_CID_PRIVATE_BASE+166) +enum set_Factory_Vib { + FACTORY_VIB_START = 0, + FACTORY_VIB_STOP = 1, + FACTORY_VIB_LOG = 2, +}; + +#define V4L2_CID_CAMERA_FACTORY_GYRO (V4L2_CID_PRIVATE_BASE+167) +enum set_Factory_Gyro { + FACTORY_GYRO_START = 0, + FACTORY_GYRO_STOP = 1, + FACTORY_GYRO_LOG = 2, +}; + +#define V4L2_CID_CAMERA_FACTORY_BACKLASH (V4L2_CID_PRIVATE_BASE+168) +enum set_Factory_Backlash { + FACTORY_BACKLASH_INPUT = 0, + FACTORY_BACKLASH_MAX_THR = 1, + FACTORY_BACKLASH_WIDE_RUN = 2, + FACTORY_BACKLASH_LOG = 3, +}; + +#define V4L2_CID_CAMERA_FACTORY_AF_STEP_SET (V4L2_CID_PRIVATE_BASE+169) +#define V4L2_CID_CAMERA_FACTORY_AF_POSITION (V4L2_CID_PRIVATE_BASE+170) +#define V4L2_CID_CAMERA_FACTORY_AF_INT_RESULT (V4L2_CID_PRIVATE_BASE+171) +#define V4L2_CID_CAMERA_FACTORY_AF (V4L2_CID_PRIVATE_BASE+172) +enum set_Factory_AF { + FACTORY_AF_LOCK_ON_SET = 0, + FACTORY_AF_LOCK_OFF_SET = 1, + FACTORY_AF_MOVE = 2, + FACTORY_AF_STEP_LOG = 3, + FACTORY_AF_LOCK_START = 4, + FACTORY_AF_LOCK_STOP = 5, + FACTORY_AF_FOCUS_LOG = 6, + FACTORY_AF_INT_SET = 7, + FACTORY_AF_SCAN_LIMIT_START = 8, + FACTORY_AF_SCAN_LIMIT_STOP = 10, + FACTORY_AF_SCAN_RANGE_START = 11, + FACTORY_AF_SCAN_RANGE_STOP = 12, + FACTORY_AF_STEP_SAVE = 13, + FACTORY_AF_LED_END_CHECK = 14, + FACTORY_AF_LED_LOG = 15, + FACTORY_AF_MOVE_END_CHECK = 16, + FACTORY_AF_SCAN_END_CHECK = 17, +}; + +#define V4L2_CID_CAMERA_FACTORY_DEFOCUS_WIDE (V4L2_CID_PRIVATE_BASE+173) +#define V4L2_CID_CAMERA_FACTORY_DEFOCUS_TELE (V4L2_CID_PRIVATE_BASE+174) +#define V4L2_CID_CAMERA_FACTORY_DEFOCUS (V4L2_CID_PRIVATE_BASE+175) +enum set_Factory_DeFocus { + FACTORY_DEFOCUS_RUN = 0, + FACTORY_DEFOCUS_STOP = 1, +}; + +#define V4L2_CID_CAMERA_FACTORY_RESOL_CAP (V4L2_CID_PRIVATE_BASE+176) +enum set_Factory_Resol_Cap { + FACTORY_CAP_COMP_ON = 0, + FACTORY_CAP_COMP_OFF = 1, + FACTORY_CAP_BARREL_ON = 2, + FACTORY_CAP_BARREL_OFF = 3, + FACTORY_CAP_BARREL_START = 4, + FACTORY_CAP_BARREL_STOP = 5, + FACTORY_CAP_COMP_START = 6, + FACTORY_CAP_COMP_STOP = 7, +}; + +#define V4L2_CID_CAMERA_SET_G_VALUE (V4L2_CID_PRIVATE_BASE + 177) +#define V4L2_CID_CAMERA_SET_B_VALUE (V4L2_CID_PRIVATE_BASE + 178) +#define V4L2_CID_CAMERA_SET_A_VALUE (V4L2_CID_PRIVATE_BASE + 179) +#define V4L2_CID_CAMERA_SET_M_VALUE (V4L2_CID_PRIVATE_BASE + 180) +#define V4L2_CID_CAMERA_SET_GBAM (V4L2_CID_PRIVATE_BASE + 181) +#define V4L2_CID_CAMERA_SET_K_VALUE (V4L2_CID_PRIVATE_BASE + 182) +#define V4L2_CID_CAMERA_SET_FLASH_EVC_STEP (V4L2_CID_PRIVATE_BASE + 183) + +#define V4L2_CID_CAMERA_APERTURE_CMD (V4L2_CID_PRIVATE_BASE+184) +enum set_Factory_Aperture_Cmd { + FACTORY_CMD_PREVIEW = 0, + FACTORY_CMD_CAPTURE = 1, +}; + +#define V4L2_CID_CAMERA_FACTORY_OIS_RANGE_DATA_X_MIN (V4L2_CID_PRIVATE_BASE+185) +#define V4L2_CID_CAMERA_FACTORY_OIS_RANGE_DATA_X_MAX (V4L2_CID_PRIVATE_BASE+186) +#define V4L2_CID_CAMERA_FACTORY_OIS_RANGE_DATA_Y_MIN (V4L2_CID_PRIVATE_BASE+187) +#define V4L2_CID_CAMERA_FACTORY_OIS_RANGE_DATA_Y_MAX (V4L2_CID_PRIVATE_BASE+188) +#define V4L2_CID_CAMERA_FACTORY_OIS_RANGE_DATA_X_GAIN \ + (V4L2_CID_PRIVATE_BASE+189) +#define V4L2_CID_CAMERA_FACTORY_OIS_RANGE_DATA_PEAK_X \ + (V4L2_CID_PRIVATE_BASE+190) +#define V4L2_CID_CAMERA_FACTORY_OIS_RANGE_DATA_PEAK_Y \ + (V4L2_CID_PRIVATE_BASE+191) + +#define V4L2_CID_CAMERA_FACTORY_VIB_RANGE_DATA_X_MIN (V4L2_CID_PRIVATE_BASE+192) +#define V4L2_CID_CAMERA_FACTORY_VIB_RANGE_DATA_X_MAX (V4L2_CID_PRIVATE_BASE+193) +#define V4L2_CID_CAMERA_FACTORY_VIB_RANGE_DATA_Y_MIN (V4L2_CID_PRIVATE_BASE+194) +#define V4L2_CID_CAMERA_FACTORY_VIB_RANGE_DATA_Y_MAX (V4L2_CID_PRIVATE_BASE+195) +#define V4L2_CID_CAMERA_FACTORY_VIB_RANGE_DATA_PEAK_X \ + (V4L2_CID_PRIVATE_BASE+196) +#define V4L2_CID_CAMERA_FACTORY_VIB_RANGE_DATA_PEAK_Y \ + (V4L2_CID_PRIVATE_BASE+197) + +#define V4L2_CID_CAMERA_FACTORY_GYRO_RANGE_DATA_X_MIN \ + (V4L2_CID_PRIVATE_BASE+198) +#define V4L2_CID_CAMERA_FACTORY_GYRO_RANGE_DATA_X_MAX \ + (V4L2_CID_PRIVATE_BASE+199) +#define V4L2_CID_CAMERA_FACTORY_GYRO_RANGE_DATA_Y_MIN \ + (V4L2_CID_PRIVATE_BASE+200) +#define V4L2_CID_CAMERA_FACTORY_GYRO_RANGE_DATA_Y_MAX \ + (V4L2_CID_PRIVATE_BASE+202) + +#define V4L2_CID_CAMERA_FACTORY_TEST_NUMBER (V4L2_CID_PRIVATE_BASE+203) + +#define V4L2_CID_CAMERA_FACTORY_BACKLASH_COUNT (V4L2_CID_PRIVATE_BASE+204) +#define V4L2_CID_CAMERA_FACTORY_BACKLASH_MAXTHRESHOLD \ + (V4L2_CID_PRIVATE_BASE+205) + +#define V4L2_CID_CAMERA_FACTORY_CAPTURE_CTRL (V4L2_CID_PRIVATE_BASE + 206) +enum set_Factory_Cap_Ctrl { + FACTORY_STILL_CAP_NORMAL = 0, + FACTORY_STILL_CAP_DUALCAP = 1, + FACTORY_DUAL_CAP_ON = 2, + FACTORY_DUAL_CAP_OFF = 3, +}; + +#define V4L2_CID_CAMERA_DUAL_POSTVIEW (V4L2_CID_PRIVATE_BASE + 207) +#define V4L2_CID_CAMERA_DUAL_CAPTURE (V4L2_CID_PRIVATE_BASE + 208) +#define V4L2_CID_CAMERA_SET_DUAL_CAPTURE (V4L2_CID_PRIVATE_BASE + 209) +#define V4L2_CID_CAMERA_DUAL_CAPTURE_MODE (V4L2_CID_PRIVATE_BASE + 210) + +#define V4L2_CID_CAMERA_FACTORY_AF_SCAN_LIMIT_MIN (V4L2_CID_PRIVATE_BASE+212) +#define V4L2_CID_CAMERA_FACTORY_AF_SCAN_LIMIT_MAX (V4L2_CID_PRIVATE_BASE+213) +#define V4L2_CID_CAMERA_FACTORY_AF_SCAN_RANGE_MIN (V4L2_CID_PRIVATE_BASE+214) +#define V4L2_CID_CAMERA_FACTORY_AF_SCAN_RANGE_MAX (V4L2_CID_PRIVATE_BASE+215) +#define V4L2_CID_CAM_APERTURE_PREVIEW (V4L2_CID_PRIVATE_BASE+216) +#define V4L2_CID_CAM_APERTURE_CAPTURE (V4L2_CID_PRIVATE_BASE+217) + +#define V4L2_CID_CAMERA_FACTORY_AF_ZONE (V4L2_CID_PRIVATE_BASE+218) +enum set_Factory_AFZone_Cmd { + FACTORY_AFZONE_NORMAL = 0, + FACTORY_AFZONE_MACRO, + FACTORY_AFZONE_AUTO, +}; + +#define V4L2_CID_CAMERA_FACTORY_OIS_SHIFT (V4L2_CID_PRIVATE_BASE+219) +#define V4L2_CID_CAMERA_FACTORY_FLICKER (V4L2_CID_PRIVATE_BASE+220) +enum set_Factory_Flicker_Cmd { + FACTORY_FLICKER_AUTO = 0, + FACTORY_FLICKER_50HZ, + FACTORY_FLICKER_60HZ, + FACTORY_FLICKER_50_60, + FACTORY_FLICKER_OFF, +}; + +#define V4L2_CID_CAMERA_FACTORY_AF_LENS (V4L2_CID_PRIVATE_BASE+221) +enum set_Factory_AFLENS_Cmd { + FACTORY_AFLENS_OPEN = 0, + FACTORY_AFLENS_CLOSE, +}; + +#define V4L2_CID_CAMERA_FACTORY_LV_TARGET (V4L2_CID_PRIVATE_BASE+222) + +#define V4L2_CID_CAMERA_FACTORY_ADJ_IRIS_RANGE_MIN (V4L2_CID_PRIVATE_BASE+223) +#define V4L2_CID_CAMERA_FACTORY_ADJ_IRIS_RANGE_MAX (V4L2_CID_PRIVATE_BASE+224) +#define V4L2_CID_CAMERA_FACTORY_ADJ_IRIS (V4L2_CID_PRIVATE_BASE+225) +enum set_Factory_Adj_IRIS_Cmd { + FACTORY_ADJ_IRIS_RUN = 0, + FACTORY_ADJ_IRIS_STOP, + FACTORY_ADJ_IRIS_END_CHECK, + FACTORY_ADJ_IRIS_LOG, +}; + +#define V4L2_CID_CAMERA_FACTORY_ADJ_GAIN_LIVEVIEW_RANGE_MIN \ + (V4L2_CID_PRIVATE_BASE+226) +#define V4L2_CID_CAMERA_FACTORY_ADJ_GAIN_LIVEVIEW_RANGE_MAX \ + (V4L2_CID_PRIVATE_BASE+227) +#define V4L2_CID_CAMERA_FACTORY_ADJ_GAIN_LIVEVIEW (V4L2_CID_PRIVATE_BASE+228) +enum set_Factory_Adj_Gain_LiveView_Cmd { + FACTORY_ADJ_GAIN_LIVEVIEW_RUN = 0, + FACTORY_ADJ_GAIN_LIVEVIEW_STOP, + FACTORY_ADJ_GAIN_LIVEVIEW_END_CHECK, + FACTORY_ADJ_GAIN_LIVEVIEW_LOG, +}; + +#define V4L2_CID_CAMERA_FACTORY_SH_CLOSE_IRIS_NUM (V4L2_CID_PRIVATE_BASE+229) +#define V4L2_CID_CAMERA_FACTORY_SH_CLOSE_SET_IRIS (V4L2_CID_PRIVATE_BASE+230) +#define V4L2_CID_CAMERA_FACTORY_SH_CLOSE_ISO (V4L2_CID_PRIVATE_BASE+231) +#define V4L2_CID_CAMERA_FACTORY_SH_CLOSE_RANGE (V4L2_CID_PRIVATE_BASE+232) +#define V4L2_CID_CAMERA_FACTORY_SH_CLOSE_SPEEDTIME_X (V4L2_CID_PRIVATE_BASE+233) +#define V4L2_CID_CAMERA_FACTORY_SH_CLOSE_SPEEDTIME_Y (V4L2_CID_PRIVATE_BASE+234) +#define V4L2_CID_CAMERA_FACTORY_SH_CLOSE (V4L2_CID_PRIVATE_BASE+235) +enum set_Factory_SH_Close_Cmd { + FACTORY_SH_CLOSE_RUN = 0, + FACTORY_SH_CLOSE_STOP, + FACTORY_SH_CLOSE_END_CHECK, + FACTORY_SH_CLOSE_LOG, +}; + +#define V4L2_CID_CAMERA_FACTORY_CAPTURE_GAIN_RANGE_MIN \ + (V4L2_CID_PRIVATE_BASE+236) +#define V4L2_CID_CAMERA_FACTORY_CAPTURE_GAIN_RANGE_MAX \ + (V4L2_CID_PRIVATE_BASE+237) +#define V4L2_CID_CAMERA_FACTORY_CAPTURE_GAIN (V4L2_CID_PRIVATE_BASE+238) +enum set_Factory_Capture_Gain_Cmd { + FACTORY_CAPTURE_GAIN_RUN = 0, + FACTORY_CAPTURE_GAIN_STOP, + FACTORY_CAPTURE_GAIN_END_CHECK, + FACTORY_CAPTURE_GAIN_LOG, +}; + +#define V4L2_CID_CAMERA_FACTORY_LSC_TABLE (V4L2_CID_PRIVATE_BASE+239) +#define V4L2_CID_CAMERA_FACTORY_LSC_REFERENCE (V4L2_CID_PRIVATE_BASE+240) + +#define V4L2_CID_CAMERA_FACTORY_PUNT_SHORT_SCAN_DATA (V4L2_CID_PRIVATE_BASE+241) +#define V4L2_CID_CAMERA_FACTORY_PUNT_LONG_SCAN_DATA (V4L2_CID_PRIVATE_BASE+242) + +enum set_camera_mode_Cmd { + MODE_SMART_AUTO = 0, + MODE_PROGRAM, + MODE_A, + MODE_S, + MODE_M, + MODE_VIDEO, + MODE_BEST_GROUP_POSE, + MODE_BACKGROUND_BLUR, + MODE_HIGH_SPEED, + MODE_LIGHT_TRAIL_SHOT, + MODE_WATERFALL, + MODE_SILHOUETTE, + MODE_SUNSET, + MODE_CLOSE_UP, + MODE_FIREWORKS, + MODE_CROSS_FILTER, + MODE_BACKLIGHT, + MODE_BLUE_SKY, + MODE_NATURAL_GREEN, + MODE_FOOD, + MODE_START_FILTER, + MODE_MOVING_SHOT, + MODE_DAWN, + MODE_SNOW, + MODE_BEACH, + MODE_HOT_FOOD, + MODE_COOL_FOOD, + MODE_CANDLE, + MODE_PARTY_INDOOR, + MODE_PANORAMA, + MODE_BEAUTY_SHOT, + MODE_BEST_SHOT, + MODE_CONTINUOUS_SHOT, + MODE_BEST_FACE, + MODE_PW_BRACKET, + MODE_BABY_SHOT, + MODE_VIGNTTING, + MODE_LANDSCAPE, + MODE_ACTION_FREEZE, + MODE_RICH_TONE, + MODE_ANIMATED_SCENE, + MODE_MULTI_EXPOSURE_SHOT, + MODE_DRAMA_SHOT, + MODE_ERASER, + MODE_SOUND_AND_SHOT, + MODE_MINIATURE, + MODE_CREATIVE_SHOT, + MODE_INTERVAL_SHOT, + MODE_NIGHT, + MODE_GOLF_SHOT, + MODE_3D, + MODE_SMART_SUGGEST, + MODE_SMART_BUDDY, /*add Smart Buddy Mode*/ + MODE_MAGIC, + MODE_SMART_SELF, + MODE_CAMERA_MAX, +}; + +#define V4L2_CID_CAMERA_IMAGE_STABILIZER (V4L2_CID_PRIVATE_BASE + 246) +enum set_Image_Stabilizer { + V4L2_IMAGE_STABILIZER_OFF = 0, + V4L2_IMAGE_STABILIZER_OIS = 1, + V4L2_IMAGE_STABILIZER_DUALIS = 2, +}; + +#define V4L2_CID_CAMERA_IS_OIS_MODE (V4L2_CID_PRIVATE_BASE + 247) +enum set_IS_OIS_mode { + V4L2_IS_OIS_NONE = 0, + V4L2_IS_OIS_MOVIE = 1, + V4L2_IS_OIS_STILL = 2, + V4L2_IS_OIS_MULTI = 3, + V4L2_IS_OIS_VSS = 4, +}; + +enum set_OIS_MODE { + V4L2_OIS_OFF = 0, + V4L2_OIS_MODE_1 = 1, + V4L2_OIS_MODE_2 = 2, +}; + +#define V4L2_CID_CAMERA_FACTORY_AE_TARGET (V4L2_CID_PRIVATE_BASE + 248) + +#define V4L2_CID_CAMERA_AV (V4L2_CID_PRIVATE_BASE + 249) +#define V4L2_CID_CAMERA_TV (V4L2_CID_PRIVATE_BASE + 250) +#define V4L2_CID_CAMERA_SV (V4L2_CID_PRIVATE_BASE + 251) +#define V4L2_CID_CAMERA_EV (V4L2_CID_PRIVATE_BASE + 252) + +#define V4L2_CID_CAMERA_SCENE_SUB_MODE (V4L2_CID_PRIVATE_BASE + 253) + +#define V4L2_CID_CAMERA_WB_CUSTOM_X (V4L2_CID_PRIVATE_BASE + 254) +#define V4L2_CID_CAMERA_WB_CUSTOM_Y (V4L2_CID_PRIVATE_BASE + 255) +#define V4L2_CID_CAMERA_WB_CUSTOM_VALUE (V4L2_CID_PRIVATE_BASE + 256) + +#define V4L2_CID_CAMERA_RED_EYE_FIX_RESULT (V4L2_CID_PRIVATE_BASE + 257) +#define V4L2_CID_CAMERA_FACTORY_FLASH (V4L2_CID_PRIVATE_BASE + 258) +enum set_Factory_Flash_Cmd { + FACTORY_FLASH_STROBE_CHECK_ON = 0, + FACTORY_FLASH_STROBE_CHECK_OFF = 1, + FACTORY_FLASH_CHARGE = 2, + FACTORY_FLASH_LOG = 3, + FACTORY_FLASH_CHARGE_END_CHECK = 4, + FACTORY_FLASH_STROBE_CHARGE_END_CHECK = 5, + FACTORY_FLASH_WB_LOG = 6, + FACTORY_ADJ_FLASH_WB_LOG = 7, + FACTORY_ADJ_FLASH_WB_END_CHECK = 8, + END_CHECK = 9, +}; + +#define V4L2_CID_CAMERA_FACTORY_WB (V4L2_CID_PRIVATE_BASE + 259) +enum set_Factory_WB_Cmd { + FACTORY_WB_INDOOR_RUN = 0, + FACTORY_WB_INDOOR_END_CHECK = 1, + FACTORY_WB_OUTDOOR_RUN = 2, + FACTORY_WB_OUTDOOR_END_CHECK = 3, + FACTORY_WB_LOG = 4, +}; + +#define V4L2_CID_CAMERA_FACTORY_FLASH_RANGE_X (V4L2_CID_PRIVATE_BASE + 260) +#define V4L2_CID_CAMERA_FACTORY_FLASH_RANGE_Y (V4L2_CID_PRIVATE_BASE + 261) + +#define V4L2_CID_CAMERA_FACTORY_WB_IN_RG_VALUE (V4L2_CID_PRIVATE_BASE + 262) +#define V4L2_CID_CAMERA_FACTORY_WB_IN_BG_VALUE (V4L2_CID_PRIVATE_BASE + 263) +#define V4L2_CID_CAMERA_FACTORY_WB_OUT_RG_VALUE (V4L2_CID_PRIVATE_BASE + 264) +#define V4L2_CID_CAMERA_FACTORY_WB_OUT_BG_VALUE (V4L2_CID_PRIVATE_BASE + 265) + +#define V4L2_CID_CAMERA_FACTORY_AFLED_RANGE_DATA_START_X \ + (V4L2_CID_PRIVATE_BASE + 266) +#define V4L2_CID_CAMERA_FACTORY_AFLED_RANGE_DATA_END_X \ + (V4L2_CID_PRIVATE_BASE + 267) +#define V4L2_CID_CAMERA_FACTORY_AFLED_RANGE_DATA_START_Y \ + (V4L2_CID_PRIVATE_BASE + 268) +#define V4L2_CID_CAMERA_FACTORY_AFLED_RANGE_DATA_END_Y \ + (V4L2_CID_PRIVATE_BASE + 269) + +#define V4L2_CID_CAMERA_FACTORY_AF_LED_TIME (V4L2_CID_PRIVATE_BASE + 270) + +#define V4L2_CID_CAMERA_FACTORY_AF_DIFF_CHECK_MIN (V4L2_CID_PRIVATE_BASE + 271) +#define V4L2_CID_CAMERA_FACTORY_AF_DIFF_CHECK_MAX (V4L2_CID_PRIVATE_BASE + 272) + +#define V4L2_CID_CAMERA_FACTORY_DEFECTPIXEL (V4L2_CID_PRIVATE_BASE + 273) +enum set_Factory_DefectPixel_Cmd { + FACTORY_DEFECTPIXEL_SCENARIO_6 = 0, + FACTORY_DEFECTPIXEL_RUN, + FACTORY_DEFECTPIXEL_END_CHECK, + FACTORY_DEFECTPIXEL_LOG, + FACTORY_DEFECTPIXEL_CID_1, + FACTORY_DEFECTPIXEL_CID_2, + FACTORY_DEFECTPIXEL_CID_3, + FACTORY_DEFECTPIXEL_WRITE_BLACK, + FACTORY_DEFECTPIXEL_WRITE_WHITE, + FACTORY_DEFECTPIXEL_CID_WRITE, + FACTORY_DEFECTPIXEL_FLASH_MERGE, + FACTORY_DEFECTPIXEL_DOT_WRITE_CHECK, + FACTORY_DEFECTPIXEL_RAW_DUMP, +}; + +#define V4L2_CID_CAMERA_FACTORY_DFPX_NLV_CAP (V4L2_CID_PRIVATE_BASE + 274) +#define V4L2_CID_CAMERA_FACTORY_DFPX_NLV_DR0 (V4L2_CID_PRIVATE_BASE + 275) +#define V4L2_CID_CAMERA_FACTORY_DFPX_NLV_DR1 (V4L2_CID_PRIVATE_BASE + 276) +#define V4L2_CID_CAMERA_FACTORY_DFPX_NLV_DR2 (V4L2_CID_PRIVATE_BASE + 277) +#define V4L2_CID_CAMERA_FACTORY_DFPX_NLV_DR_HS (V4L2_CID_PRIVATE_BASE + 278) + +#define V4L2_CID_CAMERA_FACTORY_AF_LED_LV_MIN (V4L2_CID_PRIVATE_BASE + 279) +#define V4L2_CID_CAMERA_FACTORY_AF_LED_LV_MAX (V4L2_CID_PRIVATE_BASE + 280) + +#define V4L2_CID_CAMERA_FACTORY_CAM_SYS_MODE (V4L2_CID_PRIVATE_BASE + 281) +enum set_Factory_Sysmode_Cmd { + FACTORY_SYSMODE_CAPTURE = 0, + FACTORY_SYSMODE_MONITOR = 1, + FACTORY_SYSMODE_PARAM = 2, +}; + +#define V4L2_CID_CAMERA_FACTORY_ISP_FW_CHECK (V4L2_CID_PRIVATE_BASE + 282) +#define V4L2_CID_CAMERA_FACTORY_OIS_VER_CHECK (V4L2_CID_PRIVATE_BASE + 283) + +#define V4L2_CID_CAMERA_SMART_SCENE_DETECT (V4L2_CID_PRIVATE_BASE+284) +enum set_smartscenedetect_mode { + SMART_SCENE_DETECT_OFF = 0, + SMART_SCENE_DETECT_ON = 1, +}; +#define V4L2_CID_CAMERA_SMART_MOVIE_RECORDING (V4L2_CID_PRIVATE_BASE+285) +#define V4L2_CID_CAMERA_SMART_AUTO_S1_PUSH (V4L2_CID_PRIVATE_BASE+286) + +#define V4L2_CID_CAMERA_FACTORY_WB_RANGE_FLASH_WRITE \ + (V4L2_CID_PRIVATE_BASE + 287) + +#define V4L2_CID_CAMERA_FACTORY_FLASH_CHR_CHK_TM \ + (V4L2_CID_PRIVATE_BASE + 288) + +#define V4L2_CID_CAMERA_FACE_DETECT_NUMBER (V4L2_CID_PRIVATE_BASE+290) +#define V4L2_CID_CAMERA_EXIF_FL (V4L2_CID_PRIVATE_BASE + 291) + +#define V4L2_CID_CAMERA_SMART_ZOOM (V4L2_CID_PRIVATE_BASE + 292) +enum set_Smart_Zoom { + V4L2_SMART_ZOOM_OFF = 0, + V4L2_SMART_ZOOM_ON = 1, +}; + +#define V4L2_CID_CAMERA_CAF (V4L2_CID_PRIVATE_BASE + 293) + +#define V4L2_CID_CAMERA_FACTORY_LIVEVIEW_OFFSET_MARK \ + (V4L2_CID_PRIVATE_BASE + 294) +#define V4L2_CID_CAMERA_FACTORY_LIVEVIEW_OFFSET_VAL \ + (V4L2_CID_PRIVATE_BASE + 295) + +#define V4L2_CID_CAMERA_FACTORY_CAPTURE_GAIN_OFFSET_MARK \ + (V4L2_CID_PRIVATE_BASE + 296) +#define V4L2_CID_CAMERA_FACTORY_CAPTURE_GAIN_OFFSET_VAL \ + (V4L2_CID_PRIVATE_BASE + 297) + +#define V4L2_CID_CAMERA_FACTORY_WB_RANGE (V4L2_CID_PRIVATE_BASE + 298) + +#define V4L2_CID_CAMERA_LV (V4L2_CID_PRIVATE_BASE + 299) + +#define V4L2_CID_PHYSICAL_ROTATION (V4L2_CID_PRIVATE_BASE + 300) + +#define V4L2_CID_CAMERA_FOCUS_RANGE (V4L2_CID_PRIVATE_BASE + 301) +enum set_fouce_range { + V4L2_FOCUS_RANGE_AUTO = 0, + V4L2_FOCUS_RANGE_MACRO = 1, + V4L2_FOCUS_RANGE_AUTO_MACRO = 2, +}; + +#define V4L2_CID_CAMERA_AF_LED (V4L2_CID_PRIVATE_BASE + 303) +enum set_AF_LED { + V4L2_AF_LED_OFF = 0, + V4L2_AF_LED_ON = 1, +}; + +#define V4L2_CID_CAMERA_LENS_TIMER (V4L2_CID_PRIVATE_BASE + 304) + +#define V4L2_CID_CAMERA_FLASH_BATT_INFO (V4L2_CID_PRIVATE_BASE + 305) +enum set_FLASH_BATT_INFO { + V4L2_FLASH_NORMAL_BATT = 0, + V4L2_FLASH_LOW_BATT = 1, +}; + +#define V4L2_CID_CAMERA_WIDGET_MODE_LEVEL (V4L2_CID_PRIVATE_BASE+307) +enum v4l2_widget_mode_level { + V4L2_WIDGET_MODE_LEVEL_1 = 1, + V4L2_WIDGET_MODE_LEVEL_2 = 2, + V4L2_WIDGET_MODE_LEVEL_3 = 3, + V4L2_WIDGET_MODE_LEVEL_4 = 4, + V4L2_WIDGET_MODE_LEVEL_5 = 5, +}; + +#define V4L2_CID_CAMERA_PREVIEW_WIDTH (V4L2_CID_PRIVATE_BASE + 310) +#define V4L2_CID_CAMERA_PREVIEW_HEIGHT (V4L2_CID_PRIVATE_BASE + 311) +#define V4L2_CID_CAMERA_PREVIEW_SIZE (V4L2_CID_PRIVATE_BASE + 312) + +#define V4L2_CID_CAMERA_WARNING_CONDITION (V4L2_CID_PRIVATE_BASE + 313) +#define V4L2_CID_CAMERA_EXIF_FL_35mm (V4L2_CID_PRIVATE_BASE + 314) + +#define V4L2_CID_CAMERA_LENS_STATUS (V4L2_CID_PRIVATE_BASE + 315) + +#define V4L2_CID_CAMERA_TIMER_LED (V4L2_CID_PRIVATE_BASE + 317) +enum set_timer_LED { + V4L2_TIMER_LED_OFF = 0, + V4L2_TIMER_LED_2_SEC = 2, + V4L2_TIMER_LED_5_SEC = 5, + V4L2_TIMER_LED_10_SEC = 10, +}; +#define V4L2_CID_CAMERA_TIMER_MODE (V4L2_CID_PRIVATE_BASE + 318) +#define V4L2_CID_CAMERA_SAMSUNG_APP (V4L2_CID_PRIVATE_BASE + 319) +#define V4L2_CID_CAMERA_INIT (V4L2_CID_PRIVATE_BASE + 320) +#define V4L2_CID_CAMERA_POST_INIT (V4L2_CID_PRIVATE_BASE + 321) + +#define V4L2_CID_CAMERA_CAPTURE_END (V4L2_CID_PRIVATE_BASE + 322) + +//#define V4L2_CID_CAMERA_FAST_CAPTURE (V4L2_CID_PRIVATE_BASE + 323) + +#define V4L2_CID_CAMERA_FAST_CAPTURE_STOP (V4L2_CID_PRIVATE_BASE + 324) + +#define V4L2_CID_CAMERA_NOTI (V4L2_CID_PRIVATE_BASE + 325) + +enum set_Factory_Common_Cmd { + FACTORY_FLASH_WRITE = 0, + FACTORY_LOG_WRITE = 1, + FACTORY_SET_OFF = 2, + FACTORY_SET_ON = 3, + FACTORY_LOG_WRITE_START = 4, +}; + +#define V4L2_CID_FACTORY_SHUTTERSPPED (V4L2_CID_PRIVATE_BASE + 326) +#define V4L2_CID_FACTORY_CIS_DATA (V4L2_CID_PRIVATE_BASE + 327) + +#define V4L2_CID_CAMERA_MOVIE_RESOLUTION (V4L2_CID_PRIVATE_BASE + 328) + +#define V4L2_CID_CAMERA_COLOR (V4L2_CID_PRIVATE_BASE + 329) +#define V4L2_CID_CAMERA_POWER_OFF (V4L2_CID_PRIVATE_BASE + 330) + +#define V4L2_CID_FACTORY_LENS_MOUNT (V4L2_CID_PRIVATE_BASE + 331) +#define V4L2_CID_FACTORY_HOT_SHOE (V4L2_CID_PRIVATE_BASE + 332) +#define V4L2_CID_FACTORY_FLANGE_BACK (V4L2_CID_PRIVATE_BASE + 333) +#define V4L2_CID_CAMERA_AF_PRIORITY (V4L2_CID_PRIVATE_BASE + 334) +enum af_priority_value { + AF_PRIORITY_OFF = 0, + AF_PRIORITY_ON = 1, +}; +#define V4L2_CID_FACTORY_SEND_PC_DATA (V4L2_CID_PRIVATE_BASE + 335) +#define V4L2_CID_FACTORY_DUST_REDUCTION (V4L2_CID_PRIVATE_BASE + 336) +#define V4L2_CID_FACTORY_SHUTTER_X (V4L2_CID_PRIVATE_BASE + 337) +#define V4L2_CID_FACTORY_LIVEVIEW_ISO_SENS (V4L2_CID_PRIVATE_BASE + 338) +#define V4L2_CID_FACTORY_CAPTURE_ISO_SENS (V4L2_CID_PRIVATE_BASE + 339) +#define V4L2_CID_FACTORY_AWB (V4L2_CID_PRIVATE_BASE + 340) +#define V4L2_CID_FACTORY_VFPN (V4L2_CID_PRIVATE_BASE + 341) + +#define V4L2_CID_CAMERA_FLASH_POPUP (V4L2_CID_PRIVATE_BASE + 342) + +#define V4L2_CID_FACTORY_COLORSHADING (V4L2_CID_PRIVATE_BASE + 343) +#define V4L2_CID_FACTORY_PAF (V4L2_CID_PRIVATE_BASE + 344) + +#define V4L2_CID_SYSTEM_ORIENT (V4L2_CID_PRIVATE_BASE+345) +enum v4l2_system_orient { + SYSTEM_ORIENT_0_DEGREE = 0, + SYSTEM_ORIENT_90_DEGREE = 90, + SYSTEM_ORIENT_180_DEGREE = 180, + SYSTEM_ORIENT_270_DEGREE = 270, +}; + +#define V4L2_CID_CAMERA_FACTORY_MEM_COPY (V4L2_CID_PRIVATE_BASE + 346) +enum set_Factory_Memcopy_Cmd { + FACTORY_MEMCOPY_ISP_RAM = 0, + FACTORY_MEMCOPY_ISP_NOR = 1, + FACTORY_MEMCOPY_BARREL_EEP = 2, +}; + +#define V4L2_CID_CAMERA_FACTORY_MEM_MODE (V4L2_CID_PRIVATE_BASE + 347) +enum set_Factory_Memmode_Cmd { + FACTORY_MEMMODE_ISP_NOR = 0, + FACTORY_MEMMODE_BARREL_EEP = 1, +}; + +#define V4L2_CID_CAMERA_FACTORY_EEP_WRITE_MARK (V4L2_CID_PRIVATE_BASE + 348) +#define V4L2_CID_CAMERA_FACTORY_EEP_WRITE_OIS_SHIFT (V4L2_CID_PRIVATE_BASE + 349) +enum set_Factory_Eepwrite_Cmd { + FACTORY_EEPWRITE_STEP0 = 0, + FACTORY_EEPWRITE_STEP1 = 1, + FACTORY_EEPWRITE_STEP2 = 2, + FACTORY_EEPWRITE_STEP3 = 3, + FACTORY_EEPWRITE_STEP4 = 4, + FACTORY_EEPWRITE_STEP5 = 5, + FACTORY_EEPWRITE_STEP6 = 6, + FACTORY_EEPWRITE_STEP7 = 7, + FACTORY_EEPWRITE_STEP8 = 8, + FACTORY_EEPWRITE_STEP9 = 9, + FACTORY_EEPWRITE_CHECK = 10, + FACTORY_EEPWRITE_REPAIR = 11, + FACTORY_EEPWRITE_AP = 12, + FACTORY_EEPWRITE_ISP = 13, + FACTORY_EEPWRITE_SN = 14, + FACTORY_EEPWRITE_OIS_SHIFT = 15, +}; + +#define V4L2_CID_FACTORY_FLASHROM (V4L2_CID_PRIVATE_BASE + 350) + +#define V4L2_CID_CAMERA_HIGH_ISO_NR (V4L2_CID_PRIVATE_BASE + 351) +enum v4l2_high_iso_nr { + V4L2_HIGH_ISO_NR_OFF = 0, + V4L2_HIGH_ISO_NR_LOW = 1, + V4L2_HIGH_ISO_NR_NORMAL = 2, + V4L2_HIGH_ISO_NR_HIGH = 3, +}; +#define V4L2_CID_CAMERA_LONG_TERM_NR (V4L2_CID_PRIVATE_BASE + 352) +enum v4l2_long_term_nr { + V4L2_LONG_TERM_NR_OFF = 0, + V4L2_LONG_TERM_NR_ON = 1, +}; +#define V4L2_CID_CAMERA_DMF (V4L2_CID_PRIVATE_BASE + 353) +enum v4l2_dmf { + V4L2_DMF_OFF = 0, + V4L2_DMF_ON = 1, +}; +#define V4L2_CID_CAMERA_COLOR_SPACE (V4L2_CID_PRIVATE_BASE + 354) +enum v4l2_color_space { + V4L2_COLOR_SPACE_S_RGB = 0, + V4L2_COLOR_SPACE_ADOBE_RGB = 1, +}; +#define V4L2_CID_CAMERA_QUICKVIEW_CANCEL (V4L2_CID_PRIVATE_BASE + 355) +#define V4L2_CID_CAMERA_MOVIE_FADER_MODE (V4L2_CID_PRIVATE_BASE + 356) +#define V4L2_CID_CAMERA_MOVIE_FADEOUT (V4L2_CID_PRIVATE_BASE + 357) +#define V4L2_CID_CAMERA_MF_ASSIST (V4L2_CID_PRIVATE_BASE + 358) +enum v4l2_mf_assist { + V4L2_MF_ASSIST_OFF = 0, + V4L2_MF_ASSIST_ON = 1, +}; +#define V4L2_CID_CAMERA_i_FUNC_ENABLE (V4L2_CID_PRIVATE_BASE + 359) + +#define V4L2_CID_CAMERA_QUICKVIEW (V4L2_CID_PRIVATE_BASE + 360) +enum review_mode { + QUICKVIEW_OFF = 0, + QUICKVIEW_ON, +}; + +#define V4L2_CID_CAMERA_MF (V4L2_CID_PRIVATE_BASE + 361) + +#define V4L2_CID_CAMERA_FOCUS_PEAKING_LEVEL (V4L2_CID_PRIVATE_BASE + 362) +enum v4l2_focus_peaking_level { + V4L2_FOCUS_PEAKING_OFF = 0, + V4L2_FOCUS_PEAKING_LEVEL_LOW, + V4L2_FOCUS_PEAKING_LEVEL_MID, + V4L2_FOCUS_PEAKING_LEVEL_HIGH, +}; +#define V4L2_CID_CAMERA_FOCUS_PEAKING_COLOR (V4L2_CID_PRIVATE_BASE + 363) +enum v4l2_focus_peaking_color { + V4L2_FOCUS_PEAKING_COLOR_WHITE = 1, + V4L2_FOCUS_PEAKING_COLOR_RED, + V4L2_FOCUS_PEAKING_COLOR_GREEN, +}; + +#define V4L2_CID_CAMERA_COLOR_ADJUST (V4L2_CID_PRIVATE_BASE + 364) + +#define V4L2_CID_CAMERA_LINK_AE_TO_AF_POINT (V4L2_CID_PRIVATE_BASE + 365) +enum v4l2_link_ae_to_af_point { + V4L2_LINK_AE_TO_AF_POINT_OFF = 0, + V4L2_LINK_AE_TO_AF_POINT_ON = 1, +}; + +#define V4L2_CID_LENS_UPDATE_FW (V4L2_CID_PRIVATE_BASE + 366) +enum v4l2_lens_firmware_mode { + CAM_LENS_FW_MODE_NONE, + CAM_LENS_FW_MODE_VERSION, + CAM_LENS_FW_MODE_UPDATE, +}; + +#define V4L2_CID_CAMERA_DYNAMIC_RANGE (V4L2_CID_PRIVATE_BASE + 367) +enum v4l2_dynamic_range { + V4L2_DYNAMIC_RANGE_OFF = 0, + V4L2_DYNAMIC_RANGE_SMART = 1, + V4L2_DYNAMIC_RANGE_HDR = 2, +}; + +#define V4L2_CID_CAMERA_FRAMING_MODE (V4L2_CID_PRIVATE_BASE + 368) +enum v4l2_framing_mode { + V4L2_FRAMING_MODE_OFF = 0, + V4L2_FRAMING_MODE_ON = 1, +}; + +#define V4L2_CID_CAMERA_ISO_STEP (V4L2_CID_PRIVATE_BASE + 369) +enum v4l2_iso_step { + V4L2_ISO_STEP_1 = 0, + V4L2_ISO_STEP_1_3 = 1, +}; + +#define V4L2_CID_CAMERA_ISO_AUTO_MAX_LEVEL (V4L2_CID_PRIVATE_BASE + 370) +#define V4L2_CID_CAMERA_AF_FRAME_SIZE (V4L2_CID_PRIVATE_BASE + 371) +enum af_frame_size_value { + AF_FRAME_SIZE_SMALL = 0, + AF_FRAME_SIZE_MIDDLE = 1, + AF_FRAME_SIZE_LARGE = 2, + AF_FRAME_SIZE_HUGE = 3, +}; + +#define V4L2_CID_AEAF_LOCK_UNLOCK (V4L2_CID_PRIVATE_BASE + 372) +enum v4l2_AEAF_lock_mode { + CANCEL_AE_AF_LOCK = 0, + CANCEL_AE_LOCK, + CANCEL_AF_LOCK, + START_AE_AF_LOCK = 0x10, + START_AE_LOCK, + START_AF_LOCK, +}; + +#define V4L2_CID_CAMERA_MF_ENLARGE (V4L2_CID_PRIVATE_BASE + 373) +enum v4l2_MF_enlarge { + V4L2_MF_ENLARGE_OFF = 0, + V4L2_MF_ENLARGE_ON, +}; + +#define V4L2_CID_CAMERA_FACTORY_LENS_CAP (V4L2_CID_PRIVATE_BASE + 374) +enum set_Factory_LensCap_Cmd { + FACTORY_LENSCAP_CHECK = 1, + FACTORY_LENSCAP_LOG = 2, +}; + +#define V4L2_CID_CAMERA_OVER_EXPOSURE_GUIDE (V4L2_CID_PRIVATE_BASE + 375) +enum v4l2_over_exp_guide { + V4L2_OVER_EXPOSURE_OFF = 0, + V4L2_OVER_EXPOSURE_ON = 1, +}; + +#define V4L2_CID_CAMERA_NO_LENS_CAPTURE (V4L2_CID_PRIVATE_BASE + 376) +enum v4l2_no_lens_capture { + V4L2_NO_LENS_CAPTURE_OFF = 0, + V4L2_NO_LENS_CAPTURE_ON = 1, +}; + +#define V4L2_CID_CAMERA_FACTORY_CHECK_SUM (V4L2_CID_PRIVATE_BASE + 377) +enum set_Factory_CheckSum_Cmd { + FACTORY_CHECK_SUM = 1, +}; + +#define V4L2_CID_CAMERA_FACTORY_LOG_WRITE_ALL (V4L2_CID_PRIVATE_BASE + 378) +enum set_Factory_LogWriteAll_Cmd { + FACTORY_LOG_WRITE_ALL_ON = 0, + FACTORY_LOG_WRITE_ALL_OFF = 1, +}; + +#define V4L2_CID_CAMERA_BURST_BOOT_PARAM (V4L2_CID_PRIVATE_BASE + 379) + +#define V4L2_CID_CAMERA_FACTORY_PUNT_INTERPOLATION (V4L2_CID_PRIVATE_BASE + 380) + +#define V4L2_CID_CAMERA_FACTORY_DATA_ERASE (V4L2_CID_PRIVATE_BASE + 381) +enum set_Factory_Dataerase_Cmd { + FACTORY_DATA_ERASE_PUNT = 0, + FACTORY_DATA_ERASE_BACKLASH = 1, +}; + +#define V4L2_CID_CAMERA_TURN_AF_LED (V4L2_CID_PRIVATE_BASE + 382) + +#define V4L2_CID_CAMERA_FACTORY_LENS_CAP_LOG (V4L2_CID_PRIVATE_BASE + 383) + +#define V4L2_CID_THUMBNAIL_SIZE (V4L2_CID_PRIVATE_BASE + 384) +#define V4L2_CID_ZOOM_SPEED (V4L2_CID_PRIVATE_BASE + 385) + +#define V4L2_CID_CAMERA_FACTORY_NO_LENS_OFF (V4L2_CID_PRIVATE_BASE + 386) +enum set_Factory_NoLensOff_Cmd { + FACTORY_NO_LENS_ON = 1, +}; + +#define V4L2_CID_CAMERA_FACTORY_FOCUS_CLOSEOPEN (V4L2_CID_PRIVATE_BASE + 387) +#define V4L2_CID_CAMERA_FACTORY_FOCUS_CHECK (V4L2_CID_PRIVATE_BASE + 388) +enum set_Factory_FocusCloseOpenCheck_Cmd { + FACTORY_FOCUS_CLOSE = 0, + FACTORY_FOCUS_OPEN = 1, + FACTORY_FOCUS_CHECK = 2, +}; + +#define V4L2_CID_CAMERA_INTERVAL_SHOT_MANUAL_FOCUS (V4L2_CID_PRIVATE_BASE + 389) + +#define V4L2_CID_CAMERA_FACTORY_RESOLUTION_LOG (V4L2_CID_PRIVATE_BASE + 390) + +#define V4L2_CID_CAMERA_OPTICAL_PREVIEW (V4L2_CID_PRIVATE_BASE + 391) +enum v4l2_optical_preview { + V4L2_OPTICAL_PREVIEW_STOP = 0, + V4L2_OPTICAL_PREVIEW_START = 1, +}; + +#define V4L2_CID_CAMERA_FACTORY_SHD_LOG (V4L2_CID_PRIVATE_BASE + 392) +#define V4L2_CID_CAMERA_SYSTEM_RESET_CWB (V4L2_CID_PRIVATE_BASE + 393) + +#define V4L2_CID_FACTORY_RAW_SSIF_CAPTURE (V4L2_CID_PRIVATE_BASE + 394) +#define V4L2_CID_FACTORY_RAW_PP_CAPTURE (V4L2_CID_PRIVATE_BASE + 395) +enum set_Factory_Raw_Capure { + DEBUG_SSIF_RAW_CAPTURE, + DEBUG_PP_RAW_CAPTURE, +}; + +enum set_Factory_Raw_Capture_Sensor_Mode { + CT3_MODE_STILL = 1, + CT3_MODE_BURST, + CT3_MODE_FULL_HD, + CT3_MODE_CINEMA, + CT3_MODE_HD, + CT3_MODE_LIVEVIEW, + CT3_MODE_MF, + CT3_MODE_FAST_AF, + CT3_MODE_PAF_LIVEVIEW, +}; + +#define V4L2_CID_CAMERA_VIDEO_OUT_FORMAT (V4L2_CID_PRIVATE_BASE + 396) +enum v4l2_video_format { + V4L2_VIDEO_FORMAT_NTSC = 0, + V4L2_VIDEO_FORMAT_PAL = 1, +}; + +#define V4L2_CID_CAMERA_FACTORY_WRITE_SHD_DATA (V4L2_CID_PRIVATE_BASE + 397) + +#define V4L2_CID_PROGRAM_SHIFT (V4L2_CID_PRIVATE_BASE + 398) +enum v4l2_program_shift_cmd { + V4L2_PROGRAM_SHIFT_RESET = 0, + V4L2_PROGRAM_SHIFT_UP = 1, + V4L2_PROGRAM_SHIFT_DOWN = 2, +}; + +#define V4L2_CID_CAMERA_FACTORY_CLIP_VALUE (V4L2_CID_PRIVATE_BASE + 399) + +#define V4L2_CID_WEATHER_INFO (V4L2_CID_PRIVATE_BASE+400) + +#define V4L2_CID_FACTORY_GET_ISP_LOG (V4L2_CID_PRIVATE_BASE+401) + +#define V4L2_CID_FACTORY_LOG_WRITE (V4L2_CID_PRIVATE_BASE+402) + +#define V4L2_CID_CAMERA_FACTORY_IR_CHECK_G_AVG (V4L2_CID_PRIVATE_BASE+403) + +#define V4L2_CID_CAMERA_FACTORY_TILT_LOCATION (V4L2_CID_PRIVATE_BASE + 404) +enum set_Factory_Tilt_Location_Cmd { + FACTORY_TILT_LOCATION_LEFT_UP = 0, + FACTORY_TILT_LOCATION_RIGHT_UP = 1, + FACTORY_TILT_LOCATION_LEFT_DOWN = 2, + FACTORY_TILT_LOCATION_RIGHT_DOWN = 3, +}; + +#define V4L2_CID_FACTORY_AVS_REQUEST (V4L2_CID_PRIVATE_BASE + 405) + +#define V4L2_CID_CAMERA_COLD_BOOT (V4L2_CID_PRIVATE_BASE+406) + +#define V4L2_CID_CAMERA_HIGH_TEMPERATURE (V4L2_CID_PRIVATE_BASE + 407) + +/* Pixel format FOURCC depth Description */ +enum v4l2_pix_format_mode { + V4L2_PIX_FMT_MODE_PREVIEW, + V4L2_PIX_FMT_MODE_CAPTURE, + V4L2_PIX_FMT_MODE_HDR, + V4L2_PIX_FMT_MODE_VT_MIRROR, + V4L2_PIX_FMT_MODE_VT_NONMIRROR, +}; + +#define V4L2_CID_SET_CONTINUE_FPS (V4L2_CID_PRIVATE_BASE + 500) + +#define V4L2_CID_CAMERA_GET_MODE (V4L2_CID_PRIVATE_BASE + 502) + +#define V4L2_CID_CAMERA_FACTORY_SEND_SETTING \ + (V4L2_CID_PRIVATE_BASE + 503) +#define V4L2_CID_CAMERA_FACTORY_SEND_VALUE \ + (V4L2_CID_PRIVATE_BASE + 504) + +#define V4L2_CID_CAMERA_FACTORY_TILT_SCAN_MIN \ + (V4L2_CID_PRIVATE_BASE + 505) +#define V4L2_CID_CAMERA_FACTORY_TILT_SCAN_MAX \ + (V4L2_CID_PRIVATE_BASE + 506) +#define V4L2_CID_CAMERA_FACTORY_TILT_FIELD \ + (V4L2_CID_PRIVATE_BASE + 507) +#define V4L2_CID_CAMERA_FACTORY_TILT_AF_RANGE_MIN \ + (V4L2_CID_PRIVATE_BASE + 508) +#define V4L2_CID_CAMERA_FACTORY_TILT_AF_RANGE_MAX \ + (V4L2_CID_PRIVATE_BASE + 509) +#define V4L2_CID_CAMERA_FACTORY_TILT_DIFF_RANGE_MIN \ + (V4L2_CID_PRIVATE_BASE + 510) +#define V4L2_CID_CAMERA_FACTORY_TILT_DIFF_RANGE_MAX \ + (V4L2_CID_PRIVATE_BASE + 511) + +#define V4L2_CID_CAMERA_FACTORY_IR_R_GAIN_MIN \ + (V4L2_CID_PRIVATE_BASE + 512) +#define V4L2_CID_CAMERA_FACTORY_IR_R_GAIN_MAX \ + (V4L2_CID_PRIVATE_BASE + 513) +#define V4L2_CID_CAMERA_FACTORY_IR_B_GAIN_MIN \ + (V4L2_CID_PRIVATE_BASE + 514) +#define V4L2_CID_CAMERA_FACTORY_IR_B_GAIN_MAX \ + (V4L2_CID_PRIVATE_BASE + 515) + +#define V4L2_CID_CAMERA_FACTORY_FLASH_MAN_CHARGE \ + (V4L2_CID_PRIVATE_BASE + 516) +#define V4L2_CID_CAMERA_FACTORY_FLASH_MAN_EN \ + (V4L2_CID_PRIVATE_BASE + 517) + +#define V4L2_CID_CAMERA_FACTORY_SEND_WORD_VALUE \ + (V4L2_CID_PRIVATE_BASE + 518) +#define V4L2_CID_CAMERA_FACTORY_SEND_LONG_VALUE \ + (V4L2_CID_PRIVATE_BASE + 519) + +#define V4L2_CID_CAMERA_FACTORY_DFPX_NLV_DR1_HD \ + (V4L2_CID_PRIVATE_BASE + 520) + +#define V4L2_CID_CAMERA_FACTORY_TILT \ + (V4L2_CID_PRIVATE_BASE + 522) +enum set_Factory_Tilt { + FACTORY_TILT_ONE_SCRIPT_RUN = 0, + FACTORY_TILT_ONE_SCRIPT_DISP1, + FACTORY_TILT_ONE_SCRIPT_DISP2, + FACTORY_TILT_ONE_SCRIPT_DISP3, + FACTORY_TILT_ONE_SCRIPT_DISP4, + FACTORY_TILT_ONE_SCRIPT_DISP5, +}; + +#define V4L2_CID_CAMERA_FACTORY_IR_CHECK \ + (V4L2_CID_PRIVATE_BASE + 523) +enum set_Factory_IR_Check { + FACTORY_IR_CHECK_LOG = 0, +}; + +#define V4L2_CID_BURSTSHOT_SET_POSTVIEW_SIZE (V4L2_CID_PRIVATE_BASE + 524) + +#define V4L2_CID_BURSTSHOT_SET_SNAPSHOT_SIZE (V4L2_CID_PRIVATE_BASE + 525) + +#define V4L2_CID_CAMERA_FACTORY_FLASH_CHARGE (V4L2_CID_PRIVATE_BASE+527) + +#define V4L2_CID_CAMERA_FW_CHECKSUM_VAL (V4L2_CID_PRIVATE_BASE+528) + +enum set_Start_Capture_Mode { + START_CAPTURE_POSTVIEW = 0, + START_CAPTURE_YUV_MAIN, + START_CAPTURE_JPEG_MAIN, + START_CAPTURE_THUMB, + START_CAPTURE_COMBINED, +}; + +#define V4L2_CID_CAMERA_CAPTURE_CNT (V4L2_CID_PRIVATE_BASE + 529) +#define V4L2_CID_MULTI_EXPOSURE_CNT (V4L2_CID_PRIVATE_BASE + 530) +#define V4L2_CID_CAMERA_DZOOM (V4L2_CID_PRIVATE_BASE + 531) +#define V4L2_CID_CAMERA_MIC_CONTROL (V4L2_CID_PRIVATE_BASE + 532) + +#define V4L2_CID_BURSTSHOT_STOP (V4L2_CID_PRIVATE_BASE + 533) +enum v4l2_burst_stop_state { + V4L2_INT_STATE_BURST_NORMAL_STOP = 0, + V4L2_INT_STATE_BURST_STOP_BY_POWER_SAVE, + V4L2_INT_STATE_BURST_STOP_BY_LENS_DETACH, + V4L2_INT_STATE_BURST_STOP_BY_CARD_INOUT, +}; + +#define V4L2_CID_ZOOM_ACTION_METHOD (V4L2_CID_PRIVATE_BASE + 534) +enum V4l2_zoom_action_method { + ZOOM_KEY = 0, + ZOOM_RING = 1, + ZOOM_METHOD_MAX, +}; + +#define V4L2_CID_CAMERA_LIVEVIEW_RESOLUTION (V4L2_CID_PRIVATE_BASE + 535) + +#define V4L2_CID_CAMERA_FACTORY_OIS_DECENTER (V4L2_CID_PRIVATE_BASE + 550) + +/* FOR AF/AE Division Function in Galaxy-Camera */ +#define V4L2_CID_CAMERA_AE_POSITION_X (V4L2_CID_PRIVATE_BASE+536) +#define V4L2_CID_CAMERA_AE_POSITION_Y (V4L2_CID_PRIVATE_BASE+537) +#define V4L2_CID_CAMERA_AE_WINDOW_SIZE_WIDTH (V4L2_CID_PRIVATE_BASE+538) +#define V4L2_CID_CAMERA_AE_WINDOW_SIZE_HEIGHT (V4L2_CID_PRIVATE_BASE+539) +#define V4L2_CID_CAMERA_AE_PREVIEW_TOUCH_CTRL (V4L2_CID_PRIVATE_BASE+540) + + +/* Read the info of FD (SELF SHOT MODE) */ +#define V4L2_CID_CAMERA_SMART_SELF_SHOT_FD_INFO1 (V4L2_CID_PRIVATE_BASE+544) +#define V4L2_CID_CAMERA_SMART_SELF_SHOT_FD_INFO2 (V4L2_CID_PRIVATE_BASE+545) + +/* Set the ROI BOX info (SELF SHOT MODE) */ +#define V4L2_CID_CAMERA_SET_ROI_BOX (V4L2_CID_PRIVATE_BASE+546) +#define V4L2_CID_CAMERA_SET_ROI_BOX_WIDTH_HEIGHT (V4L2_CID_PRIVATE_BASE+547) +#define V4L2_CID_CAMERA_SET_FD_FOCUS_SELECT (V4L2_CID_PRIVATE_BASE+548) + +#define V4L2_CID_FACTORY_DEFECT_NOISE_LEVEL_TABLE (V4L2_CID_PRIVATE_BASE+549) +#define V4L2_CID_FACTORY_DEFECT_NOISE_LEVEL_MODE (V4L2_CID_PRIVATE_BASE+550) +#define V4L2_CID_FACTORY_DEFECT_NOISE_LEVEL_MIN_NUM (V4L2_CID_PRIVATE_BASE+551) +#define V4L2_CID_FACTORY_DEFECT_NOISE_LEVEL_MAX_NUM (V4L2_CID_PRIVATE_BASE+552) +#define V4L2_CID_FACTORY_DEFECT_NOISE_LEVEL_ISO_NUM (V4L2_CID_PRIVATE_BASE+553) +#define V4L2_CID_FACTORY_DEFECT_NOISE_LEVEL_EXP_TIME (V4L2_CID_PRIVATE_BASE+554) +#define V4L2_CID_FACTORY_DEFECT_NOISE_LEVEL_REPEAT_NUM (V4L2_CID_PRIVATE_BASE+555) + +/* for NSM Mode */ +#define V4L2_CID_CAMERA_NSM_SYSTEM (V4L2_CID_PRIVATE_BASE + 556) +#define V4L2_CID_CAMERA_NSM_STATE (V4L2_CID_PRIVATE_BASE + 557) + +enum set_camera_nsm_system { + NSM_SYSTEM_NONE = 0, + NSM_SYSTEM_FILMSUGGEST = 1, + NSM_SYSTEM_HOWTOLIBRARY, + NSM_SYSTEM_FILMLIBRARY, + NSM_SYSTEM_FILMMAKER, +}; + +enum set_camera_nsm_state { + NSM_STATE_AUTO = 1, + NSM_STATE_FILM, + NSM_STATE_SHOW, +}; + +enum set_camera_nsm_color { + NSM_RGB = 0x01, + NSM_CONTSHARP, + NSM_HUE_ALLREDORANGE, + NSM_HUE_YELLOWGREENCYAN, + NSM_HUE_BLUEVIOLETPURPLE, + NSM_SAT_ALLREDORANGE, + NSM_SAT_YELLOWGREENCYAN, + NSM_SAT_BLUEVIOLETPURPLE, + NSM_RESERVED = 0x09, + NSM_R = 0x0A, + NSM_G, + NSM_B, + NSM_GLOBAL_CONTRAST, + NSM_GLOBAL_SHARPNESS, + NSM_HUE_ALL = 0x0F, + NSM_HUE_RED = 0X10, + NSM_HUE_ORANGE, + NSM_HUE_YELLOW, + NSM_HUE_GREEN, + NSM_HUE_CYAN, + NSM_HUE_BLUE, + NSM_HUE_VIOLET, + NSM_HUE_PURPLE, + NSM_SAT_ALL = 0x18, + NSM_SAT_RED, + NSM_SAT_ORANGE = 0x1A, + NSM_SAT_YELLOW, + NSM_SAT_GREEN, + NSM_SAT_CYAN, + NSM_SAT_BLUE, + NSM_SAT_VIOLET = 0x1F, + NSM_SAT_PURPLE = 0x20, +}; + +#define V4L2_CID_CAMERA_NSM_RGB (V4L2_CID_PRIVATE_BASE + 558) +#define V4L2_CID_CAMERA_NSM_CONTSHARP (V4L2_CID_PRIVATE_BASE + 559) + +#define V4L2_CID_CAMERA_NSM_HUE_ALLREDORANGE (V4L2_CID_PRIVATE_BASE + 560) +#define V4L2_CID_CAMERA_NSM_HUE_YELLOWGREENCYAN (V4L2_CID_PRIVATE_BASE + 561) +#define V4L2_CID_CAMERA_NSM_HUE_BLUEVIOLETPURPLE (V4L2_CID_PRIVATE_BASE + 562) +#define V4L2_CID_CAMERA_NSM_SAT_ALLREDORANGE (V4L2_CID_PRIVATE_BASE + 563) +#define V4L2_CID_CAMERA_NSM_SAT_YELLOWGREENCYAN (V4L2_CID_PRIVATE_BASE + 564) +#define V4L2_CID_CAMERA_NSM_SAT_BLUEVIOLETPURPLE (V4L2_CID_PRIVATE_BASE + 565) + +#define V4L2_CID_CAMERA_NSM_R (V4L2_CID_PRIVATE_BASE + 566) +#define V4L2_CID_CAMERA_NSM_G (V4L2_CID_PRIVATE_BASE + 567) +#define V4L2_CID_CAMERA_NSM_B (V4L2_CID_PRIVATE_BASE + 568) +#define V4L2_CID_CAMERA_NSM_GLOBAL_CONTRAST (V4L2_CID_PRIVATE_BASE + 569) +#define V4L2_CID_CAMERA_NSM_GLOBAL_SHARPNESS (V4L2_CID_PRIVATE_BASE + 570) + +#define V4L2_CID_CAMERA_NSM_HUE_ALL (V4L2_CID_PRIVATE_BASE + 571) +#define V4L2_CID_CAMERA_NSM_HUE_RED (V4L2_CID_PRIVATE_BASE + 572) +#define V4L2_CID_CAMERA_NSM_HUE_ORANGE (V4L2_CID_PRIVATE_BASE + 573) +#define V4L2_CID_CAMERA_NSM_HUE_YELLOW (V4L2_CID_PRIVATE_BASE + 574) +#define V4L2_CID_CAMERA_NSM_HUE_GREEN (V4L2_CID_PRIVATE_BASE + 575) +#define V4L2_CID_CAMERA_NSM_HUE_CYAN (V4L2_CID_PRIVATE_BASE + 576) +#define V4L2_CID_CAMERA_NSM_HUE_BLUE (V4L2_CID_PRIVATE_BASE + 577) +#define V4L2_CID_CAMERA_NSM_HUE_VIOLET (V4L2_CID_PRIVATE_BASE + 578) +#define V4L2_CID_CAMERA_NSM_HUE_PURPLE (V4L2_CID_PRIVATE_BASE + 579) + +#define V4L2_CID_CAMERA_NSM_SAT_ALL (V4L2_CID_PRIVATE_BASE + 580) +#define V4L2_CID_CAMERA_NSM_SAT_RED (V4L2_CID_PRIVATE_BASE + 581) +#define V4L2_CID_CAMERA_NSM_SAT_ORANGE (V4L2_CID_PRIVATE_BASE + 582) +#define V4L2_CID_CAMERA_NSM_SAT_YELLOW (V4L2_CID_PRIVATE_BASE + 583) +#define V4L2_CID_CAMERA_NSM_SAT_GREEN (V4L2_CID_PRIVATE_BASE + 584) +#define V4L2_CID_CAMERA_NSM_SAT_CYAN (V4L2_CID_PRIVATE_BASE + 585) +#define V4L2_CID_CAMERA_NSM_SAT_BLUE (V4L2_CID_PRIVATE_BASE + 586) +#define V4L2_CID_CAMERA_NSM_SAT_VIOLET (V4L2_CID_PRIVATE_BASE + 587) +#define V4L2_CID_CAMERA_NSM_SAT_PURPLE (V4L2_CID_PRIVATE_BASE + 588) + +#define V4L2_CID_CAMERA_NSM_FD_INFO (V4L2_CID_PRIVATE_BASE + 589) +#define V4L2_CID_CAMERA_NSM_FD_WRITE (V4L2_CID_PRIVATE_BASE + 590) +/* end NSM Mode */ + +/* ISP DEBUG CODE */ +#define V4L2_CID_ISP_DEBUG_READ (V4L2_CID_SENSOR_BASE + 16) +#define V4L2_CID_ISP_DEBUG_WRITE (V4L2_CID_SENSOR_BASE + 17) +#define V4L2_CID_ISP_DEBUG_READ_MEM (V4L2_CID_SENSOR_BASE + 18) +#define V4L2_CID_ISP_DEBUG_WRITE_MEM (V4L2_CID_SENSOR_BASE + 19) +#define V4L2_CID_ISP_DEBUG_READ_FILE (V4L2_CID_SENSOR_BASE + 20) +#define V4L2_CID_ISP_DEBUG_WRITE_FILE (V4L2_CID_SENSOR_BASE + 21) +#define V4L2_CID_ISP_DEBUG_LOGV (V4L2_CID_SENSOR_BASE + 22) + +#define V4L2_CID_FACTORY_FW_CHECK (V4L2_CID_SENSOR_BASE + 23) +#define V4L2_CID_FACTORY_D4_CMD (V4L2_CID_SENSOR_BASE + 24) +#define V4L2_CID_NOTI_DATA_GET (V4L2_CID_SENSOR_BASE + 25) +#define V4L2_CID_EXIF_TIME_MODEL (V4L2_CID_SENSOR_BASE + 26) +#define V4L2_CID_CAMERA_DISTANCE_SCALE (V4L2_CID_SENSOR_BASE + 27) +#define V4L2_CID_EXIF_GPS (V4L2_CID_SENSOR_BASE + 28) + +#define V4L2_CID_CAMERA_SET_SNAPSHOT_SIZE (V4L2_CID_SENSOR_BASE + 30) +#define V4L2_CID_CAMERA_CAPTURE_MODE (V4L2_CID_SENSOR_BASE + 31) +#define V4L2_CID_CAMERA_SET_POSTVIEW_SIZE (V4L2_CID_SENSOR_BASE + 32) +#define V4L2_CID_START_CAPTURE_KIND (V4L2_CID_SENSOR_BASE + 33) +#define V4L2_CID_CAMERA_POSTVIEW_TRANSFER (V4L2_CID_SENSOR_BASE + 34) + +#define V4L2_CID_CAM_JPEG_MAIN_SIZE (V4L2_CID_SENSOR_BASE + 35) +#define V4L2_CID_CAM_JPEG_MAIN_OFFSET (V4L2_CID_SENSOR_BASE + 36) +#define V4L2_CID_CAM_JPEG_THUMB_SIZE (V4L2_CID_SENSOR_BASE + 37) +#define V4L2_CID_CAM_JPEG_THUMB_OFFSET (V4L2_CID_SENSOR_BASE + 38) + +#define V4L2_CID_CAMERA_STREAM_PART2 (V4L2_CID_SENSOR_BASE + 39) +#define V4L2_CID_CAMERA_SMART_READ1 (V4L2_CID_SENSOR_BASE + 40) +#define V4L2_CID_CAMERA_SMART_READ2 (V4L2_CID_SENSOR_BASE + 41) +#define V4L2_CID_CAMERA_TIME_INFO (V4L2_CID_SENSOR_BASE + 42) +#define V4L2_CID_CAMERA_EXIF_FLASH (V4L2_CID_SENSOR_BASE + 43) +#define V4L2_CID_CAMERA_EXIF_ISO (V4L2_CID_SENSOR_BASE + 44) +#define V4L2_CID_CAMERA_EXIF_TV (V4L2_CID_SENSOR_BASE + 45) +#define V4L2_CID_CAMERA_EXIF_BV (V4L2_CID_SENSOR_BASE + 46) +#define V4L2_CID_CAMERA_EXIF_AV (V4L2_CID_SENSOR_BASE + 47) +#define V4L2_CID_CAMERA_EXIF_EBV (V4L2_CID_SENSOR_BASE + 48) +#define V4L2_CID_CAMERA_PASM_MODE (V4L2_CID_SENSOR_BASE + 49) +/* DO NOT ADD MORE CID TO SENSOR_BASE after 49 - Kernel Panic */ + +/* 12 Y/CbCr 4:2:0 64x32 macroblocks */ +#define V4L2_PIX_FMT_NV12T v4l2_fourcc('T', 'V', '1', '2') +#define V4L2_PIX_FMT_NV21T v4l2_fourcc('T', 'V', '2', '1') +#define V4L2_PIX_FMT_INTERLEAVED v4l2_fourcc('I', 'T', 'L', 'V') + +/* + * V4L2 extention for digital camera + */ +/* Strobe flash light */ +enum v4l2_strobe_control { + /* turn off the flash light */ + V4L2_STROBE_CONTROL_OFF = 0, + /* turn on the flash light */ + V4L2_STROBE_CONTROL_ON = 1, + /* act guide light before splash */ + V4L2_STROBE_CONTROL_AFGUIDE = 2, + /* charge the flash light */ + V4L2_STROBE_CONTROL_CHARGE = 3, +}; + +enum v4l2_strobe_conf { + V4L2_STROBE_OFF = 0, /* Always off */ + V4L2_STROBE_ON = 1, /* Always splashes */ + /* Auto control presets */ + V4L2_STROBE_AUTO = 2, + V4L2_STROBE_REDEYE_REDUCTION = 3, + V4L2_STROBE_SLOW_SYNC = 4, + V4L2_STROBE_FRONT_CURTAIN = 5, + V4L2_STROBE_REAR_CURTAIN = 6, + /* Extra manual control presets */ + /* keep turned on until turning off */ + V4L2_STROBE_PERMANENT = 7, + V4L2_STROBE_EXTERNAL = 8, +}; + +enum v4l2_strobe_status { + V4L2_STROBE_STATUS_OFF = 0, + /* while processing configurations */ + V4L2_STROBE_STATUS_BUSY = 1, + V4L2_STROBE_STATUS_ERR = 2, + V4L2_STROBE_STATUS_CHARGING = 3, + V4L2_STROBE_STATUS_CHARGED = 4, +}; + +/* capabilities field */ +/* No strobe supported */ +#define V4L2_STROBE_CAP_NONE 0x0000 +/* Always flash off mode */ +#define V4L2_STROBE_CAP_OFF 0x0001 +/* Always use flash light mode */ +#define V4L2_STROBE_CAP_ON 0x0002 +/* Flashlight works automatic */ +#define V4L2_STROBE_CAP_AUTO 0x0004 +/* Red-eye reduction */ +#define V4L2_STROBE_CAP_REDEYE 0x0008 +/* Slow sync */ +#define V4L2_STROBE_CAP_SLOWSYNC 0x0010 +/* Front curtain */ +#define V4L2_STROBE_CAP_FRONT_CURTAIN 0x0020 +/* Rear curtain */ +#define V4L2_STROBE_CAP_REAR_CURTAIN 0x0040 +/* keep turned on until turning off */ +#define V4L2_STROBE_CAP_PERMANENT 0x0080 +/* use external strobe */ +#define V4L2_STROBE_CAP_EXTERNAL 0x0100 + +/* Set mode and Get status */ +struct v4l2_strobe { + /* off/on/charge:0/1/2 */ + enum v4l2_strobe_control control; + /* supported strobe capabilities */ + __u32 capabilities; + enum v4l2_strobe_conf mode; + enum v4l2_strobe_status status; /* read only */ + /* default is 0 and range of value varies from each models */ + __u32 flash_ev; + __u32 reserved[4]; +}; + +#define VIDIOC_S_STROBE _IOWR('V', 83, struct v4l2_strobe) +#define VIDIOC_G_STROBE _IOR('V', 84, struct v4l2_strobe) + +/* Object recognition and collateral actions */ +enum v4l2_recog_mode { + V4L2_RECOGNITION_MODE_OFF = 0, + V4L2_RECOGNITION_MODE_ON = 1, + V4L2_RECOGNITION_MODE_LOCK = 2, +}; + +enum v4l2_recog_action { + V4L2_RECOGNITION_ACTION_NONE = 0, /* only recognition */ + V4L2_RECOGNITION_ACTION_BLINK = 1, /* Capture on blinking */ + V4L2_RECOGNITION_ACTION_SMILE = 2, /* Capture on smiling */ +}; + +enum v4l2_recog_pattern { + V4L2_RECOG_PATTERN_FACE = 0, /* Face */ + V4L2_RECOG_PATTERN_HUMAN = 1, /* Human */ + V4L2_RECOG_PATTERN_CHAR = 2, /* Character */ +}; + +struct v4l2_recog_rect { + enum v4l2_recog_pattern p; /* detected pattern */ + struct v4l2_rect o; /* detected area */ + __u32 reserved[4]; +}; + +struct v4l2_recog_data { + __u8 detect_cnt; /* detected object counter */ + struct v4l2_rect o; /* detected area */ + __u32 reserved[4]; +}; + +struct v4l2_recognition { + enum v4l2_recog_mode mode; + + /* Which pattern to detect */ + enum v4l2_recog_pattern pattern; + + /* How many object to detect */ + __u8 obj_num; + + /* select detected object */ + __u32 detect_idx; + + /* read only :Get object coordination */ + struct v4l2_recog_data data; + + enum v4l2_recog_action action; + __u32 reserved[4]; +}; + +#define VIDIOC_S_RECOGNITION _IOWR('V', 85, struct v4l2_recognition) +#define VIDIOC_G_RECOGNITION _IOR('V', 86, struct v4l2_recognition) +/* + * We use this struct as the v4l2_streamparm raw_data for + * VIDIOC_G_PARM and VIDIOC_S_PARM + */ +struct sec_cam_parm { + struct v4l2_captureparm capture; + int contrast; + int effects; + int brightness; + int flash_mode; + int focus_mode; + int iso; + int metering; + int saturation; + int scene_mode; + int sharpness; + int white_balance; + int fps; + int aeawb_lockunlock; + int zoom_ratio; +}; + +#endif /* __LINUX_VIDEODEV2_SAMSUNG_H */ diff --git a/libgscaler/Android.mk b/libgscaler/Android.mk new file mode 100644 index 0000000..c1d7f2f --- /dev/null +++ b/libgscaler/Android.mk @@ -0,0 +1,43 @@ +# Copyright (C) 2008 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifeq ($(filter-out exynos5,$(TARGET_BOARD_PLATFORM)),) + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_PRELINK_MODULE := false +LOCAL_SHARED_LIBRARIES := liblog libutils libcutils libexynosutils libexynosv4l2 libexynosscaler + +# to talk to secure side +LOCAL_SHARED_LIBRARIES += libMcClient +LOCAL_STATIC_LIBRARIES := libsecurepath + +LOCAL_C_INCLUDES := \ + $(LOCAL_PATH)/../include \ + $(TOP)/hardware/samsung_slsi/exynos/include \ + $(TOP)/hardware/samsung_slsi/exynos/libexynosutils \ + $(TOP)/hardware/samsung_slsi/exynos/libmpp + +LOCAL_SRC_FILES := \ + libgscaler_obj.cpp \ + libgscaler.cpp + +LOCAL_MODULE_TAGS := eng +LOCAL_MODULE := libexynosgscaler + +include $(TOP)/hardware/samsung_slsi/exynos/BoardConfigCFlags.mk +include $(BUILD_SHARED_LIBRARY) + +endif diff --git a/libgscaler/libgscaler_obj.cpp b/libgscaler/libgscaler_obj.cpp new file mode 100644 index 0000000..df82c74 --- /dev/null +++ b/libgscaler/libgscaler_obj.cpp @@ -0,0 +1,1661 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * Copyright@ Samsung Electronics Co. LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*! + * \file libgscaler_obj.cpp + * \brief source file for Gscaler HAL + * \author Sungchun Kang (sungchun.kang@samsung.com) + * \date 2013/06/01 + * + * Revision History: + * - 2013.06.01 : Sungchun Kang (sungchun.kang@samsung.com) \n + * Create + */ + +#include "libgscaler_obj.h" +#include "content_protect.h" + +int CGscaler::m_gsc_output_create(void *handle, int dev_num, int out_mode) +{ + Exynos_gsc_In(); + + struct media_device *media0; + struct media_entity *gsc_sd_entity; + struct media_entity *gsc_vd_entity; + struct media_entity *sink_sd_entity; + struct media_link *links; + char node[32]; + char devname[32]; + unsigned int cap; + int i; + int fd = 0; + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return -1; + } + + if ((out_mode != GSC_OUT_FIMD) && + (out_mode != GSC_OUT_TV)) + return -1; + + gsc->out_mode = out_mode; + /* GSCX => FIMD_WINX : arbitrary linking is not allowed */ + if ((out_mode == GSC_OUT_FIMD) && +#ifndef USES_ONLY_GSC0_GSC1 + (dev_num > 2)) +#else + (dev_num > 1)) +#endif + return -1; + + /* media0 */ + snprintf(node, sizeof(node), "%s%d", PFX_NODE_MEDIADEV, 0); + media0 = exynos_media_open(node); + if (media0 == NULL) { + ALOGE("%s::exynos_media_open failed (node=%s)", __func__, node); + return false; + } + gsc->mdev.media0 = media0; + + /* Get the sink subdev entity by name and make the node of sink subdev*/ + if (out_mode == GSC_OUT_FIMD) + snprintf(devname, sizeof(devname), PFX_FIMD_ENTITY, dev_num); + else + snprintf(devname, sizeof(devname), PFX_MXR_ENTITY, 0); + + sink_sd_entity = exynos_media_get_entity_by_name(media0, devname, + strlen(devname)); + if (!sink_sd_entity) { + ALOGE("%s:: failed to get the sink sd entity", __func__); + goto gsc_output_err; + } + gsc->mdev.sink_sd_entity = sink_sd_entity; + + sink_sd_entity->fd = exynos_subdev_open_devname(devname, O_RDWR); + if (sink_sd_entity->fd < 0) { + ALOGE("%s:: failed to open sink subdev node", __func__); + goto gsc_output_err; + } + + /* get GSC video dev & sub dev entity by name*/ +#if defined(USES_DT) + switch (dev_num) { + case 0: + snprintf(devname, sizeof(devname), PFX_GSC_VIDEODEV_ENTITY0); + break; + case 1: + snprintf(devname, sizeof(devname), PFX_GSC_VIDEODEV_ENTITY1); + break; + case 2: + snprintf(devname, sizeof(devname), PFX_GSC_VIDEODEV_ENTITY2); + break; + } +#else + snprintf(devname, sizeof(devname), PFX_GSC_VIDEODEV_ENTITY, dev_num); +#endif + gsc_vd_entity = exynos_media_get_entity_by_name(media0, devname, + strlen(devname)); + if (!gsc_vd_entity) { + ALOGE("%s:: failed to get the gsc vd entity", __func__); + goto gsc_output_err; + } + gsc->mdev.gsc_vd_entity = gsc_vd_entity; + + snprintf(devname, sizeof(devname), PFX_GSC_SUBDEV_ENTITY, dev_num); + gsc_sd_entity = exynos_media_get_entity_by_name(media0, devname, + strlen(devname)); + if (!gsc_sd_entity) { + ALOGE("%s:: failed to get the gsc sd entity", __func__); + goto gsc_output_err; + } + gsc->mdev.gsc_sd_entity = gsc_sd_entity; + + /* gsc sub-dev open */ + snprintf(devname, sizeof(devname), PFX_GSC_SUBDEV_ENTITY, dev_num); + gsc_sd_entity->fd = exynos_subdev_open_devname(devname, O_RDWR); + if (gsc_sd_entity->fd < 0) { + ALOGE("%s: gsc sub-dev open fail", __func__); + goto gsc_output_err; + } + + /* setup link : GSC : video device --> sub device */ + for (i = 0; i < (int) gsc_vd_entity->num_links; i++) { + links = &gsc_vd_entity->links[i]; + + if (links == NULL || + links->source->entity != gsc_vd_entity || + links->sink->entity != gsc_sd_entity) { + continue; + } else if (exynos_media_setup_link(media0, links->source, + links->sink, MEDIA_LNK_FL_ENABLED) < 0) { + ALOGE("%s::exynos_media_setup_link \ + [src.entity=%d->sink.entity=%d] failed", + __func__, links->source->entity->info.id, + links->sink->entity->info.id); + return -1; + } + } + + /* setup link : GSC: sub device --> sink device */ + for (i = 0; i < (int) gsc_sd_entity->num_links; i++) { + links = &gsc_sd_entity->links[i]; + + if (links == NULL || links->source->entity != gsc_sd_entity || + links->sink->entity != sink_sd_entity) { + continue; + } else if (exynos_media_setup_link(media0, links->source, + links->sink, MEDIA_LNK_FL_ENABLED) < 0) { + ALOGE("%s::exynos_media_setup_link \ + [src.entity=%d->sink.entity=%d] failed", + __func__, links->source->entity->info.id, + links->sink->entity->info.id); + return -1; + } + } + + /* gsc video-dev open */ +#if defined(USES_DT) + switch (dev_num) { + case 0: + snprintf(devname, sizeof(devname), PFX_GSC_VIDEODEV_ENTITY0); + break; + case 1: + snprintf(devname, sizeof(devname), PFX_GSC_VIDEODEV_ENTITY1); + break; + case 2: + snprintf(devname, sizeof(devname), PFX_GSC_VIDEODEV_ENTITY2); + break; + } +#else + snprintf(devname, sizeof(devname), PFX_GSC_VIDEODEV_ENTITY, dev_num); +#endif + gsc_vd_entity->fd = exynos_v4l2_open_devname(devname, O_RDWR); + if (gsc_vd_entity->fd < 0) { + ALOGE("%s: gsc video-dev open fail", __func__); + goto gsc_output_err; + } + + cap = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_OUTPUT_MPLANE; + + if (exynos_v4l2_querycap(gsc_vd_entity->fd, cap) == false) { + ALOGE("%s::exynos_v4l2_querycap() fail", __func__); + goto gsc_output_err; + } + + Exynos_gsc_Out(); + + return 0; + +gsc_output_err: + gsc->m_gsc_out_destroy(handle); + + return -1; +} + +int CGscaler::m_gsc_out_stop(void *handle) +{ + Exynos_gsc_In(); + + struct v4l2_requestbuffers reqbuf; + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return -1; + } + + if (gsc->src_info.stream_on == false) { + /* to handle special scenario.*/ + gsc->src_info.qbuf_cnt = 0; + ALOGD("%s::GSC is already stopped", __func__); + goto SKIP_STREAMOFF; + } + gsc->src_info.qbuf_cnt = 0; + gsc->src_info.stream_on = false; + + if (exynos_v4l2_streamoff(gsc->mdev.gsc_vd_entity->fd, + V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) < 0) { + ALOGE("%s::stream off failed", __func__); + return -1; + } + +SKIP_STREAMOFF: + Exynos_gsc_Out(); + + return 0; +} + +bool CGscaler::m_gsc_out_destroy(void *handle) +{ + Exynos_gsc_In(); + + struct media_link * links; + int i; + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return false; + } + + if (gsc->src_info.stream_on == true) { + if (gsc->m_gsc_out_stop(gsc) < 0) + ALOGE("%s::m_gsc_out_stop() fail", __func__); + + gsc->src_info.stream_on = false; + } + + if (gsc->mdev.media0 && gsc->mdev.gsc_sd_entity && + gsc->mdev.gsc_vd_entity && gsc->mdev.sink_sd_entity) { + + /* unlink : gscaler-out --> fimd */ + for (i = 0; i < (int) gsc->mdev.gsc_sd_entity->num_links; i++) { + links = &gsc->mdev.gsc_sd_entity->links[i]; + if (links == NULL || + links->source->entity != gsc->mdev.gsc_sd_entity || + links->sink->entity != gsc->mdev.sink_sd_entity) { + continue; + } else if (exynos_media_setup_link(gsc->mdev.media0, + links->source, links->sink, 0) < 0) { + ALOGE("%s::exynos_media_setup_unlink \ + [src.entity=%d->sink.entity=%d] failed", + __func__, links->source->entity->info.id, + links->sink->entity->info.id); + } + } + } + + if (gsc->mdev.gsc_vd_entity && gsc->mdev.gsc_vd_entity->fd > 0) { + close(gsc->mdev.gsc_vd_entity->fd); + gsc->mdev.gsc_vd_entity->fd = -1; + } + + if (gsc->mdev.gsc_sd_entity && gsc->mdev.gsc_sd_entity->fd > 0) { + close(gsc->mdev.gsc_sd_entity->fd); + gsc->mdev.gsc_sd_entity->fd = -1; + } + + if (gsc->mdev.sink_sd_entity && gsc->mdev.sink_sd_entity->fd > 0) { + close(gsc->mdev.sink_sd_entity->fd); + gsc->mdev.sink_sd_entity->fd = -1; + } + + if (gsc->mdev.media0) + exynos_media_close(gsc->mdev.media0); + + gsc->mdev.media0 = NULL; + gsc->mdev.gsc_sd_entity = NULL; + gsc->mdev.gsc_vd_entity = NULL; + gsc->mdev.sink_sd_entity = NULL; + + Exynos_gsc_Out(); + return true; +} + +int CGscaler::m_gsc_m2m_create(int dev) +{ + Exynos_gsc_In(); + + int fd = 0; + int video_node_num; + unsigned int cap; + char node[32]; + + switch(dev) { + case 0: + video_node_num = NODE_NUM_GSC_0; + break; + case 1: + video_node_num = NODE_NUM_GSC_1; + break; +#ifndef USES_ONLY_GSC0_GSC1 + case 2: + video_node_num = NODE_NUM_GSC_2; + break; + case 3: + video_node_num = NODE_NUM_GSC_3; + break; +#endif + default: + ALOGE("%s::unexpected dev(%d) fail", __func__, dev); + return -1; + break; + } + + snprintf(node, sizeof(node), "%s%d", PFX_NODE_GSC, video_node_num); + fd = exynos_v4l2_open(node, O_RDWR); + if (fd < 0) { + ALOGE("%s::exynos_v4l2_open(%s) fail", __func__, node); + return -1; + } + + cap = V4L2_CAP_STREAMING | + V4L2_CAP_VIDEO_OUTPUT_MPLANE | + V4L2_CAP_VIDEO_CAPTURE_MPLANE; + + if (exynos_v4l2_querycap(fd, cap) == false) { + ALOGE("%s::exynos_v4l2_querycap() fail", __func__); + close(fd); + fd = 0; + return -1; + } + + Exynos_gsc_Out(); + + return fd; +} + +bool CGscaler::m_gsc_find_and_create(void *handle) +{ + Exynos_gsc_In(); + + int i = 0; + bool flag_find_new_gsc = false; + unsigned int total_sleep_time = 0; + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return false; + } + + do { + for (i = 0; i < NUM_OF_GSC_HW; i++) { +#ifndef USES_ONLY_GSC0_GSC1 + if (i == 0 || i == 3) +#else + if (i == 0) +#endif + continue; + + gsc->gsc_id = i; + gsc->gsc_fd = gsc->m_gsc_m2m_create(i); + if (gsc->gsc_fd < 0) { + gsc->gsc_fd = 0; + continue; + } + + flag_find_new_gsc = true; + break; + } + + if (flag_find_new_gsc == false) { + usleep(GSC_WAITING_TIME_FOR_TRYLOCK); + total_sleep_time += GSC_WAITING_TIME_FOR_TRYLOCK; + ALOGV("%s::waiting for the gscaler availability", __func__); + } + + } while(flag_find_new_gsc == false + && total_sleep_time < MAX_GSC_WAITING_TIME_FOR_TRYLOCK); + + if (flag_find_new_gsc == false) + ALOGE("%s::we don't have any available gsc.. fail", __func__); + + Exynos_gsc_Out(); + + return flag_find_new_gsc; +} + +bool CGscaler::m_gsc_m2m_destroy(void *handle) +{ + Exynos_gsc_In(); + + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return false; + } + + /* + * just in case, we call stop here because we cannot afford to leave + * secure side protection on if things failed. + */ + gsc->m_gsc_m2m_stop(handle); + + if (gsc->gsc_id >= HW_SCAL0) { + bool ret = exynos_sc_free_and_close(gsc->scaler); + Exynos_gsc_Out(); + return ret; + } + + if (0 < gsc->gsc_fd) + close(gsc->gsc_fd); + gsc->gsc_fd = 0; + + Exynos_gsc_Out(); + + return true; +} + +int CGscaler::m_gsc_m2m_stop(void *handle) +{ + Exynos_gsc_In(); + + struct v4l2_requestbuffers req_buf; + int ret = 0; + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return -1; + } + + if (!gsc->src_info.stream_on && !gsc->dst_info.stream_on) { + /* wasn't streaming, return success */ + return 0; + } else if (gsc->src_info.stream_on != gsc->dst_info.stream_on) { + ALOGE("%s: invalid state, queue stream state doesn't match \ + (%d != %d)", __func__, gsc->src_info.stream_on, + gsc->dst_info.stream_on); + ret = -1; + } + + /* + * we need to plow forward on errors below to make sure that if we had + * turned on content protection on secure side, we turn it off. + * + * also, if we only failed to turn on one of the streams, we'll turn + * the other one off correctly. + */ + if (gsc->src_info.stream_on == true) { + if (exynos_v4l2_streamoff(gsc->gsc_fd, + gsc->src_info.buf.buf_type) < 0) { + ALOGE("%s::exynos_v4l2_streamoff(src) fail", __func__); + ret = -1; + } + gsc->src_info.stream_on = false; + } + + if (gsc->dst_info.stream_on == true) { + if (exynos_v4l2_streamoff(gsc->gsc_fd, + gsc->dst_info.buf.buf_type) < 0) { + ALOGE("%s::exynos_v4l2_streamoff(dst) fail", __func__); + ret = -1; + } + gsc->dst_info.stream_on = false; + } + + /* if drm is enabled */ + if (gsc->allow_drm && gsc->protection_enabled) { + unsigned int protect_id = 0; + + if (gsc->gsc_id == 0) + protect_id = CP_PROTECT_GSC0; + else if (gsc->gsc_id == 1) + protect_id = CP_PROTECT_GSC1; + else if (gsc->gsc_id == 2) + protect_id = CP_PROTECT_GSC3; + else if (gsc->gsc_id == 3) + protect_id = CP_PROTECT_GSC3; + + CP_Disable_Path_Protection(protect_id); + gsc->protection_enabled = false; + } + + if (exynos_v4l2_s_ctrl(gsc->gsc_fd, + V4L2_CID_CONTENT_PROTECTION, 0) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CONTENT_PROTECTION) fail", + __func__); + ret = -1; + } + + /* src: clear_buf */ + req_buf.count = 0; + req_buf.type = gsc->src_info.buf.buf_type; + req_buf.memory = gsc->src_info.buf.mem_type; + if (exynos_v4l2_reqbufs(gsc->gsc_fd, &req_buf) < 0) { + ALOGE("%s::exynos_v4l2_reqbufs():src: fail", __func__); + ret = -1; + } + + /* dst: clear_buf */ + req_buf.count = 0; + req_buf.type = gsc->dst_info.buf.buf_type; + req_buf.memory = gsc->dst_info.buf.mem_type;; + if (exynos_v4l2_reqbufs(gsc->gsc_fd, &req_buf) < 0) { + ALOGE("%s::exynos_v4l2_reqbufs():dst: fail", __func__); + ret = -1; + } + + Exynos_gsc_Out(); + + return ret; +} + +int CGscaler::m_gsc_m2m_run_core(void *handle) +{ + Exynos_gsc_In(); + + unsigned int rotate, hflip, vflip; + bool is_dirty; + bool is_drm; + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return -1; + } + + is_dirty = gsc->src_info.dirty || gsc->dst_info.dirty; + is_drm = gsc->src_info.mode_drm; + + if (is_dirty && (gsc->src_info.mode_drm != gsc->dst_info.mode_drm)) { + ALOGE("%s: drm mode mismatch between src and dst, \ + gsc%d (s=%d d=%d)", __func__, gsc->gsc_id, + gsc->src_info.mode_drm, gsc->dst_info.mode_drm); + return -1; + } else if (is_drm && !gsc->allow_drm) { + ALOGE("%s: drm mode is not supported on gsc%d", __func__, + gsc->gsc_id); + return -1; + } + + CGscaler::rotateValueHAL2GSC(gsc->dst_img.rot, &rotate, &hflip, &vflip); + + if (CGscaler::m_gsc_check_src_size(&gsc->src_info.width, + &gsc->src_info.height, &gsc->src_info.crop_left, + &gsc->src_info.crop_top, &gsc->src_info.crop_width, + &gsc->src_info.crop_height, gsc->src_info.v4l2_colorformat, + (rotate == 90 || rotate == 270)) == false) { + ALOGE("%s::m_gsc_check_src_size() fail", __func__); + return -1; + } + + if (CGscaler::m_gsc_check_dst_size(&gsc->dst_info.width, + &gsc->dst_info.height, &gsc->dst_info.crop_left, + &gsc->dst_info.crop_top, &gsc->dst_info.crop_width, + &gsc->dst_info.crop_height, gsc->dst_info.v4l2_colorformat, + gsc->dst_info.rotation) == false) { + ALOGE("%s::m_gsc_check_dst_size() fail", __func__); + return -1; + } + + /* dequeue buffers from previous work if necessary */ + if (gsc->src_info.stream_on == true) { + if (gsc->m_gsc_m2m_wait_frame_done(handle) < 0) { + ALOGE("%s::exynos_gsc_m2m_wait_frame_done fail", __func__); + return -1; + } + } + + /* + * need to set the content protection flag before doing reqbufs + * in set_format + */ + if (is_dirty && gsc->allow_drm && is_drm) { + if (exynos_v4l2_s_ctrl(gsc->gsc_fd, + V4L2_CID_CONTENT_PROTECTION, is_drm) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl() fail", __func__); + return -1; + } + } + + /* + * from this point on, we have to ensure to call stop to clean up + * whatever state we have set. + */ + + if (gsc->src_info.dirty) { + if (CGscaler::m_gsc_set_format(gsc->gsc_fd, &gsc->src_info) == false) { + ALOGE("%s::m_gsc_set_format(src) fail", __func__); + goto done; + } + gsc->src_info.dirty = false; + } + + if (gsc->dst_info.dirty) { + if (CGscaler::m_gsc_set_format(gsc->gsc_fd, &gsc->dst_info) == false) { + ALOGE("%s::m_gsc_set_format(dst) fail", __func__); + goto done; + } + gsc->dst_info.dirty = false; + } + + /* + * set up csc equation property + */ + if (is_dirty) { + if (exynos_v4l2_s_ctrl(gsc->gsc_fd, + V4L2_CID_CSC_EQ_MODE, gsc->eq_auto) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CSC_EQ_MODE) fail", __func__); + return -1; + } + + if (exynos_v4l2_s_ctrl(gsc->gsc_fd, + V4L2_CID_CSC_EQ, gsc->v4l2_colorspace) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CSC_EQ) fail", __func__); + return -1; + } + + if (exynos_v4l2_s_ctrl(gsc->gsc_fd, + V4L2_CID_CSC_RANGE, gsc->range_full) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CSC_RANGE) fail", __func__); + return -1; + } + } + + /* if we are enabling drm, make sure to enable hw protection. + * Need to do this before queuing buffers so that the mmu is reserved + * and power domain is kept on. + */ + if (is_dirty && gsc->allow_drm && is_drm) { + unsigned int protect_id = 0; + + if (gsc->gsc_id == 0) { + protect_id = CP_PROTECT_GSC0; + } else if (gsc->gsc_id == 1) { + protect_id = CP_PROTECT_GSC1; + } else if (gsc->gsc_id == 2) { + protect_id = CP_PROTECT_GSC2; + } else if (gsc->gsc_id == 3) { + protect_id = CP_PROTECT_GSC3; + } else { + ALOGE("%s::invalid gscaler id %d for content protection", + __func__, gsc->gsc_id); + goto done; + } + + if (CP_Enable_Path_Protection(protect_id) != 0) { + ALOGE("%s::CP_Enable_Path_Protection failed", __func__); + goto done; + } + gsc->protection_enabled = true; + } + + if (gsc->m_gsc_set_addr(gsc->gsc_fd, &gsc->src_info) == false) { + ALOGE("%s::m_gsc_set_addr(src) fail", __func__); + goto done; + } + + if (gsc->m_gsc_set_addr(gsc->gsc_fd, &gsc->dst_info) == false) { + ALOGE("%s::m_gsc_set_addr(dst) fail", __func__); + goto done; + } + + if (gsc->src_info.stream_on == false) { + if (exynos_v4l2_streamon(gsc->gsc_fd, gsc->src_info.buf.buf_type) < 0) { + ALOGE("%s::exynos_v4l2_streamon(src) fail", __func__); + goto done; + } + gsc->src_info.stream_on = true; + } + + if (gsc->dst_info.stream_on == false) { + if (exynos_v4l2_streamon(gsc->gsc_fd, gsc->dst_info.buf.buf_type) < 0) { + ALOGE("%s::exynos_v4l2_streamon(dst) fail", __func__); + goto done; + } + gsc->dst_info.stream_on = true; + } + + Exynos_gsc_Out(); + + return 0; + +done: + gsc->m_gsc_m2m_stop(handle); + return -1; +} + +bool CGscaler::m_gsc_check_src_size( + unsigned int *w, unsigned int *h, + unsigned int *crop_x, unsigned int *crop_y, + unsigned int *crop_w, unsigned int *crop_h, + int v4l2_colorformat, bool rotation) +{ + unsigned int minWidth, minHeight, shift = 0; + if (v4l2_colorformat == V4L2_PIX_FMT_RGB32 || v4l2_colorformat == V4L2_PIX_FMT_RGB565) + shift = 1; + if (rotation) { + minWidth = GSC_MIN_SRC_H_SIZE >> shift; + minHeight = GSC_MIN_SRC_W_SIZE >> shift; + } else { + minWidth = GSC_MIN_SRC_W_SIZE >> shift; + minHeight = GSC_MIN_SRC_H_SIZE >> shift; + } + + if (*w < minWidth || *h < minHeight) { + ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)", + __func__, GSC_MIN_SRC_W_SIZE, *w, GSC_MIN_SRC_H_SIZE, *h); + return false; + } + + if (*crop_w < minWidth || *crop_h < minHeight) { + ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)", + __func__, GSC_MIN_SRC_W_SIZE,* crop_w, GSC_MIN_SRC_H_SIZE, *crop_h); + return false; + } + + return true; +} + +bool CGscaler::m_gsc_check_dst_size( + unsigned int *w, unsigned int *h, + unsigned int *crop_x, unsigned int *crop_y, + unsigned int *crop_w, unsigned int *crop_h, + int v4l2_colorformat, + int rotation) +{ + if (*w < GSC_MIN_DST_W_SIZE || *h < GSC_MIN_DST_H_SIZE) { + ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)", + __func__, GSC_MIN_DST_W_SIZE, *w, GSC_MIN_DST_H_SIZE, *h); + return false; + } + + if (*crop_w < GSC_MIN_DST_W_SIZE || *crop_h < GSC_MIN_DST_H_SIZE) { + ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)", + __func__, GSC_MIN_DST_W_SIZE,* crop_w, GSC_MIN_DST_H_SIZE, *crop_h); + return false; + } + + return true; +} + + +int CGscaler::m_gsc_multiple_of_n(int number, int N) +{ + int result = number; + switch (N) { + case 1: + case 2: + case 4: + case 8: + case 16: + case 32: + case 64: + case 128: + case 256: + result = (number - (number & (N-1))); + break; + default: + result = number - (number % N); + break; + } + return result; +} + +int CGscaler::m_gsc_m2m_wait_frame_done(void *handle) +{ + Exynos_gsc_In(); + + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return -1; + } + + if ((gsc->src_info.stream_on == false) || + (gsc->dst_info.stream_on == false)) { + ALOGE("%s:: src_strean_on or dst_stream_on are false", __func__); + return -1; + } + + if (gsc->src_info.buf.buffer_queued) { + if (exynos_v4l2_dqbuf(gsc->gsc_fd, &gsc->src_info.buf.buffer) < 0) { + ALOGE("%s::exynos_v4l2_dqbuf(src) fail", __func__); + return -1; + } + gsc->src_info.buf.buffer_queued = false; + } + + if (gsc->dst_info.buf.buffer_queued) { + if (exynos_v4l2_dqbuf(gsc->gsc_fd, &gsc->dst_info.buf.buffer) < 0) { + ALOGE("%s::exynos_v4l2_dqbuf(dst) fail", __func__); + return -1; + } + gsc->dst_info.buf.buffer_queued = false; + } + + Exynos_gsc_Out(); + + return 0; +} + +bool CGscaler::m_gsc_set_format(int fd, GscInfo *info) +{ + Exynos_gsc_In(); + + struct v4l2_requestbuffers req_buf; + int plane_count; + + plane_count = m_gsc_get_plane_count(info->v4l2_colorformat); + if (plane_count < 0) { + ALOGE("%s::not supported v4l2_colorformat", __func__); + return false; + } + + if (exynos_v4l2_s_ctrl(fd, V4L2_CID_ROTATE, info->rotation) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_ROTATE) fail", __func__); + return false; + } + + if (exynos_v4l2_s_ctrl(fd, V4L2_CID_VFLIP, info->flip_horizontal) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_VFLIP) fail", __func__); + return false; + } + + if (exynos_v4l2_s_ctrl(fd, V4L2_CID_HFLIP, info->flip_vertical) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_HFLIP) fail", __func__); + return false; + } + + info->format.type = info->buf.buf_type; + info->format.fmt.pix_mp.width = info->width; + info->format.fmt.pix_mp.height = info->height; + info->format.fmt.pix_mp.pixelformat = info->v4l2_colorformat; + info->format.fmt.pix_mp.field = V4L2_FIELD_ANY; + info->format.fmt.pix_mp.num_planes = plane_count; + + if (exynos_v4l2_s_fmt(fd, &info->format) < 0) { + ALOGE("%s::exynos_v4l2_s_fmt() fail", __func__); + return false; + } + + info->crop.type = info->buf.buf_type; + info->crop.c.left = info->crop_left; + info->crop.c.top = info->crop_top; + info->crop.c.width = info->crop_width; + info->crop.c.height = info->crop_height; + + if (exynos_v4l2_s_crop(fd, &info->crop) < 0) { + ALOGE("%s::exynos_v4l2_s_crop() fail", __func__); + return false; + } + + if (exynos_v4l2_s_ctrl(fd, V4L2_CID_CACHEABLE, info->cacheable) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl() fail", __func__); + return false; + } + + req_buf.count = 1; + req_buf.type = info->buf.buf_type; + req_buf.memory = info->buf.mem_type; + if (exynos_v4l2_reqbufs(fd, &req_buf) < 0) { + ALOGE("%s::exynos_v4l2_reqbufs() fail", __func__); + return false; + } + + Exynos_gsc_Out(); + + return true; +} + +unsigned int CGscaler::m_gsc_get_plane_count(int v4l_pixel_format) +{ + int plane_count = 0; + + switch (v4l_pixel_format) { + case V4L2_PIX_FMT_RGB32: + case V4L2_PIX_FMT_BGR32: + case V4L2_PIX_FMT_RGB24: + case V4L2_PIX_FMT_RGB565: + case V4L2_PIX_FMT_RGB555X: + case V4L2_PIX_FMT_RGB444: + case V4L2_PIX_FMT_YUYV: + case V4L2_PIX_FMT_UYVY: + case V4L2_PIX_FMT_NV16: + case V4L2_PIX_FMT_NV61: + case V4L2_PIX_FMT_YVU420: + case V4L2_PIX_FMT_YUV420: + case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV21: + case V4L2_PIX_FMT_YUV422P: + plane_count = 1; + break; + case V4L2_PIX_FMT_NV12M: + case V4L2_PIX_FMT_NV12MT_16X16: + case V4L2_PIX_FMT_NV21M: + plane_count = 2; + break; + case V4L2_PIX_FMT_YVU420M: + case V4L2_PIX_FMT_YUV420M: + plane_count = 3; + break; + default: + ALOGE("%s::unmatched v4l_pixel_format color_space(0x%x)\n", + __func__, v4l_pixel_format); + plane_count = -1; + break; + } + + return plane_count; +} + +bool CGscaler::m_gsc_set_addr(int fd, GscInfo *info) +{ + unsigned int i; + unsigned int plane_size[NUM_OF_GSC_PLANES]; + + CGscaler::m_gsc_get_plane_size(plane_size, info->width, + info->height, info->v4l2_colorformat); + + info->buf.buffer.index = 0; + info->buf.buffer.flags = V4L2_BUF_FLAG_USE_SYNC; + info->buf.buffer.type = info->buf.buf_type; + info->buf.buffer.memory = info->buf.mem_type; + info->buf.buffer.m.planes = info->buf.planes; + info->buf.buffer.length = info->format.fmt.pix_mp.num_planes; + info->buf.buffer.reserved = info->acquireFenceFd; + + for (i = 0; i < info->format.fmt.pix_mp.num_planes; i++) { + if (info->buf.buffer.memory == V4L2_MEMORY_DMABUF) + info->buf.buffer.m.planes[i].m.fd = (int)info->buf.addr[i]; + else + info->buf.buffer.m.planes[i].m.userptr = + (unsigned long)info->buf.addr[i]; + info->buf.buffer.m.planes[i].length = plane_size[i]; + info->buf.buffer.m.planes[i].bytesused = 0; + } + + if (exynos_v4l2_qbuf(fd, &info->buf.buffer) < 0) { + ALOGE("%s::exynos_v4l2_qbuf() fail", __func__); + return false; + } + info->buf.buffer_queued = true; + + info->releaseFenceFd = info->buf.buffer.reserved; + + return true; +} + +unsigned int CGscaler::m_gsc_get_plane_size( + unsigned int *plane_size, + unsigned int width, + unsigned int height, + int v4l_pixel_format) +{ + switch (v4l_pixel_format) { + /* 1 plane */ + case V4L2_PIX_FMT_RGB32: + case V4L2_PIX_FMT_BGR32: + plane_size[0] = width * height * 4; + plane_size[1] = 0; + plane_size[2] = 0; + break; + case V4L2_PIX_FMT_RGB24: + plane_size[0] = width * height * 3; + plane_size[1] = 0; + plane_size[2] = 0; + break; + case V4L2_PIX_FMT_RGB565: + case V4L2_PIX_FMT_RGB555X: + case V4L2_PIX_FMT_RGB444: + case V4L2_PIX_FMT_YUYV: + case V4L2_PIX_FMT_UYVY: + plane_size[0] = width * height * 2; + plane_size[1] = 0; + plane_size[2] = 0; + break; + /* 2 planes */ + case V4L2_PIX_FMT_NV12M: + case V4L2_PIX_FMT_NV21M: + plane_size[0] = width * height; + plane_size[1] = width * (height / 2); + plane_size[2] = 0; + break; + case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV21: + plane_size[0] = width * height * 3 / 2; + plane_size[1] = 0; + plane_size[2] = 0; + break; + case V4L2_PIX_FMT_NV16: + case V4L2_PIX_FMT_NV61: + case V4L2_PIX_FMT_YUV422P: + plane_size[0] = width * height * 2; + plane_size[1] = 0; + plane_size[2] = 0; + break; + case V4L2_PIX_FMT_NV12MT_16X16: + plane_size[0] = ALIGN(width, 16) * ALIGN(height, 16); + plane_size[1] = ALIGN(width, 16) * ALIGN(height / 2, 8); + plane_size[2] = 0; + break; + /* 3 planes */ + case V4L2_PIX_FMT_YUV420M: + plane_size[0] = width * height; + plane_size[1] = (width / 2) * (height / 2); + plane_size[2] = (width / 2) * (height / 2); + break; + case V4L2_PIX_FMT_YVU420: + plane_size[0] = ALIGN(width, 16) * height + ALIGN(width / 2, 16) * height; + plane_size[1] = 0; + plane_size[2] = 0; + break; + case V4L2_PIX_FMT_YUV420: + plane_size[0] = width * height * 3 / 2; + plane_size[1] = 0; + plane_size[2] = 0; + break; + case V4L2_PIX_FMT_YVU420M: + plane_size[0] = ALIGN(width, 16) * height; + plane_size[1] = ALIGN(width / 2, 16) * (height / 2); + plane_size[2] = plane_size[1]; + break; + default: + ALOGE("%s::unmatched v4l_pixel_format color_space(0x%x)\n", + __func__, v4l_pixel_format); + return -1; + } + + return 0; +} + +int CGscaler::m_gsc_m2m_config(void *handle, + exynos_mpp_img *src_img, exynos_mpp_img *dst_img) +{ + Exynos_gsc_In(); + + int32_t src_color_space; + int32_t dst_color_space; + int ret; + unsigned int rotate; + unsigned int hflip; + unsigned int vflip; + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return -1; + } + + if ((src_img->drmMode && !gsc->allow_drm) || + (src_img->drmMode != dst_img->drmMode)) { + ALOGE("%s::invalid drm state request for gsc%d (s=%d d=%d)", + __func__, gsc->gsc_id, src_img->drmMode, dst_img->drmMode); + return -1; + } + + src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(src_img->format); + dst_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(dst_img->format); + CGscaler::rotateValueHAL2GSC(dst_img->rot, &rotate, &hflip, &vflip); + exynos_gsc_set_rotation(gsc, rotate, hflip, vflip); + + ret = exynos_gsc_set_src_format(gsc, src_img->fw, src_img->fh, + src_img->x, src_img->y, src_img->w, src_img->h, + src_color_space, src_img->cacheable, src_img->drmMode); + if (ret < 0) { + ALOGE("%s: fail: exynos_gsc_set_src_format \ + [fw %d fh %d x %d y %d w %d h %d f %x rot %d]", + __func__, src_img->fw, src_img->fh, src_img->x, src_img->y, + src_img->w, src_img->h, src_color_space, src_img->rot); + return -1; + } + + ret = exynos_gsc_set_dst_format(gsc, dst_img->fw, dst_img->fh, + dst_img->x, dst_img->y, dst_img->w, dst_img->h, + dst_color_space, dst_img->cacheable, dst_img->drmMode); + if (ret < 0) { + ALOGE("%s: fail: exynos_gsc_set_dst_format \ + [fw %d fh %d x %d y %d w %d h %d f %x rot %d]", + __func__, dst_img->fw, dst_img->fh, dst_img->x, dst_img->y, + dst_img->w, dst_img->h, src_color_space, dst_img->rot); + return -1; + } + + Exynos_gsc_Out(); + + return 0; +} + +int CGscaler::m_gsc_out_config(void *handle, + exynos_mpp_img *src_img, exynos_mpp_img *dst_img) +{ + Exynos_gsc_In(); + + struct v4l2_format fmt; + struct v4l2_crop crop; + struct v4l2_requestbuffers reqbuf; + struct v4l2_subdev_format sd_fmt; + struct v4l2_subdev_crop sd_crop; + int i; + unsigned int rotate; + unsigned int hflip; + unsigned int vflip; + unsigned int plane_size[NUM_OF_GSC_PLANES]; + bool rgb; + + struct v4l2_rect dst_rect; + int32_t src_color_space; + int32_t dst_color_space; + int32_t src_planes; + + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return -1; + } + + if (gsc->src_info.stream_on != false) { + ALOGE("Error: Src is already streamed on !!!!"); + return -1; + } + + memcpy(&gsc->src_img, src_img, sizeof(exynos_mpp_img)); + memcpy(&gsc->dst_img, dst_img, sizeof(exynos_mpp_img)); + src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(src_img->format); + dst_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(dst_img->format); + src_planes = m_gsc_get_plane_count(src_color_space); + src_planes = (src_planes == -1) ? 1 : src_planes; + rgb = get_yuv_planes(dst_color_space) == -1; + CGscaler::rotateValueHAL2GSC(dst_img->rot, &rotate, &hflip, &vflip); + + if (CGscaler::m_gsc_check_src_size(&gsc->src_img.fw, + &gsc->src_img.fh, &gsc->src_img.x, &gsc->src_img.y, + &gsc->src_img.w, &gsc->src_img.h, src_color_space, + (rotate == 90 || rotate == 270)) == false) { + ALOGE("%s::m_gsc_check_src_size() fail", __func__); + return -1; + } + + /*set: src v4l2_buffer*/ + gsc->src_info.buf.src_buf_idx = 0; + gsc->src_info.qbuf_cnt = 0; + /* set format: src pad of GSC sub-dev*/ + sd_fmt.pad = GSCALER_SUBDEV_PAD_SOURCE; + sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; + if (gsc->out_mode == GSC_OUT_FIMD) { + sd_fmt.format.width = gsc->dst_img.fw; + sd_fmt.format.height = gsc->dst_img.fh; + } else { + sd_fmt.format.width = gsc->dst_img.w; + sd_fmt.format.height = gsc->dst_img.h; + } + sd_fmt.format.code = rgb ? V4L2_MBUS_FMT_XRGB8888_4X8_LE : + V4L2_MBUS_FMT_YUV8_1X24; + if (exynos_subdev_s_fmt(gsc->mdev.gsc_sd_entity->fd, &sd_fmt) < 0) { + ALOGE("%s::GSC subdev set format failed", __func__); + return -1; + } + + /* set crop: src crop of GSC sub-dev*/ + sd_crop.pad = GSCALER_SUBDEV_PAD_SOURCE; + sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE; + if (gsc->out_mode == GSC_OUT_FIMD) { + sd_crop.rect.left = gsc->dst_img.x; + sd_crop.rect.top = gsc->dst_img.y; + sd_crop.rect.width = gsc->dst_img.w; + sd_crop.rect.height = gsc->dst_img.h; + } else { + sd_crop.rect.left = 0; + sd_crop.rect.top = 0; + sd_crop.rect.width = gsc->dst_img.w; + sd_crop.rect.height = gsc->dst_img.h; + } + + /* sink pad is connected to GSC out */ + /* set format: sink sub-dev */ + if (gsc->out_mode == GSC_OUT_FIMD) { + sd_fmt.pad = FIMD_SUBDEV_PAD_SINK; + sd_fmt.format.width = gsc->dst_img.w; + sd_fmt.format.height = gsc->dst_img.h; + } else { + sd_fmt.pad = MIXER_V_SUBDEV_PAD_SINK; + sd_fmt.format.width = gsc->dst_img.w + gsc->dst_img.x*2; + sd_fmt.format.height = gsc->dst_img.h + gsc->dst_img.y*2; + } + + sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; + sd_fmt.format.code = rgb ? V4L2_MBUS_FMT_XRGB8888_4X8_LE : + V4L2_MBUS_FMT_YUV8_1X24; + if (exynos_subdev_s_fmt(gsc->mdev.sink_sd_entity->fd, &sd_fmt) < 0) { + ALOGE("%s::sink:set format failed (PAD=%d)", __func__, + sd_fmt.pad); + return -1; + } + + /* set crop: sink sub-dev */ + if (gsc->out_mode == GSC_OUT_FIMD) + sd_crop.pad = FIMD_SUBDEV_PAD_SINK; + else + sd_crop.pad = MIXER_V_SUBDEV_PAD_SINK; + + sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE; + if (gsc->out_mode == GSC_OUT_FIMD) { + sd_crop.rect.left = gsc->dst_img.x; + sd_crop.rect.top = gsc->dst_img.y; + sd_crop.rect.width = gsc->dst_img.w; + sd_crop.rect.height = gsc->dst_img.h; + } else { + sd_crop.rect.left = 0; + sd_crop.rect.top = 0; + sd_crop.rect.width = gsc->dst_img.w; + sd_crop.rect.height = gsc->dst_img.h; + } + + if (gsc->out_mode != GSC_OUT_FIMD) { + sd_fmt.pad = MIXER_V_SUBDEV_PAD_SOURCE; + sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; + sd_fmt.format.width = gsc->dst_img.w + gsc->dst_img.x*2; + sd_fmt.format.height = gsc->dst_img.h + gsc->dst_img.y*2; + sd_fmt.format.code = V4L2_MBUS_FMT_XRGB8888_4X8_LE; + if (exynos_subdev_s_fmt(gsc->mdev.sink_sd_entity->fd, &sd_fmt) < 0) { + ALOGE("%s::sink:set format failed (PAD=%d)", __func__, + sd_fmt.pad); + return -1; + } + + sd_fmt.pad = MIXER_V_SUBDEV_PAD_SOURCE; + sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE; + sd_crop.rect.left = gsc->dst_img.x; + sd_crop.rect.top = gsc->dst_img.y; + sd_crop.rect.width = gsc->dst_img.w; + sd_crop.rect.height = gsc->dst_img.h; + if (exynos_subdev_s_crop(gsc->mdev.sink_sd_entity->fd, &sd_crop) < 0) { + ALOGE("%s::sink: subdev set crop failed(PAD=%d)", __func__, + sd_crop.pad); + return -1; + } + } + + /*set GSC ctrls */ + if (exynos_v4l2_s_ctrl(gsc->mdev.gsc_vd_entity->fd, V4L2_CID_ROTATE, + rotate) < 0) { + ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_ROTATE: %d) failed", + __func__, rotate); + return -1; + } + + if (exynos_v4l2_s_ctrl(gsc->mdev.gsc_vd_entity->fd, V4L2_CID_HFLIP, + vflip) < 0) { + ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_HFLIP: %d) failed", + __func__, vflip); + return -1; + } + + if (exynos_v4l2_s_ctrl(gsc->mdev.gsc_vd_entity->fd, V4L2_CID_VFLIP, + hflip) < 0) { + ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_VFLIP: %d) failed", + __func__, hflip); + return -1; + } + + if (exynos_v4l2_s_ctrl(gsc->mdev.gsc_vd_entity->fd, + V4L2_CID_CACHEABLE, 1) < 0) { + ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_CACHEABLE: 1) failed", + __func__); + return -1; + } + + if (exynos_v4l2_s_ctrl(gsc->mdev.gsc_vd_entity->fd, + V4L2_CID_CONTENT_PROTECTION, gsc->src_img.drmMode) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CONTENT_PROTECTION) fail", + __func__); + return -1; + } + + if (exynos_v4l2_s_ctrl(gsc->mdev.gsc_vd_entity->fd, + V4L2_CID_CSC_EQ_MODE, gsc->eq_auto) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CSC_EQ_MODE) fail", __func__); + return -1; + } + + if (exynos_v4l2_s_ctrl(gsc->mdev.gsc_vd_entity->fd, + V4L2_CID_CSC_EQ, gsc->v4l2_colorspace) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CSC_EQ) fail", __func__); + return -1; + } + + if (exynos_v4l2_s_ctrl(gsc->mdev.gsc_vd_entity->fd, + V4L2_CID_CSC_RANGE, gsc->range_full) < 0) { + ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CSC_RANGE) fail", __func__); + return -1; + } + + /* set src format :GSC video dev*/ + fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + fmt.fmt.pix_mp.width = gsc->src_img.fw; + fmt.fmt.pix_mp.height = gsc->src_img.fh; + fmt.fmt.pix_mp.pixelformat = src_color_space; + fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; + fmt.fmt.pix_mp.num_planes = src_planes; + + if (exynos_v4l2_s_fmt(gsc->mdev.gsc_vd_entity->fd, &fmt) < 0) { + ALOGE("%s::videodev set format failed", __func__); + return -1; + } + + /* set src crop info :GSC video dev*/ + crop.type = fmt.type; + crop.c.left = gsc->src_img.x; + crop.c.top = gsc->src_img.y; + crop.c.width = gsc->src_img.w; + crop.c.height = gsc->src_img.h; + + if (exynos_v4l2_s_crop(gsc->mdev.gsc_vd_entity->fd, &crop) < 0) { + ALOGE("%s::videodev set crop failed", __func__); + return -1; + } + + reqbuf.type = fmt.type; + reqbuf.memory = V4L2_MEMORY_DMABUF; + reqbuf.count = MAX_BUFFERS_GSCALER_OUT; + + if (exynos_v4l2_reqbufs(gsc->mdev.gsc_vd_entity->fd, &reqbuf) < 0) { + ALOGE("%s::request buffers failed", __func__); + return -1; + } + + Exynos_gsc_Out(); + + return 0; +} + +void CGscaler::rotateValueHAL2GSC(unsigned int transform, + unsigned int *rotate, unsigned int *hflip, unsigned int *vflip) +{ + int rotate_flag = transform & 0x7; + *rotate = 0; + *hflip = 0; + *vflip = 0; + + switch (rotate_flag) { + case HAL_TRANSFORM_ROT_90: + *rotate = 90; + break; + case HAL_TRANSFORM_ROT_180: + *rotate = 180; + break; + case HAL_TRANSFORM_ROT_270: + *rotate = 270; + break; + case HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90: + *rotate = 90; + *vflip = 1; /* set vflip to compensate the rot & flip order. */ + break; + case HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90: + *rotate = 90; + *hflip = 1; /* set hflip to compensate the rot & flip order. */ + break; + case HAL_TRANSFORM_FLIP_H: + *hflip = 1; + break; + case HAL_TRANSFORM_FLIP_V: + *vflip = 1; + break; + default: + break; + } +} + +int CGscaler::m_gsc_m2m_run(void *handle, + exynos_mpp_img *src_img, exynos_mpp_img *dst_img) +{ + Exynos_gsc_In(); + + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return -1; + } + void *addr[3] = {NULL, NULL, NULL}; + int ret = 0; + + addr[0] = (void *)src_img->yaddr; + addr[1] = (void *)src_img->uaddr; + addr[2] = (void *)src_img->vaddr; + ret = exynos_gsc_set_src_addr(handle, addr, src_img->mem_type, + src_img->acquireFenceFd); + if (ret < 0) { + ALOGE("%s::fail: exynos_gsc_set_src_addr[%x %x %x]", __func__, + (unsigned int)addr[0], (unsigned int)addr[1], + (unsigned int)addr[2]); + return -1; + } + + addr[0] = (void *)dst_img->yaddr; + addr[1] = (void *)dst_img->uaddr; + addr[2] = (void *)dst_img->vaddr; + ret = exynos_gsc_set_dst_addr(handle, addr, dst_img->mem_type, + dst_img->acquireFenceFd); + if (ret < 0) { + ALOGE("%s::fail: exynos_gsc_set_dst_addr[%x %x %x]", __func__, + (unsigned int)addr[0], (unsigned int)addr[1], + (unsigned int)addr[2]); + return -1; + } + + ret = gsc->m_gsc_m2m_run_core(handle); + if (ret < 0) { + ALOGE("%s::fail: m_gsc_m2m_run_core", __func__); + return -1; + } + + if (src_img->acquireFenceFd >= 0) { + close(src_img->acquireFenceFd); + src_img->acquireFenceFd = -1; + } + + if (dst_img->acquireFenceFd >= 0) { + close(dst_img->acquireFenceFd); + dst_img->acquireFenceFd = -1; + } + + src_img->releaseFenceFd = gsc->src_info.releaseFenceFd; + dst_img->releaseFenceFd = gsc->dst_info.releaseFenceFd; + + Exynos_gsc_Out(); + + return 0; +} + +int CGscaler::m_gsc_out_run(void *handle, exynos_mpp_img *src_img) +{ + struct v4l2_plane planes[NUM_OF_GSC_PLANES]; + struct v4l2_buffer buf; + int32_t src_color_space; + int32_t src_planes; + unsigned int i; + unsigned int plane_size[NUM_OF_GSC_PLANES]; + CGscaler* gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return -1; + } + + /* All buffers have been queued, dequeue one */ + if (gsc->src_info.qbuf_cnt == MAX_BUFFERS_GSCALER_OUT) { + memset(&buf, 0, sizeof(struct v4l2_buffer)); + for (i = 0; i < NUM_OF_GSC_PLANES; i++) + memset(&planes[i], 0, sizeof(struct v4l2_plane)); + + buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + buf.memory = V4L2_MEMORY_DMABUF; + buf.m.planes = planes; + + src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(gsc->src_img.format); + src_planes = m_gsc_get_plane_count(src_color_space); + src_planes = (src_planes == -1) ? 1 : src_planes; + buf.length = src_planes; + + + if (exynos_v4l2_dqbuf(gsc->mdev.gsc_vd_entity->fd, &buf) < 0) { + ALOGE("%s::dequeue buffer failed (index=%d)(mSrcBufNum=%d)", + __func__, gsc->src_info.buf.src_buf_idx, + MAX_BUFFERS_GSCALER_OUT); + return -1; + } + gsc->src_info.qbuf_cnt--; + } + + memset(&buf, 0, sizeof(struct v4l2_buffer)); + for (i = 0; i < NUM_OF_GSC_PLANES; i++) + memset(&planes[i], 0, sizeof(struct v4l2_plane)); + + src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(gsc->src_img.format); + src_planes = m_gsc_get_plane_count(src_color_space); + src_planes = (src_planes == -1) ? 1 : src_planes; + + buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + buf.memory = V4L2_MEMORY_DMABUF; + buf.flags = V4L2_BUF_FLAG_USE_SYNC; + buf.length = src_planes; + buf.index = gsc->src_info.buf.src_buf_idx; + buf.m.planes = planes; + buf.reserved = src_img->acquireFenceFd; + + gsc->src_info.buf.addr[0] = (void*)src_img->yaddr; + gsc->src_info.buf.addr[1] = (void*)src_img->uaddr; + gsc->src_info.buf.addr[2] = (void*)src_img->vaddr; + + if (CGscaler::tmp_get_plane_size(src_color_space, plane_size, + gsc->src_img.fw, gsc->src_img.fh, src_planes) != true) { + ALOGE("%s:get_plane_size:fail", __func__); + return -1; + } + + for (i = 0; i < buf.length; i++) { + buf.m.planes[i].m.fd = (int)gsc->src_info.buf.addr[i]; + buf.m.planes[i].length = plane_size[i]; + buf.m.planes[i].bytesused = plane_size[i]; + } + + /* Queue the buf */ + if (exynos_v4l2_qbuf(gsc->mdev.gsc_vd_entity->fd, &buf) < 0) { + ALOGE("%s::queue buffer failed (index=%d)(mSrcBufNum=%d)", + __func__, gsc->src_info.buf.src_buf_idx, + MAX_BUFFERS_GSCALER_OUT); + return -1; + } + gsc->src_info.buf.src_buf_idx++; + gsc->src_info.buf.src_buf_idx = + gsc->src_info.buf.src_buf_idx % MAX_BUFFERS_GSCALER_OUT; + gsc->src_info.qbuf_cnt++; + + if (gsc->src_info.stream_on == false) { + if (exynos_v4l2_streamon(gsc->mdev.gsc_vd_entity->fd, + (v4l2_buf_type)buf.type) < 0) { + ALOGE("%s::stream on failed", __func__); + return -1; + } + gsc->src_info.stream_on = true; + } + + src_img->releaseFenceFd = buf.reserved; + return 0; +} + +bool CGscaler::tmp_get_plane_size(int V4L2_PIX, + unsigned int * size, unsigned int width, unsigned int height, int src_planes) +{ + unsigned int frame_ratio = 1; + int src_bpp = get_yuv_bpp(V4L2_PIX); + unsigned int frame_size = width * height; + + src_planes = (src_planes == -1) ? 1 : src_planes; + frame_ratio = 8 * (src_planes -1) / (src_bpp - 8); + + switch (src_planes) { + case 1: + switch (V4L2_PIX) { + case V4L2_PIX_FMT_BGR32: + case V4L2_PIX_FMT_RGB32: + size[0] = frame_size << 2; + break; + case V4L2_PIX_FMT_RGB565: + case V4L2_PIX_FMT_NV16: + case V4L2_PIX_FMT_NV61: + case V4L2_PIX_FMT_YUYV: + case V4L2_PIX_FMT_UYVY: + case V4L2_PIX_FMT_VYUY: + case V4L2_PIX_FMT_YVYU: + size[0] = frame_size << 1; + break; + case V4L2_PIX_FMT_YUV420: + case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV21: + case V4L2_PIX_FMT_NV21M: + size[0] = (frame_size * 3) >> 1; + break; + case V4L2_PIX_FMT_YVU420: + size[0] = frame_size + (ALIGN((width >> 1), 16) * ((height >> 1) * 2)); + break; + default: + ALOGE("%s::invalid color type (%x)", __func__, V4L2_PIX); + return false; + break; + } + size[1] = 0; + size[2] = 0; + break; + case 2: + size[0] = frame_size; + size[1] = frame_size / frame_ratio; + size[2] = 0; + break; + case 3: + size[0] = frame_size; + size[1] = frame_size / frame_ratio; + size[2] = frame_size / frame_ratio; + break; + default: + ALOGE("%s::invalid color foarmt", __func__); + return false; + break; + } + + return true; +} + +int CGscaler::ConfigMpp(void *handle, exynos_mpp_img *src, + exynos_mpp_img *dst) +{ + return exynos_gsc_config_exclusive(handle, src, dst); +} + +int CGscaler::RunMpp(void *handle, exynos_mpp_img *src, + exynos_mpp_img *dst) +{ + return exynos_gsc_run_exclusive(handle, src, dst); +} + +int CGscaler::StopMpp(void *handle) +{ + return exynos_gsc_stop_exclusive(handle); +} + +void CGscaler::DestroyMpp(void *handle) +{ + return exynos_gsc_destroy(handle); +} + +int CGscaler::SetCSCProperty(void *handle, unsigned int eqAuto, + unsigned int fullRange, unsigned int colorspace) +{ + return exynos_gsc_set_csc_property(handle, eqAuto, fullRange, + colorspace); +} + +int CGscaler::FreeMpp(void *handle) +{ + return exynos_gsc_free_and_close(handle); +} + +int CGscaler::SetInputCrop(void *handle, + exynos_mpp_img *src_img, exynos_mpp_img *dst_img) +{ + struct v4l2_crop crop; + int ret = 0; + CGscaler *gsc = GetGscaler(handle); + if (gsc == NULL) { + ALOGE("%s::handle == NULL() fail", __func__); + return -1; + } + + crop.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + crop.c.left = src_img->x; + crop.c.top = src_img->y; + crop.c.width = src_img->w; + crop.c.height = src_img->h; + + return exynos_v4l2_s_crop(gsc->mdev.gsc_vd_entity->fd, &crop); +} diff --git a/libkeymaster/Android.mk b/libkeymaster/Android.mk new file mode 100644 index 0000000..32753a3 --- /dev/null +++ b/libkeymaster/Android.mk @@ -0,0 +1,33 @@ +# Copyright (C) 2012 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH := $(call my-dir) + + +include $(CLEAR_VARS) + +MOBICORE_PATH := hardware/samsung_slsi/$(TARGET_SOC)/mobicore + +LOCAL_MODULE := keystore.exynos5 +LOCAL_MODULE_RELATIVE_PATH := hw +LOCAL_SRC_FILES := keymaster_mobicore.cpp tlcTeeKeymaster_if.c +LOCAL_C_INCLUDES := \ + $(MOBICORE_PATH)/daemon/ClientLib/public \ + $(MOBICORE_PATH)/common/MobiCore/inc/ +LOCAL_C_FLAGS = -fvisibility=hidden -Wall -Werror +LOCAL_SHARED_LIBRARIES := libcrypto liblog libMcClient +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := SHARED_LIBRARIES + +include $(BUILD_SHARED_LIBRARY) diff --git a/libkeymaster/NOTICE b/libkeymaster/NOTICE new file mode 100644 index 0000000..316b4eb --- /dev/null +++ b/libkeymaster/NOTICE @@ -0,0 +1,190 @@ + + Copyright (c) 2014, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/libkeymaster/keymaster_mobicore.cpp b/libkeymaster/keymaster_mobicore.cpp new file mode 100644 index 0000000..0ef92e5 --- /dev/null +++ b/libkeymaster/keymaster_mobicore.cpp @@ -0,0 +1,503 @@ +/* + * Copyright (C) 2012 Samsung Electronics Co., LTD + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include + +#define LOG_TAG "ExynosKeyMaster" +#include + +#include + +#define RSA_KEY_BUFFER_SIZE 1536 +#define RSA_KEY_MAX_SIZE (2048 >> 3) + +struct BIGNUM_Delete { + void operator()(BIGNUM* p) const { + BN_free(p); + } +}; +typedef UniquePtr Unique_BIGNUM; + +struct EVP_PKEY_Delete { + void operator()(EVP_PKEY* p) const { + EVP_PKEY_free(p); + } +}; +typedef UniquePtr Unique_EVP_PKEY; + +struct PKCS8_PRIV_KEY_INFO_Delete { + void operator()(PKCS8_PRIV_KEY_INFO* p) const { + PKCS8_PRIV_KEY_INFO_free(p); + } +}; +typedef UniquePtr Unique_PKCS8_PRIV_KEY_INFO; + +struct RSA_Delete { + void operator()(RSA* p) const { + RSA_free(p); + } +}; +typedef UniquePtr Unique_RSA; + +typedef UniquePtr Unique_keymaster0_device_t; + +/** + * Many OpenSSL APIs take ownership of an argument on success but don't free the argument + * on failure. This means we need to tell our scoped pointers when we've transferred ownership, + * without triggering a warning by not using the result of release(). + */ +#define OWNERSHIP_TRANSFERRED(obj) \ + typeof (obj.release()) _dummy __attribute__((unused)) = obj.release() + +/* + * Checks this thread's error queue and logs if necessary. + */ +static void logOpenSSLError(const char* location) { + int error = ERR_get_error(); + + if (error != 0) { + char message[256]; + ERR_error_string_n(error, message, sizeof(message)); + ALOGE("OpenSSL error in %s %d: %s", location, error, message); + } + + ERR_clear_error(); + ERR_remove_state(0); +} + +static int exynos_km_generate_keypair(const keymaster0_device_t*, + const keymaster_keypair_t key_type, const void* key_params, + uint8_t** keyBlob, size_t* keyBlobLength) { + teeResult_t ret = TEE_ERR_NONE; + + if (key_type != TYPE_RSA) { + ALOGE("Unsupported key type %d", key_type); + return -1; + } else if (key_params == NULL) { + ALOGE("key_params == null"); + return -1; + } + + keymaster_rsa_keygen_params_t* rsa_params = (keymaster_rsa_keygen_params_t*) key_params; + + if ((rsa_params->modulus_size != 512) && + (rsa_params->modulus_size != 1024) && + (rsa_params->modulus_size != 2048)) { + ALOGE("key size(%d) is not supported\n", rsa_params->modulus_size); + return -1; + } + + UniquePtr keyDataPtr(reinterpret_cast(malloc(RSA_KEY_BUFFER_SIZE))); + if (keyDataPtr.get() == NULL) { + ALOGE("memory allocation is failed"); + return -1; + } + + ret = TEE_RSAGenerateKeyPair(TEE_KEYPAIR_RSACRT, keyDataPtr.get(), RSA_KEY_BUFFER_SIZE, + rsa_params->modulus_size, (uint32_t)rsa_params->public_exponent, + (uint32_t *)keyBlobLength); + if (ret != TEE_ERR_NONE) { + ALOGE("TEE_RSAGenerateKeyPair() is failed: %d", ret); + return -1; + } + + *keyBlob = keyDataPtr.release(); + + return 0; +} + +static int exynos_km_import_keypair(const keymaster0_device_t*, + const uint8_t* key, const size_t key_length, + uint8_t** key_blob, size_t* key_blob_length) { + uint8_t kbuf[RSA_KEY_BUFFER_SIZE]; + teeRsaKeyMeta_t metadata; + uint32_t key_len = 0; + BIGNUM *tmp = NULL; + BN_CTX *ctx = NULL; + teeResult_t ret = TEE_ERR_NONE; + + if (key == NULL) { + ALOGE("input key == NULL"); + return -1; + } else if (key_blob == NULL || key_blob_length == NULL) { + ALOGE("output key blob or length == NULL"); + return -1; + } + + /* decoding */ + Unique_PKCS8_PRIV_KEY_INFO pkcs8(d2i_PKCS8_PRIV_KEY_INFO(NULL, &key, key_length)); + if (pkcs8.get() == NULL) { + logOpenSSLError("pkcs4.get"); + return -1; + } + + /* assign to EVP */ + Unique_EVP_PKEY pkey(EVP_PKCS82PKEY(pkcs8.get())); + if (pkey.get() == NULL) { + logOpenSSLError("pkey.get"); + return -1; + } + OWNERSHIP_TRANSFERRED(pkcs8); + + /* change key format */ + Unique_RSA rsa(EVP_PKEY_get1_RSA(pkey.get())); + if (rsa.get() == NULL) { + logOpenSSLError("get rsa key format"); + return -1; + } + + if (BN_cmp(rsa->p, rsa->q) < 0) { + /* p <-> q */ + tmp = rsa->p; + rsa->p = rsa->q; + rsa->q = tmp; + /* dp <-> dq */ + tmp = rsa->dmp1; + rsa->dmp1 = rsa->dmq1; + rsa->dmq1 = tmp; + /* calulate inverse of q mod p */ + ctx = BN_CTX_new(); + if (!BN_mod_inverse(rsa->iqmp, rsa->q, rsa->p, ctx)) { + ALOGE("Calculating inverse of q mod p is failed\n"); + BN_CTX_free(ctx); + return -1; + } + BN_CTX_free(ctx); + } + + key_len += sizeof(metadata); + + metadata.lenpubmod = BN_bn2bin(rsa->n, kbuf + key_len); + key_len += metadata.lenpubmod; + if (metadata.lenpubmod == (512 >> 3)) + metadata.keysize = TEE_RSA_KEY_SIZE_512; + else if (metadata.lenpubmod == (1024 >> 3)) + metadata.keysize = TEE_RSA_KEY_SIZE_1024; + else if (metadata.lenpubmod == (2048 >> 3)) + metadata.keysize = TEE_RSA_KEY_SIZE_2048; + else { + ALOGE("key size(%d) is not supported\n", metadata.lenpubmod << 3); + return -1; + } + + metadata.lenpubexp = BN_bn2bin(rsa->e, kbuf + key_len); + key_len += metadata.lenpubexp; + + if ((rsa->p != NULL) && (rsa->q != NULL) && (rsa->dmp1 != NULL) && + (rsa->dmq1 != NULL) && (rsa->iqmp != NULL)) + { + metadata.keytype = TEE_KEYPAIR_RSACRT; + metadata.rsacrtpriv.lenp = BN_bn2bin(rsa->p, kbuf + key_len); + key_len += metadata.rsacrtpriv.lenp; + metadata.rsacrtpriv.lenq = BN_bn2bin(rsa->q, kbuf + key_len); + key_len += metadata.rsacrtpriv.lenq; + metadata.rsacrtpriv.lendp = BN_bn2bin(rsa->dmp1, kbuf + key_len); + key_len += metadata.rsacrtpriv.lendp; + metadata.rsacrtpriv.lendq = BN_bn2bin(rsa->dmq1, kbuf + key_len); + key_len += metadata.rsacrtpriv.lendq; + metadata.rsacrtpriv.lenqinv = BN_bn2bin(rsa->iqmp, kbuf + key_len); + key_len += metadata.rsacrtpriv.lenqinv; + } else { + metadata.keytype = TEE_KEYPAIR_RSA; + metadata.rsapriv.lenpriexp = BN_bn2bin(rsa->d, kbuf + key_len); + key_len += metadata.rsapriv.lenpriexp; + } + + metadata.rfu = 0; + metadata.rfulen = 0; + + memcpy(kbuf, &metadata, sizeof(metadata)); + + UniquePtr outPtr(reinterpret_cast(malloc(RSA_KEY_BUFFER_SIZE))); + if (outPtr.get() == NULL) { + ALOGE("memory allocation is failed"); + return -1; + } + + *key_blob_length = RSA_KEY_BUFFER_SIZE; + + ret = TEE_KeyImport(kbuf, key_len, outPtr.get(), (uint32_t *)key_blob_length); + if (ret != TEE_ERR_NONE) { + ALOGE("TEE_KeyImport() is failed: %d", ret); + return -1; + } + + *key_blob = outPtr.release(); + + return 0; +} + +static int exynos_km_get_keypair_public(const struct keymaster0_device*, + const uint8_t* key_blob, const size_t key_blob_length, + uint8_t** x509_data, size_t* x509_data_length) { + uint32_t bin_mod_len; + uint32_t bin_exp_len; + teeResult_t ret = TEE_ERR_NONE; + + if (x509_data == NULL || x509_data_length == NULL) { + ALOGE("output public key buffer == NULL"); + return -1; + } + + UniquePtr binModPtr(reinterpret_cast(malloc(RSA_KEY_MAX_SIZE))); + if (binModPtr.get() == NULL) { + ALOGE("memory allocation is failed"); + return -1; + } + + UniquePtr binExpPtr(reinterpret_cast(malloc(sizeof(uint32_t)))); + if (binExpPtr.get() == NULL) { + ALOGE("memory allocation is failed"); + return -1; + } + + bin_mod_len = RSA_KEY_MAX_SIZE; + bin_exp_len = sizeof(uint32_t); + + ret = TEE_GetPubKey(key_blob, key_blob_length, binModPtr.get(), &bin_mod_len, binExpPtr.get(), + &bin_exp_len); + if (ret != TEE_ERR_NONE) { + ALOGE("TEE_GetPubKey() is failed: %d", ret); + return -1; + } + + Unique_BIGNUM bn_mod(BN_new()); + if (bn_mod.get() == NULL) { + ALOGE("memory allocation is failed"); + return -1; + } + + Unique_BIGNUM bn_exp(BN_new()); + if (bn_exp.get() == NULL) { + ALOGE("memory allocation is failed"); + return -1; + } + + BN_bin2bn(binModPtr.get(), bin_mod_len, bn_mod.get()); + BN_bin2bn(binExpPtr.get(), bin_exp_len, bn_exp.get()); + + /* assign to RSA */ + Unique_RSA rsa(RSA_new()); + if (rsa.get() == NULL) { + logOpenSSLError("rsa.get"); + return -1; + } + + RSA* rsa_tmp = rsa.get(); + + rsa_tmp->n = bn_mod.release(); + rsa_tmp->e = bn_exp.release(); + + /* assign to EVP */ + Unique_EVP_PKEY pkey(EVP_PKEY_new()); + if (pkey.get() == NULL) { + logOpenSSLError("allocate EVP_PKEY"); + return -1; + } + + if (EVP_PKEY_assign_RSA(pkey.get(), rsa.get()) == 0) { + logOpenSSLError("assing RSA to EVP_PKEY"); + return -1; + } + OWNERSHIP_TRANSFERRED(rsa); + + /* change to x.509 format */ + int len = i2d_PUBKEY(pkey.get(), NULL); + if (len <= 0) { + logOpenSSLError("i2d_PUBKEY"); + return -1; + } + + UniquePtr key(static_cast(malloc(len))); + if (key.get() == NULL) { + ALOGE("Could not allocate memory for public key data"); + return -1; + } + + unsigned char* tmp = reinterpret_cast(key.get()); + if (i2d_PUBKEY(pkey.get(), &tmp) != len) { + logOpenSSLError("Compare results"); + return -1; + } + + *x509_data_length = len; + *x509_data = key.release(); + + return 0; +} + +static int exynos_km_sign_data(const keymaster0_device_t*, + const void* params, + const uint8_t* keyBlob, const size_t keyBlobLength, + const uint8_t* data, const size_t dataLength, + uint8_t** signedData, size_t* signedDataLength) { + teeResult_t ret = TEE_ERR_NONE; + + if (data == NULL) { + ALOGE("input data to sign == NULL"); + return -1; + } else if (signedData == NULL || signedDataLength == NULL) { + ALOGE("output signature buffer == NULL"); + return -1; + } + + keymaster_rsa_sign_params_t* sign_params = (keymaster_rsa_sign_params_t*) params; + if (sign_params->digest_type != DIGEST_NONE) { + ALOGE("Cannot handle digest type %d", sign_params->digest_type); + return -1; + } else if (sign_params->padding_type != PADDING_NONE) { + ALOGE("Cannot handle padding type %d", sign_params->padding_type); + return -1; + } + + UniquePtr signedDataPtr(reinterpret_cast(malloc(RSA_KEY_MAX_SIZE))); + if (signedDataPtr.get() == NULL) { + ALOGE("memory allocation is failed"); + return -1; + } + + *signedDataLength = RSA_KEY_MAX_SIZE; + + /* binder gives us read-only mappings we can't use with mobicore */ + void *tmpData = malloc(dataLength); + memcpy(tmpData, data, dataLength); + ret = TEE_RSASign(keyBlob, keyBlobLength, (const uint8_t *)tmpData, dataLength, signedDataPtr.get(), + (uint32_t *)signedDataLength, TEE_RSA_NODIGEST_NOPADDING); + free(tmpData); + if (ret != TEE_ERR_NONE) { + ALOGE("TEE_RSASign() is failed: %d", ret); + return -1; + } + + *signedData = signedDataPtr.release(); + + return 0; +} + +static int exynos_km_verify_data(const keymaster0_device_t*, + const void* params, + const uint8_t* keyBlob, const size_t keyBlobLength, + const uint8_t* signedData, const size_t signedDataLength, + const uint8_t* signature, const size_t signatureLength) { + bool result; + teeResult_t ret = TEE_ERR_NONE; + + if (signedData == NULL || signature == NULL) { + ALOGE("data or signature buffers == NULL"); + return -1; + } + + keymaster_rsa_sign_params_t* sign_params = (keymaster_rsa_sign_params_t*) params; + if (sign_params->digest_type != DIGEST_NONE) { + ALOGE("Cannot handle digest type %d", sign_params->digest_type); + return -1; + } else if (sign_params->padding_type != PADDING_NONE) { + ALOGE("Cannot handle padding type %d", sign_params->padding_type); + return -1; + } else if (signatureLength != signedDataLength) { + ALOGE("signed data length must be signature length"); + return -1; + } + + void *tmpSignedData = malloc(signedDataLength); + memcpy(tmpSignedData, signedData, signedDataLength); + void *tmpSig = malloc(signatureLength); + memcpy(tmpSig, signature, signatureLength); + ret = TEE_RSAVerify(keyBlob, keyBlobLength, (const uint8_t*)tmpSignedData, signedDataLength, (const uint8_t *)tmpSig, + signatureLength, TEE_RSA_NODIGEST_NOPADDING, &result); + free(tmpSignedData); + free(tmpSig); + if (ret != TEE_ERR_NONE) { + ALOGE("TEE_RSAVerify() is failed: %d", ret); + return -1; + } + + return (result == true) ? 0 : -1; +} + +/* Close an opened Exynos KM instance */ +static int exynos_km_close(hw_device_t *dev) { + free(dev); + return 0; +} + +/* + * Generic device handling + */ +static int exynos_km_open(const hw_module_t* module, const char* name, + hw_device_t** device) { + if (strcmp(name, KEYSTORE_KEYMASTER) != 0) + return -EINVAL; + + Unique_keymaster0_device_t dev(new keymaster0_device_t); + if (dev.get() == NULL) + return -ENOMEM; + + dev->common.tag = HARDWARE_DEVICE_TAG; + dev->common.version = 1; + dev->common.module = (struct hw_module_t*) module; + dev->common.close = exynos_km_close; + + dev->flags = 0; + + dev->generate_keypair = exynos_km_generate_keypair; + dev->import_keypair = exynos_km_import_keypair; + dev->get_keypair_public = exynos_km_get_keypair_public; + dev->delete_keypair = NULL; + dev->delete_all = NULL; + dev->sign_data = exynos_km_sign_data; + dev->verify_data = exynos_km_verify_data; + + ERR_load_crypto_strings(); + ERR_load_BIO_strings(); + + *device = reinterpret_cast(dev.release()); + + return 0; +} + +static struct hw_module_methods_t keystore_module_methods = { + open: exynos_km_open, +}; + +struct keystore_module HAL_MODULE_INFO_SYM +__attribute__ ((visibility ("default"))) = { + common: { + tag: HARDWARE_MODULE_TAG, + version_major: 1, + version_minor: 0, + id: KEYSTORE_HARDWARE_MODULE_ID, + name: "Keymaster Exynos HAL", + author: "Samsung S.LSI", + methods: &keystore_module_methods, + dso: 0, + reserved: {}, + }, +}; diff --git a/libkeymaster/tci.h b/libkeymaster/tci.h new file mode 100644 index 0000000..0979df3 --- /dev/null +++ b/libkeymaster/tci.h @@ -0,0 +1,85 @@ +/** + * @file tci.h + * @brief Contains TCI (Trustlet Control + * Interface) definitions and data structures + * + * Copyright Giesecke & Devrient GmbH 2012 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __TCI_H__ +#define __TCI_H__ + + +typedef uint32_t tciCommandId_t; +typedef uint32_t tciResponseId_t; +typedef uint32_t tciReturnCode_t; + + +/**< Responses have bit 31 set */ +#define RSP_ID_MASK (1U << 31) +#define RSP_ID(cmdId) (((uint32_t)(cmdId)) | RSP_ID_MASK) +#define IS_CMD(cmdId) ((((uint32_t)(cmdId)) & RSP_ID_MASK) == 0) +#define IS_RSP(cmdId) ((((uint32_t)(cmdId)) & RSP_ID_MASK) == RSP_ID_MASK) + + +/** + * Return codes + */ +#define RET_OK 0 +#define RET_ERR_UNKNOWN_CMD 1 +#define RET_ERR_NOT_SUPPORTED 2 +#define RET_ERR_INVALID_BUFFER 3 +#define RET_ERR_INVALID_KEY_SIZE 4 +#define RET_ERR_INVALID_KEY_TYPE 5 +#define RET_ERR_INVALID_LENGTH 6 +#define RET_ERR_INVALID_EXPONENT 7 +#define RET_ERR_KEY_GENERATION 8 +#define RET_ERR_SIGN 9 +#define RET_ERR_VERIFY 10 +#define RET_ERR_DIGEST 11 +#define RET_ERR_SECURE_OBJECT 12 +#define RET_ERR_INTERNAL_ERROR 13 +/* ... add more error codes when needed */ + + +/** + * TCI command header. + */ +typedef struct{ + tciCommandId_t commandId; /**< Command ID */ +} tciCommandHeader_t; + + +/** + * TCI response header. + */ +typedef struct{ + tciResponseId_t responseId; /**< Response ID (must be command ID | RSP_ID_MASK )*/ + tciReturnCode_t returnCode; /**< Return code of command */ +} tciResponseHeader_t; + +#endif // __TCI_H__ diff --git a/libkeymaster/tlTeeKeymaster_Api.h b/libkeymaster/tlTeeKeymaster_Api.h new file mode 100644 index 0000000..24adeca --- /dev/null +++ b/libkeymaster/tlTeeKeymaster_Api.h @@ -0,0 +1,262 @@ +/** + * @file tlTeeKeymaster_Api.h + * @brief Contains TCI command definitions and data structures + * + * Copyright Giesecke & Devrient GmbH 2012 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __TLTEEKEYMASTERAPI_H__ +#define __TLTEEKEYMASTERAPI_H__ + +#include "tci.h" + + + +/** + * Command ID's + */ +#define CMD_ID_TEE_RSA_GEN_KEY_PAIR 1 +#define CMD_ID_TEE_RSA_SIGN 2 +#define CMD_ID_TEE_RSA_VERIFY 3 +#define CMD_ID_TEE_HMAC_GEN_KEY 4 +#define CMD_ID_TEE_HMAC_SIGN 5 +#define CMD_ID_TEE_HMAC_VERIFY 6 +#define CMD_ID_TEE_KEY_IMPORT 7 +#define CMD_ID_TEE_GET_PUB_KEY 8 +/*... add more command ids when needed */ + + +/** + * Command message. + * + * @param len Length of the data to process. + * @param data Data to be processed + */ +typedef struct { + tciCommandHeader_t header; /**< Command header */ + uint32_t len; /**< Length of data to process */ +} command_t; + + +/** + * Response structure + */ +typedef struct { + tciResponseHeader_t header; /**< Response header */ + uint32_t len; +} response_t; + + +/** + * Generate key data + * Response data contains generated RSA key pair data is + * wrapped as below: + * + * |-- Key metadata --|-- Public key (plaintext) --|-- Private key (encrypted) --| + */ +typedef struct { + uint32_t type; /**< Key pair type. RSA or RSACRT */ + uint32_t keysize; /**< Key size in bits, e.g. 1024, 2048,.. */ + uint32_t exponent; /**< Exponent number */ + uint32_t keydata; /**< Key data buffer passed by TLC */ + uint32_t keydatalen; /**< Length of key data buffer */ + uint32_t solen; /**< Secure object length (of key data) (provided by the trustlet) */ +} rsagenkey_t; + + +/** + * RSA sign data structure + */ +typedef struct { + uint32_t keydata; /**< Key data buffer */ + uint32_t keydatalen; /**< Length of key data buffer */ + uint32_t plaindata; /**< Plaintext data buffer */ + uint32_t plaindatalen; /**< Length of plaintext data buffer */ + uint32_t signaturedata; /**< Signature data buffer */ + uint32_t signaturedatalen; /**< Length of signature data buffer */ + uint32_t algorithm; /**< Signing algorithm */ +} rsasign_t; + + +/** + * RSA signature verify data structure + */ +typedef struct { + uint32_t keydata; /**< Key data buffer */ + uint32_t keydatalen; /**< Length of key data buffer */ + uint32_t plaindata; /**< Plaintext data buffer */ + uint32_t plaindatalen; /**< Length of plaintext data buffer */ + uint32_t signaturedata; /**< Signature data buffer */ + uint32_t signaturedatalen; /**< Length of signature data buffer */ + uint32_t algorithm; /**< Signing algorithm */ + bool validity; /**< Signature validity */ +} rsaverify_t; + + +/** + * Generate HMAC key data + * Response data contains generated HMAC key data that is + * wrapped as below: + * + * |-- HMAC key (encrypted) --| + */ +typedef struct { + uint32_t keydata; /**< Key data buffer passed by TLC */ + uint32_t keydatalen; /**< Length of key data buffer */ + uint32_t solen; /**< Secure object length (of key data) (provided by the trustlet) */ +} hmacgenkey_t; + + +/** + * HMAC sign data structure + */ +typedef struct { + uint32_t keydata; /**< Key data buffer */ + uint32_t keydatalen; /**< Length of key data buffer */ + uint32_t plaindata; /**< Plaintext data buffer */ + uint32_t plaindatalen; /**< Length of plaintext data buffer */ + uint32_t signaturedata; /**< Signature data buffer */ + uint32_t signaturedatalen; /**< Length of signature data buffer */ + uint32_t digest; /**< Digest algorithm */ +} hmacsign_t; + + +/** + * HMAC signature verify data structure + */ +typedef struct { + uint32_t keydata; /**< Key data buffer */ + uint32_t keydatalen; /**< Length of key data buffer */ + uint32_t plaindata; /**< Plaintext data buffer */ + uint32_t plaindatalen; /**< Length of plaintext data buffer */ + uint32_t signaturedata; /**< Signature data buffer */ + uint32_t signaturedatalen; /**< Length of signature data buffer */ + uint32_t digest; /**< Digest algorithm */ + bool validity; /**< Signature validity */ +} hmacverify_t; + +/** + * RSA private key metadata (Private modulus and exponent lengths) + */ +typedef struct { + uint32_t lenprimod; /**< Private key modulus length */ + uint32_t lenpriexp; /**< Private key exponent length */ +} rsaprivkeymeta_t; + + +/** + * RSA CRT private key metadata + */ +typedef struct { + uint32_t lenprimod; /**< Private key modulus length */ + uint32_t lenp; /**< Prime p length */ + uint32_t lenq; /**< Prime q length */ + uint32_t lendp; /**< DP length */ + uint32_t lendq; /**< DQ length */ + uint32_t lenqinv; /**< QP length */ +} rsacrtprivkeymeta_t; + + +/** + * Key metadata (key size, modulus/exponent lengths, etc..) + */ +typedef struct { + uint32_t keytype; /**< RSA key pair type. RSA or RSA CRT */ + uint32_t keysize; /**< RSA key size */ + uint32_t lenpubmod; /**< Public key modulus length */ + uint32_t lenpubexp; /**< Public key exponent length */ + union { + rsaprivkeymeta_t rsapriv; /**< RSA private key */ + rsacrtprivkeymeta_t rsacrtpriv; /**< RSA CRT private key */ + }; + uint32_t rfu; /**< Reserved for future use */ + uint32_t rfulen; /**< Reserved for future use */ +} rsakeymeta_t; + +/** + * Key import data structure + */ +typedef struct { + uint32_t keydata; /**< Key data buffer */ + uint32_t keydatalen; /**< Length of key data buffer */ + uint32_t sodata; /**< Wrapped buffer */ + uint32_t sodatalen; /**< Length of wrapped data buffer */ +} keyimport_t; + + +/** + * Get public key data structure + */ +typedef struct { + uint32_t type; /**< Key type */ + uint32_t keydata; /**< Key data buffer */ + uint32_t keydatalen; /**< Length of key data buffer */ + uint32_t modulus; /**< Modulus */ + uint32_t moduluslen; /**< Modulus length */ + uint32_t exponent; /**< Exponent */ + uint32_t exponentlen; /**< Exponent length */ +} getpubkey_t; + + +/** + * TCI message data. + */ +typedef struct { + union { + command_t command; + response_t response; + }; + + union { + rsagenkey_t rsagenkey; + rsasign_t rsasign; + rsaverify_t rsaverify; + hmacgenkey_t hmacgenkey; + hmacsign_t hmacsign; + hmacverify_t hmacverify; + keyimport_t keyimport; + getpubkey_t getpubkey; + }; + +} tciMessage_t, *tciMessage_ptr; + + +/** + * Overall TCI structure. + */ +typedef struct { + tciMessage_t message; /**< TCI message */ +} tci_t; + + +/** + * Trustlet UUID + */ +#define TEE_KEYMASTER_TL_UUID { { 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } + + +#endif // __TLTEEKEYMASTERAPI_H__ diff --git a/libkeymaster/tlTeeKeymaster_log.h b/libkeymaster/tlTeeKeymaster_log.h new file mode 100644 index 0000000..cc1636b --- /dev/null +++ b/libkeymaster/tlTeeKeymaster_log.h @@ -0,0 +1,48 @@ +/** + * @file tlTeeKeymaster_log.h + * @brief Contains debug & log macro definitions + * + * Copyright Giesecke & Devrient GmbH 2012 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __TLTEEKEYMASTERLOG_H__ +#define __TLTEEKEYMASTERLOG_H__ + +#include + +#ifndef LOG_TAG +#define LOG_TAG "TlcTeeKeyMaster" +#endif // LOG_TAG + +/* Macro definitions */ +#define LOG_D(...) __android_log_print(ANDROID_LOG_DEBUG , LOG_TAG, __VA_ARGS__) +#define LOG_I(...) __android_log_print(ANDROID_LOG_INFO , LOG_TAG, __VA_ARGS__) +#define LOG_W(...) __android_log_print(ANDROID_LOG_WARN , LOG_TAG, __VA_ARGS__) +#define LOG_E(...) __android_log_print(ANDROID_LOG_ERROR , LOG_TAG, __VA_ARGS__) + + +#endif // __TLTEEKEYMASTERLOG_H__ diff --git a/libkeymaster/tlcTeeKeymaster_if.c b/libkeymaster/tlcTeeKeymaster_if.c new file mode 100644 index 0000000..384e17d --- /dev/null +++ b/libkeymaster/tlcTeeKeymaster_if.c @@ -0,0 +1,1092 @@ +/** + * @file tlcTeeKeymaster_if.c + * @brief Contains trustlet connector interface implementations to + * handle key operations with TEE Keymaster trustlet + * + * Copyright Giesecke & Devrient GmbH 2012 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include "MobiCoreDriverApi.h" +#include "tlTeeKeymaster_Api.h" +#include "tlTeeKeymaster_log.h" +#include "tlcTeeKeymaster_if.h" + + +/* Global definitions */ +static const uint32_t gDeviceId = MC_DEVICE_ID_DEFAULT; +static const mcUuid_t gUuid = TEE_KEYMASTER_TL_UUID; + +/** + * TEE_Open + * + * Open session to the TEE Keymaster trustlet + * + * @param pSessionHandle [out] Return pointer to the session handle + */ +static tciMessage_ptr TEE_Open( + mcSessionHandle_t *pSessionHandle +){ + tciMessage_ptr pTci = NULL; + mcResult_t mcRet; + + do + { + + /* Validate session handle */ + if (!pSessionHandle) + { + LOG_E("TEE_Open(): Invalid session handle\n"); + break; + } + + /* Initialize session handle data */ + bzero(pSessionHandle, sizeof(mcSessionHandle_t)); + + /* Open MobiCore device */ + mcRet = mcOpenDevice(gDeviceId); + if (MC_DRV_OK != mcRet) + { + LOG_E("TEE_Open(): mcOpenDevice returned: %d\n", mcRet); + break; + } + + /* Allocating WSM for TCI */ + mcRet = mcMallocWsm(gDeviceId, 0, sizeof(tciMessage_t), (uint8_t **) &pTci, 0); + if (MC_DRV_OK != mcRet) + { + LOG_E("TEE_Open(): mcMallocWsm returned: %d\n", mcRet); + break; + } + + /* Open session the TEE Keymaster trustlet */ + pSessionHandle->deviceId = gDeviceId; + mcRet = mcOpenSession(pSessionHandle, + &gUuid, + (uint8_t *) pTci, + (uint32_t) sizeof(tciMessage_t)); + if (MC_DRV_OK != mcRet) + { + LOG_E("TEE_Open(): mcOpenSession returned: %d\n", mcRet); + break; + } + + } while (false); + + LOG_I("TEE_Open(): returning pointer to TCI buffer: 0x%.8x\n", pTci); + + return pTci; +} + + +/** + * TEE_Close + * + * Close session to the TEE Keymaster trustlet + * + * @param sessionHandle [in] Session handle + */ +static void TEE_Close( + mcSessionHandle_t *pSessionHandle +){ + teeResult_t ret = TEE_ERR_NONE; + mcResult_t mcRet; + + do { + + /* Validate session handle */ + if (!pSessionHandle) + { + LOG_E("TEE_Close(): Invalid session handle\n"); + break; + } + + /* Close session */ + mcRet = mcCloseSession(pSessionHandle); + if (MC_DRV_OK != mcRet) + { + LOG_E("TEE_Close(): mcCloseSession returned: %d\n", mcRet); + ret = TEE_ERR_SESSION; + break; + } + + /* Close MobiCore device */ + mcRet = mcCloseDevice(gDeviceId); + if (MC_DRV_OK != mcRet) + { + LOG_E("TEE_Close(): mcCloseDevice returned: %d\n", mcRet); + ret = TEE_ERR_MC_DEVICE; + } + + } while (false); +} + + +/** + * TEE_RSAGenerateKeyPair + * + * Generates RSA key pair and returns key pair data as wrapped object + * + * @param keyType [in] Key pair type. RSA or RSACRT + * @param keyData [in] Pointer to the key data buffer + * @param keyDataLength [in] Key data buffer length + * @param keySize [in] Key size + * @param exponent [in] Exponent number + * @param soLen [out] Key data secure object length + */ +teeResult_t TEE_RSAGenerateKeyPair( + teeRsaKeyPairType_t keyType, + uint8_t* keyData, + uint32_t keyDataLength, + uint32_t keySize, + uint32_t exponent, + uint32_t* soLen +){ + teeResult_t ret = TEE_ERR_NONE; + tciMessage_ptr pTci = NULL; + mcSessionHandle_t sessionHandle; + mcBulkMap_t mapInfo; + mcResult_t mcRet; + + do { + + /* Open session to the trustlet */ + pTci = TEE_Open(&sessionHandle); + if (!pTci) { + ret = TEE_ERR_MEMORY; + break; + } + + /* Map memory to the secure world */ + mcRet = mcMap(&sessionHandle, keyData, keyDataLength, &mapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + /* Update TCI buffer */ + pTci->command.header.commandId = CMD_ID_TEE_RSA_GEN_KEY_PAIR; + pTci->rsagenkey.type = keyType; + pTci->rsagenkey.keysize = keySize; + pTci->rsagenkey.keydata = (uint32_t)mapInfo.sVirtualAddr; + pTci->rsagenkey.keydatalen = keyDataLength; + pTci->rsagenkey.exponent = exponent; + + /* Notify the trustlet */ + mcRet = mcNotify(&sessionHandle); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Wait for response from the trustlet */ + if (MC_DRV_OK != mcWaitNotification(&sessionHandle, MC_INFINITE_TIMEOUT)) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Unmap memory */ + mcRet = mcUnmap(&sessionHandle, keyData, &mapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + if (RET_OK != pTci->response.header.returnCode) + { + LOG_E("TEE_RSAGenerateKeyPair(): TEE Keymaster trustlet returned: 0x%.8x\n", + pTci->response.header.returnCode); + ret = TEE_ERR_FAIL; + break; + } + + /* Update secure object length */ + *soLen = pTci->rsagenkey.solen; + + } while (false); + + /* Close session to the trustlet */ + TEE_Close(&sessionHandle); + + LOG_I("TEE_RSAGenerateKeyPair(): returning: 0x%.8x\n", ret); + + return ret; +} + + +/** + * TEE_RSASign + * + * Signs given plain data and returns signature data + * + * @param keyData [in] Pointer to key data buffer + * @param keyDataLength [in] Key data buffer length + * @param plainData [in] Pointer to plain data to be signed + * @param plainDataLength [in] Plain data length + * @param signatureData [out] Pointer to signature data + * @param signatureDataLength [out] Signature data length + * @param algorithm [in] RSA signature algorithm + */ +teeResult_t TEE_RSASign( + const uint8_t* keyData, + const uint32_t keyDataLength, + const uint8_t* plainData, + const uint32_t plainDataLength, + uint8_t* signatureData, + uint32_t* signatureDataLength, + teeRsaSigAlg_t algorithm +){ + teeResult_t ret = TEE_ERR_NONE; + tciMessage_ptr pTci = NULL; + mcSessionHandle_t sessionHandle; + mcBulkMap_t keyMapInfo; + mcBulkMap_t plainMapInfo; + mcBulkMap_t signatureMapInfo; + mcResult_t mcRet; + + do { + + /* Open session to the trustlet */ + pTci = TEE_Open(&sessionHandle); + if (!pTci) { + ret = TEE_ERR_MEMORY; + break; + } + + /* Map memory to the secure world */ + mcRet = mcMap(&sessionHandle, (void*)keyData, keyDataLength, &keyMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcMap(&sessionHandle, (void*)plainData, plainDataLength, &plainMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcMap(&sessionHandle, (void*)signatureData, *signatureDataLength, &signatureMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + /* Update TCI buffer */ + pTci->command.header.commandId = CMD_ID_TEE_RSA_SIGN; + pTci->rsasign.keydata = (uint32_t)keyMapInfo.sVirtualAddr; + pTci->rsasign.keydatalen = keyDataLength; + + pTci->rsasign.plaindata = (uint32_t)plainMapInfo.sVirtualAddr; + pTci->rsasign.plaindatalen = plainDataLength; + + pTci->rsasign.signaturedata = (uint32_t)signatureMapInfo.sVirtualAddr; + pTci->rsasign.signaturedatalen = *signatureDataLength; + + pTci->rsasign.algorithm = algorithm; + + /* Notify the trustlet */ + mcRet = mcNotify(&sessionHandle); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Wait for response from the trustlet */ + if (MC_DRV_OK != mcWaitNotification(&sessionHandle, MC_INFINITE_TIMEOUT)) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Unmap memory */ + mcRet = mcUnmap(&sessionHandle, (void*)keyData, &keyMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcUnmap(&sessionHandle, (void*)plainData, &plainMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcUnmap(&sessionHandle, (void*)signatureData, &signatureMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + if (RET_OK != pTci->response.header.returnCode) + { + LOG_E("TEE_RSASign(): TEE Keymaster trustlet returned: 0x%.8x\n", + pTci->response.header.returnCode); + ret = TEE_ERR_FAIL; + break; + } + + /* Retrieve signature data length */ + *signatureDataLength = pTci->rsasign.signaturedatalen; + + } while (false); + + /* Close session to the trustlet */ + TEE_Close(&sessionHandle); + + LOG_I("TEE_RSASign(): returning: 0x%.8x\n", ret); + + return ret; +} + + +/** + * TEE_RSAVerify + * + * Verifies given data with RSA public key and return status + * + * @param keyData [in] Pointer to key data buffer + * @param keyDataLength [in] Key data buffer length + * @param plainData [in] Pointer to plain data to be signed + * @param plainDataLength [in] Plain data length + * @param signatureData [in] Pointer to signed data + * @param signatureData [in] Plain data length + * @param algorithm [in] RSA signature algorithm + * @param validity [out] Signature validity + */ +teeResult_t TEE_RSAVerify( + const uint8_t* keyData, + const uint32_t keyDataLength, + const uint8_t* plainData, + const uint32_t plainDataLength, + const uint8_t* signatureData, + const uint32_t signatureDataLength, + teeRsaSigAlg_t algorithm, + bool *validity +){ + teeResult_t ret = TEE_ERR_NONE; + tciMessage_ptr pTci = NULL; + mcSessionHandle_t sessionHandle; + mcBulkMap_t keyMapInfo; + mcBulkMap_t plainMapInfo; + mcBulkMap_t signatureMapInfo; + mcResult_t mcRet; + + do { + + /* Open session to the trustlet */ + pTci = TEE_Open(&sessionHandle); + if (!pTci) { + ret = TEE_ERR_MEMORY; + break; + } + + /* Map memory to the secure world */ + mcRet = mcMap(&sessionHandle, (void*)keyData, keyDataLength, &keyMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcMap(&sessionHandle, (void*)plainData, plainDataLength, &plainMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcMap(&sessionHandle, (void*)signatureData, signatureDataLength, &signatureMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + /* Update TCI buffer */ + pTci->command.header.commandId = CMD_ID_TEE_RSA_VERIFY; + pTci->rsaverify.keydata = (uint32_t)keyMapInfo.sVirtualAddr; + pTci->rsaverify.keydatalen = keyDataLength; + + pTci->rsaverify.plaindata = (uint32_t)plainMapInfo.sVirtualAddr; + pTci->rsaverify.plaindatalen = plainDataLength; + + pTci->rsaverify.signaturedata = (uint32_t)signatureMapInfo.sVirtualAddr; + pTci->rsaverify.signaturedatalen = signatureDataLength; + + pTci->rsaverify.algorithm = algorithm; + pTci->rsaverify.validity = false; + + /* Notify the trustlet */ + mcRet = mcNotify(&sessionHandle); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Wait for response from the trustlet */ + if (MC_DRV_OK != mcWaitNotification(&sessionHandle, MC_INFINITE_TIMEOUT)) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Unmap memory */ + mcRet = mcUnmap(&sessionHandle, (void*)keyData, &keyMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcUnmap(&sessionHandle, (void*)plainData, &plainMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcUnmap(&sessionHandle, (void*)signatureData, &signatureMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + if (RET_OK != pTci->response.header.returnCode) + { + LOG_E("TEE_RSAVerify(): TEE Keymaster trustlet returned: 0x%.8x\n", + pTci->response.header.returnCode); + ret = TEE_ERR_FAIL; + break; + } + + *validity = pTci->rsaverify.validity; + + } while (false); + + /* Close session to the trustlet */ + TEE_Close(&sessionHandle); + + LOG_I("TEE_RSAVerify(): returning: 0x%.8x\n", ret); + + return ret; +} + + +/** + * TEE_HMACKeyGenerate + * + * Generates random key for HMAC calculation and returns key data as wrapped object + * (key is encrypted) + * + * @param keyData [out] Pointer to key data + * @param keyDataLength [in] Key data buffer length + * @param soLen [out] Key data secure object length + */ +teeResult_t TEE_HMACKeyGenerate( + uint8_t* keyData, + uint32_t keyDataLength, + uint32_t* soLen +){ + teeResult_t ret = TEE_ERR_NONE; + tciMessage_ptr pTci = NULL; + mcSessionHandle_t sessionHandle; + mcBulkMap_t keyMapInfo; + mcResult_t mcRet; + + do { + + /* Open session to the trustlet */ + pTci = TEE_Open(&sessionHandle); + if (!pTci) { + ret = TEE_ERR_MEMORY; + break; + } + + /* Map memory to the secure world */ + mcRet = mcMap(&sessionHandle, (void*)keyData, keyDataLength, &keyMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + /* Update TCI buffer */ + pTci->command.header.commandId = CMD_ID_TEE_HMAC_GEN_KEY; + pTci->hmacgenkey.keydata = (uint32_t)keyMapInfo.sVirtualAddr; + pTci->hmacgenkey.keydatalen = keyDataLength; + + /* Notify the trustlet */ + mcRet = mcNotify(&sessionHandle); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Wait for response from the trustlet */ + if (MC_DRV_OK != mcWaitNotification(&sessionHandle, MC_INFINITE_TIMEOUT)) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Unmap memory */ + mcRet = mcUnmap(&sessionHandle, (void*)keyData, &keyMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + if (RET_OK != pTci->response.header.returnCode) + { + LOG_E("TEE_RSAVerify(): TEE Keymaster trustlet returned: 0x%.8x\n", + pTci->response.header.returnCode); + ret = TEE_ERR_FAIL; + } + + /* Update secure object length */ + *soLen = pTci->hmacgenkey.solen; + + }while (false); + + /* Close session to the trustlet */ + TEE_Close(&sessionHandle); + + LOG_I("TEE_HMACKeyGenerate(): returning: 0x%.8x\n", ret); + + return ret; +} + +/** + * TEE_HMACSign + * + * Signs given plain data and returns HMAC signature data + * + * @param keyData [in] Pointer to key data buffer + * @param keyDataLength [in] Key data buffer length + * @param plainData [in] Pointer to plain data to be signed + * @param plainDataLength [in] Plain data length + * @param signatureData [out] Pointer to signature data + * @param signatureDataLength [out] Signature data length + * @param digest [in] Digest type + */ +teeResult_t TEE_HMACSign( + const uint8_t* keyData, + const uint32_t keyDataLength, + const uint8_t* plainData, + const uint32_t plainDataLength, + uint8_t* signatureData, + uint32_t* signatureDataLength, + teeDigest_t digest +){ + teeResult_t ret = TEE_ERR_NONE; + tciMessage_ptr pTci = NULL; + mcSessionHandle_t sessionHandle; + mcBulkMap_t keyMapInfo; + mcBulkMap_t plainMapInfo; + mcBulkMap_t signatureMapInfo; + mcResult_t mcRet; + + do { + + /* Open session to the trustlet */ + pTci = TEE_Open(&sessionHandle); + if (!pTci) { + ret = TEE_ERR_MEMORY; + break; + } + + /* Map memory to the secure world */ + mcRet = mcMap(&sessionHandle, (void*)keyData, keyDataLength, &keyMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcMap(&sessionHandle, (void*)plainData, plainDataLength, &plainMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcMap(&sessionHandle, (void*)signatureData, *signatureDataLength, &signatureMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + /* Update TCI buffer */ + pTci->command.header.commandId = CMD_ID_TEE_HMAC_SIGN; + pTci->hmacsign.keydata = (uint32_t)keyMapInfo.sVirtualAddr; + pTci->hmacsign.keydatalen = keyDataLength; + + pTci->hmacsign.plaindata = (uint32_t)plainMapInfo.sVirtualAddr; + pTci->hmacsign.plaindatalen = plainDataLength; + + pTci->hmacsign.signaturedata = (uint32_t)signatureMapInfo.sVirtualAddr; + pTci->hmacsign.signaturedatalen = *signatureDataLength; + + pTci->hmacsign.digest = digest; + + /* Notify the trustlet */ + mcRet = mcNotify(&sessionHandle); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Wait for response from the trustlet */ + if (MC_DRV_OK != mcWaitNotification(&sessionHandle, MC_INFINITE_TIMEOUT)) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Unmap memory */ + mcRet = mcUnmap(&sessionHandle, (void*)keyData, &keyMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcUnmap(&sessionHandle, (void*)plainData, &plainMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcUnmap(&sessionHandle, (void*)signatureData, &signatureMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + if (RET_OK != pTci->response.header.returnCode) + { + LOG_E("TEE_HMACSign(): TEE Keymaster trustlet returned: 0x%.8x\n", + pTci->response.header.returnCode); + ret = TEE_ERR_FAIL; + break; + } + + /* Retrieve signature data length */ + *signatureDataLength = pTci->hmacsign.signaturedatalen; + + } while (false); + + /* Close session to the trustlet */ + TEE_Close(&sessionHandle); + + LOG_I("TEE_HMACSign(): returning: 0x%.8x\n", ret); + + return ret; +} + + +/** + * TEE_HMACVerify + * + * Verifies given data HMAC key data and return status + * + * @param plainData [in] Pointer to plain data to be signed + * @param plainDataLength [in] Plain data length + * @param signatureData [in] Pointer to signed data + * @param signatureData [in] Plain data length + * @param digest [in] Digest type + * @param validity [out] Signature validity + */ +teeResult_t TEE_HMACVerify( + const uint8_t* keyData, + const uint32_t keyDataLength, + const uint8_t* plainData, + const uint32_t plainDataLength, + const uint8_t* signatureData, + const uint32_t signatureDataLength, + teeDigest_t digest, + bool *validity +){ + teeResult_t ret = TEE_ERR_NONE; + tciMessage_ptr pTci = NULL; + mcSessionHandle_t sessionHandle; + mcBulkMap_t keyMapInfo; + mcBulkMap_t plainMapInfo; + mcBulkMap_t signatureMapInfo; + mcResult_t mcRet; + + do { + + /* Open session to the trustlet */ + pTci = TEE_Open(&sessionHandle); + if (!pTci) { + ret = TEE_ERR_MEMORY; + break; + } + + /* Map memory to the secure world */ + mcRet = mcMap(&sessionHandle, (void*)keyData, keyDataLength, &keyMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcMap(&sessionHandle, (void*)plainData, plainDataLength, &plainMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcMap(&sessionHandle, (void*)signatureData, signatureDataLength, &signatureMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + /* Update TCI buffer */ + pTci->command.header.commandId = CMD_ID_TEE_HMAC_VERIFY; + pTci->hmacverify.keydata = (uint32_t)keyMapInfo.sVirtualAddr; + pTci->hmacverify.keydatalen = keyDataLength; + + pTci->hmacverify.plaindata = (uint32_t)plainMapInfo.sVirtualAddr; + pTci->hmacverify.plaindatalen = plainDataLength; + + pTci->hmacverify.signaturedata = (uint32_t)signatureMapInfo.sVirtualAddr; + pTci->hmacverify.signaturedatalen = signatureDataLength; + + pTci->hmacverify.digest = digest; + pTci->hmacverify.validity = false; + + /* Notify the trustlet */ + mcRet = mcNotify(&sessionHandle); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Wait for response from the trustlet */ + if (MC_DRV_OK != mcWaitNotification(&sessionHandle, MC_INFINITE_TIMEOUT)) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Unmap memory */ + mcRet = mcUnmap(&sessionHandle, (void*)keyData, &keyMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcUnmap(&sessionHandle, (void*)plainData, &plainMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcUnmap(&sessionHandle, (void*)signatureData, &signatureMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + if (RET_OK != pTci->response.header.returnCode) + { + LOG_E("TEE_HMACVerify(): TEE Keymaster trustlet returned: 0x%.8x\n", + pTci->response.header.returnCode); + ret = TEE_ERR_FAIL; + break; + } + + *validity = pTci->hmacverify.validity; + + } while (false); + + /* Close session to the trustlet */ + TEE_Close(&sessionHandle); + + LOG_I("TEE_HMACVerify(): returning: 0x%.8x\n", ret); + + return ret; +} + + +/** + * TEE_KeyImport + * + * Imports key data and returns key data as secure object + * + * Key data needs to be in the following format + * + * RSA key data: + * |--key metadata--|--public modulus--|--public exponent--|--private exponent--| + * + * RSA CRT key data: + * |--key metadata--|--public modulus--|--public exponent--|--P--|--Q--|--DP--|--DQ--|--Qinv--| + * + * Where: + * P: secret prime factor + * Q: secret prime factor + * DP: d mod (p-1) + * DQ: d mod (q-1) + * Qinv: q^-1 mod p + * + * @param keyData [in] Pointer to key data + * @param keyDataLength [in] Key data length + * @param soData [out] Pointer to wrapped key data + * @param soDataLength [out] Wrapped key data length + */ +teeResult_t TEE_KeyImport( + const uint8_t* keyData, + const uint32_t keyDataLength, + uint8_t* soData, + uint32_t* soDataLength +){ + teeResult_t ret = TEE_ERR_NONE; + tciMessage_ptr pTci = NULL; + mcSessionHandle_t sessionHandle; + mcBulkMap_t keyMapInfo; + mcBulkMap_t soMapInfo; + mcResult_t mcRet; + + do { + + /* Open session to the trustlet */ + pTci = TEE_Open(&sessionHandle); + if (!pTci) { + ret = TEE_ERR_MEMORY; + break; + } + + /* Map memory to the secure world */ + mcRet = mcMap(&sessionHandle, (void*)keyData, keyDataLength, &keyMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcMap(&sessionHandle, (void*)soData, *soDataLength, &soMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + /* Update TCI buffer */ + pTci->command.header.commandId = CMD_ID_TEE_KEY_IMPORT; + pTci->keyimport.keydata = (uint32_t)keyMapInfo.sVirtualAddr; + pTci->keyimport.keydatalen = keyDataLength; + pTci->keyimport.sodata = (uint32_t)soMapInfo.sVirtualAddr; + pTci->keyimport.sodatalen = *soDataLength; + + /* Notify the trustlet */ + mcRet = mcNotify(&sessionHandle); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Wait for response from the trustlet */ + if (MC_DRV_OK != mcWaitNotification(&sessionHandle, MC_INFINITE_TIMEOUT)) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Unmap memory */ + mcRet = mcUnmap(&sessionHandle, (void*)keyData, &keyMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcUnmap(&sessionHandle, (void*)soData, &soMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + if (RET_OK != pTci->response.header.returnCode) + { + LOG_E("TEE_KeyWrap(): TEE Keymaster trustlet returned: 0x%.8x\n", + pTci->response.header.returnCode); + ret = TEE_ERR_FAIL; + break; + } + + /* Update secure object length */ + *soDataLength = pTci->keyimport.sodatalen; + + } while (false); + + /* Close session to the trustlet */ + TEE_Close(&sessionHandle); + + LOG_I("TEE_KeyWrap(): returning: 0x%.8x\n", ret); + + return ret; +} + + +/** * TEE_GetPubKey + * + * Retrieves public key daya (modulus and exponent) from wrapped key data + * + * @param keyData [in] Pointer to key data + * @param keyDataLength [in] Key data length + * @param modulus [out] Pointer to public key modulus data + * @param modulusLength [out] Modulus data length + * @param exponent [out] Pointer to public key exponent data + * @param exponentLength [out] Exponent data length + */ +teeResult_t TEE_GetPubKey( + const uint8_t* keyData, + const uint32_t keyDataLength, + uint8_t* modulus, + uint32_t* modulusLength, + uint8_t* exponent, + uint32_t* exponentLength +){ + teeResult_t ret = TEE_ERR_NONE; + tciMessage_ptr pTci = NULL; + mcSessionHandle_t sessionHandle; + mcBulkMap_t keyMapInfo; + mcBulkMap_t modMapInfo; + mcBulkMap_t expMapInfo; + mcResult_t mcRet; + + do { + + /* Open session to the trustlet */ + pTci = TEE_Open(&sessionHandle); + if (!pTci) { + ret = TEE_ERR_MEMORY; + break; + } + + /* Map memory to the secure world */ + mcRet = mcMap(&sessionHandle, (void*)keyData, keyDataLength, &keyMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcMap(&sessionHandle, (void*)modulus, *modulusLength, &modMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcMap(&sessionHandle, (void*)exponent, *exponentLength, &expMapInfo); + if (MC_DRV_OK != mcRet) { + ret = TEE_ERR_MAP; + break; + } + + /* Update TCI buffer */ + pTci->command.header.commandId = CMD_ID_TEE_GET_PUB_KEY; + pTci->getpubkey.keydata = (uint32_t)keyMapInfo.sVirtualAddr; + pTci->getpubkey.keydatalen = keyDataLength; + pTci->getpubkey.modulus = (uint32_t)modMapInfo.sVirtualAddr; + pTci->getpubkey.moduluslen = *modulusLength; + pTci->getpubkey.exponent = (uint32_t)expMapInfo.sVirtualAddr; + pTci->getpubkey.exponentlen = *exponentLength; + + /* Notify the trustlet */ + mcRet = mcNotify(&sessionHandle); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Wait for response from the trustlet */ + if (MC_DRV_OK != mcWaitNotification(&sessionHandle, MC_INFINITE_TIMEOUT)) + { + ret = TEE_ERR_NOTIFICATION; + break; + } + + /* Unmap memory */ + mcRet = mcUnmap(&sessionHandle, (void*)keyData, &keyMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcUnmap(&sessionHandle, (void*)modulus, &modMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + mcRet = mcUnmap(&sessionHandle, (void*)exponent, &expMapInfo); + if (MC_DRV_OK != mcRet) + { + ret = TEE_ERR_MAP; + break; + } + + if (RET_OK != pTci->response.header.returnCode) + { + LOG_E("TEE_GetPubKey(): TEE Keymaster trustlet returned: 0x%.8x\n", + pTci->response.header.returnCode); + ret = TEE_ERR_FAIL; + break; + } + + /* Update modulus and exponent lengths */ + *modulusLength = pTci->getpubkey.moduluslen; + *exponentLength = pTci->getpubkey.exponentlen; + + } while (false); + + /* Close session to the trustlet */ + TEE_Close(&sessionHandle); + + LOG_I("TEE_GetPubKey(): returning: 0x%.8x\n", ret); + + return ret; +} diff --git a/libkeymaster/tlcTeeKeymaster_if.h b/libkeymaster/tlcTeeKeymaster_if.h new file mode 100644 index 0000000..0c378ca --- /dev/null +++ b/libkeymaster/tlcTeeKeymaster_if.h @@ -0,0 +1,324 @@ +/** + * @file tlcTeeKeymaster_if.h + * @brief Contains TEE Keymaster trustlet connector interface definitions + * + * Copyright Giesecke & Devrient GmbH 2012 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __TLCTEEKEYMASTERIF_H__ +#define __TLCTEEKEYMASTERIF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + + +/** + * Key sizes + */ +#define TEE_RSA_KEY_SIZE_512 512 +#define TEE_RSA_KEY_SIZE_1024 1024 +#define TEE_RSA_KEY_SIZE_2048 2048 + + +/* error codes */ +typedef enum +{ + TEE_ERR_NONE = 0, + TEE_ERR_FAIL = 1, + TEE_ERR_INVALID_BUFFER = 2, + TEE_ERR_BUFFER_TOO_SMALL = 3, + TEE_ERR_NOT_IMPLEMENTED = 4, + TEE_ERR_SESSION = 5, + TEE_ERR_MC_DEVICE = 6, + TEE_ERR_NOTIFICATION = 7, + TEE_ERR_MEMORY = 8, + TEE_ERR_MAP = 9 + /* more can be added as required */ +} teeResult_t; + + +/* RSA key pair types */ +typedef enum { + TEE_KEYPAIR_RSA = 1, /**< RSA public and RSA private key. */ + TEE_KEYPAIR_RSACRT = 2 /**< RSA public and RSA CRT private key. */ +} teeRsaKeyPairType_t; + + +/* Supported RSA signature algorithms */ +typedef enum +{ + /* RSA */ + TEE_RSA_SHA_ISO9796 = 1, /**< 20-byte SHA-1 digest, padded according to the ISO 9796-2 scheme as specified in EMV '96 and EMV 2000, encrypted using RSA. */ + TEE_RSA_SHA_ISO9796_MR = 2, /**< 20-byte SHA-1 digest, padded according to the ISO9796-2 specification and encrypted using RSA. */ + TEE_RSA_SHA_PKCS1 = 3, /**< 20-byte SHA-1 digest, padded according to the PKCS#1 (v1.5) scheme, and encrypted using RSA. */ + TEE_RSA_SHA256_PSS = 4, /**< SHA-256 digest and PSS padding */ + TEE_RSA_SHA1_PSS = 5, /**< SHA-256 digest and PSS padding */ + TEE_RSA_NODIGEST_NOPADDING = 6, /**< No digest and padding */ +} teeRsaSigAlg_t; + + +/* Digest types */ +typedef enum +{ + TEE_DIGEST_SHA1, + TEE_DIGEST_SHA256 +} teeDigest_t; + + +/** + * RSA private key metadata (Private modulus and exponent lengths) + */ +typedef struct { + uint32_t lenprimod; /**< Private key modulus length */ + uint32_t lenpriexp; /**< Private key exponent length */ +} teeRsaPrivKeyMeta_t; + + +/** + * RSA CRT private key metadata (Private modulus and exponent lengths) + */ +typedef struct { + uint32_t lenprimod; /**< Private key modulus length */ + uint32_t lenp; /**< Prime p length */ + uint32_t lenq; /**< Prime q length */ + uint32_t lendp; /**< DP length */ + uint32_t lendq; /**< DQ length */ + uint32_t lenqinv; /**< QP length */ +} teeRsaCrtPrivKeyMeta_t; + + +/** + * Key metadata (public key hash, key size, modulus/exponent lengths, etc..) + */ +typedef struct { + uint32_t keytype; /**< Key type, e.g. RSA */ + uint32_t keysize; /**< Key size, e.g. 1024, 2048 */ + uint32_t lenpubmod; /**< Public key modulus length */ + uint32_t lenpubexp; /**< Public key exponent length */ + union { + teeRsaPrivKeyMeta_t rsapriv; /**< RSA private key */ + teeRsaCrtPrivKeyMeta_t rsacrtpriv; /**< RSA CRT private key */ + }; + uint32_t rfu; /**< Reserved for future use */ + uint32_t rfulen; /**< Reserved for future use */ +} teeRsaKeyMeta_t; + +/** + * TEE_RSAGenerateKeyPair + * + * Generates RSA key pair and returns key pair data as wrapped object + * + * @param keyType [in] Key pair type. RSA or RSACRT + * @param keyData [in] Pointer to the key data buffer + * @param keyDataLength [in] Key data buffer length + * @param keySize [in] Key size + * @param exponent [in] Exponent number + * @param soLen [out] Key data secure object length + */ +teeResult_t TEE_RSAGenerateKeyPair( + teeRsaKeyPairType_t keyType, + uint8_t* keyData, + uint32_t keyDataLength, + uint32_t keySize, + uint32_t exponent, + uint32_t* soLen); + + +/** + * TEE_RSASign + * + * Signs given plain data and returns signature data + * + * @param keyData [in] Pointer to key data buffer + * @param keyDataLength [in] Key data buffer length + * @param plainData [in] Pointer to plain data to be signed + * @param plainDataLength [in] Plain data length + * @param signatureData [out] Pointer to signature data + * @param signatureDataLength [out] Signature data length + * @param algorithm [in] RSA signature algorithm + */ +teeResult_t TEE_RSASign( + const uint8_t* keyData, + const uint32_t keyDataLength, + const uint8_t* plainData, + const uint32_t plainDataLength, + uint8_t* signatureData, + uint32_t* signatureDataLength, + teeRsaSigAlg_t algorithm); + + +/** + * TEE_RSAVerify + * + * Verifies given data with RSA public key and return status + * + * @param keyData [in] Pointer to key data buffer + * @param keyDataLength [in] Key data buffer length + * @param plainData [in] Pointer to plain data to be signed + * @param plainDataLength [in] Plain data length + * @param signatureData [in] Pointer to signed data + * @param signatureData [in] Plain data length + * @param algorithm [in] RSA signature algorithm + * @param validity [out] Signature validity + */ +teeResult_t TEE_RSAVerify( + const uint8_t* keyData, + const uint32_t keyDataLength, + const uint8_t* plainData, + const uint32_t plainDataLength, + const uint8_t* signatureData, + const uint32_t signatureDataLength, + teeRsaSigAlg_t algorithm, + bool *validity); + + +/** + * TEE_HMACKeyGenerate + * + * Generates random key for HMAC calculation and returns key data as wrapped object + * (key is encrypted) + * + * @param keyData [out] Pointer to key data + * @param keyDataLength [in] Key data buffer length + * @param soLen [out] Key data secure object length + */ +teeResult_t TEE_HMACKeyGenerate( + uint8_t* keyData, + uint32_t keyDataLength, + uint32_t* soLen); + + +/** + * TEE_HMACSign + * + * Signs given plain data and returns HMAC signature data + * + * @param keyData [in] Pointer to key data buffer + * @param keyDataLength [in] Key data buffer length + * @param plainData [in] Pointer to plain data to be signed + * @param plainDataLength [in] Plain data length + * @param signatureData [out] Pointer to signature data + * @param signatureDataLength [out] Signature data length + * @param digest [in] Digest type + */ +teeResult_t TEE_HMACSign( + const uint8_t* keyData, + const uint32_t keyDataLength, + const uint8_t* plainData, + const uint32_t plainDataLength, + uint8_t* signatureData, + uint32_t* signatureDataLength, + teeDigest_t digest); + + +/** + * TEE_HMACVerify + * + * Verifies given data HMAC key data and return status + * + * @param keyData [in] Pointer to key data buffer + * @param keyDataLength [in] Key data buffer length + * @param plainData [in] Pointer to plain data to be signed + * @param plainDataLength [in] Plain data length + * @param signatureData [in] Pointer to signed data + * @param signatureData [in] Plain data length + * @param digest [in] Digest type + * @param validity [out] Signature validity + */ +teeResult_t TEE_HMACVerify( + const uint8_t* keyData, + const uint32_t keyDataLength, + const uint8_t* plainData, + const uint32_t plainDataLength, + const uint8_t* signatureData, + const uint32_t signatureDataLength, + teeDigest_t digest, + bool *validity); + + +/** + * TEE_KeyImport + * + * Imports key data and returns key data as secure object + * + * Key data needs to be in the following format + * + * RSA key data: + * |--key metadata--|--public modulus--|--public exponent--|--private exponent--| + * + * RSA CRT key data: + * |--key metadata--|--public modulus--|--public exponent--|--P--|--Q--|--DP--|--DQ--|--Qinv--| + * + * Where: + * P: secret prime factor + * Q: secret prime factor + * DP: d mod (p-1) + * DQ: d mod (q-1) + * Qinv: q^-1 mod p + * + * @param keyData [in] Pointer to key data + * @param keyDataLength [in] Key data length + * @param soData [out] Pointer to wrapped key data + * @param soDataLength [out] Wrapped key data length + */ +teeResult_t TEE_KeyImport( + const uint8_t* keyData, + const uint32_t keyDataLength, + uint8_t* soData, + uint32_t* soDataLength); + + +/** + * TEE_GetPubKey + * + * Retrieves public key daya (modulus and exponent) from wrapped key data + * + * @param keyData [in] Pointer to key data + * @param keyDataLength [in] Key data length + * @param modulus [out] Pointer to public key modulus data + * @param modulusLength [out] Modulus data length + * @param exponent [out] Pointer to public key exponent data + * @param exponentLength [out] Exponent data length + */ +teeResult_t TEE_GetPubKey( + const uint8_t* keyData, + const uint32_t keyDataLength, + uint8_t* modulus, + uint32_t* modulusLength, + uint8_t* exponent, + uint32_t* exponentLength); + + +#ifdef __cplusplus +} +#endif + +#endif // __TLCTEEKEYMASTERIF_H__ diff --git a/libscaler/libscaler-m2m1shot.cpp b/libscaler/libscaler-m2m1shot.cpp new file mode 100644 index 0000000..74d4b92 --- /dev/null +++ b/libscaler/libscaler-m2m1shot.cpp @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * Copyright@ Samsung Electronics Co. LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*! + * \file libscaler-m2m1shot.cpp + * \brief source file for Scaler HAL + * \author Cho KyongHo + * \date 2014/05/08 + * + * Revision History: + * - 2014.05.08 : Cho KyongHo (pullip.cho@samsung.com) \n + * Create + */ +#include +#include +#include +#include + +#include + +#include + +#include "libscaler-common.h" +#include "libscaler-m2m1shot.h" + +using namespace std; + +const char dev_base_name[] = "/dev/m2m1shot_scaler"; +#define DEVBASE_NAME_LEN 20 + +struct PixFormat { + unsigned int pixfmt; + char planes; + char bit_pp[3]; +}; + +const static PixFormat g_pixfmt_table[] = { + {V4L2_PIX_FMT_RGB32, 1, {32, 0, 0}, }, + {V4L2_PIX_FMT_BGR32, 1, {32, 0, 0}, }, + {V4L2_PIX_FMT_RGB565, 1, {16, 0, 0}, }, + {V4L2_PIX_FMT_RGB555X, 1, {16, 0, 0}, }, + {V4L2_PIX_FMT_RGB444, 1, {16, 0, 0}, }, + {V4L2_PIX_FMT_YUYV, 1, {16, 0, 0}, }, + {V4L2_PIX_FMT_YVYU, 1, {16, 0, 0}, }, + {V4L2_PIX_FMT_UYVY, 1, {16, 0, 0}, }, + {V4L2_PIX_FMT_NV16, 1, {16, 0, 0}, }, + {V4L2_PIX_FMT_NV61, 1, {16, 0, 0}, }, + {V4L2_PIX_FMT_YUV420, 1, {12, 0, 0}, }, + {V4L2_PIX_FMT_YVU420, 1, {12, 0, 0}, }, + {V4L2_PIX_FMT_NV12M, 2, {8, 4, 0}, }, + {V4L2_PIX_FMT_NV21M, 2, {8, 4, 0}, }, + {v4l2_fourcc('V', 'M', '1', '2'), 2, {8, 4, 0}, }, + {V4L2_PIX_FMT_NV12, 1, {12, 0, 0}, }, + {V4L2_PIX_FMT_NV21, 1, {12, 0, 0}, }, + {v4l2_fourcc('N', 'M', '2', '1'), 2, {8, 4, 0}, }, + {V4L2_PIX_FMT_YUV420M, 3, {8, 2, 2}, }, + {V4L2_PIX_FMT_YVU420M, 3, {8, 2, 2}, }, + {V4L2_PIX_FMT_NV24, 1, {24, 0, 0}, }, + {V4L2_PIX_FMT_NV42, 1, {24, 0, 0}, }, +}; + + +CScalerM2M1SHOT::CScalerM2M1SHOT(int devid, int drm) : m_iFD(-1) +{ + char devname[DEVBASE_NAME_LEN + 2]; // basenamelen + id + null + + if ((devid < 0) || (devid > 4)) { // instance number must be between 0 ~ 3 + SC_LOGE("Invalid device instance ID %d", devid); + return; + } + + strncpy(devname, dev_base_name, DEVBASE_NAME_LEN); + devname[DEVBASE_NAME_LEN] = devid + '0'; + devname[DEVBASE_NAME_LEN + 1] = '\0'; + + memset(&m_task, 0, sizeof(m_task)); + + m_iFD = open(devname, O_RDWR); + if (m_iFD < 0) { + SC_LOGERR("Failed to open '%s'", devname); + } else { + // default 3 planes not to miss any buffer address + m_task.buf_out.num_planes = 3; + m_task.buf_cap.num_planes = 3; + } +} + +CScalerM2M1SHOT::~CScalerM2M1SHOT() +{ + if (m_iFD >= 0) + close(m_iFD); +} + +bool CScalerM2M1SHOT::CScalerM2M1SHOT::Run() +{ + int ret; + + ret = ioctl(m_iFD, M2M1SHOT_IOC_PROCESS, &m_task); + if (ret < 0) { + SC_LOGERR("Failed to process the given M2M1SHOT task"); + return false; + } + + return true; +} + +bool CScalerM2M1SHOT::SetFormat(m2m1shot_pix_format &fmt, m2m1shot_buffer &buf, + unsigned int width, unsigned int height, unsigned int v4l2_fmt) { + const PixFormat *pixfmt = NULL; + + fmt.width = width; + fmt.height = height; + fmt.fmt = v4l2_fmt; + + for (size_t i = 0; i < ARRSIZE(g_pixfmt_table); i++) { + if (g_pixfmt_table[i].pixfmt == v4l2_fmt) { + pixfmt = &g_pixfmt_table[i]; + break; + } + } + + if (!pixfmt) { + SC_LOGE("Format %#x is not supported", v4l2_fmt); + return false; + } + + for (int i = 0; i < pixfmt->planes; i++) { + if (((pixfmt->bit_pp[i] * width) % 8) != 0) { + SC_LOGE("Plane %d of format %#x must have even width", i, v4l2_fmt); + return false; + } + buf.plane[i].len = (pixfmt->bit_pp[i] * width * height) / 8; + } + + buf.num_planes = pixfmt->planes; + + return true; +} + +bool CScalerM2M1SHOT::SetCrop(m2m1shot_pix_format &fmt, + unsigned int l, unsigned int t, unsigned int w, unsigned int h) { + if (fmt.width <= l) { + SC_LOGE("crop left %d is larger than image width %d", l, fmt.width); + return false; + } + if (fmt.height <= t) { + SC_LOGE("crop top %d is larger than image height %d", t, fmt.height); + return false; + } + if (fmt.width < (l + w)) { + SC_LOGE("crop width %d@%d exceeds image width %d", w, l, fmt.width); + return false; + } + if (fmt.height < (t + h)) { + SC_LOGE("crop height %d@%d exceeds image height %d", h, t, fmt.height); + return false; + } + + fmt.crop.left = l; + fmt.crop.top = t; + fmt.crop.width = w; + fmt.crop.height = h; + + return true; +} + +bool CScalerM2M1SHOT::SetAddr( + m2m1shot_buffer &buf, void *addr[SC_NUM_OF_PLANES], int mem_type) { + if (mem_type == V4L2_MEMORY_DMABUF) { + buf.type = M2M1SHOT_BUFFER_DMABUF; + for (int i = 0; i < buf.num_planes; i++) + buf.plane[i].fd = reinterpret_cast(addr[i]); + } else if (mem_type == V4L2_MEMORY_USERPTR) { + buf.type = M2M1SHOT_BUFFER_USERPTR; + for (int i = 0; i < buf.num_planes; i++) + buf.plane[i].userptr = reinterpret_cast(addr[i]); + } else { + SC_LOGE("Unknown buffer type %d", mem_type); + return false; + } + + return true; +} + +bool CScalerM2M1SHOT::SetRotate(int rot, int hflip, int vflip) { + if ((rot % 90) != 0) { + SC_LOGE("Rotation degree %d must be multiple of 90", rot); + return false; + } + + rot = rot % 360; + if (rot < 0) + rot = 360 + rot; + + m_task.op.rotate = rot; + m_task.op.op &= ~(M2M1SHOT_OP_FLIP_HORI | M2M1SHOT_OP_FLIP_VIRT); + if (hflip) + m_task.op.op |= M2M1SHOT_OP_FLIP_HORI; + if (vflip) + m_task.op.op |= M2M1SHOT_OP_FLIP_VIRT; + + return true; +} diff --git a/libscaler/libscaler-v4l2.cpp b/libscaler/libscaler-v4l2.cpp new file mode 100644 index 0000000..f73e981 --- /dev/null +++ b/libscaler/libscaler-v4l2.cpp @@ -0,0 +1,433 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * Copyright@ Samsung Electronics Co. LTD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*! + * \file libscaler-v4l2.cpp + * \brief source file for Scaler HAL + * \author Cho KyongHo + * \date 2014/05/12 + * + * Revision History: + * - 2014.05.12 : Cho KyongHo (pullip.cho@samsung.com) \n + * Create + */ + +#include +#include + +#include "libscaler-v4l2.h" + +void CScalerV4L2::Initialize(int instance) +{ + snprintf(m_cszNode, SC_MAX_NODENAME, SC_DEV_NODE "%d", SC_NODE(instance)); + + m_fdScaler = exynos_v4l2_open(m_cszNode, O_RDWR); + if (m_fdScaler < 0) { + SC_LOGERR("Failed to open '%s'", m_cszNode); + return; + } + + unsigned int cap = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_OUTPUT_MPLANE | + V4L2_CAP_VIDEO_CAPTURE_MPLANE; + if (!exynos_v4l2_querycap(m_fdScaler, cap)) { + SC_LOGERR("Failed to query capture on '%s'", m_cszNode); + close(m_fdScaler); + m_fdScaler = -1; + } else { + m_fdValidate = -m_fdScaler; + } +} + +CScalerV4L2::CScalerV4L2(int instance, int allow_drm) +{ + m_fdScaler = -1; + m_iInstance = instance; + m_nRotDegree = 0; + m_fStatus = 0; + + memset(&m_frmSrc, 0, sizeof(m_frmSrc)); + memset(&m_frmDst, 0, sizeof(m_frmDst)); + + m_frmSrc.fdAcquireFence = -1; + m_frmDst.fdAcquireFence = -1; + + m_frmSrc.name = "output"; + m_frmDst.name = "capture"; + + m_frmSrc.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + m_frmDst.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + + Initialize(instance); + + if(Valid()) { + if (allow_drm) + SetFlag(m_fStatus, SCF_ALLOW_DRM); + SC_LOGD("Successfully opened '%s'; returned fd %d; drmmode %s", + m_cszNode, m_fdScaler, allow_drm ? "enabled" : "disabled"); + } +} + +CScalerV4L2::~CScalerV4L2() +{ + if (m_fdScaler >= 0) + close(m_fdScaler); + + m_fdScaler = -1; +} + +bool CScalerV4L2::Stop() +{ + if (!ResetDevice(m_frmSrc)) { + SC_LOGE("Failed to stop Scaler for the output frame"); + return false; + } + + if (!ResetDevice(m_frmDst)) { + SC_LOGE("Failed to stop Scaler for the cature frame"); + return false; + } + + return true; +} + +bool CScalerV4L2::Run() +{ + if (!DevSetCtrl()) + return false; + + if (!DevSetFormat()) + return false; + + if (!ReqBufs()) + return false; + + if (!StreamOn()) + return false; + + if (!QBuf()) + return false; + + return DQBuf(); +} + +bool CScalerV4L2::DevSetCtrl() +{ + if (!TestFlag(m_fStatus, SCF_ROTATION_FRESH)) { + SC_LOGD("Skipping rotation and flip setting due to no change"); + return true; + } + + if (!Stop()) + return false; + + if (exynos_v4l2_s_ctrl(m_fdScaler, V4L2_CID_ROTATE, m_nRotDegree) < 0) { + SC_LOGERR("Failed V4L2_CID_ROTATE with degree %d", m_nRotDegree); + return false; + } + + if (exynos_v4l2_s_ctrl(m_fdScaler, V4L2_CID_VFLIP, TestFlag(m_fStatus, SCF_HFLIP)) < 0) { + SC_LOGERR("Failed V4L2_CID_VFLIP - %d", TestFlag(m_fStatus, SCF_VFLIP)); + return false; + } + + if (exynos_v4l2_s_ctrl(m_fdScaler, V4L2_CID_HFLIP, TestFlag(m_fStatus, SCF_VFLIP)) < 0) { + SC_LOGERR("Failed V4L2_CID_HFLIP - %d", TestFlag(m_fStatus, SCF_HFLIP)); + return false; + } + + SC_LOGD("Successfully set CID_ROTATE(%d), CID_VFLIP(%d) and CID_HFLIP(%d)", + m_nRotDegree, TestFlag(m_fStatus, SCF_VFLIP), TestFlag(m_fStatus, SCF_HFLIP)); + + ClearFlag(m_fStatus, SCF_ROTATION_FRESH); + + if (TestFlag(m_fStatus, SCF_CSC_FRESH) && TestFlag(m_fStatus, SCF_CSC_WIDE)) { + if (exynos_v4l2_s_ctrl(m_fdScaler, V4L2_CID_CSC_RANGE, + TestFlag(m_fStatus, SCF_CSC_WIDE) ? 1 : 0) < 0) { + SC_LOGERR("Failed V4L2_CID_CSC_RANGE to %d", TestFlag(m_fStatus, SCF_CSC_WIDE)); + return false; + } + + ClearFlag(m_fStatus, SCF_CSC_FRESH); + } + + return true; +} + +bool CScalerV4L2::ResetDevice(FrameInfo &frm) +{ + if (!DQBuf(frm)) + return false; + + if (TestFlag(frm.flags, SCFF_STREAMING)) { + if (exynos_v4l2_streamoff(m_fdScaler, frm.type) < 0 ) { + SC_LOGERR("Failed STREAMOFF for the %s", frm.name); + return false; + } + ClearFlag(frm.flags, SCFF_STREAMING); + } + + SC_LOGD("VIDIC_STREAMOFF is successful for the %s", frm.name); + + if (TestFlag(frm.flags, SCFF_REQBUFS)) { + v4l2_requestbuffers reqbufs; + memset(&reqbufs, 0, sizeof(reqbufs)); + reqbufs.type = frm.type; + reqbufs.memory = frm.memory; + if (exynos_v4l2_reqbufs(m_fdScaler, &reqbufs) < 0 ) { + SC_LOGERR("Failed to REQBUFS(0) for the %s", frm.name); + return false; + } + + ClearFlag(frm.flags, SCFF_REQBUFS); + } + + SC_LOGD("VIDIC_REQBUFS(0) is successful for the %s", frm.name); + + return true; +} + +bool CScalerV4L2::DevSetFormat(FrameInfo &frm) +{ + + if (!TestFlag(frm.flags, SCFF_BUF_FRESH)) { + SC_LOGD("Skipping S_FMT for the %s since it is already done", frm.name); + return true; + } + + if (!ResetDevice(frm)) { + SC_LOGE("Failed to VIDIOC_S_FMT for the %s", frm.name); + return false; + } + + v4l2_format fmt; + fmt.type = frm.type; + fmt.fmt.pix_mp.pixelformat = frm.color_format; + fmt.fmt.pix_mp.width = frm.width; + fmt.fmt.pix_mp.height = frm.height; + + if (exynos_v4l2_s_fmt(m_fdScaler, &fmt) < 0) { + SC_LOGERR("Failed S_FMT(fmt: %d, w:%d, h:%d) for the %s", + fmt.fmt.pix_mp.pixelformat, fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, + frm.name); + return false; + } + + // returned fmt.fmt.pix_mp.num_planes and fmt.fmt.pix_mp.plane_fmt[i].sizeimage + frm.out_num_planes = fmt.fmt.pix_mp.num_planes; + + for (int i = 0; i < frm.out_num_planes; i++) + frm.out_plane_size[i] = fmt.fmt.pix_mp.plane_fmt[i].sizeimage; + + v4l2_crop crop; + crop.type = frm.type; + crop.c = frm.crop; + + if (exynos_v4l2_s_crop(m_fdScaler, &crop) < 0) { + SC_LOGERR("Failed S_CROP(fmt: %d, l:%d, t:%d, w:%d, h:%d) for the %s", + crop.type, crop.c.left, crop.c.top, crop.c.width, crop.c.height, + frm.name); + return false; + } + + if (frm.out_num_planes > SC_MAX_PLANES) { + SC_LOGE("Number of planes exceeds %d of %s", frm.out_num_planes, frm.name); + return false; + } + + ClearFlag(frm.flags, SCFF_BUF_FRESH); + + SC_LOGD("Successfully S_FMT and S_CROP for the %s", frm.name); + + return true; +} + +bool CScalerV4L2::DevSetFormat() +{ + if (!DevSetFormat(m_frmSrc)) + return false; + + return DevSetFormat(m_frmDst); +} + +bool CScalerV4L2::QBuf(FrameInfo &frm, int *pfdReleaseFence) +{ + v4l2_buffer buffer; + v4l2_plane planes[SC_MAX_PLANES]; + + if (!TestFlag(frm.flags, SCFF_REQBUFS)) { + SC_LOGE("Trying to QBUF without REQBUFS for %s is not allowed", + frm.name); + return false; + } + + if (!DQBuf(frm)) + return false; + + memset(&buffer, 0, sizeof(buffer)); + memset(&planes, 0, sizeof(planes)); + + buffer.type = frm.type; + buffer.memory = frm.memory; + buffer.index = 0; + buffer.length = frm.out_num_planes; + + if (pfdReleaseFence) { + buffer.flags = V4L2_BUF_FLAG_USE_SYNC; + buffer.reserved = frm.fdAcquireFence; + } + + buffer.m.planes = planes; + for (unsigned long i = 0; i < buffer.length; i++) { + planes[i].length = frm.out_plane_size[i]; + if (V4L2_TYPE_IS_OUTPUT(buffer.type)) + planes[i].bytesused = planes[i].length; + if (buffer.memory == V4L2_MEMORY_DMABUF) + planes[i].m.fd = reinterpret_cast(frm.addr[i]); + else + planes[i].m.userptr = reinterpret_cast(frm.addr[i]); + } + + + if (exynos_v4l2_qbuf(m_fdScaler, &buffer) < 0) { + SC_LOGERR("Failed to QBUF for the %s", frm.name); + return false; + } + + SetFlag(frm.flags, SCFF_QBUF); + + if (pfdReleaseFence) { + if (frm.fdAcquireFence >= 0) + close(frm.fdAcquireFence); + frm.fdAcquireFence = -1; + + *pfdReleaseFence = static_cast(buffer.reserved); + } + + SC_LOGD("Successfully QBUF for the %s", frm.name); + + return true; +} + +bool CScalerV4L2::ReqBufs(FrameInfo &frm) +{ + v4l2_requestbuffers reqbufs; + + if (TestFlag(frm.flags, SCFF_REQBUFS)) { + SC_LOGD("Skipping REQBUFS for the %s since it is already done", frm.name); + return true; + } + + memset(&reqbufs, 0, sizeof(reqbufs)); + + reqbufs.type = frm.type; + reqbufs.memory = frm.memory; + reqbufs.count = 1; + + if (exynos_v4l2_reqbufs(m_fdScaler, &reqbufs) < 0) { + SC_LOGERR("Failed to REQBUFS for the %s", frm.name); + return false; + } + + SetFlag(frm.flags, SCFF_REQBUFS); + + SC_LOGD("Successfully REQBUFS for the %s", frm.name); + + return true; +} + +bool CScalerV4L2::SetRotate(int rot, int flip_h, int flip_v) +{ + if ((rot % 90) != 0) { + SC_LOGE("Rotation of %d degree is not supported", rot); + return false; + } + + SetRotDegree(rot); + + if (flip_h) + SetFlag(m_fStatus, SCF_VFLIP); + else + ClearFlag(m_fStatus, SCF_VFLIP); + + if (flip_v) + SetFlag(m_fStatus, SCF_HFLIP); + else + ClearFlag(m_fStatus, SCF_HFLIP); + + SetFlag(m_fStatus, SCF_ROTATION_FRESH); + + return true; +} + +bool CScalerV4L2::StreamOn(FrameInfo &frm) +{ + if (!TestFlag(frm.flags, SCFF_REQBUFS)) { + SC_LOGE("Trying to STREAMON without REQBUFS for %s is not allowed", + frm.name); + return false; + } + + if (!TestFlag(frm.flags, SCFF_STREAMING)) { + if (exynos_v4l2_streamon(m_fdScaler, frm.type) < 0 ) { + SC_LOGERR("Failed StreamOn for the %s", frm.name); + return false; + } + + SetFlag(frm.flags, SCFF_STREAMING); + + SC_LOGD("Successfully VIDIOC_STREAMON for the %s", frm.name); + } + + return true; +} + +bool CScalerV4L2::DQBuf(FrameInfo &frm) +{ + if (!TestFlag(frm.flags, SCFF_QBUF)) + return true; + + v4l2_buffer buffer; + v4l2_plane plane[SC_NUM_OF_PLANES]; + + memset(&buffer, 0, sizeof(buffer)); + + buffer.type = frm.type; + buffer.memory = frm.memory; + + if (V4L2_TYPE_IS_MULTIPLANAR(buffer.type)) { + memset(plane, 0, sizeof(plane)); + + buffer.length = frm.out_num_planes; + buffer.m.planes = plane; + } + + ClearFlag(frm.flags, SCFF_QBUF); + + if (exynos_v4l2_dqbuf(m_fdScaler, &buffer) < 0 ) { + SC_LOGERR("Failed to DQBuf the %s", frm.name); + return false; + } + + if (buffer.flags & V4L2_BUF_FLAG_ERROR) { + SC_LOGE("Error occurred while processing streaming data"); + return false; + } + + SC_LOGD("Successfully VIDIOC_DQBUF for the %s", frm.name); + + return true; +} diff --git a/original-kernel-headers/linux/fimc-is-metadata.h b/original-kernel-headers/linux/fimc-is-metadata.h new file mode 100644 index 0000000..769c044 --- /dev/null +++ b/original-kernel-headers/linux/fimc-is-metadata.h @@ -0,0 +1,804 @@ +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ +#ifndef FIMC_IS_METADATA_H_ +#define FIMC_IS_METADATA_H_ +struct rational { + uint32_t num; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t den; +}; +#define CAMERA2_MAX_AVAILABLE_MODE 21 +#define CAMERA2_MAX_FACES 16 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define CAMERA2_FACE_DETECTION_THRESHOLD 35 +enum metadata_mode { + METADATA_MODE_NONE, + METADATA_MODE_FULL +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct camera2_request_ctl { + uint32_t id; + enum metadata_mode metadataMode; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint8_t outputStreams[16]; + uint32_t frameCount; +}; +struct camera2_request_dm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t id; + enum metadata_mode metadataMode; + uint32_t frameCount; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum optical_stabilization_mode { + OPTICAL_STABILIZATION_MODE_OFF, + OPTICAL_STABILIZATION_MODE_ON +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum lens_facing { + LENS_FACING_BACK, + LENS_FACING_FRONT +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_lens_ctl { + uint32_t focusDistance; + float aperture; + float focalLength; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + float filterDensity; + enum optical_stabilization_mode opticalStabilizationMode; +}; +struct camera2_lens_dm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t focusDistance; + float aperture; + float focalLength; + float filterDensity; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum optical_stabilization_mode opticalStabilizationMode; + float focusRange[2]; +}; +struct camera2_lens_sm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + float minimumFocusDistance; + float hyperfocalDistance; + float availableFocalLength[2]; + float availableApertures; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + float availableFilterDensities; + enum optical_stabilization_mode availableOpticalStabilization; + uint32_t shadingMapSize; + float shadingMap[3][40][30]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t geometricCorrectionMapSize; + float geometricCorrectionMap[2][3][40][30]; + enum lens_facing facing; + float position[2]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +enum sensor_colorfilterarrangement { + SENSOR_COLORFILTERARRANGEMENT_RGGB, + SENSOR_COLORFILTERARRANGEMENT_GRBG, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + SENSOR_COLORFILTERARRANGEMENT_GBRG, + SENSOR_COLORFILTERARRANGEMENT_BGGR, + SENSOR_COLORFILTERARRANGEMENT_RGB +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum sensor_ref_illuminant { + SENSOR_ILLUMINANT_DAYLIGHT = 1, + SENSOR_ILLUMINANT_FLUORESCENT = 2, + SENSOR_ILLUMINANT_TUNGSTEN = 3, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + SENSOR_ILLUMINANT_FLASH = 4, + SENSOR_ILLUMINANT_FINE_WEATHER = 9, + SENSOR_ILLUMINANT_CLOUDY_WEATHER = 10, + SENSOR_ILLUMINANT_SHADE = 11, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + SENSOR_ILLUMINANT_DAYLIGHT_FLUORESCENT = 12, + SENSOR_ILLUMINANT_DAY_WHITE_FLUORESCENT = 13, + SENSOR_ILLUMINANT_COOL_WHITE_FLUORESCENT = 14, + SENSOR_ILLUMINANT_WHITE_FLUORESCENT = 15, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + SENSOR_ILLUMINANT_STANDARD_A = 17, + SENSOR_ILLUMINANT_STANDARD_B = 18, + SENSOR_ILLUMINANT_STANDARD_C = 19, + SENSOR_ILLUMINANT_D55 = 20, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + SENSOR_ILLUMINANT_D65 = 21, + SENSOR_ILLUMINANT_D75 = 22, + SENSOR_ILLUMINANT_D50 = 23, + SENSOR_ILLUMINANT_ISO_STUDIO_TUNGSTEN = 24 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct camera2_sensor_ctl { + uint64_t exposureTime; + uint64_t frameDuration; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t sensitivity; +}; +struct camera2_sensor_dm { + uint64_t exposureTime; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint64_t frameDuration; + uint32_t sensitivity; + uint64_t timeStamp; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_sensor_sm { + uint32_t exposureTimeRange[2]; + uint32_t maxFrameDuration; + uint32_t availableSensitivities[10]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum sensor_colorfilterarrangement colorFilterArrangement; + float physicalSize[2]; + uint32_t pixelArraySize[2]; + uint32_t activeArraySize[4]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t whiteLevel; + uint32_t blackLevelPattern[4]; + struct rational colorTransform1[9]; + struct rational colorTransform2[9]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum sensor_ref_illuminant referenceIlluminant1; + enum sensor_ref_illuminant referenceIlluminant2; + struct rational forwardMatrix1[9]; + struct rational forwardMatrix2[9]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct rational calibrationTransform1[9]; + struct rational calibrationTransform2[9]; + struct rational baseGainFactor; + uint32_t maxAnalogSensitivity; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + float noiseModelCoefficients[2]; + uint32_t orientation; +}; +enum flash_mode { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + CAM2_FLASH_MODE_NOP = 0, + CAM2_FLASH_MODE_OFF = 1, + CAM2_FLASH_MODE_SINGLE, + CAM2_FLASH_MODE_TORCH, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + CAM2_FLASH_MODE_BEST +}; +struct camera2_flash_ctl { + enum flash_mode flashMode; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t firingPower; + uint64_t firingTime; +}; +struct camera2_flash_dm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum flash_mode flashMode; + uint32_t firingPower; + uint64_t firingTime; + uint32_t firingStable; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t decision; +}; +struct camera2_flash_sm { + uint32_t available; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint64_t chargeDuration; +}; +enum processing_mode { + PROCESSING_MODE_OFF = 1, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + PROCESSING_MODE_FAST, + PROCESSING_MODE_HIGH_QUALITY +}; +struct camera2_hotpixel_ctl { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum processing_mode mode; +}; +struct camera2_hotpixel_dm { + enum processing_mode mode; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct camera2_demosaic_ctl { + enum processing_mode mode; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_demosaic_dm { + enum processing_mode mode; +}; +struct camera2_noisereduction_ctl { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum processing_mode mode; + uint32_t strength; +}; +struct camera2_noisereduction_dm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum processing_mode mode; + uint32_t strength; +}; +struct camera2_shading_ctl { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum processing_mode mode; +}; +struct camera2_shading_dm { + enum processing_mode mode; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct camera2_geometric_ctl { + enum processing_mode mode; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_geometric_dm { + enum processing_mode mode; +}; +enum colorcorrection_mode { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + COLORCORRECTION_MODE_FAST = 1, + COLORCORRECTION_MODE_HIGH_QUALITY, + COLORCORRECTION_MODE_TRANSFORM_MATRIX, + COLORCORRECTION_MODE_EFFECT_MONO, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + COLORCORRECTION_MODE_EFFECT_NEGATIVE, + COLORCORRECTION_MODE_EFFECT_SOLARIZE, + COLORCORRECTION_MODE_EFFECT_SEPIA, + COLORCORRECTION_MODE_EFFECT_POSTERIZE, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + COLORCORRECTION_MODE_EFFECT_WHITEBOARD, + COLORCORRECTION_MODE_EFFECT_BLACKBOARD, + COLORCORRECTION_MODE_EFFECT_AQUA +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_colorcorrection_ctl { + enum colorcorrection_mode mode; + float transform[9]; + uint32_t hue; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t saturation; + uint32_t brightness; +}; +struct camera2_colorcorrection_dm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum colorcorrection_mode mode; + float transform[9]; + uint32_t hue; + uint32_t saturation; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t brightness; +}; +struct camera2_colorcorrection_sm { + uint8_t availableModes[CAMERA2_MAX_AVAILABLE_MODE]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t hueRange[2]; + uint32_t saturationRange[2]; + uint32_t brightnessRange[2]; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum tonemap_mode { + TONEMAP_MODE_FAST = 1, + TONEMAP_MODE_HIGH_QUALITY, + TONEMAP_MODE_CONTRAST_CURVE +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct camera2_tonemap_ctl { + enum tonemap_mode mode; + float curveRed[64]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + float curveGreen[64]; + float curveBlue[64]; +}; +struct camera2_tonemap_dm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum tonemap_mode mode; + float curveRed[64]; + float curveGreen[64]; + float curveBlue[64]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct camera2_tonemap_sm { + uint32_t maxCurvePoints; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_edge_ctl { + enum processing_mode mode; + uint32_t strength; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_edge_dm { + enum processing_mode mode; + uint32_t strength; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum scaler_availableformats { + SCALER_FORMAT_BAYER_RAW, + SCALER_FORMAT_YV12, + SCALER_FORMAT_NV21, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + SCALER_FORMAT_JPEG, + SCALER_FORMAT_UNKNOWN +}; +struct camera2_scaler_ctl { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t cropRegion[3]; +}; +struct camera2_scaler_dm { + uint32_t cropRegion[3]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct camera2_scaler_sm { + enum scaler_availableformats availableFormats[4]; + uint32_t availableRawSizes; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint64_t availableRawMinDurations; + uint32_t availableProcessedSizes[8]; + uint64_t availableProcessedMinDurations[8]; + uint32_t availableJpegSizes[8][2]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint64_t availableJpegMinDurations[8]; + uint32_t availableMaxDigitalZoom[8]; +}; +struct camera2_jpeg_ctl { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t quality; + uint32_t thumbnailSize[2]; + uint32_t thumbnailQuality; + double gpsCoordinates[3]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t gpsProcessingMethod; + uint64_t gpsTimestamp; + uint32_t orientation; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_jpeg_dm { + uint32_t quality; + uint32_t thumbnailSize[2]; + uint32_t thumbnailQuality; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + double gpsCoordinates[3]; + uint32_t gpsProcessingMethod; + uint64_t gpsTimestamp; + uint32_t orientation; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct camera2_jpeg_sm { + uint32_t availableThumbnailSizes[8][2]; + uint32_t maxSize; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +enum facedetect_mode { + FACEDETECT_MODE_OFF = 1, + FACEDETECT_MODE_SIMPLE, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + FACEDETECT_MODE_FULL +}; +enum stats_mode { + STATS_MODE_OFF = 1, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + STATS_MODE_ON +}; +struct camera2_stats_ctl { + enum facedetect_mode faceDetectMode; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum stats_mode histogramMode; + enum stats_mode sharpnessMapMode; +}; +struct camera2_stats_dm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum facedetect_mode faceDetectMode; + uint32_t faceRectangles[CAMERA2_MAX_FACES][4]; + uint8_t faceScores[CAMERA2_MAX_FACES]; + uint32_t faceLandmarks[CAMERA2_MAX_FACES][6]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t faceIds[CAMERA2_MAX_FACES]; + enum stats_mode histogramMode; + uint32_t histogram[3 * 256]; + enum stats_mode sharpnessMapMode; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct camera2_stats_sm { + uint8_t availableFaceDetectModes[CAMERA2_MAX_AVAILABLE_MODE]; + uint32_t maxFaceCount; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t histogramBucketCount; + uint32_t maxHistogramCount; + uint32_t sharpnessMapSize[2]; + uint32_t maxSharpnessMapValue; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +enum aa_capture_intent { + AA_CAPTURE_INTENT_CUSTOM = 0, + AA_CAPTURE_INTENT_PREVIEW, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_CAPTURE_INTENT_STILL_CAPTURE, + AA_CAPTURE_INTENT_VIDEO_RECORD, + AA_CAPTURE_INTENT_VIDEO_SNAPSHOT, + AA_CAPTURE_INTENT_ZERO_SHUTTER_LAG +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +enum aa_mode { + AA_CONTROL_NONE = 0, + AA_CONTROL_OFF, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_CONTROL_AUTO, + AA_CONTROL_USE_SCENE_MODE +}; +enum aa_scene_mode { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_SCENE_MODE_UNSUPPORTED = 1, + AA_SCENE_MODE_FACE_PRIORITY, + AA_SCENE_MODE_ACTION, + AA_SCENE_MODE_PORTRAIT, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_SCENE_MODE_LANDSCAPE, + AA_SCENE_MODE_NIGHT, + AA_SCENE_MODE_NIGHT_PORTRAIT, + AA_SCENE_MODE_THEATRE, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_SCENE_MODE_BEACH, + AA_SCENE_MODE_SNOW, + AA_SCENE_MODE_SUNSET, + AA_SCENE_MODE_STEADYPHOTO, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_SCENE_MODE_FIREWORKS, + AA_SCENE_MODE_SPORTS, + AA_SCENE_MODE_PARTY, + AA_SCENE_MODE_CANDLELIGHT, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_SCENE_MODE_BARCODE, + AA_SCENE_MODE_NIGHT_CAPTURE, + AA_SCENE_MODE_MAX +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum aa_effect_mode { + AA_EFFECT_OFF = 1, + AA_EFFECT_MONO, + AA_EFFECT_NEGATIVE, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_EFFECT_SOLARIZE, + AA_EFFECT_SEPIA, + AA_EFFECT_POSTERIZE, + AA_EFFECT_WHITEBOARD, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_EFFECT_BLACKBOARD, + AA_EFFECT_AQUA +}; +enum aa_aemode { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_AEMODE_OFF = 1, + AA_AEMODE_LOCKED, + AA_AEMODE_ON, + AA_AEMODE_ON_AUTO_FLASH, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_AEMODE_ON_ALWAYS_FLASH, + AA_AEMODE_ON_AUTO_FLASH_REDEYE +}; +enum aa_ae_flashmode { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_FLASHMODE_NOP = 0, + AA_FLASHMODE_OFF = 1, + AA_FLASHMODE_ON, + AA_FLASHMODE_AUTO, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_FLASHMODE_CAPTURE, + AA_FLASHMODE_ON_ALWAYS +}; +enum aa_ae_antibanding_mode { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_AE_ANTIBANDING_OFF = 1, + AA_AE_ANTIBANDING_50HZ, + AA_AE_ANTIBANDING_60HZ, + AA_AE_ANTIBANDING_AUTO +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +enum aa_awbmode { + AA_AWBMODE_OFF = 1, + AA_AWBMODE_LOCKED, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_AWBMODE_WB_AUTO, + AA_AWBMODE_WB_INCANDESCENT, + AA_AWBMODE_WB_FLUORESCENT, + AA_AWBMODE_WB_WARM_FLUORESCENT, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_AWBMODE_WB_DAYLIGHT, + AA_AWBMODE_WB_CLOUDY_DAYLIGHT, + AA_AWBMODE_WB_TWILIGHT, + AA_AWBMODE_WB_SHADE +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +enum aa_afmode { + NO_CHANGE = 0, + AA_AFMODE_OFF = 1, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_AFMODE_AUTO, + AA_AFMODE_MACRO, + AA_AFMODE_CONTINUOUS_VIDEO, + AA_AFMODE_CONTINUOUS_PICTURE, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_AFMODE_INFINITY, + AA_AFMODE_AUTO_FACE, + AA_AFMODE_CONTINUOUS_VIDEO_FACE, + AA_AFMODE_CONTINUOUS_PICTURE_FACE, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_AFMODE_MANUAL, + AA_AFMODE_EDOF +}; +enum aa_afstate { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_AFSTATE_INACTIVE = 1, + AA_AFSTATE_PASSIVE_SCAN, + AA_AFSTATE_ACTIVE_SCAN, + AA_AFSTATE_AF_ACQUIRED_FOCUS, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AA_AFSTATE_AF_FAILED_FOCUS +}; +enum ae_state { + AE_STATE_INACTIVE = 1, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AE_STATE_SEARCHING, + AE_STATE_CONVERGED, + AE_STATE_LOCKED, + AE_STATE_FLASH_REQUIRED, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AE_STATE_PRECAPTURE +}; +enum awb_state { + AWB_STATE_INACTIVE = 1, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + AWB_STATE_SEARCHING, + AWB_STATE_CONVERGED, + AWB_STATE_LOCKED +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum aa_isomode { + AA_ISOMODE_AUTO = 1, + AA_ISOMODE_MANUAL, +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum ae_lockmode { + AEMODE_LOCK_OFF = 0, + AEMODE_LOCK_ON, +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum awb_lockmode { + AWBMODE_LOCK_OFF = 0, + AWBMODE_LOCK_ON, +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_aa_ctl { + enum aa_capture_intent captureIntent; + enum aa_mode mode; + enum aa_scene_mode sceneMode; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t videoStabilizationMode; + enum aa_aemode aeMode; + uint32_t aeRegions[5]; + int32_t aeExpCompensation; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t aeTargetFpsRange[2]; + enum aa_ae_antibanding_mode aeAntibandingMode; + enum aa_ae_flashmode aeflashMode; + enum aa_awbmode awbMode; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t awbRegions[5]; + enum aa_afmode afMode; + uint32_t afRegions[5]; + uint32_t afTrigger; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum aa_isomode isoMode; + uint32_t isoValue; +}; +struct camera2_aa_dm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum aa_mode mode; + enum aa_effect_mode effectMode; + enum aa_scene_mode sceneMode; + uint32_t videoStabilizationMode; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum aa_aemode aeMode; + uint32_t aeRegions[5]; + enum ae_state aeState; + enum aa_ae_flashmode aeflashMode; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum aa_awbmode awbMode; + uint32_t awbRegions[5]; + enum awb_state awbState; + enum aa_afmode afMode; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t afRegions[5]; + enum aa_afstate afState; + enum aa_isomode isoMode; + uint32_t isoValue; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct camera2_aa_sm { + uint8_t availableSceneModes[CAMERA2_MAX_AVAILABLE_MODE]; + uint8_t availableEffects[CAMERA2_MAX_AVAILABLE_MODE]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t maxRegions; + uint8_t aeAvailableModes[CAMERA2_MAX_AVAILABLE_MODE]; + struct rational aeCompensationStep; + int32_t aeCompensationRange[2]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t aeAvailableTargetFpsRanges[CAMERA2_MAX_AVAILABLE_MODE][2]; + uint8_t aeAvailableAntibandingModes[CAMERA2_MAX_AVAILABLE_MODE]; + uint8_t awbAvailableModes[CAMERA2_MAX_AVAILABLE_MODE]; + uint8_t afAvailableModes[CAMERA2_MAX_AVAILABLE_MODE]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint8_t availableVideoStabilizationModes[4]; + uint32_t isoRange[2]; +}; +struct camera2_lens_usm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t focusDistanceFrameDelay; +}; +struct camera2_sensor_usm { + uint32_t exposureTimeFrameDelay; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t frameDurationFrameDelay; + uint32_t sensitivityFrameDelay; +}; +struct camera2_flash_usm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t flashModeFrameDelay; + uint32_t firingPowerFrameDelay; + uint64_t firingTimeFrameDelay; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_ctl { + struct camera2_request_ctl request; + struct camera2_lens_ctl lens; + struct camera2_sensor_ctl sensor; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_flash_ctl flash; + struct camera2_hotpixel_ctl hotpixel; + struct camera2_demosaic_ctl demosaic; + struct camera2_noisereduction_ctl noise; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_shading_ctl shading; + struct camera2_geometric_ctl geometric; + struct camera2_colorcorrection_ctl color; + struct camera2_tonemap_ctl tonemap; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_edge_ctl edge; + struct camera2_scaler_ctl scaler; + struct camera2_jpeg_ctl jpeg; + struct camera2_stats_ctl stats; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_aa_ctl aa; +}; +struct camera2_dm { + struct camera2_request_dm request; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_lens_dm lens; + struct camera2_sensor_dm sensor; + struct camera2_flash_dm flash; + struct camera2_hotpixel_dm hotpixel; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_demosaic_dm demosaic; + struct camera2_noisereduction_dm noise; + struct camera2_shading_dm shading; + struct camera2_geometric_dm geometric; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_colorcorrection_dm color; + struct camera2_tonemap_dm tonemap; + struct camera2_edge_dm edge; + struct camera2_scaler_dm scaler; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_jpeg_dm jpeg; + struct camera2_stats_dm stats; + struct camera2_aa_dm aa; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_sm { + struct camera2_lens_sm lens; + struct camera2_sensor_sm sensor; + struct camera2_flash_sm flash; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_colorcorrection_sm color; + struct camera2_tonemap_sm tonemap; + struct camera2_scaler_sm scaler; + struct camera2_jpeg_sm jpeg; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_stats_sm stats; + struct camera2_aa_sm aa; + struct camera2_lens_usm lensUd; + struct camera2_sensor_usm sensorUd; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_flash_usm flashUd; +}; +struct camera2_lens_uctl { + struct camera2_lens_ctl ctl; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t maxPos; + uint32_t slewRate; +}; +struct camera2_lens_udm { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t maxPos; + uint32_t slewRate; +}; +struct camera2_sensor_uctl { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_sensor_ctl ctl; + uint64_t dynamicFrameDuration; +}; +struct camera2_scaler_uctl { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t sccTargetAddress[4]; + uint32_t scpTargetAddress[4]; +}; +struct camera2_flash_uctl { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_flash_ctl ctl; +}; +struct camera2_uctl { + uint32_t uUpdateBitMap; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t uFrameNumber; + struct camera2_lens_uctl lensUd; + struct camera2_sensor_uctl sensorUd; + struct camera2_flash_uctl flashUd; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_scaler_uctl scalerUd; +}; +struct camera2_udm { + struct camera2_lens_udm lens; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct camera2_shot { + struct camera2_ctl ctl; + struct camera2_dm dm; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct camera2_uctl uctl; + struct camera2_udm udm; + uint32_t magicNumber; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct camera2_shot_ext { + uint32_t setfile; + uint32_t request_sensor; + uint32_t request_scc; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t request_scp; + uint32_t drc_bypass; + uint32_t dis_bypass; + uint32_t dnr_bypass; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t fd_bypass; + uint32_t reserved[20]; + uint32_t timeZone[10][2]; + struct camera2_shot shot; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint8_t gpsProcessingMethod[32]; + uint8_t isReprocessing; + uint8_t reprocessInput; + enum ae_lockmode ae_lock; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + enum awb_lockmode awb_lock; + enum aa_awbmode awb_mode_dm; +}; +struct camera2_stream { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + uint32_t address; + uint32_t fcount; + uint32_t rcount; + uint32_t findex; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +#define CAM_LENS_CMD (0x1 << 0x0) +#define CAM_SENSOR_CMD (0x1 << 0x1) +#define CAM_FLASH_CMD (0x1 << 0x2) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif diff --git a/original-kernel-headers/linux/media.h b/original-kernel-headers/linux/media.h new file mode 100644 index 0000000..e13771d --- /dev/null +++ b/original-kernel-headers/linux/media.h @@ -0,0 +1,125 @@ +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ +#ifndef __LINUX_MEDIA_H +#define __LINUX_MEDIA_H +#include +#include +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#include +#define MEDIA_API_VERSION KERNEL_VERSION(0, 1, 0) +struct media_device_info { + char driver[16]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + char model[32]; + char serial[40]; + char bus_info[32]; + __u32 media_version; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 hw_revision; + __u32 driver_version; + __u32 reserved[31]; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define MEDIA_ENT_ID_FLAG_NEXT (1 << 31) +#define MEDIA_ENT_TYPE_SHIFT 16 +#define MEDIA_ENT_TYPE_MASK 0x00ff0000 +#define MEDIA_ENT_SUBTYPE_MASK 0x0000ffff +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define MEDIA_ENT_T_DEVNODE (1 << MEDIA_ENT_TYPE_SHIFT) +#define MEDIA_ENT_T_DEVNODE_V4L (MEDIA_ENT_T_DEVNODE + 1) +#define MEDIA_ENT_T_DEVNODE_FB (MEDIA_ENT_T_DEVNODE + 2) +#define MEDIA_ENT_T_DEVNODE_ALSA (MEDIA_ENT_T_DEVNODE + 3) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define MEDIA_ENT_T_DEVNODE_DVB (MEDIA_ENT_T_DEVNODE + 4) +#define MEDIA_ENT_T_V4L2_SUBDEV (2 << MEDIA_ENT_TYPE_SHIFT) +#define MEDIA_ENT_T_V4L2_SUBDEV_SENSOR (MEDIA_ENT_T_V4L2_SUBDEV + 1) +#define MEDIA_ENT_T_V4L2_SUBDEV_FLASH (MEDIA_ENT_T_V4L2_SUBDEV + 2) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define MEDIA_ENT_T_V4L2_SUBDEV_LENS (MEDIA_ENT_T_V4L2_SUBDEV + 3) +#define MEDIA_ENT_FL_DEFAULT (1 << 0) +struct media_entity_desc { + __u32 id; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + char name[32]; + __u32 type; + __u32 revision; + __u32 flags; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 group_id; + __u16 pads; + __u16 links; + __u32 reserved[4]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + union { + struct { + __u32 major; + __u32 minor; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + } v4l; + struct { + __u32 major; + __u32 minor; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + } fb; + struct { + __u32 card; + __u32 device; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 subdevice; + } alsa; + int dvb; + __u8 raw[184]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + }; +}; +#define MEDIA_PAD_FL_SINK (1 << 0) +#define MEDIA_PAD_FL_SOURCE (1 << 1) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct media_pad_desc { + __u32 entity; + __u16 index; + __u32 flags; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 reserved[2]; +}; +#define MEDIA_LNK_FL_ENABLED (1 << 0) +#define MEDIA_LNK_FL_IMMUTABLE (1 << 1) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define MEDIA_LNK_FL_DYNAMIC (1 << 2) +struct media_link_desc { + struct media_pad_desc source; + struct media_pad_desc sink; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 flags; + __u32 reserved[2]; +}; +struct media_links_enum { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 entity; + struct media_pad_desc __user *pads; + struct media_link_desc __user *links; + __u32 reserved[4]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +#define MEDIA_IOC_DEVICE_INFO _IOWR('|', 0x00, struct media_device_info) +#define MEDIA_IOC_ENUM_ENTITIES _IOWR('|', 0x01, struct media_entity_desc) +#define MEDIA_IOC_ENUM_LINKS _IOWR('|', 0x02, struct media_links_enum) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define MEDIA_IOC_SETUP_LINK _IOWR('|', 0x03, struct media_link_desc) +#endif diff --git a/original-kernel-headers/linux/v4l2-mediabus.h b/original-kernel-headers/linux/v4l2-mediabus.h new file mode 100644 index 0000000..2749ee5 --- /dev/null +++ b/original-kernel-headers/linux/v4l2-mediabus.h @@ -0,0 +1,100 @@ +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ +#ifndef __LINUX_V4L2_MEDIABUS_H +#define __LINUX_V4L2_MEDIABUS_H +#include +#include +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum v4l2_mbus_pixelcode { + V4L2_MBUS_FMT_FIXED = 0x0001, + V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE = 0x1001, + V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE = 0x1002, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE = 0x1003, + V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE = 0x1004, + V4L2_MBUS_FMT_BGR565_2X8_BE = 0x1005, + V4L2_MBUS_FMT_BGR565_2X8_LE = 0x1006, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_RGB565_2X8_BE = 0x1007, + V4L2_MBUS_FMT_RGB565_2X8_LE = 0x1008, + V4L2_MBUS_FMT_XRGB8888_4X8_LE = 0x1009, + V4L2_MBUS_FMT_Y8_1X8 = 0x2001, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_UYVY8_1_5X8 = 0x2002, + V4L2_MBUS_FMT_VYUY8_1_5X8 = 0x2003, + V4L2_MBUS_FMT_YUYV8_1_5X8 = 0x2004, + V4L2_MBUS_FMT_YVYU8_1_5X8 = 0x2005, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_UYVY8_2X8 = 0x2006, + V4L2_MBUS_FMT_VYUY8_2X8 = 0x2007, + V4L2_MBUS_FMT_YUYV8_2X8 = 0x2008, + V4L2_MBUS_FMT_YVYU8_2X8 = 0x2009, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_Y10_1X10 = 0x200a, + V4L2_MBUS_FMT_YUYV10_2X10 = 0x200b, + V4L2_MBUS_FMT_YVYU10_2X10 = 0x200c, + V4L2_MBUS_FMT_Y12_1X12 = 0x2013, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_UYVY8_1X16 = 0x200f, + V4L2_MBUS_FMT_VYUY8_1X16 = 0x2010, + V4L2_MBUS_FMT_YUYV8_1X16 = 0x2011, + V4L2_MBUS_FMT_YVYU8_1X16 = 0x2012, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_YUV8_1X24 = 0x2014, + V4L2_MBUS_FMT_YUYV10_1X20 = 0x200d, + V4L2_MBUS_FMT_YVYU10_1X20 = 0x200e, + V4L2_MBUS_FMT_SBGGR8_1X8 = 0x3001, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_SGBRG8_1X8 = 0x3013, + V4L2_MBUS_FMT_SGRBG8_1X8 = 0x3002, + V4L2_MBUS_FMT_SRGGB8_1X8 = 0x3014, + V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8 = 0x300b, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8 = 0x300c, + V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8 = 0x3009, + V4L2_MBUS_FMT_SRGGB10_DPCM8_1X8 = 0x300d, + V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE = 0x3003, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE = 0x3004, + V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE = 0x3005, + V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE = 0x3006, + V4L2_MBUS_FMT_SBGGR10_1X10 = 0x3007, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_SGBRG10_1X10 = 0x300e, + V4L2_MBUS_FMT_SGRBG10_1X10 = 0x300a, + V4L2_MBUS_FMT_SRGGB10_1X10 = 0x300f, + V4L2_MBUS_FMT_SBGGR12_1X12 = 0x3008, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MBUS_FMT_SGBRG12_1X12 = 0x3010, + V4L2_MBUS_FMT_SGRBG12_1X12 = 0x3011, + V4L2_MBUS_FMT_SRGGB12_1X12 = 0x3012, + V4L2_MBUS_FMT_JPEG_1X8 = 0x4001, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct v4l2_mbus_framefmt { + __u32 width; + __u32 height; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 code; + __u32 field; + __u32 colorspace; + __u32 reserved[7]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +#endif diff --git a/original-kernel-headers/linux/v4l2-subdev.h b/original-kernel-headers/linux/v4l2-subdev.h new file mode 100644 index 0000000..5708b8f --- /dev/null +++ b/original-kernel-headers/linux/v4l2-subdev.h @@ -0,0 +1,94 @@ +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ +#ifndef __LINUX_V4L2_SUBDEV_H +#define __LINUX_V4L2_SUBDEV_H +#include +#include +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#include "v4l2-mediabus.h" +enum v4l2_subdev_format_whence { + V4L2_SUBDEV_FORMAT_TRY = 0, + V4L2_SUBDEV_FORMAT_ACTIVE = 1, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct v4l2_subdev_format { + __u32 which; + __u32 pad; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct v4l2_mbus_framefmt format; + __u32 reserved[8]; +}; +struct v4l2_subdev_crop { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 which; + __u32 pad; + struct v4l2_rect rect; + __u32 reserved[8]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct v4l2_subdev_mbus_code_enum { + __u32 pad; + __u32 index; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 code; + __u32 reserved[9]; +}; +struct v4l2_subdev_frame_size_enum { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 index; + __u32 pad; + __u32 code; + __u32 min_width; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 max_width; + __u32 min_height; + __u32 max_height; + __u32 reserved[9]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct v4l2_subdev_frame_interval { + __u32 pad; + struct v4l2_fract interval; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 reserved[9]; +}; +struct v4l2_subdev_frame_interval_enum { + __u32 index; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 pad; + __u32 code; + __u32 width; + __u32 height; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct v4l2_fract interval; + __u32 reserved[9]; +}; +#define VIDIOC_SUBDEV_G_FMT _IOWR('V', 4, struct v4l2_subdev_format) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define VIDIOC_SUBDEV_S_FMT _IOWR('V', 5, struct v4l2_subdev_format) +#define VIDIOC_SUBDEV_G_FRAME_INTERVAL _IOWR('V', 21, struct v4l2_subdev_frame_interval) +#define VIDIOC_SUBDEV_S_FRAME_INTERVAL _IOWR('V', 22, struct v4l2_subdev_frame_interval) +#define VIDIOC_SUBDEV_ENUM_MBUS_CODE _IOWR('V', 2, struct v4l2_subdev_mbus_code_enum) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define VIDIOC_SUBDEV_ENUM_FRAME_SIZE _IOWR('V', 74, struct v4l2_subdev_frame_size_enum) +#define VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL _IOWR('V', 75, struct v4l2_subdev_frame_interval_enum) +#define VIDIOC_SUBDEV_G_CROP _IOWR('V', 59, struct v4l2_subdev_crop) +#define VIDIOC_SUBDEV_S_CROP _IOWR('V', 60, struct v4l2_subdev_crop) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif diff --git a/original-kernel-headers/linux/videodev2_exynos_media.h b/original-kernel-headers/linux/videodev2_exynos_media.h new file mode 100644 index 0000000..4b6fffe --- /dev/null +++ b/original-kernel-headers/linux/videodev2_exynos_media.h @@ -0,0 +1,189 @@ +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ +#ifndef __LINUX_VIDEODEV2_EXYNOS_MEDIA_H +#define __LINUX_VIDEODEV2_EXYNOS_MEDIA_H +#define V4L2_PIX_FMT_YUV444_2P v4l2_fourcc('Y', 'U', '2', 'P') +#define V4L2_PIX_FMT_YVU444_2P v4l2_fourcc('Y', 'V', '2', 'P') +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_PIX_FMT_YUV444_3P v4l2_fourcc('Y', 'U', '3', 'P') +#define V4L2_PIX_FMT_NV21M v4l2_fourcc('N', 'M', '2', '1') +#define V4L2_PIX_FMT_NV12MT_16X16 v4l2_fourcc('V', 'M', '1', '2') +#define V4L2_PIX_FMT_YVU420M v4l2_fourcc('Y', 'V', 'U', 'M') +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_PIX_FMT_H264_MVC v4l2_fourcc('M', '2', '6', '4') +#define V4L2_PIX_FMT_FIMV v4l2_fourcc('F', 'I', 'M', 'V') +#define V4L2_PIX_FMT_FIMV1 v4l2_fourcc('F', 'I', 'M', '1') +#define V4L2_PIX_FMT_FIMV2 v4l2_fourcc('F', 'I', 'M', '2') +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_PIX_FMT_FIMV3 v4l2_fourcc('F', 'I', 'M', '3') +#define V4L2_PIX_FMT_FIMV4 v4l2_fourcc('F', 'I', 'M', '4') +#define V4L2_PIX_FMT_VP8 v4l2_fourcc('V', 'P', '8', '0') +#define V4L2_PIX_FMT_JPEG_444 v4l2_fourcc('J', 'P', 'G', '4') +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_PIX_FMT_JPEG_422 v4l2_fourcc('J', 'P', 'G', '2') +#define V4L2_PIX_FMT_JPEG_420 v4l2_fourcc('J', 'P', 'G', '0') +#define V4L2_PIX_FMT_JPEG_GRAY v4l2_fourcc('J', 'P', 'G', 'G') +#define V4L2_CID_EXYNOS_BASE (V4L2_CTRL_CLASS_USER | 0x2000) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_GLOBAL_ALPHA (V4L2_CID_EXYNOS_BASE + 1) +#define V4L2_CID_CACHEABLE (V4L2_CID_EXYNOS_BASE + 10) +#define V4L2_CID_CAM_JPEG_MEMSIZE (V4L2_CID_EXYNOS_BASE + 20) +#define V4L2_CID_CAM_JPEG_ENCODEDSIZE (V4L2_CID_EXYNOS_BASE + 21) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_SET_SHAREABLE (V4L2_CID_EXYNOS_BASE + 40) +#define V4L2_CID_TV_LAYER_BLEND_ENABLE (V4L2_CID_EXYNOS_BASE + 50) +#define V4L2_CID_TV_LAYER_BLEND_ALPHA (V4L2_CID_EXYNOS_BASE + 51) +#define V4L2_CID_TV_PIXEL_BLEND_ENABLE (V4L2_CID_EXYNOS_BASE + 52) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_TV_CHROMA_ENABLE (V4L2_CID_EXYNOS_BASE + 53) +#define V4L2_CID_TV_CHROMA_VALUE (V4L2_CID_EXYNOS_BASE + 54) +#define V4L2_CID_TV_HPD_STATUS (V4L2_CID_EXYNOS_BASE + 55) +#define V4L2_CID_TV_LAYER_PRIO (V4L2_CID_EXYNOS_BASE + 56) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_TV_SET_DVI_MODE (V4L2_CID_EXYNOS_BASE + 57) +#define V4L2_CID_TV_GET_DVI_MODE (V4L2_CID_EXYNOS_BASE + 58) +#define V4L2_CID_TV_SET_ASPECT_RATIO (V4L2_CID_EXYNOS_BASE + 59) +#define V4L2_CID_TV_MAX_AUDIO_CHANNELS (V4L2_CID_EXYNOS_BASE + 60) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_TV_ENABLE_HDMI_AUDIO (V4L2_CID_EXYNOS_BASE + 61) +#define V4L2_CID_TV_SET_NUM_CHANNELS (V4L2_CID_EXYNOS_BASE + 62) +#define V4L2_CID_TV_UPDATE (V4L2_CID_EXYNOS_BASE + 63) +#define V4L2_CID_TV_SET_COLOR_RANGE (V4L2_CID_EXYNOS_BASE + 64) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_TV_HDCP_ENABLE (V4L2_CID_EXYNOS_BASE + 65) +#define V4L2_CID_TV_HDMI_STATUS (V4L2_CID_EXYNOS_BASE + 66) +#define V4L2_CID_CSC_EQ_MODE (V4L2_CID_EXYNOS_BASE + 100) +#define V4L2_CID_CSC_EQ (V4L2_CID_EXYNOS_BASE + 101) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_CSC_RANGE (V4L2_CID_EXYNOS_BASE + 102) +#define V4L2_CID_CONTENT_PROTECTION (V4L2_CID_EXYNOS_BASE + 199) +#define V4L2_CID_USE_SYSMMU (V4L2_CID_EXYNOS_BASE + 200) +#define V4L2_CID_M2M_CTX_NUM (V4L2_CID_EXYNOS_BASE + 201) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_2D_BLEND_OP (V4L2_CID_EXYNOS_BASE + 103) +#define V4L2_CID_2D_COLOR_FILL (V4L2_CID_EXYNOS_BASE + 104) +#define V4L2_CID_2D_DITH (V4L2_CID_EXYNOS_BASE + 105) +#define V4L2_CID_2D_FMT_PREMULTI (V4L2_CID_EXYNOS_BASE + 106) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_MFC_BASE (V4L2_CTRL_CLASS_MPEG | 0x2000) +#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_AVAIL (V4L2_CID_MPEG_MFC_BASE + 1) +#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRGMENT_ID (V4L2_CID_MPEG_MFC_BASE + 2) +#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_INFO (V4L2_CID_MPEG_MFC_BASE + 3) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_GRID_POS (V4L2_CID_MPEG_MFC_BASE + 4) +#define V4L2_CID_MPEG_MFC51_VIDEO_PACKED_PB (V4L2_CID_MPEG_MFC_BASE + 5) +#define V4L2_CID_MPEG_MFC51_VIDEO_FRAME_TAG (V4L2_CID_MPEG_MFC_BASE + 6) +#define V4L2_CID_MPEG_MFC51_VIDEO_CRC_ENABLE (V4L2_CID_MPEG_MFC_BASE + 7) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_MFC51_VIDEO_CRC_DATA_LUMA (V4L2_CID_MPEG_MFC_BASE + 8) +#define V4L2_CID_MPEG_MFC51_VIDEO_CRC_DATA_CHROMA (V4L2_CID_MPEG_MFC_BASE + 9) +#define V4L2_CID_MPEG_MFC51_VIDEO_CRC_DATA_LUMA_BOT (V4L2_CID_MPEG_MFC_BASE + 10) +#define V4L2_CID_MPEG_MFC51_VIDEO_CRC_DATA_CHROMA_BOT (V4L2_CID_MPEG_MFC_BASE + 11) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_MFC51_VIDEO_CRC_GENERATED (V4L2_CID_MPEG_MFC_BASE + 12) +#define V4L2_CID_MPEG_MFC51_VIDEO_CHECK_STATE (V4L2_CID_MPEG_MFC_BASE + 13) +#define V4L2_CID_MPEG_MFC51_VIDEO_DISPLAY_STATUS (V4L2_CID_MPEG_MFC_BASE + 14) +#define V4L2_CID_MPEG_MFC51_VIDEO_LUMA_ADDR (V4L2_CID_MPEG_MFC_BASE + 15) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_MFC51_VIDEO_CHROMA_ADDR (V4L2_CID_MPEG_MFC_BASE + 16) +#define V4L2_CID_MPEG_MFC51_VIDEO_STREAM_SIZE (V4L2_CID_MPEG_MFC_BASE + 17) +#define V4L2_CID_MPEG_MFC51_VIDEO_FRAME_COUNT (V4L2_CID_MPEG_MFC_BASE + 18) +#define V4L2_CID_MPEG_MFC51_VIDEO_FRAME_TYPE (V4L2_CID_MPEG_MFC_BASE + 19) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum v4l2_mpeg_mfc51_video_frame_type { + V4L2_MPEG_MFC51_VIDEO_FRAME_TYPE_NOT_CODED = 0, + V4L2_MPEG_MFC51_VIDEO_FRAME_TYPE_I_FRAME = 1, + V4L2_MPEG_MFC51_VIDEO_FRAME_TYPE_P_FRAME = 2, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MPEG_MFC51_VIDEO_FRAME_TYPE_B_FRAME = 3, + V4L2_MPEG_MFC51_VIDEO_FRAME_TYPE_SKIPPED = 4, + V4L2_MPEG_MFC51_VIDEO_FRAME_TYPE_OTHERS = 5, +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_MFC51_VIDEO_H264_INTERLACE (V4L2_CID_MPEG_MFC_BASE + 20) +#define V4L2_CID_MPEG_MFC51_VIDEO_H264_RC_FRAME_RATE (V4L2_CID_MPEG_MFC_BASE + 21) +#define V4L2_CID_MPEG_MFC51_VIDEO_MPEG4_VOP_TIME_RES (V4L2_CID_MPEG_MFC_BASE + 22) +#define V4L2_CID_MPEG_MFC51_VIDEO_MPEG4_VOP_FRM_DELTA (V4L2_CID_MPEG_MFC_BASE + 23) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_MFC51_VIDEO_H263_RC_FRAME_RATE (V4L2_CID_MPEG_MFC_BASE + 24) +#define V4L2_CID_MPEG_MFC6X_VIDEO_FRAME_DELTA (V4L2_CID_MPEG_MFC_BASE + 25) +#define V4L2_CID_MPEG_MFC51_VIDEO_I_PERIOD_CH V4L2_CID_MPEG_VIDEO_GOP_SIZE +#define V4L2_CID_MPEG_MFC51_VIDEO_FRAME_RATE_CH V4L2_CID_MPEG_MFC51_VIDEO_H264_RC_FRAME_RATE +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_MFC51_VIDEO_BIT_RATE_CH V4L2_CID_MPEG_VIDEO_BITRATE +#define V4L2_MPEG_VIDEO_MPEG4_LEVEL_6 8 +#define V4L2_MPEG_VIDEO_HEADER_MODE_AT_THE_READY 2 +#define V4L2_CID_MPEG_VIDEO_VBV_DELAY (V4L2_CID_MPEG_MFC_BASE + 26) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_S_B V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY +#define V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING (V4L2_CID_MPEG_MFC_BASE + 27) +#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_CURRENT_FRAME_0 (V4L2_CID_MPEG_MFC_BASE + 28) +#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE (V4L2_CID_MPEG_MFC_BASE + 29) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum v4l2_mpeg_video_h264_sei_fp_arrangement_type { + V4L2_MPEG_VIDEO_H264_SEI_FP_TYPE_CHEKERBOARD = 0, + V4L2_MPEG_VIDEO_H264_SEI_FP_TYPE_COLUMN = 1, + V4L2_MPEG_VIDEO_H264_SEI_FP_TYPE_ROW = 2, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MPEG_VIDEO_H264_SEI_FP_TYPE_SIDE_BY_SIDE = 3, + V4L2_MPEG_VIDEO_H264_SEI_FP_TYPE_TOP_BOTTOM = 4, + V4L2_MPEG_VIDEO_H264_SEI_FP_TYPE_TEMPORAL = 5, +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_VIDEO_H264_FMO (V4L2_CID_MPEG_MFC_BASE + 30) +#define V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE (V4L2_CID_MPEG_MFC_BASE + 31) +enum v4l2_mpeg_video_h264_fmo_map_type { + V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_INTERLEAVED_SLICES = 0, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_SCATTERED_SLICES = 1, + V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_FOREGROUND_WITH_LEFT_OVER = 2, + V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_BOX_OUT = 3, + V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_RASTER_SCAN = 4, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_WIPE_SCAN = 5, + V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_EXPLICIT = 6, +}; +#define V4L2_CID_MPEG_VIDEO_H264_FMO_SLICE_GROUP (V4L2_CID_MPEG_MFC_BASE + 32) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_DIRECTION (V4L2_CID_MPEG_MFC_BASE + 33) +enum v4l2_mpeg_video_h264_fmo_change_dir { + V4L2_MPEG_VIDEO_H264_FMO_CHANGE_DIR_RIGHT = 0, + V4L2_MPEG_VIDEO_H264_FMO_CHANGE_DIR_LEFT = 1, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +#define V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_RATE (V4L2_CID_MPEG_MFC_BASE + 34) +#define V4L2_CID_MPEG_VIDEO_H264_FMO_RUN_LENGTH (V4L2_CID_MPEG_MFC_BASE + 35) +#define V4L2_CID_MPEG_VIDEO_H264_ASO (V4L2_CID_MPEG_MFC_BASE + 36) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_VIDEO_H264_ASO_SLICE_ORDER (V4L2_CID_MPEG_MFC_BASE + 37) +#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING (V4L2_CID_MPEG_MFC_BASE + 38) +#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE (V4L2_CID_MPEG_MFC_BASE + 39) +enum v4l2_mpeg_video_h264_hierarchical_coding_type { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B = 0, + V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P = 1, +}; +#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER (V4L2_CID_MPEG_MFC_BASE + 40) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP (V4L2_CID_MPEG_MFC_BASE + 41) +#define V4L2_CID_MPEG_VIDEO_H264_MVC_VIEW_ID (V4L2_CID_MPEG_MFC_BASE + 42) +#define V4L2_CID_MPEG_MFC51_VIDEO_FRAME_STATUS (V4L2_CID_MPEG_MFC_BASE + 43) +#define V4L2_CID_MPEG_MFC51_VIDEO_I_FRAME_DECODING (V4L2_CID_MPEG_MFC_BASE + 44) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif -- 2.20.1