1 /* Copyright (c) 2011, 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 LOG_NDEBUG 0
32 #define LOG_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 //#include "QualcommCameraHardware.h"
43 //#include <camera/CameraHardwareInterface.h>
44
45 extern "C" {
46 #include <sys/time.h>
47 }
48
49 /* HAL function implementation goes here*/
50
51 /**
52 * The functions need to be provided by the camera HAL.
53 *
54 * If getNumberOfCameras() returns N, the valid cameraId for getCameraInfo()
55 * and openCameraHardware() is 0 to N-1.
56 */
57
58 static hw_module_methods_t camera_module_methods = {
59 open: camera_device_open,
60 };
61
62 static hw_module_t camera_common = {
63 tag: HARDWARE_MODULE_TAG,
64 version_major: 0,
65 version_minor: 01,
66 id: CAMERA_HARDWARE_MODULE_ID,
67 name: "Qcamera",
68 author:"Qcom",
69 methods: &camera_module_methods,
70 dso: NULL,
71 //reserved[0]: 0,
72 };
73 camera_module_t HAL_MODULE_INFO_SYM = {
74 common: camera_common,
75 get_number_of_cameras: get_number_of_cameras,
76 get_camera_info: get_camera_info,
77 };
78
79 camera_device_ops_t camera_ops = {
80 set_preview_window: android::set_preview_window,
81 set_callbacks: android::set_CallBacks,
82 enable_msg_type: android::enable_msg_type,
83 disable_msg_type: android::disable_msg_type,
84 msg_type_enabled: android::msg_type_enabled,
85
86 start_preview: android::start_preview,
87 stop_preview: android::stop_preview,
88 preview_enabled: android::preview_enabled,
89 store_meta_data_in_buffers: android::store_meta_data_in_buffers,
90
91 start_recording: android::start_recording,
92 stop_recording: android::stop_recording,
93 recording_enabled: android::recording_enabled,
94 release_recording_frame: android::release_recording_frame,
95
96 auto_focus: android::auto_focus,
97 cancel_auto_focus: android::cancel_auto_focus,
98
99 take_picture: android::take_picture,
100 cancel_picture: android::cancel_picture,
101
102 set_parameters: android::set_parameters,
103 get_parameters: android::get_parameters,
104 put_parameters: android::put_parameters,
105 send_command: android::send_command,
106
107 release: android::release,
108 dump: android::dump,
109 };
110
111 namespace android {
112
113 typedef struct {
114 camera_device hw_dev;
115 //sp<CameraHardwareInterface> hardware;
116 QCameraHardwareInterface *hardware;
117 int camera_released;
118 int cameraId;
119 //CameraParameters parameters;
120 } camera_hardware_t;
121
122 typedef struct {
123 camera_memory_t mem;
124 int32_t msgType;
125 sp<IMemory> dataPtr;
126 void* user;
127 unsigned int index;
128 } q_cam_memory_t;
129
util_get_Hal_obj(struct camera_device * device)130 QCameraHardwareInterface *util_get_Hal_obj( struct camera_device * device)
131 {
132 QCameraHardwareInterface *hardware = NULL;
133 if(device && device->priv){
134 camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
135 hardware = camHal->hardware;
136 }
137 return hardware;
138 }
139
140 #if 0 //mzhu
141 CameraParameters* util_get_HAL_parameter( struct camera_device * device)
142 {
143 CameraParameters *param = NULL;
144 if(device && device->priv){
145 camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
146 param = &(camHal->parameters);
147 }
148 return param;
149 }
150 #endif //mzhu
151
get_number_of_cameras()152 extern "C" int get_number_of_cameras()
153 {
154 /* try to query every time we get the call!*/
155
156 LOGE("Q%s: E", __func__);
157 return android::HAL_getNumberOfCameras( );
158 }
159
get_camera_info(int camera_id,struct camera_info * info)160 extern "C" int get_camera_info(int camera_id, struct camera_info *info)
161 {
162 int rc = -1;
163 LOGE("Q%s: E", __func__);
164 if(info) {
165 struct CameraInfo camInfo;
166 memset(&camInfo, -1, sizeof (struct CameraInfo));
167 android::HAL_getCameraInfo(camera_id, &camInfo);
168 if (camInfo.facing >= 0) {
169 rc = 0;
170 info->facing = camInfo.facing;
171 info->orientation = camInfo.orientation;
172 }
173 }
174 LOGV("Q%s: X", __func__);
175 return rc;
176 }
177
178
179 /* HAL should return NULL if it fails to open camera hardware. */
camera_device_open(const struct hw_module_t * module,const char * id,struct hw_device_t ** hw_device)180 extern "C" int camera_device_open(
181 const struct hw_module_t* module, const char* id,
182 struct hw_device_t** hw_device)
183 {
184 int rc = -1;
185 int mode = 0; // TODO: need to add 3d/2d mode, etc
186 camera_device *device = NULL;
187 if(module && id && hw_device) {
188 int cameraId = atoi(id);
189
190 if (!strcmp(module->name, camera_common.name)) {
191 camera_hardware_t *camHal =
192 (camera_hardware_t *) malloc(sizeof (camera_hardware_t));
193 if(!camHal) {
194 *hw_device = NULL;
195 LOGE("%s: end in no mem", __func__);
196 return rc;
197 }
198 /* we have the camera_hardware obj malloced */
199 memset(camHal, 0, sizeof (camera_hardware_t));
200 camHal->hardware = new QCameraHardwareInterface(cameraId, mode); //HAL_openCameraHardware(cameraId);
201 if (camHal->hardware && camHal->hardware->isCameraReady()) {
202 camHal->cameraId = cameraId;
203 device = &camHal->hw_dev;
204 device->common.close = close_camera_device;
205 device->ops = &camera_ops;
206 device->priv = (void *)camHal;
207 rc = 0;
208 } else {
209 if (camHal->hardware) {
210 delete camHal->hardware;
211 camHal->hardware = NULL;
212 }
213 free(camHal);
214 device = NULL;
215 }
216 }
217 }
218 /* pass actual hw_device ptr to framework. This amkes that we actally be use memberof() macro */
219 *hw_device = (hw_device_t*)&device->common;
220 LOGE("%s: end rc %d", __func__, rc);
221 return rc;
222 }
223
close_camera_device(hw_device_t * hw_dev)224 extern "C" int close_camera_device( hw_device_t *hw_dev)
225 {
226 LOGE("Q%s: device =%p E", __func__, hw_dev);
227 int rc = -1;
228 camera_device_t *device = (camera_device_t *)hw_dev;
229
230 if(device) {
231 camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
232 if(camHal ) {
233 QCameraHardwareInterface *hardware = util_get_Hal_obj( device);
234 if(!camHal->camera_released) {
235 if(hardware != NULL) {
236 hardware->release( );
237 }
238 }
239 if(hardware != NULL)
240 delete hardware;
241 free(camHal);
242 }
243 rc = 0;
244 }
245 return rc;
246 }
247
248
set_preview_window(struct camera_device * device,struct preview_stream_ops * window)249 int set_preview_window(struct camera_device * device,
250 struct preview_stream_ops *window)
251 {
252 int rc = -1;
253 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
254
255 if(hardware != NULL) {
256 rc = hardware->setPreviewWindow(window);
257 }
258 return rc;
259 }
260
set_CallBacks(struct camera_device * device,camera_notify_callback notify_cb,camera_data_callback data_cb,camera_data_timestamp_callback data_cb_timestamp,camera_request_memory get_memory,void * user)261 void set_CallBacks(struct camera_device * device,
262 camera_notify_callback notify_cb,
263 camera_data_callback data_cb,
264 camera_data_timestamp_callback data_cb_timestamp,
265 camera_request_memory get_memory,
266 void *user)
267 {
268 LOGE("Q%s: E", __func__);
269 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
270 if(hardware != NULL){
271 hardware->setCallbacks(notify_cb,data_cb, data_cb_timestamp, get_memory, user);
272 }
273 }
274
enable_msg_type(struct camera_device * device,int32_t msg_type)275 void enable_msg_type(struct camera_device * device, int32_t msg_type)
276 {
277 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
278 if(hardware != NULL){
279 hardware->enableMsgType(msg_type);
280 }
281 }
282
disable_msg_type(struct camera_device * device,int32_t msg_type)283 void disable_msg_type(struct camera_device * device, int32_t msg_type)
284 {
285 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
286 LOGE("Q%s: E", __func__);
287 if(hardware != NULL){
288 hardware->disableMsgType(msg_type);
289 }
290 }
291
msg_type_enabled(struct camera_device * device,int32_t msg_type)292 int msg_type_enabled(struct camera_device * device, int32_t msg_type)
293 {
294 LOGE("Q%s: E", __func__);
295 int rc = -1;
296 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
297 if(hardware != NULL){
298 rc = hardware->msgTypeEnabled(msg_type);
299 }
300 return rc;
301 }
302
start_preview(struct camera_device * device)303 int start_preview(struct camera_device * device)
304 {
305 LOGE("Q%s: E", __func__);
306 int rc = -1;
307 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
308 if(hardware != NULL){
309 rc = hardware->startPreview( );
310 }
311 LOGE("Q%s: X", __func__);
312 return rc;
313 }
314
stop_preview(struct camera_device * device)315 void stop_preview(struct camera_device * device)
316 {
317 LOGE("Q%s: E", __func__);
318 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
319 if(hardware != NULL){
320 hardware->stopPreview( );
321 }
322 }
323
preview_enabled(struct camera_device * device)324 int preview_enabled(struct camera_device * device)
325 {
326 LOGE("Q%s: E", __func__);
327 int rc = -1;
328 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
329 if(hardware != NULL){
330 rc = hardware->previewEnabled( );
331 }
332 return rc;
333 }
334
store_meta_data_in_buffers(struct camera_device * device,int enable)335 int store_meta_data_in_buffers(struct camera_device * device, int enable)
336 {
337 LOGE("Q%s: E", __func__);
338 int rc = -1;
339 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
340 if(hardware != NULL){
341 rc = hardware->storeMetaDataInBuffers(enable);
342 }
343 return rc;
344 }
345
start_recording(struct camera_device * device)346 int start_recording(struct camera_device * device)
347 {
348 LOGE("Q%s: E", __func__);
349 int rc = -1;
350 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
351 if(hardware != NULL){
352 rc = hardware->startRecording( );
353 }
354 return rc;
355 }
356
stop_recording(struct camera_device * device)357 void stop_recording(struct camera_device * device)
358 {
359 LOGE("Q%s: E", __func__);
360 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
361 if(hardware != NULL){
362 hardware->stopRecording( );
363 }
364 }
365
recording_enabled(struct camera_device * device)366 int recording_enabled(struct camera_device * device)
367 {
368 LOGE("Q%s: E", __func__);
369 int rc = -1;
370 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
371 if(hardware != NULL){
372 rc = hardware->recordingEnabled( );
373 }
374 return rc;
375 }
376
release_recording_frame(struct camera_device * device,const void * opaque)377 void release_recording_frame(struct camera_device * device,
378 const void *opaque)
379 {
380 LOGV("Q%s: E", __func__);
381 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
382 if(hardware != NULL){
383 hardware->releaseRecordingFrame(opaque);
384 }
385 }
386
auto_focus(struct camera_device * device)387 int auto_focus(struct camera_device * device)
388 {
389 LOGE("Q%s: E", __func__);
390 int rc = -1;
391 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
392 if(hardware != NULL){
393 rc = hardware->autoFocus( );
394 }
395 return rc;
396 }
397
cancel_auto_focus(struct camera_device * device)398 int cancel_auto_focus(struct camera_device * device)
399 {
400 LOGE("Q%s: E", __func__);
401 int rc = -1;
402 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
403 if(hardware != NULL){
404 rc = hardware->cancelAutoFocus( );
405 }
406 return rc;
407 }
408
take_picture(struct camera_device * device)409 int take_picture(struct camera_device * device)
410 {
411 LOGE("Q%s: E", __func__);
412 int rc = -1;
413 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
414 if(hardware != NULL){
415 rc = hardware->takePicture( );
416 }
417 return rc;
418 }
419
cancel_picture(struct camera_device * device)420 int cancel_picture(struct camera_device * device)
421
422 {
423 LOGE("Q%s: E", __func__);
424 int rc = -1;
425 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
426 if(hardware != NULL){
427 rc = hardware->cancelPicture( );
428 }
429 return rc;
430 }
431
set_parameters(struct camera_device * device,const char * parms)432 int set_parameters(struct camera_device * device, const char *parms)
433
434 {
435 LOGE("Q%s: E", __func__);
436 int rc = -1;
437 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
438 if(hardware != NULL && parms){
439 //CameraParameters param;// = util_get_HAL_parameter(device);
440 //String8 str = String8(parms);
441
442 //param.unflatten(str);
443 rc = hardware->setParameters(parms);
444 //rc = 0;
445 }
446 return rc;
447 }
448
get_parameters(struct camera_device * device)449 char* get_parameters(struct camera_device * device)
450 {
451 LOGE("Q%s: E", __func__);
452 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
453 if(hardware != NULL){
454 char *parms = NULL;
455 hardware->getParameters(&parms);
456 return parms;
457 }
458 return NULL;
459 }
460
put_parameters(struct camera_device * device,char * parm)461 void put_parameters(struct camera_device * device, char *parm)
462
463 {
464 LOGE("Q%s: E", __func__);
465 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
466 if(hardware != NULL){
467 hardware->putParameters(parm);
468 }
469 }
470
send_command(struct camera_device * device,int32_t cmd,int32_t arg1,int32_t arg2)471 int send_command(struct camera_device * device,
472 int32_t cmd, int32_t arg1, int32_t arg2)
473 {
474 LOGE("Q%s: E", __func__);
475 int rc = -1;
476 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
477 if(hardware != NULL){
478 rc = hardware->sendCommand( cmd, arg1, arg2);
479 }
480 return rc;
481 }
482
release(struct camera_device * device)483 void release(struct camera_device * device)
484 {
485 LOGE("Q%s: E", __func__);
486 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
487 if(hardware != NULL){
488 camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
489 hardware->release( );
490 camHal->camera_released = true;
491 }
492 }
493
dump(struct camera_device * device,int fd)494 int dump(struct camera_device * device, int fd)
495 {
496 LOGE("Q%s: E", __func__);
497 int rc = -1;
498 QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
499 if(hardware != NULL){
500 rc = hardware->dump( fd );
501 //rc = 0;
502 }
503 return rc;
504 }
505
506 }; // namespace android
507