1 /* Copyright (c) 2011-2012, 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 /*#error uncomment this for compiler test!*/ 30 31 //#define ALOG_NDEBUG 0 32 #define ALOG_NIDEBUG 0 33 #define LOG_TAG "QualcommCamera" 34 #include <utils/Log.h> 35 #include <utils/threads.h> 36 #include <fcntl.h> 37 #include <sys/mman.h> 38 39 #include "QCameraHAL.h" 40 /* include QCamera Hardware Interface Header*/ 41 #include "QualcommCamera.h" 42 43 extern "C" { 44 #include <sys/time.h> 45 } 46 47 /** 48 * The functions need to be provided by the camera HAL. 49 * 50 * If getNumberOfCameras() returns N, the valid cameraId for getCameraInfo() 51 * and openCameraHardware() is 0 to N-1. 52 */ 53 54 static hw_module_methods_t camera_module_methods = { 55 open: camera_device_open, 56 }; 57 58 static hw_module_t camera_common = { 59 tag: HARDWARE_MODULE_TAG, 60 module_api_version: CAMERA_MODULE_API_VERSION_2_0, 61 hal_api_version: HARDWARE_HAL_API_VERSION, 62 id: CAMERA_HARDWARE_MODULE_ID, 63 name: "Qcamera", 64 author:"Qcom", 65 methods: &camera_module_methods, 66 dso: NULL, 67 reserved: {0}, 68 }; 69 70 camera_module_t HAL_MODULE_INFO_SYM = { 71 common: camera_common, 72 get_number_of_cameras: get_number_of_cameras, 73 get_camera_info: get_camera_info, 74 }; 75 76 camera2_device_ops_t camera_ops = { 77 set_request_queue_src_ops: android::set_request_queue_src_ops, 78 notify_request_queue_not_empty: android::notify_request_queue_not_empty, 79 set_frame_queue_dst_ops: android::set_frame_queue_dst_ops, 80 get_in_progress_count: android::get_in_progress_count, 81 flush_captures_in_progress: android::flush_captures_in_progress, 82 construct_default_request: android::construct_default_request, 83 84 allocate_stream: android::allocate_stream, 85 register_stream_buffers: android::register_stream_buffers, 86 release_stream: android::release_stream, 87 88 allocate_reprocess_stream: android::allocate_reprocess_stream, 89 allocate_reprocess_stream_from_stream: android::allocate_reprocess_stream_from_stream, 90 release_reprocess_stream: android::release_reprocess_stream, 91 92 trigger_action: android::trigger_action, 93 set_notify_callback: android::set_notify_callback, 94 get_metadata_vendor_tag_ops: android::get_metadata_vendor_tag_ops, 95 dump: android::dump, 96 }; 97 98 namespace android { 99 100 typedef struct { 101 camera2_device_t hw_dev; 102 QCameraHardwareInterface *hardware; 103 int camera_released; 104 int cameraId; 105 } camera_hardware_t; 106 107 QCameraHardwareInterface *util_get_Hal_obj(const camera2_device_t * device) 108 { 109 QCameraHardwareInterface *hardware = NULL; 110 if(device && device->priv){ 111 camera_hardware_t *camHal = (camera_hardware_t *)device->priv; 112 hardware = camHal->hardware; 113 } 114 return hardware; 115 } 116 117 extern "C" int get_number_of_cameras() 118 { 119 /* try to query every time we get the call!*/ 120 ALOGE("Q%s: E", __func__); 121 return android::HAL_getNumberOfCameras(); 122 } 123 124 extern "C" int get_camera_info(int camera_id, struct camera_info *info) 125 { 126 int rc = -1; 127 ALOGE("Q%s: E, id = %d", __func__, camera_id); 128 if(info) { 129 rc = android::HAL_getCameraInfo(camera_id, info); 130 } 131 ALOGE("Q%s: X, id = %d", __func__, camera_id); 132 return rc; 133 } 134 135 136 /* HAL should return NULL if it fails to open camera hardware. */ 137 extern "C" int camera_device_open( 138 const struct hw_module_t* module, const char* id, 139 struct hw_device_t** hw_device) 140 { 141 int rc = -1; 142 int mode = 0; 143 camera2_device_t *device = NULL; 144 ALOGE("Q%s: E, id = %s", __func__, id); 145 if(module && id && hw_device) { 146 int cameraId = atoi(id); 147 148 if (!strcmp(module->name, camera_common.name)) { 149 camera_hardware_t *camHal = 150 (camera_hardware_t *) malloc(sizeof (camera_hardware_t)); 151 if(!camHal) { 152 *hw_device = NULL; 153 ALOGE("%s: end in no mem", __func__); 154 return rc; 155 } 156 /* we have the camera_hardware obj malloced */ 157 memset(camHal, 0, sizeof (camera_hardware_t)); 158 camHal->hardware = new QCameraHardwareInterface(cameraId, mode); 159 if (camHal->hardware && camHal->hardware->isCameraReady()) { 160 camHal->cameraId = cameraId; 161 device = &camHal->hw_dev; 162 device->common.close = close_camera_device; 163 device->common.version = CAMERA_DEVICE_API_VERSION_2_0; 164 device->ops = &camera_ops; 165 device->priv = (void *)camHal; 166 rc = 0; 167 } else { 168 if (camHal->hardware) { 169 delete camHal->hardware; 170 camHal->hardware = NULL; 171 } 172 free(camHal); 173 device = NULL; 174 } 175 } 176 } 177 /* pass actual hw_device ptr to framework. This amkes that we actally be use memberof() macro */ 178 *hw_device = (hw_device_t*)&device->common; 179 ALOGE("%s: end rc %d", __func__, rc); 180 return rc; 181 } 182 183 extern "C" int close_camera_device(hw_device_t *hw_dev) 184 { 185 ALOGE("Q%s: device =%p E", __func__, hw_dev); 186 int rc = -1; 187 camera2_device_t *device = (camera2_device_t *)hw_dev; 188 189 if(device) { 190 camera_hardware_t *camHal = (camera_hardware_t *)device->priv; 191 if(camHal ) { 192 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 193 if(!camHal->camera_released) { 194 if(hardware != NULL) { 195 hardware->release( ); 196 } 197 } 198 if(hardware != NULL) 199 delete hardware; 200 free(camHal); 201 } 202 rc = 0; 203 } 204 return rc; 205 } 206 207 int set_request_queue_src_ops(const struct camera2_device *device, 208 const camera2_request_queue_src_ops_t *request_src_ops) 209 { 210 int rc = INVALID_OPERATION; 211 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 212 213 if(hardware != NULL) { 214 rc = hardware->set_request_queue_src_ops(request_src_ops); 215 } 216 return rc; 217 } 218 219 int notify_request_queue_not_empty(const struct camera2_device *device) 220 { 221 int rc = INVALID_OPERATION; 222 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 223 224 if(hardware != NULL) { 225 rc = hardware->notify_request_queue_not_empty(); 226 } 227 return rc; 228 } 229 230 int set_frame_queue_dst_ops(const struct camera2_device *device, 231 const camera2_frame_queue_dst_ops_t *frame_dst_ops) 232 { 233 int rc = INVALID_OPERATION; 234 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 235 236 if(hardware != NULL) { 237 rc = hardware->set_frame_queue_dst_ops(frame_dst_ops); 238 } 239 return rc; 240 } 241 242 int get_in_progress_count(const struct camera2_device *device) 243 { 244 int rc = INVALID_OPERATION; 245 ALOGE("%s:E",__func__); 246 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 247 248 if(hardware != NULL) { 249 rc = hardware->get_in_progress_count(); 250 } 251 ALOGE("%s:X",__func__); 252 return rc; 253 } 254 255 int flush_captures_in_progress(const struct camera2_device *) 256 { 257 ALOGE("%s:E",__func__); 258 ALOGE("%s:X",__func__); 259 return INVALID_OPERATION; 260 } 261 262 int construct_default_request(const struct camera2_device *device, 263 int request_template, 264 camera_metadata_t **request) 265 { 266 int rc = INVALID_OPERATION; 267 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 268 269 if(hardware != NULL) { 270 rc = hardware->construct_default_request(request_template, request); 271 } 272 return rc; 273 } 274 275 int allocate_stream(const struct camera2_device *device, 276 uint32_t width, 277 uint32_t height, 278 int format, 279 const camera2_stream_ops_t *stream_ops, 280 uint32_t *stream_id, 281 uint32_t *format_actual, 282 uint32_t *usage, 283 uint32_t *max_buffers) 284 { 285 int rc = INVALID_OPERATION; 286 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 287 288 if(hardware != NULL) { 289 rc = hardware->allocate_stream(width, height, format, stream_ops, 290 stream_id, format_actual, usage, max_buffers); 291 } 292 return rc; 293 } 294 295 int register_stream_buffers( 296 const struct camera2_device *device, 297 uint32_t stream_id, 298 int num_buffers, 299 buffer_handle_t *buffers) 300 { 301 int rc = INVALID_OPERATION; 302 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 303 304 if(hardware != NULL) { 305 rc = hardware->register_stream_buffers(stream_id, num_buffers, buffers); 306 } 307 return rc; 308 } 309 310 int release_stream( 311 const struct camera2_device *device, 312 uint32_t stream_id) 313 { 314 int rc = INVALID_OPERATION; 315 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 316 317 if(hardware != NULL) { 318 rc = hardware->release_stream(stream_id); 319 } 320 return rc; 321 } 322 323 int allocate_reprocess_stream(const struct camera2_device *, 324 uint32_t width, 325 uint32_t height, 326 uint32_t format, 327 const camera2_stream_in_ops_t *reprocess_stream_ops, 328 uint32_t *stream_id, 329 uint32_t *consumer_usage, 330 uint32_t *max_buffers) 331 { 332 return INVALID_OPERATION; 333 } 334 335 int allocate_reprocess_stream_from_stream(const struct camera2_device *, 336 uint32_t output_stream_id, 337 const camera2_stream_in_ops_t *reprocess_stream_ops, 338 uint32_t *stream_id) 339 { 340 return INVALID_OPERATION; 341 } 342 343 int release_reprocess_stream( 344 const struct camera2_device *, 345 uint32_t stream_id) 346 { 347 return INVALID_OPERATION; 348 } 349 350 int trigger_action(const struct camera2_device *, 351 uint32_t trigger_id, 352 int32_t ext1, 353 int32_t ext2) 354 { 355 return INVALID_OPERATION; 356 } 357 358 int set_notify_callback(const struct camera2_device *device, 359 camera2_notify_callback notify_cb, 360 void *user) 361 { 362 int rc = INVALID_OPERATION; 363 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 364 365 if(hardware != NULL) { 366 rc = hardware->set_notify_callback(notify_cb, user); 367 } 368 return rc; 369 } 370 371 int get_metadata_vendor_tag_ops(const struct camera2_device *device, 372 vendor_tag_query_ops_t **ops) 373 { 374 int rc = INVALID_OPERATION; 375 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 376 377 if(hardware != NULL) { 378 rc = hardware->get_metadata_vendor_tag_ops(ops); 379 } 380 return rc; 381 } 382 383 int dump(const struct camera2_device *, int fd) 384 { 385 return INVALID_OPERATION; 386 } 387 388 #if 0 389 int set_preview_window(camera2_device_t * device, 390 struct preview_stream_ops *window) 391 { 392 int rc = -1; 393 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 394 395 if(hardware != NULL) { 396 rc = hardware->setPreviewWindow(window); 397 } 398 return rc; 399 } 400 401 void set_CallBacks(camera2_device_t * device, 402 camera_notify_callback notify_cb, 403 camera_data_callback data_cb, 404 camera_data_timestamp_callback data_cb_timestamp, 405 camera_request_memory get_memory, 406 void *user) 407 { 408 ALOGE("Q%s: E", __func__); 409 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 410 if(hardware != NULL){ 411 hardware->setCallbacks(notify_cb,data_cb, data_cb_timestamp, get_memory, user); 412 } 413 } 414 415 void enable_msg_type(camera2_device_t * device, int32_t msg_type) 416 { 417 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 418 if(hardware != NULL){ 419 hardware->enableMsgType(msg_type); 420 } 421 } 422 423 void disable_msg_type(camera2_device_t * device, int32_t msg_type) 424 { 425 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 426 ALOGE("Q%s: E", __func__); 427 if(hardware != NULL){ 428 hardware->disableMsgType(msg_type); 429 } 430 } 431 432 int msg_type_enabled(camera2_device_t * device, int32_t msg_type) 433 { 434 ALOGE("Q%s: E", __func__); 435 int rc = -1; 436 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 437 if(hardware != NULL){ 438 rc = hardware->msgTypeEnabled(msg_type); 439 } 440 return rc; 441 } 442 443 int start_preview(camera2_device_t * device) 444 { 445 ALOGE("Q%s: E", __func__); 446 int rc = -1; 447 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 448 if(hardware != NULL){ 449 rc = hardware->startPreview( ); 450 } 451 ALOGE("Q%s: X", __func__); 452 return rc; 453 } 454 455 void stop_preview(camera2_device_t * device) 456 { 457 ALOGE("Q%s: E", __func__); 458 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 459 if(hardware != NULL){ 460 hardware->stopPreview( ); 461 } 462 } 463 464 int preview_enabled(camera2_device_t * device) 465 { 466 ALOGE("Q%s: E", __func__); 467 int rc = -1; 468 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 469 if(hardware != NULL){ 470 rc = hardware->previewEnabled( ); 471 } 472 return rc; 473 } 474 475 int store_meta_data_in_buffers(camera2_device_t *device, int enable) 476 { 477 ALOGE("Q%s: E", __func__); 478 int rc = -1; 479 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 480 if(hardware != NULL){ 481 rc = hardware->storeMetaDataInBuffers(enable); 482 } 483 return rc; 484 } 485 486 int start_recording(camera2_device_t *device) 487 { 488 ALOGE("Q%s: E", __func__); 489 int rc = -1; 490 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 491 if(hardware != NULL){ 492 rc = hardware->startRecording( ); 493 } 494 return rc; 495 } 496 497 void stop_recording(camera2_device_t *device) 498 { 499 ALOGE("Q%s: E", __func__); 500 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 501 if(hardware != NULL){ 502 hardware->stopRecording( ); 503 } 504 } 505 506 int recording_enabled(camera2_device_t *device) 507 { 508 ALOGE("Q%s: E", __func__); 509 int rc = -1; 510 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 511 if(hardware != NULL){ 512 rc = hardware->recordingEnabled( ); 513 } 514 return rc; 515 } 516 517 void release_recording_frame(camera2_device_t *device, 518 const void *opaque) 519 { 520 ALOGV("Q%s: E", __func__); 521 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 522 if(hardware != NULL){ 523 hardware->releaseRecordingFrame(opaque); 524 } 525 } 526 527 int auto_focus(camera2_device_t *device) 528 { 529 ALOGE("Q%s: E", __func__); 530 int rc = -1; 531 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 532 if(hardware != NULL){ 533 rc = hardware->autoFocus( ); 534 } 535 return rc; 536 } 537 538 int cancel_auto_focus(camera2_device_t *device) 539 { 540 ALOGE("Q%s: E", __func__); 541 int rc = -1; 542 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 543 if(hardware != NULL){ 544 rc = hardware->cancelAutoFocus( ); 545 } 546 return rc; 547 } 548 549 int take_picture(camera2_device_t *device) 550 { 551 ALOGE("Q%s: E", __func__); 552 int rc = -1; 553 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 554 if(hardware != NULL){ 555 rc = hardware->takePicture( ); 556 } 557 return rc; 558 } 559 560 int cancel_picture(camera2_device_t *device) 561 562 { 563 ALOGE("Q%s: E", __func__); 564 int rc = -1; 565 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 566 if(hardware != NULL){ 567 rc = hardware->cancelPicture( ); 568 } 569 return rc; 570 } 571 572 int set_parameters(camera2_device_t *device, const char *parms) 573 574 { 575 ALOGE("Q%s: E", __func__); 576 int rc = -1; 577 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 578 if(hardware != NULL && parms){ 579 //QCameraParameters param;// = util_get_HAL_parameter(device); 580 //String8 str = String8(parms); 581 582 //param.unflatten(str); 583 rc = hardware->setParameters(parms); 584 //rc = 0; 585 } 586 return rc; 587 } 588 589 char* get_parameters(camera2_device_t *device) 590 { 591 ALOGE("Q%s: E", __func__); 592 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 593 if(hardware != NULL){ 594 char *parms = NULL; 595 hardware->getParameters(&parms); 596 return parms; 597 } 598 return NULL; 599 } 600 601 void put_parameters(camera2_device_t *device, char *parm) 602 603 { 604 ALOGE("Q%s: E", __func__); 605 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 606 if(hardware != NULL){ 607 hardware->putParameters(parm); 608 } 609 } 610 611 int send_command(camera2_device_t *device, 612 int32_t cmd, int32_t arg1, int32_t arg2) 613 { 614 ALOGE("Q%s: E", __func__); 615 int rc = -1; 616 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 617 if(hardware != NULL){ 618 rc = hardware->sendCommand( cmd, arg1, arg2); 619 } 620 return rc; 621 } 622 623 void release(camera2_device_t *device) 624 { 625 ALOGE("Q%s: E", __func__); 626 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 627 if(hardware != NULL){ 628 camera_hardware_t *camHal = (camera_hardware_t *)device->priv; 629 hardware->release( ); 630 camHal->camera_released = true; 631 } 632 } 633 634 int dump(camera2_device_t *device, int fd) 635 { 636 ALOGE("Q%s: E", __func__); 637 int rc = -1; 638 QCameraHardwareInterface *hardware = util_get_Hal_obj(device); 639 if(hardware != NULL){ 640 rc = hardware->dump( fd ); 641 } 642 return rc; 643 } 644 #endif 645 646 }; // namespace android 647