1 /* Copyright (c) 2011-2014, 2016, The Linux Foundation. All rights reserved. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are 5 * met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer in the documentation and/or other materials provided 11 * with the distribution. 12 * * Neither the name of The Linux Foundation nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 */ 29 30 #define ALOG_NIDEBUG 0 31 #define LOG_TAG "QualcommCamera" 32 33 // System dependencies 34 #include <utils/threads.h> 35 #include <binder/IMemory.h> 36 #include <binder/MemoryBase.h> 37 #include <binder/MemoryHeapBase.h> 38 #include <utils/RefBase.h> 39 40 extern "C" { 41 #define TIME_H <SYSTEM_HEADER_PREFIX/time.h> 42 #include TIME_H 43 } 44 45 // Camera dependencies 46 #include "QualcommCamera.h" 47 #include "QCamera2Factory.h" 48 #include "QCamera2HWI.h" 49 50 /* HAL function implementation goes here*/ 51 52 /** 53 * The functions need to be provided by the camera HAL. 54 * 55 * If getNumberOfCameras() returns N, the valid cameraId for getCameraInfo() 56 * and openCameraHardware() is 0 to N-1. 57 */ 58 59 60 static hw_module_methods_t camera_module_methods = { 61 open: camera_device_open, 62 }; 63 64 static hw_module_t camera_common = { 65 tag: HARDWARE_MODULE_TAG, 66 module_api_version: CAMERA_MODULE_API_VERSION_1_0, 67 hal_api_version: HARDWARE_HAL_API_VERSION, 68 id: CAMERA_HARDWARE_MODULE_ID, 69 name: "QCamera Module", 70 author: "Quic on behalf of CAF", 71 methods: &camera_module_methods, 72 dso: NULL, 73 reserved: {0}, 74 }; 75 76 using namespace qcamera; 77 namespace android { 78 79 typedef struct { 80 camera_device hw_dev; 81 QCamera2HardwareInterface *hardware; 82 int camera_released; 83 int cameraId; 84 } camera_hardware_t; 85 86 typedef struct { 87 camera_memory_t mem; 88 int32_t msgType; 89 sp<IMemory> dataPtr; 90 void* user; 91 unsigned int index; 92 } q_cam_memory_t; 93 94 QCamera2HardwareInterface *util_get_Hal_obj( struct camera_device * device) 95 { 96 QCamera2HardwareInterface *hardware = NULL; 97 if(device && device->priv){ 98 camera_hardware_t *camHal = (camera_hardware_t *)device->priv; 99 hardware = camHal->hardware; 100 } 101 return hardware; 102 } 103 104 extern "C" int get_number_of_cameras() 105 { 106 /* try to query every time we get the call!*/ 107 108 ALOGE("Q%s: E"); 109 return QCamera2Factory::get_number_of_cameras(); 110 } 111 112 extern "C" int get_camera_info(int camera_id, struct camera_info *info) 113 { 114 int rc = -1; 115 ALOGE("Q%s: E"); 116 117 if(info) { 118 QCamera2Factory::get_camera_info(camera_id, info); 119 } 120 LOGD("Q%s: X"); 121 return rc; 122 } 123 124 125 /* HAL should return NULL if it fails to open camera hardware. */ 126 extern "C" int camera_device_open( 127 const struct hw_module_t* module, const char* id, 128 struct hw_device_t** hw_device) 129 { 130 int rc = -1; 131 camera_device *device = NULL; 132 133 if(module && id && hw_device) { 134 if (!strcmp(module->name, camera_common.name)) { 135 int cameraId = atoi(id); 136 137 camera_hardware_t *camHal = 138 (camera_hardware_t *) malloc(sizeof (camera_hardware_t)); 139 if(!camHal) { 140 *hw_device = NULL; 141 ALOGE(" end in no mem"); 142 return rc; 143 } 144 /* we have the camera_hardware obj malloced */ 145 memset(camHal, 0, sizeof (camera_hardware_t)); 146 camHal->hardware = new QCamera2HardwareInterface((uint32_t)cameraId); 147 if (camHal->hardware) { 148 camHal->cameraId = cameraId; 149 device = &camHal->hw_dev; 150 device->common.close = close_camera_device; 151 device->ops = &QCamera2HardwareInterface::mCameraOps; 152 device->priv = (void *)camHal; 153 rc = 0; 154 } else { 155 if (camHal->hardware) { 156 delete camHal->hardware; 157 camHal->hardware = NULL; 158 } 159 free(camHal); 160 device = NULL; 161 goto EXIT; 162 } 163 } 164 } 165 /* pass actual hw_device ptr to framework. This amkes that we actally be use memberof() macro */ 166 *hw_device = (hw_device_t*)&device->common; 167 168 EXIT: 169 170 ALOGE(" end rc %d", rc); 171 return rc; 172 } 173 174 extern "C" int close_camera_device( hw_device_t *hw_dev) 175 { 176 ALOGE("Q%s: device =%p E", hw_dev); 177 int rc = -1; 178 camera_device_t *device = (camera_device_t *)hw_dev; 179 180 if(device) { 181 camera_hardware_t *camHal = (camera_hardware_t *)device->priv; 182 if(camHal ) { 183 QCamera2HardwareInterface *hardware = util_get_Hal_obj( device); 184 if(!camHal->camera_released) { 185 if(hardware != NULL) { 186 hardware->release(device); 187 } 188 } 189 if(hardware != NULL) 190 delete hardware; 191 free(camHal); 192 } 193 rc = 0; 194 } 195 return rc; 196 } 197 198 199 int set_preview_window(struct camera_device * device, 200 struct preview_stream_ops *window) 201 { 202 int rc = -1; 203 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 204 205 if(hardware != NULL) { 206 rc = hardware->set_preview_window(device, window); 207 } 208 return rc; 209 } 210 211 void set_CallBacks(struct camera_device * device, 212 camera_notify_callback notify_cb, 213 camera_data_callback data_cb, 214 camera_data_timestamp_callback data_cb_timestamp, 215 camera_request_memory get_memory, 216 void *user) 217 { 218 ALOGE("Q%s: E"); 219 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 220 if(hardware != NULL){ 221 hardware->set_CallBacks(device, notify_cb,data_cb, data_cb_timestamp, get_memory, user); 222 } 223 } 224 225 void enable_msg_type(struct camera_device * device, int32_t msg_type) 226 { 227 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 228 if(hardware != NULL){ 229 hardware->enable_msg_type(device, msg_type); 230 } 231 } 232 233 void disable_msg_type(struct camera_device * device, int32_t msg_type) 234 { 235 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 236 ALOGE("Q%s: E"); 237 if(hardware != NULL){ 238 hardware->disable_msg_type(device, msg_type); 239 } 240 } 241 242 int msg_type_enabled(struct camera_device * device, int32_t msg_type) 243 { 244 ALOGE("Q%s: E"); 245 int rc = -1; 246 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 247 if(hardware != NULL){ 248 rc = hardware->msg_type_enabled(device, msg_type); 249 } 250 return rc; 251 } 252 253 int start_preview(struct camera_device * device) 254 { 255 ALOGE("Q%s: E"); 256 int rc = -1; 257 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 258 if(hardware != NULL){ 259 rc = hardware->start_preview(device); 260 } 261 ALOGE("Q%s: X"); 262 return rc; 263 } 264 265 void stop_preview(struct camera_device * device) 266 { 267 ALOGE("Q%s: E"); 268 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 269 if(hardware != NULL){ 270 hardware->stop_preview(device); 271 } 272 } 273 274 int preview_enabled(struct camera_device * device) 275 { 276 ALOGE("Q%s: E"); 277 int rc = -1; 278 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 279 if(hardware != NULL){ 280 rc = hardware->preview_enabled(device); 281 } 282 return rc; 283 } 284 285 int store_meta_data_in_buffers(struct camera_device * device, int enable) 286 { 287 ALOGE("Q%s: E"); 288 int rc = -1; 289 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 290 if(hardware != NULL){ 291 rc = hardware->store_meta_data_in_buffers(device, enable); 292 } 293 return rc; 294 } 295 296 int start_recording(struct camera_device * device) 297 { 298 ALOGE("Q%s: E"); 299 int rc = -1; 300 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 301 if(hardware != NULL){ 302 rc = hardware->start_recording(device); 303 } 304 return rc; 305 } 306 307 void stop_recording(struct camera_device * device) 308 { 309 ALOGE("Q%s: E"); 310 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 311 if(hardware != NULL){ 312 hardware->stop_recording(device); 313 } 314 } 315 316 int recording_enabled(struct camera_device * device) 317 { 318 ALOGE("Q%s: E"); 319 int rc = -1; 320 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 321 if(hardware != NULL){ 322 rc = hardware->recording_enabled(device); 323 } 324 return rc; 325 } 326 327 void release_recording_frame(struct camera_device * device, 328 const void *opaque) 329 { 330 LOGD("Q%s: E"); 331 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 332 if(hardware != NULL){ 333 hardware->release_recording_frame(device, opaque); 334 } 335 } 336 337 int auto_focus(struct camera_device * device) 338 { 339 ALOGE("Q%s: E"); 340 int rc = -1; 341 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 342 if(hardware != NULL){ 343 rc = hardware->auto_focus(device); 344 } 345 return rc; 346 } 347 348 int cancel_auto_focus(struct camera_device * device) 349 { 350 ALOGE("Q%s: E"); 351 int rc = -1; 352 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 353 if(hardware != NULL){ 354 rc = hardware->cancel_auto_focus(device); 355 } 356 return rc; 357 } 358 359 int take_picture(struct camera_device * device) 360 { 361 ALOGE("Q%s: E"); 362 int rc = -1; 363 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 364 if(hardware != NULL){ 365 rc = hardware->take_picture(device); 366 } 367 return rc; 368 } 369 370 int cancel_picture(struct camera_device * device) 371 372 { 373 ALOGE("Q%s: E"); 374 int rc = -1; 375 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 376 if(hardware != NULL){ 377 rc = hardware->cancel_picture(device); 378 } 379 return rc; 380 } 381 382 int set_parameters(struct camera_device * device, const char *parms) 383 384 { 385 ALOGE("Q%s: E"); 386 int rc = -1; 387 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 388 if(hardware != NULL && parms){ 389 rc = hardware->set_parameters(device, parms); 390 } 391 return rc; 392 } 393 394 char* get_parameters(struct camera_device * device) 395 { 396 ALOGE("Q%s: E"); 397 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 398 if(hardware != NULL){ 399 char *parms = NULL; 400 parms = hardware->get_parameters(device); 401 return parms; 402 } 403 return NULL; 404 } 405 406 void put_parameters(struct camera_device * device, char *parm) 407 408 { 409 ALOGE("Q%s: E"); 410 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 411 if(hardware != NULL){ 412 hardware->put_parameters(device, parm); 413 } 414 } 415 416 int send_command(struct camera_device * device, 417 int32_t cmd, int32_t arg1, int32_t arg2) 418 { 419 ALOGE("Q%s: E"); 420 int rc = -1; 421 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 422 if(hardware != NULL){ 423 rc = hardware->send_command(device, cmd, arg1, arg2); 424 } 425 return rc; 426 } 427 428 void release(struct camera_device * device) 429 { 430 ALOGE("Q%s: E"); 431 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 432 if(hardware != NULL){ 433 camera_hardware_t *camHal = (camera_hardware_t *)device->priv; 434 hardware->release(device); 435 camHal->camera_released = true; 436 } 437 } 438 439 int dump(struct camera_device * device, int fd) 440 { 441 ALOGE("Q%s: E"); 442 int rc = -1; 443 QCamera2HardwareInterface *hardware = util_get_Hal_obj(device); 444 if(hardware != NULL){ 445 rc = hardware->dump(device, fd); 446 } 447 return rc; 448 } 449 450 }; // namespace android 451