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