diff options
88 files changed, 7749 insertions, 4699 deletions
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_BSD_APL2 index e69de29..e69de29 100644 --- a/MODULE_LICENSE_APACHE2 +++ b/MODULE_LICENSE_BSD_APL2 diff --git a/camera/ANativeWindowDisplayAdapter.cpp b/camera/ANativeWindowDisplayAdapter.cpp index 3f13b52..e4a70ae 100644 --- a/camera/ANativeWindowDisplayAdapter.cpp +++ b/camera/ANativeWindowDisplayAdapter.cpp @@ -177,8 +177,8 @@ ANativeWindowDisplayAdapter::ANativeWindowDisplayAdapter():mDisplayThread(NULL), mFailedDQs = 0; mPaused = false; - mXOff = 0; - mYOff = 0; + mXOff = -1; + mYOff = -1; mFirstInit = false; mFD = -1; @@ -269,6 +269,10 @@ int ANativeWindowDisplayAdapter::setPreviewWindow(preview_stream_ops_t* window) return BAD_VALUE; } + if ( window == mANativeWindow ) { + return ALREADY_EXISTS; + } + ///Destroy the existing window object, if it exists destroy(); @@ -454,8 +458,8 @@ int ANativeWindowDisplayAdapter::disableDisplay(bool cancel_buffer) mDisplayEnabled = false; ///Reset the offset values - mXOff = 0; - mYOff = 0; + mXOff = -1; + mYOff = -1; ///Reset the frame width and height values mFrameWidth =0; @@ -536,7 +540,7 @@ void* ANativeWindowDisplayAdapter::allocateBuffer(int width, int height, const c // Set gralloc usage bits for window. err = mANativeWindow->set_usage(mANativeWindow, CAMHAL_GRALLOC_USAGE); if (err != 0) { - LOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err); + ALOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err); if ( ENODEV == err ) { CAMHAL_LOGEA("Preview surface abandoned!"); @@ -550,7 +554,7 @@ void* ANativeWindowDisplayAdapter::allocateBuffer(int width, int height, const c ///Set the number of buffers needed for camera preview err = mANativeWindow->set_buffer_count(mANativeWindow, numBufs); if (err != 0) { - LOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), -err); + ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), -err); if ( ENODEV == err ) { CAMHAL_LOGEA("Preview surface abandoned!"); @@ -571,7 +575,7 @@ void* ANativeWindowDisplayAdapter::allocateBuffer(int width, int height, const c /*toOMXPixFormat(format)*/HAL_PIXEL_FORMAT_TI_NV12); // Gralloc only supports NV12 alloc! if (err != 0) { - LOGE("native_window_set_buffers_geometry failed: %s (%d)", strerror(-err), -err); + ALOGE("native_window_set_buffers_geometry failed: %s (%d)", strerror(-err), -err); if ( ENODEV == err ) { CAMHAL_LOGEA("Preview surface abandoned!"); @@ -826,7 +830,7 @@ status_t ANativeWindowDisplayAdapter::returnBuffersToWindow() } } else - LOGE("mANativeWindow is NULL"); + ALOGE("mANativeWindow is NULL"); ///Clear the frames with camera adapter map mFramesWithCameraAdapterMap.clear(); @@ -1095,7 +1099,7 @@ status_t ANativeWindowDisplayAdapter::PostFrame(ANativeWindowDisplayAdapter::Dis mapper.unlock((buffer_handle_t) mGrallocHandleMap[i]); ret = mANativeWindow->enqueue_buffer(mANativeWindow, mBufferHandleMap[i]); if (ret != 0) { - LOGE("Surface::queueBuffer returned error %d", ret); + ALOGE("Surface::queueBuffer returned error %d", ret); } mFramesWithCameraAdapterMap.removeItem((int) dispFrame.mBuffer); @@ -1137,7 +1141,7 @@ status_t ANativeWindowDisplayAdapter::PostFrame(ANativeWindowDisplayAdapter::Dis // cancel buffer and dequeue another one ret = mANativeWindow->cancel_buffer(mANativeWindow, mBufferHandleMap[i]); if (ret != 0) { - LOGE("Surface::queueBuffer returned error %d", ret); + ALOGE("Surface::queueBuffer returned error %d", ret); } mFramesWithCameraAdapterMap.removeItem((int) dispFrame.mBuffer); diff --git a/camera/Android.mk b/camera/Android.mk index a84d0f9..1d7e048 100644 --- a/camera/Android.mk +++ b/camera/Android.mk @@ -59,13 +59,11 @@ LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/inc/OMXCameraAdapter \ $(LOCAL_PATH)/../libtiutils \ hardware/ti/omap4xxx/tiler \ - hardware/ti/omap4xxx/ion \ - frameworks/base/include/ui \ - frameworks/base/include/utils \ hardware/ti/omap4xxx/domx/omx_core/inc \ hardware/ti/omap4xxx/domx/mm_osal/inc \ frameworks/base/include/media/stagefright \ - frameworks/base/include/media/stagefright/openmax \ + frameworks/native/include/media/hardware \ + frameworks/native/include/media/openmax \ external/jpeg \ external/jhead diff --git a/camera/AppCallbackNotifier.cpp b/camera/AppCallbackNotifier.cpp index bfdd671..c6dfffa 100644 --- a/camera/AppCallbackNotifier.cpp +++ b/camera/AppCallbackNotifier.cpp @@ -38,12 +38,24 @@ void AppCallbackNotifierEncoderCallback(void* main_jpeg, CameraFrame::FrameType type, void* cookie1, void* cookie2, - void* cookie3) + void* cookie3, + bool canceled) { - if (cookie1) { + if (cookie1 && !canceled) { AppCallbackNotifier* cb = (AppCallbackNotifier*) cookie1; cb->EncoderDoneCb(main_jpeg, thumb_jpeg, type, cookie2, cookie3); } + + if (main_jpeg) { + free(main_jpeg); + } + + if (thumb_jpeg) { + if (((Encoder_libjpeg::params *) thumb_jpeg)->dst) { + free(((Encoder_libjpeg::params *) thumb_jpeg)->dst); + } + free(thumb_jpeg); + } } /*--------------------NotificationHandler Class STARTS here-----------------------------*/ @@ -129,30 +141,17 @@ void AppCallbackNotifier::EncoderDoneCb(void* main_jpeg, void* thumb_jpeg, Camer exit: - if (main_jpeg) { - free(main_jpeg); - } - - if (thumb_jpeg) { - if (((Encoder_libjpeg::params *) thumb_jpeg)->dst) { - free(((Encoder_libjpeg::params *) thumb_jpeg)->dst); - } - free(thumb_jpeg); - } - - if (encoded_mem) { - encoded_mem->release(encoded_mem); - } - if (picture) { picture->release(picture); } - if (cookie2) { - delete (ExifElementsTable*) cookie2; - } - if (mNotifierState == AppCallbackNotifier::NOTIFIER_STARTED) { + if (encoded_mem) { + encoded_mem->release(encoded_mem); + } + if (cookie2) { + delete (ExifElementsTable*) cookie2; + } encoder = gEncoderQueue.valueFor(src); if (encoder.get()) { gEncoderQueue.removeItem(src); @@ -285,7 +284,8 @@ bool AppCallbackNotifier::notificationThread() CAMHAL_LOGDA("Notification Thread received message from Camera HAL"); shouldLive = processMessage(); if(!shouldLive) { - CAMHAL_LOGDA("Notification Thread exiting."); + CAMHAL_LOGDA("Notification Thread exiting."); + return shouldLive; } } @@ -311,8 +311,12 @@ void AppCallbackNotifier::notifyEvent() TIUTILS::Message msg; LOG_FUNCTION_NAME; { - Mutex::Autolock lock(mLock); - mEventQ.get(&msg); + Mutex::Autolock lock(mLock); + if(!mEventQ.isEmpty()) { + mEventQ.get(&msg); + } else { + return; + } } bool ret = true; CameraHalEvent *evt = NULL; @@ -353,23 +357,36 @@ void AppCallbackNotifier::notifyEvent() case CameraHalEvent::EVENT_FOCUS_LOCKED: case CameraHalEvent::EVENT_FOCUS_ERROR: - focusEvtData = &evt->mEventData->focusEvent; - if ( ( focusEvtData->focusLocked ) && - ( NULL != mCameraHal ) && - ( NULL != mNotifyCb ) && - ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS) ) ) + if ( ( focusEvtData->focusStatus == CameraHalEvent::FOCUS_STATUS_SUCCESS ) && + ( NULL != mCameraHal ) && + ( NULL != mNotifyCb ) && + ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS) ) ) { - mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie); mCameraHal->disableMsgType(CAMERA_MSG_FOCUS); + mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie); } - else if ( focusEvtData->focusError && - ( NULL != mCameraHal ) && - ( NULL != mNotifyCb ) && - ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS) ) ) + else if ( ( focusEvtData->focusStatus == CameraHalEvent::FOCUS_STATUS_FAIL ) && + ( NULL != mCameraHal ) && + ( NULL != mNotifyCb ) && + ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS) ) ) { - mNotifyCb(CAMERA_MSG_FOCUS, false, 0, mCallbackCookie); mCameraHal->disableMsgType(CAMERA_MSG_FOCUS); + mNotifyCb(CAMERA_MSG_FOCUS, false, 0, mCallbackCookie); + } + else if ( ( focusEvtData->focusStatus == CameraHalEvent::FOCUS_STATUS_PENDING ) && + ( NULL != mCameraHal ) && + ( NULL != mNotifyCb ) && + ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS_MOVE) ) ) + { + mNotifyCb(CAMERA_MSG_FOCUS_MOVE, true, 0, mCallbackCookie); + } + else if ( ( focusEvtData->focusStatus == CameraHalEvent::FOCUS_STATUS_DONE ) && + ( NULL != mCameraHal ) && + ( NULL != mNotifyCb ) && + ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS_MOVE) ) ) + { + mNotifyCb(CAMERA_MSG_FOCUS_MOVE, false, 0, mCallbackCookie); } break; @@ -433,6 +450,21 @@ void AppCallbackNotifier::notifyEvent() } +static void alignYV12(int width, + int height, + int &yStride, + int &uvStride, + int &ySize, + int &uvSize, + int &size) +{ + yStride = ( width + 0xF ) & ~0xF; + uvStride = ( yStride / 2 + 0xF ) & ~0xF; + ySize = yStride * height; + uvSize = uvStride * height / 2; + size = ySize + uvSize * 2; +} + static void copy2Dto1D(void *dst, void *src, int width, @@ -451,11 +483,54 @@ static void copy2Dto1D(void *dst, unsigned int *y_uv = (unsigned int *)src; CAMHAL_LOGVB("copy2Dto1D() y= %p ; uv=%p.",y_uv[0], y_uv[1]); - CAMHAL_LOGVB("pixelFormat,= %d; offset=%d",*pixelFormat,offset); + CAMHAL_LOGVB("pixelFormat= %s; offset=%d", pixelFormat,offset); if (pixelFormat!=NULL) { if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV422I) == 0) { bytesPerPixel = 2; + bufferSrc = ( unsigned char * ) y_uv[0] + offset; + uint32_t xOff = offset % stride; + uint32_t yOff = offset / stride; + uint8_t *bufferSrcUV = ((uint8_t*)y_uv[1] + (stride/2)*yOff + xOff); + uint8_t *bufferSrcUVEven = bufferSrcUV; + + uint8_t *bufferDstY = ( uint8_t * ) dst; + uint8_t *bufferDstU = bufferDstY + 1; + uint8_t *bufferDstV = bufferDstY + 3; + + // going to convert from NV12 here and return + for ( int i = 0 ; i < height; i ++ ) { + for ( int j = 0 ; j < width / 2 ; j++ ) { + + // Y + *bufferDstY = *bufferSrc; + bufferSrc++; + bufferDstY += 2; + + *bufferDstY = *bufferSrc; + bufferSrc++; + bufferDstY += 2; + + // V + *bufferDstV = *(bufferSrcUV + 1); + bufferDstV += 4; + + // U + *bufferDstU = *bufferSrcUV; + bufferDstU += 4; + + bufferSrcUV += 2; + } + if ( i % 2 ) { + bufferSrcUV += ( stride - width); + bufferSrcUVEven = bufferSrcUV; + } else { + bufferSrcUV = bufferSrcUVEven; + } + bufferSrc += ( stride - width); + } + + return; } else if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420P) == 0) { bytesPerPixel = 1; @@ -539,8 +614,12 @@ static void copy2Dto1D(void *dst, // camera adapter to support YV12. Need to address for // USBCamera - bufferDst_V = (uint16_t *) (((uint8_t*)dst)+row*height); - bufferDst_U = (uint16_t *) (((uint8_t*)dst)+row*height+row*height/4); + int yStride, uvStride, ySize, uvSize, size; + alignYV12(width, height, yStride, uvStride, ySize, uvSize, size); + + bufferDst_V = (uint16_t *) (((uint8_t*)dst) + ySize); + bufferDst_U = (uint16_t *) (((uint8_t*)dst) + ySize + uvSize); + int inc = (uvStride - width/2)/2; for (int i = 0 ; i < height/2 ; i++, bufferSrc_UV += alignedRow/2) { int n = width; @@ -584,7 +663,11 @@ static void copy2Dto1D(void *dst, : [src_stride] "r" (stride_bytes) : "cc", "memory", "q0", "q1" ); + + bufferDst_U += inc; + bufferDst_V += inc; } + } return ; @@ -1206,7 +1289,7 @@ bool AppCallbackNotifier::processMessage() { case NotificationThread::NOTIFIER_EXIT: { - CAMHAL_LOGI("Received NOTIFIER_EXIT command from Camera HAL"); + CAMHAL_LOGDA("Received NOTIFIER_EXIT command from Camera HAL"); mNotifierState = AppCallbackNotifier::NOTIFIER_EXITED; ret = false; break; @@ -1356,7 +1439,7 @@ status_t AppCallbackNotifier::startPreviewCallbacks(CameraParameters ¶ms, vo sp<MemoryHeapBase> heap; sp<MemoryBase> buffer; unsigned int *bufArr; - size_t size = 0; + int size = 0; LOG_FUNCTION_NAME; @@ -1386,8 +1469,7 @@ status_t AppCallbackNotifier::startPreviewCallbacks(CameraParameters ¶ms, vo size = w*h*2; mPreviewPixelFormat = CameraParameters::PIXEL_FORMAT_YUV422I; } - else if(strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || - strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV420P) == 0) + else if(strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 ) { size = (w*h*3)/2; mPreviewPixelFormat = CameraParameters::PIXEL_FORMAT_YUV420SP; @@ -1397,6 +1479,12 @@ status_t AppCallbackNotifier::startPreviewCallbacks(CameraParameters ¶ms, vo size = w*h*2; mPreviewPixelFormat = CameraParameters::PIXEL_FORMAT_RGB565; } + else if(strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV420P) == 0) + { + int yStride, uvStride, ySize, uvSize; + alignYV12(w, h, yStride, uvStride, ySize, uvSize, size); + mPreviewPixelFormat = CameraParameters::PIXEL_FORMAT_YUV420P; + } mPreviewMemory = mRequestMemory(-1, size, AppCallbackNotifier::MAX_BUFFERS, NULL); if (!mPreviewMemory) { @@ -1664,7 +1752,7 @@ status_t AppCallbackNotifier::enableMsgType(int32_t msgType) status_t AppCallbackNotifier::disableMsgType(int32_t msgType) { - if(!mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME | CAMERA_MSG_POSTVIEW_FRAME)) { + if( msgType & (CAMERA_MSG_PREVIEW_FRAME | CAMERA_MSG_POSTVIEW_FRAME) ) { mFrameProvider->disableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); } @@ -1732,9 +1820,20 @@ status_t AppCallbackNotifier::stop() while(!gEncoderQueue.isEmpty()) { sp<Encoder_libjpeg> encoder = gEncoderQueue.valueAt(0); + camera_memory_t* encoded_mem = NULL; + ExifElementsTable* exif = NULL; + if(encoder.get()) { encoder->cancel(); - encoder->join(); + + encoder->getCookies(NULL, (void**) &encoded_mem, (void**) &exif); + if (encoded_mem) { + encoded_mem->release(encoded_mem); + } + if (exif) { + delete exif; + } + encoder.clear(); } gEncoderQueue.removeItemsAt(0); diff --git a/camera/BaseCameraAdapter.cpp b/camera/BaseCameraAdapter.cpp index 882e4df..bb7a5b8 100644 --- a/camera/BaseCameraAdapter.cpp +++ b/camera/BaseCameraAdapter.cpp @@ -258,8 +258,6 @@ void BaseCameraAdapter::returnFrame(void* frameBuf, CameraFrame::FrameType frame size_t subscriberCount = 0; int refCount = -1; - Mutex::Autolock lock(mReturnFrameLock); - if ( NULL == frameBuf ) { CAMHAL_LOGEA("Invalid frameBuf"); @@ -268,6 +266,7 @@ void BaseCameraAdapter::returnFrame(void* frameBuf, CameraFrame::FrameType frame if ( NO_ERROR == res) { + Mutex::Autolock lock(mReturnFrameLock); refCount = getFrameRefCount(frameBuf, frameType); @@ -314,8 +313,8 @@ void BaseCameraAdapter::returnFrame(void* frameBuf, CameraFrame::FrameType frame #ifdef DEBUG_LOG if(mBuffersWithDucati.indexOfKey((int)frameBuf)>=0) { - LOGE("Buffer already with Ducati!! 0x%x", frameBuf); - for(int i=0;i<mBuffersWithDucati.size();i++) LOGE("0x%x", mBuffersWithDucati.keyAt(i)); + ALOGE("Buffer already with Ducati!! 0x%x", frameBuf); + for(int i=0;i<mBuffersWithDucati.size();i++) ALOGE("0x%x", mBuffersWithDucati.keyAt(i)); } mBuffersWithDucati.add((int)frameBuf,1); #endif @@ -985,7 +984,7 @@ status_t BaseCameraAdapter::sendCommand(CameraCommands operation, int value1, in return ret; } -status_t BaseCameraAdapter::notifyFocusSubscribers(bool status) +status_t BaseCameraAdapter::notifyFocusSubscribers(CameraHalEvent::FocusStatus status) { event_callback eventCb; CameraHalEvent focusEvent; @@ -999,10 +998,12 @@ status_t BaseCameraAdapter::notifyFocusSubscribers(bool status) } #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS - - //dump the AF latency - CameraHal::PPM("Focus finished in: ", &mStartFocus); - + if (status == CameraHalEvent::FOCUS_STATUS_PENDING) { + gettimeofday(&mStartFocus, NULL); + } else { + //dump the AF latency + CameraHal::PPM("Focus finished in: ", &mStartFocus); + } #endif focusEvent.mEventData = new CameraHalEvent::CameraHalEventData(); @@ -1011,8 +1012,7 @@ status_t BaseCameraAdapter::notifyFocusSubscribers(bool status) } focusEvent.mEventType = CameraHalEvent::EVENT_FOCUS_LOCKED; - focusEvent.mEventData->focusEvent.focusLocked = status; - focusEvent.mEventData->focusEvent.focusError = !status; + focusEvent.mEventData->focusEvent.focusStatus = status; for (unsigned int i = 0 ; i < mFocusSubscribers.size(); i++ ) { @@ -1054,7 +1054,7 @@ status_t BaseCameraAdapter::notifyShutterSubscribers() shutterEvent.mCookie = ( void * ) mShutterSubscribers.keyAt(i); eventCb = ( event_callback ) mShutterSubscribers.valueAt(i); - CAMHAL_LOGEA("Sending shutter callback"); + CAMHAL_LOGDA("Sending shutter callback"); eventCb ( &shutterEvent ); } @@ -1518,7 +1518,7 @@ status_t BaseCameraAdapter::autoFocus() LOG_FUNCTION_NAME; - notifyFocusSubscribers(false); + notifyFocusSubscribers(CameraHalEvent::FOCUS_STATUS_FAIL); LOG_FUNCTION_NAME_EXIT; @@ -1696,6 +1696,12 @@ status_t BaseCameraAdapter::setState(CameraCommands operation) mNextState = INTIALIZED_STATE; break; + case CAMERA_CANCEL_AUTOFOCUS: + case CAMERA_STOP_BRACKET_CAPTURE: + case CAMERA_STOP_IMAGE_CAPTURE: + ret = INVALID_OPERATION; + break; + default: CAMHAL_LOGEB("Adapter state switch INTIALIZED_STATE Invalid Op! event = 0x%x", operation); @@ -1717,6 +1723,12 @@ status_t BaseCameraAdapter::setState(CameraCommands operation) mNextState = PREVIEW_STATE; break; + case CAMERA_STOP_PREVIEW: + CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->INTIALIZED_STATE event = 0x%x", + operation); + mNextState = INTIALIZED_STATE; + break; + //These events don't change the current state case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE: case CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA: diff --git a/camera/CameraHal.cpp b/camera/CameraHal.cpp index c7ba87f..db73443 100644 --- a/camera/CameraHal.cpp +++ b/camera/CameraHal.cpp @@ -131,9 +131,7 @@ void CameraHal::enableMsgType(int32_t msgType) // ignoring enable focus message from camera service // we will enable internally in autoFocus call - if (msgType & CAMERA_MSG_FOCUS) { - msgType &= ~CAMERA_MSG_FOCUS; - } + msgType &= ~(CAMERA_MSG_FOCUS | CAMERA_MSG_FOCUS_MOVE); { Mutex::Autolock lock(mLock); @@ -249,19 +247,14 @@ int CameraHal::setParameters(const CameraParameters& params) int w_orig, h_orig; int framerate,minframerate; int maxFPS, minFPS; - int error; - int base; const char *valstr = NULL; - const char *prevFormat; - char *af_coord; - TIUTILS::Message msg; + int varint = 0; status_t ret = NO_ERROR; + CameraParameters oldParams = mParameters; // Needed for KEY_RECORDING_HINT bool restartPreviewRequired = false; bool updateRequired = false; - CameraParameters oldParams(mParameters.flatten()); bool videoMode = false; - char range[MAX_PROP_VALUE_LENGTH]; { Mutex::Autolock lock(mLock); @@ -277,17 +270,19 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.setPreviewFormat(valstr); } else { CAMHAL_LOGEB("Invalid preview format.Supported: %s", mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS)); - return -EINVAL; + return BAD_VALUE; } } - if ((valstr = params.get(TICameraParameters::KEY_VNF)) != NULL) { - if ( (params.getInt(TICameraParameters::KEY_VNF)==0) || (params.getInt(TICameraParameters::KEY_VNF)==1) ) { - CAMHAL_LOGDB("VNF set %s", params.get(TICameraParameters::KEY_VNF)); - mParameters.set(TICameraParameters::KEY_VNF, valstr); + varint = params.getInt(TICameraParameters::KEY_VNF); + valstr = params.get(TICameraParameters::KEY_VNF); + if ( valstr != NULL ) { + if ( ( varint == 0 ) || ( varint == 1 ) ) { + CAMHAL_LOGDB("VNF set %s", valstr); + mParameters.set(TICameraParameters::KEY_VNF, varint); } else { CAMHAL_LOGEB("ERROR: Invalid VNF: %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } @@ -296,35 +291,37 @@ int CameraHal::setParameters(const CameraParameters& params) // vstab then return an error if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED), CameraParameters::TRUE) == 0) { - CAMHAL_LOGDB("VSTAB %s", - params.get(CameraParameters::KEY_VIDEO_STABILIZATION)); - mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION, - params.get(CameraParameters::KEY_VIDEO_STABILIZATION)); + CAMHAL_LOGDB("VSTAB %s",valstr); + mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION, valstr); } else if (strcmp(valstr, CameraParameters::TRUE) == 0) { CAMHAL_LOGEB("ERROR: Invalid VSTAB: %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } else { mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION, CameraParameters::FALSE); } } + + if( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL) { - CAMHAL_LOGDB("Capture mode set %s", params.get(TICameraParameters::KEY_CAP_MODE)); + CAMHAL_LOGDB("Capture mode set %s", valstr); mParameters.set(TICameraParameters::KEY_CAP_MODE, valstr); } if ((valstr = params.get(TICameraParameters::KEY_IPP)) != NULL) { if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES))) { - CAMHAL_LOGDB("IPP mode set %s", params.get(TICameraParameters::KEY_IPP)); + CAMHAL_LOGDB("IPP mode set %s", valstr); mParameters.set(TICameraParameters::KEY_IPP, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid IPP mode: %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } +#ifdef OMAP_ENHANCEMENT + if((valstr = params.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL) { CAMHAL_LOGDB("Stereo 3D->2D Preview mode is %s", params.get(TICameraParameters::KEY_S3D2D_PREVIEW)); @@ -336,18 +333,21 @@ int CameraHal::setParameters(const CameraParameters& params) CAMHAL_LOGDB("AutoConvergence mode is %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE)); mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr); } +#endif } params.getPreviewSize(&w, &h); if (w == -1 && h == -1) { CAMHAL_LOGEA("Unable to get preview size"); - return -EINVAL; + return BAD_VALUE; } int oldWidth, oldHeight; mParameters.getPreviewSize(&oldWidth, &oldHeight); +#ifdef OMAP_ENHANCEMENT + int orientation =0; if((valstr = params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)) != NULL) { @@ -361,7 +361,7 @@ int CameraHal::setParameters(const CameraParameters& params) if ( !isResolutionValid(h,w, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES))) { CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h); - return -EINVAL; + return BAD_VALUE; } else { @@ -375,7 +375,7 @@ int CameraHal::setParameters(const CameraParameters& params) if ( !isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES))) { CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h); - return -EINVAL; + return BAD_VALUE; } else { @@ -383,12 +383,23 @@ int CameraHal::setParameters(const CameraParameters& params) } } - if ( ( oldWidth != w ) || ( oldHeight != h ) ) - { - restartPreviewRequired |= true; - } - CAMHAL_LOGDB("PreviewResolution by App %d x %d", w, h); +#else + + if ( !isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES))) { + CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h); + return BAD_VALUE; + } else { + mParameters.setPreviewSize(w, h); + } + +#endif + + if ( ( oldWidth != w ) || ( oldHeight != h ) ) { + restartPreviewRequired |= true; + } + + CAMHAL_LOGDB("PreviewResolution by App %d x %d", w, h); // Handle RECORDING_HINT to Set/Reset Video Mode Parameters valstr = params.get(CameraParameters::KEY_RECORDING_HINT); @@ -429,7 +440,7 @@ int CameraHal::setParameters(const CameraParameters& params) else { CAMHAL_LOGEA("Invalid RECORDING_HINT"); - return -EINVAL; + return BAD_VALUE; } } else @@ -446,7 +457,7 @@ int CameraHal::setParameters(const CameraParameters& params) if ((valstr = params.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) { if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) { - CAMHAL_LOGDB("Focus mode set %s", params.get(CameraParameters::KEY_FOCUS_MODE)); + CAMHAL_LOGDB("Focus mode set %s", valstr); // we need to take a decision on the capture mode based on whether CAF picture or // video is chosen so the behavior of each is consistent to the application @@ -459,40 +470,44 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.set(CameraParameters::KEY_FOCUS_MODE, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } ///Below parameters can be changed when the preview is running if ( (valstr = params.getPictureFormat()) != NULL ) { - if (isParameterValid(params.getPictureFormat(),mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) { + if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) { mParameters.setPictureFormat(valstr); } else { CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr); - ret = -EINVAL; - } + return BAD_VALUE; } + } params.getPictureSize(&w, &h); if ( isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES))) { mParameters.setPictureSize(w, h); } else { CAMHAL_LOGEB("ERROR: Invalid picture resolution %dx%d", w, h); - ret = -EINVAL; + return BAD_VALUE; } CAMHAL_LOGDB("Picture Size by App %d x %d", w, h); +#ifdef OMAP_ENHANCEMENT + if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) { if (params.getInt(TICameraParameters::KEY_BURST) >=0) { - CAMHAL_LOGDB("Burst set %s", params.get(TICameraParameters::KEY_BURST)); + CAMHAL_LOGDB("Burst set %s", valstr); mParameters.set(TICameraParameters::KEY_BURST, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr); - ret = -EINVAL; + return BAD_VALUE; } } +#endif + framerate = params.getPreviewFrameRate(); valstr = params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE); CAMHAL_LOGDB("FRAMERATE %d", framerate); @@ -510,7 +525,7 @@ int CameraHal::setParameters(const CameraParameters& params) mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES))) { CAMHAL_LOGEA("Invalid frame rate range or frame rate"); - return -EINVAL; + return BAD_VALUE; } // Variable framerate ranges have higher priority over @@ -527,7 +542,7 @@ int CameraHal::setParameters(const CameraParameters& params) if ( ( 0 > minFPS ) || ( 0 > maxFPS ) ) { CAMHAL_LOGEA("ERROR: FPS Range is negative!"); - return -EINVAL; + return BAD_VALUE; } framerate = maxFPS /CameraHal::VFR_SCALE; @@ -570,13 +585,13 @@ int CameraHal::setParameters(const CameraParameters& params) if ( ( 0 == minFPS ) || ( 0 == maxFPS ) ) { CAMHAL_LOGEA("ERROR: FPS Range is invalid!"); - ret = -EINVAL; + return BAD_VALUE; } if ( maxFPS < minFPS ) { CAMHAL_LOGEA("ERROR: Max FPS is smaller than Min FPS!"); - ret = -EINVAL; + return BAD_VALUE; } CAMHAL_LOGDB("SET FRAMERATE %d", framerate); mParameters.setPreviewFrameRate(framerate); @@ -598,6 +613,8 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.set(TICameraParameters::KEY_GLBCE, valstr); } +#ifdef OMAP_ENHANCEMENT + ///Update the current parameter set if( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL) { @@ -617,27 +634,31 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid Exposure = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } +#endif + if ((valstr = params.get(CameraParameters::KEY_WHITE_BALANCE)) != NULL) { if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) { CAMHAL_LOGDB("White balance set %s", valstr); mParameters.set(CameraParameters::KEY_WHITE_BALANCE, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid white balance = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } +#ifdef OMAP_ENHANCEMENT + if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) { if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) { CAMHAL_LOGDB("Contrast set %s", valstr); mParameters.set(TICameraParameters::KEY_CONTRAST, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid Contrast = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } @@ -647,7 +668,7 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } @@ -657,7 +678,7 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.set(TICameraParameters::KEY_SATURATION, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } @@ -667,36 +688,44 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } +#endif + if ((valstr = params.get(CameraParameters::KEY_ANTIBANDING)) != NULL) { if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) { CAMHAL_LOGDB("Antibanding set %s", valstr); mParameters.set(CameraParameters::KEY_ANTIBANDING, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } +#ifdef OMAP_ENHANCEMENT + if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) { if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) { CAMHAL_LOGDB("ISO set %s", valstr); mParameters.set(TICameraParameters::KEY_ISO, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } +#endif + if( (valstr = params.get(CameraParameters::KEY_FOCUS_AREAS)) != NULL ) { - CAMHAL_LOGI("Focus areas position set %s", params.get(CameraParameters::KEY_FOCUS_AREAS)); + CAMHAL_LOGDB("Focus areas position set %s",valstr); mParameters.set(CameraParameters::KEY_FOCUS_AREAS, valstr); } +#ifdef OMAP_ENHANCEMENT + if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL ) { CAMHAL_LOGDB("Measurements set to %s", params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)); @@ -717,9 +746,11 @@ int CameraHal::setParameters(const CameraParameters& params) } +#endif + if( (valstr = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL) { - CAMHAL_LOGDB("Exposure compensation set %s", params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION)); + CAMHAL_LOGDB("Exposure compensation set %s", valstr); mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr); } @@ -732,7 +763,7 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.set(CameraParameters::KEY_SCENE_MODE, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } @@ -742,7 +773,7 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.set(CameraParameters::KEY_FLASH_MODE, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } @@ -752,48 +783,48 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.set(CameraParameters::KEY_EFFECT, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } - if(( (valstr = params.get(CameraParameters::KEY_ROTATION)) != NULL) - && (params.getInt(CameraParameters::KEY_ROTATION) >=0)) + varint = params.getInt(CameraParameters::KEY_ROTATION); + if( varint >=0 ) { - CAMHAL_LOGDB("Rotation set %s", params.get(CameraParameters::KEY_ROTATION)); - mParameters.set(CameraParameters::KEY_ROTATION, valstr); + CAMHAL_LOGDB("Rotation set %d", varint); + mParameters.set(CameraParameters::KEY_ROTATION, varint); } - if(( (valstr = params.get(CameraParameters::KEY_JPEG_QUALITY)) != NULL) - && (params.getInt(CameraParameters::KEY_JPEG_QUALITY) >=0)) + varint = params.getInt(CameraParameters::KEY_JPEG_QUALITY); + if( varint >= 0 ) { - CAMHAL_LOGDB("Jpeg quality set %s", params.get(CameraParameters::KEY_JPEG_QUALITY)); - mParameters.set(CameraParameters::KEY_JPEG_QUALITY, valstr); + CAMHAL_LOGDB("Jpeg quality set %d", varint); + mParameters.set(CameraParameters::KEY_JPEG_QUALITY, varint); } - if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH)) != NULL) - && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH) >=0)) + varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); + if( varint >=0 ) { - CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH)); - mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, valstr); + CAMHAL_LOGDB("Thumbnail width set %d", varint); + mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, varint); } - if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT)) != NULL) - && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT) >=0)) + varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); + if( varint >=0 ) { - CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT)); - mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, valstr); + CAMHAL_LOGDB("Thumbnail width set %d", varint); + mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, varint); } - if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY)) != NULL ) - && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY) >=0)) + varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); + if( varint >=0 ) { - CAMHAL_LOGDB("Thumbnail quality set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY)); - mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, valstr); + CAMHAL_LOGDB("Thumbnail quality set %d", varint); + mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, varint); } if( (valstr = params.get(CameraParameters::KEY_GPS_LATITUDE)) != NULL ) { - CAMHAL_LOGDB("GPS latitude set %s", params.get(CameraParameters::KEY_GPS_LATITUDE)); + CAMHAL_LOGDB("GPS latitude set %s", valstr); mParameters.set(CameraParameters::KEY_GPS_LATITUDE, valstr); }else{ mParameters.remove(CameraParameters::KEY_GPS_LATITUDE); @@ -801,7 +832,7 @@ int CameraHal::setParameters(const CameraParameters& params) if( (valstr = params.get(CameraParameters::KEY_GPS_LONGITUDE)) != NULL ) { - CAMHAL_LOGDB("GPS longitude set %s", params.get(CameraParameters::KEY_GPS_LONGITUDE)); + CAMHAL_LOGDB("GPS longitude set %s", valstr); mParameters.set(CameraParameters::KEY_GPS_LONGITUDE, valstr); }else{ mParameters.remove(CameraParameters::KEY_GPS_LONGITUDE); @@ -809,7 +840,7 @@ int CameraHal::setParameters(const CameraParameters& params) if( (valstr = params.get(CameraParameters::KEY_GPS_ALTITUDE)) != NULL ) { - CAMHAL_LOGDB("GPS altitude set %s", params.get(CameraParameters::KEY_GPS_ALTITUDE)); + CAMHAL_LOGDB("GPS altitude set %s", valstr); mParameters.set(CameraParameters::KEY_GPS_ALTITUDE, valstr); }else{ mParameters.remove(CameraParameters::KEY_GPS_ALTITUDE); @@ -817,7 +848,7 @@ int CameraHal::setParameters(const CameraParameters& params) if( (valstr = params.get(CameraParameters::KEY_GPS_TIMESTAMP)) != NULL ) { - CAMHAL_LOGDB("GPS timestamp set %s", params.get(CameraParameters::KEY_GPS_TIMESTAMP)); + CAMHAL_LOGDB("GPS timestamp set %s", valstr); mParameters.set(CameraParameters::KEY_GPS_TIMESTAMP, valstr); }else{ mParameters.remove(CameraParameters::KEY_GPS_TIMESTAMP); @@ -825,7 +856,7 @@ int CameraHal::setParameters(const CameraParameters& params) if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL ) { - CAMHAL_LOGDB("GPS datestamp set %s", params.get(TICameraParameters::KEY_GPS_DATESTAMP)); + CAMHAL_LOGDB("GPS datestamp set %s", valstr); mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr); }else{ mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP); @@ -833,7 +864,7 @@ int CameraHal::setParameters(const CameraParameters& params) if( (valstr = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL ) { - CAMHAL_LOGDB("GPS processing method set %s", params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD)); + CAMHAL_LOGDB("GPS processing method set %s", valstr); mParameters.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr); }else{ mParameters.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD); @@ -841,7 +872,7 @@ int CameraHal::setParameters(const CameraParameters& params) if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL ) { - CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_MAPDATUM)); + CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr); mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr); }else{ mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM); @@ -849,7 +880,7 @@ int CameraHal::setParameters(const CameraParameters& params) if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL ) { - CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_VERSION)); + CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr); mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr); }else{ mParameters.remove(TICameraParameters::KEY_GPS_VERSION); @@ -857,16 +888,18 @@ int CameraHal::setParameters(const CameraParameters& params) if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL ) { - CAMHAL_LOGDB("EXIF Model set %s", params.get(TICameraParameters::KEY_EXIF_MODEL)); + CAMHAL_LOGDB("EXIF Model set %s", valstr); mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr); } if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL ) { - CAMHAL_LOGDB("EXIF Make set %s", params.get(TICameraParameters::KEY_EXIF_MAKE)); + CAMHAL_LOGDB("EXIF Make set %s", valstr); mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr); } +#ifdef OMAP_ENHANCEMENT + if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL ) { CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)); @@ -877,9 +910,12 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE); } - if ((valstr = params.get(CameraParameters::KEY_ZOOM)) != NULL ) { - if ((params.getInt(CameraParameters::KEY_ZOOM) >= 0 ) && - (params.getInt(CameraParameters::KEY_ZOOM) <= mMaxZoomSupported )) { +#endif + + valstr = params.get(CameraParameters::KEY_ZOOM); + varint = params.getInt(CameraParameters::KEY_ZOOM); + if ( valstr != NULL ) { + if ( ( varint >= 0 ) && ( varint <= mMaxZoomSupported ) ) { CAMHAL_LOGDB("Zoom set %s", valstr); doesSetParameterNeedUpdate(valstr, mParameters.get(CameraParameters::KEY_ZOOM), @@ -887,13 +923,13 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.set(CameraParameters::KEY_ZOOM, valstr); } else { CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr); - ret = -EINVAL; + return BAD_VALUE; } } if( (valstr = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL ) { - CAMHAL_LOGDB("Auto Exposure Lock set %s", params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); + CAMHAL_LOGDB("Auto Exposure Lock set %s", valstr); doesSetParameterNeedUpdate(valstr, mParameters.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK), updateRequired); @@ -902,7 +938,7 @@ int CameraHal::setParameters(const CameraParameters& params) if( (valstr = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL ) { - CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); + CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", valstr); doesSetParameterNeedUpdate(valstr, mParameters.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK), updateRequired); @@ -910,20 +946,20 @@ int CameraHal::setParameters(const CameraParameters& params) } if( (valstr = params.get(CameraParameters::KEY_METERING_AREAS)) != NULL ) { - CAMHAL_LOGI("Metering areas position set %s", params.get(CameraParameters::KEY_METERING_AREAS)); + CAMHAL_LOGDB("Metering areas position set %s", valstr); mParameters.set(CameraParameters::KEY_METERING_AREAS, valstr); } - CameraParameters adapterParams = mParameters; - // Only send parameters to adapter if preview is already // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter, // will be called in startPreview() // TODO(XXX): Need to identify other parameters that need update from camera adapter if ( (NULL != mCameraAdapter) && (mPreviewEnabled || updateRequired) ) { - ret |= mCameraAdapter->setParameters(adapterParams); + ret |= mCameraAdapter->setParameters(mParameters); } +#ifdef OMAP_ENHANCEMENT + if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) ) { int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS); @@ -1001,11 +1037,13 @@ int CameraHal::setParameters(const CameraParameters& params) mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr); } +#endif + } //On fail restore old parameters if ( NO_ERROR != ret ) { - mParameters.unflatten(oldParams.flatten()); + mParameters = oldParams; } // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running. @@ -1431,7 +1469,7 @@ status_t CameraHal::startPreview() ///If we don't have the preview callback enabled and display adapter, if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL)){ - CAMHAL_LOGI("Preview not started. Preview in progress flag set"); + CAMHAL_LOGDA("Preview not started. Preview in progress flag set"); mPreviewStartInProgress = true; ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SWITCH_TO_EXECUTING); if ( NO_ERROR != ret ){ @@ -1660,13 +1698,13 @@ status_t CameraHal::setPreviewWindow(struct preview_stream_ops *window) if(mDisplayAdapter.get() != NULL) { ///NULL window passed, destroy the display adapter if present - CAMHAL_LOGI("NULL window passed, destroying display adapter"); + CAMHAL_LOGDA("NULL window passed, destroying display adapter"); mDisplayAdapter.clear(); ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client ///@remarks so, we will wait until it passes a valid window to begin the preview again mSetPreviewWindowCalled = false; } - CAMHAL_LOGI("NULL ANativeWindow passed to setPreviewWindow"); + CAMHAL_LOGDA("NULL ANativeWindow passed to setPreviewWindow"); return NO_ERROR; }else if(mDisplayAdapter.get() == NULL) { @@ -1713,12 +1751,15 @@ status_t CameraHal::setPreviewWindow(struct preview_stream_ops *window) // Start the preview since the window is now available ret = startPreview(); } - }else - { - /* If mDisplayAdpater is already created. No need to do anything. - * We get a surface handle directly now, so we can reconfigure surface - * itself in DisplayAdapter if dimensions have changed - */ + } else { + // Update the display adapter with the new window that is passed from CameraService + ret = mDisplayAdapter->setPreviewWindow(window); + if ( (NO_ERROR == ret) && previewEnabled() ) { + restartPreview(); + } else if (ret == ALREADY_EXISTS) { + // ALREADY_EXISTS should be treated as a noop in this case + ret = NO_ERROR; + } } LOG_FUNCTION_NAME_EXIT; @@ -1900,6 +1941,7 @@ status_t CameraHal::startRecording( ) bool CameraHal::setVideoModeParameters(const CameraParameters& params) { const char *valstr = NULL; + const char *valstrRemote = NULL; bool restartPreviewRequired = false; status_t ret = NO_ERROR; @@ -1918,19 +1960,19 @@ bool CameraHal::setVideoModeParameters(const CameraParameters& params) // Check if CAPTURE_MODE is VIDEO_MODE, since VSTAB & VNF work only in VIDEO_MODE. valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE); if (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0) { + valstrRemote = params.get(CameraParameters::KEY_VIDEO_STABILIZATION); // set VSTAB. restart is required if vstab value has changed - if (params.get(CameraParameters::KEY_VIDEO_STABILIZATION) != NULL) { + if ( valstrRemote != NULL) { // make sure we support vstab if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED), CameraParameters::TRUE) == 0) { valstr = mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION); // vstab value has changed if ((valstr != NULL) && - strcmp(valstr, params.get(CameraParameters::KEY_VIDEO_STABILIZATION)) != 0) { + strcmp(valstr, valstrRemote) != 0) { restartPreviewRequired = true; } - mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION, - params.get(CameraParameters::KEY_VIDEO_STABILIZATION)); + mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION, valstrRemote); } } else if (mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION)) { // vstab was configured but now unset @@ -1939,16 +1981,17 @@ bool CameraHal::setVideoModeParameters(const CameraParameters& params) } // Set VNF - if (params.get(TICameraParameters::KEY_VNF) == NULL) { + valstrRemote = params.get(TICameraParameters::KEY_VNF); + if ( valstrRemote == NULL) { CAMHAL_LOGDA("Enable VNF"); mParameters.set(TICameraParameters::KEY_VNF, "1"); restartPreviewRequired = true; } else { valstr = mParameters.get(TICameraParameters::KEY_VNF); - if (valstr && strcmp(valstr, params.get(TICameraParameters::KEY_VNF)) != 0) { + if (valstr && strcmp(valstr, valstrRemote) != 0) { restartPreviewRequired = true; } - mParameters.set(TICameraParameters::KEY_VNF, params.get(TICameraParameters::KEY_VNF)); + mParameters.set(TICameraParameters::KEY_VNF, valstrRemote); } // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU. @@ -2675,15 +2718,35 @@ status_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) ) { CAMHAL_LOGEA("No CameraAdapter instance"); - ret = -EINVAL; + return -EINVAL; } + /////////////////////////////////////////////////////// + // Following commands do NOT need preview to be started + /////////////////////////////////////////////////////// + switch(cmd) { + case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG: + bool enable = static_cast<bool>(arg1); + Mutex::Autolock lock(mLock); + if (enable) { + mMsgEnabled |= CAMERA_MSG_FOCUS_MOVE; + } else { + mMsgEnabled &= ~CAMERA_MSG_FOCUS_MOVE; + } + return NO_ERROR; + break; + } + if ( ( NO_ERROR == ret ) && ( !previewEnabled() )) { CAMHAL_LOGEA("Preview is not running"); ret = -EINVAL; } + /////////////////////////////////////////////////////// + // Following commands NEED preview to be started + /////////////////////////////////////////////////////// + if ( NO_ERROR == ret ) { switch(cmd) diff --git a/camera/CameraHalCommon.cpp b/camera/CameraHalCommon.cpp index 6d4ea2c..7e81a09 100644 --- a/camera/CameraHalCommon.cpp +++ b/camera/CameraHalCommon.cpp @@ -46,7 +46,7 @@ void CameraHal::PPM(const char* str){ ppm.tv_sec = ppm.tv_sec * 1000000; ppm.tv_sec = ppm.tv_sec + ppm.tv_usec - ppm_start.tv_usec; - LOGD("PPM: %s :%ld.%ld ms", str, ( ppm.tv_sec /1000 ), ( ppm.tv_sec % 1000 )); + ALOGD("PPM: %s :%ld.%ld ms", str, ( ppm.tv_sec /1000 ), ( ppm.tv_sec % 1000 )); } #elif PPM_INSTRUMENTATION_ABS @@ -76,7 +76,7 @@ void CameraHal::PPM(const char* str){ absolute *= 1000; absolute += ppm.tv_usec /1000; - LOGD("PPM: %s :%llu.%llu ms : %llu ms", str, ( elapsed /1000 ), ( elapsed % 1000 ), absolute); + ALOGD("PPM: %s :%llu.%llu ms : %llu ms", str, ( elapsed /1000 ), ( elapsed % 1000 ), absolute); } #endif @@ -109,7 +109,7 @@ void CameraHal::PPM(const char* str, struct timeval* ppm_first, ...){ ppm.tv_sec = ppm.tv_sec * 1000000; ppm.tv_sec = ppm.tv_sec + ppm.tv_usec - ppm_first->tv_usec; - LOGD("PPM: %s :%ld.%ld ms : %llu ms", temp_str, ( ppm.tv_sec /1000 ), ( ppm.tv_sec % 1000 ), absolute); + ALOGD("PPM: %s :%ld.%ld ms : %llu ms", temp_str, ( ppm.tv_sec /1000 ), ( ppm.tv_sec % 1000 ), absolute); va_end(args); } diff --git a/camera/CameraHalUtilClasses.cpp b/camera/CameraHalUtilClasses.cpp index 3074bc4..073c2b8 100644 --- a/camera/CameraHalUtilClasses.cpp +++ b/camera/CameraHalUtilClasses.cpp @@ -1,362 +1,362 @@ -/*
- * Copyright (C) Texas Instruments - http://www.ti.com/
- *
- * 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 CameraHalUtilClasses.cpp
-*
-* This file maps the CameraHardwareInterface to the Camera interfaces on OMAP4 (mainly OMX).
-*
-*/
-
-#define LOG_TAG "CameraHAL"
-
-
-#include "CameraHal.h"
-
-namespace android {
-
-/*--------------------FrameProvider Class STARTS here-----------------------------*/
-
-int FrameProvider::enableFrameNotification(int32_t frameTypes)
-{
- LOG_FUNCTION_NAME;
- status_t ret = NO_ERROR;
-
- ///Enable the frame notification to CameraAdapter (which implements FrameNotifier interface)
- mFrameNotifier->enableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION
- , mFrameCallback
- , NULL
- , mCookie
- );
-
- LOG_FUNCTION_NAME_EXIT;
- return ret;
-}
-
-int FrameProvider::disableFrameNotification(int32_t frameTypes)
-{
- LOG_FUNCTION_NAME;
- status_t ret = NO_ERROR;
-
- mFrameNotifier->disableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION
- , mCookie
- );
-
- LOG_FUNCTION_NAME_EXIT;
- return ret;
-}
-
-int FrameProvider::returnFrame(void *frameBuf, CameraFrame::FrameType frameType)
-{
- status_t ret = NO_ERROR;
-
- mFrameNotifier->returnFrame(frameBuf, frameType);
-
- return ret;
-}
-
-void FrameProvider::addFramePointers(void *frameBuf, void *buf)
-{
- mFrameNotifier->addFramePointers(frameBuf, buf);
- return;
-}
-
-void FrameProvider::removeFramePointers()
-{
- mFrameNotifier->removeFramePointers();
- return;
-}
-
-/*--------------------FrameProvider Class ENDS here-----------------------------*/
-
-/*--------------------EventProvider Class STARTS here-----------------------------*/
-
-int EventProvider::enableEventNotification(int32_t frameTypes)
-{
- LOG_FUNCTION_NAME;
- status_t ret = NO_ERROR;
-
- ///Enable the frame notification to CameraAdapter (which implements FrameNotifier interface)
- mEventNotifier->enableMsgType(frameTypes<<MessageNotifier::EVENT_BIT_FIELD_POSITION
- , NULL
- , mEventCallback
- , mCookie
- );
-
- LOG_FUNCTION_NAME_EXIT;
- return ret;
-}
-
-int EventProvider::disableEventNotification(int32_t frameTypes)
-{
- LOG_FUNCTION_NAME;
- status_t ret = NO_ERROR;
-
- mEventNotifier->disableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION
- , mCookie
- );
-
- LOG_FUNCTION_NAME_EXIT;
- return ret;
-}
-
-/*--------------------EventProvider Class ENDS here-----------------------------*/
-
-/*--------------------CameraArea Class STARTS here-----------------------------*/
-
-status_t CameraArea::transfrom(size_t width,
- size_t height,
- size_t &top,
- size_t &left,
- size_t &areaWidth,
- size_t &areaHeight)
-{
- status_t ret = NO_ERROR;
- size_t hRange, vRange;
- double hScale, vScale;
-
- LOG_FUNCTION_NAME
-
- hRange = CameraArea::RIGHT - CameraArea::LEFT;
- vRange = CameraArea::BOTTOM - CameraArea::TOP;
- hScale = ( double ) width / ( double ) hRange;
- vScale = ( double ) height / ( double ) vRange;
-
- top = ( mTop + vRange / 2 ) * vScale;
- left = ( mLeft + hRange / 2 ) * hScale;
- areaHeight = ( mBottom + vRange / 2 ) * vScale;
- areaHeight -= top;
- areaWidth = ( mRight + hRange / 2) * hScale;
- areaWidth -= left;
-
- LOG_FUNCTION_NAME_EXIT
-
- return ret;
-}
-
-status_t CameraArea::checkArea(ssize_t top,
- ssize_t left,
- ssize_t bottom,
- ssize_t right,
- ssize_t weight)
-{
-
- //Handles the invalid regin corner case.
- if ( ( 0 == top ) && ( 0 == left ) && ( 0 == bottom ) && ( 0 == right ) && ( 0 == weight ) ) {
- return NO_ERROR;
- }
-
- if ( ( CameraArea::WEIGHT_MIN > weight ) || ( CameraArea::WEIGHT_MAX < weight ) ) {
- CAMHAL_LOGEB("Camera area weight is invalid %d", weight);
- return -EINVAL;
- }
-
- if ( ( CameraArea::TOP > top ) || ( CameraArea::BOTTOM < top ) ) {
- CAMHAL_LOGEB("Camera area top coordinate is invalid %d", top );
- return -EINVAL;
- }
-
- if ( ( CameraArea::TOP > bottom ) || ( CameraArea::BOTTOM < bottom ) ) {
- CAMHAL_LOGEB("Camera area bottom coordinate is invalid %d", bottom );
- return -EINVAL;
- }
-
- if ( ( CameraArea::LEFT > left ) || ( CameraArea::RIGHT < left ) ) {
- CAMHAL_LOGEB("Camera area left coordinate is invalid %d", left );
- return -EINVAL;
- }
-
- if ( ( CameraArea::LEFT > right ) || ( CameraArea::RIGHT < right ) ) {
- CAMHAL_LOGEB("Camera area right coordinate is invalid %d", right );
- return -EINVAL;
- }
-
- if ( left >= right ) {
- CAMHAL_LOGEA("Camera area left larger than right");
- return -EINVAL;
- }
-
- if ( top >= bottom ) {
- CAMHAL_LOGEA("Camera area top larger than bottom");
- return -EINVAL;
- }
-
- return NO_ERROR;
-}
-
-status_t CameraArea::parseAreas(const char *area,
- size_t areaLength,
- Vector< sp<CameraArea> > &areas)
-{
- status_t ret = NO_ERROR;
- char *ctx;
- char *pArea = NULL;
- char *pStart = NULL;
- char *pEnd = NULL;
- const char *startToken = "(";
- const char endToken = ')';
- const char sep = ',';
- ssize_t top, left, bottom, right, weight;
- char *tmpBuffer = NULL;
- sp<CameraArea> currentArea;
-
- LOG_FUNCTION_NAME
-
- if ( ( NULL == area ) ||
- ( 0 >= areaLength ) )
- {
- return -EINVAL;
- }
-
- tmpBuffer = ( char * ) malloc(areaLength);
- if ( NULL == tmpBuffer )
- {
- return -ENOMEM;
- }
-
- memcpy(tmpBuffer, area, areaLength);
-
- pArea = strtok_r(tmpBuffer, startToken, &ctx);
-
- do
- {
-
- pStart = pArea;
- if ( NULL == pStart )
- {
- CAMHAL_LOGEA("Parsing of the left area coordinate failed!");
- ret = -EINVAL;
- break;
- }
- else
- {
- left = static_cast<ssize_t>(strtol(pStart, &pEnd, 10));
- }
-
- if ( sep != *pEnd )
- {
- CAMHAL_LOGEA("Parsing of the top area coordinate failed!");
- ret = -EINVAL;
- break;
- }
- else
- {
- top = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10));
- }
-
- if ( sep != *pEnd )
- {
- CAMHAL_LOGEA("Parsing of the right area coordinate failed!");
- ret = -EINVAL;
- break;
- }
- else
- {
- right = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10));
- }
-
- if ( sep != *pEnd )
- {
- CAMHAL_LOGEA("Parsing of the bottom area coordinate failed!");
- ret = -EINVAL;
- break;
- }
- else
- {
- bottom = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10));
- }
-
- if ( sep != *pEnd )
- {
- CAMHAL_LOGEA("Parsing of the weight area coordinate failed!");
- ret = -EINVAL;
- break;
- }
- else
- {
- weight = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10));
- }
-
- if ( endToken != *pEnd )
- {
- CAMHAL_LOGEA("Malformed area!");
- ret = -EINVAL;
- break;
- }
-
- ret = checkArea(top, left, bottom, right, weight);
- if ( NO_ERROR != ret ) {
- break;
- }
-
- currentArea = new CameraArea(top, left, bottom, right, weight);
- CAMHAL_LOGDB("Area parsed [%dx%d, %dx%d] %d",
- ( int ) top,
- ( int ) left,
- ( int ) bottom,
- ( int ) right,
- ( int ) weight);
- if ( NULL != currentArea.get() )
- {
- areas.add(currentArea);
- }
- else
- {
- ret = -ENOMEM;
- break;
- }
-
- pArea = strtok_r(NULL, startToken, &ctx);
-
- }
- while ( NULL != pArea );
-
- if ( NULL != tmpBuffer )
- {
- free(tmpBuffer);
- }
-
- LOG_FUNCTION_NAME_EXIT
-
- return ret;
-}
-
-bool CameraArea::areAreasDifferent(Vector< sp<CameraArea> > &area1,
- Vector< sp<CameraArea> > &area2) {
- if (area1.size() != area2.size()) {
- return true;
- }
-
- // not going to care about sorting order for now
- for (int i = 0; i < area1.size(); i++) {
- if (!area1.itemAt(i)->compare(area2.itemAt(i))) {
- return true;
- }
- }
-
- return false;
-}
-
-bool CameraArea::compare(const sp<CameraArea> &area) {
- return ((mTop == area->mTop) && (mLeft == area->mLeft) &&
- (mBottom == area->mBottom) && (mRight == area->mRight) &&
- (mWeight == area->mWeight));
-}
-
-
-/*--------------------CameraArea Class ENDS here-----------------------------*/
-
-};
+/* + * Copyright (C) Texas Instruments - http://www.ti.com/ + * + * 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 CameraHalUtilClasses.cpp +* +* This file maps the CameraHardwareInterface to the Camera interfaces on OMAP4 (mainly OMX). +* +*/ + +#define LOG_TAG "CameraHAL" + + +#include "CameraHal.h" + +namespace android { + +/*--------------------FrameProvider Class STARTS here-----------------------------*/ + +int FrameProvider::enableFrameNotification(int32_t frameTypes) +{ + LOG_FUNCTION_NAME; + status_t ret = NO_ERROR; + + ///Enable the frame notification to CameraAdapter (which implements FrameNotifier interface) + mFrameNotifier->enableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION + , mFrameCallback + , NULL + , mCookie + ); + + LOG_FUNCTION_NAME_EXIT; + return ret; +} + +int FrameProvider::disableFrameNotification(int32_t frameTypes) +{ + LOG_FUNCTION_NAME; + status_t ret = NO_ERROR; + + mFrameNotifier->disableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION + , mCookie + ); + + LOG_FUNCTION_NAME_EXIT; + return ret; +} + +int FrameProvider::returnFrame(void *frameBuf, CameraFrame::FrameType frameType) +{ + status_t ret = NO_ERROR; + + mFrameNotifier->returnFrame(frameBuf, frameType); + + return ret; +} + +void FrameProvider::addFramePointers(void *frameBuf, void *buf) +{ + mFrameNotifier->addFramePointers(frameBuf, buf); + return; +} + +void FrameProvider::removeFramePointers() +{ + mFrameNotifier->removeFramePointers(); + return; +} + +/*--------------------FrameProvider Class ENDS here-----------------------------*/ + +/*--------------------EventProvider Class STARTS here-----------------------------*/ + +int EventProvider::enableEventNotification(int32_t frameTypes) +{ + LOG_FUNCTION_NAME; + status_t ret = NO_ERROR; + + ///Enable the frame notification to CameraAdapter (which implements FrameNotifier interface) + mEventNotifier->enableMsgType(frameTypes<<MessageNotifier::EVENT_BIT_FIELD_POSITION + , NULL + , mEventCallback + , mCookie + ); + + LOG_FUNCTION_NAME_EXIT; + return ret; +} + +int EventProvider::disableEventNotification(int32_t frameTypes) +{ + LOG_FUNCTION_NAME; + status_t ret = NO_ERROR; + + mEventNotifier->disableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION + , mCookie + ); + + LOG_FUNCTION_NAME_EXIT; + return ret; +} + +/*--------------------EventProvider Class ENDS here-----------------------------*/ + +/*--------------------CameraArea Class STARTS here-----------------------------*/ + +status_t CameraArea::transfrom(size_t width, + size_t height, + size_t &top, + size_t &left, + size_t &areaWidth, + size_t &areaHeight) +{ + status_t ret = NO_ERROR; + size_t hRange, vRange; + double hScale, vScale; + + LOG_FUNCTION_NAME + + hRange = CameraArea::RIGHT - CameraArea::LEFT; + vRange = CameraArea::BOTTOM - CameraArea::TOP; + hScale = ( double ) width / ( double ) hRange; + vScale = ( double ) height / ( double ) vRange; + + top = ( mTop + vRange / 2 ) * vScale; + left = ( mLeft + hRange / 2 ) * hScale; + areaHeight = ( mBottom + vRange / 2 ) * vScale; + areaHeight -= top; + areaWidth = ( mRight + hRange / 2) * hScale; + areaWidth -= left; + + LOG_FUNCTION_NAME_EXIT + + return ret; +} + +status_t CameraArea::checkArea(ssize_t top, + ssize_t left, + ssize_t bottom, + ssize_t right, + ssize_t weight) +{ + + //Handles the invalid regin corner case. + if ( ( 0 == top ) && ( 0 == left ) && ( 0 == bottom ) && ( 0 == right ) && ( 0 == weight ) ) { + return NO_ERROR; + } + + if ( ( CameraArea::WEIGHT_MIN > weight ) || ( CameraArea::WEIGHT_MAX < weight ) ) { + CAMHAL_LOGEB("Camera area weight is invalid %d", weight); + return -EINVAL; + } + + if ( ( CameraArea::TOP > top ) || ( CameraArea::BOTTOM < top ) ) { + CAMHAL_LOGEB("Camera area top coordinate is invalid %d", top ); + return -EINVAL; + } + + if ( ( CameraArea::TOP > bottom ) || ( CameraArea::BOTTOM < bottom ) ) { + CAMHAL_LOGEB("Camera area bottom coordinate is invalid %d", bottom ); + return -EINVAL; + } + + if ( ( CameraArea::LEFT > left ) || ( CameraArea::RIGHT < left ) ) { + CAMHAL_LOGEB("Camera area left coordinate is invalid %d", left ); + return -EINVAL; + } + + if ( ( CameraArea::LEFT > right ) || ( CameraArea::RIGHT < right ) ) { + CAMHAL_LOGEB("Camera area right coordinate is invalid %d", right ); + return -EINVAL; + } + + if ( left >= right ) { + CAMHAL_LOGEA("Camera area left larger than right"); + return -EINVAL; + } + + if ( top >= bottom ) { + CAMHAL_LOGEA("Camera area top larger than bottom"); + return -EINVAL; + } + + return NO_ERROR; +} + +status_t CameraArea::parseAreas(const char *area, + size_t areaLength, + Vector< sp<CameraArea> > &areas) +{ + status_t ret = NO_ERROR; + char *ctx; + char *pArea = NULL; + char *pStart = NULL; + char *pEnd = NULL; + const char *startToken = "("; + const char endToken = ')'; + const char sep = ','; + ssize_t top, left, bottom, right, weight; + char *tmpBuffer = NULL; + sp<CameraArea> currentArea; + + LOG_FUNCTION_NAME + + if ( ( NULL == area ) || + ( 0 >= areaLength ) ) + { + return -EINVAL; + } + + tmpBuffer = ( char * ) malloc(areaLength); + if ( NULL == tmpBuffer ) + { + return -ENOMEM; + } + + memcpy(tmpBuffer, area, areaLength); + + pArea = strtok_r(tmpBuffer, startToken, &ctx); + + do + { + + pStart = pArea; + if ( NULL == pStart ) + { + CAMHAL_LOGEA("Parsing of the left area coordinate failed!"); + ret = -EINVAL; + break; + } + else + { + left = static_cast<ssize_t>(strtol(pStart, &pEnd, 10)); + } + + if ( sep != *pEnd ) + { + CAMHAL_LOGEA("Parsing of the top area coordinate failed!"); + ret = -EINVAL; + break; + } + else + { + top = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); + } + + if ( sep != *pEnd ) + { + CAMHAL_LOGEA("Parsing of the right area coordinate failed!"); + ret = -EINVAL; + break; + } + else + { + right = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); + } + + if ( sep != *pEnd ) + { + CAMHAL_LOGEA("Parsing of the bottom area coordinate failed!"); + ret = -EINVAL; + break; + } + else + { + bottom = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); + } + + if ( sep != *pEnd ) + { + CAMHAL_LOGEA("Parsing of the weight area coordinate failed!"); + ret = -EINVAL; + break; + } + else + { + weight = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); + } + + if ( endToken != *pEnd ) + { + CAMHAL_LOGEA("Malformed area!"); + ret = -EINVAL; + break; + } + + ret = checkArea(top, left, bottom, right, weight); + if ( NO_ERROR != ret ) { + break; + } + + currentArea = new CameraArea(top, left, bottom, right, weight); + CAMHAL_LOGDB("Area parsed [%dx%d, %dx%d] %d", + ( int ) top, + ( int ) left, + ( int ) bottom, + ( int ) right, + ( int ) weight); + if ( NULL != currentArea.get() ) + { + areas.add(currentArea); + } + else + { + ret = -ENOMEM; + break; + } + + pArea = strtok_r(NULL, startToken, &ctx); + + } + while ( NULL != pArea ); + + if ( NULL != tmpBuffer ) + { + free(tmpBuffer); + } + + LOG_FUNCTION_NAME_EXIT + + return ret; +} + +bool CameraArea::areAreasDifferent(Vector< sp<CameraArea> > &area1, + Vector< sp<CameraArea> > &area2) { + if (area1.size() != area2.size()) { + return true; + } + + // not going to care about sorting order for now + for (int i = 0; i < area1.size(); i++) { + if (!area1.itemAt(i)->compare(area2.itemAt(i))) { + return true; + } + } + + return false; +} + +bool CameraArea::compare(const sp<CameraArea> &area) { + return ((mTop == area->mTop) && (mLeft == area->mLeft) && + (mBottom == area->mBottom) && (mRight == area->mRight) && + (mWeight == area->mWeight)); +} + + +/*--------------------CameraArea Class ENDS here-----------------------------*/ + +}; diff --git a/camera/CameraHal_Module.cpp b/camera/CameraHal_Module.cpp index 511cbc2..cb4e804 100644 --- a/camera/CameraHal_Module.cpp +++ b/camera/CameraHal_Module.cpp @@ -78,7 +78,7 @@ int camera_set_preview_window(struct camera_device * device, int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -99,7 +99,7 @@ void camera_set_callbacks(struct camera_device * device, { ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return; @@ -113,7 +113,7 @@ void camera_enable_msg_type(struct camera_device * device, int32_t msg_type) { ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return; @@ -127,7 +127,7 @@ void camera_disable_msg_type(struct camera_device * device, int32_t msg_type) { ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return; @@ -141,7 +141,7 @@ int camera_msg_type_enabled(struct camera_device * device, int32_t msg_type) { ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return 0; @@ -156,7 +156,7 @@ int camera_start_preview(struct camera_device * device) int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -172,7 +172,7 @@ void camera_stop_preview(struct camera_device * device) { ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return; @@ -187,7 +187,7 @@ int camera_preview_enabled(struct camera_device * device) int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -203,7 +203,7 @@ int camera_store_meta_data_in_buffers(struct camera_device * device, int enable) int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -221,7 +221,7 @@ int camera_start_recording(struct camera_device * device) int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -236,7 +236,7 @@ void camera_stop_recording(struct camera_device * device) { ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return; @@ -251,7 +251,7 @@ int camera_recording_enabled(struct camera_device * device) int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -267,7 +267,7 @@ void camera_release_recording_frame(struct camera_device * device, { ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return; @@ -282,7 +282,7 @@ int camera_auto_focus(struct camera_device * device) int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -298,7 +298,7 @@ int camera_cancel_auto_focus(struct camera_device * device) int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -314,7 +314,7 @@ int camera_take_picture(struct camera_device * device) int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -330,7 +330,7 @@ int camera_cancel_picture(struct camera_device * device) int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -346,7 +346,7 @@ int camera_set_parameters(struct camera_device * device, const char *params) int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -362,7 +362,7 @@ char* camera_get_parameters(struct camera_device * device) char* param = NULL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return NULL; @@ -378,7 +378,7 @@ static void camera_put_parameters(struct camera_device *device, char *parms) { ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return; @@ -394,7 +394,7 @@ int camera_send_command(struct camera_device * device, int rv = -EINVAL; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return rv; @@ -409,7 +409,7 @@ void camera_release(struct camera_device * device) { ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); if(!device) return; @@ -440,7 +440,7 @@ int camera_device_close(hw_device_t* device) int ret = 0; ti_camera_device_t* ti_dev = NULL; - LOGV("%s", __FUNCTION__); + ALOGV("%s", __FUNCTION__); android::Mutex::Autolock lock(gCameraHalDeviceLock); @@ -501,7 +501,7 @@ int camera_device_open(const hw_module_t* module, const char* name, if(cameraid > num_cameras) { - LOGE("camera service provided cameraid out of bounds, " + ALOGE("camera service provided cameraid out of bounds, " "cameraid = %d, num supported = %d", cameraid, num_cameras); rv = -EINVAL; @@ -510,7 +510,7 @@ int camera_device_open(const hw_module_t* module, const char* name, if(gCamerasOpen >= MAX_SIMUL_CAMERAS_SUPPORTED) { - LOGE("maximum number of cameras already open"); + ALOGE("maximum number of cameras already open"); rv = -ENOMEM; goto fail; } @@ -518,7 +518,7 @@ int camera_device_open(const hw_module_t* module, const char* name, camera_device = (ti_camera_device_t*)malloc(sizeof(*camera_device)); if(!camera_device) { - LOGE("camera_device allocation fail"); + ALOGE("camera_device allocation fail"); rv = -ENOMEM; goto fail; } @@ -526,7 +526,7 @@ int camera_device_open(const hw_module_t* module, const char* name, camera_ops = (camera_device_ops_t*)malloc(sizeof(*camera_ops)); if(!camera_ops) { - LOGE("camera_ops allocation fail"); + ALOGE("camera_ops allocation fail"); rv = -ENOMEM; goto fail; } @@ -572,7 +572,7 @@ int camera_device_open(const hw_module_t* module, const char* name, if(gCameraProperties.getProperties(cameraid, &properties) < 0) { - LOGE("Couldn't get camera properties"); + ALOGE("Couldn't get camera properties"); rv = -ENOMEM; goto fail; } @@ -581,14 +581,14 @@ int camera_device_open(const hw_module_t* module, const char* name, if(!camera) { - LOGE("Couldn't create instance of CameraHal class"); + ALOGE("Couldn't create instance of CameraHal class"); rv = -ENOMEM; goto fail; } if(properties && (camera->initialize(properties) != android::NO_ERROR)) { - LOGE("Couldn't initialize camera instance"); + ALOGE("Couldn't initialize camera instance"); rv = -ENODEV; goto fail; } @@ -656,7 +656,7 @@ int camera_get_camera_info(int camera_id, struct camera_info *info) //Get camera properties for camera index if(gCameraProperties.getProperties(camera_id, &properties) < 0) { - LOGE("Couldn't get camera properties"); + ALOGE("Couldn't get camera properties"); rv = -EINVAL; goto end; } diff --git a/camera/CameraProperties.cpp b/camera/CameraProperties.cpp index 0e83fc9..5d3ff20 100644 --- a/camera/CameraProperties.cpp +++ b/camera/CameraProperties.cpp @@ -100,13 +100,13 @@ status_t CameraProperties::loadProperties() mCamerasSupported = CameraAdapter_Capabilities(mCameraProps, mCamerasSupported, MAX_CAMERAS_SUPPORTED); if((int)mCamerasSupported < 0) { - LOGE("error while getting capabilities"); + ALOGE("error while getting capabilities"); ret = UNKNOWN_ERROR; } else if (mCamerasSupported > MAX_CAMERAS_SUPPORTED) { - LOGE("returned too many adapaters"); + ALOGE("returned too many adapaters"); ret = UNKNOWN_ERROR; } else { - LOGE("num_cameras = %d", mCamerasSupported); + ALOGE("num_cameras = %d", mCamerasSupported); for (unsigned int i = 0; i < mCamerasSupported; i++) { mCameraProps[i].set(CAMERA_SENSOR_INDEX, i); @@ -114,7 +114,7 @@ status_t CameraProperties::loadProperties() } } - LOGV("mCamerasSupported = %d", mCamerasSupported); + ALOGV("mCamerasSupported = %d", mCamerasSupported); LOG_FUNCTION_NAME_EXIT; return ret; } diff --git a/camera/Encoder_libjpeg.cpp b/camera/Encoder_libjpeg.cpp index 7a6054f..d50b2ea 100644 --- a/camera/Encoder_libjpeg.cpp +++ b/camera/Encoder_libjpeg.cpp @@ -44,6 +44,7 @@ extern "C" { } #define ARRAY_SIZE(array) (sizeof((array)) / sizeof((array)[0])) +#define MIN(x,y) ((x < y) ? x : y) namespace android { struct string_pair { @@ -266,7 +267,7 @@ void ExifElementsTable::insertExifToJpeg(unsigned char* jpeg, size_t jpeg_size) ResetJpgfile(); if (ReadJpegSectionsFromBuffer(jpeg, jpeg_size, read_mode)) { jpeg_opened = true; - create_EXIF(table, exif_tag_count, gps_tag_count); + create_EXIF(table, exif_tag_count, gps_tag_count, has_datetime_tag); } } @@ -305,7 +306,7 @@ ExifElementsTable::~ExifElementsTable() { } status_t ExifElementsTable::insertElement(const char* tag, const char* value) { - int value_length = 0; + unsigned int value_length = 0; status_t ret = NO_ERROR; if (!value || !tag) { @@ -331,6 +332,10 @@ status_t ExifElementsTable::insertElement(const char* tag, const char* value) { table[position].GpsTag = FALSE; table[position].Tag = TagNameToValue(tag); exif_tag_count++; + + if (strcmp(tag, TAG_DATETIME) == 0) { + has_datetime_tag = true; + } } table[position].DataLength = 0; diff --git a/camera/MemoryManager.cpp b/camera/MemoryManager.cpp index 55675d9..b1dbbcf 100644 --- a/camera/MemoryManager.cpp +++ b/camera/MemoryManager.cpp @@ -1,167 +1,173 @@ -/*
- * Copyright (C) Texas Instruments - http://www.ti.com/
- *
- * 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.
- */
-
-
-
-#define LOG_TAG "CameraHAL"
-
-
-#include "CameraHal.h"
-#include "TICameraParameters.h"
-
-extern "C" {
-
-#include <ion.h> - -//#include <timm_osal_interfaces.h>
-//#include <timm_osal_trace.h>
-
-
-};
-
-namespace android {
-
-///@todo Move these constants to a common header file, preferably in tiler.h
-#define STRIDE_8BIT (4 * 1024)
-#define STRIDE_16BIT (4 * 1024)
-
-#define ALLOCATION_2D 2
-
-///Utility Macro Declarations
-
-/*--------------------MemoryManager Class STARTS here-----------------------------*/
-void* MemoryManager::allocateBuffer(int width, int height, const char* format, int &bytes, int numBufs)
-{
- LOG_FUNCTION_NAME;
- - if(mIonFd == 0) +/* + * Copyright (C) Texas Instruments - http://www.ti.com/ + * + * 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. + */ + + + +#define LOG_TAG "CameraHAL" + + +#include "CameraHal.h" +#include "TICameraParameters.h" + +extern "C" { + +#include <ion/ion.h> + +//#include <timm_osal_interfaces.h> +//#include <timm_osal_trace.h> + + +}; + +namespace android { + +///@todo Move these constants to a common header file, preferably in tiler.h +#define STRIDE_8BIT (4 * 1024) +#define STRIDE_16BIT (4 * 1024) + +#define ALLOCATION_2D 2 + +///Utility Macro Declarations + +/*--------------------MemoryManager Class STARTS here-----------------------------*/ +void* MemoryManager::allocateBuffer(int width, int height, const char* format, int &bytes, int numBufs) +{ + LOG_FUNCTION_NAME; + + if(mIonFd < 0) { mIonFd = ion_open(); - if(mIonFd == 0) + if(mIonFd < 0) { CAMHAL_LOGEA("ion_open failed!!!"); return NULL; } } - ///We allocate numBufs+1 because the last entry will be marked NULL to indicate end of array, which is used when freeing
- ///the buffers
- const uint numArrayEntriesC = (uint)(numBufs+1);
-
- ///Allocate a buffer array
- uint32_t *bufsArr = new uint32_t [numArrayEntriesC];
- if(!bufsArr)
- {
- CAMHAL_LOGEB("Allocation failed when creating buffers array of %d uint32_t elements", numArrayEntriesC);
- LOG_FUNCTION_NAME_EXIT;
- return NULL;
- }
-
- ///Initialize the array with zeros - this will help us while freeing the array in case of error
- ///If a value of an array element is NULL, it means we didnt allocate it
- memset(bufsArr, 0, sizeof(*bufsArr) * numArrayEntriesC);
-
+ ///We allocate numBufs+1 because the last entry will be marked NULL to indicate end of array, which is used when freeing + ///the buffers + const uint numArrayEntriesC = (uint)(numBufs+1); + + ///Allocate a buffer array + uint32_t *bufsArr = new uint32_t [numArrayEntriesC]; + if(!bufsArr) + { + CAMHAL_LOGEB("Allocation failed when creating buffers array of %d uint32_t elements", numArrayEntriesC); + goto error; + } + + ///Initialize the array with zeros - this will help us while freeing the array in case of error + ///If a value of an array element is NULL, it means we didnt allocate it + memset(bufsArr, 0, sizeof(*bufsArr) * numArrayEntriesC); + //2D Allocations are not supported currently if(bytes != 0) - {
+ { struct ion_handle *handle; int mmap_fd; - ///1D buffers
- for (int i = 0; i < numBufs; i++)
- {
+ ///1D buffers + for (int i = 0; i < numBufs; i++) + { int ret = ion_alloc(mIonFd, bytes, 0, 1 << ION_HEAP_TYPE_CARVEOUT, &handle); if(ret < 0) - {
+ { CAMHAL_LOGEB("ion_alloc resulted in error %d", ret); - goto error;
- }
+ goto error; + } CAMHAL_LOGDB("Before mapping, handle = %x, nSize = %d", handle, bytes); if ((ret = ion_map(mIonFd, handle, bytes, PROT_READ | PROT_WRITE, MAP_SHARED, 0, (unsigned char**)&bufsArr[i], &mmap_fd)) < 0) - {
+ { CAMHAL_LOGEB("Userspace mapping of ION buffers returned error %d", ret); ion_free(mIonFd, handle); goto error; - }
+ } mIonHandleMap.add(bufsArr[i], (unsigned int)handle); mIonFdMap.add(bufsArr[i], (unsigned int) mmap_fd); mIonBufLength.add(bufsArr[i], (unsigned int) bytes); - }
-
- }
+ } + + } else // If bytes is not zero, then it is a 2-D tiler buffer request - {
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return (void*)bufsArr;
-
+ { + } + + LOG_FUNCTION_NAME_EXIT; + + return (void*)bufsArr; + error: - LOGE("Freeing buffers already allocated after error occurred"); - freeBuffer(bufsArr); -
+ ALOGE("Freeing buffers already allocated after error occurred"); + if(bufsArr) + freeBuffer(bufsArr); + if ( NULL != mErrorNotifier.get() ) { mErrorNotifier->errorNotify(-ENOMEM); } -
+ + if (mIonFd >= 0) + { + ion_close(mIonFd); + mIonFd = -1; + } + LOG_FUNCTION_NAME_EXIT; return NULL; -}
-
-//TODO: Get needed data to map tiler buffers
-//Return dummy data for now
-uint32_t * MemoryManager::getOffsets()
-{
- LOG_FUNCTION_NAME;
-
- LOG_FUNCTION_NAME_EXIT;
-
- return NULL;
-}
-
-int MemoryManager::getFd()
-{
- LOG_FUNCTION_NAME;
-
- LOG_FUNCTION_NAME_EXIT;
-
- return -1;
-}
-
-int MemoryManager::freeBuffer(void* buf)
-{
- status_t ret = NO_ERROR;
- LOG_FUNCTION_NAME;
-
- uint32_t *bufEntry = (uint32_t*)buf;
-
- if(!bufEntry)
- {
- CAMHAL_LOGEA("NULL pointer passed to freebuffer");
- LOG_FUNCTION_NAME_EXIT;
- return BAD_VALUE;
- }
-
- while(*bufEntry)
- {
+} + +//TODO: Get needed data to map tiler buffers +//Return dummy data for now +uint32_t * MemoryManager::getOffsets() +{ + LOG_FUNCTION_NAME; + + LOG_FUNCTION_NAME_EXIT; + + return NULL; +} + +int MemoryManager::getFd() +{ + LOG_FUNCTION_NAME; + + LOG_FUNCTION_NAME_EXIT; + + return -1; +} + +int MemoryManager::freeBuffer(void* buf) +{ + status_t ret = NO_ERROR; + LOG_FUNCTION_NAME; + + uint32_t *bufEntry = (uint32_t*)buf; + + if(!bufEntry) + { + CAMHAL_LOGEA("NULL pointer passed to freebuffer"); + LOG_FUNCTION_NAME_EXIT; + return BAD_VALUE; + } + + while(*bufEntry) + { unsigned int ptr = (unsigned int) *bufEntry++; if(mIonBufLength.valueFor(ptr)) { @@ -176,47 +182,47 @@ int MemoryManager::freeBuffer(void* buf) { CAMHAL_LOGEA("Not a valid Memory Manager buffer"); } - }
-
- ///@todo Check if this way of deleting array is correct, else use malloc/free
- uint32_t * bufArr = (uint32_t*)buf;
- delete [] bufArr;
-
+ } + + ///@todo Check if this way of deleting array is correct, else use malloc/free + uint32_t * bufArr = (uint32_t*)buf; + delete [] bufArr; + if(mIonBufLength.size() == 0) { - if(mIonFd) + if(mIonFd >= 0) { ion_close(mIonFd); - mIonFd = 0; + mIonFd = -1; } } - LOG_FUNCTION_NAME_EXIT;
- return ret;
-}
-
-status_t MemoryManager::setErrorHandler(ErrorNotifier *errorNotifier)
-{
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME;
-
- if ( NULL == errorNotifier )
- {
- CAMHAL_LOGEA("Invalid Error Notifier reference");
- ret = -EINVAL;
- }
-
- if ( NO_ERROR == ret )
- {
- mErrorNotifier = errorNotifier;
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-};
-
-
-/*--------------------MemoryManager Class ENDS here-----------------------------*/
+ LOG_FUNCTION_NAME_EXIT; + return ret; +} + +status_t MemoryManager::setErrorHandler(ErrorNotifier *errorNotifier) +{ + status_t ret = NO_ERROR; + + LOG_FUNCTION_NAME; + + if ( NULL == errorNotifier ) + { + CAMHAL_LOGEA("Invalid Error Notifier reference"); + ret = -EINVAL; + } + + if ( NO_ERROR == ret ) + { + mErrorNotifier = errorNotifier; + } + + LOG_FUNCTION_NAME_EXIT; + + return ret; +} + +}; + + +/*--------------------MemoryManager Class ENDS here-----------------------------*/ diff --git a/camera/NV12_resize.c b/camera/NV12_resize.c index 03c049e..7f92fb2 100644 --- a/camera/NV12_resize.c +++ b/camera/NV12_resize.c @@ -31,7 +31,7 @@ VT_resizeFrame_Video_opt2_lp mmUint16 dummy /* Transparent pixel value */ ) { - LOGV("VT_resizeFrame_Video_opt2_lp+"); + ALOGV("VT_resizeFrame_Video_opt2_lp+"); mmUint16 row,col; mmUint32 resizeFactorX; @@ -55,19 +55,19 @@ VT_resizeFrame_Video_opt2_lp { if(i_img_ptr->uHeight == o_img_ptr->uHeight) { - LOGV("************************f(i_img_ptr->uHeight == o_img_ptr->uHeight) are same *********************\n"); - LOGV("************************(i_img_ptr->width == %d" , i_img_ptr->uWidth ); - LOGV("************************(i_img_ptr->uHeight == %d" , i_img_ptr->uHeight ); - LOGV("************************(o_img_ptr->width == %d" ,o_img_ptr->uWidth ); - LOGV("************************(o_img_ptr->uHeight == %d" , o_img_ptr->uHeight ); + ALOGV("************************f(i_img_ptr->uHeight == o_img_ptr->uHeight) are same *********************\n"); + ALOGV("************************(i_img_ptr->width == %d" , i_img_ptr->uWidth ); + ALOGV("************************(i_img_ptr->uHeight == %d" , i_img_ptr->uHeight ); + ALOGV("************************(o_img_ptr->width == %d" ,o_img_ptr->uWidth ); + ALOGV("************************(o_img_ptr->uHeight == %d" , o_img_ptr->uHeight ); } } if (!i_img_ptr || !i_img_ptr->imgPtr || !o_img_ptr || !o_img_ptr->imgPtr) { - LOGE("Image Point NULL"); - LOGV("VT_resizeFrame_Video_opt2_lp-"); + ALOGE("Image Point NULL"); + ALOGV("VT_resizeFrame_Video_opt2_lp-"); return FALSE; } @@ -95,8 +95,8 @@ VT_resizeFrame_Video_opt2_lp /* make sure valid input size */ if (idx < 1 || idy < 1 || i_img_ptr->uStride < 1) { - LOGE("idx or idy less then 1 idx = %d idy = %d stride = %d", idx, idy, i_img_ptr->uStride); - LOGV("VT_resizeFrame_Video_opt2_lp-"); + ALOGE("idx or idy less then 1 idx = %d idy = %d stride = %d", idx, idy, i_img_ptr->uStride); + ALOGV("VT_resizeFrame_Video_opt2_lp-"); return FALSE; } @@ -297,11 +297,11 @@ VT_resizeFrame_Video_opt2_lp } else { - LOGE("eFormat not supported"); - LOGV("VT_resizeFrame_Video_opt2_lp-"); + ALOGE("eFormat not supported"); + ALOGV("VT_resizeFrame_Video_opt2_lp-"); return FALSE; } - LOGV("success"); - LOGV("VT_resizeFrame_Video_opt2_lp-"); + ALOGV("success"); + ALOGV("VT_resizeFrame_Video_opt2_lp-"); return TRUE; } diff --git a/camera/OMXCameraAdapter/OMX3A.cpp b/camera/OMXCameraAdapter/OMX3A.cpp index ef02e49..4cb4607 100644 --- a/camera/OMXCameraAdapter/OMX3A.cpp +++ b/camera/OMXCameraAdapter/OMX3A.cpp @@ -75,6 +75,7 @@ status_t OMXCameraAdapter::setParameters3A(const CameraParameters ¶ms, status_t ret = NO_ERROR; int mode = 0; const char *str = NULL; + int varint = 0; BaseCameraAdapter::AdapterState nextState; BaseCameraAdapter::getNextState(nextState); @@ -111,6 +112,8 @@ status_t OMXCameraAdapter::setParameters3A(const CameraParameters ¶ms, CAMHAL_LOGVB("SceneMode %d", mParameters3A.SceneMode); } +#ifdef OMAP_ENHANCEMENT + str = params.get(TICameraParameters::KEY_EXPOSURE_MODE); mode = getLUTvalue_HALtoOMX( str, ExpLUT); if ( ( str != NULL ) && ( mParameters3A.Exposure != mode )) @@ -123,6 +126,8 @@ status_t OMXCameraAdapter::setParameters3A(const CameraParameters ¶ms, } } +#endif + str = params.get(CameraParameters::KEY_WHITE_BALANCE); mode = getLUTvalue_HALtoOMX( str, WBalLUT); if (mFirstTimeInit || ((str != NULL) && (mode != mParameters3A.WhiteBallance))) @@ -135,54 +140,58 @@ status_t OMXCameraAdapter::setParameters3A(const CameraParameters ¶ms, } } - if ( 0 <= params.getInt(TICameraParameters::KEY_CONTRAST) ) +#ifdef OMAP_ENHANCEMENT + + varint = params.getInt(TICameraParameters::KEY_CONTRAST); + if ( 0 <= varint ) { if ( mFirstTimeInit || - ( (mParameters3A.Contrast + CONTRAST_OFFSET) != - params.getInt(TICameraParameters::KEY_CONTRAST)) ) + ( (mParameters3A.Contrast + CONTRAST_OFFSET) != varint ) ) { - mParameters3A.Contrast = params.getInt(TICameraParameters::KEY_CONTRAST) - CONTRAST_OFFSET; + mParameters3A.Contrast = varint - CONTRAST_OFFSET; CAMHAL_LOGDB("Contrast %d", mParameters3A.Contrast); mPending3Asettings |= SetContrast; } } - if ( 0 <= params.getInt(TICameraParameters::KEY_SHARPNESS) ) + varint = params.getInt(TICameraParameters::KEY_SHARPNESS); + if ( 0 <= varint ) { if ( mFirstTimeInit || - ((mParameters3A.Sharpness + SHARPNESS_OFFSET) != - params.getInt(TICameraParameters::KEY_SHARPNESS))) + ((mParameters3A.Sharpness + SHARPNESS_OFFSET) != varint )) { - mParameters3A.Sharpness = params.getInt(TICameraParameters::KEY_SHARPNESS) - SHARPNESS_OFFSET; + mParameters3A.Sharpness = varint - SHARPNESS_OFFSET; CAMHAL_LOGDB("Sharpness %d", mParameters3A.Sharpness); mPending3Asettings |= SetSharpness; } } - if ( 0 <= params.getInt(TICameraParameters::KEY_SATURATION) ) + varint = params.getInt(TICameraParameters::KEY_SATURATION); + if ( 0 <= varint ) { if ( mFirstTimeInit || - ((mParameters3A.Saturation + SATURATION_OFFSET) != - params.getInt(TICameraParameters::KEY_SATURATION)) ) + ((mParameters3A.Saturation + SATURATION_OFFSET) != varint ) ) { - mParameters3A.Saturation = params.getInt(TICameraParameters::KEY_SATURATION) - SATURATION_OFFSET; + mParameters3A.Saturation = varint - SATURATION_OFFSET; CAMHAL_LOGDB("Saturation %d", mParameters3A.Saturation); mPending3Asettings |= SetSaturation; } } - if ( 0 <= params.getInt(TICameraParameters::KEY_BRIGHTNESS) ) + varint = params.getInt(TICameraParameters::KEY_BRIGHTNESS); + if ( 0 <= varint ) { if ( mFirstTimeInit || - (( mParameters3A.Brightness != - ( unsigned int ) params.getInt(TICameraParameters::KEY_BRIGHTNESS))) ) + (( mParameters3A.Brightness != varint )) ) { - mParameters3A.Brightness = (unsigned)params.getInt(TICameraParameters::KEY_BRIGHTNESS); + mParameters3A.Brightness = (unsigned) varint; CAMHAL_LOGDB("Brightness %d", mParameters3A.Brightness); mPending3Asettings |= SetBrightness; } } +#endif + str = params.get(CameraParameters::KEY_ANTIBANDING); mode = getLUTvalue_HALtoOMX(str,FlickerLUT); if ( mFirstTimeInit || ( ( str != NULL ) && ( mParameters3A.Flicker != mode ) )) @@ -195,6 +204,8 @@ status_t OMXCameraAdapter::setParameters3A(const CameraParameters ¶ms, } } +#ifdef OMAP_ENHANCEMENT + str = params.get(TICameraParameters::KEY_ISO); mode = getLUTvalue_HALtoOMX(str, IsoLUT); CAMHAL_LOGVB("ISO mode arrived in HAL : %s", str); @@ -208,6 +219,8 @@ status_t OMXCameraAdapter::setParameters3A(const CameraParameters ¶ms, } } +#endif + str = params.get(CameraParameters::KEY_FOCUS_MODE); mode = getLUTvalue_HALtoOMX(str, FocusLUT); if ( (mFirstTimeInit || ((str != NULL) && (mParameters3A.Focus != mode)))) @@ -225,15 +238,14 @@ status_t OMXCameraAdapter::setParameters3A(const CameraParameters ¶ms, } str = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION); + varint = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); if ( mFirstTimeInit || (( str != NULL ) && - (mParameters3A.EVCompensation != - params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION)))) + (mParameters3A.EVCompensation != varint ))) { - CAMHAL_LOGDB("Setting EV Compensation to %d", - params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION)); + CAMHAL_LOGDB("Setting EV Compensation to %d", varint); - mParameters3A.EVCompensation = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); + mParameters3A.EVCompensation = varint; mPending3Asettings |= SetEVCompensation; } @@ -273,7 +285,7 @@ status_t OMXCameraAdapter::setParameters3A(const CameraParameters ¶ms, OMX_BOOL lock = OMX_FALSE; mUserSetExpLock = OMX_FALSE; str = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK); - if ( (strcmp(str, "true")) == 0) + if (str && ((strcmp(str, "true")) == 0)) { CAMHAL_LOGVA("Locking Exposure"); lock = OMX_TRUE; @@ -298,7 +310,7 @@ status_t OMXCameraAdapter::setParameters3A(const CameraParameters ¶ms, OMX_BOOL lock = OMX_FALSE; mUserSetWbLock = OMX_FALSE; str = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK); - if ( (strcmp(str, "true")) == 0) + if (str && ((strcmp(str, "true")) == 0)) { CAMHAL_LOGVA("Locking WhiteBalance"); lock = OMX_TRUE; @@ -384,59 +396,26 @@ const char* OMXCameraAdapter::getLUTvalue_OMXtoHAL(int OMXValue, LUTtype LUT) return NULL; } -status_t OMXCameraAdapter::apply3ADefaults(Gen3A_settings &Gen3A) +status_t OMXCameraAdapter::init3AParams(Gen3A_settings &Gen3A) { - status_t ret = NO_ERROR; - LOG_FUNCTION_NAME; Gen3A.Effect = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_EFFECT, EffLUT); - ret |= setEffect(Gen3A); - Gen3A.FlashMode = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_FLASH_MODE, FlashLUT); - ret |= setFlashMode(Gen3A); - Gen3A.SceneMode = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_SCENE_MODE, SceneLUT); - ret |= setScene(Gen3A); - Gen3A.EVCompensation = atoi(OMXCameraAdapter::DEFAULT_EV_COMPENSATION); - ret |= setEVCompensation(Gen3A); - Gen3A.Focus = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_FOCUS_MODE, FocusLUT); - ret |= setFocusMode(Gen3A); - Gen3A.ISO = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_ISO_MODE, IsoLUT); - ret |= setISO(Gen3A); - Gen3A.Flicker = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_ANTIBANDING, FlickerLUT); - ret |= setFlicker(Gen3A); - Gen3A.Brightness = atoi(OMXCameraAdapter::DEFAULT_BRIGHTNESS); - ret |= setBrightness(Gen3A); - Gen3A.Saturation = atoi(OMXCameraAdapter::DEFAULT_SATURATION) - SATURATION_OFFSET; - ret |= setSaturation(Gen3A); - Gen3A.Sharpness = atoi(OMXCameraAdapter::DEFAULT_SHARPNESS) - SHARPNESS_OFFSET; - ret |= setSharpness(Gen3A); - Gen3A.Contrast = atoi(OMXCameraAdapter::DEFAULT_CONTRAST) - CONTRAST_OFFSET; - ret |= setContrast(Gen3A); - Gen3A.WhiteBallance = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_WB, WBalLUT); - ret |= setWBMode(Gen3A); - Gen3A.Exposure = getLUTvalue_HALtoOMX(OMXCameraAdapter::DEFAULT_EXPOSURE_MODE, ExpLUT); - ret |= setExposureMode(Gen3A); - Gen3A.ExposureLock = OMX_FALSE; - ret |= setExposureLock(Gen3A); - Gen3A.FocusLock = OMX_FALSE; - ret |= setFocusLock(Gen3A); - Gen3A.WhiteBalanceLock = OMX_FALSE; - ret |= setWhiteBalanceLock(Gen3A); LOG_FUNCTION_NAME_EXIT; @@ -492,7 +471,7 @@ static bool isFlashDisabled() { char value[PROPERTY_VALUE_MAX]; if (property_get("camera.flash_off", value, NULL) && (!strcasecmp(value, "true") || !strcasecmp(value, "1"))) { - LOGW("flash is disabled for testing purpose"); + ALOGW("flash is disabled for testing purpose"); return true; } diff --git a/camera/OMXCameraAdapter/OMXAlgo.cpp b/camera/OMXCameraAdapter/OMXAlgo.cpp index 5924dde..ff68cc9 100644 --- a/camera/OMXCameraAdapter/OMXAlgo.cpp +++ b/camera/OMXCameraAdapter/OMXAlgo.cpp @@ -247,6 +247,8 @@ status_t OMXCameraAdapter::setParametersAlgo(const CameraParameters ¶ms, mOMXStateSwitch = true; } +#ifdef OMAP_ENHANCEMENT + //Set Auto Convergence Mode valstr = params.get((const char *) TICameraParameters::KEY_AUTOCONVERGENCE); if ( valstr != NULL ) @@ -277,6 +279,8 @@ status_t OMXCameraAdapter::setParametersAlgo(const CameraParameters ¶ms, CAMHAL_LOGVB("AutoConvergenceMode %s, value = %d", valstr, (int) manualconvergence); } +#endif + LOG_FUNCTION_NAME_EXIT; return ret; diff --git a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp index aa32ede..11ecf0f 100755 --- a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp +++ b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp @@ -33,6 +33,8 @@ static int mDebugFps = 0; static int mDebugFcs = 0; +#undef TRUE +#undef FALSE #define HERE(Msg) {CAMHAL_LOGEB("--===line %d, %s===--\n", __LINE__, Msg);} @@ -78,12 +80,6 @@ status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps) return NO_INIT; } - if (mComponentState != OMX_StateLoaded && mComponentState != OMX_StateInvalid) { - CAMHAL_LOGEB("Error mComponentState %d is invalid!", mComponentState); - LOG_FUNCTION_NAME_EXIT; - return NO_INIT; - } - ///Update the preview and image capture port indexes mCameraAdapterParameters.mPrevPortIndex = OMX_CAMERA_PORT_VIDEO_OUT_PREVIEW; // temp changed in order to build OMX_CAMERA_PORT_VIDEO_OUT_IMAGE; @@ -94,9 +90,10 @@ status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps) eError = OMX_Init(); if (eError != OMX_ErrorNone) { - CAMHAL_LOGEB("Error OMX_Init -0x%x", eError); - return eError; + CAMHAL_LOGEB("OMX_Init() failed, error: 0x%x", eError); + return ErrorUtils::omxToAndroidError(eError); } + mOmxInitialized = true; ///Get the handle to the OMX Component eError = OMXCameraAdapter::OMXCameraGetHandle(&mCameraAdapterParameters.mHandleComp, (OMX_PTR)this); @@ -105,6 +102,8 @@ status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps) } GOTO_EXIT_IF((eError != OMX_ErrorNone), eError); + mComponentState = OMX_StateLoaded; + CAMHAL_LOGVB("OMX_GetHandle -0x%x sensor_index = %lu", eError, mSensorIndex); eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp, OMX_CommandPortDisable, @@ -176,7 +175,6 @@ status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps) mRecording = false; mWaitingForSnapshot = false; mSnapshotCount = 0; - mComponentState = OMX_StateLoaded; mCapMode = HIGH_QUALITY; mIPP = IPP_NULL; @@ -281,14 +279,15 @@ status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps) mMeasurementEnabled = false; mFaceDetectionRunning = false; mFaceDetectionPaused = false; + mFDSwitchAlgoPriority = false; memset(&mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex], 0, sizeof(OMXCameraPortParameters)); memset(&mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex], 0, sizeof(OMXCameraPortParameters)); //Initialize 3A defaults - ret = apply3ADefaults(mParameters3A); + ret = init3AParams(mParameters3A); if ( NO_ERROR != ret ) { - CAMHAL_LOGEA("Couldn't apply 3A defaults!"); + CAMHAL_LOGEA("Couldn't init 3A params!"); goto EXIT; } @@ -432,13 +431,9 @@ status_t OMXCameraAdapter::setParameters(const CameraParameters ¶ms) ///@todo Include more camera parameters if ( (valstr = params.getPreviewFormat()) != NULL ) { - if (strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) - { - CAMHAL_LOGDA("CbYCrY format selected"); - pixFormat = OMX_COLOR_FormatCbYCrY; - } - else if(strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || - strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420P) == 0) + if(strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || + strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420P) == 0 || + strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) { CAMHAL_LOGDA("YUV420SP format selected"); pixFormat = OMX_COLOR_FormatYUV420SemiPlanar; @@ -541,6 +536,8 @@ status_t OMXCameraAdapter::setParameters(const CameraParameters ¶ms) mOMXStateSwitch = true; } +#ifdef OMAP_ENHANCEMENT + if ( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL ) { if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_ENABLE) == 0) @@ -562,6 +559,8 @@ status_t OMXCameraAdapter::setParameters(const CameraParameters ¶ms) mMeasurementEnabled = false; } +#endif + ret |= setParametersCapture(params, state); ret |= setParameters3A(params, state); @@ -594,7 +593,7 @@ void saveFile(unsigned char *buff, int width, int height, int format) { sprintf(fn, "/preview%03d.yuv", counter); fd = open(fn, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC, 0777); if(fd < 0) { - LOGE("Unable to open file %s: %s", fn, strerror(fd)); + ALOGE("Unable to open file %s: %s", fn, strerror(fd)); return; } @@ -682,6 +681,8 @@ void OMXCameraAdapter::getParameters(CameraParameters& params) mParameters.get(CameraParameters::KEY_FOCUS_DISTANCES)); } +#ifdef OMAP_ENHANCEMENT + OMX_INIT_STRUCT_PTR (&exp, OMX_CONFIG_EXPOSUREVALUETYPE); exp.nPortIndex = OMX_ALL; @@ -697,6 +698,8 @@ void OMXCameraAdapter::getParameters(CameraParameters& params) CAMHAL_LOGEB("OMX error 0x%x, while retrieving current ISO value", eError); } +#endif + { Mutex::Autolock lock(mZoomLock); //Immediate zoom should not be avaialable while smooth zoom is running @@ -738,18 +741,21 @@ void OMXCameraAdapter::getParameters(CameraParameters& params) } //Populate current lock status - if( (valstr = mParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL ) - { - CAMHAL_LOGDB("Auto Exposure Lock get %s", mParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)); - params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr); - } - - if( (valstr = mParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL ) - { - CAMHAL_LOGDB("Auto WhiteBalance Lock get %s", mParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)); - params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr); - } + if ( mParameters3A.ExposureLock ) { + params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, + CameraParameters::TRUE); + } else { + params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, + CameraParameters::FALSE); + } + if ( mParameters3A.WhiteBalanceLock ) { + params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, + CameraParameters::TRUE); + } else { + params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, + CameraParameters::FALSE); + } LOG_FUNCTION_NAME_EXIT; } @@ -1743,6 +1749,8 @@ status_t OMXCameraAdapter::UseBuffersPreview(void* bufArr, int num) ///If there is any failure, we reach here. ///Here, we do any resource freeing and convert from OMX error code to Camera Hal error code EXIT: + mStateSwitchLock.unlock(); + CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError); performCleanupAfterError(); CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError); @@ -1758,15 +1766,14 @@ status_t OMXCameraAdapter::startPreview() OMX_ERRORTYPE eError = OMX_ErrorNone; OMXCameraPortParameters *mPreviewData = NULL; OMXCameraPortParameters *measurementData = NULL; - OMX_CONFIG_EXTRADATATYPE extraDataControl; LOG_FUNCTION_NAME; if( 0 != mStartPreviewSem.Count() ) { CAMHAL_LOGEB("Error mStartPreviewSem semaphore count %d", mStartPreviewSem.Count()); - LOG_FUNCTION_NAME_EXIT; - return NO_INIT; + ret = NO_INIT; + goto EXIT; } mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex]; @@ -1870,15 +1877,7 @@ status_t OMXCameraAdapter::startPreview() // whether the preview frame is a snapshot if ( OMX_ErrorNone == eError) { - OMX_INIT_STRUCT_PTR (&extraDataControl, OMX_CONFIG_EXTRADATATYPE); - extraDataControl.nPortIndex = OMX_ALL; - extraDataControl.eExtraDataType = OMX_AncillaryData; - extraDataControl.bEnable = OMX_TRUE; - - eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, - ( OMX_INDEXTYPE ) OMX_IndexConfigOtherExtraDataControl, - &extraDataControl); - GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError); + ret = setExtraData(true, OMX_ALL, OMX_AncillaryData); } @@ -1935,6 +1934,14 @@ status_t OMXCameraAdapter::stopPreview() mCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex]; measurementData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mMeasurementPortIndex]; + if (mAdapterState == LOADED_PREVIEW_STATE) { + // Something happened in CameraHal between UseBuffers and startPreview + // this means that state switch is still locked..so we need to unlock else + // deadlock will occur on the next start preview + mStateSwitchLock.unlock(); + return NO_ERROR; + } + if ( mComponentState != OMX_StateExecuting ) { CAMHAL_LOGEA("Calling StopPreview() when not in EXECUTING state"); @@ -2707,6 +2714,7 @@ OMX_ERRORTYPE OMXCameraAdapter::SignalEvent(OMX_IN OMX_HANDLETYPE hComponent, { Mutex::Autolock lock(mEventLock); TIUTILS::Message *msg; + bool eventSignalled = false; LOG_FUNCTION_NAME; @@ -2730,6 +2738,7 @@ OMX_ERRORTYPE OMXCameraAdapter::SignalEvent(OMX_IN OMX_HANDLETYPE hComponent, //Signal the semaphore provided sem->Signal(); free(msg); + eventSignalled = true; break; } } @@ -2740,6 +2749,19 @@ OMX_ERRORTYPE OMXCameraAdapter::SignalEvent(OMX_IN OMX_HANDLETYPE hComponent, CAMHAL_LOGDA("Event queue empty!!!"); } + // Special handling for any unregistered events + if (!eventSignalled) { + // Handling for focus callback + if ((nData2 == OMX_IndexConfigCommonFocusStatus) && + (eEvent == (OMX_EVENTTYPE) OMX_EventIndexSettingChanged)) { + TIUTILS::Message msg; + msg.command = OMXCallbackHandler::CAMERA_FOCUS_STATUS; + msg.arg1 = NULL; + msg.arg2 = NULL; + mOMXCallbackHandler->put(&msg); + } + } + LOG_FUNCTION_NAME_EXIT; return OMX_ErrorNone; @@ -2867,7 +2889,7 @@ static void debugShowFPS() mFps = ((mFrameCount - mLastFrameCount) * float(s2ns(1))) / diff; mLastFpsTime = now; mLastFrameCount = mFrameCount; - LOGD("Camera %d Frames, %f FPS", mFrameCount, mFps); + ALOGD("Camera %d Frames, %f FPS", mFrameCount, mFps); } // XXX: mFPS has the value we want } @@ -2919,7 +2941,7 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE CameraFrame cameraFrame; OMX_TI_PLATFORMPRIVATE *platformPrivate; OMX_OTHER_EXTRADATATYPE *extraData; - OMX_TI_ANCILLARYDATATYPE *ancillaryData; + OMX_TI_ANCILLARYDATATYPE *ancillaryData = NULL; bool snapshotFrame = false; res1 = res2 = NO_ERROR; @@ -2948,11 +2970,11 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE { ancillaryData = (OMX_TI_ANCILLARYDATATYPE*) extraData->data; snapshotFrame = ancillaryData->nDCCStatus; + mPending3Asettings |= SetFocus; } } recalculateFPS(); - { Mutex::Autolock lock(mFaceDetectionLock); if ( mFaceDetectionRunning && !mFaceDetectionPaused ) { @@ -2961,12 +2983,18 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE notifyFaceSubscribers(fdResult); fdResult.clear(); } - } - } + if ( mFDSwitchAlgoPriority ) { - if ( (nextState & CAPTURE_ACTIVE) ) - { - mPending3Asettings |= SetFocus; + //Disable region priority and enable face priority for AF + setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, false); + setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO , true); + + //Disable Region priority and enable Face priority + setAlgoPriority(REGION_PRIORITY, EXPOSURE_ALGO, false); + setAlgoPriority(FACE_PRIORITY, EXPOSURE_ALGO, true); + mFDSwitchAlgoPriority = false; + } + } } ///Prepare the frames to be sent - initialize CameraFrame object and reference count @@ -2978,6 +3006,16 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE { typeOfFrame = CameraFrame::SNAPSHOT_FRAME; mask = (unsigned int)CameraFrame::SNAPSHOT_FRAME; + + // video snapshot gets ancillary data and wb info from last snapshot frame + mCaptureAncillaryData = ancillaryData; + mWhiteBalanceData = NULL; + extraData = getExtradata((OMX_OTHER_EXTRADATATYPE*) platformPrivate->pMetaDataBuffer, + (OMX_EXTRADATATYPE) OMX_WhiteBalance); + if ( NULL != extraData ) + { + mWhiteBalanceData = (OMX_TI_WHITEBALANCERESULTTYPE*) extraData->data; + } } else { @@ -2991,7 +3029,7 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE mFramesWithEncoder++; } - //LOGV("FBD pBuffer = 0x%x", pBuffHeader->pBuffer); + //ALOGV("FBD pBuffer = 0x%x", pBuffHeader->pBuffer); if( mWaitingForSnapshot ) { @@ -3012,8 +3050,8 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE #ifdef DEBUG_LOG if(mBuffersWithDucati.indexOfKey((int)pBuffHeader->pBuffer)<0) { - LOGE("Buffer was never with Ducati!! 0x%x", pBuffHeader->pBuffer); - for(int i=0;i<mBuffersWithDucati.size();i++) LOGE("0x%x", mBuffersWithDucati.keyAt(i)); + ALOGE("Buffer was never with Ducati!! 0x%x", pBuffHeader->pBuffer); + for(int i=0;i<mBuffersWithDucati.size();i++) ALOGE("0x%x", mBuffersWithDucati.keyAt(i)); } mBuffersWithDucati.removeItem((int)pBuffHeader->pBuffer); #endif @@ -3026,10 +3064,13 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE // On the fly update to 3A settings not working // Do not update 3A here if we are in the middle of a capture // or in the middle of transitioning to it - if( mPending3Asettings && ((nextState & CAPTURE_ACTIVE) == 0)) + if( mPending3Asettings && + ( (nextState & CAPTURE_ACTIVE) == 0 ) && + ( (state & CAPTURE_ACTIVE) == 0 ) ) { apply3Asettings(mParameters3A); } + } else if( pBuffHeader->nOutputPortIndex == OMX_CAMERA_PORT_VIDEO_OUT_MEASUREMENT ) { @@ -3064,7 +3105,7 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE // populate exif data and pass to subscribers via quirk // subscriber is in charge of freeing exif data ExifElementsTable* exif = new ExifElementsTable(); - setupEXIF_libjpeg(exif); + setupEXIF_libjpeg(exif, mCaptureAncillaryData, mWhiteBalanceData); cameraFrame.mQuirks |= CameraFrame::HAS_EXIF_DATA; cameraFrame.mCookie2 = (void*) exif; } @@ -3368,6 +3409,11 @@ bool OMXCameraAdapter::OMXCallbackHandler::Handler() ( OMX_BUFFERHEADERTYPE *) msg.arg2); break; } + case OMXCallbackHandler::CAMERA_FOCUS_STATUS: + { + mCameraAdapter->handleFocusCallback(); + break; + } case CommandHandler::COMMAND_EXIT: { CAMHAL_LOGDA("Exiting OMX callback handler"); @@ -3381,6 +3427,41 @@ bool OMXCameraAdapter::OMXCallbackHandler::Handler() return false; } +status_t OMXCameraAdapter::setExtraData(bool enable, OMX_U32 nPortIndex, OMX_EXT_EXTRADATATYPE eType) { + status_t ret = NO_ERROR; + OMX_ERRORTYPE eError = OMX_ErrorNone; + OMX_CONFIG_EXTRADATATYPE extraDataControl; + + LOG_FUNCTION_NAME; + + if ( ( OMX_StateInvalid == mComponentState ) || + ( NULL == mCameraAdapterParameters.mHandleComp ) ) { + CAMHAL_LOGEA("OMX component is in invalid state"); + return -EINVAL; + } + + OMX_INIT_STRUCT_PTR (&extraDataControl, OMX_CONFIG_EXTRADATATYPE); + + extraDataControl.nPortIndex = nPortIndex; + extraDataControl.eExtraDataType = eType; + extraDataControl.eCameraView = OMX_2D; + + if (enable) { + extraDataControl.bEnable = OMX_TRUE; + } else { + extraDataControl.bEnable = OMX_FALSE; + } + + eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, + (OMX_INDEXTYPE) OMX_IndexConfigOtherExtraDataControl, + &extraDataControl); + + LOG_FUNCTION_NAME_EXIT; + + return (ret | ErrorUtils::omxToAndroidError(eError)); +} + + OMX_OTHER_EXTRADATATYPE *OMXCameraAdapter::getExtradata(OMX_OTHER_EXTRADATATYPE *extraData, OMX_EXTRADATATYPE type) { if ( NULL != extraData ) @@ -3398,17 +3479,18 @@ OMX_OTHER_EXTRADATATYPE *OMXCameraAdapter::getExtradata(OMX_OTHER_EXTRADATATYPE return NULL; } -OMXCameraAdapter::OMXCameraAdapter(size_t sensor_index): mComponentState (OMX_StateLoaded) +OMXCameraAdapter::OMXCameraAdapter(size_t sensor_index) { LOG_FUNCTION_NAME; + mOmxInitialized = false; + mComponentState = OMX_StateInvalid; mSensorIndex = sensor_index; mPictureRotation = 0; // Initial values mTimeSourceDelta = 0; onlyOnce = true; - mDoAFSem.Create(0); mInitSem.Create(0); mFlushSem.Create(0); mUsePreviewDataSem.Create(0); @@ -3441,22 +3523,22 @@ OMXCameraAdapter::~OMXCameraAdapter() Mutex::Autolock lock(gAdapterLock); - //Return to OMX Loaded state - switchToLoaded(); + if ( mOmxInitialized ) { + // return to OMX Loaded state + switchToLoaded(); - ///De-init the OMX - if( (mComponentState==OMX_StateLoaded) || (mComponentState==OMX_StateInvalid)) - { - ///Free the handle for the Camera component - if(mCameraAdapterParameters.mHandleComp) - { - OMX_FreeHandle(mCameraAdapterParameters.mHandleComp); - mCameraAdapterParameters.mHandleComp = NULL; + // deinit the OMX + if ( mComponentState == OMX_StateLoaded || mComponentState == OMX_StateInvalid ) { + // free the handle for the Camera component + if ( mCameraAdapterParameters.mHandleComp ) { + OMX_FreeHandle(mCameraAdapterParameters.mHandleComp); + mCameraAdapterParameters.mHandleComp = NULL; } - - OMX_Deinit(); } + OMX_Deinit(); + mOmxInitialized = false; + } //Remove any unhandled events if ( !mEventSignalQ.isEmpty() ) @@ -3526,28 +3608,30 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraGetHandle(OMX_HANDLETYPE *handle, OMX_P { OMX_ERRORTYPE eError = OMX_ErrorUndefined; - int retries = 5; - while(eError!=OMX_ErrorNone && --retries>=0) { + for ( int i = 0; i < 5; ++i ) { + if ( i > 0 ) { + // sleep for 100 ms before next attempt + usleep(100000); + } - // Setup key parameters to send to Ducati during init - OMX_CALLBACKTYPE oCallbacks; + // setup key parameters to send to Ducati during init + OMX_CALLBACKTYPE oCallbacks; - // Initialize the callback handles - oCallbacks.EventHandler = android::OMXCameraAdapterEventHandler; - oCallbacks.EmptyBufferDone = android::OMXCameraAdapterEmptyBufferDone; - oCallbacks.FillBufferDone = android::OMXCameraAdapterFillBufferDone; + // initialize the callback handles + oCallbacks.EventHandler = android::OMXCameraAdapterEventHandler; + oCallbacks.EmptyBufferDone = android::OMXCameraAdapterEmptyBufferDone; + oCallbacks.FillBufferDone = android::OMXCameraAdapterFillBufferDone; - // Get Handle - eError = OMX_GetHandle(handle, (OMX_STRING)"OMX.TI.DUCATI1.VIDEO.CAMERA", pAppData, &oCallbacks); - if (eError != OMX_ErrorNone) { - CAMHAL_LOGEB("OMX_GetHandle -0x%x", eError); - //Sleep for 100 mS - usleep(100000); - } else { - break; - } + // get handle + eError = OMX_GetHandle(handle, (OMX_STRING)"OMX.TI.DUCATI1.VIDEO.CAMERA", pAppData, &oCallbacks); + if ( eError == OMX_ErrorNone ) { + return OMX_ErrorNone; + } + + CAMHAL_LOGEB("OMX_GetHandle() failed, error: 0x%x", eError); } + *handle = 0; return eError; } diff --git a/camera/OMXCameraAdapter/OMXCapture.cpp b/camera/OMXCameraAdapter/OMXCapture.cpp index 77fdb05..93a0dae 100644 --- a/camera/OMXCameraAdapter/OMXCapture.cpp +++ b/camera/OMXCameraAdapter/OMXCapture.cpp @@ -40,6 +40,7 @@ status_t OMXCameraAdapter::setParametersCapture(const CameraParameters ¶ms, int w, h; OMX_COLOR_FORMATTYPE pixFormat; const char *valstr = NULL; + int varint = 0; LOG_FUNCTION_NAME; @@ -142,6 +143,8 @@ status_t OMXCameraAdapter::setParametersCapture(const CameraParameters ¶ms, cap->mColorFormat = pixFormat; } +#ifdef OMAP_ENHANCEMENT + str = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE); if ( NULL != str ) { parseExpRange(str, mExposureBracketingValues, EXP_BRACKET_RANGE, mExposureBracketingValidEntries); @@ -151,12 +154,15 @@ status_t OMXCameraAdapter::setParametersCapture(const CameraParameters ¶ms, mExposureBracketingValidEntries = 0; } - if ( params.getInt(CameraParameters::KEY_ROTATION) != -1 ) +#endif + + varint = params.getInt(CameraParameters::KEY_ROTATION); + if ( varint != -1 ) { - if (params.getInt(CameraParameters::KEY_ROTATION) != mPictureRotation) { + if ( ( unsigned int ) varint != mPictureRotation) { mPendingCaptureSettings |= SetRotation; } - mPictureRotation = params.getInt(CameraParameters::KEY_ROTATION); + mPictureRotation = varint; } else { @@ -166,11 +172,14 @@ status_t OMXCameraAdapter::setParametersCapture(const CameraParameters ¶ms, CAMHAL_LOGVB("Picture Rotation set %d", mPictureRotation); +#ifdef OMAP_ENHANCEMENT + // Read Sensor Orientation and set it based on perating mode - if (( params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION) != -1 ) && (mCapMode == OMXCameraAdapter::VIDEO_MODE)) + varint = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION); + if (( varint != -1 ) && (mCapMode == OMXCameraAdapter::VIDEO_MODE)) { - mSensorOrientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION); + mSensorOrientation = varint; if (mSensorOrientation == 270 ||mSensorOrientation==90) { CAMHAL_LOGEA(" Orientation is 270/90. So setting counter rotation to Ducati"); @@ -185,12 +194,13 @@ status_t OMXCameraAdapter::setParametersCapture(const CameraParameters ¶ms, CAMHAL_LOGVB("Sensor Orientation set : %d", mSensorOrientation); - if ( params.getInt(TICameraParameters::KEY_BURST) >= 1 ) + varint = params.getInt(TICameraParameters::KEY_BURST); + if ( varint >= 1 ) { - if (params.getInt(TICameraParameters::KEY_BURST) != mBurstFrames) { + if (varint != mBurstFrames) { mPendingCaptureSettings |= SetExpBracket; } - mBurstFrames = params.getInt(TICameraParameters::KEY_BURST); + mBurstFrames = varint; } else { @@ -200,13 +210,16 @@ status_t OMXCameraAdapter::setParametersCapture(const CameraParameters ¶ms, CAMHAL_LOGVB("Burst Frames set %d", mBurstFrames); - if ( ( params.getInt(CameraParameters::KEY_JPEG_QUALITY) >= MIN_JPEG_QUALITY ) && - ( params.getInt(CameraParameters::KEY_JPEG_QUALITY) <= MAX_JPEG_QUALITY ) ) +#endif + + varint = params.getInt(CameraParameters::KEY_JPEG_QUALITY); + if ( ( varint >= MIN_JPEG_QUALITY ) && + ( varint <= MAX_JPEG_QUALITY ) ) { - if (params.getInt(CameraParameters::KEY_JPEG_QUALITY) != mPictureQuality) { + if ( ( unsigned int ) varint != mPictureQuality) { mPendingCaptureSettings |= SetQuality; } - mPictureQuality = params.getInt(CameraParameters::KEY_JPEG_QUALITY); + mPictureQuality = varint; } else { @@ -216,12 +229,13 @@ status_t OMXCameraAdapter::setParametersCapture(const CameraParameters ¶ms, CAMHAL_LOGVB("Picture Quality set %d", mPictureQuality); - if ( params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH) >= 0 ) + varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); + if ( varint >= 0 ) { - if (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH) != mThumbWidth) { + if ( ( unsigned int ) varint != mThumbWidth) { mPendingCaptureSettings |= SetThumb; } - mThumbWidth = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); + mThumbWidth = varint; } else { @@ -232,12 +246,13 @@ status_t OMXCameraAdapter::setParametersCapture(const CameraParameters ¶ms, CAMHAL_LOGVB("Picture Thumb width set %d", mThumbWidth); - if ( params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT) >= 0 ) + varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); + if ( varint >= 0 ) { - if (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT) != mThumbHeight) { + if ( ( unsigned int ) varint != mThumbHeight) { mPendingCaptureSettings |= SetThumb; } - mThumbHeight = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); + mThumbHeight = varint; } else { @@ -248,13 +263,14 @@ status_t OMXCameraAdapter::setParametersCapture(const CameraParameters ¶ms, CAMHAL_LOGVB("Picture Thumb height set %d", mThumbHeight); - if ( ( params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY) >= MIN_JPEG_QUALITY ) && - ( params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY) <= MAX_JPEG_QUALITY ) ) + varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); + if ( ( varint >= MIN_JPEG_QUALITY ) && + ( varint <= MAX_JPEG_QUALITY ) ) { - if (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY) != mThumbQuality) { + if ( ( unsigned int ) varint != mThumbQuality) { mPendingCaptureSettings |= SetThumb; } - mThumbQuality = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); + mThumbQuality = varint; } else { @@ -775,6 +791,12 @@ status_t OMXCameraAdapter::startImageCapture() } } + // need to enable wb data for video snapshot to fill in exif data + if ((ret == NO_ERROR) && (mCapMode == VIDEO_MODE)) { + // video snapshot uses wb data from snapshot frame + ret = setExtraData(true, mCameraAdapterParameters.mPrevPortIndex, OMX_WhiteBalance); + } + //OMX shutter callback events are only available in hq mode if ( (HIGH_QUALITY == mCapMode) || (HIGH_QUALITY_ZSL== mCapMode)) { @@ -866,6 +888,7 @@ status_t OMXCameraAdapter::startImageCapture() EXIT: CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError); + setExtraData(false, mCameraAdapterParameters.mPrevPortIndex, OMX_WhiteBalance); mWaitingForSnapshot = false; mCaptureSignalled = false; performCleanupAfterError(); @@ -945,6 +968,13 @@ status_t OMXCameraAdapter::stopImageCapture() goto EXIT; } } + + // had to enable wb data for video snapshot to fill in exif data + // now that we are done...disable + if ((ret == NO_ERROR) && (mCapMode == VIDEO_MODE)) { + ret = setExtraData(false, mCameraAdapterParameters.mPrevPortIndex, OMX_WhiteBalance); + } + CAMHAL_LOGDB("Capture set - 0x%x", eError); mCaptureSignalled = true; //set this to true if we exited because of timeout diff --git a/camera/OMXCameraAdapter/OMXExif.cpp b/camera/OMXCameraAdapter/OMXExif.cpp index 4c5e555..70fb3db 100755..100644 --- a/camera/OMXCameraAdapter/OMXExif.cpp +++ b/camera/OMXCameraAdapter/OMXExif.cpp @@ -497,7 +497,9 @@ status_t OMXCameraAdapter::setupEXIF() return ret; } -status_t OMXCameraAdapter::setupEXIF_libjpeg(ExifElementsTable* exifTable) +status_t OMXCameraAdapter::setupEXIF_libjpeg(ExifElementsTable* exifTable, + OMX_TI_ANCILLARYDATATYPE* pAncillaryData, + OMX_TI_WHITEBALANCERESULTTYPE* pWhiteBalanceData) { status_t ret = NO_ERROR; OMX_ERRORTYPE eError = OMX_ErrorNone; @@ -544,7 +546,6 @@ status_t OMXCameraAdapter::setupEXIF_libjpeg(ExifElementsTable* exifTable) pTime->tm_hour, pTime->tm_min, pTime->tm_sec ); - ret = exifTable->insertElement(TAG_DATETIME, temp_value); } } @@ -658,6 +659,129 @@ status_t OMXCameraAdapter::setupEXIF_libjpeg(ExifElementsTable* exifTable) } } + // fill in short and ushort tags + if (NO_ERROR == ret) { + char temp_value[2]; + temp_value[1] = '\0'; + + // AWB + if (mParameters3A.WhiteBallance == OMX_WhiteBalControlAuto) { + temp_value[0] = '0'; + } else { + temp_value[0] = '1'; + } + exifTable->insertElement(TAG_WHITEBALANCE, temp_value); + + // MeteringMode + // TODO(XXX): only supporting this metering mode at the moment, may change in future + temp_value[0] = '2'; + exifTable->insertElement(TAG_METERING_MODE, temp_value); + + // ExposureProgram + // TODO(XXX): only supporting this exposure program at the moment, may change in future + temp_value[0] = '3'; + exifTable->insertElement(TAG_EXPOSURE_PROGRAM, temp_value); + + // ColorSpace + temp_value[0] = '1'; + exifTable->insertElement(TAG_COLOR_SPACE, temp_value); + + temp_value[0] = '2'; + exifTable->insertElement(TAG_SENSING_METHOD, temp_value); + + temp_value[0] = '1'; + exifTable->insertElement(TAG_CUSTOM_RENDERED, temp_value); + } + + if (pAncillaryData && (NO_ERROR == ret)) { + unsigned int numerator = 0, denominator = 0; + char temp_value[256]; + unsigned int temp_num = 0; + + // DigitalZoomRatio + snprintf(temp_value, + sizeof(temp_value)/sizeof(char), + "%u/%u", + pAncillaryData->nDigitalZoomFactor, 1024); + exifTable->insertElement(TAG_DIGITALZOOMRATIO, temp_value); + + // ExposureTime + snprintf(temp_value, + sizeof(temp_value)/sizeof(char), + "%u/%u", + pAncillaryData->nExposureTime, 1000000); + exifTable->insertElement(TAG_EXPOSURETIME, temp_value); + + // ApertureValue and FNumber + snprintf(temp_value, + sizeof(temp_value)/sizeof(char), + "%u/%u", + pAncillaryData->nApertureValue, 100); + exifTable->insertElement(TAG_FNUMBER, temp_value); + exifTable->insertElement(TAG_APERTURE, temp_value); + + // ISO + snprintf(temp_value, + sizeof(temp_value)/sizeof(char), + "%u,0,0", + pAncillaryData->nCurrentISO); + exifTable->insertElement(TAG_ISO_EQUIVALENT, temp_value); + + // ShutterSpeed + snprintf(temp_value, + sizeof(temp_value)/sizeof(char), + "%f", + log(pAncillaryData->nExposureTime) / log(2)); + ExifElementsTable::stringToRational(temp_value, &numerator, &denominator); + snprintf(temp_value, sizeof(temp_value)/sizeof(char), "%u/%u", numerator, denominator); + exifTable->insertElement(TAG_SHUTTERSPEED, temp_value); + + // Flash + if (mParameters3A.FlashMode == OMX_IMAGE_FlashControlAuto) { + if(pAncillaryData->nFlashStatus) temp_num = 0x19; // Flash fired, auto mode + else temp_num = 0x18; // Flash did not fire, auto mode + } else if (mParameters3A.FlashMode == OMX_IMAGE_FlashControlOn) { + if(pAncillaryData->nFlashStatus) temp_num = 0x9; // Flash fired, compulsory flash mode + else temp_num = 0x10; // Flash did not fire, compulsory flash mode + } else if(pAncillaryData->nFlashStatus) { + temp_num = 0x1; // Flash fired + } else { + temp_num = 0x0; // Flash did not fire + } + snprintf(temp_value, + sizeof(temp_value)/sizeof(char), + "%u", temp_num); + exifTable->insertElement(TAG_FLASH, temp_value); + + if (pWhiteBalanceData) { + unsigned int lightsource = 0; + unsigned int colourtemp = pWhiteBalanceData->nColorTemperature; + bool flash_fired = (temp_num & 0x1); // value from flash above + + // stole this from framework/tools_library/src/tools_sys_exif_tags.c + if( colourtemp <= 3200 ) { + lightsource = 3; // Tungsten + } else if( colourtemp > 3200 && colourtemp <= 4800 ) { + lightsource = 2; // Fluorescent + } else if( colourtemp > 4800 && colourtemp <= 5500 ) { + lightsource = 1; // Daylight + } else if( colourtemp > 5500 && colourtemp <= 6500 ) { + lightsource = 9; // Fine weather + } else if( colourtemp > 6500 ) { + lightsource = 10; // Cloudy weather + } + + if(flash_fired) { + lightsource = 4; // Flash + } + + snprintf(temp_value, + sizeof(temp_value)/sizeof(char), + "%u", lightsource); + exifTable->insertElement(TAG_LIGHT_SOURCE, temp_value); + } + } + LOG_FUNCTION_NAME_EXIT; return ret; @@ -675,7 +799,7 @@ status_t OMXCameraAdapter::convertGPSCoord(double coord, if ( coord == 0 ) { - LOGE("Invalid GPS coordinate"); + ALOGE("Invalid GPS coordinate"); return -EINVAL; } diff --git a/camera/OMXCameraAdapter/OMXFD.cpp b/camera/OMXCameraAdapter/OMXFD.cpp index 38c7a6e..26bbd87 100644 --- a/camera/OMXCameraAdapter/OMXFD.cpp +++ b/camera/OMXCameraAdapter/OMXFD.cpp @@ -62,16 +62,9 @@ status_t OMXCameraAdapter::startFaceDetection() goto out; } - if ( mFaceDetectionRunning ) - { - //Disable region priority and enable face priority for AF - setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, false); - setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO , true); - - //Disable Region priority and enable Face priority - setAlgoPriority(REGION_PRIORITY, EXPOSURE_ALGO, false); - setAlgoPriority(FACE_PRIORITY, EXPOSURE_ALGO, true); - } + if ( mFaceDetectionRunning ) { + mFDSwitchAlgoPriority = true; + } // Note: White balance will not be face prioritized, since // the algorithm needs full frame statistics, and not face @@ -125,7 +118,6 @@ status_t OMXCameraAdapter::setFaceDetection(bool enable, OMX_U32 orientation) { status_t ret = NO_ERROR; OMX_ERRORTYPE eError = OMX_ErrorNone; - OMX_CONFIG_EXTRADATATYPE extraDataControl; OMX_CONFIG_OBJDETECTIONTYPE objDetection; LOG_FUNCTION_NAME; @@ -170,27 +162,11 @@ status_t OMXCameraAdapter::setFaceDetection(bool enable, OMX_U32 orientation) if ( NO_ERROR == ret ) { - OMX_INIT_STRUCT_PTR (&extraDataControl, OMX_CONFIG_EXTRADATATYPE); - extraDataControl.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; - extraDataControl.eExtraDataType = OMX_FaceDetection; - extraDataControl.eCameraView = OMX_2D; - if ( enable ) - { - extraDataControl.bEnable = OMX_TRUE; - } - else - { - extraDataControl.bEnable = OMX_FALSE; - } + ret = setExtraData(enable, mCameraAdapterParameters.mPrevPortIndex, OMX_FaceDetection); - eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, - ( OMX_INDEXTYPE ) OMX_IndexConfigOtherExtraDataControl, - &extraDataControl); - if ( OMX_ErrorNone != eError ) + if ( NO_ERROR != ret ) { - CAMHAL_LOGEB("Error while configuring face detection extra data 0x%x", - eError); - ret = -1; + CAMHAL_LOGEA("Error while configuring face detection extra data"); } else { @@ -245,19 +221,19 @@ status_t OMXCameraAdapter::detectFaces(OMX_BUFFERHEADERTYPE* pBuffHeader, platformPrivate->pMetaDataBuffer, platformPrivate->nMetaDataSize); } else { - CAMHAL_LOGEB("OMX_TI_PLATFORMPRIVATE size mismatch: expected = %d, received = %d", + CAMHAL_LOGDB("OMX_TI_PLATFORMPRIVATE size mismatch: expected = %d, received = %d", ( unsigned int ) sizeof(OMX_TI_PLATFORMPRIVATE), ( unsigned int ) platformPrivate->nSize); - ret = -EINVAL; + return -EINVAL; } } else { - CAMHAL_LOGEA("Invalid OMX_TI_PLATFORMPRIVATE"); + CAMHAL_LOGDA("Invalid OMX_TI_PLATFORMPRIVATE"); return-EINVAL; } if ( 0 >= platformPrivate->nMetaDataSize ) { - CAMHAL_LOGEB("OMX_TI_PLATFORMPRIVATE nMetaDataSize is size is %d", + CAMHAL_LOGDB("OMX_TI_PLATFORMPRIVATE nMetaDataSize is size is %d", ( unsigned int ) platformPrivate->nMetaDataSize); return -EINVAL; } @@ -274,7 +250,7 @@ status_t OMXCameraAdapter::detectFaces(OMX_BUFFERHEADERTYPE* pBuffHeader, extraData->nPortIndex, extraData->nVersion); } else { - CAMHAL_LOGEA("Invalid OMX_OTHER_EXTRADATATYPE"); + CAMHAL_LOGDA("Invalid OMX_OTHER_EXTRADATATYPE"); return -EINVAL; } @@ -289,7 +265,7 @@ status_t OMXCameraAdapter::detectFaces(OMX_BUFFERHEADERTYPE* pBuffHeader, faceData->nPortIndex, faceData->nVersion); } else { - CAMHAL_LOGEB("OMX_FACEDETECTIONTYPE size mismatch: expected = %d, received = %d", + CAMHAL_LOGDB("OMX_FACEDETECTIONTYPE size mismatch: expected = %d, received = %d", ( unsigned int ) sizeof(OMX_FACEDETECTIONTYPE), ( unsigned int ) faceData->nSize); return -EINVAL; diff --git a/camera/OMXCameraAdapter/OMXFocus.cpp b/camera/OMXCameraAdapter/OMXFocus.cpp index d9d4df4..be1dfc5 100644 --- a/camera/OMXCameraAdapter/OMXFocus.cpp +++ b/camera/OMXCameraAdapter/OMXFocus.cpp @@ -84,7 +84,7 @@ status_t OMXCameraAdapter::doAutoFocus() OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl; OMX_PARAM_FOCUSSTATUSTYPE focusStatus; OMX_CONFIG_BOOLEANTYPE bOMX; - int timeout = 0; + nsecs_t timeout = 0; LOG_FUNCTION_NAME; @@ -102,17 +102,14 @@ status_t OMXCameraAdapter::doAutoFocus() return NO_ERROR; } - if ( 0 != mDoAFSem.Count() ) - { - CAMHAL_LOGEB("Error mDoAFSem semaphore count %d", mDoAFSem.Count()); - return NO_INIT; - } if( ((AF_ACTIVE & getState()) != AF_ACTIVE) && ((AF_ACTIVE & getNextState()) != AF_ACTIVE) ) { CAMHAL_LOGDA("Auto focus got canceled before doAutoFocus could be called"); return NO_ERROR; } + OMX_INIT_STRUCT_PTR (&focusStatus, OMX_PARAM_FOCUSSTATUSTYPE); + // If the app calls autoFocus, the camera will stop sending face callbacks. pauseFaceDetection(true); @@ -141,8 +138,7 @@ status_t OMXCameraAdapter::doAutoFocus() } else if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) { // In case we have CAF running we should first check the AF status. // If it has managed to lock, then do as usual and return status - // immediately. If lock is not available, then switch temporarily - // to 'autolock' and do normal AF. + // immediately. ret = checkFocus(&focusStatus); if ( NO_ERROR != ret ) { CAMHAL_LOGEB("Focus status check failed 0x%x!", ret); @@ -152,9 +148,10 @@ status_t OMXCameraAdapter::doAutoFocus() } } - if ( (focusControl.eFocusControl == OMX_IMAGE_FocusControlAuto - && (focusStatus.eFocusStatus == OMX_FocusStatusRequest - || focusStatus.eFocusStatus == OMX_FocusStatusUnableToReach) ) || + if ( (focusControl.eFocusControl == OMX_IMAGE_FocusControlAuto && + ( focusStatus.eFocusStatus == OMX_FocusStatusRequest || + focusStatus.eFocusStatus == OMX_FocusStatusUnableToReach || + focusStatus.eFocusStatus == OMX_FocusStatusLost ) ) || (mParameters3A.Focus != (OMX_IMAGE_FOCUSCONTROLTYPE)OMX_IMAGE_FocusControlAuto) ) { OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE); @@ -165,19 +162,13 @@ status_t OMXCameraAdapter::doAutoFocus() (OMX_INDEXTYPE)OMX_TI_IndexConfigAutofocusEnable, &bOMX); - ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp, - (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, - OMX_ALL, - OMX_IndexConfigCommonFocusStatus, - mDoAFSem); - // force AF, Ducati will take care of whether CAF // or AF will be performed, depending on light conditions - if ( focusControl.eFocusControl == OMX_IMAGE_FocusControlAuto - && focusStatus.eFocusStatus == OMX_FocusStatusUnableToReach ) - { - focusControl.eFocusControl = OMX_IMAGE_FocusControlAutoLock; - } + if ( focusControl.eFocusControl == OMX_IMAGE_FocusControlAuto && + ( focusStatus.eFocusStatus == OMX_FocusStatusUnableToReach || + focusStatus.eFocusStatus == OMX_FocusStatusLost ) ) { + focusControl.eFocusControl = OMX_IMAGE_FocusControlAutoLock; + } if ( focusControl.eFocusControl != OMX_IMAGE_FocusControlAuto ) { @@ -194,31 +185,30 @@ status_t OMXCameraAdapter::doAutoFocus() } // configure focus timeout based on capture mode - timeout = (mCapMode == VIDEO_MODE) ? AF_VIDEO_CALLBACK_TIMEOUT : AF_IMAGE_CALLBACK_TIMEOUT; + timeout = (mCapMode == VIDEO_MODE) ? + ( ( nsecs_t ) AF_VIDEO_CALLBACK_TIMEOUT * 1000 ) : + ( ( nsecs_t ) AF_IMAGE_CALLBACK_TIMEOUT * 1000 ); + + { + Mutex::Autolock lock(mDoAFMutex); + ret = mDoAFCond.waitRelative(mDoAFMutex, timeout); + } - ret = mDoAFSem.WaitTimeout(timeout); //If somethiing bad happened while we wait if (mComponentState == OMX_StateInvalid) { CAMHAL_LOGEA("Invalid State after Auto Focus Exitting!!!"); - return EINVAL; + return -EINVAL; } - if( ret != NO_ERROR) { - //Disable auto focus callback from Ducati - setFocusCallback(false); + if(ret != NO_ERROR) { CAMHAL_LOGEA("Autofocus callback timeout expired"); - RemoveEvent(mCameraAdapterParameters.mHandleComp, - (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, - OMX_ALL, - OMX_IndexConfigCommonFocusStatus, - NULL ); - returnFocusStatus(true); + ret = returnFocusStatus(true); } else { ret = returnFocusStatus(false); } } else { // Focus mode in continuous if ( NO_ERROR == ret ) { - ret = returnFocusStatus(false); + ret = returnFocusStatus(true); mPending3Asettings |= SetFocus; } } @@ -230,7 +220,6 @@ status_t OMXCameraAdapter::doAutoFocus() status_t OMXCameraAdapter::stopAutoFocus() { - status_t ret = NO_ERROR; OMX_ERRORTYPE eError = OMX_ErrorNone; OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl; @@ -254,24 +243,29 @@ status_t OMXCameraAdapter::stopAutoFocus() return NO_ERROR; } - if ( NO_ERROR == ret ) + OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); + focusControl.eFocusControl = OMX_IMAGE_FocusControlOff; + + eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, + OMX_IndexConfigFocusControl, + &focusControl); + if ( OMX_ErrorNone != eError ) { - OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); - focusControl.eFocusControl = OMX_IMAGE_FocusControlOff; + CAMHAL_LOGEB("Error while stopping focus 0x%x", eError); + return ErrorUtils::omxToAndroidError(eError); + } else { + // This is a WA. Usually the OMX Camera component should + // generate AF status change OMX event fairly quickly + // ( after one preview frame ) and this notification should + // actually come from 'handleFocusCallback()'. + Mutex::Autolock lock(mDoAFMutex); + mDoAFCond.broadcast(); + } - eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, - OMX_IndexConfigFocusControl, - &focusControl); - if ( OMX_ErrorNone != eError ) - { - CAMHAL_LOGEB("Error while stopping focus 0x%x", eError); - return ErrorUtils::omxToAndroidError(eError); - } - } LOG_FUNCTION_NAME_EXIT; - return ret; + return NO_ERROR; } status_t OMXCameraAdapter::getFocusMode(OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE &focusMode) @@ -319,19 +313,12 @@ status_t OMXCameraAdapter::cancelAutoFocus() ( focusMode.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE ) OMX_IMAGE_FocusControlAutoInfinity ) ) { stopAutoFocus(); - //Signal a dummy AF event so that in case the callback from ducati - //does come then it doesnt crash after - //exiting this function since eventSem will go out of scope. - ret |= SignalEvent(mCameraAdapterParameters.mHandleComp, - (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, - OMX_ALL, - OMX_IndexConfigCommonFocusStatus, - NULL ); } else if (focusMode.eFocusControl == OMX_IMAGE_FocusControlAuto) { + // This re-enabling of CAF doesn't seem to + // be needed any more. // re-apply CAF after unlocking and canceling - mPending3Asettings |= SetFocus; + // mPending3Asettings |= SetFocus; } - // If the apps call #cancelAutoFocus()}, the face callbacks will also resume. pauseFaceDetection(false); @@ -401,7 +388,7 @@ status_t OMXCameraAdapter::returnFocusStatus(bool timeoutReached) { status_t ret = NO_ERROR; OMX_PARAM_FOCUSSTATUSTYPE eFocusStatus; - bool focusStatus = false; + CameraHalEvent::FocusStatus focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; BaseCameraAdapter::AdapterState state, nextState; BaseCameraAdapter::getState(state); BaseCameraAdapter::getNextState(nextState); @@ -436,7 +423,7 @@ status_t OMXCameraAdapter::returnFocusStatus(bool timeoutReached) if ( timeoutReached ) { - focusStatus = false; + focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; } else { @@ -444,15 +431,16 @@ status_t OMXCameraAdapter::returnFocusStatus(bool timeoutReached) { case OMX_FocusStatusReached: { - focusStatus = true; + focusStatus = CameraHalEvent::FOCUS_STATUS_SUCCESS; break; } - case OMX_FocusStatusOff: + case OMX_FocusStatusOff: // AF got canceled + return NO_ERROR; case OMX_FocusStatusUnableToReach: case OMX_FocusStatusRequest: default: { - focusStatus = false; + focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; break; } } @@ -462,9 +450,9 @@ status_t OMXCameraAdapter::returnFocusStatus(bool timeoutReached) } else { CAMHAL_LOGDA("Focus locked. Applied focus locks successfully"); } - stopAutoFocus(); } + //Query current focus distance after AF is complete updateFocusDistances(mParameters); } @@ -520,7 +508,6 @@ status_t OMXCameraAdapter::checkFocus(OMX_PARAM_FOCUSSTATUSTYPE *eFocusStatus) if ( NO_ERROR == ret ) { OMX_INIT_STRUCT_PTR (eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); - eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, OMX_IndexConfigCommonFocusStatus, eFocusStatus); @@ -800,4 +787,54 @@ status_t OMXCameraAdapter::setTouchFocus() return ret; } +void OMXCameraAdapter::handleFocusCallback() { + OMX_PARAM_FOCUSSTATUSTYPE eFocusStatus; + CameraHalEvent::FocusStatus focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; + status_t ret = NO_ERROR; + BaseCameraAdapter::AdapterState nextState; + BaseCameraAdapter::getNextState(nextState); + + OMX_INIT_STRUCT(eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); + + ret = checkFocus(&eFocusStatus); + + if (NO_ERROR != ret) { + CAMHAL_LOGEA("Focus status check failed!"); + // signal and unblock doAutoFocus + if (AF_ACTIVE & nextState) { + Mutex::Autolock lock(mDoAFMutex); + mDoAFCond.broadcast(); + } + return; + } + + if ( ( eFocusStatus.eFocusStatus != OMX_FocusStatusRequest ) && + ( eFocusStatus.eFocusStatus != OMX_FocusStatusOff ) ) { + // signal doAutoFocus when a end of scan message comes + // ignore start of scan + Mutex::Autolock lock(mDoAFMutex); + mDoAFCond.broadcast(); + } + + if (mParameters3A.Focus != (OMX_IMAGE_FOCUSCONTROLTYPE) OMX_IMAGE_FocusControlAuto) { + CAMHAL_LOGDA("unregistered focus callback when not in CAF or doAutoFocus... not handling"); + return; + } + + // Handling for CAF Callbacks + switch (eFocusStatus.eFocusStatus) { + case OMX_FocusStatusRequest: + focusStatus = CameraHalEvent::FOCUS_STATUS_PENDING; + break; + case OMX_FocusStatusReached: + case OMX_FocusStatusOff: + case OMX_FocusStatusUnableToReach: + default: + focusStatus = CameraHalEvent::FOCUS_STATUS_DONE; + break; + } + + notifyFocusSubscribers(focusStatus); +} + }; diff --git a/camera/V4LCameraAdapter/V4LCameraAdapter.cpp b/camera/V4LCameraAdapter/V4LCameraAdapter.cpp index 3fb3380..c365023 100644 --- a/camera/V4LCameraAdapter/V4LCameraAdapter.cpp +++ b/camera/V4LCameraAdapter/V4LCameraAdapter.cpp @@ -438,7 +438,7 @@ static void debugShowFPS() mFps = ((mFrameCount - mLastFrameCount) * float(s2ns(1))) / diff; mLastFpsTime = now; mLastFrameCount = mFrameCount; - LOGD("Camera %d Frames, %f FPS", mFrameCount, mFps); + ALOGD("Camera %d Frames, %f FPS", mFrameCount, mFps); } // XXX: mFPS has the value we want } diff --git a/camera/inc/ANativeWindowDisplayAdapter.h b/camera/inc/ANativeWindowDisplayAdapter.h index e4698d0..9cdf45a 100644 --- a/camera/inc/ANativeWindowDisplayAdapter.h +++ b/camera/inc/ANativeWindowDisplayAdapter.h @@ -1,189 +1,188 @@ -/*
- * Copyright (C) Texas Instruments - http://www.ti.com/
- *
- * 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 "CameraHal.h"
-#include <ui/egl/android_natives.h>
-#include <ui/GraphicBufferMapper.h>
-#include <hal_public.h>
-
-//temporarily define format here
-#define HAL_PIXEL_FORMAT_TI_NV12 0x100
-
-namespace android {
-
-/**
- * Display handler class - This class basically handles the buffer posting to display
- */
-
-class ANativeWindowDisplayAdapter : public DisplayAdapter
-{
-public:
-
- typedef struct
- {
- void *mBuffer;
- void *mUser;
- int mOffset;
- int mWidth;
- int mHeight;
- int mWidthStride;
- int mHeightStride;
- int mLength;
- CameraFrame::FrameType mType;
- } DisplayFrame;
-
- enum DisplayStates
- {
- DISPLAY_INIT = 0,
- DISPLAY_STARTED,
- DISPLAY_STOPPED,
- DISPLAY_EXITED
- };
-
-public:
-
- ANativeWindowDisplayAdapter();
- virtual ~ANativeWindowDisplayAdapter();
-
- ///Initializes the display adapter creates any resources required
- virtual status_t initialize();
-
- virtual int setPreviewWindow(struct preview_stream_ops *window);
- virtual int setFrameProvider(FrameNotifier *frameProvider);
- virtual int setErrorHandler(ErrorNotifier *errorNotifier);
- virtual int enableDisplay(int width, int height, struct timeval *refTime = NULL, S3DParameters *s3dParams = NULL);
- virtual int disableDisplay(bool cancel_buffer = true);
- virtual status_t pauseDisplay(bool pause);
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
-
- //Used for shot to snapshot measurement
- virtual status_t setSnapshotTimeRef(struct timeval *refTime = NULL);
-
-#endif
-
- virtual int useBuffers(void* bufArr, int num);
- virtual bool supportsExternalBuffering();
-
- //Implementation of inherited interfaces
- virtual void* allocateBuffer(int width, int height, const char* format, int &bytes, int numBufs);
- virtual uint32_t * getOffsets() ;
- virtual int getFd() ;
- virtual int freeBuffer(void* buf);
-
- virtual int maxQueueableBuffers(unsigned int& queueable);
-
- ///Class specific functions
- static void frameCallbackRelay(CameraFrame* caFrame);
- void frameCallback(CameraFrame* caFrame);
-
- void displayThread();
-
- private:
- void destroy();
- bool processHalMsg();
- status_t PostFrame(ANativeWindowDisplayAdapter::DisplayFrame &dispFrame);
- bool handleFrameReturn();
- status_t returnBuffersToWindow();
-
-public:
-
- static const int DISPLAY_TIMEOUT;
- static const int FAILED_DQS_TO_SUSPEND;
-
- class DisplayThread : public Thread
- {
- ANativeWindowDisplayAdapter* mDisplayAdapter;
- TIUTILS::MessageQueue mDisplayThreadQ;
-
- public:
- DisplayThread(ANativeWindowDisplayAdapter* da)
- : Thread(false), mDisplayAdapter(da) { }
-
- ///Returns a reference to the display message Q for display adapter to post messages
- TIUTILS::MessageQueue& msgQ()
- {
- return mDisplayThreadQ;
- }
-
- virtual bool threadLoop()
- {
- mDisplayAdapter->displayThread();
- return false;
- }
-
- enum DisplayThreadCommands
- {
- DISPLAY_START,
- DISPLAY_STOP,
- DISPLAY_FRAME,
- DISPLAY_EXIT
- };
- };
-
- //friend declarations
-friend class DisplayThread;
-
-private:
- int postBuffer(void* displayBuf);
-
-private:
- bool mFirstInit;
- bool mSuspend;
- int mFailedDQs;
- bool mPaused; //Pause state
- preview_stream_ops_t* mANativeWindow;
- sp<DisplayThread> mDisplayThread;
- FrameProvider *mFrameProvider; ///Pointer to the frame provider interface
- TIUTILS::MessageQueue mDisplayQ;
- unsigned int mDisplayState;
- ///@todo Have a common class for these members
- mutable Mutex mLock;
- bool mDisplayEnabled;
- int mBufferCount;
- buffer_handle_t** mBufferHandleMap;
- IMG_native_handle_t** mGrallocHandleMap;
- uint32_t* mOffsetsMap;
- int mFD;
- KeyedVector<int, int> mFramesWithCameraAdapterMap;
- sp<ErrorNotifier> mErrorNotifier;
-
- uint32_t mFrameWidth;
- uint32_t mFrameHeight;
- uint32_t mPreviewWidth;
- uint32_t mPreviewHeight;
-
- uint32_t mXOff;
- uint32_t mYOff;
-
- const char *mPixelFormat;
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
- //Used for calculating standby to first shot
- struct timeval mStandbyToShot;
- bool mMeasureStandby;
- //Used for shot to snapshot/shot calculation
- struct timeval mStartCapture;
- bool mShotToShot;
-
-#endif
-
-};
-
-};
-
+/* + * Copyright (C) Texas Instruments - http://www.ti.com/ + * + * 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 "CameraHal.h" +#include <ui/GraphicBufferMapper.h> +#include <hal_public.h> + +//temporarily define format here +#define HAL_PIXEL_FORMAT_TI_NV12 0x100 + +namespace android { + +/** + * Display handler class - This class basically handles the buffer posting to display + */ + +class ANativeWindowDisplayAdapter : public DisplayAdapter +{ +public: + + typedef struct + { + void *mBuffer; + void *mUser; + int mOffset; + int mWidth; + int mHeight; + int mWidthStride; + int mHeightStride; + int mLength; + CameraFrame::FrameType mType; + } DisplayFrame; + + enum DisplayStates + { + DISPLAY_INIT = 0, + DISPLAY_STARTED, + DISPLAY_STOPPED, + DISPLAY_EXITED + }; + +public: + + ANativeWindowDisplayAdapter(); + virtual ~ANativeWindowDisplayAdapter(); + + ///Initializes the display adapter creates any resources required + virtual status_t initialize(); + + virtual int setPreviewWindow(struct preview_stream_ops *window); + virtual int setFrameProvider(FrameNotifier *frameProvider); + virtual int setErrorHandler(ErrorNotifier *errorNotifier); + virtual int enableDisplay(int width, int height, struct timeval *refTime = NULL, S3DParameters *s3dParams = NULL); + virtual int disableDisplay(bool cancel_buffer = true); + virtual status_t pauseDisplay(bool pause); + +#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS + + //Used for shot to snapshot measurement + virtual status_t setSnapshotTimeRef(struct timeval *refTime = NULL); + +#endif + + virtual int useBuffers(void* bufArr, int num); + virtual bool supportsExternalBuffering(); + + //Implementation of inherited interfaces + virtual void* allocateBuffer(int width, int height, const char* format, int &bytes, int numBufs); + virtual uint32_t * getOffsets() ; + virtual int getFd() ; + virtual int freeBuffer(void* buf); + + virtual int maxQueueableBuffers(unsigned int& queueable); + + ///Class specific functions + static void frameCallbackRelay(CameraFrame* caFrame); + void frameCallback(CameraFrame* caFrame); + + void displayThread(); + + private: + void destroy(); + bool processHalMsg(); + status_t PostFrame(ANativeWindowDisplayAdapter::DisplayFrame &dispFrame); + bool handleFrameReturn(); + status_t returnBuffersToWindow(); + +public: + + static const int DISPLAY_TIMEOUT; + static const int FAILED_DQS_TO_SUSPEND; + + class DisplayThread : public Thread + { + ANativeWindowDisplayAdapter* mDisplayAdapter; + TIUTILS::MessageQueue mDisplayThreadQ; + + public: + DisplayThread(ANativeWindowDisplayAdapter* da) + : Thread(false), mDisplayAdapter(da) { } + + ///Returns a reference to the display message Q for display adapter to post messages + TIUTILS::MessageQueue& msgQ() + { + return mDisplayThreadQ; + } + + virtual bool threadLoop() + { + mDisplayAdapter->displayThread(); + return false; + } + + enum DisplayThreadCommands + { + DISPLAY_START, + DISPLAY_STOP, + DISPLAY_FRAME, + DISPLAY_EXIT + }; + }; + + //friend declarations +friend class DisplayThread; + +private: + int postBuffer(void* displayBuf); + +private: + bool mFirstInit; + bool mSuspend; + int mFailedDQs; + bool mPaused; //Pause state + preview_stream_ops_t* mANativeWindow; + sp<DisplayThread> mDisplayThread; + FrameProvider *mFrameProvider; ///Pointer to the frame provider interface + TIUTILS::MessageQueue mDisplayQ; + unsigned int mDisplayState; + ///@todo Have a common class for these members + mutable Mutex mLock; + bool mDisplayEnabled; + int mBufferCount; + buffer_handle_t** mBufferHandleMap; + IMG_native_handle_t** mGrallocHandleMap; + uint32_t* mOffsetsMap; + int mFD; + KeyedVector<int, int> mFramesWithCameraAdapterMap; + sp<ErrorNotifier> mErrorNotifier; + + uint32_t mFrameWidth; + uint32_t mFrameHeight; + uint32_t mPreviewWidth; + uint32_t mPreviewHeight; + + uint32_t mXOff; + uint32_t mYOff; + + const char *mPixelFormat; + +#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS + //Used for calculating standby to first shot + struct timeval mStandbyToShot; + bool mMeasureStandby; + //Used for shot to snapshot/shot calculation + struct timeval mStartCapture; + bool mShotToShot; + +#endif + +}; + +}; + diff --git a/camera/inc/BaseCameraAdapter.h b/camera/inc/BaseCameraAdapter.h index d778491..bc38e00 100644 --- a/camera/inc/BaseCameraAdapter.h +++ b/camera/inc/BaseCameraAdapter.h @@ -145,7 +145,7 @@ protected: // ---------------------Interface ends----------------------------------- - status_t notifyFocusSubscribers(bool status); + status_t notifyFocusSubscribers(CameraHalEvent::FocusStatus status); status_t notifyShutterSubscribers(); status_t notifyZoomSubscribers(int zoomIdx, bool targetReached); status_t notifyFaceSubscribers(sp<CameraFDResult> &faces); diff --git a/camera/inc/CameraHal.h b/camera/inc/CameraHal.h index e34f4df..8b8392a 100644 --- a/camera/inc/CameraHal.h +++ b/camera/inc/CameraHal.h @@ -77,7 +77,7 @@ #define LOCK_BUFFER_TRIES 5 #define HAL_PIXEL_FORMAT_NV12 0x100 -#define CAMHAL_LOGI LOGI +#define CAMHAL_LOGI ALOGI //Uncomment to enable more verbose/debug logs //#define DEBUG_LOG @@ -90,8 +90,8 @@ #define CAMHAL_LOGVA(str) #define CAMHAL_LOGVB(str, ...) -#define CAMHAL_LOGEA LOGE -#define CAMHAL_LOGEB LOGE +#define CAMHAL_LOGEA ALOGE +#define CAMHAL_LOGEB ALOGE #undef LOG_FUNCTION_NAME #undef LOG_FUNCTION_NAME_EXIT @@ -331,6 +331,13 @@ public: ALL_EVENTS = 0xFFFF ///Maximum of 16 event types supported }; + enum FocusStatus { + FOCUS_STATUS_SUCCESS = 0x1, + FOCUS_STATUS_FAIL = 0x2, + FOCUS_STATUS_PENDING = 0x4, + FOCUS_STATUS_DONE = 0x8, + }; + ///Class declarations ///@remarks Add a new class for a new event type added above @@ -341,8 +348,7 @@ public: ///Focus event specific data typedef struct FocusEventData_t { - bool focusLocked; - bool focusError; + FocusStatus focusStatus; int currentFocusValue; } FocusEventData; @@ -678,7 +684,7 @@ private: class MemoryManager : public BufferProvider, public virtual RefBase { public: - MemoryManager():mIonFd(0){ } + MemoryManager():mIonFd(-1){ } ///Initializes the memory manager creates any resources required status_t initialize() { return NO_ERROR; } diff --git a/camera/inc/CameraProperties.h b/camera/inc/CameraProperties.h index a220af7..6f05877 100644 --- a/camera/inc/CameraProperties.h +++ b/camera/inc/CameraProperties.h @@ -1,198 +1,198 @@ -/*
- * Copyright (C) Texas Instruments - http://www.ti.com/
- *
- * 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 CAMERA_PROPERTIES_H
-#define CAMERA_PROPERTIES_H
-
-#include <utils/KeyedVector.h>
-#include <utils/String8.h>
-#include <stdio.h>
-#include <dirent.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include "cutils/properties.h"
-
-namespace android {
-
-#define MAX_CAMERAS_SUPPORTED 2
-#define MAX_SIMUL_CAMERAS_SUPPORTED 1
-#define MAX_PROP_NAME_LENGTH 50
-#define MAX_PROP_VALUE_LENGTH 2048
-
-#define EXIF_MAKE_DEFAULT "default_make"
-#define EXIF_MODEL_DEFAULT "default_model"
-
-// Class that handles the Camera Properties
-class CameraProperties
-{
-public:
- static const char INVALID[];
- static const char CAMERA_NAME[];
- static const char CAMERA_SENSOR_INDEX[];
- static const char ORIENTATION_INDEX[];
- static const char FACING_INDEX[];
- static const char S3D_SUPPORTED[];
- static const char SUPPORTED_PREVIEW_SIZES[];
- static const char SUPPORTED_PREVIEW_FORMATS[];
- static const char SUPPORTED_PREVIEW_FRAME_RATES[];
- static const char SUPPORTED_PICTURE_SIZES[];
- static const char SUPPORTED_PICTURE_FORMATS[];
- static const char SUPPORTED_THUMBNAIL_SIZES[];
- static const char SUPPORTED_WHITE_BALANCE[];
- static const char SUPPORTED_EFFECTS[];
- static const char SUPPORTED_ANTIBANDING[];
- static const char SUPPORTED_EXPOSURE_MODES[];
- static const char SUPPORTED_EV_MIN[];
- static const char SUPPORTED_EV_MAX[];
- static const char SUPPORTED_EV_STEP[];
- static const char SUPPORTED_ISO_VALUES[];
- static const char SUPPORTED_SCENE_MODES[];
- static const char SUPPORTED_FLASH_MODES[];
- static const char SUPPORTED_FOCUS_MODES[];
- static const char REQUIRED_PREVIEW_BUFS[];
- static const char REQUIRED_IMAGE_BUFS[];
- static const char SUPPORTED_ZOOM_RATIOS[];
- static const char SUPPORTED_ZOOM_STAGES[];
- static const char SUPPORTED_IPP_MODES[];
- static const char SMOOTH_ZOOM_SUPPORTED[];
- static const char ZOOM_SUPPORTED[];
- static const char PREVIEW_SIZE[];
- static const char PREVIEW_FORMAT[];
- static const char PREVIEW_FRAME_RATE[];
- static const char ZOOM[];
- static const char PICTURE_SIZE[];
- static const char PICTURE_FORMAT[];
- static const char JPEG_THUMBNAIL_SIZE[];
- static const char WHITEBALANCE[];
- static const char EFFECT[];
- static const char ANTIBANDING[];
- static const char EXPOSURE_MODE[];
- static const char EV_COMPENSATION[];
- static const char ISO_MODE[];
- static const char FOCUS_MODE[];
- static const char SCENE_MODE[];
- static const char FLASH_MODE[];
- static const char JPEG_QUALITY[];
- static const char BRIGHTNESS[];
- static const char SATURATION[];
- static const char SHARPNESS[];
- static const char CONTRAST[];
- static const char IPP[];
- static const char GBCE[];
- static const char AUTOCONVERGENCE[];
- static const char AUTOCONVERGENCE_MODE[];
- static const char MANUALCONVERGENCE_VALUES[];
- static const char SENSOR_ORIENTATION[];
- static const char SENSOR_ORIENTATION_VALUES[];
- static const char REVISION[];
- static const char FOCAL_LENGTH[];
- static const char HOR_ANGLE[];
- static const char VER_ANGLE[];
- static const char EXIF_MAKE[];
- static const char EXIF_MODEL[];
- static const char JPEG_THUMBNAIL_QUALITY[];
- static const char MAX_FOCUS_AREAS[];
- static const char MAX_FD_HW_FACES[];
- static const char MAX_FD_SW_FACES[];
-
- static const char PARAMS_DELIMITER [];
-
- static const char S3D2D_PREVIEW[];
- static const char S3D2D_PREVIEW_MODES[];
- static const char VSTAB[];
- static const char VSTAB_SUPPORTED[];
- static const char FRAMERATE_RANGE[];
- static const char FRAMERATE_RANGE_IMAGE[];
- static const char FRAMERATE_RANGE_VIDEO[];
- static const char FRAMERATE_RANGE_SUPPORTED[];
-
- static const char DEFAULT_VALUE[];
-
- static const char AUTO_EXPOSURE_LOCK[];
- static const char AUTO_EXPOSURE_LOCK_SUPPORTED[];
- static const char AUTO_WHITEBALANCE_LOCK[];
- static const char AUTO_WHITEBALANCE_LOCK_SUPPORTED[];
- static const char MAX_NUM_METERING_AREAS[];
- static const char METERING_AREAS[];
- static const char MAX_NUM_FOCUS_AREAS[];
-
- static const char VIDEO_SNAPSHOT_SUPPORTED[];
-
- static const char VIDEO_SIZE[];
- static const char SUPPORTED_VIDEO_SIZES[];
- static const char PREFERRED_PREVIEW_SIZE_FOR_VIDEO[];
-
- CameraProperties();
- ~CameraProperties();
-
- // container class passed around for accessing properties
- class Properties
- {
- public:
- Properties()
- {
- mProperties = new DefaultKeyedVector<String8, String8>(String8(DEFAULT_VALUE));
- char property[PROPERTY_VALUE_MAX];
- property_get("ro.product.manufacturer", property, EXIF_MAKE_DEFAULT);
- property[0] = toupper(property[0]);
- set(EXIF_MAKE, property);
- property_get("ro.product.model", property, EXIF_MODEL_DEFAULT);
- property[0] = toupper(property[0]);
- set(EXIF_MODEL, property);
- }
- ~Properties()
- {
- delete mProperties;
- }
- ssize_t set(const char *prop, const char *value);
- ssize_t set(const char *prop, int value);
- const char* get(const char * prop);
- void dump();
-
- protected:
- const char* keyAt(unsigned int);
- const char* valueAt(unsigned int);
-
- private:
- DefaultKeyedVector<String8, String8>* mProperties;
-
- };
-
- ///Initializes the CameraProperties class
- status_t initialize();
- status_t loadProperties();
- int camerasSupported();
- int getProperties(int cameraIndex, Properties** properties);
-
-private:
-
- uint32_t mCamerasSupported;
- int mInitialized;
- mutable Mutex mLock;
-
- Properties mCameraProps[MAX_CAMERAS_SUPPORTED];
-
-};
-
-};
-
-#endif //CAMERA_PROPERTIES_H
-
+/* + * Copyright (C) Texas Instruments - http://www.ti.com/ + * + * 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 CAMERA_PROPERTIES_H +#define CAMERA_PROPERTIES_H + +#include <utils/KeyedVector.h> +#include <utils/String8.h> +#include <stdio.h> +#include <dirent.h> +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include "cutils/properties.h" + +namespace android { + +#define MAX_CAMERAS_SUPPORTED 2 +#define MAX_SIMUL_CAMERAS_SUPPORTED 1 +#define MAX_PROP_NAME_LENGTH 50 +#define MAX_PROP_VALUE_LENGTH 2048 + +#define EXIF_MAKE_DEFAULT "default_make" +#define EXIF_MODEL_DEFAULT "default_model" + +// Class that handles the Camera Properties +class CameraProperties +{ +public: + static const char INVALID[]; + static const char CAMERA_NAME[]; + static const char CAMERA_SENSOR_INDEX[]; + static const char ORIENTATION_INDEX[]; + static const char FACING_INDEX[]; + static const char S3D_SUPPORTED[]; + static const char SUPPORTED_PREVIEW_SIZES[]; + static const char SUPPORTED_PREVIEW_FORMATS[]; + static const char SUPPORTED_PREVIEW_FRAME_RATES[]; + static const char SUPPORTED_PICTURE_SIZES[]; + static const char SUPPORTED_PICTURE_FORMATS[]; + static const char SUPPORTED_THUMBNAIL_SIZES[]; + static const char SUPPORTED_WHITE_BALANCE[]; + static const char SUPPORTED_EFFECTS[]; + static const char SUPPORTED_ANTIBANDING[]; + static const char SUPPORTED_EXPOSURE_MODES[]; + static const char SUPPORTED_EV_MIN[]; + static const char SUPPORTED_EV_MAX[]; + static const char SUPPORTED_EV_STEP[]; + static const char SUPPORTED_ISO_VALUES[]; + static const char SUPPORTED_SCENE_MODES[]; + static const char SUPPORTED_FLASH_MODES[]; + static const char SUPPORTED_FOCUS_MODES[]; + static const char REQUIRED_PREVIEW_BUFS[]; + static const char REQUIRED_IMAGE_BUFS[]; + static const char SUPPORTED_ZOOM_RATIOS[]; + static const char SUPPORTED_ZOOM_STAGES[]; + static const char SUPPORTED_IPP_MODES[]; + static const char SMOOTH_ZOOM_SUPPORTED[]; + static const char ZOOM_SUPPORTED[]; + static const char PREVIEW_SIZE[]; + static const char PREVIEW_FORMAT[]; + static const char PREVIEW_FRAME_RATE[]; + static const char ZOOM[]; + static const char PICTURE_SIZE[]; + static const char PICTURE_FORMAT[]; + static const char JPEG_THUMBNAIL_SIZE[]; + static const char WHITEBALANCE[]; + static const char EFFECT[]; + static const char ANTIBANDING[]; + static const char EXPOSURE_MODE[]; + static const char EV_COMPENSATION[]; + static const char ISO_MODE[]; + static const char FOCUS_MODE[]; + static const char SCENE_MODE[]; + static const char FLASH_MODE[]; + static const char JPEG_QUALITY[]; + static const char BRIGHTNESS[]; + static const char SATURATION[]; + static const char SHARPNESS[]; + static const char CONTRAST[]; + static const char IPP[]; + static const char GBCE[]; + static const char AUTOCONVERGENCE[]; + static const char AUTOCONVERGENCE_MODE[]; + static const char MANUALCONVERGENCE_VALUES[]; + static const char SENSOR_ORIENTATION[]; + static const char SENSOR_ORIENTATION_VALUES[]; + static const char REVISION[]; + static const char FOCAL_LENGTH[]; + static const char HOR_ANGLE[]; + static const char VER_ANGLE[]; + static const char EXIF_MAKE[]; + static const char EXIF_MODEL[]; + static const char JPEG_THUMBNAIL_QUALITY[]; + static const char MAX_FOCUS_AREAS[]; + static const char MAX_FD_HW_FACES[]; + static const char MAX_FD_SW_FACES[]; + + static const char PARAMS_DELIMITER []; + + static const char S3D2D_PREVIEW[]; + static const char S3D2D_PREVIEW_MODES[]; + static const char VSTAB[]; + static const char VSTAB_SUPPORTED[]; + static const char FRAMERATE_RANGE[]; + static const char FRAMERATE_RANGE_IMAGE[]; + static const char FRAMERATE_RANGE_VIDEO[]; + static const char FRAMERATE_RANGE_SUPPORTED[]; + + static const char DEFAULT_VALUE[]; + + static const char AUTO_EXPOSURE_LOCK[]; + static const char AUTO_EXPOSURE_LOCK_SUPPORTED[]; + static const char AUTO_WHITEBALANCE_LOCK[]; + static const char AUTO_WHITEBALANCE_LOCK_SUPPORTED[]; + static const char MAX_NUM_METERING_AREAS[]; + static const char METERING_AREAS[]; + static const char MAX_NUM_FOCUS_AREAS[]; + + static const char VIDEO_SNAPSHOT_SUPPORTED[]; + + static const char VIDEO_SIZE[]; + static const char SUPPORTED_VIDEO_SIZES[]; + static const char PREFERRED_PREVIEW_SIZE_FOR_VIDEO[]; + + CameraProperties(); + ~CameraProperties(); + + // container class passed around for accessing properties + class Properties + { + public: + Properties() + { + mProperties = new DefaultKeyedVector<String8, String8>(String8(DEFAULT_VALUE)); + char property[PROPERTY_VALUE_MAX]; + property_get("ro.product.manufacturer", property, EXIF_MAKE_DEFAULT); + property[0] = toupper(property[0]); + set(EXIF_MAKE, property); + property_get("ro.product.model", property, EXIF_MODEL_DEFAULT); + property[0] = toupper(property[0]); + set(EXIF_MODEL, property); + } + ~Properties() + { + delete mProperties; + } + ssize_t set(const char *prop, const char *value); + ssize_t set(const char *prop, int value); + const char* get(const char * prop); + void dump(); + + protected: + const char* keyAt(unsigned int); + const char* valueAt(unsigned int); + + private: + DefaultKeyedVector<String8, String8>* mProperties; + + }; + + ///Initializes the CameraProperties class + status_t initialize(); + status_t loadProperties(); + int camerasSupported(); + int getProperties(int cameraIndex, Properties** properties); + +private: + + uint32_t mCamerasSupported; + int mInitialized; + mutable Mutex mLock; + + Properties mCameraProps[MAX_CAMERAS_SUPPORTED]; + +}; + +}; + +#endif //CAMERA_PROPERTIES_H + diff --git a/camera/inc/Encoder_libjpeg.h b/camera/inc/Encoder_libjpeg.h index fef873f..727dd92 100755..100644 --- a/camera/inc/Encoder_libjpeg.h +++ b/camera/inc/Encoder_libjpeg.h @@ -30,6 +30,9 @@ extern "C" { #include "jhead.h" } + +#define CANCEL_TIMEOUT 3000000 // 3 seconds + namespace android { /** * libjpeg encoder class - uses libjpeg to encode yuv @@ -41,8 +44,10 @@ typedef void (*encoder_libjpeg_callback_t) (void* main_jpeg, CameraFrame::FrameType type, void* cookie1, void* cookie2, - void* cookie3); + void* cookie3, + bool canceled); +// these have to match strings defined in external/jhead/exif.c static const char TAG_MODEL[] = "Model"; static const char TAG_MAKE[] = "Make"; static const char TAG_FOCALLENGTH[] = "FocalLength"; @@ -61,12 +66,27 @@ static const char TAG_GPS_VERSION_ID[] = "GPSVersionID"; static const char TAG_GPS_TIMESTAMP[] = "GPSTimeStamp"; static const char TAG_GPS_DATESTAMP[] = "GPSDateStamp"; static const char TAG_ORIENTATION[] = "Orientation"; +static const char TAG_FLASH[] = "Flash"; +static const char TAG_DIGITALZOOMRATIO[] = "DigitalZoomRatio"; +static const char TAG_EXPOSURETIME[] = "ExposureTime"; +static const char TAG_APERTURE[] = "ApertureValue"; +static const char TAG_ISO_EQUIVALENT[] = "ISOSpeedRatings"; +static const char TAG_WHITEBALANCE[] = "WhiteBalance"; +static const char TAG_LIGHT_SOURCE[] = "LightSource"; +static const char TAG_METERING_MODE[] = "MeteringMode"; +static const char TAG_EXPOSURE_PROGRAM[] = "ExposureProgram"; +static const char TAG_COLOR_SPACE[] = "ColorSpace"; +static const char TAG_CPRS_BITS_PER_PIXEL[] = "CompressedBitsPerPixel"; +static const char TAG_FNUMBER[] = "FNumber"; +static const char TAG_SHUTTERSPEED[] = "ShutterSpeedValue"; +static const char TAG_SENSING_METHOD[] = "SensingMethod"; +static const char TAG_CUSTOM_RENDERED[] = "CustomRendered"; class ExifElementsTable { public: ExifElementsTable() : gps_tag_count(0), exif_tag_count(0), position(0), - jpeg_opened(false) { } + jpeg_opened(false), has_datetime_tag(false) { } ~ExifElementsTable(); status_t insertElement(const char* tag, const char* value); @@ -82,6 +102,7 @@ class ExifElementsTable { unsigned int exif_tag_count; unsigned int position; bool jpeg_opened; + bool has_datetime_tag; }; class Encoder_libjpeg : public Thread { @@ -115,6 +136,7 @@ class Encoder_libjpeg : public Thread { mCancelEncoding(false), mCookie1(cookie1), mCookie2(cookie2), mCookie3(cookie3), mType(type), mThumb(NULL) { this->incStrong(this); + mCancelSem.Create(0); } ~Encoder_libjpeg() { @@ -133,6 +155,9 @@ class Encoder_libjpeg : public Thread { // encode our main image size = encode(mMainInput); + // signal cancel semaphore incase somebody is waiting + mCancelSem.Signal(); + // check if it is main jpeg thread if(mThumb.get()) { // wait until tn jpeg thread exits. @@ -142,7 +167,7 @@ class Encoder_libjpeg : public Thread { } if(mCb) { - mCb(mMainInput, mThumbnailInput, mType, mCookie1, mCookie2, mCookie3); + mCb(mMainInput, mThumbnailInput, mType, mCookie1, mCookie2, mCookie3, mCancelEncoding); } // encoder thread runs, self-destructs, and then exits @@ -151,10 +176,17 @@ class Encoder_libjpeg : public Thread { } void cancel() { + mCancelEncoding = true; if (mThumb.get()) { mThumb->cancel(); + mCancelSem.WaitTimeout(CANCEL_TIMEOUT); } - mCancelEncoding = true; + } + + void getCookies(void **cookie1, void **cookie2, void **cookie3) { + if (cookie1) *cookie1 = mCookie1; + if (cookie2) *cookie2 = mCookie2; + if (cookie3) *cookie3 = mCookie3; } private: @@ -167,6 +199,7 @@ class Encoder_libjpeg : public Thread { void* mCookie3; CameraFrame::FrameType mType; sp<Encoder_libjpeg> mThumb; + Semaphore mCancelSem; size_t encode(params*); }; diff --git a/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h b/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h index 463032a..0fdc770 100644 --- a/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h +++ b/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h @@ -446,7 +446,8 @@ private: BaseCameraAdapter::AdapterState state); status_t convertGPSCoord(double coord, int °, int &min, int &sec, int &secDivisor); status_t setupEXIF(); - status_t setupEXIF_libjpeg(ExifElementsTable*); + status_t setupEXIF_libjpeg(ExifElementsTable*, OMX_TI_ANCILLARYDATATYPE*, + OMX_TI_WHITEBALANCERESULTTYPE*); //Focus functionality status_t doAutoFocus(); @@ -454,6 +455,7 @@ private: status_t checkFocus(OMX_PARAM_FOCUSSTATUSTYPE *eFocusStatus); status_t returnFocusStatus(bool timeoutReached); status_t getFocusMode(OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE &focusMode); + void handleFocusCallback(); //Focus distances @@ -634,12 +636,13 @@ private: status_t sendCallBacks(CameraFrame frame, OMX_IN OMX_BUFFERHEADERTYPE *pBuffHeader, unsigned int mask, OMXCameraPortParameters *port); status_t apply3Asettings( Gen3A_settings& Gen3A ); - status_t apply3ADefaults(Gen3A_settings &Gen3A); + status_t init3AParams(Gen3A_settings &Gen3A); // AutoConvergence status_t setAutoConvergence(OMX_TI_AUTOCONVERGENCEMODETYPE pACMode, OMX_S32 pManualConverence); status_t getAutoConvergence(OMX_TI_AUTOCONVERGENCEMODETYPE *pACMode, OMX_S32 *pManualConverence); + status_t setExtraData(bool enable, OMX_U32, OMX_EXT_EXTRADATATYPE); OMX_OTHER_EXTRADATATYPE *getExtradata(OMX_OTHER_EXTRADATATYPE *extraData, OMX_EXTRADATATYPE type); class CommandHandler : public Thread { @@ -668,7 +671,7 @@ private: COMMAND_EXIT = -1, CAMERA_START_IMAGE_CAPTURE = 0, CAMERA_PERFORM_AUTOFOCUS = 1, - CAMERA_SWITCH_TO_EXECUTING + CAMERA_SWITCH_TO_EXECUTING, }; private: @@ -706,6 +709,7 @@ public: enum { COMMAND_EXIT = -1, CAMERA_FILL_BUFFER_DONE, + CAMERA_FOCUS_STATUS, }; private: @@ -817,6 +821,7 @@ private: //Face detection status bool mFaceDetectionRunning; bool mFaceDetectionPaused; + bool mFDSwitchAlgoPriority; camera_face_t faceDetectionLastOutput [MAX_NUM_FACES_SUPPORTED]; int faceDetectionNumFacesLastOutput; @@ -873,6 +878,8 @@ private: int mSnapshotCount; bool mCaptureConfigured; unsigned int mPendingCaptureSettings; + OMX_TI_ANCILLARYDATATYPE* mCaptureAncillaryData; + OMX_TI_WHITEBALANCERESULTTYPE* mWhiteBalanceData; //Temporal bracketing management data mutable Mutex mBracketingLock; @@ -883,11 +890,11 @@ private: int mBracketingRange; CameraParameters mParameters; + bool mOmxInitialized; OMXCameraAdapterComponentContext mCameraAdapterParameters; bool mFirstTimeInit; ///Semaphores used internally - Semaphore mDoAFSem; Semaphore mInitSem; Semaphore mFlushSem; Semaphore mUsePreviewDataSem; @@ -926,6 +933,9 @@ private: Mutex mFrameCountMutex; Condition mFirstFrameCondition; + Mutex mDoAFMutex; + Condition mDoAFCond; + size_t mSensorIndex; CodingMode mCodingMode; diff --git a/camera/inc/TICameraParameters.h b/camera/inc/TICameraParameters.h index 633e5b6..4701cae 100644 --- a/camera/inc/TICameraParameters.h +++ b/camera/inc/TICameraParameters.h @@ -1,242 +1,242 @@ -/*
- * Copyright (C) Texas Instruments - http://www.ti.com/
- *
- * 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 TI_CAMERA_PARAMETERS_H
-#define TI_CAMERA_PARAMETERS_H
-
-#include <utils/KeyedVector.h>
-#include <utils/String8.h>
-
-namespace android {
-
-///TI Specific Camera Parameters
-class TICameraParameters
-{
-public:
-
-// Supported Camera indexes
-// Example value: "0,1,2,3", where 0-primary, 1-secondary1, 2-secondary2, 3-sterocamera
-static const char KEY_SUPPORTED_CAMERAS[];
-// Select logical Camera index
-static const char KEY_CAMERA[];
-static const char KEY_CAMERA_NAME[];
-static const char KEY_S3D_SUPPORTED[];
-static const char KEY_BURST[];
-static const char KEY_CAP_MODE[];
-static const char KEY_VNF[];
-static const char KEY_SATURATION[];
-static const char KEY_BRIGHTNESS[];
-static const char KEY_EXPOSURE_MODE[];
-static const char KEY_SUPPORTED_EXPOSURE[];
-static const char KEY_CONTRAST[];
-static const char KEY_SHARPNESS[];
-static const char KEY_ISO[];
-static const char KEY_SUPPORTED_ISO_VALUES[];
-static const char KEY_SUPPORTED_IPP[];
-static const char KEY_IPP[];
-static const char KEY_MAN_EXPOSURE[];
-static const char KEY_METERING_MODE[];
-static const char KEY_PADDED_WIDTH[];
-static const char KEY_PADDED_HEIGHT[];
-static const char KEY_EXP_BRACKETING_RANGE[];
-static const char KEY_TEMP_BRACKETING[];
-static const char KEY_TEMP_BRACKETING_RANGE_POS[];
-static const char KEY_TEMP_BRACKETING_RANGE_NEG[];
-static const char KEY_SHUTTER_ENABLE[];
-static const char KEY_MEASUREMENT_ENABLE[];
-static const char KEY_INITIAL_VALUES[];
-static const char KEY_GBCE[];
-static const char KEY_GLBCE[];
-static const char KEY_MINFRAMERATE[];
-static const char KEY_MAXFRAMERATE[];
-
-// TI recording hint to notify camera adapters of possible recording
-static const char KEY_RECORDING_HINT[];
-static const char KEY_AUTO_FOCUS_LOCK[];
-static const char KEY_CURRENT_ISO[];
-
-static const char KEY_SENSOR_ORIENTATION[];
-static const char KEY_SENSOR_ORIENTATION_VALUES[];
-
-//TI extensions for zoom
-static const char ZOOM_SUPPORTED[];
-static const char ZOOM_UNSUPPORTED[];
-
-//TI extensions for camera capabilies
-static const char INITIAL_VALUES_TRUE[];
-static const char INITIAL_VALUES_FALSE[];
-
-//TI extensions for enabling/disabling measurements
-static const char MEASUREMENT_ENABLE[];
-static const char MEASUREMENT_DISABLE[];
-
-// TI extensions to add values for ManualConvergence and AutoConvergence mode
-static const char KEY_AUTOCONVERGENCE[];
-static const char KEY_AUTOCONVERGENCE_MODE[];
-static const char KEY_MANUALCONVERGENCE_VALUES[];
-
-//TI extensions for enabling/disabling GLBCE
-static const char GLBCE_ENABLE[];
-static const char GLBCE_DISABLE[];
-
-//TI extensions for enabling/disabling GBCE
-static const char GBCE_ENABLE[];
-static const char GBCE_DISABLE[];
-
-// TI extensions to add Min frame rate Values
-static const char VIDEO_MINFRAMERATE_5[];
-static const char VIDEO_MINFRAMERATE_10[];
-static const char VIDEO_MINFRAMERATE_15[];
-static const char VIDEO_MINFRAMERATE_20[];
-static const char VIDEO_MINFRAMERATE_24[];
-static const char VIDEO_MINFRAMERATE_25[];
-static const char VIDEO_MINFRAMERATE_30[];
-static const char VIDEO_MINFRAMERATE_33[];
-
-// TI extensions for Manual Gain and Manual Exposure
-static const char KEY_MANUAL_EXPOSURE_LEFT[];
-static const char KEY_MANUAL_EXPOSURE_RIGHT[];
-static const char KEY_MANUAL_EXPOSURE_MODES[];
-static const char KEY_MANUAL_GAIN_EV_RIGHT[];
-static const char KEY_MANUAL_GAIN_EV_LEFT[];
-static const char KEY_MANUAL_GAIN_ISO_RIGHT[];
-static const char KEY_MANUAL_GAIN_ISO_LEFT[];
-static const char KEY_MANUAL_GAIN_MODES[];
-
-//TI extensions for setting EXIF tags
-static const char KEY_EXIF_MODEL[];
-static const char KEY_EXIF_MAKE[];
-
-//TI extensions for additional GPS data
-static const char KEY_GPS_MAPDATUM[];
-static const char KEY_GPS_VERSION[];
-static const char KEY_GPS_DATESTAMP[];
-
-//TI extensions for enabling/disabling shutter sound
-static const char SHUTTER_ENABLE[];
-static const char SHUTTER_DISABLE[];
-
-//TI extensions for Temporal bracketing
-static const char BRACKET_ENABLE[];
-static const char BRACKET_DISABLE[];
-
-//TI extensions to Image post-processing
-static const char IPP_LDCNSF[];
-static const char IPP_LDC[];
-static const char IPP_NSF[];
-static const char IPP_NONE[];
-
-//TI extensions to camera mode
-static const char HIGH_PERFORMANCE_MODE[];
-static const char HIGH_QUALITY_MODE[];
-static const char HIGH_QUALITY_ZSL_MODE[];
-static const char VIDEO_MODE[];
-
-
-// TI extensions to standard android pixel formats
-static const char PIXEL_FORMAT_RAW[];
-static const char PIXEL_FORMAT_JPS[];
-static const char PIXEL_FORMAT_MPO[];
-static const char PIXEL_FORMAT_RAW_JPEG[];
-static const char PIXEL_FORMAT_RAW_MPO[];
-
-// TI extensions to standard android scene mode settings
-static const char SCENE_MODE_SPORT[];
-static const char SCENE_MODE_CLOSEUP[];
-static const char SCENE_MODE_AQUA[];
-static const char SCENE_MODE_SNOWBEACH[];
-static const char SCENE_MODE_MOOD[];
-static const char SCENE_MODE_NIGHT_INDOOR[];
-static const char SCENE_MODE_DOCUMENT[];
-static const char SCENE_MODE_BARCODE[];
-static const char SCENE_MODE_VIDEO_SUPER_NIGHT[];
-static const char SCENE_MODE_VIDEO_CINE[];
-static const char SCENE_MODE_VIDEO_OLD_FILM[];
-
-// TI extensions to standard android white balance settings.
-static const char WHITE_BALANCE_TUNGSTEN[];
-static const char WHITE_BALANCE_HORIZON[];
-static const char WHITE_BALANCE_SUNSET[];
-static const char WHITE_BALANCE_FACE[];
-
-// TI extensions to add exposure preset modes to android api
-static const char EXPOSURE_MODE_OFF[];
-static const char EXPOSURE_MODE_AUTO[];
-static const char EXPOSURE_MODE_NIGHT[];
-static const char EXPOSURE_MODE_BACKLIGHT[];
-static const char EXPOSURE_MODE_SPOTLIGHT[];
-static const char EXPOSURE_MODE_SPORTS[];
-static const char EXPOSURE_MODE_SNOW[];
-static const char EXPOSURE_MODE_BEACH[];
-static const char EXPOSURE_MODE_APERTURE[];
-static const char EXPOSURE_MODE_SMALL_APERTURE[];
-static const char EXPOSURE_MODE_FACE[];
-
-// TI extensions to standard android focus presets.
-static const char FOCUS_MODE_PORTRAIT[];
-static const char FOCUS_MODE_EXTENDED[];
-static const char FOCUS_MODE_FACE[];
-
-// TI extensions to add iso values
-static const char ISO_MODE_AUTO[];
-static const char ISO_MODE_100[];
-static const char ISO_MODE_200[];
-static const char ISO_MODE_400[];
-static const char ISO_MODE_800[];
-static const char ISO_MODE_1000[];
-static const char ISO_MODE_1200[];
-static const char ISO_MODE_1600[];
-
-// TI extensions to add values for effect settings.
-static const char EFFECT_NATURAL[];
-static const char EFFECT_VIVID[];
-static const char EFFECT_COLOR_SWAP[];
-static const char EFFECT_BLACKWHITE[];
-
-static const char KEY_S3D2D_PREVIEW[];
-static const char KEY_S3D2D_PREVIEW_MODE[];
-
-// TI extensions to add values for AutoConvergence settings.
-static const char AUTOCONVERGENCE_MODE_DISABLE[];
-static const char AUTOCONVERGENCE_MODE_FRAME[];
-static const char AUTOCONVERGENCE_MODE_CENTER[];
-static const char AUTOCONVERGENCE_MODE_FFT[];
-static const char AUTOCONVERGENCE_MODE_MANUAL[];
-
-
-//TI extensions for flash mode settings
-static const char FLASH_MODE_FILL_IN[];
-
-//TI extensions to add sensor orientation parameters
-static const char ORIENTATION_SENSOR_NONE[];
-static const char ORIENTATION_SENSOR_90[];
-static const char ORIENTATION_SENSOR_180[];
-static const char ORIENTATION_SENSOR_270[];
-
-
-//TI values for camera direction
-static const char FACING_FRONT[];
-static const char FACING_BACK[];
-
-};
-
-};
-
-#endif
-
+/* + * Copyright (C) Texas Instruments - http://www.ti.com/ + * + * 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 TI_CAMERA_PARAMETERS_H +#define TI_CAMERA_PARAMETERS_H + +#include <utils/KeyedVector.h> +#include <utils/String8.h> + +namespace android { + +///TI Specific Camera Parameters +class TICameraParameters +{ +public: + +// Supported Camera indexes +// Example value: "0,1,2,3", where 0-primary, 1-secondary1, 2-secondary2, 3-sterocamera +static const char KEY_SUPPORTED_CAMERAS[]; +// Select logical Camera index +static const char KEY_CAMERA[]; +static const char KEY_CAMERA_NAME[]; +static const char KEY_S3D_SUPPORTED[]; +static const char KEY_BURST[]; +static const char KEY_CAP_MODE[]; +static const char KEY_VNF[]; +static const char KEY_SATURATION[]; +static const char KEY_BRIGHTNESS[]; +static const char KEY_EXPOSURE_MODE[]; +static const char KEY_SUPPORTED_EXPOSURE[]; +static const char KEY_CONTRAST[]; +static const char KEY_SHARPNESS[]; +static const char KEY_ISO[]; +static const char KEY_SUPPORTED_ISO_VALUES[]; +static const char KEY_SUPPORTED_IPP[]; +static const char KEY_IPP[]; +static const char KEY_MAN_EXPOSURE[]; +static const char KEY_METERING_MODE[]; +static const char KEY_PADDED_WIDTH[]; +static const char KEY_PADDED_HEIGHT[]; +static const char KEY_EXP_BRACKETING_RANGE[]; +static const char KEY_TEMP_BRACKETING[]; +static const char KEY_TEMP_BRACKETING_RANGE_POS[]; +static const char KEY_TEMP_BRACKETING_RANGE_NEG[]; +static const char KEY_SHUTTER_ENABLE[]; +static const char KEY_MEASUREMENT_ENABLE[]; +static const char KEY_INITIAL_VALUES[]; +static const char KEY_GBCE[]; +static const char KEY_GLBCE[]; +static const char KEY_MINFRAMERATE[]; +static const char KEY_MAXFRAMERATE[]; + +// TI recording hint to notify camera adapters of possible recording +static const char KEY_RECORDING_HINT[]; +static const char KEY_AUTO_FOCUS_LOCK[]; +static const char KEY_CURRENT_ISO[]; + +static const char KEY_SENSOR_ORIENTATION[]; +static const char KEY_SENSOR_ORIENTATION_VALUES[]; + +//TI extensions for zoom +static const char ZOOM_SUPPORTED[]; +static const char ZOOM_UNSUPPORTED[]; + +//TI extensions for camera capabilies +static const char INITIAL_VALUES_TRUE[]; +static const char INITIAL_VALUES_FALSE[]; + +//TI extensions for enabling/disabling measurements +static const char MEASUREMENT_ENABLE[]; +static const char MEASUREMENT_DISABLE[]; + +// TI extensions to add values for ManualConvergence and AutoConvergence mode +static const char KEY_AUTOCONVERGENCE[]; +static const char KEY_AUTOCONVERGENCE_MODE[]; +static const char KEY_MANUALCONVERGENCE_VALUES[]; + +//TI extensions for enabling/disabling GLBCE +static const char GLBCE_ENABLE[]; +static const char GLBCE_DISABLE[]; + +//TI extensions for enabling/disabling GBCE +static const char GBCE_ENABLE[]; +static const char GBCE_DISABLE[]; + +// TI extensions to add Min frame rate Values +static const char VIDEO_MINFRAMERATE_5[]; +static const char VIDEO_MINFRAMERATE_10[]; +static const char VIDEO_MINFRAMERATE_15[]; +static const char VIDEO_MINFRAMERATE_20[]; +static const char VIDEO_MINFRAMERATE_24[]; +static const char VIDEO_MINFRAMERATE_25[]; +static const char VIDEO_MINFRAMERATE_30[]; +static const char VIDEO_MINFRAMERATE_33[]; + +// TI extensions for Manual Gain and Manual Exposure +static const char KEY_MANUAL_EXPOSURE_LEFT[]; +static const char KEY_MANUAL_EXPOSURE_RIGHT[]; +static const char KEY_MANUAL_EXPOSURE_MODES[]; +static const char KEY_MANUAL_GAIN_EV_RIGHT[]; +static const char KEY_MANUAL_GAIN_EV_LEFT[]; +static const char KEY_MANUAL_GAIN_ISO_RIGHT[]; +static const char KEY_MANUAL_GAIN_ISO_LEFT[]; +static const char KEY_MANUAL_GAIN_MODES[]; + +//TI extensions for setting EXIF tags +static const char KEY_EXIF_MODEL[]; +static const char KEY_EXIF_MAKE[]; + +//TI extensions for additional GPS data +static const char KEY_GPS_MAPDATUM[]; +static const char KEY_GPS_VERSION[]; +static const char KEY_GPS_DATESTAMP[]; + +//TI extensions for enabling/disabling shutter sound +static const char SHUTTER_ENABLE[]; +static const char SHUTTER_DISABLE[]; + +//TI extensions for Temporal bracketing +static const char BRACKET_ENABLE[]; +static const char BRACKET_DISABLE[]; + +//TI extensions to Image post-processing +static const char IPP_LDCNSF[]; +static const char IPP_LDC[]; +static const char IPP_NSF[]; +static const char IPP_NONE[]; + +//TI extensions to camera mode +static const char HIGH_PERFORMANCE_MODE[]; +static const char HIGH_QUALITY_MODE[]; +static const char HIGH_QUALITY_ZSL_MODE[]; +static const char VIDEO_MODE[]; + + +// TI extensions to standard android pixel formats +static const char PIXEL_FORMAT_RAW[]; +static const char PIXEL_FORMAT_JPS[]; +static const char PIXEL_FORMAT_MPO[]; +static const char PIXEL_FORMAT_RAW_JPEG[]; +static const char PIXEL_FORMAT_RAW_MPO[]; + +// TI extensions to standard android scene mode settings +static const char SCENE_MODE_SPORT[]; +static const char SCENE_MODE_CLOSEUP[]; +static const char SCENE_MODE_AQUA[]; +static const char SCENE_MODE_SNOWBEACH[]; +static const char SCENE_MODE_MOOD[]; +static const char SCENE_MODE_NIGHT_INDOOR[]; +static const char SCENE_MODE_DOCUMENT[]; +static const char SCENE_MODE_BARCODE[]; +static const char SCENE_MODE_VIDEO_SUPER_NIGHT[]; +static const char SCENE_MODE_VIDEO_CINE[]; +static const char SCENE_MODE_VIDEO_OLD_FILM[]; + +// TI extensions to standard android white balance settings. +static const char WHITE_BALANCE_TUNGSTEN[]; +static const char WHITE_BALANCE_HORIZON[]; +static const char WHITE_BALANCE_SUNSET[]; +static const char WHITE_BALANCE_FACE[]; + +// TI extensions to add exposure preset modes to android api +static const char EXPOSURE_MODE_OFF[]; +static const char EXPOSURE_MODE_AUTO[]; +static const char EXPOSURE_MODE_NIGHT[]; +static const char EXPOSURE_MODE_BACKLIGHT[]; +static const char EXPOSURE_MODE_SPOTLIGHT[]; +static const char EXPOSURE_MODE_SPORTS[]; +static const char EXPOSURE_MODE_SNOW[]; +static const char EXPOSURE_MODE_BEACH[]; +static const char EXPOSURE_MODE_APERTURE[]; +static const char EXPOSURE_MODE_SMALL_APERTURE[]; +static const char EXPOSURE_MODE_FACE[]; + +// TI extensions to standard android focus presets. +static const char FOCUS_MODE_PORTRAIT[]; +static const char FOCUS_MODE_EXTENDED[]; +static const char FOCUS_MODE_FACE[]; + +// TI extensions to add iso values +static const char ISO_MODE_AUTO[]; +static const char ISO_MODE_100[]; +static const char ISO_MODE_200[]; +static const char ISO_MODE_400[]; +static const char ISO_MODE_800[]; +static const char ISO_MODE_1000[]; +static const char ISO_MODE_1200[]; +static const char ISO_MODE_1600[]; + +// TI extensions to add values for effect settings. +static const char EFFECT_NATURAL[]; +static const char EFFECT_VIVID[]; +static const char EFFECT_COLOR_SWAP[]; +static const char EFFECT_BLACKWHITE[]; + +static const char KEY_S3D2D_PREVIEW[]; +static const char KEY_S3D2D_PREVIEW_MODE[]; + +// TI extensions to add values for AutoConvergence settings. +static const char AUTOCONVERGENCE_MODE_DISABLE[]; +static const char AUTOCONVERGENCE_MODE_FRAME[]; +static const char AUTOCONVERGENCE_MODE_CENTER[]; +static const char AUTOCONVERGENCE_MODE_FFT[]; +static const char AUTOCONVERGENCE_MODE_MANUAL[]; + + +//TI extensions for flash mode settings +static const char FLASH_MODE_FILL_IN[]; + +//TI extensions to add sensor orientation parameters +static const char ORIENTATION_SENSOR_NONE[]; +static const char ORIENTATION_SENSOR_90[]; +static const char ORIENTATION_SENSOR_180[]; +static const char ORIENTATION_SENSOR_270[]; + + +//TI values for camera direction +static const char FACING_FRONT[]; +static const char FACING_BACK[]; + +}; + +}; + +#endif + diff --git a/domx/domx/omx_proxy_common/src/omx_proxy_common.c b/domx/domx/omx_proxy_common/src/omx_proxy_common.c index 3014bf1..60507c6 100644 --- a/domx/domx/omx_proxy_common/src/omx_proxy_common.c +++ b/domx/domx/omx_proxy_common/src/omx_proxy_common.c @@ -75,7 +75,7 @@ #ifdef USE_ION #include <unistd.h> -#include <ion.h> +#include <ion/ion.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/eventfd.h> diff --git a/domx/mm_osal/src/timm_osal_trace.c b/domx/mm_osal/src/timm_osal_trace.c index 874deb7..e9aae1b 100755 --- a/domx/mm_osal/src/timm_osal_trace.c +++ b/domx/mm_osal/src/timm_osal_trace.c @@ -109,12 +109,12 @@ void __TIMM_OSAL_TraceFunction(const __TIMM_OSAL_TRACE_LOCATION * loc, #ifdef _Android #if ( TIMM_OSAL_DEBUG_TRACE_DETAIL > 1 ) - LOGD("%s:%d\t%s()\t", simplify_path(loc->file), loc->line, + ALOGD("%s:%d\t%s()\t", simplify_path(loc->file), loc->line, loc->function); #endif char string[1000]; vsprintf(string, fmt, ap); - LOGD("%s",string); + ALOGD("%s",string); #else diff --git a/domx/omx_core/src/OMX_Core_Wrapper.c b/domx/omx_core/src/OMX_Core_Wrapper.c index d049ee0..8d61dd4 100755 --- a/domx/omx_core/src/OMX_Core_Wrapper.c +++ b/domx/omx_core/src/OMX_Core_Wrapper.c @@ -58,12 +58,12 @@ extern OMX_BOOL TIOMXConfigParser(OMX_PTR aInputParameters, OMX_BOOL TIOMXConfigParserRedirect(OMX_PTR aInputParameters, OMX_PTR aOutputParameters) { - LOGV("OMXConfigParserRedirect +\n"); + ALOGV("OMXConfigParserRedirect +\n"); OMX_BOOL Status = OMX_FALSE; Status = TIOMXConfigParser(aInputParameters, aOutputParameters); - LOGV("OMXConfigParserRedirect -\n"); + ALOGV("OMXConfigParserRedirect -\n"); return Status; } #endif @@ -92,14 +92,14 @@ OMX_ERRORTYPE TIComponentTable_FillBufferDone(OMX_OUT OMX_HANDLETYPE OMX_API OMX_ERRORTYPE TIOMX_Init(void) { - LOGV("TIOMX_Init\n"); + ALOGV("TIOMX_Init\n"); return OMX_Init(); } OMX_API OMX_ERRORTYPE TIOMX_Deinit(void) { - LOGV("TIOMX_Deinit\n"); + ALOGV("TIOMX_Deinit\n"); return OMX_Deinit(); } @@ -108,7 +108,7 @@ OMX_API OMX_ERRORTYPE TIOMX_ComponentNameEnum(OMX_OUT OMX_STRING cComponentName, OMX_IN OMX_U32 nNameLength, OMX_IN OMX_U32 nIndex) { - LOGV("TIOMX_ComponentNameEnum\n"); + ALOGV("TIOMX_ComponentNameEnum\n"); return OMX_ComponentNameEnum(cComponentName, nNameLength, nIndex); } @@ -118,14 +118,14 @@ OMX_API OMX_ERRORTYPE TIOMX_GetHandle(OMX_OUT OMX_HANDLETYPE * pHandle, OMX_IN OMX_PTR pAppData, OMX_IN OMX_CALLBACKTYPE * pCallBacks) { - LOGV("TIOMX_GetHandle\n"); + ALOGV("TIOMX_GetHandle\n"); return OMX_GetHandle(pHandle, cComponentName, pAppData, pCallBacks); } OMX_API OMX_ERRORTYPE TIOMX_FreeHandle(OMX_IN OMX_HANDLETYPE hComponent) { - LOGV("TIOMX_FreeHandle\n"); + ALOGV("TIOMX_FreeHandle\n"); return OMX_FreeHandle(hComponent); } @@ -134,7 +134,7 @@ OMX_API OMX_ERRORTYPE TIOMX_GetComponentsOfRole(OMX_IN OMX_STRING role, OMX_INOUT OMX_U32 * pNumComps, OMX_INOUT OMX_U8 ** compNames) { - LOGV("TIOMX_GetComponentsOfRole\n"); + ALOGV("TIOMX_GetComponentsOfRole\n"); return OMX_GetComponentsOfRole(role, pNumComps, compNames); } @@ -143,7 +143,7 @@ OMX_API OMX_ERRORTYPE TIOMX_GetRolesOfComponent(OMX_IN OMX_STRING compName, OMX_INOUT OMX_U32 * pNumRoles, OMX_OUT OMX_U8 ** roles) { - LOGV("TIOMX_GetRolesOfComponent\n"); + ALOGV("TIOMX_GetRolesOfComponent\n"); return OMX_GetRolesOfComponent(compName, pNumRoles, roles); } @@ -153,7 +153,7 @@ OMX_API OMX_ERRORTYPE TIOMX_SetupTunnel(OMX_IN OMX_HANDLETYPE hOutput, OMX_IN OMX_HANDLETYPE hInput, OMX_IN OMX_U32 nPortInput) { - LOGV("TIOMX_SetupTunnel\n"); + ALOGV("TIOMX_SetupTunnel\n"); return OMX_SetupTunnel(hOutput, nPortOutput, hInput, nPortInput); } @@ -162,7 +162,7 @@ OMX_API OMX_ERRORTYPE TIOMX_GetContentPipe(OMX_OUT OMX_HANDLETYPE * hPipe, OMX_IN OMX_STRING szURI) { - LOGV("TIOMX_GetContentPipe\n"); + ALOGV("TIOMX_GetContentPipe\n"); //return OMX_GetContentPipe( // hPipe, diff --git a/domx/omx_proxy_component/Android.mk b/domx/omx_proxy_component/Android.mk index 4ebd727..58eb424 100644 --- a/domx/omx_proxy_component/Android.mk +++ b/domx/omx_proxy_component/Android.mk @@ -70,7 +70,6 @@ LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/../omx_core/inc \ $(LOCAL_PATH)/../mm_osal/inc \ $(LOCAL_PATH)/../domx \ - $(HARDWARE_TI_OMAP4_BASE)/ion/ \ $(LOCAL_PATH)/../domx/omx_rpc/inc LOCAL_SHARED_LIBRARIES := \ @@ -105,6 +104,7 @@ LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/../../hwc \ $(HARDWARE_TI_OMAP4_BASE)/camera/inc \ frameworks/base/include/media/stagefright \ + frameworks/native/include/media/hardware LOCAL_SHARED_LIBRARIES := \ libmm_osal \ @@ -140,6 +140,7 @@ LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/../../hwc \ $(HARDWARE_TI_OMAP4_BASE)/camera/inc \ frameworks/base/include/media/stagefright \ + frameworks/native/include/media/hardware LOCAL_SHARED_LIBRARIES := \ libmm_osal \ diff --git a/domx/omx_proxy_component/omx_camera/src/omx_proxy_camera.c b/domx/omx_proxy_component/omx_camera/src/omx_proxy_camera.c index 729c190..50ac002 100755 --- a/domx/omx_proxy_component/omx_camera/src/omx_proxy_camera.c +++ b/domx/omx_proxy_component/omx_camera/src/omx_proxy_camera.c @@ -74,7 +74,7 @@ #ifdef USE_ION #include <unistd.h> -#include <ion.h> +#include <ion/ion.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/eventfd.h> @@ -22,7 +22,9 @@ #include <poll.h> #include <sys/ioctl.h> #include <linux/fb.h> +#include <linux/omapfb.h> #include <sys/mman.h> +#include <sys/resource.h> #include <cutils/properties.h> #include <cutils/log.h> @@ -30,15 +32,12 @@ #include <hardware/hardware.h> #include <hardware/hwcomposer.h> #include <EGL/egl.h> -#include <utils/Timers.h> #include <hardware_legacy/uevent.h> #include <png.h> -#define ASPECT_RATIO_TOLERANCE 0.02f +#include <system/graphics.h> -#ifndef FBIO_WAITFORVSYNC -#define FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32) -#endif +#define ASPECT_RATIO_TOLERANCE 0.02f #define min(a, b) ( { typeof(a) __a = (a), __b = (b); __a < __b ? __a : __b; } ) #define max(a, b) ( { typeof(a) __a = (a), __b = (b); __a > __b ? __a : __b; } ) @@ -47,6 +46,8 @@ #define WIDTH(rect) ((rect).right - (rect).left) #define HEIGHT(rect) ((rect).bottom - (rect).top) +#define DIV_ROUND_UP(a, b) (((a) + (b) - 1) / (b)) + #include <video/dsscomp.h> #include "hal_public.h" @@ -56,7 +57,7 @@ #define HAL_PIXEL_FORMAT_BGRX_8888 0x1FF #define HAL_PIXEL_FORMAT_TI_NV12 0x100 #define HAL_PIXEL_FORMAT_TI_NV12_PADDED 0x101 -#define MAX_TILER_SLOT (32 << 20) +#define MAX_TILER_SLOT (16 << 20) struct ext_transform_t { __u8 rotation : 3; /* 90-degree clockwise rotations */ @@ -137,17 +138,11 @@ struct omap4_hwc_device { int flags_rgb_order; int flags_nv12_only; - int on_tv; int force_sgx; omap4_hwc_ext_t ext; /* external mirroring data */ int idle; int ovls_blending; - float lcd_m[2][3]; /* internal transformation matrix */ - float lcd_hdmi_m[2][3]; /* internal transformation matrix */ - int lcd_rotation; - hwc_rect_t lcd_region; - /* composition data */ struct dsscomp_setup_dispc_data dsscomp_data; buffer_handle_t *buffers; @@ -158,7 +153,6 @@ struct omap4_hwc_device { int ext_ovls_wanted; /* # of overlays that should be on external display for current composition */ int last_ext_ovls; /* # of overlays on external/internal display for last composition */ int last_int_ovls; - int lcd_transform; }; typedef struct omap4_hwc_device omap4_hwc_device_t; @@ -179,7 +173,7 @@ static int debug = 0; static void dump_layer(hwc_layer_t const* l) { - LOGD("\ttype=%d, flags=%08x, handle=%p, tr=%02x, blend=%04x, {%d,%d,%d,%d}, {%d,%d,%d,%d}", + ALOGD("\ttype=%d, flags=%08x, handle=%p, tr=%02x, blend=%04x, {%d,%d,%d,%d}, {%d,%d,%d,%d}", l->compositionType, l->flags, l->handle, l->transform, l->blending, l->sourceCrop.left, l->sourceCrop.top, @@ -195,7 +189,7 @@ static void dump_dsscomp(struct dsscomp_setup_dispc_data *d) { unsigned i; - LOGD("[%08x] set: %c%c%c %d ovls\n", + ALOGD("[%08x] set: %c%c%c %d ovls\n", d->sync_id, (d->mode & DSSCOMP_SETUP_MODE_APPLY) ? 'A' : '-', (d->mode & DSSCOMP_SETUP_MODE_DISPLAY) ? 'D' : '-', @@ -204,7 +198,7 @@ static void dump_dsscomp(struct dsscomp_setup_dispc_data *d) for (i = 0; i < d->num_mgrs; i++) { struct dss2_mgr_info *mi = &d->mgrs[i]; - LOGD(" (dis%d alpha=%d col=%08x ilace=%d)\n", + ALOGD(" (dis%d alpha=%d col=%08x ilace=%d)\n", mi->ix, mi->alpha_blending, mi->default_color, mi->interlaced); @@ -214,10 +208,10 @@ static void dump_dsscomp(struct dsscomp_setup_dispc_data *d) struct dss2_ovl_info *oi = &d->ovls[i]; struct dss2_ovl_cfg *c = &oi->cfg; if (c->zonly) - LOGD("ovl%d(%s z%d)\n", + ALOGD("ovl%d(%s z%d)\n", c->ix, c->enabled ? "ON" : "off", c->zorder); else - LOGD("ovl%d(%s z%d %s%s *%d%% %d*%d:%d,%d+%d,%d rot%d%s => %d,%d+%d,%d %p/%p|%d)\n", + ALOGD("ovl%d(%s z%d %s%s *%d%% %d*%d:%d,%d+%d,%d rot%d%s => %d,%d+%d,%d %p/%p|%d)\n", c->ix, c->enabled ? "ON" : "off", c->zorder, DSS_FMT(c->color_mode), c->pre_mult_alpha ? " premult" : "", (c->global_alpha * 100 + 128) / 255, @@ -293,7 +287,7 @@ static void dump_set_info(omap4_hwc_device_t *hwc_dev, hwc_layer_list_t* list) } dump_printf(&log, "}%s\n", hwc_dev->use_sgx ? " swap" : ""); - LOGD("%s", log.buf); + ALOGD("%s", log.buf); } static int sync_id = 0; @@ -315,7 +309,7 @@ static int omap4_hwc_is_valid_format(int format) } } -static int scaled(hwc_layer_t *layer,omap4_hwc_device_t *hwc_dev) +static int scaled(hwc_layer_t *layer) { int w = WIDTH(layer->sourceCrop); int h = HEIGHT(layer->sourceCrop); @@ -323,8 +317,7 @@ static int scaled(hwc_layer_t *layer,omap4_hwc_device_t *hwc_dev) if (layer->transform & HWC_TRANSFORM_ROT_90) swap(w, h); - return WIDTH(layer->displayFrame) != w || HEIGHT(layer->displayFrame) != h - || hwc_dev->lcd_transform; + return WIDTH(layer->displayFrame) != w || HEIGHT(layer->displayFrame) != h; } static int is_protected(hwc_layer_t *layer) @@ -336,18 +329,6 @@ static int is_protected(hwc_layer_t *layer) #define is_BLENDED(layer) ((layer)->blending != HWC_BLENDING_NONE) -static int is_RGB32(IMG_native_handle_t *handle) -{ - switch(handle->iFormat) - { - case HAL_PIXEL_FORMAT_BGRA_8888: - case HAL_PIXEL_FORMAT_BGRX_8888: - return 1; - default: - return 0; - } -} - static int is_RGB(IMG_native_handle_t *handle) { switch(handle->iFormat) @@ -445,7 +426,7 @@ omap4_hwc_setup_layer_base(struct dss2_ovl_cfg *oc, int index, int format, int b default: /* Should have been filtered out */ - LOGV("Unsupported pixel format"); + ALOGV("Unsupported pixel format"); return; } @@ -708,56 +689,6 @@ omap4_hwc_adjust_ext_layer(omap4_hwc_ext_t *ext, struct dss2_ovl_info *ovl) oc->mirror = !oc->mirror; } -static void -omap4_hwc_adjust_lcd_layer(omap4_hwc_device_t *hwc_dev, struct dss2_ovl_info *ovl) -{ - struct dss2_ovl_cfg *oc = &ovl->cfg; - float x, y, w, h; - - /* crop to lcd region if mirroring */ - if (crop_to_rect(&ovl->cfg, hwc_dev->lcd_region) != 0) { - ovl->cfg.enabled = 0; - return; - } - - /* display position */ - x = hwc_dev->lcd_m[0][0] * oc->win.x + hwc_dev->lcd_m[0][1] * oc->win.y + hwc_dev->lcd_m[0][2]; - y = hwc_dev->lcd_m[1][0] * oc->win.x + hwc_dev->lcd_m[1][1] * oc->win.y + hwc_dev->lcd_m[1][2]; - w = hwc_dev->lcd_m[0][0] * oc->win.w + hwc_dev->lcd_m[0][1] * oc->win.h; - h = hwc_dev->lcd_m[1][0] * oc->win.w + hwc_dev->lcd_m[1][1] * oc->win.h; - oc->win.x = m_round(w > 0 ? x : x + w); - oc->win.y = m_round(h > 0 ? y : y + h); - oc->win.w = m_round(w > 0 ? w : -w); - oc->win.h = m_round(h > 0 ? h : -h); - - /* combining transformations: F^a*R^b*F^i*R^j = F^(a+b)*R^(j+b*(-1)^i), because F*R = R^(-1)*F */ - oc->rotation += (oc->mirror ? -1 : 1) * hwc_dev->lcd_rotation; - oc->rotation &= 3; -} -static void -omap4_hwc_adjust_lcd_layer_to_hdmi(omap4_hwc_device_t *hwc_dev, struct dss2_ovl_info *ovl) -{ - struct dss2_ovl_cfg *oc = &ovl->cfg; - float x, y, w, h; - - if (!hwc_dev->ext.current.docking && - crop_to_rect(&ovl->cfg, hwc_dev->ext.mirror_region) != 0) { - ovl->cfg.enabled = 0; - return; - } - - /* display position */ - x = hwc_dev->lcd_hdmi_m[0][0] * oc->win.x + hwc_dev->lcd_hdmi_m[0][1] * oc->win.y + hwc_dev->lcd_hdmi_m[0][2]; - y = hwc_dev->lcd_hdmi_m[1][0] * oc->win.x + hwc_dev->lcd_hdmi_m[1][1] * oc->win.y + hwc_dev->lcd_hdmi_m[1][2]; - w = hwc_dev->lcd_hdmi_m[0][0] * oc->win.w + hwc_dev->lcd_hdmi_m[0][1] * oc->win.h; - h = hwc_dev->lcd_hdmi_m[1][0] * oc->win.w + hwc_dev->lcd_hdmi_m[1][1] * oc->win.h; - oc->win.x = m_round(w > 0 ? x : x + w); - oc->win.y = m_round(h > 0 ? y : y + h); - oc->win.w = m_round(w > 0 ? w : -w); - oc->win.h = m_round(h > 0 ? h : -h); - -} - static struct dsscomp_dispc_limitations { __u8 max_xdecim_2d; __u8 max_ydecim_2d; @@ -787,6 +718,8 @@ static int omap4_hwc_can_scale(__u32 src_w, __u32 src_h, __u32 dst_w, __u32 dst_ __u32 pclk) { __u32 fclk = limits->fclk / 1000; + __u32 min_src_w = DIV_ROUND_UP(src_w, is_2d ? limits->max_xdecim_2d : limits->max_xdecim_1d); + __u32 min_src_h = DIV_ROUND_UP(src_h, is_2d ? limits->max_ydecim_2d : limits->max_ydecim_1d); /* ERRATAs */ /* cannot render 1-width layers on DSI video mode panels - we just disallow all 1-width LCD layers */ @@ -795,16 +728,20 @@ static int omap4_hwc_can_scale(__u32 src_w, __u32 src_h, __u32 dst_w, __u32 dst_ /* NOTE: no support for checking YUV422 layers that are tricky to scale */ + /* FIXME: limit vertical downscale well below theoretical limit as we saw display artifacts */ + if (dst_h < src_h / 4) + return 0; + /* max downscale */ - if (dst_h < src_h / limits->max_downscale / (is_2d ? limits->max_ydecim_2d : limits->max_ydecim_1d)) + if (dst_h * limits->max_downscale < min_src_h) return 0; /* for manual panels pclk is 0, and there are no pclk based scaling limits */ if (!pclk) - return (dst_w < src_w / limits->max_downscale / (is_2d ? limits->max_xdecim_2d : limits->max_xdecim_1d)); + return !(dst_w * limits->max_downscale < min_src_w); /* :HACK: limit horizontal downscale well below theoretical limit as we saw display artifacts */ - if (dst_w < src_w / 4) + if (dst_w * 4 < src_w) return 0; /* max horizontal downscale is 4, or the fclk/pixclk */ @@ -813,7 +750,7 @@ static int omap4_hwc_can_scale(__u32 src_w, __u32 src_h, __u32 dst_w, __u32 dst_ /* for small parts, we need to use integer fclk/pixclk */ if (src_w < limits->integer_scale_ratio_limit) fclk = fclk / pclk * pclk; - if ((__u32) dst_w < src_w * pclk / fclk / (is_2d ? limits->max_xdecim_2d : limits->max_xdecim_1d)) + if ((__u32) dst_w * fclk < min_src_w * pclk) return 0; return 1; @@ -899,12 +836,10 @@ static __u32 add_scaling_score(__u32 score, static int omap4_hwc_set_best_hdmi_mode(omap4_hwc_device_t *hwc_dev, __u32 xres, __u32 yres, float xpy) { - int dis_ix = hwc_dev->on_tv ? 0 : 1; - struct _qdis { struct dsscomp_display_info dis; struct dsscomp_videomode modedb[32]; - } d = { .dis = { .ix = dis_ix } }; + } d = { .dis = { .ix = 1 } }; omap4_hwc_ext_t *ext = &hwc_dev->ext; d.dis.modedb_len = sizeof(d.modedb) / sizeof(*d.modedb); @@ -928,21 +863,6 @@ static int omap4_hwc_set_best_hdmi_mode(omap4_hwc_device_t *hwc_dev, __u32 xres, ext->yres = 480; } - /* - * copy the xres/yres from the preferred mode - */ - __u32 preferred_mode_xres = 0; - __u32 preferred_mode_yres = 0; - for (i = 0; i < d.dis.modedb_len; i++) { - if (d.modedb[i].flag & FB_FLAG_PREFERRED) { - preferred_mode_xres = d.modedb[i].xres; - preferred_mode_yres = d.modedb[i].yres; - LOGD("preferred mode %d: xres %u yres %u\n", - i, d.modedb[i].xres, d.modedb[i].yres); - break; - } - } - __u32 ext_fb_xres, ext_fb_yres; for (i = 0; i < d.dis.modedb_len; i++) { __u32 score = 0; @@ -951,10 +871,6 @@ static int omap4_hwc_set_best_hdmi_mode(omap4_hwc_device_t *hwc_dev, __u32 xres, __u32 ext_width = d.dis.width_in_mm; __u32 ext_height = d.dis.height_in_mm; - /* reject it because the hw says it can't actually use this mode */ - if ((d.modedb[i].flag & FB_FLAG_HW_CAPABLE) == 0) - continue; - if (d.modedb[i].flag & FB_FLAG_RATIO_4_3) { ext_width = 4; ext_height = 3; @@ -979,17 +895,7 @@ static int omap4_hwc_set_best_hdmi_mode(omap4_hwc_device_t *hwc_dev, __u32 xres, /* prefer CEA modes */ if (d.modedb[i].flag & (FB_FLAG_RATIO_4_3 | FB_FLAG_RATIO_16_9)) - score += 1; - - /* prefer modes that match the preferred mode's resolution */ - if (d.modedb[i].xres == preferred_mode_xres && - d.modedb[i].yres == preferred_mode_yres) { - score += 1; - } - - /* prefer modes the kernel has hinted is the correct mode */ - if (d.modedb[i].flag & FB_FLAG_PREFERRED) - score += 1; + score = 1; /* prefer the same mode as we use for mirroring to avoid mode change */ score = (score << 1) | (i == ~ext->mirror_mode && ext->avoid_mode_change); @@ -997,10 +903,9 @@ static int omap4_hwc_set_best_hdmi_mode(omap4_hwc_device_t *hwc_dev, __u32 xres, score = add_scaling_score(score, xres, yres, 60, ext_fb_xres, ext_fb_yres, mode_xres, mode_yres, d.modedb[i].refresh ? : 1); - LOGD("#%d: %dx%d %dHz flag 0x%x vmode 0x%x", i, mode_xres, mode_yres, - d.modedb[i].refresh, d.modedb[i].flag, d.modedb[i].vmode); + ALOGD("#%d: %dx%d %dHz", i, mode_xres, mode_yres, d.modedb[i].refresh); if (debug) - LOGD(" score=0x%x adj.res=%dx%d", score, ext_fb_xres, ext_fb_yres); + ALOGD(" score=0x%x adj.res=%dx%d", score, ext_fb_xres, ext_fb_yres); if (best_score < score) { ext->width = ext_width; ext->height = ext_height; @@ -1011,9 +916,9 @@ static int omap4_hwc_set_best_hdmi_mode(omap4_hwc_device_t *hwc_dev, __u32 xres, } } if (~best) { - struct dsscomp_setup_display_data sdis = { .ix = dis_ix, }; + struct dsscomp_setup_display_data sdis = { .ix = 1, }; sdis.mode = d.dis.modedb[best]; - LOGD("picking #%d", best); + ALOGD("picking #%d", best); /* only reconfigure on change */ if (ext->last_mode != ~best) { /* set a property that apps that care (e.g. YouTube) can use @@ -1045,7 +950,7 @@ static int omap4_hwc_set_best_hdmi_mode(omap4_hwc_device_t *hwc_dev, __u32 xres, !omap4_hwc_can_scale(xres, yres, ext_fb_xres, ext_fb_yres, 1, &d.dis, &limits, d.dis.timings.pixel_clock)) { - LOGW("DSS scaler cannot support HDMI cloning"); + ALOGW("DSS scaler cannot support HDMI cloning"); return -1; } } @@ -1087,7 +992,7 @@ static void gather_layer_statistics(omap4_hwc_device_t *hwc_dev, struct counts * num->possible_overlay_layers++; /* NV12 layers can only be rendered on scaling overlays */ - if (scaled(layer, hwc_dev) || is_NV12(handle)) + if (scaled(layer) || is_NV12(handle)) num->scaled_layers++; if (is_BGR(handle)) @@ -1138,7 +1043,6 @@ static void decide_supported_cloning(omap4_hwc_device_t *hwc_dev, struct counts * otherwise, manage just from half the pipelines. NOTE: there is * no danger of having used too many overlays for external display here. */ - num->max_hw_overlays >>= 1; nonscaling_ovls >>= 1; hwc_dev->ext_ovls = MAX_HW_OVERLAYS - num->max_hw_overlays; @@ -1162,19 +1066,13 @@ static void decide_supported_cloning(omap4_hwc_device_t *hwc_dev, struct counts if (hwc_dev->ext_ovls && ext->current.enabled && !ext->current.docking) num->max_hw_overlays = hwc_dev->ext_ovls; - /* If FB is not same resolution as LCD don't use GFX pipe line*/ - if (hwc_dev->lcd_transform) { - num->max_hw_overlays -= 1; - num->max_scaling_overlays = num->max_hw_overlays; - } - else - num->max_scaling_overlays = num->max_hw_overlays - nonscaling_ovls; + num->max_scaling_overlays = num->max_hw_overlays - nonscaling_ovls; } static int can_dss_render_all(omap4_hwc_device_t *hwc_dev, struct counts *num) { omap4_hwc_ext_t *ext = &hwc_dev->ext; - int on_tv = hwc_dev->on_tv || (ext->on_tv && ext->current.enabled); + int on_tv = ext->on_tv && ext->current.enabled; int tform = ext->current.enabled && (ext->current.rotation || ext->current.hflip); return !hwc_dev->force_sgx && @@ -1198,7 +1096,7 @@ static inline int can_dss_render_layer(omap4_hwc_device_t *hwc_dev, IMG_native_handle_t *handle = (IMG_native_handle_t *)layer->handle; omap4_hwc_ext_t *ext = &hwc_dev->ext; - int on_tv = hwc_dev->on_tv || (ext->on_tv && ext->current.enabled); + int on_tv = ext->on_tv && ext->current.enabled; int tform = ext->current.enabled && (ext->current.rotation || ext->current.hflip); return omap4_hwc_is_valid_layer(hwc_dev, layer, handle) && @@ -1225,7 +1123,7 @@ static int clone_layer(omap4_hwc_device_t *hwc_dev, int ix) { struct dss2_ovl_info *o = &dsscomp->ovls[dsscomp->num_ovls]; if (dsscomp->num_ovls >= MAX_HW_OVERLAYS) { - LOGE("**** cannot clone layer #%d. using all %d overlays.", ix, dsscomp->num_ovls); + ALOGE("**** cannot clone layer #%d. using all %d overlays.", ix, dsscomp->num_ovls); return -EBUSY; } @@ -1240,9 +1138,6 @@ static int clone_layer(omap4_hwc_device_t *hwc_dev, int ix) { /* use distinct z values (to simplify z-order checking) */ o->cfg.zorder += hwc_dev->post2_layers; - if (hwc_dev->lcd_transform) - omap4_hwc_adjust_lcd_layer_to_hdmi(hwc_dev,o); - omap4_hwc_adjust_ext_layer(&hwc_dev->ext, o); dsscomp->num_ovls++; return 0; @@ -1255,11 +1150,6 @@ static int clone_external_layer(omap4_hwc_device_t *hwc_dev, int ix) { /* mirror only 1 external layer */ struct dss2_ovl_info *o = &dsscomp->ovls[ix]; - /*If LCD transform is enabled we need to apply reverse transform here - before adjusting HDMI*/ - if (hwc_dev->lcd_transform) - omap4_hwc_adjust_lcd_layer_to_hdmi(hwc_dev,o); - /* full screen video after transformation */ __u32 xres = o->cfg.crop.w, yres = o->cfg.crop.h; if ((ext->current.rotation + o->cfg.rotation) & 1) @@ -1277,7 +1167,7 @@ static int clone_external_layer(omap4_hwc_device_t *hwc_dev, int ix) { yres != ext->last_yres_used || xpy < ext->last_xpy * (1.f - ASPECT_RATIO_TOLERANCE) || xpy * (1.f - ASPECT_RATIO_TOLERANCE) > ext->last_xpy) { - LOGD("set up HDMI for %d*%d\n", xres, yres); + ALOGD("set up HDMI for %d*%d\n", xres, yres); if (omap4_hwc_set_best_hdmi_mode(hwc_dev, xres, yres, xpy)) { ext->current.enabled = 0; return -ENODEV; @@ -1308,16 +1198,6 @@ static int setup_mirroring(omap4_hwc_device_t *hwc_dev) return 0; } -/* test if layer appears to be RGB32 (4 Bpp) and > 1280x720 */ -static int is_large_rgb32_layer(const hwc_layer_t *layer) -{ - IMG_native_handle_t *handle = (IMG_native_handle_t *)layer->handle; - - return is_RGB32(handle) && - (((layer->sourceCrop.right - layer->sourceCrop.left) > 1280) || - ((layer->sourceCrop.bottom - layer->sourceCrop.top) > 720)); -} - static int omap4_hwc_prepare(struct hwc_composer_device *dev, hwc_layer_list_t* list) { omap4_hwc_device_t *hwc_dev = (omap4_hwc_device_t *)dev; @@ -1354,7 +1234,6 @@ static int omap4_hwc_prepare(struct hwc_composer_device *dev, hwc_layer_list_t* int fb_z = -1; int scaled_gfx = 0; int ix_docking = -1; - int big_layers = 0; /* set up if DSS layers */ unsigned int mem_used = 0; @@ -1371,9 +1250,7 @@ static int omap4_hwc_prepare(struct hwc_composer_device *dev, hwc_layer_list_t* (hwc_dev->ext.current.docking && hwc_dev->ext.current.enabled && dockable(layer))) && mem_used + mem1d(handle) < MAX_TILER_SLOT && /* can't have a transparent overlay in the middle of the framebuffer stack */ - !(is_BLENDED(layer) && fb_z >= 0) && - /* current hardware is unable to keep up with more than 1 'large' RGB32 layer */ - !(is_large_rgb32_layer(layer) && big_layers > 0)) { + !(is_BLENDED(layer) && fb_z >= 0)) { /* render via DSS overlay */ mem_used += mem1d(handle); @@ -1396,17 +1273,17 @@ static int omap4_hwc_prepare(struct hwc_composer_device *dev, hwc_layer_list_t* handle->iWidth, handle->iHeight); - dsscomp->ovls[dsscomp->num_ovls].cfg.ix = dsscomp->num_ovls + hwc_dev->lcd_transform; + dsscomp->ovls[dsscomp->num_ovls].cfg.ix = dsscomp->num_ovls; dsscomp->ovls[dsscomp->num_ovls].addressing = OMAP_DSS_BUFADDR_LAYER_IX; dsscomp->ovls[dsscomp->num_ovls].ba = dsscomp->num_ovls; /* ensure GFX layer is never scaled */ - if ((dsscomp->num_ovls == 0) && (!hwc_dev->lcd_transform)) { - scaled_gfx = scaled(layer, hwc_dev) || is_NV12(handle); - } else if (scaled_gfx && !scaled(layer, hwc_dev) && !is_NV12(handle)) { + if (dsscomp->num_ovls == 0) { + scaled_gfx = scaled(layer) || is_NV12(handle); + } else if (scaled_gfx && !scaled(layer) && !is_NV12(handle)) { /* swap GFX layer with this one */ dsscomp->ovls[dsscomp->num_ovls].cfg.ix = 0; - dsscomp->ovls[0].cfg.ix = dsscomp->num_ovls + hwc_dev->lcd_transform; + dsscomp->ovls[0].cfg.ix = dsscomp->num_ovls; scaled_gfx = 0; } @@ -1416,14 +1293,8 @@ static int omap4_hwc_prepare(struct hwc_composer_device *dev, hwc_layer_list_t* display_area(&dsscomp->ovls[dsscomp->num_ovls]) > display_area(&dsscomp->ovls[ix_docking]))) ix_docking = dsscomp->num_ovls; - omap4_hwc_adjust_lcd_layer(hwc_dev, &dsscomp->ovls[dsscomp->num_ovls]); dsscomp->num_ovls++; z++; - - /* record whether or not this was a 'big' RGB32 layer */ - if (is_large_rgb32_layer(layer)) { - big_layers++; - } } else if (hwc_dev->use_sgx) { if (fb_z < 0) { /* NOTE: we are not handling transparent cutout for now */ @@ -1439,13 +1310,13 @@ static int omap4_hwc_prepare(struct hwc_composer_device *dev, hwc_layer_list_t* /* if scaling GFX (e.g. only 1 scaled surface) use a VID pipe */ if (scaled_gfx) - dsscomp->ovls[0].cfg.ix = dsscomp->num_ovls + hwc_dev->lcd_transform; + dsscomp->ovls[0].cfg.ix = dsscomp->num_ovls; if (hwc_dev->use_sgx) { /* assign a z-layer for fb */ if (fb_z < 0) { if (num.composited_layers) - LOGE("**** should have assigned z-layer for fb"); + ALOGE("**** should have assigned z-layer for fb"); fb_z = z++; } @@ -1458,8 +1329,6 @@ static int omap4_hwc_prepare(struct hwc_composer_device *dev, hwc_layer_list_t* dsscomp->ovls[0].cfg.pre_mult_alpha = 1; dsscomp->ovls[0].addressing = OMAP_DSS_BUFADDR_LAYER_IX; dsscomp->ovls[0].ba = 0; - dsscomp->ovls[0].cfg.ix = hwc_dev->lcd_transform; - omap4_hwc_adjust_lcd_layer(hwc_dev, &dsscomp->ovls[0]); } /* mirror layers */ @@ -1468,10 +1337,8 @@ static int omap4_hwc_prepare(struct hwc_composer_device *dev, hwc_layer_list_t* omap4_hwc_ext_t *ext = &hwc_dev->ext; if (ext->current.enabled && hwc_dev->ext_ovls) { if (ext->current.docking && ix_docking >= 0) { - if (clone_external_layer(hwc_dev, ix_docking) == 0) { + if (clone_external_layer(hwc_dev, ix_docking) == 0) dsscomp->ovls[dsscomp->num_ovls - 1].cfg.zorder = z++; - dsscomp->ovls[dsscomp->num_ovls - 1].cfg.ix = MAX_HW_OVERLAYS - dsscomp->num_ovls; - } } else if (ext->current.docking && ix_docking < 0 && ext->force_dock) { ix_docking = dsscomp->num_ovls; struct dss2_ovl_info *oi = &dsscomp->ovls[ix_docking]; @@ -1481,7 +1348,6 @@ static int omap4_hwc_prepare(struct hwc_composer_device *dev, hwc_layer_list_t* if (clone_external_layer(hwc_dev, ix_docking) == 0) { oi->addressing = OMAP_DSS_BUFADDR_FB; oi->ba = 0; - oi->cfg.ix = MAX_HW_OVERLAYS - dsscomp->num_ovls; z++; } } else if (!ext->current.docking) { @@ -1502,16 +1368,16 @@ static int omap4_hwc_prepare(struct hwc_composer_device *dev, hwc_layer_list_t* ext->last = ext->current; if (z != dsscomp->num_ovls || dsscomp->num_ovls > MAX_HW_OVERLAYS) - LOGE("**** used %d z-layers for %d overlays\n", z, dsscomp->num_ovls); + ALOGE("**** used %d z-layers for %d overlays\n", z, dsscomp->num_ovls); /* verify all z-orders and overlay indices are distinct */ for (i = z = ix = 0; i < dsscomp->num_ovls; i++) { struct dss2_ovl_cfg *c = &dsscomp->ovls[i].cfg; if (z & (1 << c->zorder)) - LOGE("**** used z-order #%d multiple times", c->zorder); + ALOGE("**** used z-order #%d multiple times", c->zorder); if (ix & (1 << c->ix)) - LOGE("**** used ovl index #%d multiple times", c->ix); + ALOGE("**** used ovl index #%d multiple times", c->ix); z |= 1 << c->zorder; ix |= 1 << c->ix; } @@ -1529,7 +1395,7 @@ static int omap4_hwc_prepare(struct hwc_composer_device *dev, hwc_layer_list_t* } if (debug) { - LOGD("prepare (%d) - %s (comp=%d, poss=%d/%d scaled, RGB=%d,BGR=%d,NV12=%d) (ext=%s%s%ddeg%s %dex/%dmx (last %dex,%din)\n", + ALOGD("prepare (%d) - %s (comp=%d, poss=%d/%d scaled, RGB=%d,BGR=%d,NV12=%d) (ext=%s%s%ddeg%s %dex/%dmx (last %dex,%din)\n", dsscomp->sync_id, hwc_dev->use_sgx ? "SGX+OVL" : "all-OVL", num.composited_layers, @@ -1559,18 +1425,18 @@ static void omap4_hwc_reset_screen(omap4_hwc_device_t *hwc_dev) /* remove bootloader image from the screen as blank/unblank does not change the composition */ ret = ioctl(hwc_dev->dsscomp_fd, DSSCIOC_SETUP_DISPC, &d); if (ret) - LOGW("failed to remove bootloader image"); + ALOGW("failed to remove bootloader image"); /* blank and unblank fd to make sure display is properly programmed on boot. * This is needed because the bootloader can not be trusted. */ ret = ioctl(hwc_dev->fb_fd, FBIOBLANK, FB_BLANK_POWERDOWN); if (ret) - LOGW("failed to blank display"); + ALOGW("failed to blank display"); ret = ioctl(hwc_dev->fb_fd, FBIOBLANK, FB_BLANK_UNBLANK); if (ret) - LOGW("failed to blank display"); + ALOGW("failed to blank display"); } } @@ -1584,11 +1450,7 @@ static int omap4_hwc_set(struct hwc_composer_device *dev, hwc_display_t dpy, pthread_mutex_lock(&hwc_dev->lock); - /* disable resetting the screen on the first boot for devices - * with hdmi as primary input. - */ - if (!hwc_dev->on_tv) - omap4_hwc_reset_screen(hwc_dev); + omap4_hwc_reset_screen(hwc_dev); invalidate = hwc_dev->ext_ovls_wanted && !hwc_dev->ext_ovls; @@ -1602,7 +1464,7 @@ static int omap4_hwc_set(struct hwc_composer_device *dev, hwc_display_t dpy, if (hwc_dev->use_sgx) { if (!eglSwapBuffers((EGLDisplay)dpy, (EGLSurface)sur)) { - LOGE("eglSwapBuffers error"); + ALOGE("eglSwapBuffers error"); err = HWC_EGL_ERROR; goto err_out; } @@ -1619,20 +1481,11 @@ static int omap4_hwc_set(struct hwc_composer_device *dev, hwc_display_t dpy, hwc_dev->buffers, hwc_dev->post2_layers, dsscomp, sizeof(*dsscomp)); - - if (!hwc_dev->use_sgx) { - __u32 crt = 0; - int err2 = ioctl(hwc_dev->fb_fd, FBIO_WAITFORVSYNC, &crt); - if (err2) { - LOGE("failed to wait for vsync (%d)", errno); - err = err ? : -errno; - } - } } hwc_dev->last_ext_ovls = hwc_dev->ext_ovls; hwc_dev->last_int_ovls = hwc_dev->post2_layers; if (err) - LOGE("Post2 error"); + ALOGE("Post2 error"); err_out: pthread_mutex_unlock(&hwc_dev->lock); @@ -1685,7 +1538,7 @@ static int load_png_image(omap4_hwc_device_t *hwc_dev, char *path, struct omap4_ FILE *fd = fopen(path, "rb"); if (!fd) { - LOGE("failed to open PNG file %s: (%d)", path, errno); + ALOGE("failed to open PNG file %s: (%d)", path, errno); return -EINVAL; } @@ -1693,7 +1546,7 @@ static int load_png_image(omap4_hwc_device_t *hwc_dev, char *path, struct omap4_ __u8 header[SIZE_PNG_HEADER]; fread(header, 1, SIZE_PNG_HEADER, fd); if (png_sig_cmp(header, 0, SIZE_PNG_HEADER)) { - LOGE("%s is not a PNG file", path); + ALOGE("%s is not a PNG file", path); goto fail; } @@ -1741,7 +1594,7 @@ static int load_png_image(omap4_hwc_device_t *hwc_dev, char *path, struct omap4_ png_set_bgr(png_ptr); break; default: - LOGE("unsupported PNG color: %x", color_type); + ALOGE("unsupported PNG color: %x", color_type); goto fail_alloc; } @@ -1751,14 +1604,14 @@ static int load_png_image(omap4_hwc_device_t *hwc_dev, char *path, struct omap4_ const int bpp = 4; img->size = ALIGN(width * height * bpp, 4096); if (img->size > hwc_dev->img_mem_size) { - LOGE("image does not fit into framebuffer area (%d > %d)", img->size, hwc_dev->img_mem_size); + ALOGE("image does not fit into framebuffer area (%d > %d)", img->size, hwc_dev->img_mem_size); goto fail_alloc; } img->ptr = hwc_dev->img_mem_ptr; row_pointers = calloc(height, sizeof(*row_pointers)); if (!row_pointers) { - LOGE("failed to allocate row pointers"); + ALOGE("failed to allocate row pointers"); goto fail_alloc; } __u32 i; @@ -1781,7 +1634,7 @@ fail_alloc: free_png_image(hwc_dev, img); free(row_pointers); if (!png_ptr || !info_ptr) - LOGE("failed to allocate PNG structures"); + ALOGE("failed to allocate PNG structures"); png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fail: fclose(fd); @@ -1830,78 +1683,14 @@ static int omap4_hwc_open_fb_hal(IMG_framebuffer_device_public_t **fb_dev) return 0; err_out: - LOGE("Composer HAL failed to load compatible Graphics HAL"); + ALOGE("Composer HAL failed to load compatible Graphics HAL"); return err; } -static void set_lcd_transform_matrix(omap4_hwc_device_t *hwc_dev) -{ -/* create LCD translation matrix */ - - hwc_rect_t region = { .left = 0, .top = 0, .right = hwc_dev->fb_dev->base.width, .bottom = hwc_dev->fb_dev->base.height }; - hwc_dev->fb_dis.ix = 0;/*Default display*/ - int ret = ioctl(hwc_dev->dsscomp_fd, DSSCIOC_QUERY_DISPLAY, &hwc_dev->fb_dis); - if (ret) { - LOGE("failed to get display info (%d): %m", errno); - } - - int lcd_w = hwc_dev->fb_dis.timings.x_res; - int lcd_h = hwc_dev->fb_dis.timings.y_res; - int orig_w = WIDTH(region); - int orig_h = HEIGHT(region); - hwc_dev->lcd_region = region; - hwc_dev->lcd_rotation = ((lcd_w > lcd_h) ^ (orig_w > orig_h)) ? 1 : 0; - hwc_dev->lcd_transform = ((lcd_w != orig_w)||(lcd_h != orig_h)) ? 1 : 0; - - LOGI("transforming FB (%dx%d) => (%dx%d) rot%d", orig_w, orig_h, lcd_w, lcd_h, hwc_dev->lcd_rotation); - - /* reorientation matrix is: - m = (center-from-target-center) * (scale-to-target) * (mirror) * (rotate) * (center-to-original-center) */ - - memcpy(hwc_dev->lcd_m, m_unit, sizeof(m_unit)); - m_translate(hwc_dev->lcd_m, -(orig_w >> 1) - region.left, -(orig_h >> 1) - region.top); - m_rotate(hwc_dev->lcd_m, hwc_dev->lcd_rotation); - if (hwc_dev->lcd_rotation & 1) - swap(orig_w, orig_h); - m_scale(hwc_dev->lcd_m, orig_w, lcd_w, orig_h, lcd_h); - m_translate(hwc_dev->lcd_m, lcd_w >> 1, lcd_h >> 1); - - /*create reverse LCD transformation*/ - memcpy(hwc_dev->lcd_hdmi_m, m_unit, sizeof(m_unit)); - m_translate(hwc_dev->lcd_hdmi_m, -(lcd_w >> 1) - 0, -(lcd_h >> 1) - 0); - m_rotate(hwc_dev->lcd_hdmi_m, hwc_dev->lcd_rotation); - if (hwc_dev->lcd_rotation & 1) - swap(lcd_w, lcd_h); - m_scale(hwc_dev->lcd_hdmi_m, lcd_w, orig_w, lcd_h, orig_h); - m_translate(hwc_dev->lcd_hdmi_m, (orig_w >> 1) - region.left,(orig_h >> 1) - region.top); - return; -} static void handle_hotplug(omap4_hwc_device_t *hwc_dev) { omap4_hwc_ext_t *ext = &hwc_dev->ext; __u8 state = ext->hdmi_state; - /* Ignore external HDMI logic if the primary display is HDMI */ - if (hwc_dev->on_tv) { - LOGI("Primary display is HDMI - skip clone/dock logic"); - - if (state) { - __u32 xres = WIDTH(ext->mirror_region); - __u32 yres = HEIGHT(ext->mirror_region); - if (omap4_hwc_set_best_hdmi_mode(hwc_dev, xres, yres, ext->lcd_xpy)) { - LOGE("Failed to set HDMI mode"); - } - set_lcd_transform_matrix(hwc_dev); - ioctl(hwc_dev->fb_fd, FBIOBLANK, FB_BLANK_UNBLANK); - - if (hwc_dev->procs && hwc_dev->procs->invalidate) { - hwc_dev->procs->invalidate(hwc_dev->procs); - } - } else { - ext->last_mode = 0; - } - - return; - } pthread_mutex_lock(&hwc_dev->lock); ext->dock.enabled = ext->mirror.enabled = 0; @@ -1920,7 +1709,7 @@ static void handle_hotplug(omap4_hwc_device_t *hwc_dev) ext->dock.rotation = atoi(value) & EXT_ROTATION; ext->dock.hflip = (atoi(value) & EXT_HFLIP) > 0; ext->dock.docking = 1; - property_get("persist.hwc.mirroring.transform", value, hwc_dev->fb_dis.timings.y_res > hwc_dev->fb_dis.timings.x_res ? "3" : "0"); + property_get("persist.hwc.mirroring.transform", value, hwc_dev->fb_dev->base.height > hwc_dev->fb_dev->base.width ? "3" : "0"); ext->mirror.rotation = atoi(value) & EXT_ROTATION; ext->mirror.hflip = (atoi(value) & EXT_HFLIP) > 0; ext->mirror.docking = 0; @@ -1950,7 +1739,7 @@ static void handle_hotplug(omap4_hwc_device_t *hwc_dev) } else { ext->last_mode = 0; } - LOGI("external display changed (state=%d, mirror={%s tform=%ddeg%s}, dock={%s tform=%ddeg%s%s}, tv=%d", state, + ALOGI("external display changed (state=%d, mirror={%s tform=%ddeg%s}, dock={%s tform=%ddeg%s%s}, tv=%d", state, ext->mirror.enabled ? "enabled" : "disabled", ext->mirror.rotation * 90, ext->mirror.hflip ? "+hflip" : "", @@ -1966,26 +1755,48 @@ static void handle_hotplug(omap4_hwc_device_t *hwc_dev) hwc_dev->procs->invalidate(hwc_dev->procs); } -static void handle_uevents(omap4_hwc_device_t *hwc_dev, const char *s) +static void handle_uevents(omap4_hwc_device_t *hwc_dev, const char *buff, int len) { - int dock = !strcmp(s, "change@/devices/virtual/switch/dock"); - if (!dock && - strcmp(s, "change@/devices/virtual/switch/hdmi")) - return; + int dock; + int hdmi; + int vsync; + int state = 0; + uint64_t timestamp = 0; + const char *s = buff; + + dock = !strcmp(s, "change@/devices/virtual/switch/dock"); + hdmi = !strcmp(s, "change@/devices/virtual/switch/hdmi"); + vsync = !strcmp(s, "change@/devices/platform/omapfb") || + !strcmp(s, "change@/devices/virtual/switch/omapfb-vsync"); + + if (!dock && !vsync && !hdmi) + return; s += strlen(s) + 1; while(*s) { - if (!strncmp(s, "SWITCH_STATE=", strlen("SWITCH_STATE="))) { - int state = atoi(s + strlen("SWITCH_STATE=")); - if (dock) - hwc_dev->ext.force_dock = state == 1; - else - hwc_dev->ext.hdmi_state = state == 1; - handle_hotplug(hwc_dev); - } + if (!strncmp(s, "SWITCH_STATE=", strlen("SWITCH_STATE="))) + state = atoi(s + strlen("SWITCH_STATE=")); + else if (!strncmp(s, "SWITCH_TIME=", strlen("SWITCH_TIME="))) + timestamp = strtoull(s + strlen("SWITCH_TIME="), NULL, 0); + else if (!strncmp(s, "VSYNC=", strlen("VSYNC="))) + timestamp = strtoull(s + strlen("VSYNC="), NULL, 0); s += strlen(s) + 1; + if (s - buff >= len) + break; + } + + if (vsync) { + if (hwc_dev->procs && hwc_dev->procs->vsync) { + hwc_dev->procs->vsync(hwc_dev->procs, 0, timestamp); + } + } else { + if (dock) + hwc_dev->ext.force_dock = state == 1; + else + hwc_dev->ext.hdmi_state = state == 1; + handle_hotplug(hwc_dev); } } @@ -1998,6 +1809,8 @@ static void *omap4_hwc_hdmi_thread(void *data) int timeout; int err; + setpriority(PRIO_PROCESS, 0, HAL_PRIORITY_URGENT_DISPLAY); + uevent_init(); fds[0].fd = uevent_get_fd(); @@ -2034,7 +1847,7 @@ static void *omap4_hwc_hdmi_thread(void *data) if (err == -1) { if (errno != EINTR) - LOGE("event error: %m"); + ALOGE("event error: %m"); continue; } @@ -2047,8 +1860,8 @@ static void *omap4_hwc_hdmi_thread(void *data) if (fds[0].revents & POLLIN) { /* keep last 2 zeroes to ensure double 0 termination */ - uevent_next_event(uevent_desc, sizeof(uevent_desc) - 2); - handle_uevents(hwc_dev, uevent_desc); + int len = uevent_next_event(uevent_desc, sizeof(uevent_desc) - 2); + handle_uevents(hwc_dev, uevent_desc, len); } } while (1); @@ -2063,6 +1876,53 @@ static void omap4_hwc_registerProcs(struct hwc_composer_device* dev, hwc_dev->procs = (typeof(hwc_dev->procs)) procs; } +static int omap4_hwc_query(struct hwc_composer_device* dev, + int what, int* value) +{ + omap4_hwc_device_t *hwc_dev = (omap4_hwc_device_t *) dev; + + switch (what) { + case HWC_BACKGROUND_LAYER_SUPPORTED: + // we don't support the background layer yet + value[0] = 0; + break; + case HWC_VSYNC_PERIOD: + // vsync period in nanosecond + value[0] = 1000000000.0 / hwc_dev->fb_dev->base.fps; + break; + default: + // unsupported query + return -EINVAL; + } + return 0; +} + +static int omap4_hwc_event_control(struct hwc_composer_device* dev, + int event, int enabled) +{ + omap4_hwc_device_t *hwc_dev = (omap4_hwc_device_t *) dev; + + switch (event) { + case HWC_EVENT_VSYNC: + { + int val = !!enabled; + int err; + + err = ioctl(hwc_dev->fb_fd, OMAPFB_ENABLEVSYNC, &val); + if (err < 0) + return -errno; + + return 0; + } + default: + return -EINVAL; + } +} + +struct hwc_methods omap4_hwc_methods = { + .eventControl = &omap4_hwc_event_control, +}; + static int omap4_hwc_device_open(const hw_module_t* module, const char* name, hw_device_t** device) { @@ -2080,7 +1940,7 @@ static int omap4_hwc_device_open(const hw_module_t* module, const char* name, return err; if (!hwc_mod->fb_dev) { - LOGE("Framebuffer HAL not opened before HWC"); + ALOGE("Framebuffer HAL not opened before HWC"); return -EFAULT; } hwc_mod->fb_dev->bBypassPost = 1; @@ -2093,33 +1953,42 @@ static int omap4_hwc_device_open(const hw_module_t* module, const char* name, memset(hwc_dev, 0, sizeof(*hwc_dev)); hwc_dev->base.common.tag = HARDWARE_DEVICE_TAG; - hwc_dev->base.common.version = HWC_API_VERSION; + hwc_dev->base.common.version = HWC_DEVICE_API_VERSION_0_3; hwc_dev->base.common.module = (hw_module_t *)module; hwc_dev->base.common.close = omap4_hwc_device_close; hwc_dev->base.prepare = omap4_hwc_prepare; hwc_dev->base.set = omap4_hwc_set; hwc_dev->base.dump = omap4_hwc_dump; hwc_dev->base.registerProcs = omap4_hwc_registerProcs; + hwc_dev->base.query = omap4_hwc_query; + hwc_dev->base.methods = &omap4_hwc_methods; hwc_dev->fb_dev = hwc_mod->fb_dev; *device = &hwc_dev->base.common; hwc_dev->dsscomp_fd = open("/dev/dsscomp", O_RDWR); if (hwc_dev->dsscomp_fd < 0) { - LOGE("failed to open dsscomp (%d)", errno); + ALOGE("failed to open dsscomp (%d)", errno); + err = -errno; + goto done; + } + + hwc_dev->hdmi_fb_fd = open("/dev/graphics/fb1", O_RDWR); + if (hwc_dev->hdmi_fb_fd < 0) { + ALOGE("failed to open hdmi fb (%d)", errno); err = -errno; goto done; } hwc_dev->fb_fd = open("/dev/graphics/fb0", O_RDWR); if (hwc_dev->fb_fd < 0) { - LOGE("failed to open fb (%d)", errno); + ALOGE("failed to open fb (%d)", errno); err = -errno; goto done; } struct fb_fix_screeninfo fix; if (ioctl(hwc_dev->fb_fd, FBIOGET_FSCREENINFO, &fix)) { - LOGE("failed to get fb info (%d)", errno); + ALOGE("failed to get fb info (%d)", errno); err = -errno; goto done; } @@ -2127,7 +1996,7 @@ static int omap4_hwc_device_open(const hw_module_t* module, const char* name, hwc_dev->img_mem_size = fix.smem_len; hwc_dev->img_mem_ptr = mmap(NULL, fix.smem_len, PROT_WRITE, MAP_SHARED, hwc_dev->fb_fd, 0); if (hwc_dev->img_mem_ptr == MAP_FAILED) { - LOGE("failed to map fb memory"); + ALOGE("failed to map fb memory"); err = -errno; goto done; } @@ -2140,40 +2009,27 @@ static int omap4_hwc_device_open(const hw_module_t* module, const char* name, int ret = ioctl(hwc_dev->dsscomp_fd, DSSCIOC_QUERY_DISPLAY, &hwc_dev->fb_dis); if (ret) { - LOGE("failed to get display info (%d): %m", errno); + ALOGE("failed to get display info (%d): %m", errno); err = -errno; goto done; } hwc_dev->ext.lcd_xpy = (float) hwc_dev->fb_dis.width_in_mm / hwc_dev->fb_dis.timings.x_res / hwc_dev->fb_dis.height_in_mm * hwc_dev->fb_dis.timings.y_res; - if (hwc_dev->fb_dis.channel == OMAP_DSS_CHANNEL_DIGIT) { - LOGI("Primary display is HDMI"); - hwc_dev->on_tv = 1; - } - else { - hwc_dev->hdmi_fb_fd = open("/dev/graphics/fb1", O_RDWR); - if (hwc_dev->hdmi_fb_fd < 0) { - LOGE("failed to open hdmi fb (%d)", errno); - err = -errno; - goto done; - } - } - set_lcd_transform_matrix( hwc_dev ); - if (pipe(hwc_dev->pipe_fds) == -1) { - LOGE("failed to event pipe (%d): %m", errno); + ALOGE("failed to event pipe (%d): %m", errno); err = -errno; goto done; } if (pthread_mutex_init(&hwc_dev->lock, NULL)) { - LOGE("failed to create mutex (%d): %m", errno); + ALOGE("failed to create mutex (%d): %m", errno); err = -errno; goto done; } - if (pthread_create(&hwc_dev->hdmi_thread, NULL, omap4_hwc_hdmi_thread, hwc_dev)) { - LOGE("failed to create HDMI listening thread (%d): %m", errno); + if (pthread_create(&hwc_dev->hdmi_thread, NULL, omap4_hwc_hdmi_thread, hwc_dev)) + { + ALOGE("failed to create HDMI listening thread (%d): %m", errno); err = -errno; goto done; } @@ -2197,10 +2053,10 @@ static int omap4_hwc_device_open(const hw_module_t* module, const char* name, &hwc_dev->ext.mirror_region.right, &hwc_dev->ext.mirror_region.bottom) != 4 || hwc_dev->ext.mirror_region.left >= hwc_dev->ext.mirror_region.right || hwc_dev->ext.mirror_region.top >= hwc_dev->ext.mirror_region.bottom) { - struct hwc_rect fb_region = { .right = hwc_dev->fb_dis.timings.x_res, .bottom = hwc_dev->fb_dis.timings.y_res }; + struct hwc_rect fb_region = { .right = hwc_dev->fb_dev->base.width, .bottom = hwc_dev->fb_dev->base.height }; hwc_dev->ext.mirror_region = fb_region; } - LOGI("clone region is set to (%d,%d) to (%d,%d)", + ALOGI("clone region is set to (%d,%d) to (%d,%d)", hwc_dev->ext.mirror_region.left, hwc_dev->ext.mirror_region.top, hwc_dev->ext.mirror_region.right, hwc_dev->ext.mirror_region.bottom); @@ -2221,7 +2077,7 @@ static int omap4_hwc_device_open(const hw_module_t* module, const char* name, } handle_hotplug(hwc_dev); - LOGI("omap4_hwc_device_open(rgb_order=%d nv12_only=%d)", + ALOGI("omap4_hwc_device_open(rgb_order=%d nv12_only=%d)", hwc_dev->flags_rgb_order, hwc_dev->flags_nv12_only); done: @@ -2248,8 +2104,8 @@ omap4_hwc_module_t HAL_MODULE_INFO_SYM = { .base = { .common = { .tag = HARDWARE_MODULE_TAG, - .version_major = 1, - .version_minor = 0, + .module_api_version = HWC_MODULE_API_VERSION_0_1, + .hal_api_version = HARDWARE_HAL_API_VERSION, .id = HWC_HARDWARE_MODULE_ID, .name = "OMAP 44xx Hardware Composer HAL", .author = "Texas Instruments", diff --git a/ion/Android.mk b/ion/Android.mk deleted file mode 100644 index c9bf668..0000000 --- a/ion/Android.mk +++ /dev/null @@ -1,20 +0,0 @@ -# only include if running on an omap4 platform -ifeq ($(TARGET_BOARD_PLATFORM),omap4) - -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_SRC_FILES := ion.c -LOCAL_MODULE := libion -LOCAL_MODULE_TAGS := optional -LOCAL_SHARED_LIBRARIES := liblog -include $(BUILD_HEAPTRACKED_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_SRC_FILES := ion.c ion_test.c -LOCAL_MODULE := iontest -LOCAL_MODULE_TAGS := optional tests -LOCAL_SHARED_LIBRARIES := liblog -include $(BUILD_HEAPTRACKED_EXECUTABLE) - -endif diff --git a/ion/ion.c b/ion/ion.c deleted file mode 100644 index 9df344c..0000000 --- a/ion/ion.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * ion.c - * - * Memory Allocator functions for ion - * - * Copyright 2011 Google, Inc - * - * 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 <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <sys/ioctl.h> -#include <sys/mman.h> -#include <sys/types.h> - -#define LOG_TAG "ion" -#include <cutils/log.h> - -#include <linux/ion.h> -#include <linux/omap_ion.h> -#include "ion.h" - -int ion_open() -{ - int fd = open("/dev/ion", O_RDWR); - if (fd < 0) - LOGE("open /dev/ion failed!\n"); - return fd; -} - -int ion_close(int fd) -{ - return close(fd); -} - -static int ion_ioctl(int fd, int req, void *arg) -{ - int ret = ioctl(fd, req, arg); - if (ret < 0) { - LOGE("ioctl %d failed with code %d: %s\n", req, - ret, strerror(errno)); - return -errno; - } - return ret; -} - -int ion_alloc(int fd, size_t len, size_t align, unsigned int flags, - struct ion_handle **handle) -{ - int ret; - struct ion_allocation_data data = { - .len = len, - .align = align, - .flags = flags, - }; - - ret = ion_ioctl(fd, ION_IOC_ALLOC, &data); - if (ret < 0) - return ret; - *handle = data.handle; - return ret; -} - -int ion_alloc_tiler(int fd, size_t w, size_t h, int fmt, unsigned int flags, - struct ion_handle **handle, size_t *stride) -{ - int ret; - struct omap_ion_tiler_alloc_data alloc_data = { - .w = w, - .h = h, - .fmt = fmt, - .flags = flags, - }; - - struct ion_custom_data custom_data = { - .cmd = OMAP_ION_TILER_ALLOC, - .arg = (unsigned long)(&alloc_data), - }; - - ret = ion_ioctl(fd, ION_IOC_CUSTOM, &custom_data); - if (ret < 0) - return ret; - *stride = alloc_data.stride; - *handle = alloc_data.handle; - return ret; -} - -int ion_free(int fd, struct ion_handle *handle) -{ - struct ion_handle_data data = { - .handle = handle, - }; - return ion_ioctl(fd, ION_IOC_FREE, &data); -} - -int ion_map(int fd, struct ion_handle *handle, size_t length, int prot, - int flags, off_t offset, unsigned char **ptr, int *map_fd) -{ - struct ion_fd_data data = { - .handle = handle, - }; - int ret = ion_ioctl(fd, ION_IOC_MAP, &data); - if (ret < 0) - return ret; - *map_fd = data.fd; - if (*map_fd < 0) { - LOGE("map ioctl returned negative fd\n"); - return -EINVAL; - } - *ptr = mmap(NULL, length, prot, flags, *map_fd, offset); - if (*ptr == MAP_FAILED) { - LOGE("mmap failed: %s\n", strerror(errno)); - return -errno; - } - return ret; -} - -int ion_share(int fd, struct ion_handle *handle, int *share_fd) -{ - int map_fd; - struct ion_fd_data data = { - .handle = handle, - }; - int ret = ion_ioctl(fd, ION_IOC_SHARE, &data); - if (ret < 0) - return ret; - *share_fd = data.fd; - if (*share_fd < 0) { - LOGE("map ioctl returned negative fd\n"); - return -EINVAL; - } - return ret; -} - -int ion_import(int fd, int share_fd, struct ion_handle **handle) -{ - struct ion_fd_data data = { - .fd = share_fd, - }; - int ret = ion_ioctl(fd, ION_IOC_IMPORT, &data); - if (ret < 0) - return ret; - *handle = data.handle; - return ret; -} diff --git a/ion/ion.h b/ion/ion.h deleted file mode 100644 index 871b9bc..0000000 --- a/ion/ion.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * ion.c - * - * Memory Allocator functions for ion - * - * Copyright 2011 Google, Inc - * - * 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 <linux/ion.h> -#include <linux/omap_ion.h> - -int ion_open(); -int ion_close(int fd); -int ion_alloc(int fd, size_t len, size_t align, unsigned int flags, - struct ion_handle **handle); -int ion_alloc_tiler(int fd, size_t w, size_t h, int fmt, unsigned int flags, - struct ion_handle **handle, size_t *stride); -int ion_free(int fd, struct ion_handle *handle); -int ion_map(int fd, struct ion_handle *handle, size_t length, int prot, - int flags, off_t offset, unsigned char **ptr, int *map_fd); -int ion_share(int fd, struct ion_handle *handle, int *share_fd); -int ion_import(int fd, int share_fd, struct ion_handle **handle); - diff --git a/ion/ion_test.c b/ion/ion_test.c deleted file mode 100644 index 734caca..0000000 --- a/ion/ion_test.c +++ /dev/null @@ -1,321 +0,0 @@ -#include <errno.h> -#include <fcntl.h> -#include <getopt.h> -#include <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <sys/mman.h> -#include <sys/ioctl.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <unistd.h> - -#include "ion.h" -#include <linux/ion.h> -#include <linux/omap_ion.h> - -size_t len = 1024*1024, align = 0; -int prot = PROT_READ | PROT_WRITE; -int map_flags = MAP_SHARED; -int alloc_flags = 0; -int test = -1; -size_t width = 1024*1024, height = 1024*1024; -int fmt = TILER_PIXEL_FMT_32BIT; -int tiler_test = 0; -size_t stride; - -int _ion_alloc_test(int *fd, struct ion_handle **handle) -{ - int ret; - - *fd = ion_open(); - if (*fd < 0) - return *fd; - - if (tiler_test) - ret = ion_alloc_tiler(*fd, width, height, fmt, alloc_flags, - handle, &stride); - else - ret = ion_alloc(*fd, len, align, alloc_flags, handle); - - if (ret) - printf("%s failed: %s\n", __func__, strerror(ret)); - return ret; -} - -void ion_alloc_test() -{ - int fd, ret; - struct ion_handle *handle; - - if(_ion_alloc_test(&fd, &handle)) - return; - - ret = ion_free(fd, handle); - if (ret) { - printf("%s failed: %s %p\n", __func__, strerror(ret), handle); - return; - } - ion_close(fd); - printf("ion alloc test: passed\n"); -} - -void _ion_tiler_map_test(unsigned char *ptr) -{ - size_t row, col; - - for (row = 0; row < height; row++) - for (col = 0; col < width; col++) { - int i = (row * stride) + col; - ptr[i] = (unsigned char)i; - } - for (row = 0; row < height; row++) - for (col = 0; col < width; col++) { - int i = (row * stride) + col; - if (ptr[i] != (unsigned char)i) - printf("%s failed wrote %d read %d from mapped " - "memory\n", __func__, i, ptr[i]); - } -} - - -void ion_map_test() -{ - int fd, map_fd, ret; - size_t i; - struct ion_handle *handle; - unsigned char *ptr; - - if(_ion_alloc_test(&fd, &handle)) - return; - - if (tiler_test) - len = height * stride; - ret = ion_map(fd, handle, len, prot, map_flags, 0, &ptr, &map_fd); - if (ret) - return; - - if (tiler_test) - _ion_tiler_map_test(ptr); - else { - for (i = 0; i < len; i++) { - ptr[i] = (unsigned char)i; - } - for (i = 0; i < len; i++) - if (ptr[i] != (unsigned char)i) - printf("%s failed wrote %d read %d from mapped " - "memory\n", __func__, i, ptr[i]); - } - /* clean up properly */ - ret = ion_free(fd, handle); - ion_close(fd); - munmap(ptr, len); - close(map_fd); - - _ion_alloc_test(&fd, &handle); - close(fd); - -#if 0 - munmap(ptr, len); - close(map_fd); - ion_close(fd); - - _ion_alloc_test(len, align, flags, &fd, &handle); - close(map_fd); - ret = ion_map(fd, handle, len, prot, flags, 0, &ptr, &map_fd); - /* don't clean up */ -#endif -} - -void ion_share_test() - -{ - struct ion_handle *handle; - int sd[2]; - int num_fd = 1; - struct iovec count_vec = { - .iov_base = &num_fd, - .iov_len = sizeof num_fd, - }; - char buf[CMSG_SPACE(sizeof(int))]; - socketpair(AF_UNIX, SOCK_STREAM, 0, sd); - if (fork()) { - struct msghdr msg = { - .msg_control = buf, - .msg_controllen = sizeof buf, - .msg_iov = &count_vec, - .msg_iovlen = 1, - }; - - struct cmsghdr *cmsg; - int fd, share_fd, ret; - char *ptr; - /* parent */ - if(_ion_alloc_test(&fd, &handle)) - return; - ret = ion_share(fd, handle, &share_fd); - if (ret) - printf("share failed %s\n", strerror(errno)); - ptr = mmap(NULL, len, prot, map_flags, share_fd, 0); - if (ptr == MAP_FAILED) { - return; - } - strcpy(ptr, "master"); - cmsg = CMSG_FIRSTHDR(&msg); - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - cmsg->cmsg_len = CMSG_LEN(sizeof(int)); - *(int *)CMSG_DATA(cmsg) = share_fd; - /* send the fd */ - printf("master? [%10s] should be [master]\n", ptr); - printf("master sending msg 1\n"); - sendmsg(sd[0], &msg, 0); - if (recvmsg(sd[0], &msg, 0) < 0) - perror("master recv msg 2"); - printf("master? [%10s] should be [child]\n", ptr); - - /* send ping */ - sendmsg(sd[0], &msg, 0); - printf("master->master? [%10s]\n", ptr); - if (recvmsg(sd[0], &msg, 0) < 0) - perror("master recv 1"); - } else { - struct msghdr msg; - struct cmsghdr *cmsg; - char* ptr; - int fd, recv_fd; - char* child_buf[100]; - /* child */ - struct iovec count_vec = { - .iov_base = child_buf, - .iov_len = sizeof child_buf, - }; - - struct msghdr child_msg = { - .msg_control = buf, - .msg_controllen = sizeof buf, - .msg_iov = &count_vec, - .msg_iovlen = 1, - }; - - if (recvmsg(sd[1], &child_msg, 0) < 0) - perror("child recv msg 1"); - cmsg = CMSG_FIRSTHDR(&child_msg); - if (cmsg == NULL) { - printf("no cmsg rcvd in child"); - return; - } - recv_fd = *(int*)CMSG_DATA(cmsg); - if (recv_fd < 0) { - printf("could not get recv_fd from socket"); - return; - } - printf("child %d\n", recv_fd); - fd = ion_open(); - ptr = mmap(NULL, len, prot, map_flags, recv_fd, 0); - if (ptr == MAP_FAILED) { - return; - } - printf("child? [%10s] should be [master]\n", ptr); - strcpy(ptr, "child"); - printf("child sending msg 2\n"); - sendmsg(sd[1], &child_msg, 0); - } -} - -int main(int argc, char* argv[]) { - int c; - enum tests { - ALLOC_TEST = 0, MAP_TEST, SHARE_TEST, - }; - - while (1) { - static struct option opts[] = { - {"alloc", no_argument, 0, 'a'}, - {"alloc_flags", required_argument, 0, 'f'}, - {"map", no_argument, 0, 'm'}, - {"share", no_argument, 0, 's'}, - {"len", required_argument, 0, 'l'}, - {"align", required_argument, 0, 'g'}, - {"map_flags", required_argument, 0, 'z'}, - {"prot", required_argument, 0, 'p'}, - {"alloc_tiler", no_argument, 0, 't'}, - {"width", required_argument, 0, 'w'}, - {"height", required_argument, 0, 'h'}, - {"fmt", required_argument, 0, 'r'}, - }; - int i = 0; - c = getopt_long(argc, argv, "af:h:l:mr:stw:", opts, &i); - if (c == -1) - break; - - switch (c) { - case 'l': - len = atol(optarg); - break; - case 'g': - align = atol(optarg); - break; - case 'z': - map_flags = 0; - map_flags |= strstr(optarg, "PROT_EXEC") ? - PROT_EXEC : 0; - map_flags |= strstr(optarg, "PROT_READ") ? - PROT_READ: 0; - map_flags |= strstr(optarg, "PROT_WRITE") ? - PROT_WRITE: 0; - map_flags |= strstr(optarg, "PROT_NONE") ? - PROT_NONE: 0; - break; - case 'p': - prot = 0; - prot |= strstr(optarg, "MAP_PRIVATE") ? - MAP_PRIVATE : 0; - prot |= strstr(optarg, "MAP_SHARED") ? - MAP_PRIVATE : 0; - break; - case 'f': - alloc_flags = atol(optarg); - break; - case 'a': - test = ALLOC_TEST; - break; - case 'm': - test = MAP_TEST; - break; - case 'r': - fmt = atol(optarg); - break; - case 's': - test = SHARE_TEST; - break; - case 'w': - width = atol(optarg); - break; - case 'h': - height = atol(optarg); - break; - case 't': - tiler_test = 1; - break; - } - } - printf("test %d, len %u, width %u, height %u fmt %u align %u, " - "map_flags %d, prot %d, alloc_flags %d\n", test, len, width, - height, fmt, align, map_flags, prot, alloc_flags); - switch (test) { - case ALLOC_TEST: - ion_alloc_test(); - break; - case MAP_TEST: - ion_map_test(); - break; - case SHARE_TEST: - ion_share_test(); - break; - default: - printf("must specify a test (alloc, map, share)\n"); - } - return 0; -} diff --git a/kernel-headers/linux/omapfb.h b/kernel-headers/linux/omapfb.h new file mode 100644 index 0000000..08ab25e --- /dev/null +++ b/kernel-headers/linux/omapfb.h @@ -0,0 +1,231 @@ +/**************************************************************************** + **************************************************************************** + *** + *** 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_OMAPFB_H__ +#define __LINUX_OMAPFB_H__ +#include <linux/fb.h> +#include <linux/ioctl.h> +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#include <linux/types.h> +#define OMAP_IOW(num, dtype) _IOW('O', num, dtype) +#define OMAP_IOR(num, dtype) _IOR('O', num, dtype) +#define OMAP_IOWR(num, dtype) _IOWR('O', num, dtype) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAP_IO(num) _IO('O', num) +#define OMAPFB_MIRROR OMAP_IOW(31, int) +#define OMAPFB_SYNC_GFX OMAP_IO(37) +#define OMAPFB_VSYNC OMAP_IO(38) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAPFB_SET_UPDATE_MODE OMAP_IOW(40, int) +#define OMAPFB_GET_CAPS OMAP_IOR(42, struct omapfb_caps) +#define OMAPFB_GET_UPDATE_MODE OMAP_IOW(43, int) +#define OMAPFB_LCD_TEST OMAP_IOW(45, int) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAPFB_CTRL_TEST OMAP_IOW(46, int) +#define OMAPFB_UPDATE_WINDOW_OLD OMAP_IOW(47, struct omapfb_update_window_old) +#define OMAPFB_SET_COLOR_KEY OMAP_IOW(50, struct omapfb_color_key) +#define OMAPFB_GET_COLOR_KEY OMAP_IOW(51, struct omapfb_color_key) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAPFB_SETUP_PLANE OMAP_IOW(52, struct omapfb_plane_info) +#define OMAPFB_QUERY_PLANE OMAP_IOW(53, struct omapfb_plane_info) +#define OMAPFB_UPDATE_WINDOW OMAP_IOW(54, struct omapfb_update_window) +#define OMAPFB_SETUP_MEM OMAP_IOW(55, struct omapfb_mem_info) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAPFB_QUERY_MEM OMAP_IOW(56, struct omapfb_mem_info) +#define OMAPFB_WAITFORVSYNC OMAP_IO(57) +#define OMAPFB_MEMORY_READ OMAP_IOR(58, struct omapfb_memory_read) +#define OMAPFB_GET_OVERLAY_COLORMODE OMAP_IOR(59, struct omapfb_ovl_colormode) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAPFB_WAITFORGO OMAP_IO(60) +#define OMAPFB_GET_VRAM_INFO OMAP_IOR(61, struct omapfb_vram_info) +#define OMAPFB_SET_TEARSYNC OMAP_IOW(62, struct omapfb_tearsync_info) +#define OMAPFB_GET_DISPLAY_INFO OMAP_IOR(63, struct omapfb_display_info) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAPFB_ENABLEVSYNC OMAP_IOW(64, int) +#define OMAPFB_CAPS_GENERIC_MASK 0x00000fff +#define OMAPFB_CAPS_LCDC_MASK 0x00fff000 +#define OMAPFB_CAPS_PANEL_MASK 0xff000000 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAPFB_CAPS_MANUAL_UPDATE 0x00001000 +#define OMAPFB_CAPS_TEARSYNC 0x00002000 +#define OMAPFB_CAPS_PLANE_RELOCATE_MEM 0x00004000 +#define OMAPFB_CAPS_PLANE_SCALE 0x00008000 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE 0x00010000 +#define OMAPFB_CAPS_WINDOW_SCALE 0x00020000 +#define OMAPFB_CAPS_WINDOW_OVERLAY 0x00040000 +#define OMAPFB_CAPS_WINDOW_ROTATE 0x00080000 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAPFB_CAPS_SET_BACKLIGHT 0x01000000 +#define OMAPFB_FORMAT_MASK 0x00ff +#define OMAPFB_FORMAT_FLAG_DOUBLE 0x0100 +#define OMAPFB_FORMAT_FLAG_TEARSYNC 0x0200 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAPFB_FORMAT_FLAG_FORCE_VSYNC 0x0400 +#define OMAPFB_FORMAT_FLAG_ENABLE_OVERLAY 0x0800 +#define OMAPFB_FORMAT_FLAG_DISABLE_OVERLAY 0x1000 +#define OMAPFB_MEMTYPE_SDRAM 0 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define OMAPFB_MEMTYPE_SRAM 1 +#define OMAPFB_MEMTYPE_MAX 1 +#define OMAPFB_MEM_IDX_ENABLED 0x80 +#define OMAPFB_MEM_IDX_MASK 0x7f +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum omapfb_color_format { + OMAPFB_COLOR_RGB565 = 0, + OMAPFB_COLOR_YUV422, + OMAPFB_COLOR_YUV420, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + OMAPFB_COLOR_CLUT_8BPP, + OMAPFB_COLOR_CLUT_4BPP, + OMAPFB_COLOR_CLUT_2BPP, + OMAPFB_COLOR_CLUT_1BPP, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + OMAPFB_COLOR_RGB444, + OMAPFB_COLOR_YUY422, + OMAPFB_COLOR_ARGB16, + OMAPFB_COLOR_RGB24U, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + OMAPFB_COLOR_RGB24P, + OMAPFB_COLOR_ARGB32, + OMAPFB_COLOR_RGBA32, + OMAPFB_COLOR_RGBX32, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct omapfb_update_window { + __u32 x, y; + __u32 width, height; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 format; + __u32 out_x, out_y; + __u32 out_width, out_height; + __u32 reserved[8]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct omapfb_update_window_old { + __u32 x, y; + __u32 width, height; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 format; +}; +enum omapfb_plane { + OMAPFB_PLANE_GFX = 0, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + OMAPFB_PLANE_VID1, + OMAPFB_PLANE_VID2, +}; +enum omapfb_channel_out { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + OMAPFB_CHANNEL_OUT_LCD = 0, + OMAPFB_CHANNEL_OUT_DIGIT, +}; +struct omapfb_plane_info { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 pos_x; + __u32 pos_y; + __u8 enabled; + __u8 channel_out; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u8 mirror; + __u8 mem_idx; + __u32 out_width; + __u32 out_height; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 reserved2[12]; +}; +struct omapfb_mem_info { + __u32 size; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u8 type; + __u8 reserved[3]; +}; +struct omapfb_caps { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 ctrl; + __u32 plane_color; + __u32 wnd_color; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +enum omapfb_color_key_type { + OMAPFB_COLOR_KEY_DISABLED = 0, + OMAPFB_COLOR_KEY_GFX_DST, + OMAPFB_COLOR_KEY_VID_SRC, +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +struct omapfb_color_key { + __u8 channel_out; + __u32 background; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 trans_key; + __u8 key_type; +}; +enum omapfb_update_mode { +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + OMAPFB_UPDATE_DISABLED = 0, + OMAPFB_AUTO_UPDATE, + OMAPFB_MANUAL_UPDATE +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct omapfb_memory_read { + __u16 x; + __u16 y; + __u16 w; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u16 h; + size_t buffer_size; + void __user *buffer; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct omapfb_ovl_colormode { + __u8 overlay_idx; + __u8 mode_idx; + __u32 bits_per_pixel; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 nonstd; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + struct fb_bitfield transp; +}; +struct omapfb_vram_info { + __u32 total; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u32 free; + __u32 largest_free_block; + __u32 reserved[5]; +}; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct omapfb_tearsync_info { + __u8 enabled; + __u8 reserved1[3]; + __u16 line; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u16 reserved2; +}; +struct omapfb_display_info { + __u16 xres; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + __u16 yres; + __u32 width; + __u32 height; + __u32 reserved[5]; +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; +#endif + diff --git a/libI420colorconvert/Android.mk b/libI420colorconvert/Android.mk index ec54d31..aa792ba 100644 --- a/libI420colorconvert/Android.mk +++ b/libI420colorconvert/Android.mk @@ -7,8 +7,8 @@ LOCAL_SRC_FILES := \ ColorConvert.cpp LOCAL_C_INCLUDES:= \ - $(TOP)/frameworks/base/include/media/stagefright/openmax \ - $(TOP)/frameworks/media/libvideoeditor/include + $(TOP)/frameworks/native/include/media/openmax \ + $(TOP)/frameworks/native/include/media/editor LOCAL_SHARED_LIBRARIES := \ diff --git a/libI420colorconvert/ColorConvert.cpp b/libI420colorconvert/ColorConvert.cpp index 05194d2..7f9d93d 100644 --- a/libI420colorconvert/ColorConvert.cpp +++ b/libI420colorconvert/ColorConvert.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "II420ColorConverter.h" +#include <II420ColorConverter.h> #include <OMX_IVCommon.h> #include <string.h> diff --git a/libdrmdecrypt/Android.mk b/libdrmdecrypt/Android.mk new file mode 100644 index 0000000..d6fc4a6 --- /dev/null +++ b/libdrmdecrypt/Android.mk @@ -0,0 +1,25 @@ +ifeq ($(TARGET_BOARD_PLATFORM),omap4) + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +-include $(TOP)/vendor/widevine/proprietary/cryptoPlugin/decrypt-core.mk + +LOCAL_C_INCLUDES:= \ + $(TOP)/frameworks/native/include/media/hardware \ + $(TOP)/vendor/widevine/proprietary/cryptoPlugin \ + +LOCAL_STATIC_LIBRARIES += \ + libtee_client_api_driver \ + +LOCAL_SHARED_LIBRARIES := \ + libstagefright_foundation \ + liblog \ + +LOCAL_MODULE := libdrmdecrypt + +LOCAL_MODULE_TAGS := optional + +include $(BUILD_SHARED_LIBRARY) + +endif diff --git a/libstagefrighthw/Android.mk b/libstagefrighthw/Android.mk index c1757f2..cf18f69 100644 --- a/libstagefrighthw/Android.mk +++ b/libstagefrighthw/Android.mk @@ -7,7 +7,8 @@ LOCAL_SRC_FILES := \ TIOMXPlugin.cpp LOCAL_C_INCLUDES:= \ - $(TOP)/frameworks/base/include/media/stagefright/openmax + $(TOP)/frameworks/native/include/media/openmax \ + $(TOP)/frameworks/native/include/media/hardware LOCAL_SHARED_LIBRARIES := \ libbinder \ diff --git a/libstagefrighthw/TIOMXPlugin.cpp b/libstagefrighthw/TIOMXPlugin.cpp index 14c5e91..bd97b77 100644 --- a/libstagefrighthw/TIOMXPlugin.cpp +++ b/libstagefrighthw/TIOMXPlugin.cpp @@ -18,8 +18,7 @@ #include <dlfcn.h> -#include <media/stagefright/HardwareAPI.h> -#include <media/stagefright/MediaDebug.h> +#include <HardwareAPI.h> namespace android { @@ -43,7 +42,7 @@ TIOMXPlugin::TIOMXPlugin() mGetRolesOfComponentHandle(NULL) { if (mLibHandle != NULL) { mInit = (InitFunc)dlsym(mLibHandle, "TIOMX_Init"); - mDeinit = (DeinitFunc)dlsym(mLibHandle, "TIOMX_DeInit"); + mDeinit = (DeinitFunc)dlsym(mLibHandle, "TIOMX_Deinit"); mComponentNameEnum = (ComponentNameEnumFunc)dlsym(mLibHandle, "TIOMX_ComponentNameEnum"); @@ -58,7 +57,7 @@ TIOMXPlugin::TIOMXPlugin() (*mInit)(); } else - LOGE("%s: failed to load %s", __func__, LIBOMX); + ALOGE("%s: failed to load %s", __func__, LIBOMX); } TIOMXPlugin::~TIOMXPlugin() { @@ -99,7 +98,7 @@ OMX_ERRORTYPE TIOMXPlugin::enumerateComponents( size_t size, OMX_U32 index) { if (mLibHandle == NULL) { - LOGE("mLibHandle is NULL!"); + ALOGE("mLibHandle is NULL!"); return OMX_ErrorUndefined; } @@ -132,11 +131,11 @@ OMX_ERRORTYPE TIOMXPlugin::getRolesOfComponent( err = (*mGetRolesOfComponentHandle)( const_cast<OMX_STRING>(name), &numRoles, array); - CHECK_EQ(err, OMX_ErrorNone); - for (OMX_U32 i = 0; i < numRoles; ++i) { - String8 s((const char *)array[i]); - roles->push(s); + if (err == OMX_ErrorNone) { + String8 s((const char *)array[i]); + roles->push(s); + } delete[] array[i]; array[i] = NULL; @@ -146,7 +145,7 @@ OMX_ERRORTYPE TIOMXPlugin::getRolesOfComponent( array = NULL; } - return OMX_ErrorNone; + return err; } } // namespace android diff --git a/libstagefrighthw/TIOMXPlugin.h b/libstagefrighthw/TIOMXPlugin.h index 668c5ef..7b2e982 100644 --- a/libstagefrighthw/TIOMXPlugin.h +++ b/libstagefrighthw/TIOMXPlugin.h @@ -18,7 +18,7 @@ #define TI_OMX_PLUGIN_H_ -#include <media/stagefright/OMXPluginBase.h> +#include <OMXPluginBase.h> namespace android { diff --git a/libtiutils/Android.mk b/libtiutils/Android.mk index 4b6a2b3..e15eba9 100755..100644 --- a/libtiutils/Android.mk +++ b/libtiutils/Android.mk @@ -19,7 +19,6 @@ LOCAL_SHARED_LIBRARIES:= \ libcutils LOCAL_C_INCLUDES += \ - frameworks/base/include/utils \ bionic/libc/include \ hardware/ti/omap4xxx/domx/omx_core/inc \ hardware/ti/omap4xxx/domx/mm_osal/inc diff --git a/libtiutils/DebugUtils.h b/libtiutils/DebugUtils.h index 54edfc7..f421252 100644 --- a/libtiutils/DebugUtils.h +++ b/libtiutils/DebugUtils.h @@ -20,14 +20,14 @@ #define DEBUG_UTILS_H ///Defines for debug statements - Macro LOG_TAG needs to be defined in the respective files -#define DBGUTILS_LOGVA(str) LOGV("%s:%d %s - " str,__FILE__, __LINE__,__FUNCTION__); -#define DBGUTILS_LOGVB(str,...) LOGV("%s:%d %s - " str,__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); -#define DBGUTILS_LOGDA(str) LOGD("%s:%d %s - " str,__FILE__, __LINE__,__FUNCTION__); -#define DBGUTILS_LOGDB(str, ...) LOGD("%s:%d %s - " str,__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); -#define DBGUTILS_LOGEA(str) LOGE("%s:%d %s - " str,__FILE__, __LINE__, __FUNCTION__); -#define DBGUTILS_LOGEB(str, ...) LOGE("%s:%d %s - " str,__FILE__, __LINE__,__FUNCTION__, __VA_ARGS__); -#define LOG_FUNCTION_NAME LOGV("%d: %s() ENTER", __LINE__, __FUNCTION__); -#define LOG_FUNCTION_NAME_EXIT LOGV("%d: %s() EXIT", __LINE__, __FUNCTION__); +#define DBGUTILS_LOGVA(str) ALOGV("%s:%d %s - " str,__FILE__, __LINE__,__FUNCTION__); +#define DBGUTILS_LOGVB(str,...) ALOGV("%s:%d %s - " str,__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); +#define DBGUTILS_LOGDA(str) ALOGD("%s:%d %s - " str,__FILE__, __LINE__,__FUNCTION__); +#define DBGUTILS_LOGDB(str, ...) ALOGD("%s:%d %s - " str,__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); +#define DBGUTILS_LOGEA(str) ALOGE("%s:%d %s - " str,__FILE__, __LINE__, __FUNCTION__); +#define DBGUTILS_LOGEB(str, ...) ALOGE("%s:%d %s - " str,__FILE__, __LINE__,__FUNCTION__, __VA_ARGS__); +#define LOG_FUNCTION_NAME ALOGV("%d: %s() ENTER", __LINE__, __FUNCTION__); +#define LOG_FUNCTION_NAME_EXIT ALOGV("%d: %s() EXIT", __LINE__, __FUNCTION__); diff --git a/libtiutils/ErrorUtils.h b/libtiutils/ErrorUtils.h index 24dd806..204ec97 100644 --- a/libtiutils/ErrorUtils.h +++ b/libtiutils/ErrorUtils.h @@ -18,7 +18,7 @@ #define ERROR_UTILS_H ///Header file where all the android error codes are defined -#include <Errors.h> +#include <utils/Errors.h> ///Header file where all the OMX error codes are defined #include "OMX_Core.h" diff --git a/libtiutils/MessageQueue.cpp b/libtiutils/MessageQueue.cpp index 11f5407..e3647d4 100755..100644 --- a/libtiutils/MessageQueue.cpp +++ b/libtiutils/MessageQueue.cpp @@ -20,7 +20,7 @@ #include <sys/types.h> #include <sys/poll.h> #include <unistd.h> -#include <Errors.h> +#include <utils/Errors.h> diff --git a/libtiutils/MessageQueue.h b/libtiutils/MessageQueue.h index 6d05201..6d05201 100755..100644 --- a/libtiutils/MessageQueue.h +++ b/libtiutils/MessageQueue.h diff --git a/libtiutils/Semaphore.cpp b/libtiutils/Semaphore.cpp index 41fa99c..37f3a89 100644 --- a/libtiutils/Semaphore.cpp +++ b/libtiutils/Semaphore.cpp @@ -1,232 +1,232 @@ -/*
- * Copyright (C) Texas Instruments - http://www.ti.com/
- *
- * 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 "Semaphore.h"
-#include "ErrorUtils.h"
-#include <utils/Log.h>
-#include <time.h>
-
-namespace android {
-
-/**
- @brief Constructor for the semaphore class
-
- @param none
- @return none
- */
-Semaphore::Semaphore()
-{
- ///Initialize the semaphore to NULL
- mSemaphore = NULL;
-}
-
-/**
- @brief Destructor of the semaphore class
-
- @param none
- @return none
-
- */
-Semaphore::~Semaphore()
-{
- Release();
-}
-
-/**
- @brief: Releases semaphore
-
- @param count >=0
- @return NO_ERROR On Success
- @return One of the android error codes based on semaphore de-initialization
- */
-
-status_t Semaphore::Release()
-{
- int status = 0;
-
- ///Destroy only if the semaphore has been created
- if(mSemaphore)
- {
- status = sem_destroy(mSemaphore);
-
- free(mSemaphore);
-
- mSemaphore = NULL;
- }
-
- ///Initialize the semaphore and return the status
- return ErrorUtils::posixToAndroidError(status);
-
-}
-
-/**
- @brief Create the semaphore with initial count value
-
- @param count >=0
- @return NO_ERROR On Success
- @return NO_MEMORY If unable to allocate memory for the semaphore
- @return BAD_VALUE If an invalid count value is passed (<0)
- @return One of the android error codes based on semaphore initialization
- */
-
-status_t Semaphore::Create(int count)
-{
- status_t ret = NO_ERROR;
-
- ///count cannot be less than zero
- if(count<0)
- {
- return BAD_VALUE;
- }
-
- ret = Release();
- if ( NO_ERROR != ret )
- {
- return ret;
- }
-
- ///allocate memory for the semaphore
- mSemaphore = (sem_t*)malloc(sizeof(sem_t)) ;
-
- ///if memory is unavailable, return error
- if(!mSemaphore)
- {
- return NO_MEMORY;
- }
-
- ///Initialize the semaphore and return the status
- return ErrorUtils::posixToAndroidError(sem_init(mSemaphore, 0x00, count));
-
-}
-
-/**
- @brief Wait operation
-
- @param none
- @return BAD_VALUE if the semaphore is not initialized
- @return NO_ERROR On success
- @return One of the android error codes based on semaphore wait operation
- */
-status_t Semaphore::Wait()
-{
- ///semaphore should have been created first
- if(!mSemaphore)
- {
- return BAD_VALUE;
- }
-
- ///Wait and return the status after signalling
- return ErrorUtils::posixToAndroidError(sem_wait(mSemaphore));
-
-
-}
-
-
-/**
- @brief Signal operation
-
- @param none
- @return BAD_VALUE if the semaphore is not initialized
- @return NO_ERROR On success
- @return One of the android error codes based on semaphore signal operation
- */
-
-status_t Semaphore::Signal()
-{
- ///semaphore should have been created first
- if(!mSemaphore)
- {
- return BAD_VALUE;
- }
-
- ///Post to the semaphore
- return ErrorUtils::posixToAndroidError(sem_post(mSemaphore));
-
-}
-
-/**
- @brief Current semaphore count
-
- @param none
- @return Current count value of the semaphore
- */
-int Semaphore::Count()
-{
- int val;
-
- ///semaphore should have been created first
- if(!mSemaphore)
- {
- return BAD_VALUE;
- }
-
- ///get the value of the semaphore
- sem_getvalue(mSemaphore, &val);
-
- return val;
-}
-
-/**
- @brief Wait operation with a timeout
-
- @param timeoutMicroSecs The timeout period in micro seconds
- @return BAD_VALUE if the semaphore is not initialized
- @return NO_ERROR On success
- @return One of the android error codes based on semaphore wait operation
- */
-
-status_t Semaphore::WaitTimeout(int timeoutMicroSecs)
-{
- status_t ret = NO_ERROR;
-
- struct timespec timeSpec;
- struct timeval currentTime;
-
- ///semaphore should have been created first
- if( NULL == mSemaphore)
- {
- ret = BAD_VALUE;
- }
-
- if ( NO_ERROR == ret )
- {
-
- ///setup the timeout values - timeout is specified in seconds and nanoseconds
- gettimeofday(¤tTime, NULL);
- timeSpec.tv_sec = currentTime.tv_sec;
- timeSpec.tv_nsec = currentTime.tv_usec * 1000;
- timeSpec.tv_sec += ( timeoutMicroSecs / 1000000 );
- timeSpec.tv_nsec += ( timeoutMicroSecs % 1000000) * 1000;
-
- ///Wait for the timeout or signal and return the result based on whichever event occurred first
- ret = sem_timedwait(mSemaphore, &timeSpec);
- }
-
- if ( NO_ERROR != ret )
- {
- Signal();
- Create(0);
- }
-
- return ret;
-}
-
-
-};
-
-
+/* + * Copyright (C) Texas Instruments - http://www.ti.com/ + * + * 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 "Semaphore.h" +#include "ErrorUtils.h" +#include <utils/Log.h> +#include <time.h> + +namespace android { + +/** + @brief Constructor for the semaphore class + + @param none + @return none + */ +Semaphore::Semaphore() +{ + ///Initialize the semaphore to NULL + mSemaphore = NULL; +} + +/** + @brief Destructor of the semaphore class + + @param none + @return none + + */ +Semaphore::~Semaphore() +{ + Release(); +} + +/** + @brief: Releases semaphore + + @param count >=0 + @return NO_ERROR On Success + @return One of the android error codes based on semaphore de-initialization + */ + +status_t Semaphore::Release() +{ + int status = 0; + + ///Destroy only if the semaphore has been created + if(mSemaphore) + { + status = sem_destroy(mSemaphore); + + free(mSemaphore); + + mSemaphore = NULL; + } + + ///Initialize the semaphore and return the status + return ErrorUtils::posixToAndroidError(status); + +} + +/** + @brief Create the semaphore with initial count value + + @param count >=0 + @return NO_ERROR On Success + @return NO_MEMORY If unable to allocate memory for the semaphore + @return BAD_VALUE If an invalid count value is passed (<0) + @return One of the android error codes based on semaphore initialization + */ + +status_t Semaphore::Create(int count) +{ + status_t ret = NO_ERROR; + + ///count cannot be less than zero + if(count<0) + { + return BAD_VALUE; + } + + ret = Release(); + if ( NO_ERROR != ret ) + { + return ret; + } + + ///allocate memory for the semaphore + mSemaphore = (sem_t*)malloc(sizeof(sem_t)) ; + + ///if memory is unavailable, return error + if(!mSemaphore) + { + return NO_MEMORY; + } + + ///Initialize the semaphore and return the status + return ErrorUtils::posixToAndroidError(sem_init(mSemaphore, 0x00, count)); + +} + +/** + @brief Wait operation + + @param none + @return BAD_VALUE if the semaphore is not initialized + @return NO_ERROR On success + @return One of the android error codes based on semaphore wait operation + */ +status_t Semaphore::Wait() +{ + ///semaphore should have been created first + if(!mSemaphore) + { + return BAD_VALUE; + } + + ///Wait and return the status after signalling + return ErrorUtils::posixToAndroidError(sem_wait(mSemaphore)); + + +} + + +/** + @brief Signal operation + + @param none + @return BAD_VALUE if the semaphore is not initialized + @return NO_ERROR On success + @return One of the android error codes based on semaphore signal operation + */ + +status_t Semaphore::Signal() +{ + ///semaphore should have been created first + if(!mSemaphore) + { + return BAD_VALUE; + } + + ///Post to the semaphore + return ErrorUtils::posixToAndroidError(sem_post(mSemaphore)); + +} + +/** + @brief Current semaphore count + + @param none + @return Current count value of the semaphore + */ +int Semaphore::Count() +{ + int val; + + ///semaphore should have been created first + if(!mSemaphore) + { + return BAD_VALUE; + } + + ///get the value of the semaphore + sem_getvalue(mSemaphore, &val); + + return val; +} + +/** + @brief Wait operation with a timeout + + @param timeoutMicroSecs The timeout period in micro seconds + @return BAD_VALUE if the semaphore is not initialized + @return NO_ERROR On success + @return One of the android error codes based on semaphore wait operation + */ + +status_t Semaphore::WaitTimeout(int timeoutMicroSecs) +{ + status_t ret = NO_ERROR; + + struct timespec timeSpec; + struct timeval currentTime; + + ///semaphore should have been created first + if( NULL == mSemaphore) + { + ret = BAD_VALUE; + } + + if ( NO_ERROR == ret ) + { + + ///setup the timeout values - timeout is specified in seconds and nanoseconds + gettimeofday(¤tTime, NULL); + timeSpec.tv_sec = currentTime.tv_sec; + timeSpec.tv_nsec = currentTime.tv_usec * 1000; + timeSpec.tv_sec += ( timeoutMicroSecs / 1000000 ); + timeSpec.tv_nsec += ( timeoutMicroSecs % 1000000) * 1000; + + ///Wait for the timeout or signal and return the result based on whichever event occurred first + ret = sem_timedwait(mSemaphore, &timeSpec); + } + + if ( NO_ERROR != ret ) + { + Signal(); + Create(0); + } + + return ret; +} + + +}; + + diff --git a/libtiutils/Semaphore.h b/libtiutils/Semaphore.h index 466e709..6990848 100644 --- a/libtiutils/Semaphore.h +++ b/libtiutils/Semaphore.h @@ -16,7 +16,7 @@ -#include <Errors.h> +#include <utils/Errors.h> #include <semaphore.h> #include <stdio.h> #include <stdarg.h> @@ -24,6 +24,7 @@ PRODUCT_PACKAGES := \ libOMX.TI.DUCATI1.VIDEO.DECODER.secure \ libOMX.TI.DUCATI1.VIDEO.CAMERA \ libOMX.TI.DUCATI1.MISC.SAMPLE \ + libdrmdecrypt \ libstagefrighthw \ libI420colorconvert \ libtiutils \ @@ -33,5 +34,7 @@ PRODUCT_PACKAGES := \ libomxcameraadapter \ hwcomposer.omap4 \ smc_pa_ctrl \ - tf_daemon + tf_daemon \ + libtf_crypto_sst +PRODUCT_VENDOR_KERNEL_HEADERS := hardware/ti/omap4xxx/kernel-headers diff --git a/original-kernel-headers/linux/omapfb.h b/original-kernel-headers/linux/omapfb.h new file mode 100644 index 0000000..80c5dc6 --- /dev/null +++ b/original-kernel-headers/linux/omapfb.h @@ -0,0 +1,274 @@ +/* + * File: include/linux/omapfb.h + * + * Framebuffer driver for TI OMAP boards + * + * Copyright (C) 2004 Nokia Corporation + * Author: Imre Deak <imre.deak@nokia.com> + * + * 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __LINUX_OMAPFB_H__ +#define __LINUX_OMAPFB_H__ + +#include <linux/fb.h> +#include <linux/ioctl.h> +#include <linux/types.h> + +/* IOCTL commands. */ + +#define OMAP_IOW(num, dtype) _IOW('O', num, dtype) +#define OMAP_IOR(num, dtype) _IOR('O', num, dtype) +#define OMAP_IOWR(num, dtype) _IOWR('O', num, dtype) +#define OMAP_IO(num) _IO('O', num) + +#define OMAPFB_MIRROR OMAP_IOW(31, int) +#define OMAPFB_SYNC_GFX OMAP_IO(37) +#define OMAPFB_VSYNC OMAP_IO(38) +#define OMAPFB_SET_UPDATE_MODE OMAP_IOW(40, int) +#define OMAPFB_GET_CAPS OMAP_IOR(42, struct omapfb_caps) +#define OMAPFB_GET_UPDATE_MODE OMAP_IOW(43, int) +#define OMAPFB_LCD_TEST OMAP_IOW(45, int) +#define OMAPFB_CTRL_TEST OMAP_IOW(46, int) +#define OMAPFB_UPDATE_WINDOW_OLD OMAP_IOW(47, struct omapfb_update_window_old) +#define OMAPFB_SET_COLOR_KEY OMAP_IOW(50, struct omapfb_color_key) +#define OMAPFB_GET_COLOR_KEY OMAP_IOW(51, struct omapfb_color_key) +#define OMAPFB_SETUP_PLANE OMAP_IOW(52, struct omapfb_plane_info) +#define OMAPFB_QUERY_PLANE OMAP_IOW(53, struct omapfb_plane_info) +#define OMAPFB_UPDATE_WINDOW OMAP_IOW(54, struct omapfb_update_window) +#define OMAPFB_SETUP_MEM OMAP_IOW(55, struct omapfb_mem_info) +#define OMAPFB_QUERY_MEM OMAP_IOW(56, struct omapfb_mem_info) +#define OMAPFB_WAITFORVSYNC OMAP_IO(57) +#define OMAPFB_MEMORY_READ OMAP_IOR(58, struct omapfb_memory_read) +#define OMAPFB_GET_OVERLAY_COLORMODE OMAP_IOR(59, struct omapfb_ovl_colormode) +#define OMAPFB_WAITFORGO OMAP_IO(60) +#define OMAPFB_GET_VRAM_INFO OMAP_IOR(61, struct omapfb_vram_info) +#define OMAPFB_SET_TEARSYNC OMAP_IOW(62, struct omapfb_tearsync_info) +#define OMAPFB_GET_DISPLAY_INFO OMAP_IOR(63, struct omapfb_display_info) +#define OMAPFB_ENABLEVSYNC OMAP_IOW(64, int) + +#define OMAPFB_CAPS_GENERIC_MASK 0x00000fff +#define OMAPFB_CAPS_LCDC_MASK 0x00fff000 +#define OMAPFB_CAPS_PANEL_MASK 0xff000000 + +#define OMAPFB_CAPS_MANUAL_UPDATE 0x00001000 +#define OMAPFB_CAPS_TEARSYNC 0x00002000 +#define OMAPFB_CAPS_PLANE_RELOCATE_MEM 0x00004000 +#define OMAPFB_CAPS_PLANE_SCALE 0x00008000 +#define OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE 0x00010000 +#define OMAPFB_CAPS_WINDOW_SCALE 0x00020000 +#define OMAPFB_CAPS_WINDOW_OVERLAY 0x00040000 +#define OMAPFB_CAPS_WINDOW_ROTATE 0x00080000 +#define OMAPFB_CAPS_SET_BACKLIGHT 0x01000000 + +/* Values from DSP must map to lower 16-bits */ +#define OMAPFB_FORMAT_MASK 0x00ff +#define OMAPFB_FORMAT_FLAG_DOUBLE 0x0100 +#define OMAPFB_FORMAT_FLAG_TEARSYNC 0x0200 +#define OMAPFB_FORMAT_FLAG_FORCE_VSYNC 0x0400 +#define OMAPFB_FORMAT_FLAG_ENABLE_OVERLAY 0x0800 +#define OMAPFB_FORMAT_FLAG_DISABLE_OVERLAY 0x1000 + +#define OMAPFB_MEMTYPE_SDRAM 0 +#define OMAPFB_MEMTYPE_SRAM 1 +#define OMAPFB_MEMTYPE_MAX 1 + +#define OMAPFB_MEM_IDX_ENABLED 0x80 +#define OMAPFB_MEM_IDX_MASK 0x7f + +enum omapfb_color_format { + OMAPFB_COLOR_RGB565 = 0, + OMAPFB_COLOR_YUV422, + OMAPFB_COLOR_YUV420, + OMAPFB_COLOR_CLUT_8BPP, + OMAPFB_COLOR_CLUT_4BPP, + OMAPFB_COLOR_CLUT_2BPP, + OMAPFB_COLOR_CLUT_1BPP, + OMAPFB_COLOR_RGB444, + OMAPFB_COLOR_YUY422, + + OMAPFB_COLOR_ARGB16, + OMAPFB_COLOR_RGB24U, /* RGB24, 32-bit container */ + OMAPFB_COLOR_RGB24P, /* RGB24, 24-bit container */ + OMAPFB_COLOR_ARGB32, + OMAPFB_COLOR_RGBA32, + OMAPFB_COLOR_RGBX32, +}; + +struct omapfb_update_window { + __u32 x, y; + __u32 width, height; + __u32 format; + __u32 out_x, out_y; + __u32 out_width, out_height; + __u32 reserved[8]; +}; + +struct omapfb_update_window_old { + __u32 x, y; + __u32 width, height; + __u32 format; +}; + +enum omapfb_plane { + OMAPFB_PLANE_GFX = 0, + OMAPFB_PLANE_VID1, + OMAPFB_PLANE_VID2, +}; + +enum omapfb_channel_out { + OMAPFB_CHANNEL_OUT_LCD = 0, + OMAPFB_CHANNEL_OUT_DIGIT, +}; + +struct omapfb_plane_info { + __u32 pos_x; + __u32 pos_y; + __u8 enabled; + __u8 channel_out; + __u8 mirror; + __u8 mem_idx; + __u32 out_width; + __u32 out_height; + __u32 reserved2[12]; +}; + +struct omapfb_mem_info { + __u32 size; + __u8 type; + __u8 reserved[3]; +}; + +struct omapfb_caps { + __u32 ctrl; + __u32 plane_color; + __u32 wnd_color; +}; + +enum omapfb_color_key_type { + OMAPFB_COLOR_KEY_DISABLED = 0, + OMAPFB_COLOR_KEY_GFX_DST, + OMAPFB_COLOR_KEY_VID_SRC, +}; + +struct omapfb_color_key { + __u8 channel_out; + __u32 background; + __u32 trans_key; + __u8 key_type; +}; + +enum omapfb_update_mode { + OMAPFB_UPDATE_DISABLED = 0, + OMAPFB_AUTO_UPDATE, + OMAPFB_MANUAL_UPDATE +}; + +struct omapfb_memory_read { + __u16 x; + __u16 y; + __u16 w; + __u16 h; + size_t buffer_size; + void __user *buffer; +}; + +struct omapfb_ovl_colormode { + __u8 overlay_idx; + __u8 mode_idx; + __u32 bits_per_pixel; + __u32 nonstd; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; +}; + +struct omapfb_vram_info { + __u32 total; + __u32 free; + __u32 largest_free_block; + __u32 reserved[5]; +}; + +struct omapfb_tearsync_info { + __u8 enabled; + __u8 reserved1[3]; + __u16 line; + __u16 reserved2; +}; + +struct omapfb_display_info { + __u16 xres; + __u16 yres; + __u32 width; /* phys width of the display in micrometers */ + __u32 height; /* phys height of the display in micrometers */ + __u32 reserved[5]; +}; + +#ifdef __KERNEL__ + +#include <plat/board.h> + +#ifdef CONFIG_ARCH_OMAP1 +#define OMAPFB_PLANE_NUM 1 +#else +#define OMAPFB_PLANE_NUM 3 +#endif + +struct omapfb_mem_region { + u32 paddr; + void __iomem *vaddr; + unsigned long size; + u8 type; /* OMAPFB_PLANE_MEM_* */ + enum omapfb_color_format format;/* OMAPFB_COLOR_* */ + unsigned format_used:1; /* Must be set when format is set. + * Needed b/c of the badly chosen 0 + * base for OMAPFB_COLOR_* values + */ + unsigned alloc:1; /* allocated by the driver */ + unsigned map:1; /* kernel mapped by the driver */ +}; + +struct omapfb_mem_desc { + int region_cnt; + struct omapfb_mem_region region[OMAPFB_PLANE_NUM]; +}; + +struct omapfb_platform_data { + struct omap_lcd_config lcd; + struct omapfb_mem_desc mem_desc; + void *ctrl_platform_data; +}; + +/* in arch/arm/plat-omap/fb.c */ +extern void omapfb_set_platform_data(struct omapfb_platform_data *data); +extern void omapfb_set_ctrl_platform_data(void *pdata); +extern void omapfb_reserve_sdram_memblock(void); + +/* helper methods that may be used by other modules */ +enum omap_color_mode; +struct omap_video_timings; +int omapfb_mode_to_dss_mode(struct fb_var_screeninfo *var, + enum omap_color_mode *mode); +void omapfb_fb2dss_timings(struct fb_videomode *fb_timings, + struct omap_video_timings *dss_timings); +void omapfb_dss2fb_timings(struct omap_video_timings *dss_timings, + struct fb_videomode *fb_timings); + +#endif + +#endif /* __OMAPFB_H */ diff --git a/security/MODULE_LICENSE_BSD_LIKE b/security/MODULE_LICENSE_BSD_LIKE new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/security/MODULE_LICENSE_BSD_LIKE diff --git a/security/smc_pa_ctrl/s_version.h b/security/smc_pa_ctrl/s_version.h index fb9e652..139c11f 100644 --- a/security/smc_pa_ctrl/s_version.h +++ b/security/smc_pa_ctrl/s_version.h @@ -59,15 +59,15 @@ /* * This version number must be updated for each new release */ -#define S_VERSION_MAIN "01.06" -#define S_VERSION_RESOURCE 1,6,0,S_VERSION_BUILD +#define S_VERSION_MAIN "01.04" +#define S_VERSION_RESOURCE 1,4,0,S_VERSION_BUILD /* * If this is a patch or engineering version use the following * defines to set the version number. Else set these values to 0. */ +#define S_VERSION_PATCH 11 #define S_VERSION_ENG 0 -#define S_VERSION_PATCH 0 #ifdef S_VERSION_BUILD /* TRICK: detect if S_VERSION is defined but empty */ @@ -106,8 +106,8 @@ S_VERSION_OS \ S_VERSION_PLATFORM \ S_VERSION_MAIN \ - _S_VERSION_ENG \ _S_VERSION_PATCH \ + _S_VERSION_ENG \ "." __STRINGIFY2(S_VERSION_BUILD) " " \ S_VERSION_VARIANT diff --git a/security/tee_client_api/Android.mk b/security/tee_client_api/Android.mk index 8e7d8d5..bfd92f4 100644 --- a/security/tee_client_api/Android.mk +++ b/security/tee_client_api/Android.mk @@ -9,13 +9,13 @@ LOCAL_ARM_MODE := arm LOCAL_SRC_FILES:= \ tee_client_api_linux_driver.c +LOCAL_CFLAGS += -DLINUX +LOCAL_CFLAGS += -D__ANDROID32__ + ifdef S_VERSION_BUILD LOCAL_CFLAGS += -DS_VERSION_BUILD=$(S_VERSION_BUILD) endif -LOCAL_LDLIBS += -llog - -LOCAL_CFLAGS += -DLINUX LOCAL_CFLAGS += -I $(LOCAL_PATH)/../tf_sdk/include/ LOCAL_MODULE:= libtee_client_api_driver diff --git a/security/tee_client_api/s_version.h b/security/tee_client_api/s_version.h index f712db2..d112ea0 100644 --- a/security/tee_client_api/s_version.h +++ b/security/tee_client_api/s_version.h @@ -58,15 +58,15 @@ /* * This version number must be updated for each new release */ -#define S_VERSION_MAIN "01.06" -#define S_VERSION_RESOURCE 1,6,0,S_VERSION_BUILD +#define S_VERSION_MAIN "01.04" +#define S_VERSION_RESOURCE 1,4,0,S_VERSION_BUILD /* * If this is a patch or engineering version use the following * defines to set the version number. Else set these values to 0. */ +#define S_VERSION_PATCH 11 #define S_VERSION_ENG 0 -#define S_VERSION_PATCH 0 #ifdef S_VERSION_BUILD /* TRICK: detect if S_VERSION is defined but empty */ @@ -105,8 +105,8 @@ S_VERSION_OS \ S_VERSION_PLATFORM \ S_VERSION_MAIN \ - _S_VERSION_ENG \ _S_VERSION_PATCH \ + _S_VERSION_ENG \ "." __STRINGIFY2(S_VERSION_BUILD) " " \ S_VERSION_VARIANT diff --git a/security/tee_client_api/schannel6_protocol.h b/security/tee_client_api/schannel6_protocol.h index 81769be..66ed12c 100644 --- a/security/tee_client_api/schannel6_protocol.h +++ b/security/tee_client_api/schannel6_protocol.h @@ -34,6 +34,15 @@ #include "s_type.h" /** + * This header file defines some structures needed for the secure channel + * protocol. See your Product Reference Manual for a specification of the + * SChannel protocol. + */ +// jroux to do : remove +#undef SMC_PROTOCOL_VERSION +#define SMC_PROTOCOL_VERSION 0x06000000 + +/** * Time representation. */ typedef uint64_t SCTIME; @@ -97,15 +106,6 @@ typedef uint64_t SCTIME; */ #include "schannel6_logins.h" -/* - * Limits and sizes - */ - -/* Maximum number of L1 descriptors covered by a registered shared memory block. - Must be kept in synch with TF_MAX_COARSE_PAGES in tf_protocol.h - in the Linux kernel driver. */ -#define SCHANNEL6_MAX_DESCRIPTORS_PER_REGISTERED_SHARED_MEM 128 - /** * Command parameters. */ @@ -217,7 +217,7 @@ typedef struct uint32_t nBlockID; uint32_t nSharedMemSize; uint32_t nSharedMemStartOffset; - uint32_t nSharedMemDescriptors[SCHANNEL6_MAX_DESCRIPTORS_PER_REGISTERED_SHARED_MEM]; + uint32_t nSharedMemDescriptors[8]; }SCHANNEL6_REGISTER_SHARED_MEMORY_COMMAND; diff --git a/security/tee_client_api/tee_client_api_linux_driver.c b/security/tee_client_api/tee_client_api_linux_driver.c index 584eea2..08a8210 100644 --- a/security/tee_client_api/tee_client_api_linux_driver.c +++ b/security/tee_client_api/tee_client_api_linux_driver.c @@ -96,13 +96,6 @@ typedef struct #define TRACE_WARNING(...) #define TRACE_INFO(...) #else -#if defined ANDROID -#define LOG_TAG "TEE" -#include <android/log.h> -#define TRACE_INFO(format, ...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, format, __VA_ARGS__) -#define TRACE_ERROR(format, ...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, format, __VA_ARGS__) -#define TRACE_WARNING(format, ...) __android_log_print(TRACE_WARNING, LOG_TAG, format, __VA_ARGS__) -#else static void TRACE_ERROR(const char* format, ...) { va_list ap; @@ -132,7 +125,6 @@ static void TRACE_INFO(const char* format, ...) fprintf(stderr, "\n"); va_end(ap); } -#endif /* ANDROID */ #endif /* NDEBUG */ @@ -792,7 +784,7 @@ TEEC_Result TEEC_OpenSessionEx ( if (connectionData != NULL) { *(uint32_t*)sCommand.sOpenClientSession.sLoginData = *(uint32_t*)connectionData; - sCommand.sHeader.nMessageSize += 1; + sCommand.sHeader.nMessageSize += sizeof(uint32_t); } } sCommand.sOpenClientSession.nCancellationID = (uint32_t)operation; // used for TEEC_RequestCancellation diff --git a/security/tf_crypto_sst/Android.mk b/security/tf_crypto_sst/Android.mk new file mode 100644 index 0000000..6d3a9d8 --- /dev/null +++ b/security/tf_crypto_sst/Android.mk @@ -0,0 +1,32 @@ +ifeq ($(TARGET_BOARD_PLATFORM),omap4) + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_PRELINK_MODULE := false +LOCAL_ARM_MODE := arm + +LOCAL_SRC_FILES := \ + lib_object.c \ + lib_mutex_linux.c \ + sst_stub.c \ + mtc.c \ + pkcs11_global.c \ + pkcs11_object.c \ + pkcs11_session.c + +LOCAL_CFLAGS += -DLINUX +LOCAL_CFLAGS += -D__ANDROID32__ + +ifdef S_VERSION_BUILD +LOCAL_CFLAGS += -DS_VERSION_BUILD=$(S_VERSION_BUILD) +endif + +LOCAL_CFLAGS += -I $(LOCAL_PATH)/../tf_sdk/include/ + +LOCAL_MODULE:= libtf_crypto_sst +LOCAL_STATIC_LIBRARIES := libtee_client_api_driver +LOCAL_MODULE_TAGS := optional + +include $(BUILD_SHARED_LIBRARY) +endif diff --git a/security/tf_sdk/include/sddi.h b/security/tf_crypto_sst/lib_mutex.h index 713e070..6f4bed1 100644 --- a/security/tf_sdk/include/sddi.h +++ b/security/tf_crypto_sst/lib_mutex.h @@ -28,58 +28,70 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef __SDDI_H__ -#define __SDDI_H__ - -#include "ssdi.h" - -#ifndef SDDI_EXPORT -#if defined(WIN32) || defined(__ARMCC_VERSION) -#ifdef SMODULE_IMPLEMENTATION -#define SDDI_EXPORT __declspec(dllexport) -#else -#define SDDI_EXPORT __declspec(dllimport) -#endif -#elif defined(__GNUC__) -#define SDDI_EXPORT __attribute__ ((visibility ("default"))) -#else -#define SDDI_EXPORT -#endif -#endif /* !SDDI_EXPORT */ - -#ifndef SDRV_EXPORT -#if defined(WIN32) || defined(_WIN32_WCE) || defined(__ARMCC_VERSION) -#define SDRV_EXPORT __declspec(dllexport) -#elif defined(__GNUC__) -#define SDRV_EXPORT __attribute__ ((visibility ("default"))) -#else -#define SDRV_EXPORT -#endif -#endif /* !SDRV_EXPORT */ - -#define S_CACHE_OPERATION_CLEAN 0x00000001 -#define S_CACHE_OPERATION_INVALIDATE 0x00000002 -#define S_CACHE_OPERATION_CLEAN_AND_INVALIDATE 0x00000003 - -void SDDI_EXPORT *SMemGetVirtual(uint32_t nSegmentID); - -S_RESULT SDDI_EXPORT SMemGetPhysical(void* pVirtual, uint32_t* pnPhysical); - -S_RESULT SDDI_EXPORT SMemFlush( - uint32_t nSegmentID, - uint32_t nOperation); - -S_RESULT SDDI_EXPORT SMemFlushByAddress( - void* pStartAddress, - uint32_t nLength, - uint32_t nOperation); - -/*------------------------------------------------------------------------------ - Driver Common Entry Points -------------------------------------------------------------------------------*/ - -S_RESULT SDRV_EXPORT SDrvCreate(uint32_t nParam0, uint32_t nParam1); - -void SDRV_EXPORT SDrvDestroy(void); - -#endif /* #ifndef __SDDI_H__ */ +#ifndef __LIB_MUTEX_H__ +#define __LIB_MUTEX_H__ + +/** + * This libray defines a type of simple non-recursive mutex that can + * be statically initialized. The interface is very similar to pthread + * mutexes. + **/ + +#ifdef WIN32 + +#include <windows.h> +#include "s_type.h" + +/* Windows API: use a critical section with a state describing + whether it has been initialized or not or is being initialized. + We use interlocked operations on the state to synchronize between + multiple threads competing to initialize the critical section */ +typedef struct +{ + volatile uint32_t nInitState; + CRITICAL_SECTION sCriticalSection; +} +LIB_MUTEX; + +#define LIB_MUTEX_WIN32_STATE_UNINITIALIZED 0 +#define LIB_MUTEX_WIN32_STATE_INITIALIZING 1 +#define LIB_MUTEX_WIN32_STATE_INITIALIZED 2 + +#define LIB_MUTEX_INITIALIZER { 0 } + +#endif /* WIN32 */ + +#ifdef LINUX + +#include <pthread.h> +#include "s_type.h" + +/* Linux: directly use a pthread mutex. */ +typedef pthread_mutex_t LIB_MUTEX; +#define LIB_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER + +#endif /* LINUX */ + +/** + * Initialize a mutex. Note that thie function cannot fail. If there + * is not enough resource to initialize the mutex, the implementation + * resort to active-wait + **/ +void libMutexInit(LIB_MUTEX* pMutex); + +/** + * Lock the mutex + */ +void libMutexLock(LIB_MUTEX* pMutex); + +/** + * Unlock the mutex + */ +void libMutexUnlock(LIB_MUTEX* pMutex); + +/** + * Destroy the mutex + */ +void libMutexDestroy(LIB_MUTEX* pMutex); + +#endif /* __LIB_MUTEX_H__ */ diff --git a/security/tf_sdk/include/ssdi_smc_ext.h b/security/tf_crypto_sst/lib_mutex_linux.c index d0cb1c7..da8c9e0 100644 --- a/security/tf_sdk/include/ssdi_smc_ext.h +++ b/security/tf_crypto_sst/lib_mutex_linux.c @@ -28,34 +28,29 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* -* File : ssdi_smc_ext.h -* -* Original-Author : Trusted Logic S.A. -* -* Created : October 27, 2008 -*/ - /** - * SSDI SMC Extensions specification header file. - */ - -#ifndef __SSDI_SMC_EXT_H__ -#define __SSDI_SMC_EXT_H__ - - -/* Cryptoki slotID constants */ -#define S_CRYPTOKI_KEYSTORE_HW_TOKEN 0x00007FFF - - -#define CKMV_SMC_KEK_DERIVE 0xC0000000 + * Implementation of the mutex library over the Linux API + **/ +#include <pthread.h> +#include "lib_mutex.h" +void libMutexInit(LIB_MUTEX* pMutex) +{ + pthread_mutex_init(pMutex, NULL); + /* Error ignored. Is that OK? */ +} -typedef struct CKV_SMC_KEK_DERIVE_PARAMS +void libMutexLock(LIB_MUTEX* pMutex) { - CK_ULONG Id; - CK_BYTE diversify[16]; -} CKV_SMC_KEK_DERIVE_PARAMS; + pthread_mutex_lock(pMutex); +} +void libMutexUnlock(LIB_MUTEX* pMutex) +{ + pthread_mutex_unlock(pMutex); +} -#endif /* __SSDI_SMC_EXT_H__ */ +void libMutexDestroy(LIB_MUTEX* pMutex) +{ + pthread_mutex_destroy(pMutex); +} diff --git a/security/tf_crypto_sst/lib_object.c b/security/tf_crypto_sst/lib_object.c new file mode 100644 index 0000000..a07a66f --- /dev/null +++ b/security/tf_crypto_sst/lib_object.c @@ -0,0 +1,418 @@ +/** + * Copyright(c) 2011 Trusted Logic. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name Trusted Logic nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 COPYRIGHT + * OWNER OR CONTRIBUTORS 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. + */ + +/** Simple implementation of lib_object using doubly-linked lists. This + implementation should outperform more sophisticated data structures + like blanced binary trees when the tables have fewer than 10 to 20 + elements. */ + +#include <string.h> +#include "s_type.h" + +#include "lib_object.h" + +/* Generic node */ +typedef struct LIB_OBJECT_NODE +{ + struct LIB_OBJECT_NODE* pPrevious; + struct LIB_OBJECT_NODE* pNext; + union + { + uint16_t nHandle; + + S_STORAGE_NAME sStorageName; + + struct + { + /* Public fields */ + uint8_t sFilename[64]; + uint8_t nFilenameLength; + } + f; + } + key; +} +LIB_OBJECT_NODE; + +typedef enum +{ + LIB_OBJECT_NODE_TYPE_HANDLE16, + LIB_OBJECT_NODE_TYPE_STORAGE_NAME, + LIB_OBJECT_NODE_TYPE_FILENAME, + LIB_OBJECT_NODE_TYPE_UNINDEXED +} +LIB_OBJECT_NODE_TYPE; + +/* ----------------------------------------------------------------------- + Search functions + -----------------------------------------------------------------------*/ +static bool libObjectKeyEqualNode( + LIB_OBJECT_NODE* pNode, + uint32_t nKey1, + void* pKey2, + LIB_OBJECT_NODE_TYPE eNodeType) +{ + switch (eNodeType) + { + default: + case LIB_OBJECT_NODE_TYPE_HANDLE16: + return + nKey1 == pNode->key.nHandle; + case LIB_OBJECT_NODE_TYPE_STORAGE_NAME: + return + memcmp( + (S_STORAGE_NAME*)pKey2, + &pNode->key.sStorageName, + sizeof(S_STORAGE_NAME)) == 0; + case LIB_OBJECT_NODE_TYPE_FILENAME: + { + uint32_t nLength1 = nKey1; + uint32_t nLength2 = pNode->key.f.nFilenameLength; + return + nLength1 == nLength2 + && + memcmp( + pKey2, + &pNode->key.f.sFilename, + nLength1) == 0; + } + } +} + +/* Polymorphic search function */ +static LIB_OBJECT_NODE* libObjectSearch( + LIB_OBJECT_NODE* pRoot, + uint32_t nKey1, + void* pKey2, + LIB_OBJECT_NODE_TYPE eNodeType) +{ + if (pRoot != NULL) + { + LIB_OBJECT_NODE* pNode = pRoot; + do + { + if (libObjectKeyEqualNode(pNode, nKey1, pKey2, eNodeType)) + { + /* Match found */ + return pNode; + } + pNode = pNode->pNext; + } + while (pNode != pRoot); + } + return NULL; +} + +LIB_OBJECT_NODE_HANDLE16* libObjectHandle16Search( + LIB_OBJECT_TABLE_HANDLE16* pTable, + uint32_t nHandle) +{ + return (LIB_OBJECT_NODE_HANDLE16*)libObjectSearch( + (LIB_OBJECT_NODE*)pTable->pRoot, nHandle, NULL, LIB_OBJECT_NODE_TYPE_HANDLE16); +} + + +LIB_OBJECT_NODE_STORAGE_NAME* libObjectStorageNameSearch( + LIB_OBJECT_TABLE_STORAGE_NAME* pTable, + S_STORAGE_NAME* pStorageName) +{ + return (LIB_OBJECT_NODE_STORAGE_NAME*)libObjectSearch( + (LIB_OBJECT_NODE*)pTable->pRoot, 0, pStorageName, LIB_OBJECT_NODE_TYPE_STORAGE_NAME); +} + +LIB_OBJECT_NODE_FILENAME* libObjectFilenameSearch( + LIB_OBJECT_TABLE_FILENAME* pTable, + uint8_t* pFilename, + uint32_t nFilenameLength) +{ + return (LIB_OBJECT_NODE_FILENAME*)libObjectSearch( + (LIB_OBJECT_NODE*)pTable->pRoot, nFilenameLength, pFilename, LIB_OBJECT_NODE_TYPE_FILENAME); +} + +/* ----------------------------------------------------------------------- + Add functions + -----------------------------------------------------------------------*/ + +/* Polymorphic add function. Add the node at the end of the linked list */ +static bool libObjectAdd( + LIB_OBJECT_NODE** ppRoot, + LIB_OBJECT_NODE* pNew, + LIB_OBJECT_NODE_TYPE eNodeType) +{ + LIB_OBJECT_NODE* pRoot; + LIB_OBJECT_NODE* pLast; + if (*ppRoot == NULL) + { + *ppRoot = pNew; + pNew->pNext = pNew; + pNew->pPrevious = pNew; + if (eNodeType == LIB_OBJECT_NODE_TYPE_HANDLE16) + { + pNew->key.nHandle = 1; + } + return true; + } + else + { + pRoot = *ppRoot; + pLast = pRoot->pPrevious; + if (eNodeType == LIB_OBJECT_NODE_TYPE_HANDLE16) + { + if (pLast->key.nHandle == LIB_OBJECT_HANDLE16_MAX) + { + /* We cannot just assign last handle + 1 because it will + overflow. So, scan the whole list */ + goto scan_list; + } + pNew->key.nHandle = pLast->key.nHandle + 1; + } + pLast->pNext = pNew; + pNew->pPrevious = pLast; + pNew->pNext = pRoot; + pRoot->pPrevious = pNew; + return true; + } +scan_list: + { + LIB_OBJECT_NODE* pNode = pRoot; + uint32_t nFreeHandle = 1; + do + { + if (pNode->key.nHandle > nFreeHandle) + { + /* nMaxHandle+1 is not allocated. Insert pNew just before pNode */ + pNew->key.nHandle = nFreeHandle; + pNew->pNext = pNode; + pNew->pPrevious = pNode->pPrevious; + pNode->pPrevious->pNext = pNew; + pNode->pPrevious = pNew; + if (pNode == pRoot) + { + /* Special case, pNew is the new root */ + *ppRoot = pNew; + } + return true; + } + pNode = pNode->pNext; + nFreeHandle++; + } + while (pNode != pRoot); + /* No free handle */ + return false; + } +} + +bool libObjectHandle16Add( + LIB_OBJECT_TABLE_HANDLE16* pTable, + LIB_OBJECT_NODE_HANDLE16* pObject) +{ + return libObjectAdd( + (LIB_OBJECT_NODE**)&pTable->pRoot, + (LIB_OBJECT_NODE*)pObject, + LIB_OBJECT_NODE_TYPE_HANDLE16); +} + + +void libObjectStorageNameAdd( + LIB_OBJECT_TABLE_STORAGE_NAME* pTable, + LIB_OBJECT_NODE_STORAGE_NAME* pObject) +{ + libObjectAdd( + (LIB_OBJECT_NODE**)&pTable->pRoot, + (LIB_OBJECT_NODE*)pObject, + LIB_OBJECT_NODE_TYPE_STORAGE_NAME); +} + + +void libObjectFilenameAdd( + LIB_OBJECT_TABLE_FILENAME* pTable, + LIB_OBJECT_NODE_FILENAME* pObject) +{ + libObjectAdd( + (LIB_OBJECT_NODE**)&pTable->pRoot, + (LIB_OBJECT_NODE*)pObject, + LIB_OBJECT_NODE_TYPE_FILENAME); +} + + +void libObjectUnindexedAdd( + LIB_OBJECT_TABLE_UNINDEXED* pTable, + LIB_OBJECT_NODE_UNINDEXED* pObject) +{ + libObjectAdd( + (LIB_OBJECT_NODE**)&pTable->pRoot, + (LIB_OBJECT_NODE*)pObject, + LIB_OBJECT_NODE_TYPE_UNINDEXED); +} + + +/* ----------------------------------------------------------------------- + Remove functions + -----------------------------------------------------------------------*/ +static void libObjectRemove(LIB_OBJECT_NODE** ppRoot, LIB_OBJECT_NODE* pObject) +{ + LIB_OBJECT_NODE* pPrevious = pObject->pPrevious; + LIB_OBJECT_NODE* pNext = pObject->pNext; + + pPrevious->pNext = pNext; + pNext->pPrevious = pPrevious; + + if (pPrevious == pObject) + { + /* Removed the last object in the table */ + *ppRoot = NULL; + } + else if (pObject == *ppRoot) + { + /* Removed the first object in the list */ + *ppRoot = pNext; + } +} + +static LIB_OBJECT_NODE* libObjectRemoveOne(LIB_OBJECT_NODE** ppRoot) +{ + if (*ppRoot == NULL) + { + return NULL; + } + else + { + LIB_OBJECT_NODE* pObject = *ppRoot; + libObjectRemove(ppRoot, pObject); + return pObject; + } +} + +void libObjectHandle16Remove( + LIB_OBJECT_TABLE_HANDLE16* pTable, + LIB_OBJECT_NODE_HANDLE16* pObject) +{ + libObjectRemove((LIB_OBJECT_NODE**)&pTable->pRoot, (LIB_OBJECT_NODE*)pObject); + pObject->nHandle = 0; +} + +LIB_OBJECT_NODE_HANDLE16* libObjectHandle16RemoveOne( + LIB_OBJECT_TABLE_HANDLE16* pTable) +{ + LIB_OBJECT_NODE_HANDLE16* pObject = (LIB_OBJECT_NODE_HANDLE16*)libObjectRemoveOne((LIB_OBJECT_NODE**)&pTable->pRoot); + if (pObject != NULL) + { + pObject->nHandle = 0; + } + return pObject; +} + +void libObjectStorageNameRemove( + LIB_OBJECT_TABLE_STORAGE_NAME* pTable, + LIB_OBJECT_NODE_STORAGE_NAME* pObject) +{ + libObjectRemove((LIB_OBJECT_NODE**)&pTable->pRoot, (LIB_OBJECT_NODE*)pObject); +} + +LIB_OBJECT_NODE_STORAGE_NAME* libObjectStorageNameRemoveOne( + LIB_OBJECT_TABLE_STORAGE_NAME* pTable) +{ + return (LIB_OBJECT_NODE_STORAGE_NAME*)libObjectRemoveOne((LIB_OBJECT_NODE**)&pTable->pRoot); +} + +void libObjectFilenameRemove( + LIB_OBJECT_TABLE_FILENAME* pTable, + LIB_OBJECT_NODE_FILENAME* pObject) +{ + libObjectRemove((LIB_OBJECT_NODE**)&pTable->pRoot, (LIB_OBJECT_NODE*)pObject); +} + +LIB_OBJECT_NODE_FILENAME* libObjectFilenameRemoveOne( + LIB_OBJECT_TABLE_FILENAME* pTable) +{ + return (LIB_OBJECT_NODE_FILENAME*)libObjectRemoveOne((LIB_OBJECT_NODE**)&pTable->pRoot); +} + +void libObjectUnindexedRemove( + LIB_OBJECT_TABLE_UNINDEXED* pTable, + LIB_OBJECT_NODE_UNINDEXED* pObject) +{ + libObjectRemove((LIB_OBJECT_NODE**)&pTable->pRoot, (LIB_OBJECT_NODE*)pObject); +} + +LIB_OBJECT_NODE_UNINDEXED* libObjectUnindexedRemoveOne(LIB_OBJECT_TABLE_UNINDEXED* pTable) +{ + return (LIB_OBJECT_NODE_UNINDEXED*)libObjectRemoveOne((LIB_OBJECT_NODE**)&pTable->pRoot); +} + + +/* ----------------------------------------------------------------------- + Get-next functions + -----------------------------------------------------------------------*/ + +static LIB_OBJECT_NODE* libObjectNext(LIB_OBJECT_NODE* pRoot, LIB_OBJECT_NODE* pObject) +{ + if (pObject == NULL) + { + return pRoot; + } + else if (pObject == pRoot->pPrevious) + { + return NULL; + } + else + { + return pObject->pNext; + } +} + + +LIB_OBJECT_NODE_HANDLE16* libObjectHandle16Next( + LIB_OBJECT_TABLE_HANDLE16* pTable, + LIB_OBJECT_NODE_HANDLE16* pObject) +{ + return (LIB_OBJECT_NODE_HANDLE16*)libObjectNext((LIB_OBJECT_NODE*)pTable->pRoot, (LIB_OBJECT_NODE*)pObject); +} + +LIB_OBJECT_NODE_STORAGE_NAME* libObjectStorageNameNext( + LIB_OBJECT_TABLE_STORAGE_NAME* pTable, + LIB_OBJECT_NODE_STORAGE_NAME* pObject) +{ + return (LIB_OBJECT_NODE_STORAGE_NAME*)libObjectNext((LIB_OBJECT_NODE*)pTable->pRoot, (LIB_OBJECT_NODE*)pObject); +} + +LIB_OBJECT_NODE_FILENAME* libObjectFilenameNext( + LIB_OBJECT_TABLE_FILENAME* pTable, + LIB_OBJECT_NODE_FILENAME* pObject) +{ + return (LIB_OBJECT_NODE_FILENAME*)libObjectNext((LIB_OBJECT_NODE*)pTable->pRoot, (LIB_OBJECT_NODE*)pObject); +} + +LIB_OBJECT_NODE_UNINDEXED* libObjectUnindexedNext( + LIB_OBJECT_TABLE_UNINDEXED* pTable, + LIB_OBJECT_NODE_UNINDEXED* pObject) +{ + return (LIB_OBJECT_NODE_UNINDEXED*)libObjectNext((LIB_OBJECT_NODE*)pTable->pRoot, (LIB_OBJECT_NODE*)pObject); +} diff --git a/security/tf_crypto_sst/lib_object.h b/security/tf_crypto_sst/lib_object.h new file mode 100644 index 0000000..5abb834 --- /dev/null +++ b/security/tf_crypto_sst/lib_object.h @@ -0,0 +1,348 @@ +/** + * Copyright(c) 2011 Trusted Logic. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name Trusted Logic nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 COPYRIGHT + * OWNER OR CONTRIBUTORS 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 __LIB_OBJECT_H__ +#define __LIB_OBJECT_H__ + +#include "s_type.h" + +typedef struct +{ + /* Type of storage: See S_STORAGE_TYPE_XXX */ + uint32_t nStorageType; + + /* Login type of the client: See S_LOGIN_XXX */ + uint32_t nLoginType; + + /* Identifier of the client (secure or non-secure client) */ + S_UUID sClientUUID; +} +S_STORAGE_NAME; + + +/** + * This library defines three types of objects and keys: + * - objects identified by a 16-bit handle + * - objects identified by a S_STORAGE_NAME + * - objects identified by a filename, which is a variable-size up-to-64 bytes byte array + * - unindexed objects + **/ + +/* ------------------------------------------------------------------------- + Useful macro to get a structure from a pointer to one of its fields. + + Typical usage: + typedef struct + { + LIB_OBJECT_NODE_HANDLE16 sNodeInHandleTable; + LIB_OBJECT_NODE_UNINDEXED sNodeInList; + } + CONTEXT; + + LIB_OBJECT_CONTAINER_OF(libObjectUnindexedNext(pList, pObject), CONTEXT, sNodeInList) + + + -------------------------------------------------------------------------*/ +#define LIB_OBJECT_CONTAINER_OF(ptr, type, member) (((type*)(((char*)(ptr)) - offsetof(type, member)))) + + +/* ------------------------------------------------------------------------- + Table of objects indexed by 16-bit handles + -------------------------------------------------------------------------*/ + +#define LIB_OBJECT_HANDLE16_MAX ((uint16_t)0xFFFF) + +/** + * NODE of an object in a table indexed by 16-bit handles + **/ +typedef struct +{ + /* Implementation-defined fields */ + uint32_t _l[2]; + + /* Public field */ + uint16_t nHandle; +} +LIB_OBJECT_NODE_HANDLE16; + +/** + * A table of objects indexed by 16-bit handles + **/ +typedef struct +{ + LIB_OBJECT_NODE_HANDLE16* pRoot; +} +LIB_OBJECT_TABLE_HANDLE16; + +/** + * Add an object in a handle table. This function also + * assigns a new handle value to the object. The handle + * is guaranteed to be unique among all the objects + * in the table and non-zero. + * + * Returns false if the maximum number of handles has been reached + * (i.e., there are already 65535 objects in the table) + **/ +bool libObjectHandle16Add( + LIB_OBJECT_TABLE_HANDLE16* pTable, + LIB_OBJECT_NODE_HANDLE16* pObject); + +/** + * Search an object by its handle. Return NULL if the + * object is not found + **/ +LIB_OBJECT_NODE_HANDLE16* libObjectHandle16Search( + LIB_OBJECT_TABLE_HANDLE16* pTable, + uint32_t nHandle); + +/** + * Remove an object from a handle table. + * + * The object must be part of the table + **/ +void libObjectHandle16Remove( + LIB_OBJECT_TABLE_HANDLE16* pTable, + LIB_OBJECT_NODE_HANDLE16* pObject); + +/** + * Remove one object from the table. This is useful when + * you want to destroy all the objects in the table. + * + * Returns NULL if the table is empty + **/ +LIB_OBJECT_NODE_HANDLE16* libObjectHandle16RemoveOne( + LIB_OBJECT_TABLE_HANDLE16* pTable); + +/** + * Get the object following pObject in the handle table. + * If pObject is NULL, return the first object in the list + * Return NULL if the object is the last in the table + **/ +LIB_OBJECT_NODE_HANDLE16* libObjectHandle16Next( + LIB_OBJECT_TABLE_HANDLE16* pTable, + LIB_OBJECT_NODE_HANDLE16* pObject); + +/* ------------------------------------------------------------------------- + Table of objects indexed by storage name + -------------------------------------------------------------------------*/ + +/** + * NODE of an object in a table indexed by storage name + **/ +typedef struct +{ + /* Implementation-defined fields */ + uint32_t _l[2]; + + /* Public fields */ + S_STORAGE_NAME sStorageName; +} +LIB_OBJECT_NODE_STORAGE_NAME; + +/** + * A table of objects indexed by storage name + **/ +typedef struct +{ + LIB_OBJECT_NODE_STORAGE_NAME* pRoot; +} +LIB_OBJECT_TABLE_STORAGE_NAME; + +/** + * Add an object in a storage name table. + * + * The object must not be part of the table yet. The caller + * must have set pObject->sStorageName with the storage name + **/ +void libObjectStorageNameAdd( + LIB_OBJECT_TABLE_STORAGE_NAME* pTable, + LIB_OBJECT_NODE_STORAGE_NAME* pObject); + +/** + * Search an object by its storage name. Return NULL if the + * object is not found + **/ +LIB_OBJECT_NODE_STORAGE_NAME* libObjectStorageNameSearch( + LIB_OBJECT_TABLE_STORAGE_NAME* pTable, + S_STORAGE_NAME* pStorageName); + +/** + * Remove an object from a storage name table. + * + * The object must be part of the table + **/ +void libObjectStorageNameRemove( + LIB_OBJECT_TABLE_STORAGE_NAME* pTable, + LIB_OBJECT_NODE_STORAGE_NAME* pObject); + +/** + * Remove one object from the table. This is useful when + * you want to destroy all the objects in the table + * Returns NULL if the table is empty + **/ +LIB_OBJECT_NODE_STORAGE_NAME* libObjectStorageNameRemoveOne( + LIB_OBJECT_TABLE_STORAGE_NAME* pTable); + +/** + * Get the object following pObject in the storage name table. + * If pObject is NULL, return the first object + * Return NULL if the object is the last in the table + **/ +LIB_OBJECT_NODE_STORAGE_NAME* libObjectStorageNameNext( + LIB_OBJECT_TABLE_STORAGE_NAME* pTable, + LIB_OBJECT_NODE_STORAGE_NAME* pObject); + +/* ------------------------------------------------------------------------- + Table of objects indexed by filenames + -------------------------------------------------------------------------*/ + +/** + * NODE of an object in a table indexed by filenames (varsize up-to-64 bytes) + **/ +typedef struct +{ + /* Implementation-defined fields */ + uint32_t _l[2]; + + /* Public fields */ + uint8_t sFilename[64]; + uint8_t nFilenameLength; +} +LIB_OBJECT_NODE_FILENAME; + +/** + * A table of objects indexed by filenames + **/ +typedef struct +{ + LIB_OBJECT_NODE_FILENAME* pRoot; +} +LIB_OBJECT_TABLE_FILENAME; + +/** + * Add an object in a filename table. + * + * The object must not be part of the table yet. The caller + * must have set pObject->sFilename and pObject->nFilenameLength + * with the object filename + **/ +void libObjectFilenameAdd( + LIB_OBJECT_TABLE_FILENAME* pTable, + LIB_OBJECT_NODE_FILENAME* pObject); + +/** + * Search an object by its filename. Return NULL if the + * object is not found + **/ +LIB_OBJECT_NODE_FILENAME* libObjectFilenameSearch( + LIB_OBJECT_TABLE_FILENAME* pTable, + uint8_t* pFilename, + uint32_t nFilenameLength); + +/** + * Remove an object from a filename table. + * + * The object must be part of the table + **/ +void libObjectFilenameRemove( + LIB_OBJECT_TABLE_FILENAME* pTable, + LIB_OBJECT_NODE_FILENAME* pObject); + +/** + * Remove one element from the table and return it. This is useful when + * you want to destroy all the objects in the table + * Returns NULL if the table is empty + **/ +LIB_OBJECT_NODE_FILENAME* libObjectFilenameRemoveOne( + LIB_OBJECT_TABLE_FILENAME* pTable); + +/** + * Get the object following pObject in the filename table. + * If pObject is NULL, return the first object + * Return NULL if the object is the last in the table + **/ +LIB_OBJECT_NODE_FILENAME* libObjectFilenameNext( + LIB_OBJECT_TABLE_FILENAME* pTable, + LIB_OBJECT_NODE_FILENAME* pObject); + +/* ------------------------------------------------------------------------- + Unindexed table of objects + -------------------------------------------------------------------------*/ +/** + * NODE of an unindexed object + **/ +typedef struct +{ + /* Implementation-defined fields */ + uint32_t _l[2]; +} +LIB_OBJECT_NODE_UNINDEXED; + +/** + * A table of unindexed objects + **/ +typedef struct +{ + LIB_OBJECT_NODE_UNINDEXED* pRoot; +} +LIB_OBJECT_TABLE_UNINDEXED; + + +/** + * Add an object in an unindexed table. The object must not be part of the table yet. + **/ +void libObjectUnindexedAdd( + LIB_OBJECT_TABLE_UNINDEXED* pTable, + LIB_OBJECT_NODE_UNINDEXED* pObject); + +/** + * Remove an object from an unindexed table. The object must be part of the table. + **/ +void libObjectUnindexedRemove( + LIB_OBJECT_TABLE_UNINDEXED* pTable, + LIB_OBJECT_NODE_UNINDEXED* pObject); + +/** + * Remove one object in the table. This is useful when you want to destroy all objects + * in the table. + * Returns NULL if the table is empty + **/ +LIB_OBJECT_NODE_UNINDEXED* libObjectUnindexedRemoveOne(LIB_OBJECT_TABLE_UNINDEXED* pTable); + +/** + * Get the object following pObject in the table. + * If pObject is NULL, return the first object + * Return NULL if the object is the last in the table + **/ +LIB_OBJECT_NODE_UNINDEXED* libObjectUnindexedNext( + LIB_OBJECT_TABLE_UNINDEXED* pTable, + LIB_OBJECT_NODE_UNINDEXED* pObject); + +#endif /* __LIB_OBJECT_H__ */ diff --git a/security/tf_crypto_sst/mtc.c b/security/tf_crypto_sst/mtc.c new file mode 100644 index 0000000..2be4870 --- /dev/null +++ b/security/tf_crypto_sst/mtc.c @@ -0,0 +1,274 @@ +/** + * Copyright(c) 2011 Trusted Logic. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name Trusted Logic nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 COPYRIGHT + * OWNER OR CONTRIBUTORS 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 <assert.h> +#include <stdlib.h> +#include <string.h> + +#define MTC_EXPORTS +#include "mtc.h" + +/* Included for the TEE management */ +#include "pkcs11_internal.h" + + +/*------------------------------------------------------------------------------ + Defines +------------------------------------------------------------------------------*/ + +/** + * The magic word. + */ +#define MTC_SESSION_MAGIC ( (uint32_t)0x4D544300 ) /* "MTC\0" */ + +/** + * The MTC session context + */ +typedef struct +{ + /* Magic word, must be set to {MTC_SESSION_MAGIC}. */ + uint32_t nMagicWord; + + /* MTC Identifier */ + uint32_t nCounterIdentifier; + + /* TEEC session and cryptoki session */ + TEEC_Session sSession; + uint32_t hCryptoSession; + +} MTC_SESSION_CONTEXT; + + +static bool g_bMTCInitialized = false; + + +/*------------------------------------------------------------------------------ + Static functions +------------------------------------------------------------------------------*/ + +static S_RESULT static_getMonotonicCounter(S_HANDLE hCounter, + S_MONOTONIC_COUNTER_VALUE* psValue, + bool bIncrement) +{ + TEEC_Result nError; + TEEC_Operation sOperation; + MTC_SESSION_CONTEXT* pSession = NULL; + uint32_t nCommandID; + + if (!g_bMTCInitialized) + { + return S_ERROR_BAD_STATE; + } + + pSession = (MTC_SESSION_CONTEXT *)hCounter; + if ((pSession == NULL) || (pSession->nMagicWord != MTC_SESSION_MAGIC)) + { + return S_ERROR_BAD_PARAMETERS; + } + + if (bIncrement) + { + nCommandID = SERVICE_SYSTEM_PKCS11_INCREMENT_MTC_COMMAND_ID; + } + else + { + nCommandID = SERVICE_SYSTEM_PKCS11_GET_MTC_COMMAND_ID; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = pSession->nCounterIdentifier; + sOperation.params[0].value.b = 0; + nError = TEEC_InvokeCommand(&pSession->sSession, + (pSession->hCryptoSession << 16 ) | + (nCommandID & 0x00007FFF), + &sOperation, + NULL); + + psValue->nLow = sOperation.params[0].value.a; + psValue->nHigh = sOperation.params[0].value.b; + + return nError; +} + +/*------------------------------------------------------------------------------ + API +------------------------------------------------------------------------------*/ + +MTC_EXPORT S_RESULT SMonotonicCounterInit(void) +{ + TEEC_Result nTeeError; + + stubMutexLock(); + if (g_bMTCInitialized) + { + nTeeError = TEEC_SUCCESS; + } + else + { + nTeeError = stubInitializeContext(); + if (nTeeError == TEEC_SUCCESS) + { + g_bMTCInitialized = true; + } + } + stubMutexUnlock(); + + return nTeeError; +} + +MTC_EXPORT void SMonotonicCounterTerminate(void) +{ + stubMutexLock(); + if (g_bMTCInitialized) + { + stubFinalizeContext(); + g_bMTCInitialized = false; + } + stubMutexUnlock(); +} + +MTC_EXPORT S_RESULT SMonotonicCounterOpen( + uint32_t nCounterIdentifier, + OUT S_HANDLE* phCounter) +{ + TEEC_Result nError; + TEEC_Operation sOperation; + MTC_SESSION_CONTEXT* pSession = NULL; + S_MONOTONIC_COUNTER_VALUE nCounterValue; + + if (phCounter == NULL) + { + return S_ERROR_BAD_PARAMETERS; + } + + *phCounter = S_HANDLE_NULL; + + if (!g_bMTCInitialized) + { + return S_ERROR_BAD_STATE; + } + + if (nCounterIdentifier != S_MONOTONIC_COUNTER_GLOBAL) + { + return S_ERROR_ITEM_NOT_FOUND; + } + + pSession = (MTC_SESSION_CONTEXT*)malloc(sizeof(MTC_SESSION_CONTEXT)); + if (pSession == NULL) + { + return S_ERROR_OUT_OF_MEMORY; + } + memset(pSession, 0, sizeof(MTC_SESSION_CONTEXT)); + pSession->nMagicWord = MTC_SESSION_MAGIC; + + /* Open a TEE session with the system service */ + nError = TEEC_OpenSession(&g_sContext, + &pSession->sSession, + &SERVICE_UUID, + TEEC_LOGIN_PUBLIC, + NULL, + NULL, /* No operation parameters */ + NULL); + if (nError != TEEC_SUCCESS) + { + goto error; + } + + /* Open a cryptoki session */ + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = CKV_TOKEN_SYSTEM_SHARED; + sOperation.params[0].value.b = CKF_RW_SESSION | CKF_SERIAL_SESSION; + nError = TEEC_InvokeCommand(&pSession->sSession, + SERVICE_SYSTEM_PKCS11_C_OPEN_SESSION_COMMAND_ID & 0x00007FFF, + &sOperation, + NULL); + if (nError != TEEC_SUCCESS) + { + TEEC_CloseSession(&pSession->sSession); + goto error; + } + + pSession->hCryptoSession = sOperation.params[0].value.a; + pSession->nCounterIdentifier = nCounterIdentifier; + + nError = SMonotonicCounterGet((S_HANDLE)pSession, &nCounterValue); + if (nError != TEEC_SUCCESS) + { + SMonotonicCounterClose((S_HANDLE)pSession); + return nError; + } + + *phCounter = (S_HANDLE)pSession; + + return TEEC_SUCCESS; + +error: + free(pSession); + return nError; +} + +MTC_EXPORT void SMonotonicCounterClose(S_HANDLE hCounter) +{ + MTC_SESSION_CONTEXT* pSession; + + if (!g_bMTCInitialized) + { + return; + } + + pSession = (MTC_SESSION_CONTEXT *)hCounter; + if ((pSession == NULL) || (pSession->nMagicWord != MTC_SESSION_MAGIC)) + { + return; + } + + (void)TEEC_InvokeCommand(&pSession->sSession, + (pSession->hCryptoSession << 16 ) | + (SERVICE_SYSTEM_PKCS11_C_CLOSE_SESSION_COMMAND_ID & 0x00007FFF), + NULL, /* No operation parameters */ + NULL); + + TEEC_CloseSession(&pSession->sSession); + free(pSession); +} + +MTC_EXPORT S_RESULT SMonotonicCounterGet( + S_HANDLE hCounter, + S_MONOTONIC_COUNTER_VALUE* psCurrentValue) +{ + return static_getMonotonicCounter(hCounter, psCurrentValue, false); +} + +MTC_EXPORT S_RESULT SMonotonicCounterIncrement( + S_HANDLE hCounter, + S_MONOTONIC_COUNTER_VALUE* psNewValue) +{ + return static_getMonotonicCounter(hCounter, psNewValue, true); +} diff --git a/security/tf_crypto_sst/pkcs11_global.c b/security/tf_crypto_sst/pkcs11_global.c new file mode 100644 index 0000000..f7c491d --- /dev/null +++ b/security/tf_crypto_sst/pkcs11_global.c @@ -0,0 +1,275 @@ +/** + * Copyright(c) 2011 Trusted Logic. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name Trusted Logic nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 COPYRIGHT + * OWNER OR CONTRIBUTORS 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. + */ + +/* + * Implementation Notes: + * + * This API is NOT thread-safe. Indeed this Cryptoki implementation + * only supports option 1 defined in PKCS#11, section 6.5.2: + * "The application can specify that it will not be accessing the library concurrently + * from multiple threads, and so the library need not worry about performing any type + * of locking for the sake of thread-safety." + */ + +#include "pkcs11_internal.h" + +/* ------------------------------------------------------------------------ + System Service UUID +------------------------------------------------------------------------- */ +const TEEC_UUID SERVICE_UUID = SERVICE_SYSTEM_UUID; + +/* ------------------------------------------------------------------------ + Definition of the global TEE Context +------------------------------------------------------------------------- */ +TEEC_Context g_sContext; +/* A mutex that protects the access to the global context and to the + g_bContextRefCounter flag */ +LIB_MUTEX g_sContextMutex = LIB_MUTEX_INITIALIZER; +/* Whether the context has already been initialized or not */ +uint32_t g_nContextRefCounter = 0; + +bool g_bCryptokiInitialized = false; + +/* ------------------------------------------------------------------------ + Internal global TEE context management +------------------------------------------------------------------------- */ + +void stubMutexLock(void) +{ + libMutexLock(&g_sContextMutex); +} + +void stubMutexUnlock(void) +{ + libMutexUnlock(&g_sContextMutex); +} + +/* This API must be protected by stubMutexLock/Unlock */ +TEEC_Result stubInitializeContext(void) +{ + TEEC_Result nTeeError; + + if (g_nContextRefCounter) + { + g_nContextRefCounter ++; + return TEEC_SUCCESS; + } + + nTeeError = TEEC_InitializeContext(NULL, &g_sContext); + if (nTeeError == TEEC_SUCCESS) + { + g_nContextRefCounter = 1; + } + + return nTeeError; +} + +/* This API must be protected by stubMutexLock/Unlock */ +void stubFinalizeContext(void) +{ + if (g_nContextRefCounter > 0) + { + g_nContextRefCounter --; + } + + if (g_nContextRefCounter == 0) + { + TEEC_FinalizeContext(&g_sContext); + memset(&g_sContext, 0, sizeof(TEEC_Context)); + } +} + + +/* ------------------------------------------------------------------------ + Internal monitor management +------------------------------------------------------------------------- */ +/** +* Check that hSession is a valid primary session, +* or a valid secondary session attached to a valid primary session. +* +* input: +* S_HANDLE hSession: the session handle to check +* output: +* bool* pBoolIsPrimarySession: a boolean set to true if the session is primary, +* set to false if the session if the session is secondary +* returned boolean: set to true iff : +* - either hSession is a valid primary session +* - or hSession is a valid secondary session attached to a valid primary session +**/ +bool ckInternalSessionIsOpenedEx(S_HANDLE hSession, bool* pBoolIsPrimarySession) +{ + PPKCS11_SESSION_CONTEXT_HEADER pHeader = (PPKCS11_SESSION_CONTEXT_HEADER)hSession; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession = NULL; + + if ((pHeader == NULL) || (pHeader->nMagicWord != PKCS11_SESSION_MAGIC)) + { + return FALSE; + } + if (pHeader->nSessionTag == PKCS11_PRIMARY_SESSION_TAG) /* primary session */ + { + pSession = (PPKCS11_PRIMARY_SESSION_CONTEXT)pHeader; + + *pBoolIsPrimarySession = true; + + /* check that primary session is valid */ + return (pSession->hCryptoSession != CK_INVALID_HANDLE); + } + else if (pHeader->nSessionTag == PKCS11_SECONDARY_SESSION_TAG) /*secondary session */ + { + PPKCS11_SECONDARY_SESSION_CONTEXT pSecSession = (PPKCS11_SECONDARY_SESSION_CONTEXT)pHeader; + + *pBoolIsPrimarySession = false; + + /* check that primary session is still valid */ + pSession = pSecSession->pPrimarySession; + if ( (pSession == NULL) || + (pSession->sHeader.nMagicWord != PKCS11_SESSION_MAGIC) || + (pSession->sHeader.nSessionTag != PKCS11_PRIMARY_SESSION_TAG)) + { + return FALSE; + } + + if (pSession->hCryptoSession == CK_INVALID_HANDLE) + { + return FALSE; + } + + /* check that secondary session is valid */ + return (pSecSession->hSecondaryCryptoSession != CK_INVALID_HANDLE); + } + else + { + return FALSE; + } +} + +/* ------------------------------------------------------------------------ + Internal error management +------------------------------------------------------------------------- */ + +CK_RV ckInternalTeeErrorToCKError(TEEC_Result nError) +{ + switch (nError) + { + case TEEC_SUCCESS: + return CKR_OK; + + case TEEC_ERROR_BAD_PARAMETERS: + case TEEC_ERROR_BAD_FORMAT: + return CKR_ARGUMENTS_BAD; + case TEEC_ERROR_OUT_OF_MEMORY: + return CKR_HOST_MEMORY; + case TEEC_ERROR_ACCESS_DENIED: + return CKR_TOKEN_NOT_PRESENT; + default: + return CKR_DEVICE_ERROR; + } +} + +/* ------------------------------------------------------------------------ + Public Functions +------------------------------------------------------------------------- */ +CK_RV PKCS11_EXPORT C_Initialize(CK_VOID_PTR pInitArgs) +{ + CK_RV nErrorCode; + TEEC_Result nTeeError; + + if (pInitArgs != NULL_PTR) + { + return CKR_ARGUMENTS_BAD; + } + + stubMutexLock(); + if (g_bCryptokiInitialized) + { + nErrorCode = CKR_CRYPTOKI_ALREADY_INITIALIZED; + } + else + { + nTeeError = stubInitializeContext(); + if (nTeeError == TEEC_SUCCESS) + { + g_bCryptokiInitialized = true; + } + nErrorCode = ckInternalTeeErrorToCKError(nTeeError); + } + stubMutexUnlock(); + + return nErrorCode; +} + +CK_RV PKCS11_EXPORT C_Finalize(CK_VOID_PTR pReserved) +{ + CK_RV nErrorCode; + + if (pReserved != NULL_PTR) + { + return CKR_ARGUMENTS_BAD; + } + + stubMutexLock(); + if (g_bCryptokiInitialized) + { + stubFinalizeContext(); + g_bCryptokiInitialized = false; + nErrorCode = CKR_OK; + } + else + { + nErrorCode = CKR_CRYPTOKI_NOT_INITIALIZED; + } + stubMutexUnlock(); + + return nErrorCode; +} + +static const CK_INFO sImplementationInfo = +{ + {2, 20}, /* cryptokiVersion, spec 2.20 */ + "Trusted Logic", /* manufacturerID */ + 0, /* flags */ + "PKCS#11", /* libraryDescription */ + {3, 0} /* libraryVersion */ +}; + +CK_RV PKCS11_EXPORT C_GetInfo(CK_INFO_PTR pInfo) +{ + if (!g_bCryptokiInitialized) + { + return CKR_CRYPTOKI_NOT_INITIALIZED; + } + if (pInfo == NULL_PTR) + { + return CKR_ARGUMENTS_BAD; + } + + memcpy(pInfo, &sImplementationInfo, sizeof(CK_INFO)); + return CKR_OK; +} diff --git a/security/tf_crypto_sst/pkcs11_internal.h b/security/tf_crypto_sst/pkcs11_internal.h new file mode 100644 index 0000000..14ecf83 --- /dev/null +++ b/security/tf_crypto_sst/pkcs11_internal.h @@ -0,0 +1,137 @@ +/** + * Copyright(c) 2011 Trusted Logic. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name Trusted Logic nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 COPYRIGHT + * OWNER OR CONTRIBUTORS 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 __PKCS11_INTERNAL_H__ +#define __PKCS11_INTERNAL_H__ + +#define CRYPTOKI_EXPORTS +#include "cryptoki.h" +#include "service_system_protocol.h" + +#include "lib_object.h" +#include "lib_mutex.h" +#include "tee_client_api.h" + +#include <stdlib.h> +#include <string.h> + + +/** + * The magic word. + */ +#define PKCS11_SESSION_MAGIC ( (uint32_t)0x45EF683B ) + +/** + * Computes required size to fit in a 4-bytes aligned buffer (at the end) + * If the size is a multiple of 4, just returns the size + * Otherwise, return the size so that the (end of the buffer)+1 is 4-bytes aligned. + */ +#define PKCS11_GET_SIZE_WITH_ALIGNMENT(a) (uint32_t)(((uint32_t)a+3) & ~3) + + +/** + * The System Service UUID used by the library + */ +extern const TEEC_UUID SERVICE_UUID; + +/** + * g_sContext: the global TEEC context used by the library + */ +extern TEEC_Context g_sContext; + +void stubMutexLock(void); +void stubMutexUnlock(void); +TEEC_Result stubInitializeContext(void); +void stubFinalizeContext(void); + +/** Whether the cryptoki library is initialized or not */ +extern bool g_bCryptokiInitialized; + +CK_RV ckInternalTeeErrorToCKError(TEEC_Result nError); + +#define PKCS11_PRIMARY_SESSION_TAG 1 +#define PKCS11_SECONDARY_SESSION_TAG 2 + +typedef struct +{ + /* + * Magic word, must be set to {PKCS11_SESSION_MAGIC}. + */ + uint32_t nMagicWord; + + /* nSessionTag must be set to {PKCS11_PRIMARY_SESSION_TAG} for primary session + * to {PKCS11_SECONDARY_SESSION_TAG} for secondary session */ + uint32_t nSessionTag; + +}PKCS11_SESSION_CONTEXT_HEADER, * PPKCS11_SESSION_CONTEXT_HEADER; + +/** + * The PKCS11 Primary session context + */ +typedef struct +{ + /* sHeader must be the first field of this structure */ + PKCS11_SESSION_CONTEXT_HEADER sHeader; + + /* TEEC session used for this cryptoki primary session. + Each primary session has its own TEEC session */ + TEEC_Session sSession; + uint32_t hCryptoSession; + + /* Mutex to protect the table of secondary sessions */ + LIB_MUTEX sSecondarySessionTableMutex; + + /* Table of secondary sessions */ + LIB_OBJECT_TABLE_HANDLE16 sSecondarySessionTable; + +} PKCS11_PRIMARY_SESSION_CONTEXT, * PPKCS11_PRIMARY_SESSION_CONTEXT; + +/** + * The PKCS11 Secondary session context + */ +typedef struct +{ + /* sHeader must be the first field of this structure */ + PKCS11_SESSION_CONTEXT_HEADER sHeader; + + /* Secondary session handle as returned by pkcs11 */ + uint32_t hSecondaryCryptoSession; + + /* A node of the table of secondary sessions */ + LIB_OBJECT_NODE_HANDLE16 sSecondarySessionNode; + + /* pointer to the primary session */ + PKCS11_PRIMARY_SESSION_CONTEXT* pPrimarySession; + +} PKCS11_SECONDARY_SESSION_CONTEXT, *PPKCS11_SECONDARY_SESSION_CONTEXT; + +bool ckInternalSessionIsOpenedEx(S_HANDLE hSession, bool* pBoolIsPrimarySession); + +#endif /* __PKCS11_INTERNAL_H__ */ diff --git a/security/tf_crypto_sst/pkcs11_object.c b/security/tf_crypto_sst/pkcs11_object.c new file mode 100644 index 0000000..53caadc --- /dev/null +++ b/security/tf_crypto_sst/pkcs11_object.c @@ -0,0 +1,1637 @@ +/** + * Copyright(c) 2011 Trusted Logic. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name Trusted Logic nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 COPYRIGHT + * OWNER OR CONTRIBUTORS 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 "pkcs11_internal.h" + +/* ------------------------------------------------------------------------ +Internal Functions +------------------------------------------------------------------------- */ +/** +* Checks the following pre-conditions: +* - cryptoki is initialized, +* - hSession is valid (primary and/or secondary), +* - the user is logged in. +* +* And updates handle values: +* IN/OUT : phSession +* IN = Cryptoki external handle +* OUT = TFAPI handle = primary cryptoki session handle +* OUT : phSecSession16Msb +* OUT = 0 for a primary session or +* the secondary cryptoki session handle in the 16 MSB bits +*/ +static CK_RV static_checkPreConditionsAndUpdateHandles( + CK_SESSION_HANDLE* phSession, + uint32_t* phCommandIDAndSession, + PPKCS11_PRIMARY_SESSION_CONTEXT* ppSession) +{ + bool bIsPrimarySession; + + /* Check Cryptoki is initialized */ + if (!g_bCryptokiInitialized) + { + return CKR_CRYPTOKI_NOT_INITIALIZED; + } + + if (phSession == NULL) + { + return CKR_SESSION_HANDLE_INVALID; + } + + /* Check that the session is valid */ + if (!ckInternalSessionIsOpenedEx(*phSession, &bIsPrimarySession)) + { + return CKR_SESSION_HANDLE_INVALID; + } + /* previous check is fine, then update session handles */ + if (bIsPrimarySession) + { + PPKCS11_PRIMARY_SESSION_CONTEXT pSession = + (PPKCS11_PRIMARY_SESSION_CONTEXT)(*phSession); + + *phSession = pSession->hCryptoSession; + *phCommandIDAndSession = (pSession->hCryptoSession<<16)|(*phCommandIDAndSession&0x00007FFF); + *ppSession = pSession; + } + else + { + PPKCS11_SECONDARY_SESSION_CONTEXT pSecSession = + (PPKCS11_SECONDARY_SESSION_CONTEXT)(*phSession); + + *phSession = pSecSession->pPrimarySession->hCryptoSession; + *phCommandIDAndSession = (pSecSession->hSecondaryCryptoSession<<16)|(1<<15)|(*phCommandIDAndSession&0x00007FFF); + *ppSession = pSecSession->pPrimarySession; + } + + return CKR_OK; +} + +/******************************************/ +/* The buffer must be freed by the caller */ +/******************************************/ +static CK_RV static_encodeTwoTemplates( + uint8_t** ppBuffer, + uint32_t * pBufferSize, + const uint32_t nParamIndex, + CK_ATTRIBUTE* pTemplate1, + CK_ULONG ulCount1, + CK_ATTRIBUTE* pTemplate2, + CK_ULONG ulCount2) +{ + INPUT_TEMPLATE_ITEM sItem; + + uint32_t i; + uint32_t nDataOffset = 0; + uint32_t nBufferIndex = 0; + uint32_t nBufferSize = 0; + uint8_t* pBuffer = NULL; + CK_RV nErrorCode = CKR_OK; + + if (ulCount1 == 0) + { + /* Nothing to do */ + return CKR_OK; + } + if (pTemplate1 == NULL) + { + /* Nothing to do */ + return CKR_OK; + } + + /* First compute the total required buffer size that + * will contain the full templates (for the template 1 AND 2) + */ + nBufferSize = 4 + /* Nb Attributes */ + sizeof(INPUT_TEMPLATE_ITEM)*ulCount1; /* The attributes items */ + if (pTemplate2 != NULL) + { + nBufferSize += 4 + /* Nb Attributes */ + sizeof(INPUT_TEMPLATE_ITEM)*ulCount2; /* The attributes items */ + } + + /* First data (attribute values) on either template 1 or 2 will just be after the last item */ + nDataOffset = nBufferSize; + + for (i = 0; i < ulCount1; i++) + { + /* Each value will be aligned on 4 bytes. + This computation includes the spare bytes. */ + nBufferSize += PKCS11_GET_SIZE_WITH_ALIGNMENT(pTemplate1[i].ulValueLen); + } + if (pTemplate2 != NULL) + { + for (i = 0; i < ulCount2; i++) + { + /* Each value will be aligned on 4 bytes. + This computation includes the spare bytes. */ + nBufferSize += PKCS11_GET_SIZE_WITH_ALIGNMENT(pTemplate2[i].ulValueLen); + } + } + + pBuffer = (uint8_t*)malloc(nBufferSize); + if (pBuffer == NULL) + { + /* Not enough memory */ + return CKR_DEVICE_MEMORY; + } + + memset(pBuffer, 0, nBufferSize); + + /* + * First template + */ + *(uint32_t*)(pBuffer + nBufferIndex) = ulCount1; + nBufferIndex += 4; + for (i = 0; i < ulCount1; i++) + { + sItem.attributeType = (uint32_t)pTemplate1[i].type; + /* dataOffset = 0 means NULL buffer */ + sItem.dataOffset = ((pTemplate1[i].pValue == NULL) ? 0 : nDataOffset); + sItem.dataParamIndex = nParamIndex; /* The parameter where we store the data (0 to 3) */ + sItem.dataValueLen = (uint32_t)pTemplate1[i].ulValueLen; + /* Copy the item */ + memcpy(pBuffer + nBufferIndex, &sItem, sizeof(INPUT_TEMPLATE_ITEM)); + nBufferIndex += sizeof(INPUT_TEMPLATE_ITEM); + if (pTemplate1[i].pValue != NULL) + { + /* Copy the data */ + memcpy(pBuffer + nDataOffset, (uint8_t*)pTemplate1[i].pValue, (uint32_t)pTemplate1[i].ulValueLen); + /* Next data will be stored just after the previous one but aligned on 4 bytes */ + nDataOffset += PKCS11_GET_SIZE_WITH_ALIGNMENT(pTemplate1[i].ulValueLen); + if ((nDataOffset & 0xC0000000) != 0) + { + /* We whould never go in this case, that means the dataOffset will not be able to store the offset correctly */ + nErrorCode = CKR_DEVICE_ERROR; + goto error; + } + } + } + + /* + * Second template + */ + if (pTemplate2 != NULL) + { + *(uint32_t*)(pBuffer + nBufferIndex) = ulCount2; + nBufferIndex += 4; + for (i = 0; i < ulCount2; i++) + { + sItem.attributeType = (uint32_t)pTemplate2[i].type; + /* dataOffset = 0 means NULL buffer */ + sItem.dataOffset = ((pTemplate2[i].pValue == NULL) ? 0 : nDataOffset); + sItem.dataParamIndex = nParamIndex; /* The parameter where we store the data (0..3) */ + sItem.dataValueLen = (uint32_t)pTemplate2[i].ulValueLen; + /* Copy the item */ + memcpy(pBuffer + nBufferIndex, &sItem, sizeof(INPUT_TEMPLATE_ITEM)); + nBufferIndex += sizeof(INPUT_TEMPLATE_ITEM); + if (pTemplate2[i].pValue != NULL) + { + /* Copy the data */ + memcpy(pBuffer + nDataOffset, (uint8_t*)pTemplate2[i].pValue, (uint32_t)pTemplate2[i].ulValueLen); + /* Next data will be stored just after the previous one but aligned on 4 bytes */ + nDataOffset += PKCS11_GET_SIZE_WITH_ALIGNMENT(pTemplate2[i].ulValueLen); + if ((nDataOffset & 0xC0000000) != 0) + { + /* We whould never go in this case, that means the dataOffset will not be able to store the offset correctly */ + nErrorCode = CKR_DEVICE_ERROR; + goto error; + } + } + } + } + + *ppBuffer = pBuffer; + *pBufferSize = nBufferSize; + + return CKR_OK; + +error: + free(pBuffer); + return nErrorCode; +} + +/******************************************/ +/* The buffer must be freed by the caller */ +/******************************************/ +static CK_RV static_encodeTemplate( + uint8_t** ppBuffer, + uint32_t* pBufferSize, + const uint32_t nParamIndex, + CK_ATTRIBUTE* pTemplate, + CK_ULONG ulCount) +{ + return static_encodeTwoTemplates(ppBuffer, pBufferSize, nParamIndex, pTemplate, ulCount, NULL, 0); +} +/* ----------------------------------------------------------------------- */ + +static CK_RV static_C_CallInit( + uint32_t nCommandID, + CK_SESSION_HANDLE hSession, + const CK_MECHANISM* pMechanism, + CK_OBJECT_HANDLE hKey) +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = nCommandID; + uint32_t nParamType2 = TEEC_NONE; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + if (pMechanism == NULL) + { + return CKR_ARGUMENTS_BAD; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.params[0].value.a = (uint32_t)pMechanism->mechanism; + if (nCommandID != SERVICE_SYSTEM_PKCS11_C_DIGESTINIT_COMMAND_ID) + { + sOperation.params[0].value.b = (uint32_t)hKey; + + } + sOperation.params[1].tmpref.buffer = (uint8_t*)pMechanism->pParameter; + sOperation.params[1].tmpref.size = (uint32_t)pMechanism->ulParameterLen; + + /* Specific case of RSA OAEP */ + if (((nCommandID == SERVICE_SYSTEM_PKCS11_C_ENCRYPTINIT_COMMAND_ID) + ||(nCommandID == SERVICE_SYSTEM_PKCS11_C_DECRYPTINIT_COMMAND_ID)) + && (pMechanism->mechanism == CKM_RSA_PKCS_OAEP) + && (pMechanism->pParameter != NULL)) + { + /* Add the source buffer of the RSA OAEP mechanism parameters */ + nParamType2 = TEEC_MEMREF_TEMP_INPUT; + sOperation.params[2].tmpref.buffer = (uint8_t*)((CK_RSA_PKCS_OAEP_PARAMS_PTR)(pMechanism->pParameter))->pSourceData; + sOperation.params[2].tmpref.size = (uint32_t) ((CK_RSA_PKCS_OAEP_PARAMS_PTR)(pMechanism->pParameter))->ulSourceDataLen; + } + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT, nParamType2, TEEC_NONE); + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + + return nErrorCode; +} + +/* ----------------------------------------------------------------------- */ +/** +* If bSend, the pData buffer is sent to the service. +* If bResult, a buffer is received, the convention described in +* PKCS11 Section 11.2 applies for pResult and pulResultLen. +* Specific function used for single operation +*/ +static CK_RV static_C_CallForSingle( + uint32_t nCommandID, + CK_SESSION_HANDLE hSession, + const CK_BYTE* pData, + CK_ULONG ulDataLen, + CK_BYTE* pResult, + CK_ULONG* pulResultLen, + bool bSend, + bool bReceive) +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = nCommandID; + uint32_t nParamType0 = TEEC_NONE; + uint32_t nParamType1 = TEEC_NONE; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + + if (bSend) + { + nParamType0 = TEEC_MEMREF_TEMP_INPUT; + sOperation.params[0].tmpref.buffer = (uint8_t*)pData; + sOperation.params[0].tmpref.size = (uint32_t)ulDataLen; + } + + if (bReceive) + { + if (pulResultLen == NULL) + { + /* The P11 API Spec states that, in this case, the operation must be + aborted and the error code CKR_ARGUMENTS_BAD must be returned. We + achieve this result by sending an invalid parameter type */ + nParamType1 = TEEC_NONE; + } + else if (pResult == NULL) + { + /* If pResult is NULL, the caller only wants the buffer length. + Send a NULL output memref */ + nParamType1 = TEEC_MEMREF_TEMP_OUTPUT; + sOperation.params[1].tmpref.buffer = (uint8_t*)NULL; + } + else + { + /* send the result buffer information */ + nParamType1 = TEEC_MEMREF_TEMP_OUTPUT; + sOperation.params[1].tmpref.buffer = (uint8_t*)pResult; + sOperation.params[1].tmpref.size = (uint32_t)*pulResultLen; + } + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(nParamType0, nParamType1, TEEC_NONE, TEEC_NONE); + teeErr = TEEC_InvokeCommand(&pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + if (teeErr != TEEC_SUCCESS) + { + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + goto end; + } + + /* Success */ + nErrorCode = CKR_OK; + + end: + if (bReceive) + { + if ((nErrorCode == CKR_OK) || (nErrorCode == CKR_BUFFER_TOO_SMALL)) + { + /* The service has returned the actual result */ + /* The data is already in pResult, we get the returned length */ + *pulResultLen = sOperation.params[1].tmpref.size; + } + } + + return nErrorCode; +} + +/* ----------------------------------------------------------------------- */ +/** +* If bSend, the pData buffer is sent to the service. +* If bResult, a buffer is received, the convention described in +* PKCS11 Section 11.2 applies for pResult and pulResultLen. +* Specific function only used for update operations +*/ +static CK_RV static_C_CallUpdate( + uint32_t nCommandID, + CK_SESSION_HANDLE hSession, + const CK_BYTE* pData, + CK_ULONG ulDataLen, + CK_BYTE* pResult, + CK_ULONG* pulResultLen, + bool bSend, + bool bReceive) +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nResultLen = 0; + uint32_t nCommandIDAndSession = nCommandID; + uint32_t nParamType0 = TEEC_NONE; + uint32_t nParamType1 = TEEC_NONE; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + if (pulResultLen != NULL) + { + nResultLen = *pulResultLen; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + + if (bSend) + { + nParamType0 = TEEC_MEMREF_TEMP_INPUT; + sOperation.params[0].tmpref.buffer = (void*)pData; + sOperation.params[0].tmpref.size = ulDataLen; + } + + if (bReceive) + { + if (pulResultLen == NULL) + { + /* The P11 API Spec states that, in this case, the operation must be + aborted and the error code CKR_ARGUMENTS_BAD must be returned. We + achieve this result by setting an invalid parameter type */ + nParamType1 = TEEC_NONE; + } + else if (pResult == NULL) + { + /* If pResult is NULL, the caller only wants the output buffer length. + Pass a NULL output ref */ + nParamType1 = TEEC_MEMREF_TEMP_OUTPUT; + sOperation.params[1].tmpref.buffer = NULL; + } + else + { + /* send the result buffer information */ + nParamType1 = TEEC_MEMREF_TEMP_OUTPUT; + sOperation.params[1].tmpref.buffer = pResult; + sOperation.params[1].tmpref.size = (uint32_t)*pulResultLen; + } + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(nParamType0, nParamType1, TEEC_NONE, TEEC_NONE); + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + if (teeErr != TEEC_SUCCESS) + { + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + goto end; + } + + /* Success */ + nErrorCode = CKR_OK; + + end: + if (bReceive) + { + if ((nErrorCode == CKR_OK) || (nErrorCode == CKR_BUFFER_TOO_SMALL)) + { + /* The service has returned the actual result */ + /* The data is already in pResult, we get the returned length */ + *pulResultLen = sOperation.params[1].tmpref.size; + } + } + + return nErrorCode; +} + +/* Splits the buffer pData in chunks of nChunkSize size + * and calls static_C_CallUpdate for each chunk + */ +static CK_RV static_C_CallSplitUpdate( + uint32_t nCommandID, + CK_SESSION_HANDLE hSession, + const CK_BYTE* pData, + CK_ULONG ulDataLen, + CK_BYTE* pResult, + CK_ULONG* pulResultLen, + bool bSend, + bool bReceive, + uint32_t nChunkSize) +{ + CK_RV nErrorCode; + CK_ULONG nPartDataLen; + CK_ULONG nPartResultLen = 0; + CK_ULONG ulResultLen = 0; + bool bIsSymOperation = false; + + if (pulResultLen != NULL) + { + ulResultLen = *pulResultLen; + /* Check wether the operation is a symetrical or asymetrical */ + if (*pulResultLen == ulDataLen) + { + bIsSymOperation = true; + } + *pulResultLen = 0; + } + + while (ulDataLen > 0) + { + nPartDataLen = (ulDataLen <= nChunkSize ? + ulDataLen : nChunkSize); + if (bIsSymOperation) + { + /* update the result only if it is a symetric operation */ + nPartResultLen = (ulResultLen <= nChunkSize ? + ulResultLen : nChunkSize); + } + else + { + nPartResultLen = ulResultLen; + } + + nErrorCode = static_C_CallUpdate( + nCommandID, + hSession, + pData, + nPartDataLen, + pResult, + &nPartResultLen, + bSend, + bReceive); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + ulDataLen -= nPartDataLen; + pData += nPartDataLen; + + if (pResult != NULL) + { + ulResultLen -= nPartResultLen; + pResult += nPartResultLen; + } + + if ((pulResultLen != NULL) && (bIsSymOperation)) + { + *pulResultLen += nPartResultLen; + } + } + return CKR_OK; +} + +/* Decides whether to split or not the inout/output buffer into chunks +*/ +static CK_RV static_C_Call_CallForUpdate( + uint32_t nCommandID, + CK_SESSION_HANDLE hSession, + const CK_BYTE* pData, + CK_ULONG ulDataLen, + CK_BYTE* pResult, + CK_ULONG* pulResultLen, + bool bSend, + bool bReceive) +{ + CK_RV nErrorCode; + uint32_t nChunkSize; + + TEEC_ImplementationLimits limits; + + if (!g_bCryptokiInitialized) + { + return CKR_CRYPTOKI_NOT_INITIALIZED; + } + + TEEC_GetImplementationLimits(&limits); + + /* We can split the buffer in chunks of fixed size. + No matter of the start address of the buffer, + a safe size would be TotalNumberOfPages - 1 + */ + nChunkSize = limits.tmprefMaxSize - limits.pageSize; + + if (ulDataLen > nChunkSize) + { + /* inoutMaxSize = 0 means unlimited size */ + nErrorCode = static_C_CallSplitUpdate(nCommandID, + hSession, + pData, + ulDataLen, + pResult, + pulResultLen, + bSend, + bReceive, + nChunkSize); + } + else + { + nErrorCode = static_C_CallUpdate(nCommandID, + hSession, + pData, + ulDataLen, + pResult, + pulResultLen, + bSend, + bReceive); + } + return nErrorCode; + +} + +/* ------------------------------------------------------------------------ +Public Functions +------------------------------------------------------------------------- */ + +CK_RV PKCS11_EXPORT C_CreateObject( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_ATTRIBUTE* pTemplate, /* the object's template */ + CK_ULONG ulCount, /* attributes in template */ + CK_OBJECT_HANDLE* phObject) /* receives new object's handle. */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_CREATEOBJECT_COMMAND_ID; + uint8_t* pBuffer = NULL; + uint32_t nBufferSize = 0; + + if ( pTemplate == NULL || phObject == NULL ) + { + return CKR_ARGUMENTS_BAD; + } + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + nErrorCode = static_encodeTemplate(&pBuffer, &nBufferSize, 0, (CK_ATTRIBUTE*)pTemplate, ulCount); /* Sets the template on the param 0 */ + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_VALUE_OUTPUT, TEEC_NONE, TEEC_NONE); + sOperation.params[0].tmpref.buffer = pBuffer; + sOperation.params[0].tmpref.size = nBufferSize; + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + free(pBuffer); + + if (teeErr != TEEC_SUCCESS) + { + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + goto end; + } + + *phObject = sOperation.params[1].value.a; + + /* Success */ + nErrorCode = CKR_OK; + +end: + return nErrorCode; +} + +CK_RV PKCS11_EXPORT C_DestroyObject( + CK_SESSION_HANDLE hSession, /* the session's handle */ + CK_OBJECT_HANDLE hObject) /* the object's handle */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_DESTROYOBJECT_COMMAND_ID; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = (uint32_t)hObject; + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; +} + +CK_RV PKCS11_EXPORT C_GetAttributeValue( + CK_SESSION_HANDLE hSession, /* the session's handle */ + CK_OBJECT_HANDLE hObject, /* the object's handle */ + CK_ATTRIBUTE* pTemplate, /* specifies attributes, gets values */ + CK_ULONG ulCount) /* attributes in template */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + CK_RV nFinalErrorCode = CKR_OK; + uint32_t i = 0; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_GETATTRIBUTEVALUE_COMMAND_ID; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + if (pTemplate == NULL) + { + return CKR_ARGUMENTS_BAD; + } + + if (ulCount == 0) + { + return CKR_OK; + } + + for (i = 0; i < ulCount; i++) + { + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = (uint32_t)hObject; + sOperation.params[0].value.b = (uint32_t)pTemplate[i].type; + sOperation.params[1].tmpref.buffer = pTemplate[i].pValue; + sOperation.params[1].tmpref.size = pTemplate[i].ulValueLen; + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + if (nErrorCode != CKR_OK) + { + if ( (nErrorCode == CKR_ATTRIBUTE_SENSITIVE) || + (nErrorCode == CKR_ATTRIBUTE_TYPE_INVALID) || + (nErrorCode == CKR_BUFFER_TOO_SMALL)) + { + nFinalErrorCode = nErrorCode; + } + else + { + /* Not some of the special error codes: this is fatal */ + return nErrorCode; + } + } + + pTemplate[i].ulValueLen = sOperation.params[1].tmpref.size; + } + + return nFinalErrorCode; +} + +CK_RV PKCS11_EXPORT C_FindObjectsInit( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_ATTRIBUTE* pTemplate, /* attribute values to match */ + CK_ULONG ulCount) /* attributes in search template */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_FINDOBJECTSINIT_COMMAND_ID; + uint8_t* pBuffer = NULL; + uint32_t nBufferSize = 0; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + nErrorCode = static_encodeTemplate(&pBuffer, &nBufferSize, 0, (CK_ATTRIBUTE*)pTemplate, ulCount); /* Sets the template on the param 0 */ + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].tmpref.buffer = pBuffer; + sOperation.params[0].tmpref.size = nBufferSize; + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + free(pBuffer); + + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; +} + + +CK_RV PKCS11_EXPORT C_FindObjects( + CK_SESSION_HANDLE hSession, /* the session's handle */ + CK_OBJECT_HANDLE* phObject, /* receives object handle array */ + CK_ULONG ulMaxObjectCount, /* max handles to be returned */ + CK_ULONG* pulObjectCount) /* actual number returned */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_FINDOBJECTS_COMMAND_ID; + + if ( (phObject == NULL) || (pulObjectCount == NULL)) + { + return CKR_ARGUMENTS_BAD; + } + + *pulObjectCount = 0; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].tmpref.buffer = (uint8_t*)phObject; + sOperation.params[0].tmpref.size = (uint32_t)ulMaxObjectCount * sizeof(uint32_t); + + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + + if (teeErr != TEEC_SUCCESS) + { + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; + } + + *pulObjectCount = sOperation.params[0].tmpref.size / sizeof(uint32_t); + + return CKR_OK; +} + +CK_RV PKCS11_EXPORT C_FindObjectsFinal(CK_SESSION_HANDLE hSession) /* the session's handle */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_FINDOBJECTSFINAL_COMMAND_ID; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; +} + + +CK_RV PKCS11_EXPORT C_DigestInit( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_MECHANISM* pMechanism) /* the digesting mechanism */ +{ + return static_C_CallInit( + SERVICE_SYSTEM_PKCS11_C_DIGESTINIT_COMMAND_ID, + hSession, + pMechanism, + CK_INVALID_HANDLE); +} + +CK_RV PKCS11_EXPORT C_Digest( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pData, /* data to be digested */ + CK_ULONG ulDataLen, /* bytes of data to be digested */ + CK_BYTE* pDigest, /* receives the message digest */ + CK_ULONG* pulDigestLen) /* receives byte length of digest */ +{ + return static_C_CallForSingle( + SERVICE_SYSTEM_PKCS11_C_DIGEST_COMMAND_ID, + hSession, + pData, + ulDataLen, + pDigest, + pulDigestLen, + TRUE, + TRUE); +} + +CK_RV PKCS11_EXPORT C_DigestUpdate( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pPart, /* data to be digested */ + CK_ULONG ulPartLen) /* bytes of data to be digested */ +{ + return static_C_Call_CallForUpdate( + SERVICE_SYSTEM_PKCS11_C_DIGESTUPDATE_COMMAND_ID, + hSession, + pPart, + ulPartLen, + NULL, + NULL, + TRUE, + FALSE); +} + +CK_RV PKCS11_EXPORT C_DigestFinal( + CK_SESSION_HANDLE hSession, /* the session's handle */ + CK_BYTE* pDigest, /* receives the message digest */ + CK_ULONG* pulDigestLen) /* receives byte count of digest */ +{ + return static_C_Call_CallForUpdate( + SERVICE_SYSTEM_PKCS11_C_DIGESTFINAL_COMMAND_ID, + hSession, + NULL, + 0, + pDigest, + pulDigestLen, + FALSE, + TRUE); +} + + +CK_RV PKCS11_EXPORT C_SignInit( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_MECHANISM* pMechanism, /* the signature mechanism */ + CK_OBJECT_HANDLE hKey) /* handle of the signature key */ +{ + return static_C_CallInit( + SERVICE_SYSTEM_PKCS11_C_SIGNINIT_COMMAND_ID, + hSession, + pMechanism, + hKey); +} + +CK_RV PKCS11_EXPORT C_Sign( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pData, /* the data (digest) to be signed */ + CK_ULONG ulDataLen, /* count of bytes to be signed */ + CK_BYTE* pSignature, /* receives the signature */ + CK_ULONG* pulSignatureLen) /* receives byte count of signature */ +{ + return static_C_CallForSingle( + SERVICE_SYSTEM_PKCS11_C_SIGN_COMMAND_ID, + hSession, + pData, + ulDataLen, + pSignature, + pulSignatureLen, + TRUE, + TRUE); +} + +CK_RV PKCS11_EXPORT C_SignUpdate( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pPart, /* the data (digest) to be signed */ + CK_ULONG ulPartLen) /* count of bytes to be signed */ +{ + return static_C_Call_CallForUpdate( + SERVICE_SYSTEM_PKCS11_C_SIGNUPDATE_COMMAND_ID, + hSession, + pPart, + ulPartLen, + NULL, + NULL, + TRUE, + FALSE); +} + +CK_RV PKCS11_EXPORT C_SignFinal( + CK_SESSION_HANDLE hSession, /* the session's handle */ + CK_BYTE* pSignature, /* receives the signature */ + CK_ULONG* pulSignatureLen) /* receives byte count of signature */ +{ + return static_C_Call_CallForUpdate( + SERVICE_SYSTEM_PKCS11_C_SIGNFINAL_COMMAND_ID, + hSession, + NULL, + 0, + pSignature, + pulSignatureLen, + FALSE, + TRUE); +} + +CK_RV PKCS11_EXPORT C_EncryptInit( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_MECHANISM* pMechanism, /* the encryption mechanism */ + CK_OBJECT_HANDLE hKey) /* handle of encryption key */ +{ + return static_C_CallInit( + SERVICE_SYSTEM_PKCS11_C_ENCRYPTINIT_COMMAND_ID, + hSession, + pMechanism, + hKey); +} + +CK_RV PKCS11_EXPORT C_Encrypt( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pData, /* the plaintext data */ + CK_ULONG ulDataLen, /* bytes of plaintext data */ + CK_BYTE* pEncryptedData, /* receives encrypted data */ + CK_ULONG* pulEncryptedDataLen) /* receives encrypted byte count */ +{ + + return static_C_CallForSingle( + SERVICE_SYSTEM_PKCS11_C_ENCRYPT_COMMAND_ID, + hSession, + pData, + ulDataLen, + pEncryptedData, + pulEncryptedDataLen, + TRUE, + TRUE); +} + + + +CK_RV PKCS11_EXPORT C_EncryptUpdate( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pPart, /* the plaintext data */ + CK_ULONG ulPartLen, /* bytes of plaintext data */ + CK_BYTE* pEncryptedPart, /* receives encrypted data */ + CK_ULONG* pulEncryptedPartLen)/* receives encrypted byte count */ +{ + return static_C_Call_CallForUpdate( + SERVICE_SYSTEM_PKCS11_C_ENCRYPTUPDATE_COMMAND_ID, + hSession, + pPart, + ulPartLen, + pEncryptedPart, + pulEncryptedPartLen, + TRUE, + TRUE); +} + +CK_RV PKCS11_EXPORT C_EncryptFinal( + CK_SESSION_HANDLE hSession, /* the session's handle */ + CK_BYTE* pLastEncryptedPart, /* receives encrypted last part */ + CK_ULONG* pulLastEncryptedPartLen) /* receives byte count */ +{ + return static_C_Call_CallForUpdate( + SERVICE_SYSTEM_PKCS11_C_ENCRYPTFINAL_COMMAND_ID, + hSession, + NULL, + 0, + pLastEncryptedPart, + pulLastEncryptedPartLen, + FALSE, + TRUE); +} + +CK_RV PKCS11_EXPORT C_DecryptInit( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_MECHANISM* pMechanism, /* the decryption mechanism */ + CK_OBJECT_HANDLE hKey) /* handle of the decryption key */ +{ + return static_C_CallInit( + SERVICE_SYSTEM_PKCS11_C_DECRYPTINIT_COMMAND_ID, + hSession, + pMechanism, + hKey); +} + +CK_RV PKCS11_EXPORT C_Decrypt( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pEncryptedData, /* input encrypted data */ + CK_ULONG ulEncryptedDataLen, /* count of bytes of input */ + CK_BYTE* pData, /* receives decrypted output */ + CK_ULONG* pulDataLen) /* receives decrypted byte count */ +{ + + return static_C_CallForSingle( + SERVICE_SYSTEM_PKCS11_C_DECRYPT_COMMAND_ID, + hSession, + pEncryptedData, + ulEncryptedDataLen, + pData, + pulDataLen, + TRUE, + TRUE); +} + +CK_RV PKCS11_EXPORT C_DecryptUpdate( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pEncryptedPart, /* input encrypted data */ + CK_ULONG ulEncryptedPartLen, /* count of bytes of input */ + CK_BYTE* pPart, /* receives decrypted output */ + CK_ULONG* pulPartLen) /* receives decrypted byte count */ +{ + return static_C_Call_CallForUpdate( + SERVICE_SYSTEM_PKCS11_C_DECRYPTUPDATE_COMMAND_ID, + hSession, + pEncryptedPart, + ulEncryptedPartLen, + pPart, + pulPartLen, + TRUE, + TRUE); +} + +CK_RV PKCS11_EXPORT C_DecryptFinal( + CK_SESSION_HANDLE hSession, /* the session's handle */ + CK_BYTE* pLastPart, /* receives decrypted output */ + CK_ULONG* pulLastPartLen) /* receives decrypted byte count */ +{ + return static_C_Call_CallForUpdate( + SERVICE_SYSTEM_PKCS11_C_DECRYPTFINAL_COMMAND_ID, + hSession, + NULL, + 0, + pLastPart, + pulLastPartLen, + FALSE, + TRUE); +} + + +CK_RV PKCS11_EXPORT C_GenerateKey( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_MECHANISM* pMechanism, /* the key generation mechanism */ + const CK_ATTRIBUTE* pTemplate, /* template for the new key */ + CK_ULONG ulCount, /* number of attributes in template */ + CK_OBJECT_HANDLE* phKey) /* receives handle of new key */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_GENERATEKEY_COMMAND_ID; + uint8_t* pBuffer = NULL; + uint32_t nBufferSize = 0; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + if ((pMechanism == NULL) || (phKey == NULL) || (pTemplate == NULL)) + { + return CKR_ARGUMENTS_BAD; + } + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + nErrorCode = static_encodeTemplate(&pBuffer, &nBufferSize, 2, (CK_ATTRIBUTE*)pTemplate, ulCount); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.params[0].value.a = (uint32_t)pMechanism->mechanism; + sOperation.params[0].value.b = 0; + sOperation.params[1].tmpref.buffer = pMechanism->pParameter; + sOperation.params[1].tmpref.size = (uint32_t)pMechanism->ulParameterLen; + sOperation.params[2].tmpref.buffer = pBuffer; + sOperation.params[2].tmpref.size = nBufferSize; + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_MEMREF_TEMP_INPUT, TEEC_MEMREF_TEMP_INPUT, TEEC_NONE); + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + free(pBuffer); + + if (teeErr != TEEC_SUCCESS) + { + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; + } + + *phKey = sOperation.params[0].value.a; + + return CKR_OK; +} + +CK_RV PKCS11_EXPORT C_GenerateKeyPair( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_MECHANISM* pMechanism, /* the key gen. mech. */ + const CK_ATTRIBUTE* pPublicKeyTemplate, /* pub. attr. template */ + CK_ULONG ulPublicKeyAttributeCount, /* # of pub. attrs. */ + const CK_ATTRIBUTE* pPrivateKeyTemplate, /* priv. attr. template */ + CK_ULONG ulPrivateKeyAttributeCount, /* # of priv. attrs. */ + CK_OBJECT_HANDLE* phPublicKey, /* gets pub. key handle */ + CK_OBJECT_HANDLE* phPrivateKey) /* gets priv. key handle */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_GENERATEKEYPAIR_COMMAND_ID; + uint8_t* pBuffer = NULL; + uint32_t nBufferSize = 0; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + if ( (pMechanism == NULL) || + (pPublicKeyTemplate == NULL) || (pPrivateKeyTemplate == NULL) || + (phPublicKey== NULL) || (phPrivateKey== NULL)) + { + return CKR_ARGUMENTS_BAD; + } + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + nErrorCode = static_encodeTwoTemplates(&pBuffer, &nBufferSize, 2, (CK_ATTRIBUTE*)pPublicKeyTemplate, ulPublicKeyAttributeCount, (CK_ATTRIBUTE*)pPrivateKeyTemplate, ulPrivateKeyAttributeCount); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.params[0].value.a = (uint32_t)pMechanism->mechanism; + sOperation.params[0].value.b = 0; + sOperation.params[1].tmpref.buffer = (uint8_t*)pMechanism->pParameter; + sOperation.params[1].tmpref.size = (uint32_t)pMechanism->ulParameterLen; + sOperation.params[2].tmpref.buffer = pBuffer; + sOperation.params[2].tmpref.size = nBufferSize; + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_MEMREF_TEMP_INPUT, TEEC_MEMREF_TEMP_INPUT, TEEC_NONE); + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + free(pBuffer); + + if (teeErr != TEEC_SUCCESS) + { + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; + } + + *phPublicKey = sOperation.params[0].value.a; + *phPrivateKey = sOperation.params[0].value.b; + + return CKR_OK; +} + +CK_RV PKCS11_EXPORT C_DeriveKey( + CK_SESSION_HANDLE hSession, /* session's handle */ + const CK_MECHANISM* pMechanism, /* key deriv. mech. */ + CK_OBJECT_HANDLE hBaseKey, /* base key */ + const CK_ATTRIBUTE* pTemplate, /* new key template */ + CK_ULONG ulAttributeCount, /* template length */ + CK_OBJECT_HANDLE* phKey) /* gets new handle */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_DERIVEKEY_COMMAND_ID; + uint8_t* pBuffer = NULL; + uint32_t nBufferSize = 0; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + if ((pMechanism == NULL) || (pTemplate == NULL) || (phKey == NULL)) + { + return CKR_ARGUMENTS_BAD; + } + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + nErrorCode = static_encodeTemplate(&pBuffer, &nBufferSize, 2, (CK_ATTRIBUTE*)pTemplate, ulAttributeCount); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.params[0].value.a = (uint32_t)pMechanism->mechanism; + sOperation.params[0].value.b = (uint32_t)hBaseKey; + sOperation.params[1].tmpref.buffer = (uint8_t*)pMechanism->pParameter; + sOperation.params[1].tmpref.size = (uint32_t)pMechanism->ulParameterLen; + sOperation.params[2].tmpref.buffer = pBuffer; + sOperation.params[2].tmpref.size = nBufferSize; + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_MEMREF_TEMP_INPUT, TEEC_MEMREF_TEMP_INPUT, TEEC_NONE); + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + free(pBuffer); + + if (teeErr != TEEC_SUCCESS) + { + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; + } + + *phKey = sOperation.params[0].value.a; + + return CKR_OK; +} + +CK_RV PKCS11_EXPORT C_SeedRandom( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pSeed, /* the seed material */ + CK_ULONG ulSeedLen) /* count of bytes of seed material */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_SEEDRANDOM_COMMAND_ID; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].tmpref.buffer = (uint8_t*)pSeed; + sOperation.params[0].tmpref.size = (uint32_t)ulSeedLen; + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; +} + +CK_RV PKCS11_EXPORT C_GenerateRandom( + CK_SESSION_HANDLE hSession, /* the session's handle */ + CK_BYTE* pRandomData, /* receives the random data */ + CK_ULONG ulRandomLen) /* number of bytes to be generated */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_GENERATERANDOM_COMMAND_ID; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + do + { + CK_ULONG nArrayLength; + nArrayLength = 1024; + if (ulRandomLen < nArrayLength) + { + nArrayLength = ulRandomLen; + } + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].tmpref.buffer = (uint8_t*)pRandomData; + sOperation.params[0].tmpref.size = (uint32_t)nArrayLength; + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + if (teeErr != TEEC_SUCCESS) + { + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; + } + + ulRandomLen -= nArrayLength; + pRandomData += nArrayLength; + if (ulRandomLen == 0) + { + break; + } + } + while(1); + + return CKR_OK; +} + +CK_RV PKCS11_EXPORT C_VerifyInit( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_MECHANISM* pMechanism, /* the verification mechanism */ + CK_OBJECT_HANDLE hKey) /* handle of the verification key */ +{ + return static_C_CallInit( + SERVICE_SYSTEM_PKCS11_C_VERIFYINIT_COMMAND_ID, + hSession, + pMechanism, + hKey); +} + +CK_RV PKCS11_EXPORT C_Verify( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pData, /* plaintext data (digest) to compare */ + CK_ULONG ulDataLen, /* length of data (digest) in bytes */ + CK_BYTE* pSignature, /* the signature to be verified */ + CK_ULONG ulSignatureLen) /* count of bytes of signature */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_VERIFY_COMMAND_ID; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.params[0].tmpref.buffer = (uint8_t*)pData; + sOperation.params[0].tmpref.size = (uint32_t)ulDataLen; + sOperation.params[1].tmpref.buffer = (uint8_t*)pSignature; + sOperation.params[1].tmpref.size = (uint32_t)ulSignatureLen; + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE); + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; +} + +CK_RV PKCS11_EXPORT C_VerifyUpdate( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pPart, /* plaintext data (digest) to compare */ + CK_ULONG ulPartLen) /* length of data (digest) in bytes */ +{ + return static_C_Call_CallForUpdate( + SERVICE_SYSTEM_PKCS11_C_VERIFYUPDATE_COMMAND_ID, + hSession, + pPart, + ulPartLen, + NULL, + NULL, + TRUE, + FALSE); +} + +CK_RV PKCS11_EXPORT C_VerifyFinal( + CK_SESSION_HANDLE hSession, /* the session's handle */ + const CK_BYTE* pSignature, /* the signature to be verified */ + CK_ULONG ulSignatureLen) /* count of bytes of signature */ +{ + return static_C_Call_CallForUpdate( + SERVICE_SYSTEM_PKCS11_C_VERIFYFINAL_COMMAND_ID, + hSession, + pSignature, + ulSignatureLen, + NULL, + NULL, + TRUE, + FALSE); +} + +CK_RV PKCS11_EXPORT C_CloseObjectHandle( + CK_SESSION_HANDLE hSession, /* the session's handle */ + CK_OBJECT_HANDLE hObject) /* the object's handle */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_CLOSEOBJECTHANDLE_COMMAND_ID; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = (uint32_t)hObject; + sOperation.params[0].value.b = 0; + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; +} + +CK_RV PKCS11_EXPORT C_CopyObject( + CK_SESSION_HANDLE hSession, /* the session's handle */ + CK_OBJECT_HANDLE hObject, /* the source object's handle */ + const CK_ATTRIBUTE* pTemplate, /* the template of the copied object */ + CK_ULONG ulCount, /* the number of attributes of the template*/ + CK_OBJECT_HANDLE* phNewObject) /* the copied object's handle */ +{ + TEEC_Result teeErr; + uint32_t nErrorOrigin; + TEEC_Operation sOperation; + CK_RV nErrorCode = CKR_OK; + uint32_t nCommandIDAndSession = SERVICE_SYSTEM_PKCS11_C_COPYOBJECT_COMMAND_ID; + uint8_t* pBuffer = NULL; + uint32_t nBufferSize = 0; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + if ((pTemplate == NULL) || (phNewObject == NULL)) + { + return CKR_ARGUMENTS_BAD; + } + + nErrorCode = static_checkPreConditionsAndUpdateHandles(&hSession, &nCommandIDAndSession, &pSession); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + nErrorCode = static_encodeTemplate(&pBuffer, &nBufferSize, 1, (CK_ATTRIBUTE*)pTemplate, ulCount); + if (nErrorCode != CKR_OK) + { + return nErrorCode; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.params[0].value.a = (uint32_t)hObject; + sOperation.params[0].value.b = 0; + sOperation.params[1].tmpref.buffer = pBuffer; + sOperation.params[1].tmpref.size = nBufferSize; + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE); + teeErr = TEEC_InvokeCommand( &pSession->sSession, + nCommandIDAndSession, /* commandID */ + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + free(pBuffer); + + if (teeErr != TEEC_SUCCESS) + { + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + teeErr : + ckInternalTeeErrorToCKError(teeErr)); + return nErrorCode; + } + + *phNewObject = sOperation.params[0].value.a; + + return CKR_OK; +} diff --git a/security/tf_crypto_sst/pkcs11_session.c b/security/tf_crypto_sst/pkcs11_session.c new file mode 100644 index 0000000..bc845c7 --- /dev/null +++ b/security/tf_crypto_sst/pkcs11_session.c @@ -0,0 +1,420 @@ +/** + * Copyright(c) 2011 Trusted Logic. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name Trusted Logic nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 COPYRIGHT + * OWNER OR CONTRIBUTORS 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. + */ + +/* + * Implementation Notes: + * + * The PKCS11 session handle is directly mapped on the + * Trusted Foundations Software session handle (S_HANDLE). + */ + +#include "pkcs11_internal.h" + + +/* ------------------------------------------------------------------------ + Public Functions +------------------------------------------------------------------------- */ + + +CK_RV PKCS11_EXPORT C_OpenSession(CK_SLOT_ID slotID, /* the slot's ID */ + CK_FLAGS flags, /* defined in CK_SESSION_INFO */ + CK_VOID_PTR pApplication, /* pointer passed to callback */ + CK_NOTIFY Notify, /* notification callback function */ + CK_SESSION_HANDLE* phSession) /* receives new session handle */ +{ + CK_RV nErrorCode = CKR_OK; + uint32_t nErrorOrigin = TEEC_ORIGIN_API; + TEEC_Result nTeeError; + TEEC_Operation sOperation; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession = NULL; + PPKCS11_SECONDARY_SESSION_CONTEXT pSecondarySession = NULL; + uint32_t nLoginType; + uint32_t nLoginData = 0; + void* pLoginData = NULL; + bool bIsPrimarySession; + char* pSignatureFile = NULL; + uint32_t nSignatureFileLen = 0; + uint8_t nParamType3 = TEEC_NONE; + + /* Prevent the compiler from complaining about unused parameters */ + do{(void)pApplication;}while(0); + do{(void)Notify;}while(0); + + if (phSession == NULL) + { + return CKR_ARGUMENTS_BAD; + } + + /* Check Cryptoki is initialized */ + if (!g_bCryptokiInitialized) + { + return CKR_CRYPTOKI_NOT_INITIALIZED; + } + + if ((flags & CKVF_OPEN_SUB_SESSION) == 0) + { + *phSession = CK_INVALID_HANDLE; + + /* + * Allocate the session context + */ + pSession = (PPKCS11_PRIMARY_SESSION_CONTEXT)malloc(sizeof(PKCS11_PRIMARY_SESSION_CONTEXT)); + if (pSession == NULL) + { + return CKR_DEVICE_MEMORY; + } + + pSession->sHeader.nMagicWord = PKCS11_SESSION_MAGIC; + pSession->sHeader.nSessionTag = PKCS11_PRIMARY_SESSION_TAG; + memset(&pSession->sSession, 0, sizeof(TEEC_Session)); + pSession->sSecondarySessionTable.pRoot = NULL_PTR; + + /* The structure must be initialized first (in a portable manner) + to make it work on Win32 */ + memset(&pSession->sSecondarySessionTableMutex, 0, + sizeof(pSession->sSecondarySessionTableMutex)); + libMutexInit(&pSession->sSecondarySessionTableMutex); + + switch (slotID) + { + case CKV_TOKEN_SYSTEM_SHARED: + case CKV_TOKEN_USER_SHARED: + nLoginType = TEEC_LOGIN_PUBLIC; + break; + + case CKV_TOKEN_SYSTEM: + case CKV_TOKEN_USER: + default: + nLoginType = TEEC_LOGIN_AUTHENTICATION; + break; + } + + /* Group tokens */ + if ((slotID >= 0x00010000) && (slotID <= 0x0002FFFF)) + { + nLoginType = TEEC_LOGIN_GROUP; + + /* The 16 lower-order bits encode the group identifier */ + nLoginData = (uint32_t)slotID & 0x0000FFFF; + pLoginData = (void*)&nLoginData; + + /* Update the slotID for the system / PKCS11 service */ + if ((slotID >= 0x00010000) && (slotID <= 0x0001FFFF)) + { + /* System group token */ + slotID = 3; /* CKV_TOKEN_SYSTEM_GROUP */ + } + else /* ((slotID >= 0x00020000) && (slotID <= 0x0002FFFF)) */ + { + /* User group token */ + slotID = 0x4014; /* CKV_TOKEN_USER_GROUP */ + } + } + +retry: + memset(&sOperation, 0, sizeof(TEEC_Operation)); + + if (nLoginType == TEEC_LOGIN_AUTHENTICATION) + { + nTeeError = TEEC_ReadSignatureFile((void **)&pSignatureFile, &nSignatureFileLen); + if (nTeeError != TEEC_ERROR_ITEM_NOT_FOUND) + { + if (nTeeError != TEEC_SUCCESS) + { + goto error; + } + + sOperation.params[3].tmpref.buffer = pSignatureFile; + sOperation.params[3].tmpref.size = nSignatureFileLen; + nParamType3 = TEEC_MEMREF_TEMP_INPUT; + } + else + { + /* No signature file found. + * Should use LOGIN_APPLICATION for now + * Can not use TEEC_LOGIN_AUTHENTICATION as this means that all .exe wil need a signature file + * - a bit annoying for when passing the tests + */ + nLoginType = TEEC_LOGIN_USER_APPLICATION; + } + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, nParamType3); + nTeeError = TEEC_OpenSession(&g_sContext, + &pSession->sSession, /* OUT session */ + &SERVICE_UUID, /* destination UUID */ + nLoginType, /* connectionMethod */ + pLoginData, /* connectionData */ + &sOperation, /* IN OUT operation */ + NULL /* OUT returnOrigin, optional */ + ); + if (nTeeError != TEEC_SUCCESS) + { + /* No need of the returnOrigin as this is not specific to P11 */ + + if ( (nTeeError == TEEC_ERROR_NOT_SUPPORTED) && + (nLoginType == TEEC_LOGIN_AUTHENTICATION)) + { + /* We could not open a session with the login TEEC_LOGIN_AUTHENTICATION */ + /* If it is not supported by the product, */ + /* retry with fallback to TEEC_LOGIN_USER_APPLICATION */ + nLoginType = TEEC_LOGIN_USER_APPLICATION; + goto retry; + } + + /* The ERROR_ACCESS_DENIED, if returned, will be converted into CKR_TOKEN_NOT_PRESENT + * For the External Cryptographic API, this means that the authentication + * of the calling application fails. + */ + goto error; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.params[0].value.a = slotID; + sOperation.params[0].value.b = flags; /* access flags */ + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + nTeeError = TEEC_InvokeCommand(&pSession->sSession, + SERVICE_SYSTEM_PKCS11_C_OPEN_SESSION_COMMAND_ID & 0x00007FFF, + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + if (nTeeError != TEEC_SUCCESS) + { + goto error; + } + + *phSession = (CK_SESSION_HANDLE)pSession; + pSession->hCryptoSession = sOperation.params[0].value.a; + + return CKR_OK; + } + else + { + bool bResult; + + /* Check that {*phSession} is a valid primary session handle */ + if ((!ckInternalSessionIsOpenedEx(*phSession, &bIsPrimarySession)) || + (!bIsPrimarySession)) + { + return CKR_SESSION_HANDLE_INVALID; + } + + pSession = (PPKCS11_PRIMARY_SESSION_CONTEXT)(*phSession); + + /* allocate the secondary session context */ + pSecondarySession = (PKCS11_SECONDARY_SESSION_CONTEXT*)malloc(sizeof(PKCS11_SECONDARY_SESSION_CONTEXT)); + if (pSecondarySession == NULL) + { + return CKR_DEVICE_MEMORY; + } + pSecondarySession->sHeader.nMagicWord = PKCS11_SESSION_MAGIC; + pSecondarySession->sHeader.nSessionTag = PKCS11_SECONDARY_SESSION_TAG; + pSecondarySession->pPrimarySession = pSession; + + libMutexLock(&pSession->sSecondarySessionTableMutex); + bResult = libObjectHandle16Add(&pSession->sSecondarySessionTable, + &pSecondarySession->sSecondarySessionNode); + libMutexUnlock(&pSession->sSecondarySessionTableMutex); + if (bResult == false) + { + free(pSecondarySession); + return CKR_DEVICE_MEMORY; + } + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + nTeeError = TEEC_InvokeCommand(&pSession->sSession, + (pSession->hCryptoSession << 16) | + (1 << 15) | + (SERVICE_SYSTEM_PKCS11_C_OPEN_SESSION_COMMAND_ID & 0x00007FFF), + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + if (nTeeError != TEEC_SUCCESS) + { + goto error; + } + + *phSession = (CK_SESSION_HANDLE)pSecondarySession; + pSecondarySession->hSecondaryCryptoSession = sOperation.params[0].value.a; + + return CKR_OK; + } + +error: + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + nTeeError : + ckInternalTeeErrorToCKError(nTeeError)); + + if ((flags & CKVF_OPEN_SUB_SESSION) == 0) + { + libMutexDestroy(&pSession->sSecondarySessionTableMutex); + free(pSession); + } + else + { + libMutexLock(&pSession->sSecondarySessionTableMutex); + libObjectHandle16Remove(&pSession->sSecondarySessionTable,&pSecondarySession->sSecondarySessionNode); + libMutexUnlock(&pSession->sSecondarySessionTableMutex); + free(pSecondarySession); + } + + return nErrorCode; +} + +CK_RV PKCS11_EXPORT C_CloseSession(CK_SESSION_HANDLE hSession) /* the session's handle */ +{ + CK_RV nErrorCode = CKR_OK; + uint32_t nErrorOrigin = TEEC_ORIGIN_API; + TEEC_Result nTeeError; + TEEC_Operation sOperation; + bool bIsPrimarySession; + + /* Check Cryptoki is initialized */ + if (!g_bCryptokiInitialized) + { + return CKR_CRYPTOKI_NOT_INITIALIZED; + } + + if (!ckInternalSessionIsOpenedEx(hSession, &bIsPrimarySession)) + { + return CKR_SESSION_HANDLE_INVALID; + } + + if (bIsPrimarySession) + { + LIB_OBJECT_NODE_HANDLE16* pObject; + PPKCS11_SECONDARY_SESSION_CONTEXT pSecSession; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession = (PPKCS11_PRIMARY_SESSION_CONTEXT)hSession; + + hSession = pSession->hCryptoSession; + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + nTeeError = TEEC_InvokeCommand(&pSession->sSession, + (pSession->hCryptoSession << 16 ) | + (SERVICE_SYSTEM_PKCS11_C_CLOSE_SESSION_COMMAND_ID & 0x00007FFF), + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + if (nTeeError != TEEC_SUCCESS) + { + goto end; + } + + TEEC_CloseSession(&pSession->sSession); + memset(&pSession->sSession, 0, sizeof(TEEC_Session)); + + /* Free all secondary session contexts */ + libMutexLock(&pSession->sSecondarySessionTableMutex); + pObject = libObjectHandle16RemoveOne(&pSession->sSecondarySessionTable); + while (pObject != NULL) + { + /* find all secondary session contexts, + and release associated resources */ + + pSecSession = LIB_OBJECT_CONTAINER_OF(pObject, //ptr + PKCS11_SECONDARY_SESSION_CONTEXT,//type + sSecondarySessionNode);//member + + /* free secondary session context */ + free(pSecSession); + + pObject = libObjectHandle16RemoveOne(&pSession->sSecondarySessionTable); + } + libMutexUnlock(&pSession->sSecondarySessionTableMutex); + + libMutexDestroy(&pSession->sSecondarySessionTableMutex); + + /* free primary session context */ + free(pSession); + } + else + { + PPKCS11_SECONDARY_SESSION_CONTEXT pSecSession = (PPKCS11_SECONDARY_SESSION_CONTEXT)hSession; + PPKCS11_PRIMARY_SESSION_CONTEXT pSession; + + uint32_t nCommandID = ( (pSecSession->hSecondaryCryptoSession & 0xFFFF) << 16 ) | + (1 << 15) | + (SERVICE_SYSTEM_PKCS11_C_CLOSE_SESSION_COMMAND_ID & 0x00007FFF); + + /* every pre-check are fine, then, update the local handles */ + hSession = pSecSession->pPrimarySession->hCryptoSession; + pSession = (PPKCS11_PRIMARY_SESSION_CONTEXT)(pSecSession->pPrimarySession); + + memset(&sOperation, 0, sizeof(TEEC_Operation)); + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, TEEC_NONE); + nTeeError = TEEC_InvokeCommand(&pSession->sSession, + nCommandID, + &sOperation, /* IN OUT operation */ + &nErrorOrigin /* OUT returnOrigin, optional */ + ); + if (nTeeError != TEEC_SUCCESS) + { + goto end; + } + + /* remove the object from the table */ + libMutexLock(&pSession->sSecondarySessionTableMutex); + libObjectHandle16Remove(&pSecSession->pPrimarySession->sSecondarySessionTable, &pSecSession->sSecondarySessionNode); + libMutexUnlock(&pSession->sSecondarySessionTableMutex); + + /* free secondary session context */ + free(pSecSession); + } + +end: + nErrorCode = (nErrorOrigin == TEEC_ORIGIN_TRUSTED_APP ? + nTeeError : + ckInternalTeeErrorToCKError(nTeeError)); + return nErrorCode; +} + + +CK_RV PKCS11_EXPORT C_Login(CK_SESSION_HANDLE hSession, /* the session's handle */ + CK_USER_TYPE userType, /* the user type */ + const CK_UTF8CHAR* pPin, /* the user's PIN */ + CK_ULONG ulPinLen) /* the length of the PIN */ +{ + /* Prevent the compiler from complaining about unused variables */ + do{(void)hSession;}while(0); + do{(void)userType;}while(0); + do{(void)pPin;}while(0); + do{(void)ulPinLen;}while(0); + + return CKR_OK; +} + +CK_RV PKCS11_EXPORT C_Logout(CK_SESSION_HANDLE hSession) /* the session's handle */ +{ + do{(void)hSession;}while(0); + + return CKR_OK; +} diff --git a/security/tf_crypto_sst/service_system_protocol.h b/security/tf_crypto_sst/service_system_protocol.h new file mode 100644 index 0000000..560ec40 --- /dev/null +++ b/security/tf_crypto_sst/service_system_protocol.h @@ -0,0 +1,116 @@ +/** + * Copyright(c) 2011 Trusted Logic. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name Trusted Logic nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 COPYRIGHT + * OWNER OR CONTRIBUTORS 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 __SERVICE_SYSTEM_PROTOCOL_H__ +#define __SERVICE_SYSTEM_PROTOCOL_H__ + +#include "s_type.h" + +/* ----------------------------------------------------------------------------- + UUID and Name +----------------------------------------------------------------------------- */ + +/** Service Identifier */ +/* {56304b83-5c4e-4428-b99e-605c96ae58d6} */ +#define SERVICE_SYSTEM_UUID { 0x56304b83, 0x5c4e, 0x4428, { 0xb9, 0x9e, 0x60, 0x5c, 0x96, 0xae, 0x58, 0xd6 } } + +/** Generic type for error codes in the system service */ +#define SERVICE_SYSTEM_NAME_ASCII "SYSTEM" + + +/* ----------------------------------------------------------------------------- + SST Command identifiers +----------------------------------------------------------------------------- */ + +#define SERVICE_SYSTEM_SST_OPEN_COMMAND_ID 0x00000001 +#define SERVICE_SYSTEM_SST_CLOSE_COMMAND_ID 0x00000002 +#define SERVICE_SYSTEM_SST_READ_COMMAND_ID 0x00000003 +#define SERVICE_SYSTEM_SST_WRITE_COMMAND_ID 0x00000004 +#define SERVICE_SYSTEM_SST_SEEK_COMMAND_ID 0x00000005 +#define SERVICE_SYSTEM_SST_GET_OFFSET_AND_SIZE_COMMAND_ID 0x00000007 +#define SERVICE_SYSTEM_SST_GET_SIZE_COMMAND_ID 0x00000008 +#define SERVICE_SYSTEM_SST_CLOSE_DELETE_COMMAND_ID 0x00000009 +#define SERVICE_SYSTEM_SST_TRUNCATE_COMMAND_ID 0x0000000A +#define SERVICE_SYSTEM_SST_ENUM_START_COMMAND_ID 0x0000000B +#define SERVICE_SYSTEM_SST_ENUM_GETNEXT_COMMAND_ID 0x0000000C +#define SERVICE_SYSTEM_SST_ENUM_CLOSE_COMMAND_ID 0x0000000D +#define SERVICE_SYSTEM_SST_RENAME_COMMAND_ID 0x0000000E + +/* ----------------------------------------------------------------------------- + PKCS11/MTC Command identifiers +----------------------------------------------------------------------------- */ +#define SERVICE_SYSTEM_PKCS11_C_CREATEOBJECT_COMMAND_ID 0x00000020 +#define SERVICE_SYSTEM_PKCS11_C_DESTROYOBJECT_COMMAND_ID 0x00000021 +#define SERVICE_SYSTEM_PKCS11_C_GETATTRIBUTEVALUE_COMMAND_ID 0x00000022 +#define SERVICE_SYSTEM_PKCS11_C_FINDOBJECTSINIT_COMMAND_ID 0x00000023 +#define SERVICE_SYSTEM_PKCS11_C_FINDOBJECTS_COMMAND_ID 0x00000024 +#define SERVICE_SYSTEM_PKCS11_C_FINDOBJECTSFINAL_COMMAND_ID 0x00000025 +#define SERVICE_SYSTEM_PKCS11_C_DIGESTINIT_COMMAND_ID 0x00000026 +#define SERVICE_SYSTEM_PKCS11_C_DIGEST_COMMAND_ID 0x00000027 +#define SERVICE_SYSTEM_PKCS11_C_DIGESTUPDATE_COMMAND_ID 0x00000028 +#define SERVICE_SYSTEM_PKCS11_C_DIGESTFINAL_COMMAND_ID 0x00000029 +#define SERVICE_SYSTEM_PKCS11_C_SIGNINIT_COMMAND_ID 0x0000002A +#define SERVICE_SYSTEM_PKCS11_C_SIGN_COMMAND_ID 0x0000002B +#define SERVICE_SYSTEM_PKCS11_C_SIGNUPDATE_COMMAND_ID 0x0000002C +#define SERVICE_SYSTEM_PKCS11_C_SIGNFINAL_COMMAND_ID 0x0000002D +#define SERVICE_SYSTEM_PKCS11_C_ENCRYPTINIT_COMMAND_ID 0x0000002E +#define SERVICE_SYSTEM_PKCS11_C_ENCRYPT_COMMAND_ID 0x0000002F +#define SERVICE_SYSTEM_PKCS11_C_ENCRYPTUPDATE_COMMAND_ID 0x00000030 +#define SERVICE_SYSTEM_PKCS11_C_ENCRYPTFINAL_COMMAND_ID 0x00000031 +#define SERVICE_SYSTEM_PKCS11_C_DECRYPTINIT_COMMAND_ID 0x00000032 +#define SERVICE_SYSTEM_PKCS11_C_DECRYPT_COMMAND_ID 0x00000033 +#define SERVICE_SYSTEM_PKCS11_C_DECRYPTUPDATE_COMMAND_ID 0x00000034 +#define SERVICE_SYSTEM_PKCS11_C_DECRYPTFINAL_COMMAND_ID 0x00000035 +#define SERVICE_SYSTEM_PKCS11_C_GENERATEKEY_COMMAND_ID 0x00000036 +#define SERVICE_SYSTEM_PKCS11_C_GENERATEKEYPAIR_COMMAND_ID 0x00000037 +#define SERVICE_SYSTEM_PKCS11_C_SEEDRANDOM_COMMAND_ID 0x00000038 +#define SERVICE_SYSTEM_PKCS11_C_GENERATERANDOM_COMMAND_ID 0x00000039 +#define SERVICE_SYSTEM_PKCS11_C_VERIFYINIT_COMMAND_ID 0x0000003A +#define SERVICE_SYSTEM_PKCS11_C_VERIFY_COMMAND_ID 0x0000003B +#define SERVICE_SYSTEM_PKCS11_C_VERIFYUPDATE_COMMAND_ID 0x0000003C +#define SERVICE_SYSTEM_PKCS11_C_VERIFYFINAL_COMMAND_ID 0x0000003D +#define SERVICE_SYSTEM_PKCS11_C_DERIVEKEY_COMMAND_ID 0x0000003E +#define SERVICE_SYSTEM_PKCS11_C_ABORTOPERATION_COMMAND_ID 0x0000003F +#define SERVICE_SYSTEM_PKCS11_C_COPYOBJECT_COMMAND_ID 0x00000040 +#define SERVICE_SYSTEM_PKCS11_C_CLOSEOBJECTHANDLE_COMMAND_ID 0x00000041 +#define SERVICE_SYSTEM_PKCS11_C_OPEN_SESSION_COMMAND_ID 0x00000042 +#define SERVICE_SYSTEM_PKCS11_C_CLOSE_SESSION_COMMAND_ID 0x00000043 +#define SERVICE_SYSTEM_PKCS11_INCREMENT_MTC_COMMAND_ID 0x00000044 +#define SERVICE_SYSTEM_PKCS11_GET_MTC_COMMAND_ID 0x00000045 + +typedef struct +{ + uint32_t attributeType; + uint32_t dataOffset : 30; + uint32_t dataParamIndex : 2; + uint32_t dataValueLen; +} INPUT_TEMPLATE_ITEM; + +#endif /* __SERVICE_SYSTEM_PROTOCOL_H__ */ diff --git a/security/tf_crypto_sst/sst_stub.c b/security/tf_crypto_sst/sst_stub.c new file mode 100644 index 0000000..e8a78bc --- /dev/null +++ b/security/tf_crypto_sst/sst_stub.c @@ -0,0 +1,800 @@ +/** + * Copyright(c) 2011 Trusted Logic. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name Trusted Logic nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 COPYRIGHT + * OWNER OR CONTRIBUTORS 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. + */ + +#ifdef __ANDROID32__ +#include <stddef.h> +#endif + +#include <stdlib.h> +#include <string.h> + +#define SST_EXPORTS +#define EXCLUDE_SERVICE_SYSTEM_SST_BASIC_TYPES +#include "sst.h" + +/* Included for the TEE management */ +#include "pkcs11_internal.h" + + +static TEEC_Session g_SSTSession; +static bool g_bSSTInitialized = false; + + +/* ------------------------------------------------------------------------ + TEEC -> SST error code translation + ------------------------------------------------------------------------- */ +static SST_ERROR static_SSTConvertErrorCode(TEEC_Result nError) +{ + switch (nError) + { + case TEEC_SUCCESS: + return SST_SUCCESS; + case SST_ERROR_BAD_PARAMETERS: + case SST_ERROR_ACCESS_DENIED: + case SST_ERROR_ACCESS_CONFLICT: + case SST_ERROR_CORRUPTED: + case SST_ERROR_NO_SPACE: + case SST_ERROR_ITEM_NOT_FOUND: + case SST_ERROR_OUT_OF_MEMORY: + case SST_ERROR_OVERFLOW: + return nError; + default: + return SST_ERROR_GENERIC; + } +} + +static TEEC_Session* static_SSTGetSession(void) +{ + if (g_bSSTInitialized) + { + return &g_SSTSession; + } + + return NULL; +} + +SST_ERROR SST_EXPORT_API SSTInit(void) +{ + TEEC_Result nTeeError = TEEC_SUCCESS; + TEEC_Operation sOperation; + uint8_t nParamType3 = TEEC_NONE; + void* pSignatureFile = NULL; + uint32_t nSignatureFileLen = 0; + uint32_t nLoginType; + + stubMutexLock(); + if (g_bSSTInitialized) + { + /* SST library already initialized */ + nTeeError = TEEC_SUCCESS; + goto end; + } + + nTeeError = stubInitializeContext(); + if (nTeeError != TEEC_SUCCESS) + { + goto end; + } + + /* Check if there is a signature file. + * If yes, send it in param3, otherwise use LOGIN_APPLICATION + */ + nTeeError = TEEC_ReadSignatureFile(&pSignatureFile, &nSignatureFileLen); + if (nTeeError == TEEC_ERROR_ITEM_NOT_FOUND) + { + nLoginType = TEEC_LOGIN_USER_APPLICATION; + } + else + { + if (nTeeError != TEEC_SUCCESS) + { + goto end; + } + sOperation.params[3].tmpref.buffer = pSignatureFile; + sOperation.params[3].tmpref.size = nSignatureFileLen; + nParamType3 = TEEC_MEMREF_TEMP_INPUT; + nLoginType = TEEC_LOGIN_AUTHENTICATION; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE, TEEC_NONE, TEEC_NONE, nParamType3); + nTeeError = TEEC_OpenSession(&g_sContext, + &g_SSTSession, /* OUT session */ + &SERVICE_UUID, /* destination UUID */ + nLoginType, /* connectionMethod */ + NULL, /* connectionData */ + &sOperation, /* IN OUT operation */ + NULL /* OUT returnOrigin, optional */ + ); + if (nTeeError != TEEC_SUCCESS) + { + goto end_finalize_context; + } + + g_bSSTInitialized = true; + stubMutexUnlock(); + return SST_SUCCESS; + +end_finalize_context: + stubFinalizeContext(); +end: + stubMutexUnlock(); + return static_SSTConvertErrorCode(nTeeError); +} + +SST_ERROR SST_EXPORT_API SSTTerminate(void) +{ + stubMutexLock(); + if (g_bSSTInitialized) + { + TEEC_CloseSession(&g_SSTSession); + stubFinalizeContext(); + g_bSSTInitialized = false; + } + /* else if not intialized => success too */ + stubMutexUnlock(); + return SST_SUCCESS; +} + + +/* ------------------------------------------------------------------------ + Other API Functions +------------------------------------------------------------------------- */ + + +/* Check that the input filename is well-formed */ +static SST_ERROR static_SSTCheckFileName(const char* pName) +{ + uint32_t i; + char c; + + if (pName == NULL) + { + return SST_ERROR_BAD_PARAMETERS; + } + + for (i = 0; i <= SST_MAX_FILENAME; i++) + { + c = pName[i]; + if (c == 0) + { + /* End of the string */ + return SST_SUCCESS; + } + + if (c == '/' || c == '\\') + { + /* Invalid character */ + return SST_ERROR_BAD_PARAMETERS; + } + + if (c < 0x20 || c >= 0x7F) + { + /* Filename contains illegal characters */ + return SST_ERROR_BAD_PARAMETERS; + } + } + /* Filename is too long. Zero terminator not found */ + return SST_ERROR_BAD_PARAMETERS; +} + +static SST_ERROR static_SSTCheckPattern( + const char* pFilenamePattern) +{ + uint32_t i; + if(pFilenamePattern == NULL) + { + return S_SUCCESS; + } + + /** + * Check Forbidden characters. + */ + for (i = 0; pFilenamePattern[i] != 0; i++) + { + if(pFilenamePattern[i] < 0x20 ) + { + return S_ERROR_BAD_PARAMETERS; + } + else if(pFilenamePattern[i] == 0x2F ) /* '/' */ + { + return S_ERROR_BAD_PARAMETERS; + } + else if(pFilenamePattern[i] == 0x5C ) /* '\' */ + { + /** + * Must be directly followed by asterisk character or question-mark + * character. + */ + if (! ((pFilenamePattern[i+1] == '*' || + pFilenamePattern[i+1] == '?'))) + { + return S_ERROR_BAD_PARAMETERS; + } + } + else if(pFilenamePattern[i] >= 0x7F ) + { + return S_ERROR_BAD_PARAMETERS; + } + } + + return S_SUCCESS; +} + + + +SST_ERROR SST_EXPORT_API SSTOpen(const char* pFilename, + uint32_t nFlags, + uint32_t nReserved, + SST_HANDLE* phFile) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + SST_ERROR nErrorCode = SST_SUCCESS; + + if (phFile == NULL || nReserved != 0) + { + return SST_ERROR_BAD_PARAMETERS; + } + + *phFile = SST_HANDLE_INVALID; + + nErrorCode = static_SSTCheckFileName(pFilename); + if (nErrorCode != SST_SUCCESS) + { + return nErrorCode; + } + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = 1; /* Private storage */ + sOperation.params[0].value.b = nFlags; /* Access flags */ + sOperation.params[1].tmpref.buffer = (void*)pFilename; + sOperation.params[1].tmpref.size = strlen(pFilename); + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_OPEN_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + if (nError == TEEC_SUCCESS) + { + *phFile = (SST_HANDLE)sOperation.params[0].value.a; + } + + return static_SSTConvertErrorCode(nError); +} + +SST_ERROR SST_EXPORT_API SSTCloseHandle(SST_HANDLE hFile) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + + if (hFile == S_HANDLE_NULL) + { + return SST_SUCCESS; + } + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = hFile; + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_CLOSE_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + + return static_SSTConvertErrorCode(nError); +} + +SST_ERROR SST_EXPORT_API SSTWrite(SST_HANDLE hFile, + const uint8_t* pBuffer, + uint32_t nSize) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + + if (pBuffer == NULL) + { + return SST_ERROR_BAD_PARAMETERS; + } + + if (nSize == 0) + { + return SST_SUCCESS; + } + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = hFile; + sOperation.params[1].tmpref.buffer = (void*)pBuffer; + sOperation.params[1].tmpref.size = nSize; + + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_WRITE_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + + return static_SSTConvertErrorCode(nError); +} + + +SST_ERROR SST_EXPORT_API SSTRead(SST_HANDLE hFile, + uint8_t* pBuffer, + uint32_t nSize, + uint32_t* pnCount) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + + if ((pBuffer == NULL) || (pnCount == NULL)) + { + return SST_ERROR_BAD_PARAMETERS; + } + *pnCount = 0; + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + if (nSize == 0) + { + return SST_SUCCESS; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = hFile; + sOperation.params[1].tmpref.buffer = pBuffer; + sOperation.params[1].tmpref.size = nSize; + + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_READ_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + + *pnCount = sOperation.params[1].tmpref.size; /* The returned buffer size */ + return static_SSTConvertErrorCode(nError); +} + +SST_ERROR SST_EXPORT_API SSTSeek(SST_HANDLE hFile, + int32_t nOffset, + SST_WHENCE whence) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + + switch(whence) + { + case SST_SEEK_SET: + case SST_SEEK_CUR: + case SST_SEEK_END: + break; + default: + return SST_ERROR_BAD_PARAMETERS; + } + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = hFile; + sOperation.params[1].value.a = nOffset; + sOperation.params[1].value.b = (uint32_t)whence; + + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_SEEK_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + return static_SSTConvertErrorCode(nError); + +} + +static SST_ERROR SSTGetOffsetAndSize(SST_HANDLE hFile, uint32_t* pnOffset, uint32_t* pnSize) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + if (pnOffset == NULL) + { + return SST_ERROR_BAD_PARAMETERS; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = (uint32_t)hFile; + + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_GET_OFFSET_AND_SIZE_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + + if (pnOffset != NULL) + { + *pnOffset = sOperation.params[0].value.a; + } + if (pnSize != NULL) + { + *pnSize = sOperation.params[0].value.b; + } + return static_SSTConvertErrorCode(nError); + +} + +SST_ERROR SST_EXPORT_API SSTTell(SST_HANDLE hFile, + uint32_t* pnPos) +{ + return SSTGetOffsetAndSize(hFile, pnPos, NULL); +} + +SST_ERROR SST_EXPORT_API SSTGetSize(const char* pFilename, + uint32_t* pnSize) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + + if ((pFilename == NULL) || (pnSize == NULL)) + { + return SST_ERROR_BAD_PARAMETERS; + } + + nError = static_SSTCheckFileName(pFilename); + if (nError != SST_SUCCESS) + { + return nError; + } + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = 1; /* private storage */ + sOperation.params[0].value.b = 0; + sOperation.params[1].tmpref.buffer = (void*)pFilename; + sOperation.params[1].tmpref.size = strlen(pFilename); + + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_GET_SIZE_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + + *pnSize = sOperation.params[0].value.a; + return static_SSTConvertErrorCode(nError); +} + + +SST_ERROR SST_EXPORT_API SSTEof( SST_HANDLE hFile, + bool* pbEof) +{ + uint32_t nOffset; + uint32_t nSize; + SST_ERROR nError; + if (pbEof == NULL) + return SST_ERROR_BAD_PARAMETERS; + nError = SSTGetOffsetAndSize(hFile, &nOffset, &nSize); + if (nError == SST_SUCCESS) + { + if (nOffset >= nSize) + { + *pbEof = true; + } + else + { + *pbEof = false; + } + } + return nError; +} + +SST_ERROR SST_EXPORT_API SSTCloseAndDelete(SST_HANDLE hFile) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = hFile; + + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_CLOSE_DELETE_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + return static_SSTConvertErrorCode(nError); +} + +SST_ERROR SST_EXPORT_API SSTTruncate(SST_HANDLE hFile, uint32_t nLength) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = hFile; + sOperation.params[0].value.b = nLength; + + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_TRUNCATE_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + return static_SSTConvertErrorCode(nError); +} + +SST_ERROR SST_EXPORT_API SSTRename(SST_HANDLE hFile, + const char* pNewFilename) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + if (pNewFilename == NULL) + { + return SST_ERROR_BAD_PARAMETERS; + } + + nError = static_SSTCheckFileName(pNewFilename); + if (nError != SST_SUCCESS) + { + return nError; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = hFile; + sOperation.params[1].tmpref.buffer = (void*)pNewFilename; + sOperation.params[1].tmpref.size = strlen(pNewFilename); + + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_RENAME_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + return static_SSTConvertErrorCode(nError); +} + +SST_ERROR SST_EXPORT_API SSTEnumerationStart(const char* pFilenamePattern, + uint32_t nReserved1, + uint32_t nReserved2, + SST_HANDLE* phFileEnumeration) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + + if (nReserved1!=0 || nReserved2!=0) + { + return SST_ERROR_BAD_PARAMETERS; + } + if (phFileEnumeration==NULL) + { + return SST_ERROR_BAD_PARAMETERS; + } + *phFileEnumeration = SST_HANDLE_INVALID; + + nError = static_SSTCheckPattern(pFilenamePattern); + if (nError != SST_SUCCESS) + { + return nError; + } + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = 1; /* Private storage */ + sOperation.params[1].tmpref.buffer = (void*)pFilenamePattern; + if (pFilenamePattern != NULL) + { + sOperation.params[1].tmpref.size = strlen(pFilenamePattern); + } + else + { + sOperation.params[1].tmpref.size = 0; + } + + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_ENUM_START_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + + *phFileEnumeration = (SST_HANDLE)sOperation.params[0].value.a; + return static_SSTConvertErrorCode(nError); +} + +SST_ERROR SST_EXPORT_API SSTEnumerationCloseHandle(SST_HANDLE hFileEnumeration) +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = hFileEnumeration; + + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_ENUM_CLOSE_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + + return static_SSTConvertErrorCode(nError); +} + +SST_ERROR SST_EXPORT_API SSTEnumerationGetNext(SST_HANDLE hFileEnumeration, + SST_FILE_INFO** ppFileInfo) + +{ + TEEC_Session* pSession; + TEEC_Result nError; + TEEC_Operation sOperation; + uint32_t nReturnOrigin; + SST_FILE_INFO* pInfo = NULL; + char sFilename[SST_MAX_FILENAME]; + + if (ppFileInfo==NULL) + { + return SST_ERROR_BAD_PARAMETERS; + } + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + sOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE, TEEC_NONE); + sOperation.params[0].value.a = hFileEnumeration; + sOperation.params[1].tmpref.buffer = sFilename; + sOperation.params[1].tmpref.size = SST_MAX_FILENAME; + + nError = TEEC_InvokeCommand(pSession, + SERVICE_SYSTEM_SST_ENUM_GETNEXT_COMMAND_ID, /* commandID */ + &sOperation, /* IN OUT operation */ + &nReturnOrigin /* OUT returnOrigin, optional */ + ); + + if (nError == TEEC_SUCCESS) + { + if (sOperation.params[1].tmpref.size <= SST_MAX_FILENAME) + { + pInfo = (SST_FILE_INFO*)malloc(sizeof(SST_FILE_INFO)); + if (pInfo == NULL) + { + return SST_ERROR_OUT_OF_MEMORY; + } + pInfo->pName = (char*)malloc(sOperation.params[1].tmpref.size+1); + if (pInfo->pName == NULL) + { + free(pInfo); + return SST_ERROR_OUT_OF_MEMORY; + } + memcpy(pInfo->pName, sFilename, sOperation.params[1].tmpref.size); + /* Add zero terminator */ + pInfo->pName[sOperation.params[1].tmpref.size] = 0; + pInfo->nSize = sOperation.params[0].value.b; + } + } + *ppFileInfo = pInfo; + return static_SSTConvertErrorCode(nError); + } + +SST_ERROR SST_EXPORT_API SSTDestroyFileInfo(SST_FILE_INFO* pFileInfo) +{ + TEEC_Session* pSession; + + pSession = static_SSTGetSession(); + if (pSession == NULL) + { + return SST_ERROR_GENERIC; + } + + if (pFileInfo != NULL) + { + free(pFileInfo->pName); + free(pFileInfo); + } + return SST_SUCCESS; +} diff --git a/security/tf_daemon/Android.mk b/security/tf_daemon/Android.mk index dbfbb4a..eccba3d 100644 --- a/security/tf_daemon/Android.mk +++ b/security/tf_daemon/Android.mk @@ -13,8 +13,6 @@ LOCAL_SRC_FILES := \ smc_properties_parser.c \ lib_manifest2.c -LOCAL_LDLIBS += -llog - LOCAL_CFLAGS += -DLINUX LOCAL_CFLAGS += -D__ANDROID32__ LOCAL_CFLAGS += -DSUPPORT_DELEGATION_EXTENSION diff --git a/security/tf_daemon/delegation_client.c b/security/tf_daemon/delegation_client.c index a2bff0b..54ee112 100644 --- a/security/tf_daemon/delegation_client.c +++ b/security/tf_daemon/delegation_client.c @@ -28,7 +28,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if defined(ANDROID) +#if defined(__ANDROID32__) #include <stddef.h> #endif #include <stdio.h> @@ -43,12 +43,12 @@ #include <sys/types.h> #include <fcntl.h> -#if defined(LINUX) || defined(ANDROID) +#if defined(LINUX) || defined(__ANDROID32__) #include <unistd.h> #include <sys/resource.h> -#if defined(ANDROID) +#if defined(__ANDROID32__) /* fdatasync does not exist on Android */ #define fdatasync fsync #else @@ -58,14 +58,14 @@ * in some distributions */ int fdatasync(int fd); -#endif /* ANDROID */ +#endif /* __ANDROID32__ */ #include <syslog.h> #include <sys/types.h> #include <sys/stat.h> #include <pthread.h> #include <semaphore.h> #define PATH_SEPARATOR '/' -#endif /* LINUX || ANDROID */ +#endif /* LINUX || __ANDROID32__ */ #ifdef WIN32 #include <windows.h> @@ -97,10 +97,6 @@ int fdatasync(int fd); #include "delegation_client_extension.h" #endif -#ifdef TFSW_FDM_ANDROID -#include <android/log.h> -#endif - /*---------------------------------------------------------------------------- * Design notes * ============ @@ -113,7 +109,7 @@ int fdatasync(int fd); /*---------------------------------------------------------------------------- * Defines and structures *----------------------------------------------------------------------------*/ -#define ECHANGE_BUFFER_INSTRUCTIONS_NB 1000 +#define ECHANGE_BUFFER_INSTRUCTIONS_NB 100 #define DEFAULT_WORKSPACE_SIZE (128*1024) @@ -128,21 +124,6 @@ typedef struct uint8_t sWorkspace[1/*g_nWorkspaceSize*/]; } DELEGATION_EXCHANGE_BUFFER; -#ifdef SUPPORT_RPMB_PARTITION -typedef struct -{ - uint8_t pDummy[196]; - uint8_t pMAC[32]; - uint8_t pData[256]; - uint8_t pNonce[16]; - uint32_t nMC; - uint16_t nAddr; - uint16_t nBlockCount; - uint16_t nResult; - uint16_t nReqOrResp; -} DELEGATION_RPMB_MESSAGE; -#endif - #define MD_VAR_NOT_USED(variable) do{(void)(variable);}while(0); #define MD_INLINE __inline @@ -160,7 +141,7 @@ typedef struct in release builds whereas logs are visible to the customer. -----------------------------------------------*/ -#if defined(LINUX) || (defined ANDROID) +#if defined(LINUX) || (defined __ANDROID32__) static bool bDetached = false; @@ -174,13 +155,9 @@ static MD_INLINE void LogError(const char* format, ...) } else { -#ifdef TFSW_FDM_ANDROID - __android_log_vprint(ANDROID_LOG_ERROR , "TF Daemon", format, ap); -#else fprintf(stderr, "ERROR: "); vfprintf(stderr, format, ap); fprintf(stderr, "\n"); -#endif } va_end(ap); } @@ -195,13 +172,9 @@ static MD_INLINE void LogWarning(const char* format, ...) } else { -#ifdef TFSW_FDM_ANDROID - __android_log_vprint(ANDROID_LOG_WARN , "TF Daemon", format, ap); -#else fprintf(stderr, "WARNING: "); vfprintf(stderr, format, ap); fprintf(stderr, "\n"); -#endif } va_end(ap); } @@ -215,12 +188,8 @@ static MD_INLINE void LogInfo(const char* format, ...) } else { -#ifdef TFSW_FDM_ANDROID - __android_log_vprint(ANDROID_LOG_INFO , "TF Daemon", format, ap); -#else vfprintf(stderr, format, ap); fprintf(stderr, "\n"); -#endif } va_end(ap); } @@ -236,13 +205,9 @@ static MD_INLINE void TRACE_ERROR(const char* format, ...) } else { -#ifdef TFSW_FDM_ANDROID - __android_log_vprint(ANDROID_LOG_ERROR , "TF Daemon", format, ap); -#else fprintf(stderr, "TRACE: ERROR: "); vfprintf(stderr, format, ap); fprintf(stderr, "\n"); -#endif } va_end(ap); #else @@ -261,13 +226,9 @@ static MD_INLINE void TRACE_WARNING(const char* format, ...) } else { -#ifdef TFSW_FDM_ANDROID - __android_log_vprint(ANDROID_LOG_WARN , "TF Daemon", format, ap); -#else fprintf(stderr, "TRACE: WARNING: "); vfprintf(stderr, format, ap); fprintf(stderr, "\n"); -#endif } va_end(ap); #else @@ -286,13 +247,9 @@ static MD_INLINE void TRACE_INFO(const char* format, ...) } else { -#ifdef TFSW_FDM_ANDROID - __android_log_vprint(ANDROID_LOG_INFO , "TF Daemon", format, ap); -#else fprintf(stderr, "TRACE: "); vfprintf(stderr, format, ap); fprintf(stderr, "\n"); -#endif } va_end(ap); #else @@ -332,7 +289,7 @@ static MD_INLINE void TRACE_INFO(const char* format, ...) } #else -/* !defined(LINUX) || !defined(ANDROID) */ +/* !defined(LINUX) || !defined(__ANDROID32__) */ static MD_INLINE void LogError(const char* format, ...) { @@ -402,7 +359,7 @@ static MD_INLINE void TRACE_INFO(const char* format, ...) MD_VAR_NOT_USED(format); #endif /* NDEBUG */ } -#endif /* defined(LINUX) || defined(ANDROID) */ +#endif /* defined(LINUX) || defined(__ANDROID32__) */ /*---------------------------------------------------------------------------- * Globals @@ -526,7 +483,7 @@ int static_checkStorageDirAndAccessRights(char * directoryName) if (result == 0) { /* Storage dir exists. Check access rights */ -#if defined(LINUX) || (defined ANDROID) +#if defined(LINUX) || (defined __ANDROID32__) if ((buf.st_mode & (S_IXUSR | S_IWUSR)) != (S_IXUSR | S_IWUSR)) { LogError("storageDir '%s' does not have read-write access", directoryName); @@ -572,7 +529,7 @@ static TEEC_Result partitionDestroy(uint32_t nPartitionID) } /* Try to erase the file */ -#if defined(LINUX) || (defined ANDROID) || defined (__SYMBIAN32__) +#if defined(LINUX) || (defined __ANDROID32__) || defined (__SYMBIAN32__) if (unlink(g_pPartitionNames[nPartitionID]) != 0) #endif #ifdef WIN32 @@ -729,46 +686,6 @@ static TEEC_Result partitionRead(uint32_t nPartitionID, uint32_t nSectorIndex, u return S_SUCCESS; } -#ifdef SUPPORT_RPMB_PARTITION -static TEEC_Result rpmbRead(DELEGATION_RPMB_INSTRUCTION *pInstruction) -{ - DELEGATION_RPMB_MESSAGE* pMessages; - uint32_t nNbMsg, nIndex; - - nNbMsg = g_nSectorSize >> 8; - pMessages = (DELEGATION_RPMB_MESSAGE*)malloc(nNbMsg * sizeof(DELEGATION_RPMB_MESSAGE)); - if (pMessages == NULL) - { - return S_ERROR_OUT_OF_MEMORY; - } - memset(pMessages,0,nNbMsg * sizeof(DELEGATION_RPMB_MESSAGE)); - - for (nIndex=0;nIndex<nNbMsg;nIndex++) - { - memcpy(pMessages[nIndex].pNonce , pInstruction->pNonce, 16); - pMessages[nIndex].nAddr = pInstruction->nAddr; - pMessages[nIndex].nBlockCount = pInstruction->nBlockCount; - pMessages[nIndex].nReqOrResp = 0x0004; - } - memcpy(pMessages[nNbMsg-1].pMAC,pInstruction->nMAC,32); - - /* TODO: send to the RPMB driver */ - - memcpy(pInstruction->pNonce,pMessages[0].pNonce , 16); - pInstruction->nAddr = pMessages[0].nAddr; - pInstruction->nBlockCount = pMessages[0].nBlockCount; - for (nIndex=0;nIndex<nNbMsg;nIndex++) - { - memcpy(g_pWorkspaceBuffer + pInstruction->nWorkspaceOffset[nIndex],pMessages[nIndex].pData,256); - } - memcpy(pInstruction->nMAC, pMessages[nNbMsg-1].pMAC,32); - pInstruction->nResult=pMessages[nNbMsg-1].nResult; - - free(pMessages); - - return S_SUCCESS; -} -#endif /** * This function executes the WRITE instruction. * @@ -807,42 +724,7 @@ static TEEC_Result partitionWrite(uint32_t nPartitionID, uint32_t nSectorIndex, return S_SUCCESS; } -#ifdef SUPPORT_RPMB_PARTITION -static TEEC_Result rpmbWrite(DELEGATION_RPMB_INSTRUCTION *pInstruction) -{ - DELEGATION_RPMB_MESSAGE* pMessages; - uint32_t nNbMsg, nIndex; - nNbMsg = g_nSectorSize >> 8; - pMessages = (DELEGATION_RPMB_MESSAGE*)malloc(nNbMsg * sizeof(DELEGATION_RPMB_MESSAGE)); - if (pMessages == NULL) - { - return S_ERROR_OUT_OF_MEMORY; - } - memset(pMessages,0,nNbMsg * sizeof(DELEGATION_RPMB_MESSAGE)); - - for (nIndex=0;nIndex<nNbMsg;nIndex++) - { - memcpy(pMessages[nIndex].pData,g_pWorkspaceBuffer + pInstruction->nWorkspaceOffset[nIndex],256); - pMessages[nIndex].nMC = pInstruction->nMC; - pMessages[nIndex].nAddr = pInstruction->nAddr; - pMessages[nIndex].nBlockCount = pInstruction->nBlockCount; - pMessages[nIndex].nReqOrResp = 0x0003; - } - memcpy(pMessages[nNbMsg-1].pMAC,pInstruction->nMAC,32); - - /* TODO: send to the RPMB driver */ - - pInstruction->nAddr = pMessages[0].nAddr; - pInstruction->nMC = pMessages[0].nMC; - memcpy(pInstruction->nMAC, pMessages[nNbMsg-1].pMAC,32); - pInstruction->nResult=pMessages[nNbMsg-1].nResult; - - free(pMessages); - - return S_SUCCESS; -} -#endif /** * This function executes the SET_SIZE instruction. * @@ -892,7 +774,7 @@ static TEEC_Result partitionSetSize(uint32_t nPartitionID, uint32_t nNewSectorCo { int result = 0; /* Truncate the partition file */ -#if defined(LINUX) || (defined ANDROID) +#if defined(LINUX) || (defined __ANDROID32__) result = ftruncate(fileno(pFile),nNewSectorCount * g_nSectorSize); #endif #if defined (__SYMBIAN32__) @@ -937,7 +819,7 @@ static TEEC_Result partitionSync(uint32_t nPartitionID) } /* Then synchronize the file descriptor with the file-system */ -#if defined(LINUX) || (defined ANDROID) +#if defined(LINUX) || (defined __ANDROID32__) result=fdatasync(fileno(pFile)); #endif #if defined (__SYMBIAN32__) @@ -1126,13 +1008,6 @@ static int runSession(TEEC_Context* pContext, TEEC_Session* pSession, TEEC_Opera { case DELEGATION_INSTRUCTION_PARTITION_CREATE: nError = partitionCreate(nPartitionID); -#ifdef SUPPORT_RPMB_PARTITION - if (nPartitionID == RPMB_PARTITION_ID) - { - /* TODO: get the Write counter */ - pInstruction->sAuthRW.nMC = 0; - } -#endif TRACE_INFO("INSTRUCTION: ID=0x%x pid=%d err=%d", (nInstructionID & 0x0F), nPartitionID, nError); break; case DELEGATION_INSTRUCTION_PARTITION_OPEN: @@ -1144,33 +1019,9 @@ static int runSession(TEEC_Context* pContext, TEEC_Session* pSession, TEEC_Opera { g_pExchangeBuffer->sAdministrativeData.nPartitionOpenSizes[nPartitionID] = nPartitionSize; } -#ifdef SUPPORT_RPMB_PARTITION - if (nPartitionID == RPMB_PARTITION_ID) - { - /* TODO: get the Write counter */ - pInstruction->sAuthRW.nMC = 0; - } -#endif break; } case DELEGATION_INSTRUCTION_PARTITION_READ: -#ifdef SUPPORT_RPMB_PARTITION - if (nPartitionID == RPMB_PARTITION_ID) - { - if (nInstructionsIndex + sizeof(DELEGATION_RPMB_INSTRUCTION)-sizeof(uint32_t) <= nInstructionsBufferSize) - { - nInstructionsIndex+=sizeof(DELEGATION_RPMB_INSTRUCTION)-sizeof(uint32_t); - } - else - { - goto instruction_parse_end; - } - nError = rpmbRead(&pInstruction->sAuthRW); - TRACE_INFO("INSTRUCTION: ID=0x%x pid=%d err=%d", (nInstructionID & 0x0F), nPartitionID, nError); - break; - } - else -#endif { /* Parse parameters */ uint32_t nSectorID; @@ -1190,23 +1041,6 @@ static int runSession(TEEC_Context* pContext, TEEC_Session* pSession, TEEC_Opera break; } case DELEGATION_INSTRUCTION_PARTITION_WRITE: -#ifdef SUPPORT_RPMB_PARTITION - if (nPartitionID == RPMB_PARTITION_ID) - { - if (nInstructionsIndex + sizeof(DELEGATION_RPMB_INSTRUCTION)-sizeof(uint32_t) <= nInstructionsBufferSize) - { - nInstructionsIndex+=sizeof(DELEGATION_RPMB_INSTRUCTION)-sizeof(uint32_t); - } - else - { - goto instruction_parse_end; - } - nError = rpmbWrite(&pInstruction->sAuthRW); - TRACE_INFO("INSTRUCTION: ID=0x%x pid=%d err=%d", (nInstructionID & 0x0F), nPartitionID, nError); - break; - } - else -#endif { /* Parse parameters */ uint32_t nSectorID; @@ -1483,7 +1317,7 @@ int main(int argc, char* argv[]) * Detach the daemon from the console */ -#if defined(LINUX) || (defined ANDROID) +#if defined(LINUX) || (defined __ANDROID32__) { /* * Turns this application into a daemon => fork off parent process, setup logging, ... diff --git a/security/tf_daemon/lib_uuid.h b/security/tf_daemon/lib_uuid.h deleted file mode 100644 index acec4a0..0000000 --- a/security/tf_daemon/lib_uuid.h +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Copyright(c) 2011 Trusted Logic. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name Trusted Logic nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 COPYRIGHT - * OWNER OR CONTRIBUTORS 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 __LIB_UUID_H__ -#define __LIB_UUID_H__ - - -#include "s_type.h" - - -#ifdef __cplusplus -extern "C" { -#endif -#if 0 -} /* balance curly quotes */ -#endif - -/** - * LIB_UUID is deprecated use S_UUID instead. - * @deprecated - */ -typedef S_UUID LIB_UUID; -/** - * LIB_UUID_STRING_SIZE is deprecated use UUID_STRING_SIZE instead. - * @deprecated - */ -#define LIB_UUID_STRING_SIZE 36 - -/** - * Defines the UUID string size in characters - * - * E.g. "f81d4fae-7dec-11d0-a765-00a0c91e6bf6" - **/ -#define UUID_STRING_SIZE 36 - -/** - * Converts the string representation of an UUID to the binary representation as - * a S_UUID type. The binary UUID structure must be provided by the caller. - * - * @param pIdentifierString The UTF-8 representation of the identifier. This - * string does not need to be zero terminated. The decoder reads only - * the {UUID_STRING_SIZE} first bytes. - * - * @param pIdentifier The identifer structure receiving the binary value of - * the identifier. - * - * @return TRUE in case of success, FALSE if the string does not conform to the - * syntax of UUID as defined in RFC 4122 - * (http://www.ietf.org/rfc/rfc4122.txt) - **/ -bool libUUIDFromString( - IN const uint8_t* pIdentifierString, - OUT S_UUID* pIdentifier); - -/** - * Converts the binary representation of an UUID to the string representation. - * - * @param pIdentifier The identifer structure with the binary value of the - * identifier. - * - * @param pIdentifierString The buffer receiving the UTF-8 representation of - * the identifier. This string is not zero terminated. The encoder - * writes only the first {UUID_STRING_SIZE} bytes. - * - **/ -void libUUIDToString( - IN const S_UUID* pIdentifier, - OUT uint8_t* pIdentifierString); - -/** - * Generates an UUID from the specified MD5 hash value, as specified in section - * 4.3, Algorithm for Creating a Name-Based UUID, of RFC 4122. - * - * This function assumes that the hash value is 128-bit long. - * - * @param pHashData A pointer to the first byte of the MD5 hash data. Only the - * first 16 bytes of this hash data will be used to generate the UUID. - * - * @param pIdentifier A pointer to the placeholder receiving the generated - * identifier. - **/ -void libUUIDFromMD5Hash( - IN const uint8_t* pHashData, - OUT S_UUID* pIdentifier); - -/** - * Generates an UUID from the specified SHA-1 hash value, as specified in - * section 4.3, Algorithm for Creating a Name-Based UUID, of RFC 4122. - * - * This function assumes that the hash value is 128-bit long. - * - * @param pHashData A pointer to the first byte of the SHA-1 hash data. Only the - * first 16 bytes of this hash data will be used to generate the UUID. - * - * @param pIdentifier A pointer to the placeholder receiving the generated - * identifier. - **/ -void libUUIDFromSHA1Hash( - IN const uint8_t* pHashData, - OUT S_UUID* pIdentifier); - -/** - * Checks if an identifier is the nil identifier as specified in RFC 4122. - * - * @param pIdentifier The identifier to check. - * - * @return TRUE if the identifier is the nil identifier, FALSE otherwise. - **/ -bool libUUIDIsNil( - IN const S_UUID* pIdentifier); - -/** - * Sets an identifier to the nil value as specified in RFC 4122. - * - * @param pIdentifier The identifier to set to nil. - **/ -void libUUIDSetToNil( - OUT S_UUID* pIdentifier); - -#if 0 -{ /* balance curly quotes */ -#endif -#ifdef __cplusplus -} /* closes extern "C" */ -#endif - - -#endif /* !defined(__LIB_UUID_H__) */ diff --git a/security/tf_daemon/s_version.h b/security/tf_daemon/s_version.h index f712db2..d112ea0 100644 --- a/security/tf_daemon/s_version.h +++ b/security/tf_daemon/s_version.h @@ -58,15 +58,15 @@ /* * This version number must be updated for each new release */ -#define S_VERSION_MAIN "01.06" -#define S_VERSION_RESOURCE 1,6,0,S_VERSION_BUILD +#define S_VERSION_MAIN "01.04" +#define S_VERSION_RESOURCE 1,4,0,S_VERSION_BUILD /* * If this is a patch or engineering version use the following * defines to set the version number. Else set these values to 0. */ +#define S_VERSION_PATCH 11 #define S_VERSION_ENG 0 -#define S_VERSION_PATCH 0 #ifdef S_VERSION_BUILD /* TRICK: detect if S_VERSION is defined but empty */ @@ -105,8 +105,8 @@ S_VERSION_OS \ S_VERSION_PLATFORM \ S_VERSION_MAIN \ - _S_VERSION_ENG \ _S_VERSION_PATCH \ + _S_VERSION_ENG \ "." __STRINGIFY2(S_VERSION_BUILD) " " \ S_VERSION_VARIANT diff --git a/security/tf_daemon/service_delegation_protocol.h b/security/tf_daemon/service_delegation_protocol.h index bf831f8..22b291d 100644 --- a/security/tf_daemon/service_delegation_protocol.h +++ b/security/tf_daemon/service_delegation_protocol.h @@ -70,10 +70,6 @@ #define DELEGATION_NOTIFY_TYPE_INFO 0x000000E3 #define DELEGATION_NOTIFY_TYPE_DEBUG 0x000000E4 -#ifdef SUPPORT_RPMB_PARTITION -#define RPMB_PARTITION_ID 14 -#endif - typedef struct { uint32_t nInstructionID; @@ -94,21 +90,6 @@ typedef struct uint32_t nWorkspaceOffset; } DELEGATION_RW_INSTRUCTION; -#ifdef SUPPORT_RPMB_PARTITION -typedef struct -{ - uint32_t nInstructionID; - uint8_t nMAC[32]; - uint32_t nWorkspaceOffset[16]; - uint8_t pNonce[16]; - uint32_t nMC; - uint16_t nAddr; - uint16_t nBlockCount; - uint16_t nResult; - uint16_t nRequest; -} DELEGATION_RPMB_INSTRUCTION; -#endif - typedef struct { uint32_t nInstructionID; @@ -121,9 +102,6 @@ typedef union DELEGATION_NOTIFY_INSTRUCTION sNotify; DELEGATION_RW_INSTRUCTION sReadWrite; DELEGATION_SET_SIZE_INSTRUCTION sSetSize; -#ifdef SUPPORT_RPMB_PARTITION - DELEGATION_RPMB_INSTRUCTION sAuthRW; -#endif } DELEGATION_INSTRUCTION; typedef struct diff --git a/security/tf_daemon/smc_properties.c b/security/tf_daemon/smc_properties.c index 48bfa8c..ce1e7e3 100644 --- a/security/tf_daemon/smc_properties.c +++ b/security/tf_daemon/smc_properties.c @@ -76,7 +76,7 @@ typedef enum STATE_BINARY } INTEGER_FORMAT; -#if defined (LINUX) || defined(ANDROID) +#if defined (LINUX) || defined(__ANDROID32__) #define SEPARATOR_CHAR '/' #elif defined (WIN32) || defined (__SYMBIAN32__) || defined (_WIN32_WCE) @@ -151,7 +151,7 @@ static bool checkFilePath(char *pPath) printf("Path %s doesn't point on a directory.\n", pDir); return false; } -#if (!defined(__SYMBIAN32__)) && (!defined(_WIN32_WCE)) && (!defined(ANDROID)) +#if (!defined(__SYMBIAN32__)) && (!defined(_WIN32_WCE)) && (!defined(__ANDROID32__)) // TODO : under Symbian, Android and WM, check access right of a directory failed? I don't know why... /* check read access */ if ((buf.st_mode & S_IREAD) != S_IREAD) diff --git a/security/tf_daemon/smc_properties_parser.c b/security/tf_daemon/smc_properties_parser.c index 8d0d676..1f97224 100644 --- a/security/tf_daemon/smc_properties_parser.c +++ b/security/tf_daemon/smc_properties_parser.c @@ -42,7 +42,6 @@ #include "smc_properties_parser.h" #include "lib_manifest2.h" -#include "lib_uuid.h" #include "s_error.h" /* --------------------------------------------------------------------------------- @@ -58,7 +57,7 @@ #define GET_LAST_ERR errno #endif -#if defined (LINUX) || defined (__SYMBIAN32__) || defined (ANDROID) +#if defined (LINUX) || defined (__SYMBIAN32__) || defined (__ANDROID32__) #define STRICMP strcasecmp #elif defined(_WIN32_WCE) #define STRICMP _stricmp @@ -242,7 +241,7 @@ static NODE* SMCPropListFindElement(LIST* pList,char* pName,bool bIsCaseSensitiv static S_RESULT SMCPropYacc(uint8_t* pBuffer, uint32_t nBufferLength, - CONF_FILE* pConfFile, SERVICE_SECTION* pService) + CONF_FILE* pConfFile) { S_RESULT nError=S_SUCCESS; LIST *pPublicPropertyList=NULL; @@ -265,15 +264,6 @@ static S_RESULT SMCPropYacc(uint8_t* pBuffer, uint32_t nBufferLength, sParserContext.nManifestLength = nBufferLength; sParserContext.nType = LIB_MANIFEST2_TYPE_SOURCE_WITH_SECTIONS; - if (pService!=NULL) - { - pPublicPropertyList=&pService->sPublicPropertyList; - pPrivatePropertyList=&pService->sPrivatePropertyList; - /* read inside a service compiled manifest */ - sParserContext.nType = LIB_MANIFEST2_TYPE_COMPILED; - sprintf(serviceManifestName, "%s(manifest)", pService->sNode.pName); - sParserContext.pManifestName = serviceManifestName; - } libManifest2InitContext(&sParserContext); while (true) @@ -392,47 +382,6 @@ static S_RESULT SMCPropYacc(uint8_t* pBuffer, uint32_t nBufferLength, } else { - if (strcmp(pProperty->sNode.pName,CONFIG_SERVICE_ID_PROPERTY_NAME) == 0) - { - if (pService!=NULL) - { - pService->sNode.pName=malloc(nValueLength+1); - if (pService->sNode.pName==NULL) - { - nError=S_ERROR_OUT_OF_MEMORY; - goto error; - } -#if defined (LINUX) || defined (__SYMBIAN32__) || defined(ANDROID) - { - // put each char of the value in uppercase - char* p=pProperty->pValue; - while(*p) - { - *p=toupper(*p); - p++; - } - } -#else - _strupr(pProperty->pValue); -#endif - memcpy(pService->sNode.pName,pProperty->pValue,nValueLength+1); - - if (!libUUIDFromString((const uint8_t*)pProperty->pValue,&pService->sUUID)) - { - nError=S_ERROR_WRONG_SIGNATURE; - goto error; - } - { - S_UUID sNullUUID; - memset(&sNullUUID,0,sizeof(S_UUID)); - if (!memcmp(&pService->sUUID,&sNullUUID,sizeof(S_UUID))) - { - nError=S_ERROR_WRONG_SIGNATURE; - goto error; - } - } - } - } if ((nValueLength > strlen(CONFIG_PROPERTY_NAME)) && (memcmp(pProperty->sNode.pName, CONFIG_PROPERTY_NAME, strlen(CONFIG_PROPERTY_NAME)) == 0)) { @@ -462,10 +411,10 @@ error: TRACE_ERROR("Configuration file: wrong service UUID: %s\n", pValueZ); break; case S_ERROR_OUT_OF_MEMORY: - TRACE_ERROR("Out of memory\n"); + TRACE_ERROR("Out of memory\n"); break; case S_ERROR_ITEM_NOT_FOUND: - TRACE_ERROR("Configuration file: service \"%s\" not found\n", pNameZ); + TRACE_ERROR("Configuration file: service \"%s\" not found\n", pNameZ); break; } } @@ -595,7 +544,7 @@ S_RESULT SMCPropParseConfigFile(char* pConfigFilename,CONF_FILE* pConfFile) assert(0); } - nError=SMCPropYacc(pFile,nFileLength,pConfFile,NULL); + nError=SMCPropYacc(pFile,nFileLength,pConfFile); if(pConfigFilename != NULL) { diff --git a/security/tf_sdk/include/s_type.h b/security/tf_sdk/include/s_type.h index ae260cc..72f2a8a 100644 --- a/security/tf_sdk/include/s_type.h +++ b/security/tf_sdk/include/s_type.h @@ -35,7 +35,7 @@ #define __S_TYPE_H__ /* C99 integer types */ -#if (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) &&(!defined(ANDROID)) +#if (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) &&(!defined(__ANDROID32__)) #include <limits.h> diff --git a/security/tf_sdk/include/smapi.h b/security/tf_sdk/include/smapi.h deleted file mode 100644 index 2fc3e5e..0000000 --- a/security/tf_sdk/include/smapi.h +++ /dev/null @@ -1,366 +0,0 @@ -/** - * Copyright(c) 2011 Trusted Logic. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name Trusted Logic nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 COPYRIGHT - * OWNER OR CONTRIBUTORS 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. - */ - -/* - * File : smapi.h - * Last-Author : Trusted Logic S.A. - * Created : March 15, 2003 - */ - -#ifndef __SMAPI_H__ -#define __SMAPI_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -/*------------------------------------------------------------------------------ - Includes -------------------------------------------------------------------------------*/ - -#include "s_type.h" -#include "s_error.h" -/*------------------------------------------------------------------------------ - SMAPI Types -------------------------------------------------------------------------------*/ - - -#ifdef SM_EXPORT_IMPLEMENTATION -#define SM_EXPORT S_DLL_EXPORT -#else -#define SM_EXPORT S_DLL_IMPORT -#endif - -typedef struct SM_PROPERTY -{ - wchar_t* pName; - wchar_t* pValue; -} SM_PROPERTY; - -typedef struct SM_TIME_LIMIT -{ - uint32_t nHighTime; - uint32_t nLowTime; -} SM_TIME_LIMIT; - -/*------------------------------------------------------------------------------ - Constants -------------------------------------------------------------------------------*/ - - -#define SM_API_VERSION 0x03000000 - -#define SM_CONTROL_MODE_USER ( (uint32_t)0x00000002 ) -#define SM_CONTROL_MODE_MANAGER ( (uint32_t)0x00000008 ) -#define SM_CONTROL_MODE_EXCLUSIVE_MANAGER ( (uint32_t)0x00000010 ) - -#define SM_LOGIN_PUBLIC ( (uint32_t)0x00000000 ) -#define SM_LOGIN_OS_IDENTIFICATION ( (uint32_t)0x00000005 ) -#define SM_LOGIN_AUTHENTICATION ( (uint32_t)0x80000000 ) -#define SM_LOGIN_AUTHENTICATION_FALLBACK_OS_IDENTIFICATION ( (uint32_t)0x80000001 ) -#define SM_LOGIN_PRIVILEGED ( (uint32_t)0x80000002 ) - -#define SM_MEMORY_ACCESS_CLIENT_WRITE_SERVICE_READ ( (uint32_t)0x00000001 ) -#define SM_MEMORY_ACCESS_CLIENT_READ_SERVICE_WRITE ( (uint32_t)0x00000002 ) - -#define SMX_MEMORY_ACCESS_DIRECT ( (uint32_t)0x80000000 ) -#define SMX_MEMORY_ACCESS_DIRECT_FORCE ( (uint32_t)0x40000000 ) - -#define SM_INFINITE_TIMEOUT ( (uint32_t)0xFFFFFFFF ) - -#define SM_NULL_ELEMENT ( (uint32_t)0xFFFFFFFF ) - -/*------------------------------------------------------------------------------ - Functions and Macros -------------------------------------------------------------------------------*/ - -SM_EXPORT SM_ERROR SMDeviceCreateContext( - const wchar_t* pDeviceName, - uint32_t nReserved, - SM_HANDLE* phDevice); - -SM_EXPORT SM_ERROR SMDeviceDeleteContext( - SM_HANDLE hDevice); - -SM_EXPORT void SMFree( - SM_HANDLE hElement, - void* pBuffer); - -SM_EXPORT SM_ERROR SMStubGetTimeLimit( - SM_HANDLE hElement, - uint32_t nTimeout, - SM_TIME_LIMIT* pTimeLimit); - -SM_EXPORT SM_ERROR SMStubPrepareOpenOperation( - SM_HANDLE hDevice, - uint32_t nLoginType, - const void* pLoginInfo, - const SM_UUID* pidService, - uint32_t nControlMode, - const SM_TIME_LIMIT* pTimeLimit, - uint32_t nReserved1, - uint32_t nReserved2, - SM_HANDLE* phClientSession, - SM_HANDLE* phParameterEncoder, - SM_HANDLE* phOperation); - -SM_EXPORT SM_ERROR SMStubPrepareInvokeOperation( - SM_HANDLE hClientSession, - uint32_t nCommandIdentifier, - const SM_TIME_LIMIT* pTimeLimit, - uint32_t nReserved1, - uint32_t nReserved2, - SM_HANDLE* phParameterEncoder, - SM_HANDLE* phOperation); - -SM_EXPORT SM_ERROR SMStubPrepareCloseOperation( - SM_HANDLE hClientSession, - uint32_t nReserved1, - uint32_t nReserved2, - SM_HANDLE* phParameterEncoder, - SM_HANDLE* phOperation); - -SM_EXPORT SM_ERROR SMStubPerformOperation( - SM_HANDLE hOperation, - uint32_t nReserved, - SM_ERROR* pnServiceErrorCode, - SM_HANDLE* phAnswerDecoder); - -SM_EXPORT SM_ERROR SMStubCancelOperation( - SM_HANDLE hOperation); - -SM_EXPORT SM_ERROR SMStubReleaseOperation( - SM_HANDLE hOperation); - -SM_EXPORT SM_ERROR SMStubAllocateSharedMemory( - SM_HANDLE hClientSession, - uint32_t nLength, - uint32_t nFlags, - uint32_t nReserved, - void** ppBlock, - SM_HANDLE* phBlockHandle); - -SM_EXPORT SM_ERROR SMStubRegisterSharedMemory( - SM_HANDLE hClientSession, - void* pBuffer, - uint32_t nBufferLength, - uint32_t nFlags, - uint32_t nReserved, - SM_HANDLE* phBlockHandle); - -SM_EXPORT SM_ERROR SMStubReleaseSharedMemory( - SM_HANDLE hBlockHandle); - -SM_EXPORT void SMStubEncoderWriteUint8( - SM_HANDLE hEncoder, - uint8_t nValue); - -SM_EXPORT void SMStubEncoderWriteUint16( - SM_HANDLE hEncoder, - uint16_t nValue); - -SM_EXPORT void SMStubEncoderWriteUint32( - SM_HANDLE hEncoder, - uint32_t nValue); - -SM_EXPORT void SMStubEncoderWriteBoolean( - SM_HANDLE hEncoder, - bool nValue); - -SM_EXPORT void SMStubEncoderWriteHandle( - SM_HANDLE hEncoder, - SM_HANDLE hValue); - -SM_EXPORT void SMStubEncoderWriteString( - SM_HANDLE hEncoder, - const wchar_t* pValue); - -SM_EXPORT void SMStubEncoderWriteUint8Array( - SM_HANDLE hEncoder, - uint32_t nArrayLength, - const uint8_t* pnArray); - -SM_EXPORT void SMStubEncoderWriteUint16Array( - SM_HANDLE hEncoder, - uint32_t nArrayLength, - const uint16_t* pnArray); - -SM_EXPORT void SMStubEncoderWriteUint32Array( - SM_HANDLE hEncoder, - uint32_t nArrayLength, - const uint32_t* pnArray); - -SM_EXPORT void SMStubEncoderWriteHandleArray( - SM_HANDLE hEncoder, - uint32_t nArrayLength, - const SM_HANDLE* pnArray); - -SM_EXPORT void SMStubEncoderWriteMemoryReference( - SM_HANDLE hEncoder, - SM_HANDLE hBlock, - uint32_t nOffset, - uint32_t nLength, - uint32_t nFlags); - -SM_EXPORT void SMStubEncoderOpenSequence( - SM_HANDLE hEncoder); - -SM_EXPORT void SMStubEncoderCloseSequence( - SM_HANDLE hEncoder); - -SM_EXPORT SM_ERROR SMStubDecoderGetError( - SM_HANDLE hDecoder); - -SM_EXPORT bool SMStubDecoderHasData( - SM_HANDLE hDecoder); - -SM_EXPORT uint8_t SMStubDecoderReadUint8( - SM_HANDLE hDecoder); - -SM_EXPORT uint16_t SMStubDecoderReadUint16( - SM_HANDLE hDecoder); - -SM_EXPORT uint32_t SMStubDecoderReadUint32( - SM_HANDLE hDecoder); - -SM_EXPORT bool SMStubDecoderReadBoolean( - SM_HANDLE hDecoder); - -SM_EXPORT SM_HANDLE SMStubDecoderReadHandle( - SM_HANDLE hDecoder); - -SM_EXPORT wchar_t* SMStubDecoderReadString( - SM_HANDLE hDecoder); - -SM_EXPORT uint8_t* SMStubDecoderReadUint8Array( - SM_HANDLE hDecoder, - uint32_t* pnArrayLength); - -SM_EXPORT uint16_t* SMStubDecoderReadUint16Array( - SM_HANDLE hDecoder, - uint32_t* pnArrayLength); - -SM_EXPORT uint32_t* SMStubDecoderReadUint32Array( - SM_HANDLE hDecoder, - uint32_t* pnArrayLength); - -SM_EXPORT SM_HANDLE* SMStubDecoderReadHandleArray( - SM_HANDLE hDecoder, - uint32_t* pnArrayLength); - -SM_EXPORT uint32_t SMStubDecoderReadArrayLength( - SM_HANDLE hDecoder); - -SM_EXPORT uint32_t SMStubDecoderCopyUint8Array( - SM_HANDLE hDecoder, - uint32_t nIndex, - uint32_t nMaxLength, - uint8_t* pArray); - -SM_EXPORT uint32_t SMStubDecoderCopyUint16Array( - SM_HANDLE hDecoder, - uint32_t nIndex, - uint32_t nMaxLength, - uint16_t* pArray); - -SM_EXPORT uint32_t SMStubDecoderCopyUint32Array( - SM_HANDLE hDecoder, - uint32_t nIndex, - uint32_t nMaxLength, - uint32_t* pArray); - -SM_EXPORT uint32_t SMStubDecoderCopyHandleArray( - SM_HANDLE hDecoder, - uint32_t nIndex, - uint32_t nMaxLength, - SM_HANDLE* pArray); - -SM_EXPORT void SMStubDecoderReadSequence( - SM_HANDLE hDecoder, - SM_HANDLE* phSequenceDecoder); - -SM_EXPORT void SMStubDecoderSkip( - SM_HANDLE hDecoder); - -SM_EXPORT SM_ERROR SMManagerOpen( - SM_HANDLE hDevice, - uint32_t nLoginType, - const void* pLoginInfo, - uint32_t nControlMode, - SM_HANDLE* phServiceManager); - -SM_EXPORT SM_ERROR SMManagerClose( - SM_HANDLE hServiceManager); - -SM_EXPORT SM_ERROR SMManagerGetAllServices( - SM_HANDLE hServiceManager, - SM_UUID** ppServiceIdentifierList, - uint32_t* pnListLength); - -SM_EXPORT SM_ERROR SMManagerGetServiceProperty( - SM_HANDLE hServiceManager, - const SM_UUID* pidService, - wchar_t* pPropertyName, - wchar_t** ppPropertyValue); - -SM_EXPORT SM_ERROR SMManagerGetAllServiceProperties( - SM_HANDLE hServiceManager, - const SM_UUID* pidService, - SM_PROPERTY** ppProperties, - uint32_t* pnPropertiesLength); - -SM_EXPORT SM_ERROR SMManagerDownloadService( - SM_HANDLE hServiceManager, - const uint8_t* pServiceCode, - uint32_t nServiceCodeSize, - SM_UUID* pidService); - -SM_EXPORT SM_ERROR SMManagerRemoveService( - SM_HANDLE hServiceManager, - const SM_UUID* pidService); - -SM_EXPORT SM_ERROR SMGetImplementationProperty( - SM_HANDLE hDevice, - const wchar_t* pPropertyName, - wchar_t** ppPropertyValue); - -SM_EXPORT SM_ERROR SMGetAllImplementationProperties( - SM_HANDLE hDevice, - SM_PROPERTY** ppProperties, - uint32_t* pnPropertiesLength); - -#include "smapi_ex.h" - -#ifdef __cplusplus -} -#endif - -#endif /* __SMAPI_H__ */ diff --git a/security/tf_sdk/include/smapi_ex.h b/security/tf_sdk/include/smapi_ex.h deleted file mode 100644 index 14444f7..0000000 --- a/security/tf_sdk/include/smapi_ex.h +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Copyright(c) 2011 Trusted Logic. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name Trusted Logic nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 COPYRIGHT - * OWNER OR CONTRIBUTORS 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. - */ - -/* - * File : smapi_ex.h - * Last-Author : Trusted Logic S.A. - * Created : April 23, 2007 - */ - -#ifndef __SMAPI_EX_H__ -#define __SMAPI_EX_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Appends the specified UUID value to the encoded data of the specified - * encoder instance. - * - * Upon error, this function sets the error state of the encoder. No other state - * is affected. - * - * This function does nothing if the error state of the encoder is set upon - * entry. - * - * @param hEncoder The handle of the encoder instance. - * - * @param pUUID A pointer to the UUID value to encode. - */ -SM_EXPORT void SMStubEncoderWriteUUID( - SM_HANDLE hEncoder, - const SM_UUID *pUUID); - -/** - * Reads the UUID value at the current offset in the encoded data parsed by the - * specified decoder instance. - * - * Upon return, the current offset of the decoder references the first item - * following the decoded item. - * - * If the decoder error state is set upon entry, the function sets the UUID - * placeholder to the nil UUID and does nothing more. - * - * @param hDecoder The handle of the decoder instance. - * - * @param pUUID A pointer to the placeholder to be set to the decoded UUID - * value. This placeholder is set to the nil UUID upon failure. - */ -SM_EXPORT void SMStubDecoderReadUUID( - SM_HANDLE hDecoder, - SM_UUID *pUUID); - -/** - * Opens a sequence in the current decoder. The current decoder must point to a - * sequence. - * - * After this function is called, the current decoder points to the first element - * of the sequence. - * - * If the error state of the decoder is set upon entry, this function does nothing. - * - * Upon error, this function sets the error state of the current decoder. - * In particular, if the decoder does not point to a sequence, the error state - * is set to S_ERROR_BAD_FORMAT. - * - * @param hDecoder A handle of the decoder instance. - * - */ -SM_EXPORT void SMStubDecoderOpenSequence( - SM_HANDLE hDecoder); - -/** - * Closes a sequence in the current decoder. At least one sequence must have been - * opened using the function {SMStubDecoderOpenSequence} - * - * When this function returns, the current decoder points to the first element - * following the current sequence. - * - * If the error state of the decoder is set upon entry, this function does nothing. - * - * Upon error, this function sets the error state of the current decoder. - * In particular, if the decoder does not point within a sequence, the error state - * is set to S_ERROR_ILLEGAL_STATE. - * - * @param hDecoder A handle of the decoder instance. - * - */ -SM_EXPORT void SMStubDecoderCloseSequence( - SM_HANDLE hDecoder); - -#ifdef __cplusplus -} -#endif - -#endif /* __SMAPI_EX_H__ */ diff --git a/security/tf_sdk/include/ssdi.h b/security/tf_sdk/include/ssdi.h deleted file mode 100644 index 256f62e..0000000 --- a/security/tf_sdk/include/ssdi.h +++ /dev/null @@ -1,529 +0,0 @@ -/** - * Copyright(c) 2011 Trusted Logic. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name Trusted Logic nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 COPYRIGHT - * OWNER OR CONTRIBUTORS 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. - */ - -/* -* File : ssdi.h -* -* Original-Author : Trusted Logic S.A. -* -* Created : May 31, 2006 -*/ - -/** - * SSDI specification 3.0 header file. - */ - -#ifndef __SSDI_H__ -#define __SSDI_H__ - -#include "s_type.h" -#include "s_error.h" - -#ifndef SSDI_EXPORT -#ifdef SMODULE_IMPLEMENTATION -#define SSDI_EXPORT S_DLL_EXPORT -#else -#define SSDI_EXPORT S_DLL_IMPORT -#endif -#endif - -#ifndef SRVX_EXPORT -#define SRVX_EXPORT S_DLL_EXPORT -#endif - -/*------------------------------------------------------------------------------ - SSDI Types -------------------------------------------------------------------------------*/ - -typedef struct S_PROPERTY -{ - char* pName; - char* pValue ; -} S_PROPERTY; - -typedef struct S_TIME_LIMIT -{ - uint32_t nTime1; - uint32_t nTime2; -} S_TIME_LIMIT; - -typedef struct S_CALENDAR -{ - int32_t nYear; - int32_t nMonth; - int32_t nDayOfWeek; - int32_t nDay; - int32_t nHour; - int32_t nMinute; - int32_t nSecond; -} S_CALENDAR; - -typedef enum -{ - S_FILE_SEEK_SET = 0, - S_FILE_SEEK_CUR, - S_FILE_SEEK_END -} S_WHENCE; - -typedef struct S_FILE_INFO -{ - char* pName; - uint32_t nSize; - uint32_t nNameLength; -}S_FILE_INFO; - -typedef struct -{ - void* pBuffer; - uint32_t nSize; -} -S_PARAM_MEMREF; - -typedef struct -{ - uint32_t a; - uint32_t b; -} -S_PARAM_VALUE; - -typedef union -{ - S_PARAM_MEMREF memref; - S_PARAM_VALUE value; -} -S_PARAM; - - -/*------------------------------------------------------------------------------ - Constants -------------------------------------------------------------------------------*/ -#define S_TIMEOUT_INFINITE 0xFFFFFFFF - -/* storage private to the service */ -#define S_FILE_STORAGE_PRIVATE 0x00000001 - -#ifdef SUPPORT_RPMB_PARTITION -/* storage on rpmb */ -#define S_FILE_STORAGE_RPMB 0x00000002 -#endif - -/* Cryptoki slotID constants */ -#define S_CRYPTOKI_KEYSTORE_PRIVATE 0x00000001 -#define S_CRYPTOKI_KEYSTORE_PRIVATE_USER 0x00004004 - -/* SFile constants */ -#define S_FILE_FLAG_ACCESS_READ 0x0001 -#define S_FILE_FLAG_ACCESS_WRITE 0x0002 -#define S_FILE_FLAG_ACCESS_WRITE_META 0x0004 - -#define S_FILE_FLAG_SHARE_READ 0x0010 -#define S_FILE_FLAG_SHARE_WRITE 0x0020 - -#define S_FILE_FLAG_CREATE 0x0200 -#define S_FILE_FLAG_EXCLUSIVE 0x0400 - -#define S_FILE_NAME_MAX 0x40 -#define S_FILE_MAX_POSITION 0xFFFFFFFF - -/* SDate constants */ -#define S_DATE_STATUS_NOT_SET 0xFFFF5000 -#define S_DATE_STATUS_NEEDS_RESET 0xFFFF5001 -#define S_DATE_STATUS_SET 0x00000000 - -/* Login types */ -#define S_LOGIN_PUBLIC 0x00000000 -#define S_LOGIN_USER 0x00000001 -#define S_LOGIN_GROUP 0x00000002 -#define S_LOGIN_APPLICATION 0x00000004 -#define S_LOGIN_APPLICATION_USER 0x00000005 -#define S_LOGIN_APPLICATION_GROUP 0x00000006 -#define S_LOGIN_AUTHENTICATION 0x80000000 -#define S_LOGIN_PRIVILEGED 0x80000002 -#define S_LOGIN_CLIENT_IS_SERVICE 0xF0000000 -#define S_LOGIN_SYSTEM 0xF0000001 - -/* Parameter types */ -#define S_PARAM_TYPE_NONE 0x0 -#define S_PARAM_TYPE_VALUE_INPUT 0x1 -#define S_PARAM_TYPE_VALUE_OUTPUT 0x2 -#define S_PARAM_TYPE_VALUE_INOUT 0x3 -#define S_PARAM_TYPE_MEMREF_INPUT 0x5 -#define S_PARAM_TYPE_MEMREF_OUTPUT 0x6 -#define S_PARAM_TYPE_MEMREF_INOUT 0x7 - -#define S_PARAM_TYPE_INPUT_FLAG 0x1 -#define S_PARAM_TYPE_OUTPUT_FLAG 0x2 -#define S_PARAM_TYPE_MEMREF_FLAG 0x4 - -#define S_PARAM_TYPES(t0,t1,t2,t3) ((t0) | ((t1) << 4) | ((t2) << 8) | ((t3) << 12)) -#define S_PARAM_TYPE_GET(t, i) (((t) >> (i*4)) & 0xF) - -#define S_ORIGIN_API 1 -#define S_ORIGIN_COMMS 2 -#define S_ORIGIN_TEE 3 -#define S_ORIGIN_TRUSTED_APP 4 - -/*------------------------------------------------------------------------------ - Implementation Functions -------------------------------------------------------------------------------*/ - -S_RESULT SSDI_EXPORT SImplementationGetAllProperties( - S_PROPERTY** ppProperties, - uint32_t* pnPropertiesCount); - -S_RESULT SSDI_EXPORT SImplementationGetProperty(const char* pName, - char** ppValue); - -S_RESULT SSDI_EXPORT SImplementationGetPropertyAsInt(const char* pName, - uint32_t* pnValue); - -S_RESULT SSDI_EXPORT SImplementationGetPropertyAsBool(const char* pName, - bool* pbValue); - -/*------------------------------------------------------------------------------ - Service Functions -------------------------------------------------------------------------------*/ - -S_RESULT SSDI_EXPORT SServiceGetAllProperties( - OUT S_PROPERTY** ppProperties, - OUT uint32_t* pnPropertiesCount); - -S_RESULT SSDI_EXPORT SServiceGetProperty ( - IN const char* pName, - OUT char** ppValue); - -S_RESULT SSDI_EXPORT SServiceGetPropertyAsInt ( - IN const char* pName, - OUT uint32_t* pnValue); - -S_RESULT SSDI_EXPORT SServiceGetPropertyAsBool( - IN const char* pName, - OUT bool* pbValue); - -/*------------------------------------------------------------------------------ - Instance Functions -------------------------------------------------------------------------------*/ - -void SSDI_EXPORT SInstanceSetData( - void* pInstanceData); - -void SSDI_EXPORT *SInstanceGetData(void); - -/*------------------------------------------------------------------------------ - Session Functions -------------------------------------------------------------------------------*/ - -void SSDI_EXPORT SSessionGetClientID( - S_UUID* pClientID); - -S_RESULT SSDI_EXPORT SSessionGetAllClientProperties( - OUT uint32_t* pnPropertyCount, - OUT S_PROPERTY** ppPropertyArray); - -S_RESULT SSDI_EXPORT SSessionGetClientProperty( - IN const char* pName, - OUT char** ppValue); - -S_RESULT SSDI_EXPORT SSessionGetClientPropertyAsInt ( - IN const char* pName, - OUT uint32_t* pnValue); - -S_RESULT SSDI_EXPORT SSessionGetClientPropertyAsBool ( - IN const char* pName, - OUT bool* pnValue); - -/*------------------------------------------------------------------------------ - Memory Management Functions -------------------------------------------------------------------------------*/ - -void SSDI_EXPORT *SMemAlloc(uint32_t size); - -void SSDI_EXPORT *SMemRealloc(void* ptr, uint32_t newSize); - -void SSDI_EXPORT SMemFree(void *ptr); - -void SSDI_EXPORT *SMemMove(void *dest, const void *src, uint32_t n); - -int32_t SSDI_EXPORT SMemCompare(const void *s1, const void *s2, uint32_t n); - -void SSDI_EXPORT *SMemFill(void *s, uint32_t c, uint32_t n); - -void SSDI_EXPORT *SMemAllocEx(uint32_t nPoolID, uint32_t nSize); - -S_RESULT SMemDup(void *src, uint32_t n, void **dest); - -/*------------------------------------------------------------------------------ - Trace & Debug Functions -------------------------------------------------------------------------------*/ -void SSDI_EXPORT _SLogTrace( - const char *message, - ... /* arguments */); -void SSDI_EXPORT _SLogWarning( - const char *message, - ... /* arguments */); -void SSDI_EXPORT _SLogError( - const char *message, - ... /* arguments */); - -#ifdef __SSDI_USE_TRACE_EX -#include "ssdi_trace_ex.h" -#else - -#ifndef SSDI_NO_TRACE - -#define SLogTrace _SLogTrace -#define SLogWarning _SLogWarning -#define SLogError _SLogError - -#else /* defined(SSDI_NO_TRACE) */ - -/* Note that the following code depends on the compiler's supporting variadic macros */ -#define SLogTrace(...) do ; while(false) -#define SLogWarning(...) do ; while(false) -#define SLogError(...) do ; while(false) - -#endif /* !defined(SSDI_NO_TRACE) */ - -#endif /* __SSDI_USE_TRACE_EX */ - -void SSDI_EXPORT _SAssertionFailed( - const char* pFileName, - uint32_t nLine, - const char* pExpression); - -#ifdef SSDI_DEBUG -#define SAssert(test) \ - do \ - { \ - if (!(test)) \ - { \ - _SAssertionFailed(__FILE__, __LINE__, #test); \ - } \ - } \ - while (0) -#else /* !defined(SSDI_DEBUG) */ -#define SAssert(test) -#endif /* defined(SSDI_DEBUG) */ - -#define S_VAR_NOT_USED(variable) do{(void)(variable);}while(0); - -/*------------------------------------------------------------------------------ - Time Utility -------------------------------------------------------------------------------*/ -void SSDI_EXPORT STimeGetLimit( - uint32_t nTimeout, - OUT S_TIME_LIMIT* pTimeLimit ); - - -/*------------------------------------------------------------------------------ - Thread Functions -------------------------------------------------------------------------------*/ -S_RESULT SSDI_EXPORT SThreadCreate( - OUT S_HANDLE* phThread, - uint32_t stackSize, - uint32_t (*pEntryPoint)(void*), - IN void* pThreadArg); - -S_RESULT SSDI_EXPORT SThreadJoin( - S_HANDLE hThread, - uint32_t* pnExitCode, - const S_TIME_LIMIT* pTimeLimit); - -void SSDI_EXPORT SThreadYield(void); - -S_RESULT SSDI_EXPORT SThreadSleep(const S_TIME_LIMIT* pTimeLimit); - -void SSDI_EXPORT SThreadCancel(S_HANDLE hThread, uint32_t nReserved); - -bool SSDI_EXPORT SThreadIsCancelled (void* pReserved); - -void SSDI_EXPORT SThreadResetCancel(void); - -void SSDI_EXPORT SThreadMaskCancellation ( bool bMask ); - -/*------------------------------------------------------------------------------ - Semaphore Functions -------------------------------------------------------------------------------*/ - -S_RESULT SSDI_EXPORT SSemaphoreCreate ( - uint32_t initialCount, - S_HANDLE* phSemaphore); - -S_RESULT SSDI_EXPORT SSemaphoreAcquire(S_HANDLE hSemaphore, const S_TIME_LIMIT* pTimeLimit); - -void SSDI_EXPORT SSemaphoreRelease(S_HANDLE hSemaphore); - -/*------------------------------------------------------------------------------ - File System Functions -------------------------------------------------------------------------------*/ - -S_RESULT SSDI_EXPORT SFileOpen( - uint32_t nStorageID, - const char *pFilename, - uint32_t nFlags, - uint32_t nReserved, - S_HANDLE *phFile); - -S_RESULT SSDI_EXPORT SFileRead(S_HANDLE hFile, - uint8_t* pBuffer, - uint32_t nSize, - uint32_t* pnCount); - -S_RESULT SSDI_EXPORT SFileWrite (S_HANDLE hFile, - const uint8_t* pBuffer, - uint32_t nSize); - -S_RESULT SSDI_EXPORT SFileTruncate(S_HANDLE hFile, - uint32_t nSize); - -S_RESULT SSDI_EXPORT SFileSeek(S_HANDLE hFile, - int32_t nOffset, - S_WHENCE eWhence); - -uint32_t SSDI_EXPORT SFileTell(S_HANDLE hFile); - -bool SSDI_EXPORT SFileEOF(S_HANDLE hFile); - -S_RESULT SSDI_EXPORT SFileCloseAndDelete(S_HANDLE hFile); - -S_RESULT SSDI_EXPORT SFileRename(S_HANDLE hFile, const char* pNewFilename); - -S_RESULT SSDI_EXPORT SFileGetSize(uint32_t nStorageID, - const char* pFilename, - uint32_t* pnFileSize); - -S_RESULT SSDI_EXPORT SFileEnumerationStart ( - uint32_t nStorageID, - const char* pFilenamePattern, - uint32_t nReserved1, - uint32_t nReserved2, - S_HANDLE* phFileEnumeration); - -S_RESULT SSDI_EXPORT SFileEnumerationGetNext ( - S_HANDLE hFileEnumeration, - OUT S_FILE_INFO** ppFileInfo); - -/*------------------------------------------------------------------------------ - Date Functions -------------------------------------------------------------------------------*/ - -S_RESULT SSDI_EXPORT SDateSet ( - int32_t nSeconds, - uint32_t nReserved); - -S_RESULT SSDI_EXPORT SDateGet( - OUT int32_t* pnSeconds, - OUT uint32_t* pnDateStatus, - uint32_t nReserved ); - -int32_t SSDI_EXPORT SClockGet(void); - -S_RESULT SSDI_EXPORT SDateConvertSecondsToCalendar( - IN int32_t nSeconds, - IN const S_CALENDAR* pOrigin, - OUT S_CALENDAR* pDate ); - -S_RESULT SSDI_EXPORT SDateConvertCalendarToSeconds( - IN const S_CALENDAR* pOrigin, - IN const S_CALENDAR* pDate, - OUT int32_t* pnSeconds); - -/*------------------------------------------------------------------------------ - Handle Functions -------------------------------------------------------------------------------*/ -void SSDI_EXPORT SHandleClose ( S_HANDLE hHandle); - -/*------------------------------------------------------------------------------ - Crypto API -------------------------------------------------------------------------------*/ - -#define PKCS11_EXPORT SSDI_EXPORT - -#include "pkcs11.h" - -/*------------------------------------------------------------------------------ - Cryptoki Update Shortcut -------------------------------------------------------------------------------*/ - -#define S_UPDATE_SHORTCUT_FLAG_AGGRESSIVE 0x00000001 - -CK_RV SSDI_EXPORT CV_ActivateUpdateShortcut2( - CK_SESSION_HANDLE hCryptokiSession, - uint32_t nCommandID, - uint32_t nFlags, - uint32_t nReserved); - -void SSDI_EXPORT CV_DeactivateUpdateShortcut( - CK_SESSION_HANDLE hCryptokiSession); - - -/*------------------------------------------------------------------------------ - Panic Function -------------------------------------------------------------------------------*/ - -void SSDI_EXPORT SPanic(uint32_t nReserved); - -/*------------------------------------------------------------------------------ - SXControl functions -------------------------------------------------------------------------------*/ -S_RESULT SSDI_EXPORT SXControlOpenClientSession ( - const S_UUID* pDestination, - S_TIME_LIMIT* pDeadline, - uint32_t nParamTypes, - S_PARAM pParams[4], - OUT S_HANDLE* phSessionHandle, - uint32_t* pnReturnOrigin); - -S_RESULT SSDI_EXPORT SXControlInvokeCommand ( - S_HANDLE hSessionHandle, - S_TIME_LIMIT* pDeadline, - uint32_t nCommandID, - uint32_t nParamTypes, - S_PARAM pParams[4], - uint32_t* pnReturnOrigin); - -/*------------------------------------------------------------------------------ - SRVX Entry Points -------------------------------------------------------------------------------*/ - -extern S_RESULT SRVX_EXPORT SRVXCreate(void); -extern void SRVX_EXPORT SRVXDestroy(void); -extern S_RESULT SRVX_EXPORT SRVXOpenClientSession(uint32_t nParamTypes, - IN OUT S_PARAM pParams[4], - OUT void** ppSessionContext); -extern S_RESULT SRVX_EXPORT SRVXInvokeCommand(IN OUT void* pSessionContext, - uint32_t nCommandID, - uint32_t nParamTypes, - IN OUT S_PARAM pParams[4]); -extern void SRVX_EXPORT SRVXCloseClientSession(IN OUT void* pSessionContext); - -#include "ssdi_v2_compat.h" - -#endif /* __SSDI_H__ */ diff --git a/security/tf_sdk/include/ssdi_v2_compat.h b/security/tf_sdk/include/ssdi_v2_compat.h deleted file mode 100644 index 06a3b0e..0000000 --- a/security/tf_sdk/include/ssdi_v2_compat.h +++ /dev/null @@ -1,308 +0,0 @@ -/** - * Copyright(c) 2011 Trusted Logic. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name Trusted Logic nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 COPYRIGHT - * OWNER OR CONTRIBUTORS 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. - */ - -/* -* File : ssdi_v2_compat.h -* -* Original-Author : Trusted Logic S.A. -* -* Created : July 08, 2010 -*/ - -/** - * This header file contains the definitions for the legacy - * SSDI-V2 types and functions - */ - -#ifndef __SSDI_V2_COMPAT_H__ -#define __SSDI_V2_COMPAT_H__ - -#include "s_type.h" -#include "s_error.h" -#include "ssdi.h" - -/* SSPI entry points must not be exported. - SRVX entry points defined in the ssdi_v2_compat library are exported. */ -#define SSPI_EXPORT - -/*------------------------------------------------------------------------------ - Constants -------------------------------------------------------------------------------*/ -#define S_SHARED_MEMORY_ACCESS_READ 0x01 -#define S_SHARED_MEMORY_ACCESS_WRITE 0x02 - -#define S_NULL_ELEMENT 0xFFFFFFFF - -#define S_SHARED_MEMORY_ACCESS_READ 0x01 -#define S_SHARED_MEMORY_ACCESS_WRITE 0x02 - -/* SControl constants */ -#define S_CONTROL_MODE_USER 0x00000002 -#define S_CONTROL_MODE_MANAGER 0x00000008 -#define S_CONTROL_MODE_EXCLUSIVE_MANAGER 0x00000010 - -/* Shared memory access */ -#define S_MEMORY_ACCESS_CLIENT_WRITE_SERVICE_READ 0x00000001 -#define S_MEMORY_ACCESS_CLIENT_READ_SERVICE_WRITE 0x00000002 - -/* Login types */ -#define S_LOGIN_OS_IDENTIFICATION S_LOGIN_APPLICATION_USER - -/*------------------------------------------------------------------------------ - Decoder Functions -------------------------------------------------------------------------------*/ - -S_RESULT SDecoderGetError(S_HANDLE hDecoder); - -bool SDecoderHasData(S_HANDLE hDecoder); - -uint8_t SDecoderReadUint8(S_HANDLE hDecoder); - -uint16_t SDecoderReadUint16(S_HANDLE hDecoder); - -uint32_t SDecoderReadUint32(S_HANDLE hDecoder); - -char *SDecoderReadString(S_HANDLE hDecoder); - -bool SDecoderReadBoolean(S_HANDLE hDecoder); - -uint8_t *SDecoderReadUint8Array( - S_HANDLE hDecoder, - OUT uint32_t* pnArrayLength); - -uint16_t *SDecoderReadUint16Array( - S_HANDLE hDecoder, - OUT uint32_t* pnArrayLength); - -uint32_t *SDecoderReadUint32Array( - S_HANDLE hDecoder, - OUT uint32_t* pnArrayLength); - -uint32_t SDecoderReadArrayLength(S_HANDLE hDecoder); - -uint32_t SDecoderCopyUint8Array( - IN S_HANDLE hDecoder, - IN uint32_t nIndex, - IN uint32_t nMaxLength, - OUT uint8_t* pArray); - -uint32_t SDecoderCopyUint16Array( - IN S_HANDLE hDecoder, - IN uint32_t nIndex, - IN uint32_t nMaxLength, - OUT uint16_t* pArray); - -uint32_t SDecoderCopyUint32Array( - IN S_HANDLE hDecoder, - IN uint32_t nIndex, - IN uint32_t nMaxLength, - OUT uint32_t* pArray); - -void SDecoderOpenSequence(S_HANDLE hDecoder); - -void SDecoderCloseSequence(S_HANDLE hDecoder); - -void SDecoderSkip(S_HANDLE hDecoder); - -uint8_t *SDecoderReadMemoryReference( - S_HANDLE hDecoder, - uint32_t nFlags, - OUT uint32_t* pnSize); -void SDecoderReadUUID( - IN S_HANDLE hDecoder, - OUT S_UUID* pUUID); - -/*------------------------------------------------------------------------------ - Encoder Functions -------------------------------------------------------------------------------*/ - -void SEncoderWriteUint8( - IN S_HANDLE hEncoder, - IN uint8_t value); - -void SEncoderWriteUint16( - IN S_HANDLE hEncoder, - IN uint16_t value); - -void SEncoderWriteUint32(IN S_HANDLE hEncoder, - IN uint32_t value); - -void SEncoderWriteBoolean(IN S_HANDLE hEncoder, - IN bool value); - -void SEncoderWriteString(IN S_HANDLE hEncoder, - IN const char* value); - -void SEncoderWriteUint8Array(IN S_HANDLE hEncoder, - IN uint32_t nArrayLength, - IN const uint8_t* pnArray); - -void SEncoderWriteUint16Array(IN S_HANDLE hEncoder, - IN uint32_t nArrayLength, - IN const uint16_t* pnArray); - -void SEncoderWriteUint32Array(IN S_HANDLE hEncoder, - IN uint32_t nArrayLength, - IN const uint32_t* pnArray); - -void SEncoderWriteBooleanArray(IN S_HANDLE hEncoder, - IN uint32_t nArrayLength, - IN const bool* pnArray); - -void SEncoderWriteStringArray(IN S_HANDLE hEncoder, - IN uint32_t nArrayLength, - IN const char** pnArray); - -void SEncoderWriteMemoryReference( - S_HANDLE hEncoder, - S_HANDLE hBlock, - uint32_t nOffset, - uint32_t nLength, - uint32_t nFlags); - -void SEncoderOpenSequence( S_HANDLE hEncoder ); - -void SEncoderCloseSequence( S_HANDLE hEncoder ); - -S_RESULT SEncoderGetError(S_HANDLE hEncoder); - -void SEncoderReset( S_HANDLE hEncoder ); - -void SEncoderWriteUUID( - IN S_HANDLE hEncoder, - IN const S_UUID* pUUID); - -/*------------------------------------------------------------------------------ - Service Control Functions -------------------------------------------------------------------------------*/ - -S_RESULT SControlPrepareOpenOperation( - IN const S_UUID* pIdService, - uint32_t nControlMode, - IN const S_TIME_LIMIT* pTimeLimit, - uint32_t nEncoderBufferSize, - uint32_t nDecoderBufferSize, - OUT S_HANDLE* phClientSession, - OUT S_HANDLE* phParameterEncoder, - OUT S_HANDLE* phOperation ); - -S_RESULT SControlPrepareInvokeOperation( - S_HANDLE hClientSession, - uint32_t nCommandIdentifier, - IN const S_TIME_LIMIT* pTimeLimit, - uint32_t nEncoderBufferSize, - uint32_t nDecoderBufferSize, - OUT S_HANDLE* phParameterEncoder, - OUT S_HANDLE* phOperation ); - -S_RESULT SControlPrepareCloseOperation( - S_HANDLE hClientSession, - uint32_t nEncoderBufferSize, - uint32_t nDecoderBufferSize, - OUT S_HANDLE* phParameterEncoder, - OUT S_HANDLE* phOperation ); - -S_RESULT SControlPerformOperation( - S_HANDLE hOperation, - uint32_t nReserved, - OUT S_RESULT* pnServiceErrorCode, - OUT S_HANDLE* phAnswerDecoder ); - -S_RESULT SControlCancelOperation( S_HANDLE hOperation ); - -S_RESULT SControlAllocateSharedMemory( - S_HANDLE hClientSession, - uint32_t nLength, - uint32_t nFlags, - uint32_t nReserved, - OUT void** ppBlock, - OUT S_HANDLE* phBlockHandle); - -S_RESULT SControlRegisterSharedMemory( - S_HANDLE hClientSession, - IN const void* pBuffer, - uint32_t nBufferLength, - uint32_t nFlags, - uint32_t nReserved, - OUT S_HANDLE* phBlockHandle ); - -/*------------------------------------------------------------------------------ - Service Manager Functions -------------------------------------------------------------------------------*/ - -S_RESULT SManagerOpen( - uint32_t nControlMode, - S_HANDLE* phServiceManager); - -S_RESULT SManagerGetAllServices( - S_HANDLE hServiceManager, - S_UUID** ppServiceIdentifierList, - uint32_t* pnListLength); - -S_RESULT SManagerGetServiceProperty( - S_HANDLE hServiceManager, - const S_UUID* pidService, - const char* pPropertyName, - char** ppPropertyValue); - -S_RESULT SManagerGetAllServiceProperties( - S_HANDLE hServiceManager, - const S_UUID* pidService, - S_PROPERTY** ppProperties, - uint32_t* pnPropertiesLength); - -S_RESULT SManagerDownloadService( - S_HANDLE hServiceManager, - const uint8_t* pServiceCode, - uint32_t nServiceCodeSize, - S_UUID* pidService); - -S_RESULT SManagerRemoveService( - S_HANDLE hServiceManager, - const S_UUID* pidService); - -/*------------------------------------------------------------------------------ - SSPI Entry Points -------------------------------------------------------------------------------*/ - -S_RESULT SSPICreate(void); -void SSPIDestroy(void); -S_RESULT SSPIOpenClientSession(S_HANDLE hDecoder, - S_HANDLE hEncoder, - OUT void** ppSessionContext); -S_RESULT SSPIInvokeCommand(IN OUT void* pSessionContext, - uint32_t nCommandID, - S_HANDLE hDecoder, - S_HANDLE hEncoder); -S_RESULT SSPICloseClientSession(IN OUT void* pSessionContext, - uint32_t nCause, - S_HANDLE hDecoder, - S_HANDLE hEncoder); -#endif /* __SSDI_V2_COMPAT_H__ */ diff --git a/test/CameraHal/Android.mk b/test/CameraHal/Android.mk index c7da48a..9a31d85 100644 --- a/test/CameraHal/Android.mk +++ b/test/CameraHal/Android.mk @@ -13,6 +13,7 @@ LOCAL_SHARED_LIBRARIES:= \ libcutils \ libbinder \ libmedia \ + libmedia_native \ libui \ libgui \ libcamera_client diff --git a/test/CameraHal/camera_test.h b/test/CameraHal/camera_test.h index ad750ff..df44833 100644 --- a/test/CameraHal/camera_test.h +++ b/test/CameraHal/camera_test.h @@ -1,9 +1,9 @@ #ifndef CAMERA_TEST_H #define CAMERA_TEST_H -#define PRINTOVER(arg...) LOGD(#arg) -#define LOG_FUNCTION_NAME LOGD("%d: %s() ENTER", __LINE__, __FUNCTION__); -#define LOG_FUNCTION_NAME_EXIT LOGD("%d: %s() EXIT", __LINE__, __FUNCTION__); +#define PRINTOVER(arg...) ALOGD(#arg) +#define LOG_FUNCTION_NAME ALOGD("%d: %s() ENTER", __LINE__, __FUNCTION__); +#define LOG_FUNCTION_NAME_EXIT ALOGD("%d: %s() EXIT", __LINE__, __FUNCTION__); #define KEY_GBCE "gbce" #define KEY_GLBCE "glbce" #define KEY_CAMERA "camera-index" diff --git a/test/CameraHal/camera_test_menu.cpp b/test/CameraHal/camera_test_menu.cpp index f8ef2b1..8f3ae50 100644 --- a/test/CameraHal/camera_test_menu.cpp +++ b/test/CameraHal/camera_test_menu.cpp @@ -7,11 +7,8 @@ #include <semaphore.h> #include <pthread.h> -#include <surfaceflinger/Surface.h> -#include <surfaceflinger/ISurface.h> -#include <surfaceflinger/ISurfaceComposer.h> -#include <surfaceflinger/ISurfaceComposerClient.h> -#include <surfaceflinger/SurfaceComposerClient.h> +#include <gui/Surface.h> +#include <gui/SurfaceComposerClient.h> #include <camera/Camera.h> #include <camera/ICamera.h> @@ -294,8 +291,7 @@ audio_Codecs audioCodecs[] = { { AUDIO_ENCODER_AMR_NB, "AMR_NB" }, { AUDIO_ENCODER_AMR_WB, "AMR_WB" }, { AUDIO_ENCODER_AAC, "AAC" }, - { AUDIO_ENCODER_AAC_PLUS, "AAC+" }, - { AUDIO_ENCODER_EAAC_PLUS, "EAAC+" }, + { AUDIO_ENCODER_HE_AAC, "AAC+" }, { AUDIO_ENCODER_LIST_END, "disabled"}, }; @@ -513,19 +509,19 @@ void saveFile(const sp<IMemory>& mem) { sprintf(fn, "/sdcard/preview%03d.yuv", counter); fd = open(fn, O_CREAT | O_WRONLY | O_TRUNC, 0777); if(fd < 0) { - LOGE("Unable to open file %s: %s", fn, strerror(fd)); + ALOGE("Unable to open file %s: %s", fn, strerror(fd)); goto out; } size = mem->size(); if (size <= 0) { - LOGE("IMemory object is of zero size"); + ALOGE("IMemory object is of zero size"); goto out; } buff = (unsigned char *)mem->pointer(); if (!buff) { - LOGE("Buffer pointer is invalid"); + ALOGE("Buffer pointer is invalid"); goto out; } @@ -603,19 +599,19 @@ void my_jpeg_callback(const sp<IMemory>& mem) { fd = open(fn, O_CREAT | O_WRONLY | O_TRUNC, 0777); if(fd < 0) { - LOGE("Unable to open file %s: %s", fn, strerror(fd)); + ALOGE("Unable to open file %s: %s", fn, strerror(fd)); goto out; } size = mem->size(); if (size <= 0) { - LOGE("IMemory object is of zero size"); + ALOGE("IMemory object is of zero size"); goto out; } buff = (unsigned char *)mem->pointer(); if (!buff) { - LOGE("Buffer pointer is invalid"); + ALOGE("Buffer pointer is invalid"); goto out; } @@ -2509,4 +2505,3 @@ int main(int argc, char *argv[]) { system("echo camerahal_test > /sys/power/wake_unlock"); return 0; } - diff --git a/test/CameraHal/camera_test_script.cpp b/test/CameraHal/camera_test_script.cpp index a0b8ade..afd88be 100644 --- a/test/CameraHal/camera_test_script.cpp +++ b/test/CameraHal/camera_test_script.cpp @@ -7,12 +7,6 @@ #include <semaphore.h> #include <pthread.h> -#include <surfaceflinger/Surface.h> -#include <surfaceflinger/ISurface.h> -#include <surfaceflinger/ISurfaceComposer.h> -#include <surfaceflinger/ISurfaceComposerClient.h> -#include <surfaceflinger/SurfaceComposerClient.h> - #include <camera/Camera.h> #include <camera/ICamera.h> #include <media/mediarecorder.h> |