diff options
Diffstat (limited to 'camera/CameraHal.cpp')
-rw-r--r-- | camera/CameraHal.cpp | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/camera/CameraHal.cpp b/camera/CameraHal.cpp index 74e4634..7e7cf9d 100644 --- a/camera/CameraHal.cpp +++ b/camera/CameraHal.cpp @@ -392,6 +392,9 @@ int CameraHal::setParameters(const android::CameraParameters& params) bool restartPreviewRequired = false; bool updateRequired = false; android::CameraParameters oldParams = mParameters; +#ifdef MOTOROLA_CAMERA + char value[PROPERTY_VALUE_MAX]; +#endif #ifdef V4L_CAMERA_ADAPTER if (strcmp (V4L_CAMERA_NAME_USB, mCameraProperties->get(CameraProperties::CAMERA_NAME)) == 0 ) { @@ -1083,6 +1086,7 @@ int CameraHal::setParameters(const android::CameraParameters& params) mParameters.remove(TICameraParameters::KEY_GPS_VERSION); } +#ifndef MOTOROLA_CAMERA if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL ) { CAMHAL_LOGDB("EXIF Model set %s", valstr); @@ -1094,6 +1098,40 @@ int CameraHal::setParameters(const android::CameraParameters& params) CAMHAL_LOGDB("EXIF Make set %s", valstr); mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr); } +#else + if( (property_get("ro.product.model",value,0) > 0)) + { + CAMHAL_LOGDB("EXIF Model set %s",value); + mParameters.set(TICameraParameters::KEY_EXIF_MODEL, value); + } + + if( (property_get("ro.product.manufacturer",value,0) > 0) ) + { + CAMHAL_LOGDB("EXIF Make set %s",value); + mParameters.set(TICameraParameters::KEY_EXIF_MAKE, value); + } + + // enabled/disabled similar parameters: + // KEY_MOT_LEDFLASH // int: 0..100 percent + if((params.get(TICameraParameters::KEY_MOT_LEDFLASH) != NULL) + && (params.getInt(TICameraParameters::KEY_MOT_LEDFLASH) >=0) + && (params.getInt(TICameraParameters::KEY_MOT_LEDFLASH) <=100)) + { + CAMHAL_LOGDB("Led Flash : %s",params.get(TICameraParameters::KEY_MOT_LEDFLASH)); + mParameters.set(TICameraParameters::KEY_MOT_LEDFLASH, + params.get(TICameraParameters::KEY_MOT_LEDFLASH)); + } + + // KEY_MOT_LEDTORCH // int: 0..100 percent + if((params.get(TICameraParameters::KEY_MOT_LEDTORCH) != NULL) + && (params.getInt(TICameraParameters::KEY_MOT_LEDTORCH) >=0) + && (params.getInt(TICameraParameters::KEY_MOT_LEDTORCH) <=100)) + { + CAMHAL_LOGDB("Led Torch : %s",params.get(TICameraParameters::KEY_MOT_LEDTORCH)); + mParameters.set(TICameraParameters::KEY_MOT_LEDTORCH, + params.get(TICameraParameters::KEY_MOT_LEDTORCH)); + } +#endif #ifdef OMAP_ENHANCEMENT if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL ) @@ -3245,6 +3283,9 @@ status_t CameraHal::__takePicture(const char *params, struct timeval *captureSta bool isCPCamMode = false; android::sp<DisplayAdapter> outAdapter = 0; bool reuseTapout = false; +#ifdef MOTOROLA_CAMERA + unsigned int intensity = DEFAULT_INTENSITY; +#endif #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS @@ -3453,6 +3494,21 @@ status_t CameraHal::__takePicture(const char *params, struct timeval *captureSta if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) ) { +#ifdef MOTOROLA_CAMERA + intensity = getFlashIntensity(); + + if (intensity == 0) + { + //notification callback can be triggered with this to inform user + mParameters.set(android::CameraParameters::KEY_FLASH_MODE, android::CameraParameters::FLASH_MODE_OFF); + } + else if (intensity <= DEFAULT_INTENSITY) + { + mParameters.set(TICameraParameters::KEY_MOT_LEDFLASH, (int) intensity); + mParameters.set(TICameraParameters::KEY_MOT_LEDTORCH, (int) intensity); + } +#endif + if ( NO_ERROR == ret ) ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE, ( int ) &frame, @@ -4622,6 +4678,11 @@ void CameraHal::initDefaultParameters() p.set(TICameraParameters::KEY_ALGO_THREELINCOLORMAP, android::CameraParameters::TRUE); p.set(TICameraParameters::KEY_ALGO_GIC, android::CameraParameters::TRUE); +#ifdef MOTOROLA_CAMERA + p.set(TICameraParameters::KEY_MOT_LEDFLASH, DEFAULT_INTENSITY); + p.set(TICameraParameters::KEY_MOT_LEDTORCH, DEFAULT_INTENSITY); +#endif + LOG_FUNCTION_NAME_EXIT; } @@ -4736,6 +4797,200 @@ void CameraHal::resetPreviewRes(android::CameraParameters *params) LOG_FUNCTION_NAME_EXIT; } +#ifdef MOTOROLA_CAMERA +#include <cutils/properties.h> +#include <linux/i2c.h> +#include <linux/i2c-dev.h> + +#define EXT_MODULE_VENDOR_STRING "SHARP,OV8820" +#define INT_MODULE_VENDOR_STRING "SEMCO,OV7739" + +#define DCM_CAM_CONFIG_FILE "/data/system/dcm_camera.config" +#define CAMERA_ENABLED 0x73 +#define CAMERA_DISABLED 0x45 + +#define MOT_BURST_COUNT "mot-burst-picture-count" +#define MOT_BURST_COUNT_VALUES "mot-burst-picture-count-values" +#define MOT_MAX_BURST_SIZE "mot-max-burst-size" +//Wide screen aspect ratio (16:9) +#define WIDE_AR 1.7 + +// TI supports arbitrary burst limits, so we +// go with what we've used on other platforms +#define SUPPORTED_BURSTS "0,1,3,6,9" + +#define TORCH_DRIVER_DEVICE "/dev/i2c-3" +#define TORCH_DEVICE_SLAVE_ADDR 0x53 +#define TORCH_DEVICE_CONTROL_REG 0x10 +#define TORCH_BRIGHTNESS_CONTROL_REG 0xA0 +#define TORCH_DEFAULT_BRIGHTNESS 0x02 +#define TORCH_ENABLE 0x0A +#define TORCH_DISABLE 0x0 +#define MAX_EXPOSURE_COMPENSATION 30 + +bool CameraHal::i2cRW(int read_size, int write_size, unsigned char *read_data, unsigned char *write_data) +{ + + int i2cfd = -1; + int i,j; + int ioctl_ret; + struct i2c_msg msgs[2]; + struct i2c_rdwr_ioctl_data i2c_trans; + bool retL = 0; + + enum { I2C_WRITE, I2C_READ }; + enum { ARG_BUS = 1, ARG_ADDR, ARG_READCNT, ARG_DATA }; + + msgs[0].addr = TORCH_DEVICE_SLAVE_ADDR; + msgs[0].flags = 0; + msgs[0].len = write_size; + msgs[0].buf = write_data; + + msgs[1].addr = TORCH_DEVICE_SLAVE_ADDR; + msgs[1].flags = I2C_M_RD; + msgs[1].len = read_size; + msgs[1].buf = read_data; + + i2c_trans.msgs = NULL; + i2c_trans.nmsgs = 0; + + if ((i2cfd = open(TORCH_DRIVER_DEVICE, O_RDWR)) < 0) { + CAMHAL_LOGD("failed to open %s", TORCH_DRIVER_DEVICE); + return 1; + } + + if ( write_size && read_size ) { + i2c_trans.msgs = &msgs[0]; + i2c_trans.nmsgs = 2; + } + else if (write_size) { + i2c_trans.msgs = &msgs[0]; + i2c_trans.nmsgs = 1; + } + else if (read_size) { + i2c_trans.msgs = &msgs[1]; + i2c_trans.nmsgs = 1; + } + else { + goto done; + } + + if ( write_size > 0 ) { + CAMHAL_LOGD("I2C_WRITE"); + for( i = 0; i < write_size; i++ ) + { + CAMHAL_LOGD( "%02X ", write_data[i] ); + } + } + + if( (ioctl_ret = ioctl( i2cfd, I2C_RDWR, &(i2c_trans))) < 0 ) + { + CAMHAL_LOGD("* failed driver call: ioctl returned %d", ioctl_ret); + retL = 1; + goto done; + } + + + if ( read_size > 0 ) { + CAMHAL_LOGD("I2C_READ"); + for( i = 0; i < read_size; i++ ) + { + CAMHAL_LOGD( "%02X ", read_data[i] ); + } + } + +done: + /* close the hardware */ + close(i2cfd); + + return retL; + +} + +unsigned int CameraHal::getFlashIntensity() +{ + unsigned int flashIntensity = DEFAULT_INTENSITY; + char value[PROPERTY_VALUE_MAX]; + unsigned long minFlashThreshold; + + if (property_get("ro.media.capture.flashIntensity", value, 0) > 0) + { + flashIntensity = atoi(value); + } + if (property_get("ro.media.capture.flashMinV", value, 0) > 0) + { + minFlashThreshold = atoi(value); + } + else + { + minFlashThreshold = FLASH_VOLTAGE_THRESHOLD2; + } + if ( minFlashThreshold != 0) + { + int fd = open("/sys/class/power_supply/battery/voltage_now", O_RDONLY); + if (fd < 0) + { + CAMHAL_LOGE("Battery status is unavailable, defaulting Flash intensity to MAX"); + } + else + { + char buf[8]; + if ( read(fd, buf, 8) < 0 ) + { + CAMHAL_LOGE("Unable to read battery status, defaulting flash intensity to MAX\n"); + } + else + { + unsigned long batteryLevel; + buf[7] = '\0'; + batteryLevel = atol(buf); + CAMHAL_LOGE("Current battery Level, %d uv", batteryLevel); + if (batteryLevel < minFlashThreshold) + { + CAMHAL_LOGE("Disabling flash due to low Battery"); + flashIntensity = 0; + } + else if (batteryLevel < FLASH_VOLTAGE_THRESHOLD1) + { + flashIntensity = flashIntensity >> 1 ; + } + } + close(fd); + } + } + CAMHAL_LOGE("flashIntensity = %d", flashIntensity); + return flashIntensity; +} + +bool CameraHal::SetFlashLedTorch( unsigned intensity ) +{ + android::CameraParameters params; + mCameraAdapter->getParameters(params); + CAMHAL_LOGE("CameraHalTI::SetFlashLedTorch %d", intensity); + unsigned char write_data[2]; + + if (intensity == 0) + { + write_data[0] = TORCH_DEVICE_CONTROL_REG; + write_data[1] = TORCH_DISABLE; + i2cRW(0, 2, NULL, write_data); + } + else + { + write_data[0] = TORCH_BRIGHTNESS_CONTROL_REG; + write_data[1] = TORCH_DEFAULT_BRIGHTNESS; + i2cRW(0, 2, NULL, write_data); + + write_data[0] = TORCH_DEVICE_CONTROL_REG; + write_data[1] = TORCH_ENABLE; + i2cRW(0, 2, NULL, write_data); + } + + return true; +} + +#endif + void * camera_buffer_get_omx_ptr (CameraBuffer *buffer) { |