parent
							
								
									ef93a715e1
								
							
						
					
					
						commit
						84560ccd55
					
				
				 31 changed files with 9193 additions and 0 deletions
			
			
		@ -0,0 +1,19 @@ | 
				
			|||||||
 | 
					Import('env', 'arch', 'messaging', 'common', 'gpucommon', 'visionipc', 'cereal') | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					libs = ['m', 'pthread', common, 'jpeg', 'json', cereal, 'OpenCL', messaging, 'czmq', 'zmq', 'capnp', 'kj', 'capnp_c', visionipc, gpucommon] | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if arch == "aarch64": | 
				
			||||||
 | 
					  libs += ['gsl', 'CB', 'adreno_utils', 'EGL', 'GLESv3', 'cutils', 'ui'] | 
				
			||||||
 | 
					  cameras = ['cameras/camera_qcom.c'] | 
				
			||||||
 | 
					else: | 
				
			||||||
 | 
					  libs += [] | 
				
			||||||
 | 
					  cameras = ['cameras/camera_frame_stream.cc'] | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					env.SharedLibrary('snapshot/visionipc', | 
				
			||||||
 | 
					  ["#selfdrive/common/visionipc.c", "#selfdrive/common/ipc.c"]) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					env.Program('camerad', [ | 
				
			||||||
 | 
					    'main.cc', | 
				
			||||||
 | 
					    'transforms/rgb_to_yuv.c', | 
				
			||||||
 | 
					    cameras, | 
				
			||||||
 | 
					  ], LIBS=libs) | 
				
			||||||
@ -0,0 +1,8 @@ | 
				
			|||||||
 | 
					#ifndef _SELFDRIVE_VISIOND_VISIOND_H_ | 
				
			||||||
 | 
					#define _SELFDRIVE_VISIOND_VISIOND_H_ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <inttypes.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct { uint8_t *y, *u, *v; } YUVBuf; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif  // _SELFDRIVE_VISIOND_VISIOND_H_
 | 
				
			||||||
@ -0,0 +1,47 @@ | 
				
			|||||||
 | 
					#ifndef CAMERA_COMMON_H | 
				
			||||||
 | 
					#define CAMERA_COMMON_H | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h> | 
				
			||||||
 | 
					#include <stdbool.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CAMERA_ID_IMX298 0 | 
				
			||||||
 | 
					#define CAMERA_ID_IMX179 1 | 
				
			||||||
 | 
					#define CAMERA_ID_S5K3P8SP 2 | 
				
			||||||
 | 
					#define CAMERA_ID_OV8865 3 | 
				
			||||||
 | 
					#define CAMERA_ID_IMX298_FLIPPED 4 | 
				
			||||||
 | 
					#define CAMERA_ID_OV10640 5 | 
				
			||||||
 | 
					#define CAMERA_ID_MAX 6 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus | 
				
			||||||
 | 
					extern "C" { | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct CameraInfo { | 
				
			||||||
 | 
					  const char* name; | 
				
			||||||
 | 
					  int frame_width, frame_height; | 
				
			||||||
 | 
					  int frame_stride; | 
				
			||||||
 | 
					  bool bayer; | 
				
			||||||
 | 
					  int bayer_flip; | 
				
			||||||
 | 
					  bool hdr; | 
				
			||||||
 | 
					} CameraInfo; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct FrameMetadata { | 
				
			||||||
 | 
					  uint32_t frame_id; | 
				
			||||||
 | 
					  uint64_t timestamp_eof; | 
				
			||||||
 | 
					  unsigned int frame_length; | 
				
			||||||
 | 
					  unsigned int integ_lines; | 
				
			||||||
 | 
					  unsigned int global_gain; | 
				
			||||||
 | 
					  unsigned int lens_pos; | 
				
			||||||
 | 
					  float lens_sag; | 
				
			||||||
 | 
					  float lens_err; | 
				
			||||||
 | 
					  float lens_true_pos; | 
				
			||||||
 | 
					  float gain_frac; | 
				
			||||||
 | 
					} FrameMetadata; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern CameraInfo cameras_supported[CAMERA_ID_MAX]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif | 
				
			||||||
@ -0,0 +1,166 @@ | 
				
			|||||||
 | 
					#include "camera_frame_stream.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string> | 
				
			||||||
 | 
					#include <unistd.h> | 
				
			||||||
 | 
					#include <vector> | 
				
			||||||
 | 
					#include <cassert> | 
				
			||||||
 | 
					#include <string.h> | 
				
			||||||
 | 
					#include <signal.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <libyuv.h> | 
				
			||||||
 | 
					#include <capnp/serialize.h> | 
				
			||||||
 | 
					#include "cereal/gen/cpp/log.capnp.h" | 
				
			||||||
 | 
					#include "messaging.hpp" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "common/util.h" | 
				
			||||||
 | 
					#include "common/timing.h" | 
				
			||||||
 | 
					#include "common/swaglog.h" | 
				
			||||||
 | 
					#include "buffering.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern "C" { | 
				
			||||||
 | 
					#include <libavcodec/avcodec.h> | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern volatile sig_atomic_t do_exit; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FRAME_WIDTH 1164 | 
				
			||||||
 | 
					#define FRAME_HEIGHT 874 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace { | 
				
			||||||
 | 
					void camera_open(CameraState *s, VisionBuf *camera_bufs, bool rear) { | 
				
			||||||
 | 
					  assert(camera_bufs); | 
				
			||||||
 | 
					  s->camera_bufs = camera_bufs; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void camera_close(CameraState *s) { | 
				
			||||||
 | 
					  tbuffer_stop(&s->camera_tb); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void camera_release_buffer(void *cookie, int buf_idx) { | 
				
			||||||
 | 
					  CameraState *s = static_cast<CameraState *>(cookie); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void camera_init(CameraState *s, int camera_id, unsigned int fps) { | 
				
			||||||
 | 
					  assert(camera_id < ARRAYSIZE(cameras_supported)); | 
				
			||||||
 | 
					  s->ci = cameras_supported[camera_id]; | 
				
			||||||
 | 
					  assert(s->ci.frame_width != 0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  s->frame_size = s->ci.frame_height * s->ci.frame_stride; | 
				
			||||||
 | 
					  s->fps = fps; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tbuffer_init2(&s->camera_tb, FRAME_BUF_COUNT, "frame", camera_release_buffer, s); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void run_frame_stream(DualCameraState *s) { | 
				
			||||||
 | 
					  int err; | 
				
			||||||
 | 
					  Context * context = Context::create(); | 
				
			||||||
 | 
					  SubSocket * recorder_sock = SubSocket::create(context, "frame"); | 
				
			||||||
 | 
					  assert(recorder_sock != NULL); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  CameraState *const rear_camera = &s->rear; | 
				
			||||||
 | 
					  auto *tb = &rear_camera->camera_tb; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (!do_exit) { | 
				
			||||||
 | 
					    Message * msg = recorder_sock->receive(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    auto amsg = kj::heapArray<capnp::word>((msg->getSize() / sizeof(capnp::word)) + 1); | 
				
			||||||
 | 
					    memcpy(amsg.begin(), msg->getData(), msg->getSize()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    capnp::FlatArrayMessageReader cmsg(amsg); | 
				
			||||||
 | 
					    cereal::Event::Reader event = cmsg.getRoot<cereal::Event>(); | 
				
			||||||
 | 
					    auto frame = event.getFrame(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const int buf_idx = tbuffer_select(tb); | 
				
			||||||
 | 
					    rear_camera->camera_bufs_metadata[buf_idx] = { | 
				
			||||||
 | 
					      .frame_id = frame.getFrameId(), | 
				
			||||||
 | 
					      .timestamp_eof = frame.getTimestampEof(), | 
				
			||||||
 | 
					      .frame_length = static_cast<unsigned>(frame.getFrameLength()), | 
				
			||||||
 | 
					      .integ_lines = static_cast<unsigned>(frame.getIntegLines()), | 
				
			||||||
 | 
					      .global_gain = static_cast<unsigned>(frame.getGlobalGain()), | 
				
			||||||
 | 
					    }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cl_command_queue q = rear_camera->camera_bufs[buf_idx].copy_q; | 
				
			||||||
 | 
					    cl_mem yuv_cl = rear_camera->camera_bufs[buf_idx].buf_cl; | 
				
			||||||
 | 
					    cl_event map_event; | 
				
			||||||
 | 
					    void *yuv_buf = (void *)clEnqueueMapBuffer(q, yuv_cl, CL_TRUE, | 
				
			||||||
 | 
					                                                CL_MAP_WRITE, 0, frame.getImage().size(), | 
				
			||||||
 | 
					                                                0, NULL, &map_event, &err); | 
				
			||||||
 | 
					    assert(err == 0); | 
				
			||||||
 | 
					    clWaitForEvents(1, &map_event); | 
				
			||||||
 | 
					    clReleaseEvent(map_event); | 
				
			||||||
 | 
					    memcpy(yuv_buf, frame.getImage().begin(), frame.getImage().size()); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    clEnqueueUnmapMemObject(q, yuv_cl, yuv_buf, 0, NULL, &map_event); | 
				
			||||||
 | 
					    clWaitForEvents(1, &map_event); | 
				
			||||||
 | 
					    clReleaseEvent(map_event); | 
				
			||||||
 | 
					    tbuffer_dispatch(tb, buf_idx); | 
				
			||||||
 | 
					    delete msg; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  delete recorder_sock; | 
				
			||||||
 | 
					  delete context; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}  // namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CameraInfo cameras_supported[CAMERA_ID_MAX] = { | 
				
			||||||
 | 
					  [CAMERA_ID_IMX298] = { | 
				
			||||||
 | 
					      .frame_width = FRAME_WIDTH, | 
				
			||||||
 | 
					      .frame_height = FRAME_HEIGHT, | 
				
			||||||
 | 
					      .frame_stride = FRAME_WIDTH*3, | 
				
			||||||
 | 
					      .bayer = false, | 
				
			||||||
 | 
					      .bayer_flip = false, | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  [CAMERA_ID_OV8865] = { | 
				
			||||||
 | 
					    .frame_width = 1632, | 
				
			||||||
 | 
					    .frame_height = 1224, | 
				
			||||||
 | 
					    .frame_stride = 2040, // seems right
 | 
				
			||||||
 | 
					    .bayer = false, | 
				
			||||||
 | 
					    .bayer_flip = 3, | 
				
			||||||
 | 
					    .hdr = false | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void cameras_init(DualCameraState *s) { | 
				
			||||||
 | 
					  memset(s, 0, sizeof(*s)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  camera_init(&s->rear, CAMERA_ID_IMX298, 20); | 
				
			||||||
 | 
					  s->rear.transform = (mat3){{ | 
				
			||||||
 | 
					    1.0,  0.0, 0.0, | 
				
			||||||
 | 
					    0.0, 1.0, 0.0, | 
				
			||||||
 | 
					    0.0,  0.0, 1.0, | 
				
			||||||
 | 
					  }}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  camera_init(&s->front, CAMERA_ID_OV8865, 10); | 
				
			||||||
 | 
					  s->front.transform = (mat3){{ | 
				
			||||||
 | 
					    1.0,  0.0, 0.0, | 
				
			||||||
 | 
					    0.0, 1.0, 0.0, | 
				
			||||||
 | 
					    0.0,  0.0, 1.0, | 
				
			||||||
 | 
					  }}; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void camera_autoexposure(CameraState *s, float grey_frac) {} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void cameras_open(DualCameraState *s, VisionBuf *camera_bufs_rear, | 
				
			||||||
 | 
					                  VisionBuf *camera_bufs_focus, VisionBuf *camera_bufs_stats, | 
				
			||||||
 | 
					                  VisionBuf *camera_bufs_front) { | 
				
			||||||
 | 
					  assert(camera_bufs_rear); | 
				
			||||||
 | 
					  assert(camera_bufs_front); | 
				
			||||||
 | 
					  int err; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // LOG("*** open front ***");
 | 
				
			||||||
 | 
					  camera_open(&s->front, camera_bufs_front, false); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // LOG("*** open rear ***");
 | 
				
			||||||
 | 
					  camera_open(&s->rear, camera_bufs_rear, true); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void cameras_close(DualCameraState *s) { | 
				
			||||||
 | 
					  camera_close(&s->rear); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void cameras_run(DualCameraState *s) { | 
				
			||||||
 | 
					  set_thread_name("frame_streaming"); | 
				
			||||||
 | 
					  run_frame_stream(s); | 
				
			||||||
 | 
					  cameras_close(s); | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,58 @@ | 
				
			|||||||
 | 
					#ifndef CAMERA_FRAME_STREAM_H | 
				
			||||||
 | 
					#define CAMERA_FRAME_STREAM_H | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdbool.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __APPLE__ | 
				
			||||||
 | 
					#include <OpenCL/cl.h> | 
				
			||||||
 | 
					#else | 
				
			||||||
 | 
					#include <CL/cl.h> | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "common/mat.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "buffering.h" | 
				
			||||||
 | 
					#include "common/visionbuf.h" | 
				
			||||||
 | 
					#include "camera_common.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FRAME_BUF_COUNT 16 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus | 
				
			||||||
 | 
					extern "C" { | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct CameraState { | 
				
			||||||
 | 
					  int camera_id; | 
				
			||||||
 | 
					  CameraInfo ci; | 
				
			||||||
 | 
					  int frame_size; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  VisionBuf *camera_bufs; | 
				
			||||||
 | 
					  FrameMetadata camera_bufs_metadata[FRAME_BUF_COUNT]; | 
				
			||||||
 | 
					  TBuffer camera_tb; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int fps; | 
				
			||||||
 | 
					  float digital_gain; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float cur_gain_frac; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mat3 transform; | 
				
			||||||
 | 
					} CameraState; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct DualCameraState { | 
				
			||||||
 | 
					  int ispif_fd; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  CameraState rear; | 
				
			||||||
 | 
					  CameraState front; | 
				
			||||||
 | 
					} DualCameraState; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void cameras_init(DualCameraState *s); | 
				
			||||||
 | 
					void cameras_open(DualCameraState *s, VisionBuf *camera_bufs_rear, VisionBuf *camera_bufs_focus, VisionBuf *camera_bufs_stats, VisionBuf *camera_bufs_front); | 
				
			||||||
 | 
					void cameras_run(DualCameraState *s); | 
				
			||||||
 | 
					void cameras_close(DualCameraState *s); | 
				
			||||||
 | 
					void camera_autoexposure(CameraState *s, float grey_frac); | 
				
			||||||
 | 
					#ifdef __cplusplus | 
				
			||||||
 | 
					}  // extern "C"
 | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif | 
				
			||||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						@ -0,0 +1,131 @@ | 
				
			|||||||
 | 
					#ifndef CAMERA_H | 
				
			||||||
 | 
					#define CAMERA_H | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h> | 
				
			||||||
 | 
					#include <stdbool.h> | 
				
			||||||
 | 
					#include <pthread.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "msmb_isp.h" | 
				
			||||||
 | 
					#include "msmb_ispif.h" | 
				
			||||||
 | 
					#include "msmb_camera.h" | 
				
			||||||
 | 
					#include "msm_cam_sensor.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "common/mat.h" | 
				
			||||||
 | 
					#include "common/visionbuf.h" | 
				
			||||||
 | 
					#include "common/buffering.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "camera_common.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FRAME_BUF_COUNT 4 | 
				
			||||||
 | 
					#define METADATA_BUF_COUNT 4 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DEVICE_OP3 0 | 
				
			||||||
 | 
					#define DEVICE_OP3T 1 | 
				
			||||||
 | 
					#define DEVICE_LP3 2 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NUM_FOCUS 8 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus | 
				
			||||||
 | 
					extern "C" { | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct CameraState CameraState; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef int (*camera_apply_exposure_func)(CameraState *s, int gain, int integ_lines, int frame_length); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct StreamState { | 
				
			||||||
 | 
					  struct msm_isp_buf_request buf_request; | 
				
			||||||
 | 
					  struct msm_vfe_axi_stream_request_cmd stream_req; | 
				
			||||||
 | 
					  struct msm_isp_qbuf_info qbuf_info[FRAME_BUF_COUNT]; | 
				
			||||||
 | 
					  VisionBuf *bufs; | 
				
			||||||
 | 
					} StreamState; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct CameraState { | 
				
			||||||
 | 
					  int camera_num; | 
				
			||||||
 | 
					  int camera_id; | 
				
			||||||
 | 
					  CameraInfo ci; | 
				
			||||||
 | 
					  int frame_size; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int device; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void* ops_sock; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint32_t pixel_clock; | 
				
			||||||
 | 
					  uint32_t line_length_pclk; | 
				
			||||||
 | 
					  unsigned int max_gain; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int csid_fd; | 
				
			||||||
 | 
					  int csiphy_fd; | 
				
			||||||
 | 
					  int sensor_fd; | 
				
			||||||
 | 
					  int isp_fd; | 
				
			||||||
 | 
					  int eeprom_fd; | 
				
			||||||
 | 
					  // rear only
 | 
				
			||||||
 | 
					  int ois_fd, actuator_fd; | 
				
			||||||
 | 
					  uint16_t infinity_dac; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  struct msm_vfe_axi_stream_cfg_cmd stream_cfg; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  size_t eeprom_size; | 
				
			||||||
 | 
					  uint8_t *eeprom; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // uint32_t camera_bufs_ids[FRAME_BUF_COUNT];
 | 
				
			||||||
 | 
					  FrameMetadata camera_bufs_metadata[FRAME_BUF_COUNT]; | 
				
			||||||
 | 
					  TBuffer camera_tb; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pthread_mutex_t frame_info_lock; | 
				
			||||||
 | 
					  FrameMetadata frame_metadata[METADATA_BUF_COUNT]; | 
				
			||||||
 | 
					  int frame_metadata_idx; | 
				
			||||||
 | 
					  float cur_exposure_frac; | 
				
			||||||
 | 
					  float cur_gain_frac; | 
				
			||||||
 | 
					  int cur_gain; | 
				
			||||||
 | 
					  int cur_frame_length; | 
				
			||||||
 | 
					  int cur_integ_lines; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float digital_gain; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  StreamState ss[3]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint64_t last_t; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  camera_apply_exposure_func apply_exposure; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int16_t focus[NUM_FOCUS]; | 
				
			||||||
 | 
					  uint8_t confidence[NUM_FOCUS]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  float focus_err; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint16_t cur_step_pos; | 
				
			||||||
 | 
					  uint16_t cur_lens_pos; | 
				
			||||||
 | 
					  uint64_t last_sag_ts; | 
				
			||||||
 | 
					  float last_sag_acc_z; | 
				
			||||||
 | 
					  float lens_true_pos; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int fps; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mat3 transform; | 
				
			||||||
 | 
					} CameraState; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct DualCameraState { | 
				
			||||||
 | 
					  int device; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int ispif_fd; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  CameraState rear; | 
				
			||||||
 | 
					  CameraState front; | 
				
			||||||
 | 
					} DualCameraState; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void cameras_init(DualCameraState *s); | 
				
			||||||
 | 
					void cameras_open(DualCameraState *s, VisionBuf *camera_bufs_rear, VisionBuf *camera_bufs_focus, VisionBuf *camera_bufs_stats, VisionBuf *camera_bufs_front); | 
				
			||||||
 | 
					void cameras_run(DualCameraState *s); | 
				
			||||||
 | 
					void cameras_close(DualCameraState *s); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void camera_autoexposure(CameraState *s, float grey_frac); | 
				
			||||||
 | 
					void actuator_move(CameraState *s, uint16_t target); | 
				
			||||||
 | 
					int sensor_write_regs(CameraState *s, struct msm_camera_i2c_reg_array* arr, size_t size, int data_type); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus | 
				
			||||||
 | 
					}  // extern "C"
 | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif | 
				
			||||||
@ -0,0 +1,130 @@ | 
				
			|||||||
 | 
					const __constant float3 color_correction[3] = { | 
				
			||||||
 | 
					  // Matrix from WBraw -> sRGBD65 (normalized) | 
				
			||||||
 | 
					  (float3)( 1.62393627, -0.2092988,  0.00119886), | 
				
			||||||
 | 
					  (float3)(-0.45734315,  1.5534676, -0.59296798), | 
				
			||||||
 | 
					  (float3)(-0.16659312, -0.3441688,  1.59176912), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float3 color_correct(float3 x) { | 
				
			||||||
 | 
					  float3 ret = (0,0,0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // white balance of daylight | 
				
			||||||
 | 
					  x /= (float3)(0.4609375, 1.0, 0.546875); | 
				
			||||||
 | 
					  x = max(0.0, min(1.0, x)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // fix up the colors | 
				
			||||||
 | 
					  ret += x.x * color_correction[0]; | 
				
			||||||
 | 
					  ret += x.y * color_correction[1]; | 
				
			||||||
 | 
					  ret += x.z * color_correction[2]; | 
				
			||||||
 | 
					  return ret; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float3 srgb_gamma(float3 p) { | 
				
			||||||
 | 
					  // go all out and add an sRGB gamma curve | 
				
			||||||
 | 
					  const float3 ph = (1.0f + 0.055f)*pow(p, 1/2.4f) - 0.055f; | 
				
			||||||
 | 
						const float3 pl = p*12.92f; | 
				
			||||||
 | 
						return select(ph, pl, islessequal(p, 0.0031308f)); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__constant int dpcm_lookup[512] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, 935, 951, 967, 983, 999, 1015, 1031, 1047, 1063, 1079, 1095, 1111, 1127, 1143, 1159, 1175, 1191, 1207, 1223, 1239, 1255, 1271, 1287, 1303, 1319, 1335, 1351, 1367, 1383, 1399, 1415, 1431, -935, -951, -967, -983, -999, -1015, -1031, -1047, -1063, -1079, -1095, -1111, -1127, -1143, -1159, -1175, -1191, -1207, -1223, -1239, -1255, -1271, -1287, -1303, -1319, -1335, -1351, -1367, -1383, -1399, -1415, -1431, 419, 427, 435, 443, 451, 459, 467, 475, 483, 491, 499, 507, 515, 523, 531, 539, 547, 555, 563, 571, 579, 587, 595, 603, 611, 619, 627, 635, 643, 651, 659, 667, 675, 683, 691, 699, 707, 715, 723, 731, 739, 747, 755, 763, 771, 779, 787, 795, 803, 811, 819, 827, 835, 843, 851, 859, 867, 875, 883, 891, 899, 907, 915, 923, -419, -427, -435, -443, -451, -459, -467, -475, -483, -491, -499, -507, -515, -523, -531, -539, -547, -555, -563, -571, -579, -587, -595, -603, -611, -619, -627, -635, -643, -651, -659, -667, -675, -683, -691, -699, -707, -715, -723, -731, -739, -747, -755, -763, -771, -779, -787, -795, -803, -811, -819, -827, -835, -843, -851, -859, -867, -875, -883, -891, -899, -907, -915, -923, 161, 165, 169, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 233, 237, 241, 245, 249, 253, 257, 261, 265, 269, 273, 277, 281, 285, 289, 293, 297, 301, 305, 309, 313, 317, 321, 325, 329, 333, 337, 341, 345, 349, 353, 357, 361, 365, 369, 373, 377, 381, 385, 389, 393, 397, 401, 405, 409, 413, -161, -165, -169, -173, -177, -181, -185, -189, -193, -197, -201, -205, -209, -213, -217, -221, -225, -229, -233, -237, -241, -245, -249, -253, -257, -261, -265, -269, -273, -277, -281, -285, -289, -293, -297, -301, -305, -309, -313, -317, -321, -325, -329, -333, -337, -341, -345, -349, -353, -357, -361, -365, -369, -373, -377, -381, -385, -389, -393, -397, -401, -405, -409, -413, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, -32, -34, -36, -38, -40, -42, -44, -46, -48, -50, -52, -54, -56, -58, -60, -62, -64, -66, -68, -70, -72, -74, -76, -78, -80, -82, -84, -86, -88, -90, -92, -94, -96, -98, -100, -102, -104, -106, -108, -110, -112, -114, -116, -118, -120, -122, -124, -126, -128, -130, -132, -134, -136, -138, -140, -142, -144, -146, -148, -150, -152, -154, -156, -158}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint4 decompress(uint4 p, uint4 pl) { | 
				
			||||||
 | 
					  uint4 r1 = (pl + (uint4)(dpcm_lookup[p.s0], dpcm_lookup[p.s1], dpcm_lookup[p.s2], dpcm_lookup[p.s3])); | 
				
			||||||
 | 
					  uint4 r2 = ((p-0x200)<<5) | 0xF; | 
				
			||||||
 | 
					  r2 += select((uint4)(0,0,0,0), (uint4)(1,1,1,1), r2 <= pl); | 
				
			||||||
 | 
					  return select(r2, r1, p < 0x200); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__kernel void debayer10(__global uchar const * const in, | 
				
			||||||
 | 
					                        __global uchar * out, float digital_gain) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					  const int oy = get_global_id(0); | 
				
			||||||
 | 
					  if (oy >= RGB_HEIGHT) return; | 
				
			||||||
 | 
					  const int iy = oy * 2; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint4 pint_last; | 
				
			||||||
 | 
					  for (int ox = 0; ox < RGB_WIDTH; ox += 2) { | 
				
			||||||
 | 
					    const int ix = (ox/2) * 5; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO: why doesn't this work for the frontview | 
				
			||||||
 | 
					    /*const uchar8 v1 = vload8(0, &in[iy * FRAME_STRIDE + ix]); | 
				
			||||||
 | 
					    const uchar ex1 = v1.s4; | 
				
			||||||
 | 
					    const uchar8 v2 = vload8(0, &in[(iy+1) * FRAME_STRIDE + ix]); | 
				
			||||||
 | 
					    const uchar ex2 = v2.s4;*/ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const uchar4 v1 = vload4(0, &in[iy * FRAME_STRIDE + ix]); | 
				
			||||||
 | 
					    const uchar ex1 = in[iy * FRAME_STRIDE + ix + 4]; | 
				
			||||||
 | 
					    const uchar4 v2 = vload4(0, &in[(iy+1) * FRAME_STRIDE + ix]); | 
				
			||||||
 | 
					    const uchar ex2 = in[(iy+1) * FRAME_STRIDE + ix + 4]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint4 pinta[2]; | 
				
			||||||
 | 
					    pinta[0] = (uint4)( | 
				
			||||||
 | 
					      (((uint)v1.s0 << 2) + ( (ex1 >> 0) & 3)), | 
				
			||||||
 | 
					      (((uint)v1.s1 << 2) + ( (ex1 >> 2) & 3)), | 
				
			||||||
 | 
					      (((uint)v2.s0 << 2) + ( (ex2 >> 0) & 3)), | 
				
			||||||
 | 
					      (((uint)v2.s1 << 2) + ( (ex2 >> 2) & 3))); | 
				
			||||||
 | 
					    pinta[1] = (uint4)( | 
				
			||||||
 | 
					      (((uint)v1.s2 << 2) + ( (ex1 >> 4) & 3)), | 
				
			||||||
 | 
					      (((uint)v1.s3 << 2) + ( (ex1 >> 6) & 3)), | 
				
			||||||
 | 
					      (((uint)v2.s2 << 2) + ( (ex2 >> 4) & 3)), | 
				
			||||||
 | 
					      (((uint)v2.s3 << 2) + ( (ex2 >> 6) & 3))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #pragma unroll | 
				
			||||||
 | 
					    for (uint px = 0; px < 2; px++) { | 
				
			||||||
 | 
					      uint4 pint = pinta[px]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if HDR | 
				
			||||||
 | 
					      // decompress HDR | 
				
			||||||
 | 
					      pint = (ox == 0 && px == 0) ? ((pint<<4) | 8) : decompress(pint, pint_last); | 
				
			||||||
 | 
					      pint_last = pint; | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      float4 p = convert_float4(pint); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // 64 is the black level of the sensor, remove | 
				
			||||||
 | 
					      // (changed to 56 for HDR) | 
				
			||||||
 | 
					      const float black_level = 56.0f; | 
				
			||||||
 | 
					      p = (p - black_level); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // correct vignetting (no pow function?) | 
				
			||||||
 | 
					      // see https://www.eecis.udel.edu/~jye/lab_research/09/JiUp.pdf the A (4th order) | 
				
			||||||
 | 
					      const float r = ((oy - RGB_HEIGHT/2)*(oy - RGB_HEIGHT/2) + (ox - RGB_WIDTH/2)*(ox - RGB_WIDTH/2)); | 
				
			||||||
 | 
					      const float fake_f = 700.0f;    // should be 910, but this fits... | 
				
			||||||
 | 
					      const float lil_a = (1.0f + r/(fake_f*fake_f)); | 
				
			||||||
 | 
					      p = p * lil_a * lil_a; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // rescale to 1.0 | 
				
			||||||
 | 
					#if HDR | 
				
			||||||
 | 
					      p /= (16384.0f-black_level); | 
				
			||||||
 | 
					#else | 
				
			||||||
 | 
					      p /= (1024.0f-black_level); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // digital gain | 
				
			||||||
 | 
					      p *= digital_gain; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // use both green channels | 
				
			||||||
 | 
					#if BAYER_FLIP == 3 | 
				
			||||||
 | 
					      float3 c1 = (float3)(p.s3, (p.s1+p.s2)/2.0f, p.s0); | 
				
			||||||
 | 
					#elif BAYER_FLIP == 2 | 
				
			||||||
 | 
					      float3 c1 = (float3)(p.s2, (p.s0+p.s3)/2.0f, p.s1); | 
				
			||||||
 | 
					#elif BAYER_FLIP == 1 | 
				
			||||||
 | 
					      float3 c1 = (float3)(p.s1, (p.s0+p.s3)/2.0f, p.s2); | 
				
			||||||
 | 
					#elif BAYER_FLIP == 0 | 
				
			||||||
 | 
					      float3 c1 = (float3)(p.s0, (p.s1+p.s2)/2.0f, p.s3); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // color correction | 
				
			||||||
 | 
					      c1 = color_correct(c1); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if HDR | 
				
			||||||
 | 
					      // srgb gamma isn't right for YUV, so it's disabled for now | 
				
			||||||
 | 
					      c1 = srgb_gamma(c1); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // output BGR | 
				
			||||||
 | 
					      const int ooff = oy * RGB_STRIDE/3 + ox; | 
				
			||||||
 | 
					      vstore3(convert_uchar3_sat(c1.zyx * 255.0f), ooff+px, out); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
									
										
											File diff suppressed because one or more lines are too long
										
									
								
							
						@ -0,0 +1,829 @@ | 
				
			|||||||
 | 
					#ifndef __LINUX_MSM_CAM_SENSOR_H | 
				
			||||||
 | 
					#define __LINUX_MSM_CAM_SENSOR_H | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef MSM_CAMERA_BIONIC | 
				
			||||||
 | 
					#include <sys/types.h> | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//#include <linux/v4l2-mediabus.h>
 | 
				
			||||||
 | 
					#include "msm_camsensor_sdk.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/types.h> | 
				
			||||||
 | 
					#include <linux/i2c.h> | 
				
			||||||
 | 
					#ifdef CONFIG_COMPAT | 
				
			||||||
 | 
					#include <linux/compat.h> | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define I2C_SEQ_REG_SETTING_MAX   5 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_SENSOR_MCLK_8HZ   8000000 | 
				
			||||||
 | 
					#define MSM_SENSOR_MCLK_16HZ  16000000 | 
				
			||||||
 | 
					#define MSM_SENSOR_MCLK_24HZ  24000000 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_SENSOR_NAME 32 | 
				
			||||||
 | 
					#define MAX_ACTUATOR_AF_TOTAL_STEPS 1024 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_OIS_MOD_NAME_SIZE 32 | 
				
			||||||
 | 
					#define MAX_OIS_NAME_SIZE 32 | 
				
			||||||
 | 
					#define MAX_OIS_REG_SETTINGS 800 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MOVE_NEAR 0 | 
				
			||||||
 | 
					#define MOVE_FAR  1 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_ACTUATOR_MOVE_SIGNED_FAR -1 | 
				
			||||||
 | 
					#define MSM_ACTUATOR_MOVE_SIGNED_NEAR  1 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_ACTUATOR_REGION  5 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_EEPROM_NAME 32 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_AF_ITERATIONS 3 | 
				
			||||||
 | 
					#define MAX_NUMBER_OF_STEPS 47 | 
				
			||||||
 | 
					#define MAX_REGULATOR 5 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_META v4l2_fourcc('M', 'E', 'T', 'A') /* META */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_SBGGR14 v4l2_fourcc('B', 'G', '1', '4') | 
				
			||||||
 | 
						/* 14  BGBG.. GRGR.. */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_SGBRG14 v4l2_fourcc('G', 'B', '1', '4') | 
				
			||||||
 | 
						/* 14  GBGB.. RGRG.. */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_SGRBG14 v4l2_fourcc('B', 'A', '1', '4') | 
				
			||||||
 | 
						/* 14  GRGR.. BGBG.. */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_SRGGB14 v4l2_fourcc('R', 'G', '1', '4') | 
				
			||||||
 | 
						/* 14  RGRG.. GBGB.. */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum flash_type { | 
				
			||||||
 | 
						LED_FLASH = 1, | 
				
			||||||
 | 
						STROBE_FLASH, | 
				
			||||||
 | 
						GPIO_FLASH | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_sensor_resolution_t { | 
				
			||||||
 | 
						MSM_SENSOR_RES_FULL, | 
				
			||||||
 | 
						MSM_SENSOR_RES_QTR, | 
				
			||||||
 | 
						MSM_SENSOR_RES_2, | 
				
			||||||
 | 
						MSM_SENSOR_RES_3, | 
				
			||||||
 | 
						MSM_SENSOR_RES_4, | 
				
			||||||
 | 
						MSM_SENSOR_RES_5, | 
				
			||||||
 | 
						MSM_SENSOR_RES_6, | 
				
			||||||
 | 
						MSM_SENSOR_RES_7, | 
				
			||||||
 | 
						MSM_SENSOR_INVALID_RES, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_camera_stream_type_t { | 
				
			||||||
 | 
						MSM_CAMERA_STREAM_PREVIEW, | 
				
			||||||
 | 
						MSM_CAMERA_STREAM_SNAPSHOT, | 
				
			||||||
 | 
						MSM_CAMERA_STREAM_VIDEO, | 
				
			||||||
 | 
						MSM_CAMERA_STREAM_INVALID, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum sensor_sub_module_t { | 
				
			||||||
 | 
						SUB_MODULE_SENSOR, | 
				
			||||||
 | 
						SUB_MODULE_CHROMATIX, | 
				
			||||||
 | 
						SUB_MODULE_ACTUATOR, | 
				
			||||||
 | 
						SUB_MODULE_EEPROM, | 
				
			||||||
 | 
						SUB_MODULE_LED_FLASH, | 
				
			||||||
 | 
						SUB_MODULE_STROBE_FLASH, | 
				
			||||||
 | 
						SUB_MODULE_CSID, | 
				
			||||||
 | 
						SUB_MODULE_CSID_3D, | 
				
			||||||
 | 
						SUB_MODULE_CSIPHY, | 
				
			||||||
 | 
						SUB_MODULE_CSIPHY_3D, | 
				
			||||||
 | 
						SUB_MODULE_OIS, | 
				
			||||||
 | 
						SUB_MODULE_EXT, | 
				
			||||||
 | 
						SUB_MODULE_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum { | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_OFF, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_MONO, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_NEGATIVE, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_SOLARIZE, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_SEPIA, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_POSTERIZE, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_WHITEBOARD, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_BLACKBOARD, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_AQUA, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_EMBOSS, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_SKETCH, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_NEON, | 
				
			||||||
 | 
						MSM_CAMERA_EFFECT_MODE_MAX | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum { | 
				
			||||||
 | 
						MSM_CAMERA_WB_MODE_AUTO, | 
				
			||||||
 | 
						MSM_CAMERA_WB_MODE_CUSTOM, | 
				
			||||||
 | 
						MSM_CAMERA_WB_MODE_INCANDESCENT, | 
				
			||||||
 | 
						MSM_CAMERA_WB_MODE_FLUORESCENT, | 
				
			||||||
 | 
						MSM_CAMERA_WB_MODE_WARM_FLUORESCENT, | 
				
			||||||
 | 
						MSM_CAMERA_WB_MODE_DAYLIGHT, | 
				
			||||||
 | 
						MSM_CAMERA_WB_MODE_CLOUDY_DAYLIGHT, | 
				
			||||||
 | 
						MSM_CAMERA_WB_MODE_TWILIGHT, | 
				
			||||||
 | 
						MSM_CAMERA_WB_MODE_SHADE, | 
				
			||||||
 | 
						MSM_CAMERA_WB_MODE_OFF, | 
				
			||||||
 | 
						MSM_CAMERA_WB_MODE_MAX | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum { | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_OFF, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_AUTO, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_LANDSCAPE, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_SNOW, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_BEACH, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_SUNSET, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_NIGHT, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_PORTRAIT, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_BACKLIGHT, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_SPORTS, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_ANTISHAKE, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_FLOWERS, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_CANDLELIGHT, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_FIREWORKS, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_PARTY, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_NIGHT_PORTRAIT, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_THEATRE, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_ACTION, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_AR, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_FACE_PRIORITY, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_BARCODE, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_HDR, | 
				
			||||||
 | 
						MSM_CAMERA_SCENE_MODE_MAX | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum csid_cfg_type_t { | 
				
			||||||
 | 
						CSID_INIT, | 
				
			||||||
 | 
						CSID_CFG, | 
				
			||||||
 | 
						CSID_TESTMODE_CFG, | 
				
			||||||
 | 
						CSID_RELEASE, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum csiphy_cfg_type_t { | 
				
			||||||
 | 
						CSIPHY_INIT, | 
				
			||||||
 | 
						CSIPHY_CFG, | 
				
			||||||
 | 
						CSIPHY_RELEASE, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum camera_vreg_type { | 
				
			||||||
 | 
						VREG_TYPE_DEFAULT, | 
				
			||||||
 | 
						VREG_TYPE_CUSTOM, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum sensor_af_t { | 
				
			||||||
 | 
						SENSOR_AF_FOCUSSED, | 
				
			||||||
 | 
						SENSOR_AF_NOT_FOCUSSED, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum cci_i2c_master_t { | 
				
			||||||
 | 
						MASTER_0, | 
				
			||||||
 | 
						MASTER_1, | 
				
			||||||
 | 
						MASTER_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_i2c_array_write_config { | 
				
			||||||
 | 
						struct msm_camera_i2c_reg_setting conf_array; | 
				
			||||||
 | 
						uint16_t slave_addr; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_i2c_read_config { | 
				
			||||||
 | 
						uint16_t slave_addr; | 
				
			||||||
 | 
						uint16_t reg_addr; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type addr_type; | 
				
			||||||
 | 
						enum msm_camera_i2c_data_type data_type; | 
				
			||||||
 | 
						uint16_t data; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_csi2_params { | 
				
			||||||
 | 
						struct msm_camera_csid_params csid_params; | 
				
			||||||
 | 
						struct msm_camera_csiphy_params csiphy_params; | 
				
			||||||
 | 
						uint8_t csi_clk_scale_enable; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_csi_lane_params { | 
				
			||||||
 | 
						uint16_t csi_lane_assign; | 
				
			||||||
 | 
						uint16_t csi_lane_mask; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct csi_lane_params_t { | 
				
			||||||
 | 
						uint16_t csi_lane_assign; | 
				
			||||||
 | 
						uint8_t csi_lane_mask; | 
				
			||||||
 | 
						uint8_t csi_if; | 
				
			||||||
 | 
						int8_t csid_core[2]; | 
				
			||||||
 | 
						uint8_t csi_phy_sel; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_sensor_info_t { | 
				
			||||||
 | 
						char     sensor_name[MAX_SENSOR_NAME]; | 
				
			||||||
 | 
						uint32_t session_id; | 
				
			||||||
 | 
						int32_t  subdev_id[SUB_MODULE_MAX]; | 
				
			||||||
 | 
						int32_t  subdev_intf[SUB_MODULE_MAX]; | 
				
			||||||
 | 
						uint8_t  is_mount_angle_valid; | 
				
			||||||
 | 
						uint32_t sensor_mount_angle; | 
				
			||||||
 | 
						int modes_supported; | 
				
			||||||
 | 
						enum camb_position_t position; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct camera_vreg_t { | 
				
			||||||
 | 
						const char *reg_name; | 
				
			||||||
 | 
						int min_voltage; | 
				
			||||||
 | 
						int max_voltage; | 
				
			||||||
 | 
						int op_mode; | 
				
			||||||
 | 
						uint32_t delay; | 
				
			||||||
 | 
						const char *custom_vreg_name; | 
				
			||||||
 | 
						enum camera_vreg_type type; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sensorb_cfg_data { | 
				
			||||||
 | 
						int cfgtype; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							struct msm_sensor_info_t      sensor_info; | 
				
			||||||
 | 
							struct msm_sensor_init_params sensor_init_params; | 
				
			||||||
 | 
							void                         *setting; | 
				
			||||||
 | 
							struct msm_sensor_i2c_sync_params sensor_i2c_sync_params; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct csid_cfg_data { | 
				
			||||||
 | 
						enum csid_cfg_type_t cfgtype; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							uint32_t csid_version; | 
				
			||||||
 | 
							struct msm_camera_csid_params *csid_params; | 
				
			||||||
 | 
							struct msm_camera_csid_testmode_parms *csid_testmode_params; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct csiphy_cfg_data { | 
				
			||||||
 | 
						enum csiphy_cfg_type_t cfgtype; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							struct msm_camera_csiphy_params *csiphy_params; | 
				
			||||||
 | 
							struct msm_camera_csi_lane_params *csi_lane_params; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum eeprom_cfg_type_t { | 
				
			||||||
 | 
						CFG_EEPROM_GET_INFO, | 
				
			||||||
 | 
						CFG_EEPROM_GET_CAL_DATA, | 
				
			||||||
 | 
						CFG_EEPROM_READ_CAL_DATA, | 
				
			||||||
 | 
						CFG_EEPROM_WRITE_DATA, | 
				
			||||||
 | 
						CFG_EEPROM_GET_MM_INFO, | 
				
			||||||
 | 
						CFG_EEPROM_INIT, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct eeprom_get_t { | 
				
			||||||
 | 
						uint32_t num_bytes; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct eeprom_read_t { | 
				
			||||||
 | 
						uint8_t *dbuffer; | 
				
			||||||
 | 
						uint32_t num_bytes; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct eeprom_write_t { | 
				
			||||||
 | 
						uint8_t *dbuffer; | 
				
			||||||
 | 
						uint32_t num_bytes; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct eeprom_get_cmm_t { | 
				
			||||||
 | 
						uint32_t cmm_support; | 
				
			||||||
 | 
						uint32_t cmm_compression; | 
				
			||||||
 | 
						uint32_t cmm_size; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_eeprom_info_t { | 
				
			||||||
 | 
						struct msm_sensor_power_setting_array *power_setting_array; | 
				
			||||||
 | 
						enum i2c_freq_mode_t i2c_freq_mode; | 
				
			||||||
 | 
						struct msm_eeprom_memory_map_array *mem_map_array; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_eeprom_cfg_data { | 
				
			||||||
 | 
						enum eeprom_cfg_type_t cfgtype; | 
				
			||||||
 | 
						uint8_t is_supported; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							char eeprom_name[MAX_SENSOR_NAME]; | 
				
			||||||
 | 
							struct eeprom_get_t get_data; | 
				
			||||||
 | 
							struct eeprom_read_t read_data; | 
				
			||||||
 | 
							struct eeprom_write_t write_data; | 
				
			||||||
 | 
							struct eeprom_get_cmm_t get_cmm_data; | 
				
			||||||
 | 
							struct msm_eeprom_info_t eeprom_info; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_COMPAT | 
				
			||||||
 | 
					struct msm_sensor_power_setting32 { | 
				
			||||||
 | 
						enum msm_sensor_power_seq_type_t seq_type; | 
				
			||||||
 | 
						uint16_t seq_val; | 
				
			||||||
 | 
						compat_uint_t config_val; | 
				
			||||||
 | 
						uint16_t delay; | 
				
			||||||
 | 
						compat_uptr_t data[10]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_sensor_power_setting_array32 { | 
				
			||||||
 | 
						struct msm_sensor_power_setting32 power_setting_a[MAX_POWER_CONFIG]; | 
				
			||||||
 | 
						compat_uptr_t power_setting; | 
				
			||||||
 | 
						uint16_t size; | 
				
			||||||
 | 
						struct msm_sensor_power_setting32 | 
				
			||||||
 | 
							power_down_setting_a[MAX_POWER_CONFIG]; | 
				
			||||||
 | 
						compat_uptr_t power_down_setting; | 
				
			||||||
 | 
						uint16_t size_down; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_sensor_slave_info32 { | 
				
			||||||
 | 
						char sensor_name[32]; | 
				
			||||||
 | 
						char eeprom_name[32]; | 
				
			||||||
 | 
						char actuator_name[32]; | 
				
			||||||
 | 
						char ois_name[32]; | 
				
			||||||
 | 
						char flash_name[32]; | 
				
			||||||
 | 
						enum msm_sensor_camera_id_t camera_id; | 
				
			||||||
 | 
						uint16_t slave_addr; | 
				
			||||||
 | 
						enum i2c_freq_mode_t i2c_freq_mode; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type addr_type; | 
				
			||||||
 | 
						struct msm_sensor_id_info_t sensor_id_info; | 
				
			||||||
 | 
						struct msm_sensor_power_setting_array32 power_setting_array; | 
				
			||||||
 | 
						uint8_t  is_init_params_valid; | 
				
			||||||
 | 
						struct msm_sensor_init_params sensor_init_params; | 
				
			||||||
 | 
						enum msm_sensor_output_format_t output_format; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_csid_lut_params32 { | 
				
			||||||
 | 
						uint8_t num_cid; | 
				
			||||||
 | 
						struct msm_camera_csid_vc_cfg vc_cfg_a[MAX_CID]; | 
				
			||||||
 | 
						compat_uptr_t vc_cfg[MAX_CID]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_csid_params32 { | 
				
			||||||
 | 
						uint8_t lane_cnt; | 
				
			||||||
 | 
						uint16_t lane_assign; | 
				
			||||||
 | 
						uint8_t phy_sel; | 
				
			||||||
 | 
						uint32_t csi_clk; | 
				
			||||||
 | 
						struct msm_camera_csid_lut_params32 lut_params; | 
				
			||||||
 | 
						uint8_t csi_3p_sel; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_csi2_params32 { | 
				
			||||||
 | 
						struct msm_camera_csid_params32 csid_params; | 
				
			||||||
 | 
						struct msm_camera_csiphy_params csiphy_params; | 
				
			||||||
 | 
						uint8_t csi_clk_scale_enable; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct csid_cfg_data32 { | 
				
			||||||
 | 
						enum csid_cfg_type_t cfgtype; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							uint32_t csid_version; | 
				
			||||||
 | 
							compat_uptr_t csid_params; | 
				
			||||||
 | 
							compat_uptr_t csid_testmode_params; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct eeprom_read_t32 { | 
				
			||||||
 | 
						compat_uptr_t dbuffer; | 
				
			||||||
 | 
						uint32_t num_bytes; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct eeprom_write_t32 { | 
				
			||||||
 | 
						compat_uptr_t dbuffer; | 
				
			||||||
 | 
						uint32_t num_bytes; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_eeprom_info_t32 { | 
				
			||||||
 | 
						compat_uptr_t power_setting_array; | 
				
			||||||
 | 
						enum i2c_freq_mode_t i2c_freq_mode; | 
				
			||||||
 | 
						compat_uptr_t mem_map_array; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_eeprom_cfg_data32 { | 
				
			||||||
 | 
						enum eeprom_cfg_type_t cfgtype; | 
				
			||||||
 | 
						uint8_t is_supported; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							char eeprom_name[MAX_SENSOR_NAME]; | 
				
			||||||
 | 
							struct eeprom_get_t get_data; | 
				
			||||||
 | 
							struct eeprom_read_t32 read_data; | 
				
			||||||
 | 
							struct eeprom_write_t32 write_data; | 
				
			||||||
 | 
							struct msm_eeprom_info_t32 eeprom_info; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_i2c_seq_reg_setting32 { | 
				
			||||||
 | 
						compat_uptr_t reg_setting; | 
				
			||||||
 | 
						uint16_t size; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type addr_type; | 
				
			||||||
 | 
						uint16_t delay; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_sensor_cfg_type_t { | 
				
			||||||
 | 
						CFG_SET_SLAVE_INFO, | 
				
			||||||
 | 
						CFG_SLAVE_READ_I2C, | 
				
			||||||
 | 
						CFG_WRITE_I2C_ARRAY, | 
				
			||||||
 | 
						CFG_SLAVE_WRITE_I2C_ARRAY, | 
				
			||||||
 | 
						CFG_WRITE_I2C_SEQ_ARRAY, | 
				
			||||||
 | 
						CFG_POWER_UP, | 
				
			||||||
 | 
						CFG_POWER_DOWN, | 
				
			||||||
 | 
						CFG_SET_STOP_STREAM_SETTING, | 
				
			||||||
 | 
						CFG_GET_SENSOR_INFO, | 
				
			||||||
 | 
						CFG_GET_SENSOR_INIT_PARAMS, | 
				
			||||||
 | 
						CFG_SET_INIT_SETTING, | 
				
			||||||
 | 
						CFG_SET_RESOLUTION, | 
				
			||||||
 | 
						CFG_SET_STOP_STREAM, | 
				
			||||||
 | 
						CFG_SET_START_STREAM, | 
				
			||||||
 | 
						CFG_SET_SATURATION, | 
				
			||||||
 | 
						CFG_SET_CONTRAST, | 
				
			||||||
 | 
						CFG_SET_SHARPNESS, | 
				
			||||||
 | 
						CFG_SET_ISO, | 
				
			||||||
 | 
						CFG_SET_EXPOSURE_COMPENSATION, | 
				
			||||||
 | 
						CFG_SET_ANTIBANDING, | 
				
			||||||
 | 
						CFG_SET_BESTSHOT_MODE, | 
				
			||||||
 | 
						CFG_SET_EFFECT, | 
				
			||||||
 | 
						CFG_SET_WHITE_BALANCE, | 
				
			||||||
 | 
						CFG_SET_AUTOFOCUS, | 
				
			||||||
 | 
						CFG_CANCEL_AUTOFOCUS, | 
				
			||||||
 | 
						CFG_SET_STREAM_TYPE, | 
				
			||||||
 | 
						CFG_SET_I2C_SYNC_PARAM, | 
				
			||||||
 | 
						CFG_WRITE_I2C_ARRAY_ASYNC, | 
				
			||||||
 | 
						CFG_WRITE_I2C_ARRAY_SYNC, | 
				
			||||||
 | 
						CFG_WRITE_I2C_ARRAY_SYNC_BLOCK, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_actuator_cfg_type_t { | 
				
			||||||
 | 
						CFG_GET_ACTUATOR_INFO, | 
				
			||||||
 | 
						CFG_SET_ACTUATOR_INFO, | 
				
			||||||
 | 
						CFG_SET_DEFAULT_FOCUS, | 
				
			||||||
 | 
						CFG_MOVE_FOCUS, | 
				
			||||||
 | 
						CFG_SET_POSITION, | 
				
			||||||
 | 
						CFG_ACTUATOR_POWERDOWN, | 
				
			||||||
 | 
						CFG_ACTUATOR_POWERUP, | 
				
			||||||
 | 
						CFG_ACTUATOR_INIT, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_ois_cfg_type_t { | 
				
			||||||
 | 
						CFG_OIS_INIT, | 
				
			||||||
 | 
						CFG_OIS_POWERDOWN, | 
				
			||||||
 | 
						CFG_OIS_POWERUP, | 
				
			||||||
 | 
						CFG_OIS_CONTROL, | 
				
			||||||
 | 
						CFG_OIS_I2C_WRITE_SEQ_TABLE, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_ois_i2c_operation { | 
				
			||||||
 | 
						MSM_OIS_WRITE = 0, | 
				
			||||||
 | 
						MSM_OIS_POLL, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct reg_settings_ois_t { | 
				
			||||||
 | 
						uint16_t reg_addr; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type addr_type; | 
				
			||||||
 | 
						uint32_t reg_data; | 
				
			||||||
 | 
						enum msm_camera_i2c_data_type data_type; | 
				
			||||||
 | 
						enum msm_ois_i2c_operation i2c_operation; | 
				
			||||||
 | 
						uint32_t delay; | 
				
			||||||
 | 
					#define OIS_REG_DATA_SEQ_MAX 128 | 
				
			||||||
 | 
					    unsigned char reg_data_seq[OIS_REG_DATA_SEQ_MAX]; | 
				
			||||||
 | 
					    uint32_t reg_data_seq_size; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_ois_params_t { | 
				
			||||||
 | 
						uint16_t data_size; | 
				
			||||||
 | 
						uint16_t setting_size; | 
				
			||||||
 | 
						uint32_t i2c_addr; | 
				
			||||||
 | 
						enum i2c_freq_mode_t i2c_freq_mode; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type i2c_addr_type; | 
				
			||||||
 | 
						enum msm_camera_i2c_data_type i2c_data_type; | 
				
			||||||
 | 
						struct reg_settings_ois_t *settings; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_ois_set_info_t { | 
				
			||||||
 | 
						struct msm_ois_params_t ois_params; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_move_params_t { | 
				
			||||||
 | 
						int8_t dir; | 
				
			||||||
 | 
						int8_t sign_dir; | 
				
			||||||
 | 
						int16_t dest_step_pos; | 
				
			||||||
 | 
						int32_t num_steps; | 
				
			||||||
 | 
						uint16_t curr_lens_pos; | 
				
			||||||
 | 
						struct damping_params_t *ringing_params; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_tuning_params_t { | 
				
			||||||
 | 
						int16_t initial_code; | 
				
			||||||
 | 
						uint16_t pwd_step; | 
				
			||||||
 | 
						uint16_t region_size; | 
				
			||||||
 | 
						uint32_t total_steps; | 
				
			||||||
 | 
						struct region_params_t *region_params; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct park_lens_data_t { | 
				
			||||||
 | 
						uint32_t damping_step; | 
				
			||||||
 | 
						uint32_t damping_delay; | 
				
			||||||
 | 
						uint32_t hw_params; | 
				
			||||||
 | 
						uint32_t max_step; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_params_t { | 
				
			||||||
 | 
						enum actuator_type act_type; | 
				
			||||||
 | 
						uint8_t reg_tbl_size; | 
				
			||||||
 | 
						uint16_t data_size; | 
				
			||||||
 | 
						uint16_t init_setting_size; | 
				
			||||||
 | 
						uint32_t i2c_addr; | 
				
			||||||
 | 
						enum i2c_freq_mode_t i2c_freq_mode; | 
				
			||||||
 | 
						enum msm_actuator_addr_type i2c_addr_type; | 
				
			||||||
 | 
						enum msm_actuator_data_type i2c_data_type; | 
				
			||||||
 | 
						struct msm_actuator_reg_params_t *reg_tbl_params; | 
				
			||||||
 | 
						struct reg_settings_t *init_settings; | 
				
			||||||
 | 
						struct park_lens_data_t park_lens; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_set_info_t { | 
				
			||||||
 | 
						struct msm_actuator_params_t actuator_params; | 
				
			||||||
 | 
						struct msm_actuator_tuning_params_t af_tuning_params; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_get_info_t { | 
				
			||||||
 | 
						uint32_t focal_length_num; | 
				
			||||||
 | 
						uint32_t focal_length_den; | 
				
			||||||
 | 
						uint32_t f_number_num; | 
				
			||||||
 | 
						uint32_t f_number_den; | 
				
			||||||
 | 
						uint32_t f_pix_num; | 
				
			||||||
 | 
						uint32_t f_pix_den; | 
				
			||||||
 | 
						uint32_t total_f_dist_num; | 
				
			||||||
 | 
						uint32_t total_f_dist_den; | 
				
			||||||
 | 
						uint32_t hor_view_angle_num; | 
				
			||||||
 | 
						uint32_t hor_view_angle_den; | 
				
			||||||
 | 
						uint32_t ver_view_angle_num; | 
				
			||||||
 | 
						uint32_t ver_view_angle_den; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum af_camera_name { | 
				
			||||||
 | 
						ACTUATOR_MAIN_CAM_0, | 
				
			||||||
 | 
						ACTUATOR_MAIN_CAM_1, | 
				
			||||||
 | 
						ACTUATOR_MAIN_CAM_2, | 
				
			||||||
 | 
						ACTUATOR_MAIN_CAM_3, | 
				
			||||||
 | 
						ACTUATOR_MAIN_CAM_4, | 
				
			||||||
 | 
						ACTUATOR_MAIN_CAM_5, | 
				
			||||||
 | 
						ACTUATOR_WEB_CAM_0, | 
				
			||||||
 | 
						ACTUATOR_WEB_CAM_1, | 
				
			||||||
 | 
						ACTUATOR_WEB_CAM_2, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_ois_cfg_data { | 
				
			||||||
 | 
						int cfgtype; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							struct msm_ois_set_info_t set_info; | 
				
			||||||
 | 
							struct msm_camera_i2c_seq_reg_setting *settings; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_set_position_t { | 
				
			||||||
 | 
						uint16_t number_of_steps; | 
				
			||||||
 | 
						uint32_t hw_params; | 
				
			||||||
 | 
						uint16_t pos[MAX_NUMBER_OF_STEPS]; | 
				
			||||||
 | 
						uint16_t delay[MAX_NUMBER_OF_STEPS]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_cfg_data { | 
				
			||||||
 | 
						int cfgtype; | 
				
			||||||
 | 
						uint8_t is_af_supported; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							struct msm_actuator_move_params_t move; | 
				
			||||||
 | 
							struct msm_actuator_set_info_t set_info; | 
				
			||||||
 | 
							struct msm_actuator_get_info_t get_info; | 
				
			||||||
 | 
							struct msm_actuator_set_position_t setpos; | 
				
			||||||
 | 
							enum af_camera_name cam_name; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_camera_led_config_t { | 
				
			||||||
 | 
						MSM_CAMERA_LED_OFF, | 
				
			||||||
 | 
						MSM_CAMERA_LED_LOW, | 
				
			||||||
 | 
						MSM_CAMERA_LED_HIGH, | 
				
			||||||
 | 
						MSM_CAMERA_LED_INIT, | 
				
			||||||
 | 
						MSM_CAMERA_LED_RELEASE, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_led_cfg_t { | 
				
			||||||
 | 
						enum msm_camera_led_config_t cfgtype; | 
				
			||||||
 | 
						int32_t torch_current[MAX_LED_TRIGGERS]; | 
				
			||||||
 | 
						int32_t flash_current[MAX_LED_TRIGGERS]; | 
				
			||||||
 | 
						int32_t flash_duration[MAX_LED_TRIGGERS]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_flash_init_info_t { | 
				
			||||||
 | 
						enum msm_flash_driver_type flash_driver_type; | 
				
			||||||
 | 
						uint32_t slave_addr; | 
				
			||||||
 | 
						enum i2c_freq_mode_t i2c_freq_mode; | 
				
			||||||
 | 
						struct msm_sensor_power_setting_array *power_setting_array; | 
				
			||||||
 | 
						struct msm_camera_i2c_reg_setting_array *settings; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_flash_cfg_data_t { | 
				
			||||||
 | 
						enum msm_flash_cfg_type_t cfg_type; | 
				
			||||||
 | 
						int32_t flash_current[MAX_LED_TRIGGERS]; | 
				
			||||||
 | 
						int32_t flash_duration[MAX_LED_TRIGGERS]; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							struct msm_flash_init_info_t *flash_init_info; | 
				
			||||||
 | 
							struct msm_camera_i2c_reg_setting_array *settings; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* sensor init structures and enums */ | 
				
			||||||
 | 
					enum msm_sensor_init_cfg_type_t { | 
				
			||||||
 | 
						CFG_SINIT_PROBE, | 
				
			||||||
 | 
						CFG_SINIT_PROBE_DONE, | 
				
			||||||
 | 
						CFG_SINIT_PROBE_WAIT_DONE, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sensor_init_cfg_data { | 
				
			||||||
 | 
						enum msm_sensor_init_cfg_type_t cfgtype; | 
				
			||||||
 | 
						struct msm_sensor_info_t        probed_info; | 
				
			||||||
 | 
						char                            entity_name[MAX_SENSOR_NAME]; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							void *setting; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_SENSOR_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 1, struct sensorb_cfg_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_SENSOR_RELEASE \ | 
				
			||||||
 | 
						_IO('V', BASE_VIDIOC_PRIVATE + 2) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_SENSOR_GET_SUBDEV_ID \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 3, uint32_t) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_CSIPHY_IO_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 4, struct csiphy_cfg_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_CSID_IO_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 5, struct csid_cfg_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ACTUATOR_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 6, struct msm_actuator_cfg_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_FLASH_LED_DATA_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 7, struct msm_camera_led_cfg_t) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_EEPROM_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct msm_eeprom_cfg_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_SENSOR_GET_AF_STATUS \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 9, uint32_t) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_SENSOR_INIT_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 10, struct sensor_init_cfg_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_OIS_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 11, struct msm_ois_cfg_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_FLASH_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 13, struct msm_flash_cfg_data_t) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_COMPAT | 
				
			||||||
 | 
					struct msm_camera_i2c_reg_setting32 { | 
				
			||||||
 | 
						compat_uptr_t reg_setting; | 
				
			||||||
 | 
						uint16_t size; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type addr_type; | 
				
			||||||
 | 
						enum msm_camera_i2c_data_type data_type; | 
				
			||||||
 | 
						uint16_t delay; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_i2c_array_write_config32 { | 
				
			||||||
 | 
						struct msm_camera_i2c_reg_setting32 conf_array; | 
				
			||||||
 | 
						uint16_t slave_addr; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_tuning_params_t32 { | 
				
			||||||
 | 
						int16_t initial_code; | 
				
			||||||
 | 
						uint16_t pwd_step; | 
				
			||||||
 | 
						uint16_t region_size; | 
				
			||||||
 | 
						uint32_t total_steps; | 
				
			||||||
 | 
						compat_uptr_t region_params; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_params_t32 { | 
				
			||||||
 | 
						enum actuator_type act_type; | 
				
			||||||
 | 
						uint8_t reg_tbl_size; | 
				
			||||||
 | 
						uint16_t data_size; | 
				
			||||||
 | 
						uint16_t init_setting_size; | 
				
			||||||
 | 
						uint32_t i2c_addr; | 
				
			||||||
 | 
						enum i2c_freq_mode_t i2c_freq_mode; | 
				
			||||||
 | 
						enum msm_actuator_addr_type i2c_addr_type; | 
				
			||||||
 | 
						enum msm_actuator_data_type i2c_data_type; | 
				
			||||||
 | 
						compat_uptr_t reg_tbl_params; | 
				
			||||||
 | 
						compat_uptr_t init_settings; | 
				
			||||||
 | 
						struct park_lens_data_t park_lens; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_set_info_t32 { | 
				
			||||||
 | 
						struct msm_actuator_params_t32 actuator_params; | 
				
			||||||
 | 
						struct msm_actuator_tuning_params_t32 af_tuning_params; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sensor_init_cfg_data32 { | 
				
			||||||
 | 
						enum msm_sensor_init_cfg_type_t cfgtype; | 
				
			||||||
 | 
						struct msm_sensor_info_t        probed_info; | 
				
			||||||
 | 
						char                            entity_name[MAX_SENSOR_NAME]; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							compat_uptr_t setting; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_move_params_t32 { | 
				
			||||||
 | 
						int8_t dir; | 
				
			||||||
 | 
						int8_t sign_dir; | 
				
			||||||
 | 
						int16_t dest_step_pos; | 
				
			||||||
 | 
						int32_t num_steps; | 
				
			||||||
 | 
						uint16_t curr_lens_pos; | 
				
			||||||
 | 
						compat_uptr_t ringing_params; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_cfg_data32 { | 
				
			||||||
 | 
						int cfgtype; | 
				
			||||||
 | 
						uint8_t is_af_supported; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							struct msm_actuator_move_params_t32 move; | 
				
			||||||
 | 
							struct msm_actuator_set_info_t32 set_info; | 
				
			||||||
 | 
							struct msm_actuator_get_info_t get_info; | 
				
			||||||
 | 
							struct msm_actuator_set_position_t setpos; | 
				
			||||||
 | 
							enum af_camera_name cam_name; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct csiphy_cfg_data32 { | 
				
			||||||
 | 
						enum csiphy_cfg_type_t cfgtype; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							compat_uptr_t csiphy_params; | 
				
			||||||
 | 
							compat_uptr_t csi_lane_params; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sensorb_cfg_data32 { | 
				
			||||||
 | 
						int cfgtype; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							struct msm_sensor_info_t      sensor_info; | 
				
			||||||
 | 
							struct msm_sensor_init_params sensor_init_params; | 
				
			||||||
 | 
							compat_uptr_t                 setting; | 
				
			||||||
 | 
							struct msm_sensor_i2c_sync_params sensor_i2c_sync_params; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_ois_params_t32 { | 
				
			||||||
 | 
						uint16_t data_size; | 
				
			||||||
 | 
						uint16_t setting_size; | 
				
			||||||
 | 
						uint32_t i2c_addr; | 
				
			||||||
 | 
						enum i2c_freq_mode_t i2c_freq_mode; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type i2c_addr_type; | 
				
			||||||
 | 
						enum msm_camera_i2c_data_type i2c_data_type; | 
				
			||||||
 | 
						compat_uptr_t settings; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_ois_set_info_t32 { | 
				
			||||||
 | 
						struct msm_ois_params_t32 ois_params; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_ois_cfg_data32 { | 
				
			||||||
 | 
						int cfgtype; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							struct msm_ois_set_info_t32 set_info; | 
				
			||||||
 | 
							compat_uptr_t settings; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_flash_init_info_t32 { | 
				
			||||||
 | 
						enum msm_flash_driver_type flash_driver_type; | 
				
			||||||
 | 
						uint32_t slave_addr; | 
				
			||||||
 | 
						enum i2c_freq_mode_t i2c_freq_mode; | 
				
			||||||
 | 
						compat_uptr_t power_setting_array; | 
				
			||||||
 | 
						compat_uptr_t settings; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_flash_cfg_data_t32 { | 
				
			||||||
 | 
						enum msm_flash_cfg_type_t cfg_type; | 
				
			||||||
 | 
						int32_t flash_current[MAX_LED_TRIGGERS]; | 
				
			||||||
 | 
						int32_t flash_duration[MAX_LED_TRIGGERS]; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							compat_uptr_t flash_init_info; | 
				
			||||||
 | 
							compat_uptr_t settings; | 
				
			||||||
 | 
						} cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ACTUATOR_CFG32 \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 6, struct msm_actuator_cfg_data32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_SENSOR_INIT_CFG32 \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 10, struct sensor_init_cfg_data32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_CSIPHY_IO_CFG32 \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 4, struct csiphy_cfg_data32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_SENSOR_CFG32 \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 1, struct sensorb_cfg_data32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_EEPROM_CFG32 \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct msm_eeprom_cfg_data32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_OIS_CFG32 \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 11, struct msm_ois_cfg_data32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_CSID_IO_CFG32 \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 5, struct csid_cfg_data32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_FLASH_CFG32 \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE + 13, struct msm_flash_cfg_data_t32) | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* __LINUX_MSM_CAM_SENSOR_H */ | 
				
			||||||
@ -0,0 +1,386 @@ | 
				
			|||||||
 | 
					#ifndef __LINUX_MSM_CAMSENSOR_SDK_H | 
				
			||||||
 | 
					#define __LINUX_MSM_CAMSENSOR_SDK_H | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define KVERSION 0x1 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_POWER_CONFIG      12 | 
				
			||||||
 | 
					#define GPIO_OUT_LOW          (0 << 1) | 
				
			||||||
 | 
					#define GPIO_OUT_HIGH         (1 << 1) | 
				
			||||||
 | 
					#define CSI_EMBED_DATA        0x12 | 
				
			||||||
 | 
					#define CSI_RESERVED_DATA_0   0x13 | 
				
			||||||
 | 
					#define CSI_YUV422_8          0x1E | 
				
			||||||
 | 
					#define CSI_RAW8              0x2A | 
				
			||||||
 | 
					#define CSI_RAW10             0x2B | 
				
			||||||
 | 
					#define CSI_RAW12             0x2C | 
				
			||||||
 | 
					#define CSI_DECODE_6BIT         0 | 
				
			||||||
 | 
					#define CSI_DECODE_8BIT         1 | 
				
			||||||
 | 
					#define CSI_DECODE_10BIT        2 | 
				
			||||||
 | 
					#define CSI_DECODE_12BIT        3 | 
				
			||||||
 | 
					#define CSI_DECODE_DPCM_10_8_10 5 | 
				
			||||||
 | 
					#define MAX_CID                 16 | 
				
			||||||
 | 
					#define I2C_SEQ_REG_DATA_MAX    1024 | 
				
			||||||
 | 
					#define I2C_REG_DATA_MAX       (8*1024) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_META v4l2_fourcc('M', 'E', 'T', 'A') /* META */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_SBGGR14 v4l2_fourcc('B', 'G', '1', '4') | 
				
			||||||
 | 
						/* 14  BGBG.. GRGR.. */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_SGBRG14 v4l2_fourcc('G', 'B', '1', '4') | 
				
			||||||
 | 
						/* 14  GBGB.. RGRG.. */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_SGRBG14 v4l2_fourcc('B', 'A', '1', '4') | 
				
			||||||
 | 
						/* 14  GRGR.. BGBG.. */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_SRGGB14 v4l2_fourcc('R', 'G', '1', '4') | 
				
			||||||
 | 
						/* 14  RGRG.. GBGB.. */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_ACTUATOR_REG_TBL_SIZE 8 | 
				
			||||||
 | 
					#define MAX_ACTUATOR_REGION       5 | 
				
			||||||
 | 
					#define NUM_ACTUATOR_DIR          2 | 
				
			||||||
 | 
					#define MAX_ACTUATOR_SCENARIO     8 | 
				
			||||||
 | 
					#define MAX_ACT_MOD_NAME_SIZE     32 | 
				
			||||||
 | 
					#define MAX_ACT_NAME_SIZE         32 | 
				
			||||||
 | 
					#define MAX_ACTUATOR_INIT_SET     120 | 
				
			||||||
 | 
					#define MAX_I2C_REG_SET           12 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_LED_TRIGGERS          3 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_EEPROM_MEMORY_MAP_MAX_SIZE  80 | 
				
			||||||
 | 
					#define MSM_EEPROM_MAX_MEM_MAP_CNT      8 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_sensor_camera_id_t { | 
				
			||||||
 | 
						CAMERA_0, | 
				
			||||||
 | 
						CAMERA_1, | 
				
			||||||
 | 
						CAMERA_2, | 
				
			||||||
 | 
						CAMERA_3, | 
				
			||||||
 | 
						MAX_CAMERAS, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum i2c_freq_mode_t { | 
				
			||||||
 | 
						I2C_STANDARD_MODE, | 
				
			||||||
 | 
						I2C_FAST_MODE, | 
				
			||||||
 | 
						I2C_CUSTOM_MODE, | 
				
			||||||
 | 
						I2C_FAST_PLUS_MODE, | 
				
			||||||
 | 
						I2C_MAX_MODES, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum camb_position_t { | 
				
			||||||
 | 
						BACK_CAMERA_B, | 
				
			||||||
 | 
						FRONT_CAMERA_B, | 
				
			||||||
 | 
						AUX_CAMERA_B = 0x100, | 
				
			||||||
 | 
						INVALID_CAMERA_B, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_sensor_power_seq_type_t { | 
				
			||||||
 | 
						SENSOR_CLK, | 
				
			||||||
 | 
						SENSOR_GPIO, | 
				
			||||||
 | 
						SENSOR_VREG, | 
				
			||||||
 | 
						SENSOR_I2C_MUX, | 
				
			||||||
 | 
						SENSOR_I2C, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_camera_i2c_reg_addr_type { | 
				
			||||||
 | 
						MSM_CAMERA_I2C_BYTE_ADDR = 1, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_WORD_ADDR, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_3B_ADDR, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_ADDR_TYPE_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_camera_i2c_data_type { | 
				
			||||||
 | 
						MSM_CAMERA_I2C_BYTE_DATA = 1, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_WORD_DATA, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_DWORD_DATA, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_SET_BYTE_MASK, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_UNSET_BYTE_MASK, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_SET_WORD_MASK, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_UNSET_WORD_MASK, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_SET_BYTE_WRITE_MASK_DATA, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_SEQ_DATA, | 
				
			||||||
 | 
						MSM_CAMERA_I2C_DATA_TYPE_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_sensor_power_seq_gpio_t { | 
				
			||||||
 | 
						SENSOR_GPIO_RESET, | 
				
			||||||
 | 
						SENSOR_GPIO_STANDBY, | 
				
			||||||
 | 
						SENSOR_GPIO_AF_PWDM, | 
				
			||||||
 | 
						SENSOR_GPIO_VIO, | 
				
			||||||
 | 
						SENSOR_GPIO_VANA, | 
				
			||||||
 | 
						SENSOR_GPIO_VDIG, | 
				
			||||||
 | 
						SENSOR_GPIO_VAF, | 
				
			||||||
 | 
						SENSOR_GPIO_FL_EN, | 
				
			||||||
 | 
						SENSOR_GPIO_FL_NOW, | 
				
			||||||
 | 
						SENSOR_GPIO_FL_RESET, | 
				
			||||||
 | 
						SENSOR_GPIO_CUSTOM1, | 
				
			||||||
 | 
						SENSOR_GPIO_CUSTOM2, | 
				
			||||||
 | 
						SENSOR_GPIO_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_camera_vreg_name_t { | 
				
			||||||
 | 
						CAM_VDIG, | 
				
			||||||
 | 
						CAM_VIO, | 
				
			||||||
 | 
						CAM_VANA, | 
				
			||||||
 | 
						CAM_VAF, | 
				
			||||||
 | 
						CAM_V_CUSTOM1, | 
				
			||||||
 | 
						CAM_V_CUSTOM2, | 
				
			||||||
 | 
						CAM_VREG_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_sensor_clk_type_t { | 
				
			||||||
 | 
						SENSOR_CAM_MCLK, | 
				
			||||||
 | 
						SENSOR_CAM_CLK, | 
				
			||||||
 | 
						SENSOR_CAM_CLK_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum camerab_mode_t { | 
				
			||||||
 | 
						CAMERA_MODE_2D_B = (1<<0), | 
				
			||||||
 | 
						CAMERA_MODE_3D_B = (1<<1), | 
				
			||||||
 | 
						CAMERA_MODE_INVALID = (1<<2), | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_actuator_data_type { | 
				
			||||||
 | 
						MSM_ACTUATOR_BYTE_DATA = 1, | 
				
			||||||
 | 
						MSM_ACTUATOR_WORD_DATA, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_actuator_addr_type { | 
				
			||||||
 | 
						MSM_ACTUATOR_BYTE_ADDR = 1, | 
				
			||||||
 | 
						MSM_ACTUATOR_WORD_ADDR, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_actuator_write_type { | 
				
			||||||
 | 
						MSM_ACTUATOR_WRITE_HW_DAMP, | 
				
			||||||
 | 
						MSM_ACTUATOR_WRITE_DAC, | 
				
			||||||
 | 
						MSM_ACTUATOR_WRITE, | 
				
			||||||
 | 
						MSM_ACTUATOR_WRITE_DIR_REG, | 
				
			||||||
 | 
						MSM_ACTUATOR_POLL, | 
				
			||||||
 | 
						MSM_ACTUATOR_READ_WRITE, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_actuator_i2c_operation { | 
				
			||||||
 | 
						MSM_ACT_WRITE = 0, | 
				
			||||||
 | 
						MSM_ACT_POLL, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum actuator_type { | 
				
			||||||
 | 
						ACTUATOR_VCM, | 
				
			||||||
 | 
						ACTUATOR_PIEZO, | 
				
			||||||
 | 
						ACTUATOR_HVCM, | 
				
			||||||
 | 
						ACTUATOR_BIVCM, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_flash_driver_type { | 
				
			||||||
 | 
						FLASH_DRIVER_PMIC, | 
				
			||||||
 | 
						FLASH_DRIVER_I2C, | 
				
			||||||
 | 
						FLASH_DRIVER_GPIO, | 
				
			||||||
 | 
						FLASH_DRIVER_DEFAULT | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_flash_cfg_type_t { | 
				
			||||||
 | 
						CFG_FLASH_INIT, | 
				
			||||||
 | 
						CFG_FLASH_RELEASE, | 
				
			||||||
 | 
						CFG_FLASH_OFF, | 
				
			||||||
 | 
						CFG_FLASH_LOW, | 
				
			||||||
 | 
						CFG_FLASH_HIGH, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_sensor_output_format_t { | 
				
			||||||
 | 
						MSM_SENSOR_BAYER, | 
				
			||||||
 | 
						MSM_SENSOR_YCBCR, | 
				
			||||||
 | 
						MSM_SENSOR_META, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_sensor_power_setting { | 
				
			||||||
 | 
						enum msm_sensor_power_seq_type_t seq_type; | 
				
			||||||
 | 
						unsigned short seq_val; | 
				
			||||||
 | 
						long config_val; | 
				
			||||||
 | 
						unsigned short delay; | 
				
			||||||
 | 
						void *data[10]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_sensor_power_setting_array { | 
				
			||||||
 | 
						struct msm_sensor_power_setting  power_setting_a[MAX_POWER_CONFIG]; | 
				
			||||||
 | 
						struct msm_sensor_power_setting *power_setting; | 
				
			||||||
 | 
						unsigned short size; | 
				
			||||||
 | 
						struct msm_sensor_power_setting  power_down_setting_a[MAX_POWER_CONFIG]; | 
				
			||||||
 | 
						struct msm_sensor_power_setting *power_down_setting; | 
				
			||||||
 | 
						unsigned short size_down; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_camera_i2c_operation { | 
				
			||||||
 | 
						MSM_CAM_WRITE = 0, | 
				
			||||||
 | 
						MSM_CAM_POLL, | 
				
			||||||
 | 
						MSM_CAM_READ, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_sensor_i2c_sync_params { | 
				
			||||||
 | 
						unsigned int cid; | 
				
			||||||
 | 
						int csid; | 
				
			||||||
 | 
						unsigned short line; | 
				
			||||||
 | 
						unsigned short delay; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_reg_settings_t { | 
				
			||||||
 | 
						uint16_t reg_addr; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type addr_type; | 
				
			||||||
 | 
						uint16_t reg_data; | 
				
			||||||
 | 
						enum msm_camera_i2c_data_type data_type; | 
				
			||||||
 | 
						enum msm_camera_i2c_operation i2c_operation; | 
				
			||||||
 | 
						uint16_t delay; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_eeprom_mem_map_t { | 
				
			||||||
 | 
						int slave_addr; | 
				
			||||||
 | 
						struct msm_camera_reg_settings_t | 
				
			||||||
 | 
							mem_settings[MSM_EEPROM_MEMORY_MAP_MAX_SIZE]; | 
				
			||||||
 | 
						int memory_map_size; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_eeprom_memory_map_array { | 
				
			||||||
 | 
						struct msm_eeprom_mem_map_t memory_map[MSM_EEPROM_MAX_MEM_MAP_CNT]; | 
				
			||||||
 | 
						uint32_t msm_size_of_max_mappings; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_sensor_init_params { | 
				
			||||||
 | 
						/* mask of modes supported: 2D, 3D */ | 
				
			||||||
 | 
						int                 modes_supported; | 
				
			||||||
 | 
						/* sensor position: front, back */ | 
				
			||||||
 | 
						enum camb_position_t position; | 
				
			||||||
 | 
						/* sensor mount angle */ | 
				
			||||||
 | 
						unsigned int            sensor_mount_angle; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_sensor_id_info_t { | 
				
			||||||
 | 
						unsigned short sensor_id_reg_addr; | 
				
			||||||
 | 
						unsigned short sensor_id; | 
				
			||||||
 | 
						unsigned short sensor_id_mask; | 
				
			||||||
 | 
					  // added in LeEco
 | 
				
			||||||
 | 
					  unsigned char module_id; | 
				
			||||||
 | 
					  unsigned char vcm_id; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_sensor_slave_info { | 
				
			||||||
 | 
						char sensor_name[32]; | 
				
			||||||
 | 
						char eeprom_name[32]; | 
				
			||||||
 | 
						char actuator_name[32]; | 
				
			||||||
 | 
						char ois_name[32]; | 
				
			||||||
 | 
						char flash_name[32]; | 
				
			||||||
 | 
						enum msm_sensor_camera_id_t camera_id; | 
				
			||||||
 | 
						unsigned short slave_addr; | 
				
			||||||
 | 
						enum i2c_freq_mode_t i2c_freq_mode; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type addr_type; | 
				
			||||||
 | 
						struct msm_sensor_id_info_t sensor_id_info; | 
				
			||||||
 | 
						struct msm_sensor_power_setting_array power_setting_array; | 
				
			||||||
 | 
						unsigned char  is_init_params_valid; | 
				
			||||||
 | 
						struct msm_sensor_init_params sensor_init_params; | 
				
			||||||
 | 
						enum msm_sensor_output_format_t output_format; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_i2c_reg_array { | 
				
			||||||
 | 
						unsigned short reg_addr; | 
				
			||||||
 | 
						unsigned short reg_data; | 
				
			||||||
 | 
						unsigned int delay; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_i2c_reg_setting { | 
				
			||||||
 | 
						struct msm_camera_i2c_reg_array *reg_setting; | 
				
			||||||
 | 
						unsigned short size; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type addr_type; | 
				
			||||||
 | 
						enum msm_camera_i2c_data_type data_type; | 
				
			||||||
 | 
						unsigned short delay; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_csid_vc_cfg { | 
				
			||||||
 | 
						unsigned char cid; | 
				
			||||||
 | 
						unsigned char dt; | 
				
			||||||
 | 
						unsigned char decode_format; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_csid_lut_params { | 
				
			||||||
 | 
						unsigned char num_cid; | 
				
			||||||
 | 
						struct msm_camera_csid_vc_cfg vc_cfg_a[MAX_CID]; | 
				
			||||||
 | 
						struct msm_camera_csid_vc_cfg *vc_cfg[MAX_CID]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_csid_params { | 
				
			||||||
 | 
						unsigned char lane_cnt; | 
				
			||||||
 | 
						unsigned short lane_assign; | 
				
			||||||
 | 
						unsigned char phy_sel; | 
				
			||||||
 | 
						unsigned int csi_clk; | 
				
			||||||
 | 
						struct msm_camera_csid_lut_params lut_params; | 
				
			||||||
 | 
						unsigned char csi_3p_sel; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_csid_testmode_parms { | 
				
			||||||
 | 
						unsigned int num_bytes_per_line; | 
				
			||||||
 | 
						unsigned int num_lines; | 
				
			||||||
 | 
						unsigned int h_blanking_count; | 
				
			||||||
 | 
						unsigned int v_blanking_count; | 
				
			||||||
 | 
						unsigned int payload_mode; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_csiphy_params { | 
				
			||||||
 | 
						unsigned char lane_cnt; | 
				
			||||||
 | 
						unsigned char settle_cnt; | 
				
			||||||
 | 
						unsigned short lane_mask; | 
				
			||||||
 | 
						unsigned char combo_mode; | 
				
			||||||
 | 
						unsigned char csid_core; | 
				
			||||||
 | 
						unsigned int csiphy_clk; | 
				
			||||||
 | 
						unsigned char csi_3phase; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_i2c_seq_reg_array { | 
				
			||||||
 | 
						unsigned short reg_addr; | 
				
			||||||
 | 
						unsigned char reg_data[I2C_SEQ_REG_DATA_MAX]; | 
				
			||||||
 | 
						unsigned short reg_data_size; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_i2c_seq_reg_setting { | 
				
			||||||
 | 
						struct msm_camera_i2c_seq_reg_array *reg_setting; | 
				
			||||||
 | 
						unsigned short size; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type addr_type; | 
				
			||||||
 | 
						unsigned short delay; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_actuator_reg_params_t { | 
				
			||||||
 | 
						enum msm_actuator_write_type reg_write_type; | 
				
			||||||
 | 
						unsigned int hw_mask; | 
				
			||||||
 | 
						unsigned short reg_addr; | 
				
			||||||
 | 
						unsigned short hw_shift; | 
				
			||||||
 | 
						unsigned short data_shift; | 
				
			||||||
 | 
						unsigned short data_type; | 
				
			||||||
 | 
						unsigned short addr_type; | 
				
			||||||
 | 
						unsigned short reg_data; | 
				
			||||||
 | 
						unsigned short delay; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct damping_params_t { | 
				
			||||||
 | 
						unsigned int damping_step; | 
				
			||||||
 | 
						unsigned int damping_delay; | 
				
			||||||
 | 
						unsigned int hw_params; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct region_params_t { | 
				
			||||||
 | 
						/* [0] = ForwardDirection Macro boundary
 | 
				
			||||||
 | 
						   [1] = ReverseDirection Inf boundary | 
				
			||||||
 | 
						*/ | 
				
			||||||
 | 
						unsigned short step_bound[2]; | 
				
			||||||
 | 
						unsigned short code_per_step; | 
				
			||||||
 | 
						/* qvalue for converting float type numbers to integer format */ | 
				
			||||||
 | 
						unsigned int qvalue; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct reg_settings_t { | 
				
			||||||
 | 
						unsigned short reg_addr; | 
				
			||||||
 | 
						enum msm_actuator_addr_type addr_type; | 
				
			||||||
 | 
						unsigned short reg_data; | 
				
			||||||
 | 
						enum msm_actuator_data_type data_type; | 
				
			||||||
 | 
						enum msm_actuator_i2c_operation i2c_operation; | 
				
			||||||
 | 
						unsigned int delay; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_i2c_reg_setting_array { | 
				
			||||||
 | 
						struct msm_camera_i2c_reg_array reg_setting_a[MAX_I2C_REG_SET]; | 
				
			||||||
 | 
						unsigned short size; | 
				
			||||||
 | 
						enum msm_camera_i2c_reg_addr_type addr_type; | 
				
			||||||
 | 
						enum msm_camera_i2c_data_type data_type; | 
				
			||||||
 | 
						unsigned short delay; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					#endif /* __LINUX_MSM_CAM_SENSOR_H */ | 
				
			||||||
@ -0,0 +1,220 @@ | 
				
			|||||||
 | 
					#ifndef __LINUX_MSMB_CAMERA_H | 
				
			||||||
 | 
					#define __LINUX_MSMB_CAMERA_H | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/videodev2.h> | 
				
			||||||
 | 
					#include <linux/types.h> | 
				
			||||||
 | 
					#include <linux/ioctl.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAM_LOGSYNC_FILE_NAME "logsync" | 
				
			||||||
 | 
					#define MSM_CAM_LOGSYNC_FILE_BASEDIR "camera" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAM_V4L2_IOCTL_NOTIFY \ | 
				
			||||||
 | 
						_IOW('V', BASE_VIDIOC_PRIVATE + 30, struct msm_v4l2_event_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAM_V4L2_IOCTL_NOTIFY_META \ | 
				
			||||||
 | 
						_IOW('V', BASE_VIDIOC_PRIVATE + 31, struct msm_v4l2_event_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAM_V4L2_IOCTL_CMD_ACK \ | 
				
			||||||
 | 
						_IOW('V', BASE_VIDIOC_PRIVATE + 32, struct msm_v4l2_event_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAM_V4L2_IOCTL_NOTIFY_ERROR \ | 
				
			||||||
 | 
						_IOW('V', BASE_VIDIOC_PRIVATE + 33, struct msm_v4l2_event_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAM_V4L2_IOCTL_NOTIFY_DEBUG \ | 
				
			||||||
 | 
						_IOW('V', BASE_VIDIOC_PRIVATE + 34, struct msm_v4l2_event_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_COMPAT | 
				
			||||||
 | 
					#define MSM_CAM_V4L2_IOCTL_NOTIFY32 \ | 
				
			||||||
 | 
						_IOW('V', BASE_VIDIOC_PRIVATE + 30, struct v4l2_event32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAM_V4L2_IOCTL_NOTIFY_META32 \ | 
				
			||||||
 | 
						_IOW('V', BASE_VIDIOC_PRIVATE + 31, struct v4l2_event32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAM_V4L2_IOCTL_CMD_ACK32 \ | 
				
			||||||
 | 
						_IOW('V', BASE_VIDIOC_PRIVATE + 32, struct v4l2_event32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAM_V4L2_IOCTL_NOTIFY_ERROR32 \ | 
				
			||||||
 | 
						_IOW('V', BASE_VIDIOC_PRIVATE + 33, struct v4l2_event32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAM_V4L2_IOCTL_NOTIFY_DEBUG32 \ | 
				
			||||||
 | 
						_IOW('V', BASE_VIDIOC_PRIVATE + 34, struct v4l2_event32) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define QCAMERA_DEVICE_GROUP_ID	1 | 
				
			||||||
 | 
					#define QCAMERA_VNODE_GROUP_ID	2 | 
				
			||||||
 | 
					#define MSM_CAMERA_NAME					"msm_camera" | 
				
			||||||
 | 
					#define MSM_CONFIGURATION_NAME	"msm_config" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_CSIPHY       0 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_CSID         1 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_ISPIF        2 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_VFE          3 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_AXI          4 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_VPE          5 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_SENSOR       6 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_ACTUATOR     7 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_EEPROM       8 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_CPP          9 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_CCI          10 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_LED_FLASH    11 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_STROBE_FLASH 12 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_BUF_MNGR     13 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_SENSOR_INIT  14 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_OIS          15 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_FLASH        16 | 
				
			||||||
 | 
					#define MSM_CAMERA_SUBDEV_EXT          17 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_MAX_CAMERA_SENSORS  5 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The below macro is defined to put an upper limit on maximum
 | 
				
			||||||
 | 
					 * number of buffer requested per stream. In case of extremely | 
				
			||||||
 | 
					 * large value for number of buffer due to data structure corruption | 
				
			||||||
 | 
					 * we return error to avoid integer overflow. Group processing | 
				
			||||||
 | 
					 * can have max of 9 groups of 8 bufs each. This value may be | 
				
			||||||
 | 
					 * configured in future*/ | 
				
			||||||
 | 
					#define MSM_CAMERA_MAX_STREAM_BUF 72 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Max batch size of processing */ | 
				
			||||||
 | 
					#define MSM_CAMERA_MAX_USER_BUFF_CNT 16 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* featur base */ | 
				
			||||||
 | 
					#define MSM_CAMERA_FEATURE_BASE     0x00010000 | 
				
			||||||
 | 
					#define MSM_CAMERA_FEATURE_SHUTDOWN (MSM_CAMERA_FEATURE_BASE + 1) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MSM_CAMERA_STATUS_BASE      0x00020000 | 
				
			||||||
 | 
					#define MSM_CAMERA_STATUS_FAIL      (MSM_CAMERA_STATUS_BASE + 1) | 
				
			||||||
 | 
					#define MSM_CAMERA_STATUS_SUCCESS   (MSM_CAMERA_STATUS_BASE + 2) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* event type */ | 
				
			||||||
 | 
					#define MSM_CAMERA_V4L2_EVENT_TYPE (V4L2_EVENT_PRIVATE_START + 0x00002000) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* event id */ | 
				
			||||||
 | 
					#define MSM_CAMERA_EVENT_MIN    0 | 
				
			||||||
 | 
					#define MSM_CAMERA_NEW_SESSION  (MSM_CAMERA_EVENT_MIN + 1) | 
				
			||||||
 | 
					#define MSM_CAMERA_DEL_SESSION  (MSM_CAMERA_EVENT_MIN + 2) | 
				
			||||||
 | 
					#define MSM_CAMERA_SET_PARM     (MSM_CAMERA_EVENT_MIN + 3) | 
				
			||||||
 | 
					#define MSM_CAMERA_GET_PARM     (MSM_CAMERA_EVENT_MIN + 4) | 
				
			||||||
 | 
					#define MSM_CAMERA_MAPPING_CFG  (MSM_CAMERA_EVENT_MIN + 5) | 
				
			||||||
 | 
					#define MSM_CAMERA_MAPPING_SES  (MSM_CAMERA_EVENT_MIN + 6) | 
				
			||||||
 | 
					#define MSM_CAMERA_MSM_NOTIFY   (MSM_CAMERA_EVENT_MIN + 7) | 
				
			||||||
 | 
					#define MSM_CAMERA_EVENT_MAX    (MSM_CAMERA_EVENT_MIN + 8) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* data.command */ | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_S_CROP		 (V4L2_CID_PRIVATE_BASE + 1) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_G_CROP		 (V4L2_CID_PRIVATE_BASE + 2) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_G_FMT			 (V4L2_CID_PRIVATE_BASE + 3) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_S_FMT			 (V4L2_CID_PRIVATE_BASE + 4) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_TRY_FMT		 (V4L2_CID_PRIVATE_BASE + 5) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_METADATA	 (V4L2_CID_PRIVATE_BASE + 6) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_QUERY_CAP  (V4L2_CID_PRIVATE_BASE + 7) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_STREAM_ON  (V4L2_CID_PRIVATE_BASE + 8) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_STREAM_OFF (V4L2_CID_PRIVATE_BASE + 9) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_NEW_STREAM (V4L2_CID_PRIVATE_BASE + 10) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_DEL_STREAM (V4L2_CID_PRIVATE_BASE + 11) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_SHUTDOWN   (V4L2_CID_PRIVATE_BASE + 12) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_STREAM_INFO_SYNC \ | 
				
			||||||
 | 
						(V4L2_CID_PRIVATE_BASE + 13) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_G_SESSION_ID (V4L2_CID_PRIVATE_BASE + 14) | 
				
			||||||
 | 
					#define MSM_CAMERA_PRIV_CMD_MAX  20 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* data.status - success */ | 
				
			||||||
 | 
					#define MSM_CAMERA_CMD_SUCESS      0x00000001 | 
				
			||||||
 | 
					#define MSM_CAMERA_BUF_MAP_SUCESS  0x00000002 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* data.status - error */ | 
				
			||||||
 | 
					#define MSM_CAMERA_ERR_EVT_BASE 0x00010000 | 
				
			||||||
 | 
					#define MSM_CAMERA_ERR_CMD_FAIL (MSM_CAMERA_ERR_EVT_BASE + 1) | 
				
			||||||
 | 
					#define MSM_CAMERA_ERR_MAPPING  (MSM_CAMERA_ERR_EVT_BASE + 2) | 
				
			||||||
 | 
					#define MSM_CAMERA_ERR_DEVICE_BUSY  (MSM_CAMERA_ERR_EVT_BASE + 3) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The msm_v4l2_event_data structure should match the
 | 
				
			||||||
 | 
					 * v4l2_event.u.data field. | 
				
			||||||
 | 
					 * should not exceed 16 elements */ | 
				
			||||||
 | 
					struct msm_v4l2_event_data { | 
				
			||||||
 | 
						/*word 0*/ | 
				
			||||||
 | 
						unsigned int command; | 
				
			||||||
 | 
						/*word 1*/ | 
				
			||||||
 | 
						unsigned int status; | 
				
			||||||
 | 
						/*word 2*/ | 
				
			||||||
 | 
						unsigned int session_id; | 
				
			||||||
 | 
						/*word 3*/ | 
				
			||||||
 | 
						unsigned int stream_id; | 
				
			||||||
 | 
						/*word 4*/ | 
				
			||||||
 | 
						unsigned int map_op; | 
				
			||||||
 | 
						/*word 5*/ | 
				
			||||||
 | 
						unsigned int map_buf_idx; | 
				
			||||||
 | 
						/*word 6*/ | 
				
			||||||
 | 
						unsigned int notify; | 
				
			||||||
 | 
						/*word 7*/ | 
				
			||||||
 | 
						unsigned int arg_value; | 
				
			||||||
 | 
						/*word 8*/ | 
				
			||||||
 | 
						unsigned int ret_value; | 
				
			||||||
 | 
						/*word 9*/ | 
				
			||||||
 | 
						unsigned int v4l2_event_type; | 
				
			||||||
 | 
						/*word 10*/ | 
				
			||||||
 | 
						unsigned int v4l2_event_id; | 
				
			||||||
 | 
						/*word 11*/ | 
				
			||||||
 | 
						unsigned int handle; | 
				
			||||||
 | 
						/*word 12*/ | 
				
			||||||
 | 
						unsigned int nop6; | 
				
			||||||
 | 
						/*word 13*/ | 
				
			||||||
 | 
						unsigned int nop7; | 
				
			||||||
 | 
						/*word 14*/ | 
				
			||||||
 | 
						unsigned int nop8; | 
				
			||||||
 | 
						/*word 15*/ | 
				
			||||||
 | 
						unsigned int nop9; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* map to v4l2_format.fmt.raw_data */ | 
				
			||||||
 | 
					struct msm_v4l2_format_data { | 
				
			||||||
 | 
						enum v4l2_buf_type type; | 
				
			||||||
 | 
						unsigned int width; | 
				
			||||||
 | 
						unsigned int height; | 
				
			||||||
 | 
						unsigned int pixelformat; /* FOURCC */ | 
				
			||||||
 | 
						unsigned char num_planes; | 
				
			||||||
 | 
						unsigned int plane_sizes[VIDEO_MAX_PLANES]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*  MSM Four-character-code (FOURCC) */ | 
				
			||||||
 | 
					#define msm_v4l2_fourcc(a, b, c, d)\ | 
				
			||||||
 | 
						((__u32)(a) | ((__u32)(b) << 8) | ((__u32)(c) << 16) |\
 | 
				
			||||||
 | 
						((__u32)(d) << 24)) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Composite stats */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_STATS_COMB v4l2_fourcc('S', 'T', 'C', 'M') | 
				
			||||||
 | 
					/* AEC stats */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_STATS_AE   v4l2_fourcc('S', 'T', 'A', 'E') | 
				
			||||||
 | 
					/* AF stats */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_STATS_AF   v4l2_fourcc('S', 'T', 'A', 'F') | 
				
			||||||
 | 
					/* AWB stats */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_STATS_AWB  v4l2_fourcc('S', 'T', 'W', 'B') | 
				
			||||||
 | 
					/* IHIST stats */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_STATS_IHST v4l2_fourcc('I', 'H', 'S', 'T') | 
				
			||||||
 | 
					/* Column count stats */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_STATS_CS   v4l2_fourcc('S', 'T', 'C', 'S') | 
				
			||||||
 | 
					/* Row count stats */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_STATS_RS   v4l2_fourcc('S', 'T', 'R', 'S') | 
				
			||||||
 | 
					/* Bayer Grid stats */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_STATS_BG   v4l2_fourcc('S', 'T', 'B', 'G') | 
				
			||||||
 | 
					/* Bayer focus stats */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_STATS_BF   v4l2_fourcc('S', 'T', 'B', 'F') | 
				
			||||||
 | 
					/* Bayer hist stats */ | 
				
			||||||
 | 
					#define MSM_V4L2_PIX_FMT_STATS_BHST v4l2_fourcc('B', 'H', 'S', 'T') | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum smmu_attach_mode { | 
				
			||||||
 | 
						NON_SECURE_MODE = 0x01, | 
				
			||||||
 | 
						SECURE_MODE = 0x02, | 
				
			||||||
 | 
						MAX_PROTECTION_MODE = 0x03, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_smmu_attach_type { | 
				
			||||||
 | 
						enum smmu_attach_mode attach; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_camera_user_buf_cont_t { | 
				
			||||||
 | 
						unsigned int buf_cnt; | 
				
			||||||
 | 
						unsigned int buf_idx[MSM_CAMERA_MAX_USER_BUFF_CNT]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* __LINUX_MSMB_CAMERA_H */ | 
				
			||||||
@ -0,0 +1,880 @@ | 
				
			|||||||
 | 
					#ifndef __MSMB_ISP__ | 
				
			||||||
 | 
					#define __MSMB_ISP__ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/videodev2.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_PLANES_PER_STREAM 3 | 
				
			||||||
 | 
					#define MAX_NUM_STREAM 7 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_VERSION_47        47 | 
				
			||||||
 | 
					#define ISP_VERSION_46        46 | 
				
			||||||
 | 
					#define ISP_VERSION_44        44 | 
				
			||||||
 | 
					#define ISP_VERSION_40        40 | 
				
			||||||
 | 
					#define ISP_VERSION_32        32 | 
				
			||||||
 | 
					#define ISP_NATIVE_BUF_BIT    (0x10000 << 0) | 
				
			||||||
 | 
					#define ISP0_BIT              (0x10000 << 1) | 
				
			||||||
 | 
					#define ISP1_BIT              (0x10000 << 2) | 
				
			||||||
 | 
					#define ISP_META_CHANNEL_BIT  (0x10000 << 3) | 
				
			||||||
 | 
					#define ISP_SCRATCH_BUF_BIT   (0x10000 << 4) | 
				
			||||||
 | 
					#define ISP_OFFLINE_STATS_BIT (0x10000 << 5) | 
				
			||||||
 | 
					#define ISP_STATS_STREAM_BIT  0x80000000 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_cfg_cmd_list; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum ISP_START_PIXEL_PATTERN { | 
				
			||||||
 | 
						ISP_BAYER_RGRGRG, | 
				
			||||||
 | 
						ISP_BAYER_GRGRGR, | 
				
			||||||
 | 
						ISP_BAYER_BGBGBG, | 
				
			||||||
 | 
						ISP_BAYER_GBGBGB, | 
				
			||||||
 | 
						ISP_YUV_YCbYCr, | 
				
			||||||
 | 
						ISP_YUV_YCrYCb, | 
				
			||||||
 | 
						ISP_YUV_CbYCrY, | 
				
			||||||
 | 
						ISP_YUV_CrYCbY, | 
				
			||||||
 | 
						ISP_PIX_PATTERN_MAX | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_plane_fmt { | 
				
			||||||
 | 
						Y_PLANE, | 
				
			||||||
 | 
						CB_PLANE, | 
				
			||||||
 | 
						CR_PLANE, | 
				
			||||||
 | 
						CRCB_PLANE, | 
				
			||||||
 | 
						CBCR_PLANE, | 
				
			||||||
 | 
						VFE_PLANE_FMT_MAX | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_input_src { | 
				
			||||||
 | 
						VFE_PIX_0, | 
				
			||||||
 | 
						VFE_RAW_0, | 
				
			||||||
 | 
						VFE_RAW_1, | 
				
			||||||
 | 
						VFE_RAW_2, | 
				
			||||||
 | 
						VFE_SRC_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_axi_stream_src { | 
				
			||||||
 | 
						PIX_ENCODER, | 
				
			||||||
 | 
						PIX_VIEWFINDER, | 
				
			||||||
 | 
						PIX_VIDEO, | 
				
			||||||
 | 
						CAMIF_RAW, | 
				
			||||||
 | 
						IDEAL_RAW, | 
				
			||||||
 | 
						RDI_INTF_0, | 
				
			||||||
 | 
						RDI_INTF_1, | 
				
			||||||
 | 
						RDI_INTF_2, | 
				
			||||||
 | 
						VFE_AXI_SRC_MAX | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_frame_skip_pattern { | 
				
			||||||
 | 
						NO_SKIP, | 
				
			||||||
 | 
						EVERY_2FRAME, | 
				
			||||||
 | 
						EVERY_3FRAME, | 
				
			||||||
 | 
						EVERY_4FRAME, | 
				
			||||||
 | 
						EVERY_5FRAME, | 
				
			||||||
 | 
						EVERY_6FRAME, | 
				
			||||||
 | 
						EVERY_7FRAME, | 
				
			||||||
 | 
						EVERY_8FRAME, | 
				
			||||||
 | 
						EVERY_16FRAME, | 
				
			||||||
 | 
						EVERY_32FRAME, | 
				
			||||||
 | 
						SKIP_ALL, | 
				
			||||||
 | 
						SKIP_RANGE, | 
				
			||||||
 | 
						MAX_SKIP, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Define an unused period. When this period is set it means that the stream is | 
				
			||||||
 | 
					 * stopped(i.e the pattern is 0). We don't track the current pattern, just the | 
				
			||||||
 | 
					 * period defines what the pattern is, if period is this then pattern is 0 else | 
				
			||||||
 | 
					 * pattern is 1 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					#define MSM_VFE_STREAM_STOP_PERIOD 15 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_isp_stats_type { | 
				
			||||||
 | 
						MSM_ISP_STATS_AEC,   /* legacy based AEC */ | 
				
			||||||
 | 
						MSM_ISP_STATS_AF,    /* legacy based AF */ | 
				
			||||||
 | 
						MSM_ISP_STATS_AWB,   /* legacy based AWB */ | 
				
			||||||
 | 
						MSM_ISP_STATS_RS,    /* legacy based RS */ | 
				
			||||||
 | 
						MSM_ISP_STATS_CS,    /* legacy based CS */ | 
				
			||||||
 | 
						MSM_ISP_STATS_IHIST, /* legacy based HIST */ | 
				
			||||||
 | 
						MSM_ISP_STATS_SKIN,  /* legacy based SKIN */ | 
				
			||||||
 | 
						MSM_ISP_STATS_BG,    /* Bayer Grids */ | 
				
			||||||
 | 
						MSM_ISP_STATS_BF,    /* Bayer Focus */ | 
				
			||||||
 | 
						MSM_ISP_STATS_BE,    /* Bayer Exposure*/ | 
				
			||||||
 | 
						MSM_ISP_STATS_BHIST, /* Bayer Hist */ | 
				
			||||||
 | 
						MSM_ISP_STATS_BF_SCALE,  /* Bayer Focus scale */ | 
				
			||||||
 | 
						MSM_ISP_STATS_HDR_BE,    /* HDR Bayer Exposure */ | 
				
			||||||
 | 
						MSM_ISP_STATS_HDR_BHIST, /* HDR Bayer Hist */ | 
				
			||||||
 | 
						MSM_ISP_STATS_AEC_BG,   /* AEC BG */ | 
				
			||||||
 | 
						MSM_ISP_STATS_MAX    /* MAX */ | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * @stats_type_mask: Stats type mask (enum msm_isp_stats_type). | 
				
			||||||
 | 
					 * @stream_src_mask: Stream src mask (enum msm_vfe_axi_stream_src) | 
				
			||||||
 | 
					 * @skip_mode: skip pattern, if skip mode is range only then min/max is used | 
				
			||||||
 | 
					 * @min_frame_id: minimum frame id (valid only if skip_mode = RANGE) | 
				
			||||||
 | 
					 * @max_frame_id: maximum frame id (valid only if skip_mode = RANGE) | 
				
			||||||
 | 
					*/ | 
				
			||||||
 | 
					struct msm_isp_sw_framskip { | 
				
			||||||
 | 
						uint32_t stats_type_mask; | 
				
			||||||
 | 
						uint32_t stream_src_mask; | 
				
			||||||
 | 
						enum msm_vfe_frame_skip_pattern skip_mode; | 
				
			||||||
 | 
						uint32_t min_frame_id; | 
				
			||||||
 | 
						uint32_t max_frame_id; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_testgen_color_pattern { | 
				
			||||||
 | 
						COLOR_BAR_8_COLOR, | 
				
			||||||
 | 
						UNICOLOR_WHITE, | 
				
			||||||
 | 
						UNICOLOR_YELLOW, | 
				
			||||||
 | 
						UNICOLOR_CYAN, | 
				
			||||||
 | 
						UNICOLOR_GREEN, | 
				
			||||||
 | 
						UNICOLOR_MAGENTA, | 
				
			||||||
 | 
						UNICOLOR_RED, | 
				
			||||||
 | 
						UNICOLOR_BLUE, | 
				
			||||||
 | 
						UNICOLOR_BLACK, | 
				
			||||||
 | 
						MAX_COLOR, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_camif_input { | 
				
			||||||
 | 
						CAMIF_DISABLED, | 
				
			||||||
 | 
						CAMIF_PAD_REG_INPUT, | 
				
			||||||
 | 
						CAMIF_MIDDI_INPUT, | 
				
			||||||
 | 
						CAMIF_MIPI_INPUT, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_fetch_engine_cfg { | 
				
			||||||
 | 
						uint32_t input_format; | 
				
			||||||
 | 
						uint32_t buf_width; | 
				
			||||||
 | 
						uint32_t buf_height; | 
				
			||||||
 | 
						uint32_t fetch_width; | 
				
			||||||
 | 
						uint32_t fetch_height; | 
				
			||||||
 | 
						uint32_t x_offset; | 
				
			||||||
 | 
						uint32_t y_offset; | 
				
			||||||
 | 
						uint32_t buf_stride; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_camif_output_format { | 
				
			||||||
 | 
						CAMIF_QCOM_RAW, | 
				
			||||||
 | 
						CAMIF_MIPI_RAW, | 
				
			||||||
 | 
						CAMIF_PLAIN_8, | 
				
			||||||
 | 
						CAMIF_PLAIN_16, | 
				
			||||||
 | 
						CAMIF_MAX_FORMAT, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Camif output general configuration | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					struct msm_vfe_camif_subsample_cfg { | 
				
			||||||
 | 
						uint32_t irq_subsample_period; | 
				
			||||||
 | 
						uint32_t irq_subsample_pattern; | 
				
			||||||
 | 
						uint32_t sof_counter_step; | 
				
			||||||
 | 
						uint32_t pixel_skip; | 
				
			||||||
 | 
						uint32_t line_skip; | 
				
			||||||
 | 
						uint32_t first_line; | 
				
			||||||
 | 
						uint32_t last_line; | 
				
			||||||
 | 
						uint32_t first_pixel; | 
				
			||||||
 | 
						uint32_t last_pixel; | 
				
			||||||
 | 
						enum msm_vfe_camif_output_format output_format; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Camif frame and window configuration | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					struct msm_vfe_camif_cfg { | 
				
			||||||
 | 
						uint32_t lines_per_frame; | 
				
			||||||
 | 
						uint32_t pixels_per_line; | 
				
			||||||
 | 
						uint32_t first_pixel; | 
				
			||||||
 | 
						uint32_t last_pixel; | 
				
			||||||
 | 
						uint32_t first_line; | 
				
			||||||
 | 
						uint32_t last_line; | 
				
			||||||
 | 
						uint32_t epoch_line0; | 
				
			||||||
 | 
						uint32_t epoch_line1; | 
				
			||||||
 | 
						uint32_t is_split; | 
				
			||||||
 | 
						enum msm_vfe_camif_input camif_input; | 
				
			||||||
 | 
						struct msm_vfe_camif_subsample_cfg subsample_cfg; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_testgen_cfg { | 
				
			||||||
 | 
						uint32_t lines_per_frame; | 
				
			||||||
 | 
						uint32_t pixels_per_line; | 
				
			||||||
 | 
						uint32_t v_blank; | 
				
			||||||
 | 
						uint32_t h_blank; | 
				
			||||||
 | 
						enum ISP_START_PIXEL_PATTERN pixel_bayer_pattern; | 
				
			||||||
 | 
						uint32_t rotate_period; | 
				
			||||||
 | 
						enum msm_vfe_testgen_color_pattern color_bar_pattern; | 
				
			||||||
 | 
						uint32_t burst_num_frame; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_inputmux { | 
				
			||||||
 | 
						CAMIF, | 
				
			||||||
 | 
						TESTGEN, | 
				
			||||||
 | 
						EXTERNAL_READ, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_stats_composite_group { | 
				
			||||||
 | 
						STATS_COMPOSITE_GRP_NONE, | 
				
			||||||
 | 
						STATS_COMPOSITE_GRP_1, | 
				
			||||||
 | 
						STATS_COMPOSITE_GRP_2, | 
				
			||||||
 | 
						STATS_COMPOSITE_GRP_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_hvx_streaming_cmd { | 
				
			||||||
 | 
						HVX_DISABLE, | 
				
			||||||
 | 
						HVX_ONE_WAY, | 
				
			||||||
 | 
						HVX_ROUND_TRIP | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_pix_cfg { | 
				
			||||||
 | 
						struct msm_vfe_camif_cfg camif_cfg; | 
				
			||||||
 | 
						struct msm_vfe_testgen_cfg testgen_cfg; | 
				
			||||||
 | 
						struct msm_vfe_fetch_engine_cfg fetch_engine_cfg; | 
				
			||||||
 | 
						enum msm_vfe_inputmux input_mux; | 
				
			||||||
 | 
						enum ISP_START_PIXEL_PATTERN pixel_pattern; | 
				
			||||||
 | 
						uint32_t input_format; | 
				
			||||||
 | 
						enum msm_vfe_hvx_streaming_cmd hvx_cmd; | 
				
			||||||
 | 
						uint32_t is_split; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_rdi_cfg { | 
				
			||||||
 | 
						uint8_t cid; | 
				
			||||||
 | 
						uint8_t frame_based; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_input_cfg { | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							struct msm_vfe_pix_cfg pix_cfg; | 
				
			||||||
 | 
							struct msm_vfe_rdi_cfg rdi_cfg; | 
				
			||||||
 | 
						} d; | 
				
			||||||
 | 
						enum msm_vfe_input_src input_src; | 
				
			||||||
 | 
						uint32_t input_pix_clk; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_fetch_eng_start { | 
				
			||||||
 | 
						uint32_t session_id; | 
				
			||||||
 | 
						uint32_t stream_id; | 
				
			||||||
 | 
						uint32_t buf_idx; | 
				
			||||||
 | 
						uint8_t  offline_mode; | 
				
			||||||
 | 
						uint32_t fd; | 
				
			||||||
 | 
						uint32_t buf_addr; | 
				
			||||||
 | 
						uint32_t frame_id; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_axi_plane_cfg { | 
				
			||||||
 | 
						uint32_t output_width; /*Include padding*/ | 
				
			||||||
 | 
						uint32_t output_height; | 
				
			||||||
 | 
						uint32_t output_stride; | 
				
			||||||
 | 
						uint32_t output_scan_lines; | 
				
			||||||
 | 
						uint32_t output_plane_format; /*Y/Cb/Cr/CbCr*/ | 
				
			||||||
 | 
						uint32_t plane_addr_offset; | 
				
			||||||
 | 
						uint8_t csid_src; /*RDI 0-2*/ | 
				
			||||||
 | 
						uint8_t rdi_cid;/*CID 1-16*/ | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_stream_memory_input_t { | 
				
			||||||
 | 
						MEMORY_INPUT_DISABLED, | 
				
			||||||
 | 
						MEMORY_INPUT_ENABLED | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_axi_stream_request_cmd { | 
				
			||||||
 | 
						uint32_t session_id; | 
				
			||||||
 | 
						uint32_t stream_id; | 
				
			||||||
 | 
						uint32_t vt_enable; | 
				
			||||||
 | 
						uint32_t output_format;/*Planar/RAW/Misc*/ | 
				
			||||||
 | 
						enum msm_vfe_axi_stream_src stream_src; /*CAMIF/IDEAL/RDIs*/ | 
				
			||||||
 | 
						struct msm_vfe_axi_plane_cfg plane_cfg[MAX_PLANES_PER_STREAM]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uint32_t burst_count; | 
				
			||||||
 | 
						uint32_t hfr_mode; | 
				
			||||||
 | 
						uint8_t frame_base; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uint32_t init_frame_drop; /*MAX 31 Frames*/ | 
				
			||||||
 | 
						enum msm_vfe_frame_skip_pattern frame_skip_pattern; | 
				
			||||||
 | 
						uint8_t buf_divert; /* if TRUE no vb2 buf done. */ | 
				
			||||||
 | 
						/*Return values*/ | 
				
			||||||
 | 
						uint32_t axi_stream_handle; | 
				
			||||||
 | 
						uint32_t controllable_output; | 
				
			||||||
 | 
						uint32_t burst_len; | 
				
			||||||
 | 
						/* Flag indicating memory input stream */ | 
				
			||||||
 | 
						enum msm_stream_memory_input_t memory_input; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_axi_stream_release_cmd { | 
				
			||||||
 | 
						uint32_t stream_handle; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_axi_stream_cmd { | 
				
			||||||
 | 
						STOP_STREAM, | 
				
			||||||
 | 
						START_STREAM, | 
				
			||||||
 | 
						STOP_IMMEDIATELY, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_axi_stream_cfg_cmd { | 
				
			||||||
 | 
						uint8_t num_streams; | 
				
			||||||
 | 
						uint32_t stream_handle[VFE_AXI_SRC_MAX]; | 
				
			||||||
 | 
						enum msm_vfe_axi_stream_cmd cmd; | 
				
			||||||
 | 
						uint8_t sync_frame_id_src; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_axi_stream_update_type { | 
				
			||||||
 | 
						ENABLE_STREAM_BUF_DIVERT, | 
				
			||||||
 | 
						DISABLE_STREAM_BUF_DIVERT, | 
				
			||||||
 | 
						UPDATE_STREAM_FRAMEDROP_PATTERN, | 
				
			||||||
 | 
						UPDATE_STREAM_STATS_FRAMEDROP_PATTERN, | 
				
			||||||
 | 
						UPDATE_STREAM_AXI_CONFIG, | 
				
			||||||
 | 
						UPDATE_STREAM_REQUEST_FRAMES, | 
				
			||||||
 | 
						UPDATE_STREAM_ADD_BUFQ, | 
				
			||||||
 | 
						UPDATE_STREAM_REMOVE_BUFQ, | 
				
			||||||
 | 
						UPDATE_STREAM_SW_FRAME_DROP, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_iommu_type { | 
				
			||||||
 | 
						IOMMU_ATTACH, | 
				
			||||||
 | 
						IOMMU_DETACH, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_buff_queue_id { | 
				
			||||||
 | 
						VFE_BUF_QUEUE_DEFAULT, | 
				
			||||||
 | 
						VFE_BUF_QUEUE_SHARED, | 
				
			||||||
 | 
						VFE_BUF_QUEUE_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_axi_stream_cfg_update_info { | 
				
			||||||
 | 
						uint32_t stream_handle; | 
				
			||||||
 | 
						uint32_t output_format; | 
				
			||||||
 | 
						uint32_t user_stream_id; | 
				
			||||||
 | 
						uint32_t frame_id; | 
				
			||||||
 | 
						enum msm_vfe_frame_skip_pattern skip_pattern; | 
				
			||||||
 | 
						struct msm_vfe_axi_plane_cfg plane_cfg[MAX_PLANES_PER_STREAM]; | 
				
			||||||
 | 
						struct msm_isp_sw_framskip sw_skip_info; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_axi_halt_cmd { | 
				
			||||||
 | 
						uint32_t stop_camif; | 
				
			||||||
 | 
						uint32_t overflow_detected; | 
				
			||||||
 | 
						uint32_t blocking_halt; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_axi_reset_cmd { | 
				
			||||||
 | 
						uint32_t blocking; | 
				
			||||||
 | 
						uint32_t frame_id; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_axi_restart_cmd { | 
				
			||||||
 | 
						uint32_t enable_camif; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_axi_stream_update_cmd { | 
				
			||||||
 | 
						uint32_t num_streams; | 
				
			||||||
 | 
						enum msm_vfe_axi_stream_update_type update_type; | 
				
			||||||
 | 
						struct msm_vfe_axi_stream_cfg_update_info | 
				
			||||||
 | 
										update_info[MSM_ISP_STATS_MAX]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_smmu_attach_cmd { | 
				
			||||||
 | 
						uint32_t security_mode; | 
				
			||||||
 | 
						uint32_t iommu_attach_mode; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_stats_stream_request_cmd { | 
				
			||||||
 | 
						uint32_t session_id; | 
				
			||||||
 | 
						uint32_t stream_id; | 
				
			||||||
 | 
						enum msm_isp_stats_type stats_type; | 
				
			||||||
 | 
						uint32_t composite_flag; | 
				
			||||||
 | 
						uint32_t framedrop_pattern; | 
				
			||||||
 | 
						uint32_t init_frame_drop; /*MAX 31 Frames*/ | 
				
			||||||
 | 
						uint32_t irq_subsample_pattern; | 
				
			||||||
 | 
						uint32_t buffer_offset; | 
				
			||||||
 | 
						uint32_t stream_handle; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_stats_stream_release_cmd { | 
				
			||||||
 | 
						uint32_t stream_handle; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					struct msm_vfe_stats_stream_cfg_cmd { | 
				
			||||||
 | 
						uint8_t num_streams; | 
				
			||||||
 | 
						uint32_t stream_handle[MSM_ISP_STATS_MAX]; | 
				
			||||||
 | 
						uint8_t enable; | 
				
			||||||
 | 
						uint32_t stats_burst_len; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_reg_cfg_type { | 
				
			||||||
 | 
						VFE_WRITE, | 
				
			||||||
 | 
						VFE_WRITE_MB, | 
				
			||||||
 | 
						VFE_READ, | 
				
			||||||
 | 
						VFE_CFG_MASK, | 
				
			||||||
 | 
						VFE_WRITE_DMI_16BIT, | 
				
			||||||
 | 
						VFE_WRITE_DMI_32BIT, | 
				
			||||||
 | 
						VFE_WRITE_DMI_64BIT, | 
				
			||||||
 | 
						VFE_READ_DMI_16BIT, | 
				
			||||||
 | 
						VFE_READ_DMI_32BIT, | 
				
			||||||
 | 
						VFE_READ_DMI_64BIT, | 
				
			||||||
 | 
						GET_MAX_CLK_RATE, | 
				
			||||||
 | 
						GET_CLK_RATES, | 
				
			||||||
 | 
						GET_ISP_ID, | 
				
			||||||
 | 
						VFE_HW_UPDATE_LOCK, | 
				
			||||||
 | 
						VFE_HW_UPDATE_UNLOCK, | 
				
			||||||
 | 
						SET_WM_UB_SIZE, | 
				
			||||||
 | 
						SET_UB_POLICY, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_cfg_cmd2 { | 
				
			||||||
 | 
						uint16_t num_cfg; | 
				
			||||||
 | 
						uint16_t cmd_len; | 
				
			||||||
 | 
						void __user *cfg_data; | 
				
			||||||
 | 
						void __user *cfg_cmd; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_cfg_cmd_list { | 
				
			||||||
 | 
						struct msm_vfe_cfg_cmd2      cfg_cmd; | 
				
			||||||
 | 
						struct msm_vfe_cfg_cmd_list *next; | 
				
			||||||
 | 
						uint32_t                     next_size; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_reg_rw_info { | 
				
			||||||
 | 
						uint32_t reg_offset; | 
				
			||||||
 | 
						uint32_t cmd_data_offset; | 
				
			||||||
 | 
						uint32_t len; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_reg_mask_info { | 
				
			||||||
 | 
						uint32_t reg_offset; | 
				
			||||||
 | 
						uint32_t mask; | 
				
			||||||
 | 
						uint32_t val; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_reg_dmi_info { | 
				
			||||||
 | 
						uint32_t hi_tbl_offset; /*Optional*/ | 
				
			||||||
 | 
						uint32_t lo_tbl_offset; /*Required*/ | 
				
			||||||
 | 
						uint32_t len; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_reg_cfg_cmd { | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							struct msm_vfe_reg_rw_info rw_info; | 
				
			||||||
 | 
							struct msm_vfe_reg_mask_info mask_info; | 
				
			||||||
 | 
							struct msm_vfe_reg_dmi_info dmi_info; | 
				
			||||||
 | 
						} u; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						enum msm_vfe_reg_cfg_type cmd_type; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum vfe_sd_type { | 
				
			||||||
 | 
						VFE_SD_0 = 0, | 
				
			||||||
 | 
						VFE_SD_1, | 
				
			||||||
 | 
						VFE_SD_COMMON, | 
				
			||||||
 | 
						VFE_SD_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* When you change the value below, check for the sof event_data size.
 | 
				
			||||||
 | 
					 * V4l2 limits payload to 64 bytes */ | 
				
			||||||
 | 
					#define MS_NUM_SLAVE_MAX 1 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Usecases when 2 HW need to be related or synced */ | 
				
			||||||
 | 
					enum msm_vfe_dual_hw_type { | 
				
			||||||
 | 
						DUAL_NONE = 0, | 
				
			||||||
 | 
						DUAL_HW_VFE_SPLIT = 1, | 
				
			||||||
 | 
						DUAL_HW_MASTER_SLAVE = 2, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Type for 2 INTF when used in Master-Slave mode */ | 
				
			||||||
 | 
					enum msm_vfe_dual_hw_ms_type { | 
				
			||||||
 | 
						MS_TYPE_NONE, | 
				
			||||||
 | 
						MS_TYPE_MASTER, | 
				
			||||||
 | 
						MS_TYPE_SLAVE, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_set_dual_hw_ms_cmd { | 
				
			||||||
 | 
						uint8_t num_src; | 
				
			||||||
 | 
						/* Each session can be only one type but multiple intf if YUV cam */ | 
				
			||||||
 | 
						enum msm_vfe_dual_hw_ms_type dual_hw_ms_type; | 
				
			||||||
 | 
						/* Primary intf is mostly associated with preview.
 | 
				
			||||||
 | 
						 * This primary intf SOF frame_id and timestamp is tracked | 
				
			||||||
 | 
						 * and used to calculate delta */ | 
				
			||||||
 | 
						enum msm_vfe_input_src primary_intf; | 
				
			||||||
 | 
						/* input_src array indicates other input INTF that may be Master/Slave.
 | 
				
			||||||
 | 
						 * For these additional intf, frame_id and timestamp are not saved. | 
				
			||||||
 | 
						 * However, if these are slaves then they will still get their | 
				
			||||||
 | 
						 * frame_id from Master */ | 
				
			||||||
 | 
						enum msm_vfe_input_src input_src[VFE_SRC_MAX]; | 
				
			||||||
 | 
						uint32_t sof_delta_threshold; /* In milliseconds. Sent for Master */ | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_isp_buf_type { | 
				
			||||||
 | 
						ISP_PRIVATE_BUF, | 
				
			||||||
 | 
						ISP_SHARE_BUF, | 
				
			||||||
 | 
						MAX_ISP_BUF_TYPE, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_unmap_buf_req { | 
				
			||||||
 | 
						uint32_t fd; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_buf_request { | 
				
			||||||
 | 
						uint32_t session_id; | 
				
			||||||
 | 
						uint32_t stream_id; | 
				
			||||||
 | 
						uint8_t num_buf; | 
				
			||||||
 | 
						uint32_t handle; | 
				
			||||||
 | 
						enum msm_isp_buf_type buf_type; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_qbuf_plane { | 
				
			||||||
 | 
						uint32_t addr; | 
				
			||||||
 | 
						uint32_t offset; | 
				
			||||||
 | 
						uint32_t length; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_qbuf_buffer { | 
				
			||||||
 | 
						struct msm_isp_qbuf_plane planes[MAX_PLANES_PER_STREAM]; | 
				
			||||||
 | 
						uint32_t num_planes; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_qbuf_info { | 
				
			||||||
 | 
						uint32_t handle; | 
				
			||||||
 | 
						int32_t buf_idx; | 
				
			||||||
 | 
						/*Only used for prepare buffer*/ | 
				
			||||||
 | 
						struct msm_isp_qbuf_buffer buffer; | 
				
			||||||
 | 
						/*Only used for diverted buffer*/ | 
				
			||||||
 | 
						uint32_t dirty_buf; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_clk_rates { | 
				
			||||||
 | 
						uint32_t svs_rate; | 
				
			||||||
 | 
						uint32_t nominal_rate; | 
				
			||||||
 | 
						uint32_t high_rate; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_vfe_axi_src_state { | 
				
			||||||
 | 
						enum msm_vfe_input_src input_src; | 
				
			||||||
 | 
						uint32_t src_active; | 
				
			||||||
 | 
						uint32_t src_frame_id; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_isp_event_mask_index { | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_STATS_NOTIFY		= 0, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_ERROR			= 1, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_IOMMU_P_FAULT		= 2, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_STREAM_UPDATE_DONE		= 3, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_REG_UPDATE			= 4, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_SOF			= 5, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_BUF_DIVERT			= 6, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_COMP_STATS_NOTIFY		= 7, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_MASK_FE_READ_DONE		= 8, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_BUF_DONE			= 9, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_REG_UPDATE_MISSING		= 10, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_PING_PONG_MISMATCH		= 11, | 
				
			||||||
 | 
						ISP_EVENT_MASK_INDEX_BUF_FATAL_ERROR		= 12, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_NONE			0 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_STATS_NOTIFY \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_STATS_NOTIFY) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_ERROR \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_ERROR) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_IOMMU_P_FAULT \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_IOMMU_P_FAULT) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_STREAM_UPDATE_DONE \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_STREAM_UPDATE_DONE) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_REG_UPDATE \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_REG_UPDATE) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_SOF \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_SOF) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_BUF_DIVERT \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_BUF_DIVERT) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_COMP_STATS_NOTIFY \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_COMP_STATS_NOTIFY) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_FE_READ_DONE \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_MASK_FE_READ_DONE) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_BUF_DONE \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_BUF_DONE) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_REG_UPDATE_MISSING \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_REG_UPDATE_MISSING) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_PING_PONG_MISMATCH \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_PING_PONG_MISMATCH) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_SUBS_MASK_BUF_FATAL_ERROR \ | 
				
			||||||
 | 
								(1 << ISP_EVENT_MASK_INDEX_BUF_FATAL_ERROR) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_isp_event_idx { | 
				
			||||||
 | 
						ISP_REG_UPDATE        = 0, | 
				
			||||||
 | 
						ISP_EPOCH_0           = 1, | 
				
			||||||
 | 
						ISP_EPOCH_1           = 2, | 
				
			||||||
 | 
						ISP_START_ACK         = 3, | 
				
			||||||
 | 
						ISP_STOP_ACK          = 4, | 
				
			||||||
 | 
						ISP_IRQ_VIOLATION     = 5, | 
				
			||||||
 | 
						ISP_STATS_OVERFLOW    = 6, | 
				
			||||||
 | 
						ISP_BUF_DONE          = 7, | 
				
			||||||
 | 
						ISP_FE_RD_DONE        = 8, | 
				
			||||||
 | 
						ISP_IOMMU_P_FAULT     = 9, | 
				
			||||||
 | 
						ISP_ERROR             = 10, | 
				
			||||||
 | 
						ISP_HW_FATAL_ERROR      = 11, | 
				
			||||||
 | 
						ISP_PING_PONG_MISMATCH = 12, | 
				
			||||||
 | 
						ISP_REG_UPDATE_MISSING = 13, | 
				
			||||||
 | 
						ISP_BUF_FATAL_ERROR = 14, | 
				
			||||||
 | 
						ISP_EVENT_MAX         = 15 | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ISP_EVENT_OFFSET          8 | 
				
			||||||
 | 
					#define ISP_EVENT_BASE            (V4L2_EVENT_PRIVATE_START) | 
				
			||||||
 | 
					#define ISP_BUF_EVENT_BASE        (ISP_EVENT_BASE + (1 << ISP_EVENT_OFFSET)) | 
				
			||||||
 | 
					#define ISP_STATS_EVENT_BASE      (ISP_EVENT_BASE + (2 << ISP_EVENT_OFFSET)) | 
				
			||||||
 | 
					#define ISP_CAMIF_EVENT_BASE      (ISP_EVENT_BASE + (3 << ISP_EVENT_OFFSET)) | 
				
			||||||
 | 
					#define ISP_STREAM_EVENT_BASE     (ISP_EVENT_BASE + (4 << ISP_EVENT_OFFSET)) | 
				
			||||||
 | 
					#define ISP_EVENT_REG_UPDATE      (ISP_EVENT_BASE + ISP_REG_UPDATE) | 
				
			||||||
 | 
					#define ISP_EVENT_EPOCH_0         (ISP_EVENT_BASE + ISP_EPOCH_0) | 
				
			||||||
 | 
					#define ISP_EVENT_EPOCH_1         (ISP_EVENT_BASE + ISP_EPOCH_1) | 
				
			||||||
 | 
					#define ISP_EVENT_START_ACK       (ISP_EVENT_BASE + ISP_START_ACK) | 
				
			||||||
 | 
					#define ISP_EVENT_STOP_ACK        (ISP_EVENT_BASE + ISP_STOP_ACK) | 
				
			||||||
 | 
					#define ISP_EVENT_IRQ_VIOLATION   (ISP_EVENT_BASE + ISP_IRQ_VIOLATION) | 
				
			||||||
 | 
					#define ISP_EVENT_STATS_OVERFLOW  (ISP_EVENT_BASE + ISP_STATS_OVERFLOW) | 
				
			||||||
 | 
					#define ISP_EVENT_ERROR           (ISP_EVENT_BASE + ISP_ERROR) | 
				
			||||||
 | 
					#define ISP_EVENT_SOF             (ISP_CAMIF_EVENT_BASE) | 
				
			||||||
 | 
					#define ISP_EVENT_EOF             (ISP_CAMIF_EVENT_BASE + 1) | 
				
			||||||
 | 
					#define ISP_EVENT_BUF_DONE        (ISP_EVENT_BASE + ISP_BUF_DONE) | 
				
			||||||
 | 
					#define ISP_EVENT_BUF_DIVERT      (ISP_BUF_EVENT_BASE) | 
				
			||||||
 | 
					#define ISP_EVENT_STATS_NOTIFY    (ISP_STATS_EVENT_BASE) | 
				
			||||||
 | 
					#define ISP_EVENT_COMP_STATS_NOTIFY (ISP_EVENT_STATS_NOTIFY + MSM_ISP_STATS_MAX) | 
				
			||||||
 | 
					#define ISP_EVENT_FE_READ_DONE    (ISP_EVENT_BASE + ISP_FE_RD_DONE) | 
				
			||||||
 | 
					#define ISP_EVENT_IOMMU_P_FAULT   (ISP_EVENT_BASE + ISP_IOMMU_P_FAULT) | 
				
			||||||
 | 
					#define ISP_EVENT_HW_FATAL_ERROR  (ISP_EVENT_BASE + ISP_HW_FATAL_ERROR) | 
				
			||||||
 | 
					#define ISP_EVENT_PING_PONG_MISMATCH (ISP_EVENT_BASE + ISP_PING_PONG_MISMATCH) | 
				
			||||||
 | 
					#define ISP_EVENT_REG_UPDATE_MISSING (ISP_EVENT_BASE + ISP_REG_UPDATE_MISSING) | 
				
			||||||
 | 
					#define ISP_EVENT_BUF_FATAL_ERROR (ISP_EVENT_BASE + ISP_BUF_FATAL_ERROR) | 
				
			||||||
 | 
					#define ISP_EVENT_STREAM_UPDATE_DONE   (ISP_STREAM_EVENT_BASE) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The msm_v4l2_event_data structure should match the
 | 
				
			||||||
 | 
					 * v4l2_event.u.data field. | 
				
			||||||
 | 
					 * should not exceed 64 bytes */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_buf_event { | 
				
			||||||
 | 
						uint32_t session_id; | 
				
			||||||
 | 
						uint32_t stream_id; | 
				
			||||||
 | 
						uint32_t handle; | 
				
			||||||
 | 
						uint32_t output_format; | 
				
			||||||
 | 
						int8_t buf_idx; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					struct msm_isp_fetch_eng_event { | 
				
			||||||
 | 
						uint32_t session_id; | 
				
			||||||
 | 
						uint32_t stream_id; | 
				
			||||||
 | 
						uint32_t handle; | 
				
			||||||
 | 
						uint32_t fd; | 
				
			||||||
 | 
						int8_t buf_idx; | 
				
			||||||
 | 
						int8_t offline_mode; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					struct msm_isp_stats_event { | 
				
			||||||
 | 
						uint32_t stats_mask;                        /* 4 bytes */ | 
				
			||||||
 | 
						uint8_t stats_buf_idxs[MSM_ISP_STATS_MAX];  /* 11 bytes */ | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_stream_ack { | 
				
			||||||
 | 
						uint32_t session_id; | 
				
			||||||
 | 
						uint32_t stream_id; | 
				
			||||||
 | 
						uint32_t handle; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_vfe_error_type { | 
				
			||||||
 | 
						ISP_ERROR_NONE, | 
				
			||||||
 | 
						ISP_ERROR_CAMIF, | 
				
			||||||
 | 
						ISP_ERROR_BUS_OVERFLOW, | 
				
			||||||
 | 
						ISP_ERROR_RETURN_EMPTY_BUFFER, | 
				
			||||||
 | 
						ISP_ERROR_FRAME_ID_MISMATCH, | 
				
			||||||
 | 
						ISP_ERROR_MAX, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_error_info { | 
				
			||||||
 | 
						enum msm_vfe_error_type err_type; | 
				
			||||||
 | 
						uint32_t session_id; | 
				
			||||||
 | 
						uint32_t stream_id; | 
				
			||||||
 | 
						uint32_t stream_id_mask; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This structure reports delta between master and slave */ | 
				
			||||||
 | 
					struct msm_isp_ms_delta_info { | 
				
			||||||
 | 
						uint8_t num_delta_info; | 
				
			||||||
 | 
						uint32_t delta[MS_NUM_SLAVE_MAX]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This is sent in EPOCH irq */ | 
				
			||||||
 | 
					struct msm_isp_output_info { | 
				
			||||||
 | 
						uint8_t regs_not_updated; | 
				
			||||||
 | 
						/* mask with bufq_handle for regs not updated or return empty */ | 
				
			||||||
 | 
						uint16_t output_err_mask; | 
				
			||||||
 | 
						/* mask with stream_idx for get_buf failed */ | 
				
			||||||
 | 
						uint8_t stream_framedrop_mask; | 
				
			||||||
 | 
						/* mask with stats stream_idx for get_buf failed */ | 
				
			||||||
 | 
						uint16_t stats_framedrop_mask; | 
				
			||||||
 | 
						/* delta between master and slave */ | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This structure is piggybacked with SOF event */ | 
				
			||||||
 | 
					struct msm_isp_sof_info { | 
				
			||||||
 | 
						uint8_t regs_not_updated; | 
				
			||||||
 | 
						/* mask with AXI_SRC for regs not updated */ | 
				
			||||||
 | 
						uint16_t reg_update_fail_mask; | 
				
			||||||
 | 
						/* mask with bufq_handle for get_buf failed */ | 
				
			||||||
 | 
						uint32_t stream_get_buf_fail_mask; | 
				
			||||||
 | 
						/* mask with stats stream_idx for get_buf failed */ | 
				
			||||||
 | 
						uint16_t stats_get_buf_fail_mask; | 
				
			||||||
 | 
						/* delta between master and slave */ | 
				
			||||||
 | 
						struct msm_isp_ms_delta_info ms_delta_info; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_event_data { | 
				
			||||||
 | 
						/*Wall clock except for buffer divert events
 | 
				
			||||||
 | 
						 *which use monotonic clock | 
				
			||||||
 | 
						 */ | 
				
			||||||
 | 
						struct timeval timestamp; | 
				
			||||||
 | 
						/* Monotonic timestamp since bootup */ | 
				
			||||||
 | 
						struct timeval mono_timestamp; | 
				
			||||||
 | 
						uint32_t frame_id; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							/* Sent for Stats_Done event */ | 
				
			||||||
 | 
							struct msm_isp_stats_event stats; | 
				
			||||||
 | 
							/* Sent for Buf_Divert event */ | 
				
			||||||
 | 
							struct msm_isp_buf_event buf_done; | 
				
			||||||
 | 
							/* Sent for offline fetch done event */ | 
				
			||||||
 | 
							struct msm_isp_fetch_eng_event fetch_done; | 
				
			||||||
 | 
							/* Sent for Error_Event */ | 
				
			||||||
 | 
							struct msm_isp_error_info error_info; | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * This struct needs to be removed once | 
				
			||||||
 | 
							 * userspace switches to sof_info | 
				
			||||||
 | 
							 */ | 
				
			||||||
 | 
							struct msm_isp_output_info output_info; | 
				
			||||||
 | 
							/* Sent for SOF event */ | 
				
			||||||
 | 
							struct msm_isp_sof_info sof_info; | 
				
			||||||
 | 
						} u; /* union can have max 52 bytes */ | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_COMPAT | 
				
			||||||
 | 
					struct msm_isp_event_data32 { | 
				
			||||||
 | 
						struct compat_timeval timestamp; | 
				
			||||||
 | 
						struct compat_timeval mono_timestamp; | 
				
			||||||
 | 
						uint32_t frame_id; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							struct msm_isp_stats_event stats; | 
				
			||||||
 | 
							struct msm_isp_buf_event buf_done; | 
				
			||||||
 | 
							struct msm_isp_fetch_eng_event fetch_done; | 
				
			||||||
 | 
							struct msm_isp_error_info error_info; | 
				
			||||||
 | 
							struct msm_isp_output_info output_info; | 
				
			||||||
 | 
							struct msm_isp_sof_info sof_info; | 
				
			||||||
 | 
						} u; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QBGGR8  v4l2_fourcc('Q', 'B', 'G', '8') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QGBRG8  v4l2_fourcc('Q', 'G', 'B', '8') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QGRBG8  v4l2_fourcc('Q', 'G', 'R', '8') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QRGGB8  v4l2_fourcc('Q', 'R', 'G', '8') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QBGGR10 v4l2_fourcc('Q', 'B', 'G', '0') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QGBRG10 v4l2_fourcc('Q', 'G', 'B', '0') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QGRBG10 v4l2_fourcc('Q', 'G', 'R', '0') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QRGGB10 v4l2_fourcc('Q', 'R', 'G', '0') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QBGGR12 v4l2_fourcc('Q', 'B', 'G', '2') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QGBRG12 v4l2_fourcc('Q', 'G', 'B', '2') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QGRBG12 v4l2_fourcc('Q', 'G', 'R', '2') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QRGGB12 v4l2_fourcc('Q', 'R', 'G', '2') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QBGGR14 v4l2_fourcc('Q', 'B', 'G', '4') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QGBRG14 v4l2_fourcc('Q', 'G', 'B', '4') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QGRBG14 v4l2_fourcc('Q', 'G', 'R', '4') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_QRGGB14 v4l2_fourcc('Q', 'R', 'G', '4') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_P16BGGR10 v4l2_fourcc('P', 'B', 'G', '0') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_P16GBRG10 v4l2_fourcc('P', 'G', 'B', '0') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_P16GRBG10 v4l2_fourcc('P', 'G', 'R', '0') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_P16RGGB10 v4l2_fourcc('P', 'R', 'G', '0') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_NV14 v4l2_fourcc('N', 'V', '1', '4') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_NV41 v4l2_fourcc('N', 'V', '4', '1') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_META v4l2_fourcc('Q', 'M', 'E', 'T') | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_SBGGR14 v4l2_fourcc('B', 'G', '1', '4') /* 14 BGBG.GRGR.*/ | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_SGBRG14 v4l2_fourcc('G', 'B', '1', '4') /* 14 GBGB.RGRG.*/ | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_SGRBG14 v4l2_fourcc('B', 'A', '1', '4') /* 14 GRGR.BGBG.*/ | 
				
			||||||
 | 
					#define V4L2_PIX_FMT_SRGGB14 v4l2_fourcc('R', 'G', '1', '4') /* 14 RGRG.GBGB.*/ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_VFE_REG_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE, struct msm_vfe_cfg_cmd2) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_REQUEST_BUF \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+1, struct msm_isp_buf_request) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_ENQUEUE_BUF \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+2, struct msm_isp_qbuf_info) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_RELEASE_BUF \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+3, struct msm_isp_buf_request) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_REQUEST_STREAM \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+4, struct msm_vfe_axi_stream_request_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_CFG_STREAM \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+5, struct msm_vfe_axi_stream_cfg_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_RELEASE_STREAM \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+6, struct msm_vfe_axi_stream_release_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_INPUT_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+7, struct msm_vfe_input_cfg) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_SET_SRC_STATE \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+8, struct msm_vfe_axi_src_state) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_REQUEST_STATS_STREAM \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+9, \
 | 
				
			||||||
 | 
						struct msm_vfe_stats_stream_request_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_CFG_STATS_STREAM \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+10, struct msm_vfe_stats_stream_cfg_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_RELEASE_STATS_STREAM \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+11, \
 | 
				
			||||||
 | 
						struct msm_vfe_stats_stream_release_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_REG_UPDATE_CMD \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+12, enum msm_vfe_input_src) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_UPDATE_STREAM \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+13, struct msm_vfe_axi_stream_update_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_VFE_REG_LIST_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+14, struct msm_vfe_cfg_cmd_list) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_SMMU_ATTACH \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+15, struct msm_vfe_smmu_attach_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_UPDATE_STATS_STREAM \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+16, struct msm_vfe_axi_stream_update_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_AXI_HALT \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+17, struct msm_vfe_axi_halt_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_AXI_RESET \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+18, struct msm_vfe_axi_reset_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_AXI_RESTART \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+19, struct msm_vfe_axi_restart_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_FETCH_ENG_START \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+20, struct msm_vfe_fetch_eng_start) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_DEQUEUE_BUF \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+21, struct msm_isp_qbuf_info) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_SET_DUAL_HW_MASTER_SLAVE \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+22, struct msm_isp_set_dual_hw_ms_cmd) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_MAP_BUF_START_FE \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+23, struct msm_vfe_fetch_eng_start) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISP_UNMAP_BUF \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE+24, struct msm_isp_unmap_buf_req) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* __MSMB_ISP__ */ | 
				
			||||||
@ -0,0 +1,125 @@ | 
				
			|||||||
 | 
					#ifndef MSM_CAM_ISPIF_H | 
				
			||||||
 | 
					#define MSM_CAM_ISPIF_H | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CSID_VERSION_V20                      0x02000011 | 
				
			||||||
 | 
					#define CSID_VERSION_V22                      0x02001000 | 
				
			||||||
 | 
					#define CSID_VERSION_V30                      0x30000000 | 
				
			||||||
 | 
					#define CSID_VERSION_V3                      0x30000000 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_ispif_vfe_intf { | 
				
			||||||
 | 
						VFE0, | 
				
			||||||
 | 
						VFE1, | 
				
			||||||
 | 
						VFE_MAX | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					#define VFE0_MASK    (1 << VFE0) | 
				
			||||||
 | 
					#define VFE1_MASK    (1 << VFE1) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_ispif_intftype { | 
				
			||||||
 | 
						PIX0, | 
				
			||||||
 | 
						RDI0, | 
				
			||||||
 | 
						PIX1, | 
				
			||||||
 | 
						RDI1, | 
				
			||||||
 | 
						RDI2, | 
				
			||||||
 | 
						INTF_MAX | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					#define MAX_PARAM_ENTRIES (INTF_MAX * 2) | 
				
			||||||
 | 
					#define MAX_CID_CH	8 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PIX0_MASK (1 << PIX0) | 
				
			||||||
 | 
					#define PIX1_MASK (1 << PIX1) | 
				
			||||||
 | 
					#define RDI0_MASK (1 << RDI0) | 
				
			||||||
 | 
					#define RDI1_MASK (1 << RDI1) | 
				
			||||||
 | 
					#define RDI2_MASK (1 << RDI2) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_ispif_vc { | 
				
			||||||
 | 
						VC0, | 
				
			||||||
 | 
						VC1, | 
				
			||||||
 | 
						VC2, | 
				
			||||||
 | 
						VC3, | 
				
			||||||
 | 
						VC_MAX | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_ispif_cid { | 
				
			||||||
 | 
						CID0, | 
				
			||||||
 | 
						CID1, | 
				
			||||||
 | 
						CID2, | 
				
			||||||
 | 
						CID3, | 
				
			||||||
 | 
						CID4, | 
				
			||||||
 | 
						CID5, | 
				
			||||||
 | 
						CID6, | 
				
			||||||
 | 
						CID7, | 
				
			||||||
 | 
						CID8, | 
				
			||||||
 | 
						CID9, | 
				
			||||||
 | 
						CID10, | 
				
			||||||
 | 
						CID11, | 
				
			||||||
 | 
						CID12, | 
				
			||||||
 | 
						CID13, | 
				
			||||||
 | 
						CID14, | 
				
			||||||
 | 
						CID15, | 
				
			||||||
 | 
						CID_MAX | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum msm_ispif_csid { | 
				
			||||||
 | 
						CSID0, | 
				
			||||||
 | 
						CSID1, | 
				
			||||||
 | 
						CSID2, | 
				
			||||||
 | 
						CSID3, | 
				
			||||||
 | 
						CSID_MAX | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_ispif_params_entry { | 
				
			||||||
 | 
						enum msm_ispif_vfe_intf vfe_intf; | 
				
			||||||
 | 
						enum msm_ispif_intftype intftype; | 
				
			||||||
 | 
						int num_cids; | 
				
			||||||
 | 
						enum msm_ispif_cid cids[3]; | 
				
			||||||
 | 
						enum msm_ispif_csid csid; | 
				
			||||||
 | 
						int crop_enable; | 
				
			||||||
 | 
						uint16_t crop_start_pixel; | 
				
			||||||
 | 
						uint16_t crop_end_pixel; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_ispif_param_data { | 
				
			||||||
 | 
						uint32_t num; | 
				
			||||||
 | 
						struct msm_ispif_params_entry entries[MAX_PARAM_ENTRIES]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_isp_info { | 
				
			||||||
 | 
						uint32_t max_resolution; | 
				
			||||||
 | 
						uint32_t id; | 
				
			||||||
 | 
						uint32_t ver; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct msm_ispif_vfe_info { | 
				
			||||||
 | 
						int num_vfe; | 
				
			||||||
 | 
						struct msm_isp_info info[VFE_MAX]; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum ispif_cfg_type_t { | 
				
			||||||
 | 
						ISPIF_CLK_ENABLE, | 
				
			||||||
 | 
						ISPIF_CLK_DISABLE, | 
				
			||||||
 | 
						ISPIF_INIT, | 
				
			||||||
 | 
						ISPIF_CFG, | 
				
			||||||
 | 
						ISPIF_START_FRAME_BOUNDARY, | 
				
			||||||
 | 
						ISPIF_RESTART_FRAME_BOUNDARY, | 
				
			||||||
 | 
						ISPIF_STOP_FRAME_BOUNDARY, | 
				
			||||||
 | 
						ISPIF_STOP_IMMEDIATELY, | 
				
			||||||
 | 
						ISPIF_RELEASE, | 
				
			||||||
 | 
						ISPIF_ENABLE_REG_DUMP, | 
				
			||||||
 | 
						ISPIF_SET_VFE_INFO, | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ispif_cfg_data { | 
				
			||||||
 | 
						enum ispif_cfg_type_t cfg_type; | 
				
			||||||
 | 
						union { | 
				
			||||||
 | 
							int reg_dump;                        /* ISPIF_ENABLE_REG_DUMP */ | 
				
			||||||
 | 
							uint32_t csid_version;               /* ISPIF_INIT */ | 
				
			||||||
 | 
							struct msm_ispif_vfe_info vfe_info;  /* ISPIF_SET_VFE_INFO */ | 
				
			||||||
 | 
							struct msm_ispif_param_data params;  /* CFG, START, STOP */ | 
				
			||||||
 | 
						}; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VIDIOC_MSM_ISPIF_CFG \ | 
				
			||||||
 | 
						_IOWR('V', BASE_VIDIOC_PRIVATE, struct ispif_cfg_data) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* MSM_CAM_ISPIF_H */ | 
				
			||||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						@ -0,0 +1,72 @@ | 
				
			|||||||
 | 
					#!/usr/bin/env python3 | 
				
			||||||
 | 
					import os | 
				
			||||||
 | 
					import json | 
				
			||||||
 | 
					import signal | 
				
			||||||
 | 
					import subprocess | 
				
			||||||
 | 
					import time | 
				
			||||||
 | 
					from PIL import Image | 
				
			||||||
 | 
					from common.basedir import BASEDIR | 
				
			||||||
 | 
					from common.params import Params | 
				
			||||||
 | 
					from selfdrive.camerad.snapshot.visionipc import VisionIPC | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					with open(BASEDIR + "/selfdrive/controls/lib/alerts_offroad.json") as json_file: | 
				
			||||||
 | 
					   OFFROAD_ALERTS = json.load(json_file) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def jpeg_write(fn, dat): | 
				
			||||||
 | 
					  img = Image.fromarray(dat) | 
				
			||||||
 | 
					  img.save(fn, "JPEG") | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def snapshot(): | 
				
			||||||
 | 
					  params = Params() | 
				
			||||||
 | 
					  front_camera_allowed = int(params.get("RecordFront")) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  params.put("IsTakingSnapshot", "1") | 
				
			||||||
 | 
					  params.put("Offroad_IsTakingSnapshot", json.dumps(OFFROAD_ALERTS["Offroad_IsTakingSnapshot"])) | 
				
			||||||
 | 
					  time.sleep(2.0)  # Give thermald time to read the param, or if just started give camerad time to start | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Check if camerad is already started | 
				
			||||||
 | 
					  ps = subprocess.Popen("ps | grep camerad", shell=True, stdout=subprocess.PIPE) | 
				
			||||||
 | 
					  ret = list(filter(lambda x: 'grep ' not in x, ps.communicate()[0].decode('utf-8').strip().split("\n"))) | 
				
			||||||
 | 
					  if len(ret) > 0: | 
				
			||||||
 | 
					    params.put("IsTakingSnapshot", "0") | 
				
			||||||
 | 
					    params.delete("Offroad_IsTakingSnapshot") | 
				
			||||||
 | 
					    return None | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  proc = subprocess.Popen(os.path.join(BASEDIR, "selfdrive/camerad/camerad"), cwd=os.path.join(BASEDIR, "selfdrive/camerad")) | 
				
			||||||
 | 
					  time.sleep(3.0) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ret = None | 
				
			||||||
 | 
					  start_time = time.time() | 
				
			||||||
 | 
					  while time.time() - start_time < 5.0: | 
				
			||||||
 | 
					    try: | 
				
			||||||
 | 
					      ipc = VisionIPC() | 
				
			||||||
 | 
					      pic = ipc.get() | 
				
			||||||
 | 
					      del ipc | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if front_camera_allowed: | 
				
			||||||
 | 
					        ipc_front = VisionIPC(front=True) | 
				
			||||||
 | 
					        fpic = ipc_front.get() | 
				
			||||||
 | 
					        del ipc_front | 
				
			||||||
 | 
					      else: | 
				
			||||||
 | 
					        fpic = None | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      ret = pic, fpic | 
				
			||||||
 | 
					      break | 
				
			||||||
 | 
					    except Exception: | 
				
			||||||
 | 
					      time.sleep(1) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  proc.send_signal(signal.SIGINT) | 
				
			||||||
 | 
					  proc.communicate() | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  params.put("IsTakingSnapshot", "0") | 
				
			||||||
 | 
					  params.delete("Offroad_IsTakingSnapshot") | 
				
			||||||
 | 
					  return ret | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__": | 
				
			||||||
 | 
					  pic, fpic = snapshot() | 
				
			||||||
 | 
					  print(pic.shape) | 
				
			||||||
 | 
					  jpeg_write("/tmp/back.jpg", pic) | 
				
			||||||
 | 
					  jpeg_write("/tmp/front.jpg", fpic) | 
				
			||||||
@ -0,0 +1,93 @@ | 
				
			|||||||
 | 
					#!/usr/bin/env python3 | 
				
			||||||
 | 
					import os | 
				
			||||||
 | 
					from cffi import FFI | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import numpy as np | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gf_dir = os.path.dirname(os.path.abspath(__file__)) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ffi = FFI() | 
				
			||||||
 | 
					ffi.cdef(""" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum VisionStreamType { | 
				
			||||||
 | 
					  VISION_STREAM_RGB_BACK, | 
				
			||||||
 | 
					  VISION_STREAM_RGB_FRONT, | 
				
			||||||
 | 
					  VISION_STREAM_YUV, | 
				
			||||||
 | 
					  VISION_STREAM_YUV_FRONT, | 
				
			||||||
 | 
					  VISION_STREAM_MAX, | 
				
			||||||
 | 
					} VisionStreamType; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct VisionUIInfo { | 
				
			||||||
 | 
					  int big_box_x, big_box_y; | 
				
			||||||
 | 
					  int big_box_width, big_box_height; | 
				
			||||||
 | 
					  int transformed_width, transformed_height; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int front_box_x, front_box_y; | 
				
			||||||
 | 
					  int front_box_width, front_box_height; | 
				
			||||||
 | 
					} VisionUIInfo; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct VisionStreamBufs { | 
				
			||||||
 | 
					  VisionStreamType type; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int width, height, stride; | 
				
			||||||
 | 
					  size_t buf_len; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  union { | 
				
			||||||
 | 
					    VisionUIInfo ui_info; | 
				
			||||||
 | 
					  } buf_info; | 
				
			||||||
 | 
					} VisionStreamBufs; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct VIPCBuf { | 
				
			||||||
 | 
					  int fd; | 
				
			||||||
 | 
					  size_t len; | 
				
			||||||
 | 
					  void* addr; | 
				
			||||||
 | 
					} VIPCBuf; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct VIPCBufExtra { | 
				
			||||||
 | 
					  // only for yuv | 
				
			||||||
 | 
					  uint32_t frame_id; | 
				
			||||||
 | 
					  uint64_t timestamp_eof; | 
				
			||||||
 | 
					} VIPCBufExtra; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct VisionStream { | 
				
			||||||
 | 
					  int ipc_fd; | 
				
			||||||
 | 
					  int last_idx; | 
				
			||||||
 | 
					  int last_type; | 
				
			||||||
 | 
					  int num_bufs; | 
				
			||||||
 | 
					  VisionStreamBufs bufs_info; | 
				
			||||||
 | 
					  VIPCBuf *bufs; | 
				
			||||||
 | 
					} VisionStream; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int visionstream_init(VisionStream *s, VisionStreamType type, bool tbuffer, VisionStreamBufs *out_bufs_info); | 
				
			||||||
 | 
					VIPCBuf* visionstream_get(VisionStream *s, VIPCBufExtra *out_extra); | 
				
			||||||
 | 
					void visionstream_destroy(VisionStream *s); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					""" | 
				
			||||||
 | 
					) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class VisionIPCError(Exception): | 
				
			||||||
 | 
					  pass | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class VisionIPC(): | 
				
			||||||
 | 
					  def __init__(self, front=False): | 
				
			||||||
 | 
					    self.clib = ffi.dlopen(os.path.join(gf_dir, "libvisionipc.so")) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    self.s = ffi.new("VisionStream*") | 
				
			||||||
 | 
					    self.buf_info = ffi.new("VisionStreamBufs*") | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    err = self.clib.visionstream_init(self.s, self.clib.VISION_STREAM_RGB_FRONT if front else self.clib.VISION_STREAM_RGB_BACK, True, self.buf_info) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if err != 0: | 
				
			||||||
 | 
					      self.clib.visionstream_destroy(self.s) | 
				
			||||||
 | 
					      raise VisionIPCError | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def __del__(self): | 
				
			||||||
 | 
					    self.clib.visionstream_destroy(self.s) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def get(self): | 
				
			||||||
 | 
					    buf = self.clib.visionstream_get(self.s, ffi.NULL) | 
				
			||||||
 | 
					    pbuf = ffi.buffer(buf.addr, buf.len) | 
				
			||||||
 | 
					    ret = np.frombuffer(pbuf, dtype=np.uint8).reshape((-1, self.buf_info.stride//3, 3)) | 
				
			||||||
 | 
					    return ret[:self.buf_info.height, :self.buf_info.width, [2,1,0]] | 
				
			||||||
@ -0,0 +1,48 @@ | 
				
			|||||||
 | 
					#include <stdio.h> | 
				
			||||||
 | 
					#include <stdarg.h> | 
				
			||||||
 | 
					#include <stdbool.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "camera_qcom.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool do_exit = false; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void cloudlog_e(int levelnum, const char* filename, int lineno, const char* func, | 
				
			||||||
 | 
					                const char* fmt, ...) { | 
				
			||||||
 | 
					  va_list args; | 
				
			||||||
 | 
					  va_start(args, fmt); | 
				
			||||||
 | 
					  vprintf(fmt, args); | 
				
			||||||
 | 
					  printf("\n"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void set_thread_name(const char* name) { | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// tbuffers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void tbuffer_init2(TBuffer *tb, int num_bufs, const char* name, | 
				
			||||||
 | 
					                   void (*release_cb)(void* c, int idx), | 
				
			||||||
 | 
					                   void* cb_cookie) { | 
				
			||||||
 | 
					  printf("tbuffer_init2\n"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void tbuffer_dispatch(TBuffer *tb, int idx) { | 
				
			||||||
 | 
					  printf("tbuffer_dispatch\n"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void tbuffer_stop(TBuffer *tb) { | 
				
			||||||
 | 
					  printf("tbuffer_stop\n"); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main() { | 
				
			||||||
 | 
					  DualCameraState s; | 
				
			||||||
 | 
					  cameras_init(&s); | 
				
			||||||
 | 
					  VisionBuf camera_bufs_rear[0x10] = {0}; | 
				
			||||||
 | 
					  VisionBuf camera_bufs_focus[0x10] = {0}; | 
				
			||||||
 | 
					  VisionBuf camera_bufs_stats[0x10] = {0}; | 
				
			||||||
 | 
					  VisionBuf camera_bufs_front[0x10] = {0}; | 
				
			||||||
 | 
					  cameras_open(&s, | 
				
			||||||
 | 
					    camera_bufs_rear, camera_bufs_focus, | 
				
			||||||
 | 
					    camera_bufs_stats, camera_bufs_front); | 
				
			||||||
 | 
					  cameras_close(&s); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,10 @@ | 
				
			|||||||
 | 
					#!/bin/sh | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gcc -DQCOM -I ~/one -I ~/one/selfdrive -I ../../include \ | 
				
			||||||
 | 
					  -I ~/one/phonelibs/android_system_core/include -I ~/one/phonelibs/opencl/include \ | 
				
			||||||
 | 
					  -I ~/one/selfdrive/visiond/cameras \ | 
				
			||||||
 | 
					  test.c ../../cameras/camera_qcom.c \ | 
				
			||||||
 | 
					  -l:libczmq.a -l:libzmq.a -lgnustl_shared -lm -llog -lcutils \ | 
				
			||||||
 | 
					  -l:libcapn.a -l:libcapnp.a -l:libkj.a \ | 
				
			||||||
 | 
					  ~/one/cereal/gen/c/log.capnp.o | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,40 @@ | 
				
			|||||||
 | 
					#!/usr/bin/env python3 | 
				
			||||||
 | 
					import time | 
				
			||||||
 | 
					import numpy as np | 
				
			||||||
 | 
					import cereal.messaging as messaging | 
				
			||||||
 | 
					from PIL import ImageFont, ImageDraw, Image | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					font = ImageFont.truetype("arial", size=72) | 
				
			||||||
 | 
					def get_frame(idx): | 
				
			||||||
 | 
					  img = np.zeros((874, 1164, 3), np.uint8) | 
				
			||||||
 | 
					  img[100:400, 100:100+(idx%10)*100] = 255 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # big number | 
				
			||||||
 | 
					  im2 = Image.new("RGB", (200,200)) | 
				
			||||||
 | 
					  draw = ImageDraw.Draw(im2) | 
				
			||||||
 | 
					  draw.text((10, 100), "%02d" % idx, font=font) | 
				
			||||||
 | 
					  img[400:600, 400:600] = np.array(im2.getdata()).reshape((200,200,3)) | 
				
			||||||
 | 
					  return img.tostring() | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__": | 
				
			||||||
 | 
					  from common.realtime import Ratekeeper | 
				
			||||||
 | 
					  rk = Ratekeeper(20) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pm = messaging.PubMaster(['frame']) | 
				
			||||||
 | 
					  frm = [get_frame(x) for x in range(30)] | 
				
			||||||
 | 
					  idx = 0 | 
				
			||||||
 | 
					  while 1: | 
				
			||||||
 | 
					    print("send %d" % idx) | 
				
			||||||
 | 
					    dat = messaging.new_message() | 
				
			||||||
 | 
					    dat.init('frame') | 
				
			||||||
 | 
					    dat.valid = True | 
				
			||||||
 | 
					    dat.frame = { | 
				
			||||||
 | 
					      "frameId": idx, | 
				
			||||||
 | 
					      "image": frm[idx%len(frm)], | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    pm.send('frame', dat) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    idx += 1 | 
				
			||||||
 | 
					    rk.keep_time() | 
				
			||||||
 | 
					    #time.sleep(1.0) | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,9 @@ | 
				
			|||||||
 | 
					#!/bin/sh | 
				
			||||||
 | 
					cd .. | 
				
			||||||
 | 
					while :; do | 
				
			||||||
 | 
					  ./camerad & | 
				
			||||||
 | 
					  pid="$!" | 
				
			||||||
 | 
					  sleep 2 | 
				
			||||||
 | 
					  kill -2 $pid | 
				
			||||||
 | 
					  wait $pid | 
				
			||||||
 | 
					done | 
				
			||||||
@ -0,0 +1,57 @@ | 
				
			|||||||
 | 
					CC = clang
 | 
				
			||||||
 | 
					CXX = clang++
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PHONELIBS = ../../../../phonelibs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WARN_FLAGS = -Werror=implicit-function-declaration \
 | 
				
			||||||
 | 
					             -Werror=incompatible-pointer-types \
 | 
				
			||||||
 | 
					             -Werror=int-conversion \
 | 
				
			||||||
 | 
					             -Werror=return-type \
 | 
				
			||||||
 | 
					             -Werror=format-extra-args \
 | 
				
			||||||
 | 
					             -Wno-deprecated-declarations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CFLAGS = -std=gnu11 -fPIC -O2 $(WARN_FLAGS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					UNAME_M := $(shell uname -m)
 | 
				
			||||||
 | 
					ifeq ($(UNAME_M),x86_64) | 
				
			||||||
 | 
					  OPENCL_LIBS = -framework OpenCL
 | 
				
			||||||
 | 
					else | 
				
			||||||
 | 
					  OPENCL_FLAGS = -I$(PHONELIBS)/opencl/include
 | 
				
			||||||
 | 
					  OPENCL_LIBS = -L/system/vendor/lib64 -lgsl -lCB -lOpenCL
 | 
				
			||||||
 | 
					endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OBJS += yuv_bench.o \
 | 
				
			||||||
 | 
					        ../../../common/util.o \
 | 
				
			||||||
 | 
					        ../../clutil.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OUTPUT = yuv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.PHONY: all | 
				
			||||||
 | 
					all: $(OUTPUT) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(OUTPUT): $(OBJS) | 
				
			||||||
 | 
						@echo "[ LINK ] $@"
 | 
				
			||||||
 | 
						$(CXX) -fPIC -o '$@' $^ \
 | 
				
			||||||
 | 
					        -L/usr/lib \
 | 
				
			||||||
 | 
					        $(OPENCL_LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%.o: %.cc | 
				
			||||||
 | 
						@echo "[ CXX ] $@"
 | 
				
			||||||
 | 
						$(CXX) $(CXXFLAGS) -MMD \
 | 
				
			||||||
 | 
					           -I../.. -I../../.. -I ../../../.. \
 | 
				
			||||||
 | 
					           $(OPENCL_FLAGS) \
 | 
				
			||||||
 | 
					           -c -o '$@' '$<'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%.o: %.c | 
				
			||||||
 | 
						@echo "[ CC ] $@"
 | 
				
			||||||
 | 
						$(CC) $(CFLAGS) -MMD \
 | 
				
			||||||
 | 
					          -I../.. -I../../.. -I ../../../.. \
 | 
				
			||||||
 | 
					          $(OPENCL_FLAGS) \
 | 
				
			||||||
 | 
					          -c -o '$@' '$<'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.PHONY: clean | 
				
			||||||
 | 
					clean: | 
				
			||||||
 | 
						rm -f $(OUTPUT) $(OBJS) $(DEPS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,19 @@ | 
				
			|||||||
 | 
					import numpy as np | 
				
			||||||
 | 
					import cv2 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# img_bgr = np.zeros((874, 1164, 3), dtype=np.uint8) | 
				
			||||||
 | 
					# for y in range(874): | 
				
			||||||
 | 
					#   for k in range(1164*3): | 
				
			||||||
 | 
					#     img_bgr[y, k//3, k%3] = k ^ y | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# cv2.imwrite("img_rgb.png", img_bgr) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cl = np.fromstring(open("out_cl.bin", "rb").read(), dtype=np.uint8) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cl_r = cl.reshape(874 * 3 // 2, -1) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cv2.imwrite("out_y.png", cl_r[:874]) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cl_bgr = cv2.cvtColor(cl_r, cv2.COLOR_YUV2BGR_I420) | 
				
			||||||
 | 
					cv2.imwrite("out_cl.png", cl_bgr) | 
				
			||||||
@ -0,0 +1,116 @@ | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					#define PIX_PER_WI_X 1 | 
				
			||||||
 | 
					#define PIX_PER_WI_Y 1 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define scn 3 | 
				
			||||||
 | 
					#define bidx 2 | 
				
			||||||
 | 
					#define uidx 0 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define R_COMP x | 
				
			||||||
 | 
					#define G_COMP y | 
				
			||||||
 | 
					#define B_COMP z | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__constant float c_RGB2YUVCoeffs_420[8] = { 0.256999969f, 0.50399971f, 0.09799957f, -0.1479988098f, -0.2909994125f, | 
				
			||||||
 | 
					                                            0.438999176f, -0.3679990768f, -0.0709991455f }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__kernel void RGB2YUV_YV12_IYUV(__global const uchar* srcptr, int src_step, int src_offset, | 
				
			||||||
 | 
					                                __global uchar* dstptr, int dst_step, int dst_offset, | 
				
			||||||
 | 
					                                int rows, int cols) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    int x = get_global_id(0) * PIX_PER_WI_X; | 
				
			||||||
 | 
					    int y = get_global_id(1) * PIX_PER_WI_Y; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (x < cols/2) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        int src_index  = mad24(y << 1, src_step, mad24(x << 1, scn, src_offset)); | 
				
			||||||
 | 
					        int ydst_index = mad24(y << 1, dst_step, (x << 1) + dst_offset); | 
				
			||||||
 | 
					        int y_rows = rows / 3 * 2; | 
				
			||||||
 | 
					        int vsteps[2] = { cols >> 1, dst_step - (cols >> 1)}; | 
				
			||||||
 | 
					        __constant float* coeffs = c_RGB2YUVCoeffs_420; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #pragma unroll | 
				
			||||||
 | 
					        for (int cy = 0; cy < PIX_PER_WI_Y; ++cy) | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					            if (y < rows / 3) | 
				
			||||||
 | 
					            { | 
				
			||||||
 | 
					                __global const uchar* src1 = srcptr + src_index; | 
				
			||||||
 | 
					                __global const uchar* src2 = src1 + src_step; | 
				
			||||||
 | 
					                __global uchar* ydst1 = dstptr + ydst_index; | 
				
			||||||
 | 
					                __global uchar* ydst2 = ydst1 + dst_step; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                __global uchar* udst = dstptr + mad24(y_rows + (y>>1), dst_step, dst_offset + (y%2)*(cols >> 1) + x); | 
				
			||||||
 | 
					                __global uchar* vdst = udst + mad24(y_rows >> 2, dst_step, y_rows % 4 ? vsteps[y%2] : 0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if PIX_PER_WI_X == 2 | 
				
			||||||
 | 
					                int s11 = *((__global const int*) src1); | 
				
			||||||
 | 
					                int s12 = *((__global const int*) src1 + 1); | 
				
			||||||
 | 
					                int s13 = *((__global const int*) src1 + 2); | 
				
			||||||
 | 
					#if scn == 4 | 
				
			||||||
 | 
					                int s14 = *((__global const int*) src1 + 3); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					                int s21 = *((__global const int*) src2); | 
				
			||||||
 | 
					                int s22 = *((__global const int*) src2 + 1); | 
				
			||||||
 | 
					                int s23 = *((__global const int*) src2 + 2); | 
				
			||||||
 | 
					#if scn == 4 | 
				
			||||||
 | 
					                int s24 = *((__global const int*) src2 + 3); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					                float src_pix1[scn * 4], src_pix2[scn * 4]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                *((float4*) src_pix1)     = convert_float4(as_uchar4(s11)); | 
				
			||||||
 | 
					                *((float4*) src_pix1 + 1) = convert_float4(as_uchar4(s12)); | 
				
			||||||
 | 
					                *((float4*) src_pix1 + 2) = convert_float4(as_uchar4(s13)); | 
				
			||||||
 | 
					#if scn == 4 | 
				
			||||||
 | 
					                *((float4*) src_pix1 + 3) = convert_float4(as_uchar4(s14)); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					                *((float4*) src_pix2)     = convert_float4(as_uchar4(s21)); | 
				
			||||||
 | 
					                *((float4*) src_pix2 + 1) = convert_float4(as_uchar4(s22)); | 
				
			||||||
 | 
					                *((float4*) src_pix2 + 2) = convert_float4(as_uchar4(s23)); | 
				
			||||||
 | 
					#if scn == 4 | 
				
			||||||
 | 
					                *((float4*) src_pix2 + 3) = convert_float4(as_uchar4(s24)); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					                uchar4 y1, y2; | 
				
			||||||
 | 
					                y1.x = convert_uchar_sat(fma(coeffs[0], src_pix1[      2-bidx], fma(coeffs[1], src_pix1[      1], fma(coeffs[2], src_pix1[      bidx], 16.5f)))); | 
				
			||||||
 | 
					                y1.y = convert_uchar_sat(fma(coeffs[0], src_pix1[  scn+2-bidx], fma(coeffs[1], src_pix1[  scn+1], fma(coeffs[2], src_pix1[  scn+bidx], 16.5f)))); | 
				
			||||||
 | 
					                y1.z = convert_uchar_sat(fma(coeffs[0], src_pix1[2*scn+2-bidx], fma(coeffs[1], src_pix1[2*scn+1], fma(coeffs[2], src_pix1[2*scn+bidx], 16.5f)))); | 
				
			||||||
 | 
					                y1.w = convert_uchar_sat(fma(coeffs[0], src_pix1[3*scn+2-bidx], fma(coeffs[1], src_pix1[3*scn+1], fma(coeffs[2], src_pix1[3*scn+bidx], 16.5f)))); | 
				
			||||||
 | 
					                y2.x = convert_uchar_sat(fma(coeffs[0], src_pix2[      2-bidx], fma(coeffs[1], src_pix2[      1], fma(coeffs[2], src_pix2[      bidx], 16.5f)))); | 
				
			||||||
 | 
					                y2.y = convert_uchar_sat(fma(coeffs[0], src_pix2[  scn+2-bidx], fma(coeffs[1], src_pix2[  scn+1], fma(coeffs[2], src_pix2[  scn+bidx], 16.5f)))); | 
				
			||||||
 | 
					                y2.z = convert_uchar_sat(fma(coeffs[0], src_pix2[2*scn+2-bidx], fma(coeffs[1], src_pix2[2*scn+1], fma(coeffs[2], src_pix2[2*scn+bidx], 16.5f)))); | 
				
			||||||
 | 
					                y2.w = convert_uchar_sat(fma(coeffs[0], src_pix2[3*scn+2-bidx], fma(coeffs[1], src_pix2[3*scn+1], fma(coeffs[2], src_pix2[3*scn+bidx], 16.5f)))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                *((__global int*) ydst1) = as_int(y1); | 
				
			||||||
 | 
					                *((__global int*) ydst2) = as_int(y2); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                float uv[4] = { fma(coeffs[3], src_pix1[      2-bidx], fma(coeffs[4], src_pix1[      1], fma(coeffs[5], src_pix1[      bidx], 128.5f))), | 
				
			||||||
 | 
					                                fma(coeffs[5], src_pix1[      2-bidx], fma(coeffs[6], src_pix1[      1], fma(coeffs[7], src_pix1[      bidx], 128.5f))), | 
				
			||||||
 | 
					                                fma(coeffs[3], src_pix1[2*scn+2-bidx], fma(coeffs[4], src_pix1[2*scn+1], fma(coeffs[5], src_pix1[2*scn+bidx], 128.5f))), | 
				
			||||||
 | 
					                                fma(coeffs[5], src_pix1[2*scn+2-bidx], fma(coeffs[6], src_pix1[2*scn+1], fma(coeffs[7], src_pix1[2*scn+bidx], 128.5f))) }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                udst[0] = convert_uchar_sat(uv[uidx]    ); | 
				
			||||||
 | 
					                vdst[0] = convert_uchar_sat(uv[1 - uidx]); | 
				
			||||||
 | 
					                udst[1] = convert_uchar_sat(uv[2 + uidx]); | 
				
			||||||
 | 
					                vdst[1] = convert_uchar_sat(uv[3 - uidx]); | 
				
			||||||
 | 
					#else | 
				
			||||||
 | 
					                float4 src_pix1 = convert_float4(vload4(0, src1)); | 
				
			||||||
 | 
					                float4 src_pix2 = convert_float4(vload4(0, src1+scn)); | 
				
			||||||
 | 
					                float4 src_pix3 = convert_float4(vload4(0, src2)); | 
				
			||||||
 | 
					                float4 src_pix4 = convert_float4(vload4(0, src2+scn)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                ydst1[0] = convert_uchar_sat(fma(coeffs[0], src_pix1.R_COMP, fma(coeffs[1], src_pix1.G_COMP, fma(coeffs[2], src_pix1.B_COMP, 16.5f)))); | 
				
			||||||
 | 
					                ydst1[1] = convert_uchar_sat(fma(coeffs[0], src_pix2.R_COMP, fma(coeffs[1], src_pix2.G_COMP, fma(coeffs[2], src_pix2.B_COMP, 16.5f)))); | 
				
			||||||
 | 
					                ydst2[0] = convert_uchar_sat(fma(coeffs[0], src_pix3.R_COMP, fma(coeffs[1], src_pix3.G_COMP, fma(coeffs[2], src_pix3.B_COMP, 16.5f)))); | 
				
			||||||
 | 
					                ydst2[1] = convert_uchar_sat(fma(coeffs[0], src_pix4.R_COMP, fma(coeffs[1], src_pix4.G_COMP, fma(coeffs[2], src_pix4.B_COMP, 16.5f)))); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                float uv[2] = { fma(coeffs[3], src_pix1.R_COMP, fma(coeffs[4], src_pix1.G_COMP, fma(coeffs[5], src_pix1.B_COMP, 128.5f))), | 
				
			||||||
 | 
					                                fma(coeffs[5], src_pix1.R_COMP, fma(coeffs[6], src_pix1.G_COMP, fma(coeffs[7], src_pix1.B_COMP, 128.5f))) }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                udst[0] = convert_uchar_sat(uv[uidx]  ); | 
				
			||||||
 | 
					                vdst[0] = convert_uchar_sat(uv[1-uidx]); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					                ++y; | 
				
			||||||
 | 
					                src_index += 2*src_step; | 
				
			||||||
 | 
					                ydst_index += 2*dst_step; | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,145 @@ | 
				
			|||||||
 | 
					#include <cstdlib> | 
				
			||||||
 | 
					#include <cstdio> | 
				
			||||||
 | 
					#include <cassert> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <cstring> | 
				
			||||||
 | 
					#include <unistd.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// #include <opencv2/opencv.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __APPLE__ | 
				
			||||||
 | 
					#include <OpenCL/cl.h> | 
				
			||||||
 | 
					#else | 
				
			||||||
 | 
					#include <CL/cl.h> | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "common/util.h" | 
				
			||||||
 | 
					#include "common/timing.h" | 
				
			||||||
 | 
					#include "common/mat.h" | 
				
			||||||
 | 
					#include "clutil.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main() { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int rgb_width = 1164; | 
				
			||||||
 | 
					  int rgb_height = 874; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int rgb_stride = rgb_width*3; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  size_t out_size = rgb_width*rgb_height*3/2; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint8_t* rgb_buf = (uint8_t*)calloc(1, rgb_width*rgb_height*3); | 
				
			||||||
 | 
					  uint8_t* out = (uint8_t*)calloc(1, out_size); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (int y=0; y<rgb_height; y++) { | 
				
			||||||
 | 
					    for (int k=0; k<rgb_stride; k++) { | 
				
			||||||
 | 
					      rgb_buf[y*rgb_stride + k] = k ^ y; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // init cl
 | 
				
			||||||
 | 
					  /* Get Platform and Device Info */ | 
				
			||||||
 | 
					  cl_platform_id platform_id = NULL; | 
				
			||||||
 | 
					  cl_uint num_platforms_unused; | 
				
			||||||
 | 
					  int err = clGetPlatformIDs(1, &platform_id, &num_platforms_unused); | 
				
			||||||
 | 
					  if (err != 0) { | 
				
			||||||
 | 
					    fprintf(stderr, "cl error: %d\n", err); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cl_device_id device_id = NULL; | 
				
			||||||
 | 
					  cl_uint num_devices_unused; | 
				
			||||||
 | 
					  err = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, | 
				
			||||||
 | 
					                       &num_devices_unused); | 
				
			||||||
 | 
					  if (err != 0) { | 
				
			||||||
 | 
					    fprintf(stderr, "cl error: %d\n", err); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cl_print_info(platform_id, device_id); | 
				
			||||||
 | 
					  printf("\n"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cl_context context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &err); | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cl_program prg = cl_create_program_from_file(context, "yuv.cl"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  err = clBuildProgram(prg, 1, &device_id, "", NULL, NULL); | 
				
			||||||
 | 
					  if (err != 0) { | 
				
			||||||
 | 
					    cl_print_build_errors(prg, device_id); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  cl_check_error(err); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cl_kernel krnl = clCreateKernel(prg, "RGB2YUV_YV12_IYUV", &err); | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cl_mem inbuf_cl = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, | 
				
			||||||
 | 
					                                     rgb_width*rgb_height*3, (void*)rgb_buf, &err); | 
				
			||||||
 | 
					  cl_check_error(err); | 
				
			||||||
 | 
					  cl_mem out_cl = clCreateBuffer(context, CL_MEM_READ_WRITE, out_size, NULL, &err); | 
				
			||||||
 | 
					  cl_check_error(err); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // load into net
 | 
				
			||||||
 | 
					  err = clSetKernelArg(krnl, 0, sizeof(cl_mem), &inbuf_cl); //srcptr
 | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int zero = 0; | 
				
			||||||
 | 
					  err = clSetKernelArg(krnl, 1, sizeof(cl_int), &rgb_stride); //src_step
 | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					  err = clSetKernelArg(krnl, 2, sizeof(cl_int), &zero); //src_offset
 | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  err = clSetKernelArg(krnl, 3, sizeof(cl_mem), &out_cl); //dstptr
 | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					  err = clSetKernelArg(krnl, 4, sizeof(cl_int), &rgb_width); //dst_step
 | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					  err = clSetKernelArg(krnl, 5, sizeof(cl_int), &zero); //dst_offset
 | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const int rows = rgb_height * 3 / 2; | 
				
			||||||
 | 
					  err = clSetKernelArg(krnl, 6, sizeof(cl_int), &rows); //rows
 | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					  err = clSetKernelArg(krnl, 7, sizeof(cl_int), &rgb_width); //cols
 | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cl_command_queue q = clCreateCommandQueue(context, device_id, 0, &err); | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					  const size_t work_size[2] = {rgb_width/2, rows/3}; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  err = clEnqueueNDRangeKernel(q, krnl, 2, NULL, | 
				
			||||||
 | 
					                              (const size_t*)&work_size, NULL, 0, 0, NULL); | 
				
			||||||
 | 
					  cl_check_error(err); | 
				
			||||||
 | 
					  clFinish(q); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  double t1 = millis_since_boot(); | 
				
			||||||
 | 
					  for (int k=0; k<32; k++) { | 
				
			||||||
 | 
					    err = clEnqueueNDRangeKernel(q, krnl, 2, NULL, | 
				
			||||||
 | 
					                                (const size_t*)&work_size, NULL, 0, 0, NULL); | 
				
			||||||
 | 
					    cl_check_error(err); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  clFinish(q); | 
				
			||||||
 | 
					  double t2 = millis_since_boot(); | 
				
			||||||
 | 
					  printf("t: %.2f\n", (t2-t1)/32.); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint8_t* out_ptr = (uint8_t*)clEnqueueMapBuffer(q, out_cl, CL_FALSE, | 
				
			||||||
 | 
					                                        CL_MAP_READ, 0, out_size, | 
				
			||||||
 | 
					                                        0, NULL, NULL, &err); | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					  clFinish(q); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FILE* of = fopen("out_cl.bin", "wb"); | 
				
			||||||
 | 
					  fwrite(out_ptr, out_size, 1, of); | 
				
			||||||
 | 
					  fclose(of); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0; | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,53 @@ | 
				
			|||||||
 | 
					#include <string.h> | 
				
			||||||
 | 
					#include <assert.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "clutil.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "rgb_to_yuv.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void rgb_to_yuv_init(RGBToYUVState* s, cl_context ctx, cl_device_id device_id, int width, int height, int rgb_stride) { | 
				
			||||||
 | 
					  int err = 0; | 
				
			||||||
 | 
					  memset(s, 0, sizeof(*s)); | 
				
			||||||
 | 
					  assert(width % 2 == 0); | 
				
			||||||
 | 
					  assert(height % 2 == 0); | 
				
			||||||
 | 
					  s->width = width; | 
				
			||||||
 | 
					  s->height = height; | 
				
			||||||
 | 
					  char args[1024]; | 
				
			||||||
 | 
					  snprintf(args, sizeof(args), | 
				
			||||||
 | 
					           "-cl-fast-relaxed-math -cl-denorms-are-zero " | 
				
			||||||
 | 
					#ifdef CL_DEBUG | 
				
			||||||
 | 
					           "-DCL_DEBUG " | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					           "-DWIDTH=%d -DHEIGHT=%d -DUV_WIDTH=%d -DUV_HEIGHT=%d -DRGB_STRIDE=%d -DRGB_SIZE=%d", | 
				
			||||||
 | 
					           width, height, width/ 2, height / 2, rgb_stride, width * height); | 
				
			||||||
 | 
					  cl_program prg = CLU_LOAD_FROM_FILE(ctx, device_id, "transforms/rgb_to_yuv.cl", args); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  s->rgb_to_yuv_krnl = clCreateKernel(prg, "rgb_to_yuv", &err); | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					  // done with this
 | 
				
			||||||
 | 
					  err = clReleaseProgram(prg); | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void rgb_to_yuv_destroy(RGBToYUVState* s) { | 
				
			||||||
 | 
					  int err = 0; | 
				
			||||||
 | 
					  err = clReleaseKernel(s->rgb_to_yuv_krnl); | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void rgb_to_yuv_queue(RGBToYUVState* s, cl_command_queue q, cl_mem rgb_cl, cl_mem yuv_cl) { | 
				
			||||||
 | 
					  int err = 0; | 
				
			||||||
 | 
					  err = clSetKernelArg(s->rgb_to_yuv_krnl, 0, sizeof(cl_mem), &rgb_cl); | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					  err = clSetKernelArg(s->rgb_to_yuv_krnl, 1, sizeof(cl_mem), &yuv_cl); | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					  const size_t work_size[2] = { | 
				
			||||||
 | 
					    (size_t)(s->width + (s->width % 4 == 0 ? 0 : (4 - s->width % 4))) / 4, 
 | 
				
			||||||
 | 
					    (size_t)(s->height + (s->height % 4 == 0 ? 0 : (4 - s->height % 4))) / 4 | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					  cl_event event; | 
				
			||||||
 | 
					  err = clEnqueueNDRangeKernel(q, s->rgb_to_yuv_krnl, 2, NULL, &work_size[0], NULL, 0, 0, &event); | 
				
			||||||
 | 
					  assert(err == 0); | 
				
			||||||
 | 
					  clWaitForEvents(1, &event); | 
				
			||||||
 | 
					  clReleaseEvent(event); | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,127 @@ | 
				
			|||||||
 | 
					#define RGB_TO_Y(r, g, b) ((((mul24(b, 13) + mul24(g, 65) + mul24(r, 33)) + 64) >> 7) + 16) | 
				
			||||||
 | 
					#define RGB_TO_U(r, g, b) ((mul24(b, 56) - mul24(g, 37) - mul24(r, 19) + 0x8080) >> 8) | 
				
			||||||
 | 
					#define RGB_TO_V(r, g, b) ((mul24(r, 56) - mul24(g, 47) - mul24(b, 9) + 0x8080) >> 8) | 
				
			||||||
 | 
					#define AVERAGE(x, y, z, w) ((convert_ushort(x) + convert_ushort(y) + convert_ushort(z) + convert_ushort(w) + 1) >> 1) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void convert_2_ys(__global uchar * out_yuv, int yi, const uchar8 rgbs1) { | 
				
			||||||
 | 
					  uchar2 yy = (uchar2)( | 
				
			||||||
 | 
					    RGB_TO_Y(rgbs1.s2, rgbs1.s1, rgbs1.s0), | 
				
			||||||
 | 
					    RGB_TO_Y(rgbs1.s5, rgbs1.s4, rgbs1.s3) | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					#ifdef CL_DEBUG | 
				
			||||||
 | 
					  if(yi >= RGB_SIZE) | 
				
			||||||
 | 
					    printf("Y vector2 overflow, %d > %d\n", yi, RGB_SIZE); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					  vstore2(yy, 0, out_yuv + yi); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void convert_4_ys(__global uchar * out_yuv, int yi, const uchar8 rgbs1, const uchar8 rgbs3) { | 
				
			||||||
 | 
					  const uchar4 yy = (uchar4)( | 
				
			||||||
 | 
					    RGB_TO_Y(rgbs1.s2, rgbs1.s1, rgbs1.s0), | 
				
			||||||
 | 
					    RGB_TO_Y(rgbs1.s5, rgbs1.s4, rgbs1.s3), | 
				
			||||||
 | 
					    RGB_TO_Y(rgbs3.s0, rgbs1.s7, rgbs1.s6), | 
				
			||||||
 | 
					    RGB_TO_Y(rgbs3.s3, rgbs3.s2, rgbs3.s1) | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					#ifdef CL_DEBUG | 
				
			||||||
 | 
					  if(yi > RGB_SIZE - 4) | 
				
			||||||
 | 
					    printf("Y vector4 overflow, %d > %d\n", yi, RGB_SIZE - 4); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					  vstore4(yy, 0, out_yuv + yi); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void convert_uv(__global uchar * out_yuv, int ui, int vi, | 
				
			||||||
 | 
					                    const uchar8 rgbs1, const uchar8 rgbs2) { | 
				
			||||||
 | 
					  // U & V: average of 2x2 pixels square | 
				
			||||||
 | 
					  const short ab = AVERAGE(rgbs1.s0, rgbs1.s3, rgbs2.s0, rgbs2.s3); | 
				
			||||||
 | 
					  const short ag = AVERAGE(rgbs1.s1, rgbs1.s4, rgbs2.s1, rgbs2.s4); | 
				
			||||||
 | 
					  const short ar = AVERAGE(rgbs1.s2, rgbs1.s5, rgbs2.s2, rgbs2.s5); | 
				
			||||||
 | 
					#ifdef CL_DEBUG | 
				
			||||||
 | 
					  if(ui >= RGB_SIZE  + RGB_SIZE / 4) | 
				
			||||||
 | 
					    printf("U overflow, %d >= %d\n", ui, RGB_SIZE  + RGB_SIZE / 4); | 
				
			||||||
 | 
					  if(vi >= RGB_SIZE  + RGB_SIZE / 2) | 
				
			||||||
 | 
					    printf("V overflow, %d >= %d\n", vi, RGB_SIZE  + RGB_SIZE / 2); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					  out_yuv[ui] = RGB_TO_U(ar, ag, ab); | 
				
			||||||
 | 
					  out_yuv[vi] = RGB_TO_V(ar, ag, ab); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void convert_2_uvs(__global uchar * out_yuv, int ui, int vi, | 
				
			||||||
 | 
					                    const uchar8 rgbs1, const uchar8 rgbs2, const uchar8 rgbs3, const uchar8 rgbs4) { | 
				
			||||||
 | 
					  // U & V: average of 2x2 pixels square | 
				
			||||||
 | 
					  const short ab1 = AVERAGE(rgbs1.s0, rgbs1.s3, rgbs2.s0, rgbs2.s3); | 
				
			||||||
 | 
					  const short ag1 = AVERAGE(rgbs1.s1, rgbs1.s4, rgbs2.s1, rgbs2.s4); | 
				
			||||||
 | 
					  const short ar1 = AVERAGE(rgbs1.s2, rgbs1.s5, rgbs2.s2, rgbs2.s5); | 
				
			||||||
 | 
					  const short ab2 = AVERAGE(rgbs1.s6, rgbs3.s1, rgbs2.s6, rgbs4.s1); | 
				
			||||||
 | 
					  const short ag2 = AVERAGE(rgbs1.s7, rgbs3.s2, rgbs2.s7, rgbs4.s2); | 
				
			||||||
 | 
					  const short ar2 = AVERAGE(rgbs3.s0, rgbs3.s3, rgbs4.s0, rgbs4.s3); | 
				
			||||||
 | 
					  uchar2 u2 = (uchar2)( | 
				
			||||||
 | 
					    RGB_TO_U(ar1, ag1, ab1), | 
				
			||||||
 | 
					    RGB_TO_U(ar2, ag2, ab2) | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					  uchar2 v2 = (uchar2)( | 
				
			||||||
 | 
					    RGB_TO_V(ar1, ag1, ab1), | 
				
			||||||
 | 
					    RGB_TO_V(ar2, ag2, ab2) | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					#ifdef CL_DEBUG1 | 
				
			||||||
 | 
					  if(ui > RGB_SIZE  + RGB_SIZE / 4 - 2) | 
				
			||||||
 | 
					    printf("U 2 overflow, %d >= %d\n", ui, RGB_SIZE  + RGB_SIZE / 4 - 2); | 
				
			||||||
 | 
					  if(vi > RGB_SIZE  + RGB_SIZE / 2 - 2) | 
				
			||||||
 | 
					    printf("V 2 overflow, %d >= %d\n", vi, RGB_SIZE  + RGB_SIZE / 2 - 2); | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					  vstore2(u2, 0, out_yuv + ui); | 
				
			||||||
 | 
					  vstore2(v2, 0, out_yuv + vi); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__kernel void rgb_to_yuv(__global uchar const * const rgb, | 
				
			||||||
 | 
					                    __global uchar * out_yuv) | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					  const int dx = get_global_id(0); | 
				
			||||||
 | 
					  const int dy = get_global_id(1); | 
				
			||||||
 | 
					  const int col = mul24(dx, 4); // Current column in rgb image | 
				
			||||||
 | 
					  const int row = mul24(dy, 4); // Current row in rgb image | 
				
			||||||
 | 
					  const int bgri_start = mad24(row, RGB_STRIDE, mul24(col, 3)); // Start offset of rgb data being converted | 
				
			||||||
 | 
					  const int yi_start = mad24(row,  WIDTH, col); // Start offset in the target yuv buffer | 
				
			||||||
 | 
					  int ui = mad24(row / 2, UV_WIDTH, RGB_SIZE + col / 2); | 
				
			||||||
 | 
					  int vi = mad24(row / 2 , UV_WIDTH, RGB_SIZE + UV_WIDTH * UV_HEIGHT + col / 2); | 
				
			||||||
 | 
					  int num_col = min(WIDTH - col, 4); | 
				
			||||||
 | 
					  int num_row = min(HEIGHT - row, 4); | 
				
			||||||
 | 
					  if(num_row == 4) { | 
				
			||||||
 | 
					    const uchar8 rgbs0_0 = vload8(0, rgb + bgri_start); | 
				
			||||||
 | 
					    const uchar8 rgbs0_1 = vload8(0, rgb + bgri_start + 8); | 
				
			||||||
 | 
					    const uchar8 rgbs1_0 = vload8(0, rgb + bgri_start + RGB_STRIDE); | 
				
			||||||
 | 
					    const uchar8 rgbs1_1 = vload8(0, rgb + bgri_start + RGB_STRIDE + 8); | 
				
			||||||
 | 
					    const uchar8 rgbs2_0 = vload8(0, rgb + bgri_start + RGB_STRIDE * 2); | 
				
			||||||
 | 
					    const uchar8 rgbs2_1 = vload8(0, rgb + bgri_start + RGB_STRIDE * 2 + 8); | 
				
			||||||
 | 
					    const uchar8 rgbs3_0 = vload8(0, rgb + bgri_start + RGB_STRIDE * 3); | 
				
			||||||
 | 
					    const uchar8 rgbs3_1 = vload8(0, rgb + bgri_start + RGB_STRIDE * 3 + 8); | 
				
			||||||
 | 
					    if(num_col == 4) { | 
				
			||||||
 | 
					      convert_4_ys(out_yuv, yi_start, rgbs0_0, rgbs0_1); | 
				
			||||||
 | 
					      convert_4_ys(out_yuv, yi_start + WIDTH, rgbs1_0, rgbs1_1); | 
				
			||||||
 | 
					      convert_4_ys(out_yuv, yi_start + WIDTH * 2, rgbs2_0, rgbs2_1); | 
				
			||||||
 | 
					      convert_4_ys(out_yuv, yi_start + WIDTH * 3, rgbs3_0, rgbs3_1); | 
				
			||||||
 | 
					      convert_2_uvs(out_yuv, ui, vi, rgbs0_0, rgbs1_0, rgbs0_1, rgbs1_1); | 
				
			||||||
 | 
					      convert_2_uvs(out_yuv, ui + UV_WIDTH, vi + UV_WIDTH, rgbs2_0, rgbs3_0, rgbs2_1, rgbs3_1); | 
				
			||||||
 | 
					    } else if(num_col == 2) { | 
				
			||||||
 | 
					      convert_2_ys(out_yuv, yi_start, rgbs0_0); | 
				
			||||||
 | 
					      convert_2_ys(out_yuv, yi_start + WIDTH, rgbs1_0); | 
				
			||||||
 | 
					      convert_2_ys(out_yuv, yi_start + WIDTH * 2, rgbs2_0); | 
				
			||||||
 | 
					      convert_2_ys(out_yuv, yi_start + WIDTH * 3, rgbs3_0); | 
				
			||||||
 | 
					      convert_uv(out_yuv, ui, vi, rgbs0_0, rgbs1_0); | 
				
			||||||
 | 
					      convert_uv(out_yuv, ui + UV_WIDTH, vi + UV_WIDTH, rgbs2_0, rgbs3_0); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } else { | 
				
			||||||
 | 
					    const uchar8 rgbs0_0 = vload8(0, rgb + bgri_start); | 
				
			||||||
 | 
					    const uchar8 rgbs0_1 = vload8(0, rgb + bgri_start + 8); | 
				
			||||||
 | 
					    const uchar8 rgbs1_0 = vload8(0, rgb + bgri_start + RGB_STRIDE); | 
				
			||||||
 | 
					    const uchar8 rgbs1_1 = vload8(0, rgb + bgri_start + RGB_STRIDE + 8); | 
				
			||||||
 | 
					    if(num_col == 4) { | 
				
			||||||
 | 
					      convert_4_ys(out_yuv, yi_start, rgbs0_0, rgbs0_1); | 
				
			||||||
 | 
					      convert_4_ys(out_yuv, yi_start + WIDTH, rgbs1_0, rgbs1_1); | 
				
			||||||
 | 
					      convert_2_uvs(out_yuv, ui, vi, rgbs0_0, rgbs1_0, rgbs0_1, rgbs1_1); | 
				
			||||||
 | 
					    } else if(num_col == 2) { | 
				
			||||||
 | 
					      convert_2_ys(out_yuv, yi_start, rgbs0_0); | 
				
			||||||
 | 
					      convert_2_ys(out_yuv, yi_start + WIDTH, rgbs1_0); | 
				
			||||||
 | 
					      convert_uv(out_yuv, ui, vi, rgbs0_0, rgbs1_0); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,32 @@ | 
				
			|||||||
 | 
					#ifndef RGB_TO_YUV_H | 
				
			||||||
 | 
					#define RGB_TO_YUV_H | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <inttypes.h> | 
				
			||||||
 | 
					#include <stdbool.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __APPLE__ | 
				
			||||||
 | 
					#include <OpenCL/cl.h> | 
				
			||||||
 | 
					#else | 
				
			||||||
 | 
					#include <CL/cl.h> | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus | 
				
			||||||
 | 
					extern "C" { | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct { | 
				
			||||||
 | 
					  int width, height; | 
				
			||||||
 | 
					  cl_kernel rgb_to_yuv_krnl; | 
				
			||||||
 | 
					} RGBToYUVState; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void rgb_to_yuv_init(RGBToYUVState* s, cl_context ctx, cl_device_id device_id, int width, int height, int rgb_stride); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void rgb_to_yuv_destroy(RGBToYUVState* s); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void rgb_to_yuv_queue(RGBToYUVState* s, cl_command_queue q, cl_mem rgb_cl, cl_mem yuv_cl); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif  // RGB_TO_YUV_H
 | 
				
			||||||
@ -0,0 +1,201 @@ | 
				
			|||||||
 | 
					#include <memory.h> | 
				
			||||||
 | 
					#include <iostream> | 
				
			||||||
 | 
					#include <getopt.h> | 
				
			||||||
 | 
					#include <math.h> | 
				
			||||||
 | 
					#include <fstream> | 
				
			||||||
 | 
					#include <cstdlib> | 
				
			||||||
 | 
					#include <vector> | 
				
			||||||
 | 
					#include <string> | 
				
			||||||
 | 
					#include <iomanip> | 
				
			||||||
 | 
					#include <thread> | 
				
			||||||
 | 
					#include <fcntl.h> | 
				
			||||||
 | 
					#include <signal.h> | 
				
			||||||
 | 
					#include <unistd.h> | 
				
			||||||
 | 
					#include <cassert> | 
				
			||||||
 | 
					#include <cstdint> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef ANDROID | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAXE 0 | 
				
			||||||
 | 
					#include <unistd.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else | 
				
			||||||
 | 
					// The libyuv implementation on ARM is slightly different than on x86
 | 
				
			||||||
 | 
					// Our implementation matches the ARM version, so accept errors of 1
 | 
				
			||||||
 | 
					#define MAXE 1 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <libyuv.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <CL/cl.h> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "clutil.h" | 
				
			||||||
 | 
					#include "rgb_to_yuv.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline double millis_since_boot() { | 
				
			||||||
 | 
					  struct timespec t; | 
				
			||||||
 | 
					  clock_gettime(CLOCK_BOOTTIME, &t); | 
				
			||||||
 | 
					  return t.tv_sec * 1000.0 + t.tv_nsec * 1e-6; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void cl_init(cl_device_id &device_id, cl_context &context) { | 
				
			||||||
 | 
					  int err; | 
				
			||||||
 | 
					  cl_platform_id platform_id = NULL; | 
				
			||||||
 | 
					  cl_uint num_devices; | 
				
			||||||
 | 
					  cl_uint num_platforms; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  err = clGetPlatformIDs(1, &platform_id, &num_platforms); | 
				
			||||||
 | 
					  err = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, | 
				
			||||||
 | 
					                       &device_id, &num_devices); | 
				
			||||||
 | 
					  cl_print_info(platform_id, device_id); | 
				
			||||||
 | 
					  context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &err); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool compare_results(uint8_t *a, uint8_t *b, int len, int stride, int width, int height, uint8_t *rgb) { | 
				
			||||||
 | 
					  int min_diff = 0., max_diff = 0., max_e = 0.; | 
				
			||||||
 | 
					  int e1 = 0, e0 = 0; | 
				
			||||||
 | 
					  int e0y = 0, e0u = 0, e0v = 0, e1y = 0, e1u = 0, e1v = 0; | 
				
			||||||
 | 
					  int max_e_i = 0; | 
				
			||||||
 | 
					  for (int i = 0;i < len;i++) { | 
				
			||||||
 | 
					    int e = ((int)a[i]) - ((int)b[i]); | 
				
			||||||
 | 
					    if(e < min_diff) { | 
				
			||||||
 | 
					      min_diff = e; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    if(e > max_diff) { | 
				
			||||||
 | 
					      max_diff = e; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    int e_abs = std::abs(e); | 
				
			||||||
 | 
					    if(e_abs > max_e) { | 
				
			||||||
 | 
					      max_e = e_abs; | 
				
			||||||
 | 
					      max_e_i = i; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    if(e_abs < 1) { | 
				
			||||||
 | 
					      e0++; | 
				
			||||||
 | 
					      if(i < stride * height) | 
				
			||||||
 | 
					        e0y++; | 
				
			||||||
 | 
					      else if(i < stride * height + stride * height / 4) | 
				
			||||||
 | 
					        e0u++; | 
				
			||||||
 | 
					      else | 
				
			||||||
 | 
					        e0v++; | 
				
			||||||
 | 
					    } else { | 
				
			||||||
 | 
					      e1++; | 
				
			||||||
 | 
					      if(i < stride * height) | 
				
			||||||
 | 
					        e1y++; | 
				
			||||||
 | 
					      else if(i < stride * height + stride * height / 4) | 
				
			||||||
 | 
					        e1u++; | 
				
			||||||
 | 
					      else | 
				
			||||||
 | 
					        e1v++; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  //printf("max diff : %d, min diff : %d, e < 1: %d, e >= 1: %d\n", max_diff, min_diff, e0, e1);
 | 
				
			||||||
 | 
					  //printf("Y: e < 1: %d, e >= 1: %d, U: e < 1: %d, e >= 1: %d, V: e < 1: %d, e >= 1: %d\n", e0y, e1y, e0u, e1u, e0v, e1v);
 | 
				
			||||||
 | 
					  if(max_e <= MAXE) { | 
				
			||||||
 | 
					    return true; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  int row = max_e_i / stride; | 
				
			||||||
 | 
					  if(row < height) { | 
				
			||||||
 | 
					    printf("max error is Y: %d = (libyuv: %u - cl: %u), row: %d, col: %d\n", max_e, a[max_e_i], b[max_e_i], row, max_e_i % stride); | 
				
			||||||
 | 
					  } else if(row >= height && row < (height + height / 4)) { | 
				
			||||||
 | 
					    printf("max error is U: %d = %u - %u, row: %d, col: %d\n", max_e, a[max_e_i], b[max_e_i], (row - height) / 2, max_e_i % stride / 2); | 
				
			||||||
 | 
					  } else { | 
				
			||||||
 | 
					    printf("max error is V: %d = %u - %u, row: %d, col: %d\n", max_e, a[max_e_i], b[max_e_i], (row - height - height / 4) / 2, max_e_i % stride / 2); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  return false; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char** argv) { | 
				
			||||||
 | 
					  srand(1337); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  clu_init(); | 
				
			||||||
 | 
					  cl_device_id device_id; | 
				
			||||||
 | 
					  cl_context context; | 
				
			||||||
 | 
					  cl_init(device_id, context)	; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int err; | 
				
			||||||
 | 
					  const cl_queue_properties props[] = {0}; //CL_QUEUE_PRIORITY_KHR, CL_QUEUE_PRIORITY_HIGH_KHR, 0};
 | 
				
			||||||
 | 
					  cl_command_queue q = clCreateCommandQueueWithProperties(context, device_id, props, &err); | 
				
			||||||
 | 
					  if(err != 0) { | 
				
			||||||
 | 
					    std::cout << "clCreateCommandQueueWithProperties error: " << err << std::endl; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int width = 1164; | 
				
			||||||
 | 
					  int height = 874; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int opt = 0; | 
				
			||||||
 | 
					  while ((opt = getopt(argc, argv, "f")) != -1) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					      switch (opt) | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					        case 'f': | 
				
			||||||
 | 
					          std::cout << "Using front camera dimensions" << std::endl; | 
				
			||||||
 | 
					          int width = 1152; | 
				
			||||||
 | 
					          int height = 846; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::cout << "Width: " << width << " Height: " << height << std::endl; | 
				
			||||||
 | 
					  uint8_t *rgb_frame = new uint8_t[width * height * 3]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RGBToYUVState rgb_to_yuv_state; | 
				
			||||||
 | 
					  rgb_to_yuv_init(&rgb_to_yuv_state, context, device_id, width, height, width * 3); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int frame_yuv_buf_size = width * height * 3 / 2; | 
				
			||||||
 | 
					  cl_mem yuv_cl = clCreateBuffer(context, CL_MEM_READ_WRITE, frame_yuv_buf_size, (void*)NULL, &err); | 
				
			||||||
 | 
					  uint8_t *frame_yuv_buf = new uint8_t[frame_yuv_buf_size]; | 
				
			||||||
 | 
					  uint8_t *frame_yuv_ptr_y = frame_yuv_buf; | 
				
			||||||
 | 
					  uint8_t *frame_yuv_ptr_u = frame_yuv_buf + (width * height); | 
				
			||||||
 | 
					  uint8_t *frame_yuv_ptr_v = frame_yuv_ptr_u + ((width/2) * (height/2)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cl_mem rgb_cl = clCreateBuffer(context, CL_MEM_READ_WRITE, width * height * 3, (void*)NULL, &err); | 
				
			||||||
 | 
					  int mismatched = 0; | 
				
			||||||
 | 
					  int counter = 0; | 
				
			||||||
 | 
					  srand (time(NULL)); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (int i = 0; i < 100; i++){ | 
				
			||||||
 | 
					    for (int i = 0; i < width * height * 3; i++){ | 
				
			||||||
 | 
					      rgb_frame[i] = (uint8_t)rand(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    double t1 = millis_since_boot(); | 
				
			||||||
 | 
					    libyuv::RGB24ToI420((uint8_t*)rgb_frame, width * 3, | 
				
			||||||
 | 
					                        frame_yuv_ptr_y, width, | 
				
			||||||
 | 
					                        frame_yuv_ptr_u, width/2, | 
				
			||||||
 | 
					                        frame_yuv_ptr_v, width/2, | 
				
			||||||
 | 
					                        width, height); | 
				
			||||||
 | 
					    double t2 = millis_since_boot(); | 
				
			||||||
 | 
					    //printf("Libyuv: rgb to yuv: %.2fms\n", t2-t1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    clEnqueueWriteBuffer(q, rgb_cl, CL_TRUE, 0, width * height * 3, (void *)rgb_frame, 0, NULL, NULL); | 
				
			||||||
 | 
					    t1 = millis_since_boot(); | 
				
			||||||
 | 
					    rgb_to_yuv_queue(&rgb_to_yuv_state, q, rgb_cl, yuv_cl); | 
				
			||||||
 | 
					    t2 = millis_since_boot(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //printf("OpenCL: rgb to yuv: %.2fms\n", t2-t1);
 | 
				
			||||||
 | 
					    uint8_t *yyy = (uint8_t *)clEnqueueMapBuffer(q, yuv_cl, CL_TRUE, | 
				
			||||||
 | 
					                                                 CL_MAP_READ, 0, frame_yuv_buf_size, | 
				
			||||||
 | 
					                                                 0, NULL, NULL, &err); | 
				
			||||||
 | 
					    if(!compare_results(frame_yuv_ptr_y, yyy, frame_yuv_buf_size, width, width, height, (uint8_t*)rgb_frame)) | 
				
			||||||
 | 
					      mismatched++; | 
				
			||||||
 | 
					    clEnqueueUnmapMemObject(q, yuv_cl, yyy, 0, NULL, NULL); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // std::this_thread::sleep_for(std::chrono::milliseconds(20));
 | 
				
			||||||
 | 
					    if(counter++ % 100 == 0) | 
				
			||||||
 | 
					      printf("Matched: %d, Mismatched: %d\n", counter - mismatched, mismatched); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  printf("Matched: %d, Mismatched: %d\n", counter - mismatched, mismatched); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  delete[] frame_yuv_buf; | 
				
			||||||
 | 
					  rgb_to_yuv_destroy(&rgb_to_yuv_state); | 
				
			||||||
 | 
					  clReleaseContext(context); | 
				
			||||||
 | 
					  delete[] rgb_frame; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mismatched == 0) | 
				
			||||||
 | 
					    return 0; | 
				
			||||||
 | 
					  else | 
				
			||||||
 | 
					    return -1; | 
				
			||||||
 | 
					} | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue