1. 程式人生 > >qualcomm camera 學習筆記

qualcomm camera 學習筆記

高通camera學習筆記概述(一二三四五) http://www.cnblogs.com/potato-coffee/p/4172009.html
android camera 預覽 app到hal  http://blog.csdn.net/tankai19880619/article/details/22795217
電路圖,時序圖,移植,介紹引數 移植時用  http://www.cnblogs.com/thjfk/p/4086001.html
簡單的移植   http://blog.csdn.net/u013531497/article/details/18737111
從上到下,特別全 程式碼註釋很全   http://www.cnblogs.com/joseph-linux/p/3515151.html

音圈馬達VCM(Voice Coil Motor)、陶瓷馬達(Piezo Motor)、步進馬達(Stepper Motor)。
高通自帶camera app 相關功能開關
exif相關 getExifData
    hardware/qcom/camera/QCamera2/stack/mm-jpeg-interface/src$ vi mm_jpeg_exif.cpackages/apps/Camera2$ vi AndroidManifest.xml

fh  file handle
vb video buff
sd sub dev
digital video port (DVP)
AEC,即Automatic Exposure Control
ds_fd:   domain socket file descriptor
manual exposure
OIS,它的全稱是Optical Image Stabilization,從字面理解就是穩定的光學圖象
OIS是松下公司數碼相機中光學防抖的標誌,佳能稱為IS,尼康稱為VR,適馬稱為OS,騰龍稱為VC
MSM:Mobile Station Modem 的簡寫,包含基帶的智慧機處理器。
APQ:Application Processor Qualcomm 的簡寫,不整合基帶的處理器。
LSC Lens Shading Correction
msm_sensor_init_subdev_ioctl
msm_sensor_driver_cmd
msm_sensor_driver_probe
rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);


server.c
main()
module_sensor_init
  module_sensor_find_sensor_subdev
        cfg.cfgtype = CFG_GET_SENSOR_INFO;
        rc = ioctl(sd_fd, VIDIOC_MSM_SENSOR_CFG, &cfg);

    msm_sensor_config(CFG_GET_SENSOR_INFO)


  module_sensor_find_other_subdev
    rc = ioctl(sd_fd, VIDIOC_MSM_SENSOR_GET_SUBDEV_ID, &subdev_id);
    msm_csiphy_subdev_ioctl(VIDIOC_MSM_SENSOR_GET_SUBDEV_ID)

        rc = ioctl(sd_fd, VIDIOC_MSM_SENSOR_GET_SUBDEV_ID, &subdev_id);
    msm_csid_subdev_ioctl(VIDIOC_MSM_SENSOR_GET_SUBDEV_ID)

    rc = ioctl(sd_fd, VIDIOC_MSM_SENSOR_GET_SUBDEV_ID, &subdev_id);
    msm_led_flash_subdev_ioctl()

    msm_csid_subdev_ioctl(VIDIOC_MSM_CSID_IO_CFG)
    msm_csid_cmd(CSID_INIT)
    msm_csid_cmd(CSID_RELEASE)



msm.c
probe 建立dev/videoX

drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c
    /*
     * Create /dev/videoX node, comment for now until dummy /dev/videoX
     * node is created and used by HAL
     */

    if (s_ctrl->sensor_device_type == MSM_CAMERA_PLATFORM_DEVICE)
        rc = msm_sensor_driver_create_v4l_subdev(s_ctrl);
    else
        rc = msm_sensor_driver_create_i2c_v4l_subdev(s_ctrl);
    if (rc < 0) {
        pr_err("failed: camera creat v4l2 rc %d", rc);
        goto camera_power_down;
    }

    msm_sd_register
    __msm_sd_register_subdev
    __video_register_device

mm-camera/apps/v4l2-qcamera-app/v4l2-qcamera-app.c
main
  snprintf(camera_dev_node, BUFF_SIZE_64, "/dev/video%d", camera_id);
  eventfd = open(camera_dev_node,O_RDWR | O_NONBLOCK);
  camera_v4l2_open
    msm_create_session
  camera_pack_event(filep, MSM_CAMERA_NEW_SESSION, 0, -1, &event);
  rc = msm_post_event(&event, MSM_POST_EVT_TIMEOUT);

server.c
main
  if (event.id == MSM_CAMERA_NEW_SESSION) {
   proc_ret = server_process_hal_event(&event);
     server_process_hal_event

   switch (proc_ret.result) {
   case RESULT_NEW_SESSION: {

   case SERV_RET_TO_HAL_CMDACK:
   ioctl(hal_fd->fd[0], MSM_CAM_V4L2_IOCTL_CMD_ACK,

   msm_private_ioctl
    case MSM_CAM_V4L2_IOCTL_CMD_ACK: {

rc = camera_check_event_status(&event);
回到eventfd = open(camera_dev_node,O_RDWR | O_NONBLOCK);


0413:
1.理解dtsi,sensor和sensorlib中引數的意義
    dtsi 參考Documentation/devicetree/bindings/media/video/msm-cci.txt
    ov7695.c 結構體 struct msm_sensor_ctrl_t
        ov7695_lib.c  結構體 sensor_lib_t
    
2.找到上電初始化code,學會修改
上電2條線:
   1. camera drvier
     ov7695.c  ov7695_platform_probe--->msm_sensor_platform_probe-->rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);
           msm_ov7695_i2c_probe-->msm_sensor_i2c_probe-->rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);
   2.ioctl
    msm_sensor_init_subdev_ioctl->msm_sensor_driver_cmd-->msm_sensor_driver_probe-->rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl);
    
    hardware:mm_camera_interface.c
      get_num_of_cameras()
        if (ioctl(sd_fd, VIDIOC_MSM_SENSOR_INIT_CFG, &cfg) < 0)
    
    vendor sensor.c main()
      server_process_module_init-->module_sensor_init-->sensor_init_probe->sensor_probe-->CFG_SINIT_PROBE if (LOG_IOCTL(fd, VIDIOC_MSM_SENSOR_INIT_CFG, &cfg) < 0) {
    
msm_sensor_ctrl_t中包含msm_sensor_power_setting(power_setting)的地方:
 
    struct msm_sensor_power_setting {
        enum msm_sensor_power_seq_type_t seq_type;
        uint16_t seq_val;
        long config_val;
        uint16_t delay;
        void *data[10];
    };

     3.msm_sensor_config


    msm_camera_sensor_board_info(sensordata)-->msm_camera_power_ctrl_t(power_info)-->msm_sensor_power_setting(power_setting)
                                -->msm_camera_sensor_slave_info(cam_slave_info)-->msm_sensor_power_setting_array(power_setting_array)-->msm_sensor_power_setting (power_setting)
    msm_sensor_power_setting_array(power_setting_array)-->msm_sensor_power_setting(power_setting)
上電時序就是:
qcom,cam-power-seq-type

open 流程:-=========================================
http://blog.csdn.net/discovery_by_joseph/article/details/40434127?utm_source=tuicool&utm_medium=referral


=============================framework==================================
Camera.java  public static Camera open(int cameraId)  --> Camera -->  cameraInitNormal -->  cameraInitVersion  -->native_setup

通過android_hardware_Camera.cpp  JNINativeMethod camMethods  --> android_hardware_Camera_native_setup  -->Camera::connect
怎麼對映過來的?
Camera.cpp  sp<Camera> Camera::connect

CameraManager.java   openCamera  -->  openCameraDeviceUserAsync
connectDevice
CameraService.cpp    connectFinishUnsafe
CameraHardwareInterface.h  initialize  rc = CameraService::filterOpenErrorCode(module->methods->open()
========================hardware=================================log

QCamera2HWI.cpp QCamera2HardwareInterface::openCamera(struct hw_device_t **hw_device)
=========================kernel=========================open()
    v4l2_open
      vdev->fops->open(filp);
    camera_v4l2_open
        camera_pack_event(filep, MSM_CAMERA_NEW_SESSION, 0, -1, &event);
        rc = msm_post_event(&event, MSM_POST_EVT_TIMEOUT);
=========================server=========================main()
    server_process_hal_event(MSM_CAMERA_NEW_SESSION)
=========================MCT=========================
    mct_controller_new
        mct_pipeline_start_session    
        mct_pipeline_modules_start
            mct_pipeline_start_session_thread
              if (module->start_session) {
                  rc = module->start_session(module, session_id);

=========================vendor driver=========================
    module_sensor_start_session
        module_sensor_init_session
          rc = module_sensor_params->func_tbl.process(module_sensor_params->sub_module_private,SENSOR_INIT, NULL);
            sensor_process(SENSOR_INIT)
                rc = sensor_init(sctrl);
                sensor_power_up
                    cfg.cfgtype = CFG_POWER_UP;
                     if (LOG_IOCTL(ctrl->s_data->fd, VIDIOC_MSM_SENSOR_CFG, &cfg) < 0) {


=========================kernel=========================open()
    msm_sensor_subdev_ioctl(VIDIOC_MSM_SENSOR_CFG,CFG_POWER_UP)
        ov7695_sensor_config
        msm_sensor_power_up


end

system/lib/hw/camera.msm8974.so

0414:
熟悉幾種工作模式:
1.預覽
2.自動對焦
3.拍照
video_register_device 建立dev/videoX
0415:
資料流:從camera獲取資料上傳
開啟camera   QCamera2HWI.cpp QCamera2HardwareInterface::openCamera(struct hw_device_t **hw_device)
0418:
參照下面的文章學習camera開啟流程
http://wenku.baidu.com/link?url=1kju8IrcWahLI92LhNDwKRtJvPWJ8v9WW2GWbbrwmqII_YCR0hpb9m4fwu3ZUsH6rhPK_CqSxjoAHnChfiTr_hj1oLMfu9Ot5vqVwqeF1MC
preview http://blog.csdn.net/dnfchan/article/details/7602213
19:45

相關推薦

qualcomm camera 學習筆記

高通camera學習筆記概述(一二三四五) http://www.cnblogs.com/potato-coffee/p/4172009.html android camera 預覽 app到hal  http://blog.csdn.net/tankai19880619/

IoT-Camera學習筆記之初識IoT-Camera(二)

5.bin檔案燒寫執行 剛拿到手的IOT-Camera開發板是沒有燒寫攝像頭韌體的,所以我們要先刷機!!! 最新版本的Firmware已經支援3種不同的刷機方式。5.1.更新韌體方式1:手工TF卡刷機 1)Step1:將camera studio編譯完成後的rtthread

Cesium學習筆記(四)Camera

ttr can str efault 簡單的 list 事件處理 get provider http://blog.csdn.net/HobHunter/article/details/74909641 Cesium 相機控制場景中的視野。操作相機的方法有很多,如

安卓學習筆記之-camera實現圖片的3D旋轉

</pre>這幾天寫了一個關於圖片的3D旋轉的動畫效果,在寫這個動畫的時候,我遇到了許多的問題,在這期間我查詢了許多資料,弄懂了一些東西,也有一些東西沒有弄懂。比如:<p></p><p><span style="fon

three.js學習筆記(三)-camera.up屬性探索

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <

Android Camera系列學習筆記 (開篇)

以前寫部落格都像是隨筆,看了很多大牛的部落格之後,發現他們都是有計劃的在組織知識體系。雖然現在水平還沒到達到那樣的程度,不妨也來模仿一下。 首先整理下我對於Camera的理解,並且今後一定要儘快完成這部分的學習: 1 Camera的App開發。 2 Ca

Robot Operating System (ROS)學習筆記4---語音控制

sla 語音 出現 tput http 學習 process 輸入 ubun 搭建環境:XMWare Ubuntu14.04 ROS(indigo) 轉載自古月居 轉載連接:http://www.guyuehome.com/260 一、語音識別包 1、安裝

MySQL學習筆記(六)—— MySQL自連接

概念 cor 子查詢 ron 表操作 例子 質量 _id order by 有的時候我們需要對同一表中的數據進行多次檢索,這個時候我們可以使用之前學習過的子查詢,先查詢出需要的數據,再進行一次檢索。 例如:一張products表,有產品id,供應商id(vend_

jquery 深入學習筆記之中的一個 (事件綁定)

color 動態 name his pan mouseover this pre con 【jquery 事件綁定】 1、加入元素事件綁定 (1) 加入事件為當前元素 $(‘p‘).on(‘click‘,function(){ //code here ..

AngularJS入門學習筆記

rect directive 技術分享 attr 兩個 ava 內容 module 大括號 首先聲明: 本博客源自於學習:跟我學AngularJs:AngularJs入門及第一個實例。通過學習,我自己的一些學習筆記。 1.AngularJS的一些基本特性 (1)使用雙大括號

Python學習筆記-2017.5.4

列表 lin 覆蓋範圍 復習 處理 pytho 內部 global txt 本文章記錄學習過程中的細節和心得: 復習所學課程: 1、文件的操作:   打開文件,對文件的操作打開方式有兩種:   第一種:      f = open("test.txt", "r")#以只讀

SAS學習筆記之函數應用

不能 oracle 理解 資料 oracl 函數應用 特殊 put acl 今天在做數據需求的時候遇到一些問題,因為不能夠在數據庫裏面做,僅僅好在SAS裏面實現。這就遇到了一些麻煩,須要使用一些函數實現部分功能,如查找字段中某個特殊字符出現的次數,查找某個字符的位置等,

OpenCV2學習筆記(十五):利用Cmake高速查找OpenCV函數源代碼

one 生成 img log 分享 lan 學習筆記 全部 modules 在使用OpenCV時,在對一個函數的調用不是非常了解的情況下,通常希望查到該函數的官方聲明。而假設想進一步研究OpenCV的函數,則必須深入到源碼。在VS中我們能夠選中想要查

avalonjs 學習筆記1---checkbox

nod item ack lex server ini npm 學習 define 一、vscode 安裝使用 1.vs code+node.js下載安裝 2.在node.js command prompt 中運行 npm install -g live-server 3

Linux學習筆記(三):系統執行級與執行級的切換

查看 用戶操作 回車 water hat ntsysv tde 文件表 config 1.Linux系統與其它的操作系統不同,它設有執行級別。該執行級指定操作系統所處的狀態。Linux系統在不論什麽時候都執行於某個執行級上,且在不同的執行級上執行的程序和服務都不同,所要

Principle of Computing (Python)學習筆記(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

ide out generate depth sku color ati cond with 1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/prin

Java程序猿的JavaScript學習筆記(12——jQuery-擴展選擇器)

type write number article mat 我們 content ace val 計劃按例如以下順序完畢這篇筆記: Java程序猿的JavaScript學習筆記(1——理念) Java程序猿的JavaScript學習筆記(2——屬性復制和繼承) Jav

java學習筆記——String類

通過 ray [] 原理 log spl 2.3 -s 長度 一、概述 ·字符串是一個特殊的對象 ·字符串一旦初始化就不可以被改變 ·String str = "abc"; ·String str1 = new String("abc"); 有什麽區別? package

java學習筆記——java中對象的創建,初始化,引用的解析

初始 學習筆記 style article 學習 base 表達 如果 bsp 如果有一個A類。 1、例如以下表達式: A a1 = new A(); 那麽A是類,a1是引用。new A()是對象。僅僅是a1這個引用指向了new A()這個對象。 2、又如: A

構建之法 學習筆記04

部分 使用 用戶 != 工作 應該 覆蓋率 錯誤處理 必須 關於軟件工程的一些基本概念和技術 單元測試 絕大部分軟件都是由多人合作完成的,大家的工作互相有依賴關系。最典型的的例子就是,某人負責的模板的功能被其他人調用。軟件的額很多錯誤都是來源於程序員對模塊功能的誤解、疏忽或