色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RK3568 MIPI CSI攝像頭GC8034適配工作流程

jf_NsPBt3VS ? 來源:風火輪技術團隊 ? 2023-07-04 09:27 ? 次閱讀

本文以RK3568外接GC8034為例,首先介紹MIPI CSI攝像頭的適配方法,然后介紹cmos sensor驅動的一些細節與cmos sensor驅動的工作流程。

硬件準備

首先介紹一下硬件。主板為風火輪科技的YY3568開發板,主控RK3568。

它支持一個MIPI CSI接口。此接口為4LANE,可以拆分為2個2LANE的。攝像頭模組為TSC8034-HYX5,此模組主控為GC8034。此外,模組上面有一顆DW9714,這是一顆VCM,用于控制鏡頭伸縮。模組連接到一個轉接板,然后轉接板通過排線連接到YY3568開發板MIPI CSI接口。

目前市面上大多數的cmos image sensor一般會包含控制接口(i2cspi等)用于寄存器讀寫,數據接口(csi/bt656等)用于傳原始圖像(raw image)數據。

軟件準備

本文所有的源碼分析基于rk的4.19版本kernel。

Android和Debian用的內核源碼是一樣的。

V4L2框架簡介

V4L2(Video for linux2)為linux中關于video設備的內核驅動。目前RK平臺全部使用V4L2框架來操作攝像頭設備。V4L2框架的組成大致如下圖所示

05b62c92-19b3-11ee-962d-dac502259ad0.jpg

V4L2里面有v4l2-subdev和v4l2_device,以及videobuf2-core三類設備。

v4l2-subdev指的是硬件上面的接口,包括sensor,以及sensor的接口如mipicsi或者bt656等。對于用戶層來說,其控制節點為/dev/v4l-subdevX。

v4l2_device指的是那種能夠向用戶層傳遞數據的設備,在rk平臺上,這個設備可以是ISP(ImageSignal Processing unit),也可以是CIF(Camera Interface)。ISP具備圖像處理功能,縮放以及壓縮功能。如果需要對圖像進行預處理,則需要用到ISP。其控制節點為 /dev/videoX

videobuf2-core用于分配和處理視頻幀緩沖區,比如對mmap等操作提供支持。

Kernel部分修改

首先要配置鏈路。由于從GC8034獲取的圖像需要進行前處理才能被用戶層使用,因此需要使用ISP,將鏈路設置為GC8034-> MIPI 接口->ISP。

首先配置GC8034。板上攝像頭接口的定義如下

05df4c26-19b3-11ee-962d-dac502259ad0.png

此處可以看出,其復位腳使用的是GPIO3_B5,電源使能腳用的是GPIO4_B5,然后使用I2C4與GC8034和DW9714通信,另外攝像頭的時鐘要由主控提供,設備樹配置如下。

&i2c4 {
  status = "okay";


  dw9714: dw9714@c {
        compatible = "dongwoon,dw9714";
        status = "okay";
        reg = <0x0c>;
        rockchip,camera-module-index = <0>;
        rockchip,vcm-start-current = <10>;
        rockchip,vcm-rated-current = <85>;
        rockchip,vcm-step-mode = <5>;
        rockchip,camera-module-facing = "back";
    };




  gc8034: gc8034@37 {
    compatible = "galaxycore,gc8034";
    reg = <0x37>;
    clocks = <&cru CLK_CIF_OUT>;
    clock-names = "xvclk";
    power-domains = <&power RK3568_PD_VI>;
    //sensor mclk pinctl設置。如果sensor的工作時鐘由主控提供,則此處必須配置
    pinctrl-names = "default";
    pinctrl-0 = <&cif_clk>;
    // reset管腳分配及有效電平
    reset-gpios = <&gpio3 RK_PB5 GPIO_ACTIVE_LOW>;
    // powerdown管腳分配及有效電平
    pwdn-gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_LOW>;
    rockchip,grf = <&grf>;
    // 模組編號,該編號不要重復
    rockchip,camera-module-index = <0>;
    // 模組朝向,有"back"和"front"
    rockchip,camera-module-facing = "back";
    rockchip,camera-module-name = "RK-CMK-8M-2-v1";
    rockchip,camera-module-lens-name = "CK8401";
    lens-focus = <&dw9714>;
    port {
      gc8034_out: endpoint {
        // csi2 dphy端的port名
        remote-endpoint = <&mipi_in_ucam0>;
        // csi2 dphy lane數,1lane為 <1>, 4lane為 <1 2 3 4>
        // rk3568支持1*4lane和2*2lane兩種模式
        data-lanes = <1 2 3 4>;
      };
    };
  };
};

然后需要配置CSI鏈路。RK3568的CSI有兩種工作模式,1*4LANE和2*2LANE。如果是前者,則需要使能csi2_dphy0,同時禁用csi2_dphy1/csi2_dphy2。后者相反。CSI的輸入端為GC8034,4LANE連接,輸出端為ISP,因此配置如下。

&csi2_dphy0 {
  //csi2_dphy0不與csi2_dphy1/csi2_dphy2同時使用,互斥
  status = "okay";
  ports {
    #address-cells = <1>;
    #size-cells = <0>;
    port@0 {
      reg = <0>;
      #address-cells = <1>;
      #size-cells = <0>;


      mipi_in_ucam0: endpoint@2 {
        reg = <2>;
        remote-endpoint = <&gc8034_out>;
        data-lanes = <1 2 3 4>;
      };
    };
    port@1 {
      reg = <1>;
      #address-cells = <1>;
      #size-cells = <0>;


      csidphy_out: endpoint@0 {
        reg = <0>;
        remote-endpoint = <&isp0_in>;
      };
    };
  };
};

然后ISP只需要配置輸入端,為CSI

&rkisp_vir0 {
  status = "okay";
  port {
    #address-cells = <1>;
    #size-cells = <0>;


    isp0_in: endpoint@0 {
      reg = <0>;
      remote-endpoint = <&csidphy_out>;
    };
  };
};

配置完這個鏈路之后,編譯內核,然后將內核燒錄到板上,即可使用攝像頭。

內核日志如下

05f7b6ee-19b3-11ee-962d-dac502259ad0.png

如果看到這個log,說明gc8034和csi2-dphy的鏈路已通。

GC8034驅動介紹

下面介紹一下GC8034的驅動。在kernel里面,由于有V4L2這個框架的存在,因此多數cmos image sensor的驅動的框架流程都差不多,只是在寄存器操作上存在差別。

首先是驅動注冊方面,GC8034支持通過I2C進行寄存器配置,而它的CSI接口只能用于raw image數據的發送,并不能進行控制。因此,它是一個I2C device。驅動的開始便是注冊了一個I2C device。如下

0609baba-19b3-11ee-962d-dac502259ad0.png

在設備樹上面的設備描述和驅動匹配時,便會執行probe函數。下面看下probe函數。

static int gc8034_probe(struct i2c_client *client,
       const struct i2c_device_id *id)
{
  struct device *dev = &client->dev;
  struct device_node *node = dev->of_node;
  struct gc8034 *gc8034;
  struct v4l2_subdev *sd;
  char facing[2];
  int ret;
...


  gc8034 = devm_kzalloc(dev, sizeof(*gc8034), GFP_KERNEL);
  if (!gc8034)
    return -ENOMEM;
  // 這些數據是為了 sensor 的 ioctl 獲取模組狀態
  // RK平臺的一些上層應用(比如android的camera應用) 需要獲取這些信息,以便實現前后攝像頭切換,3A參數匹配等
  ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
    &gc8034->module_index);
  ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
    &gc8034->module_facing);
  ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
    &gc8034->module_name);
  ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
    &gc8034->len_name);
...
  gc8034->client = client;


  gc8034->xvclk = devm_clk_get(dev, "xvclk");
...
  // 電源 復位等 gpio 獲取
...


  ret = gc8034_configure_regulators(gc8034);
...


  // 這個函數是獲取與之匹配的接口,也就是CSI的設備樹配置,主要是lane數
  ret = gc8034_parse_of(gc8034);
...


  // pinctrl資源獲取
...


  mutex_init(&gc8034->mutex);


  // 最重要的函數 v4l2_i2c_subdev_init 此函數注冊了一個v4l2 subdev,也就是將此攝像頭注冊到v4l2框架里面了
  // 其中 gc8034_subdev_ops 里面的就是gc8034響應上層控制的回調函數
  sd = &gc8034->subdev;
  v4l2_i2c_subdev_init(sd, client, &gc8034_subdev_ops);
  ret = gc8034_initialize_controls(gc8034);
...
  // 上電
  ret = __gc8034_power_on(gc8034);
...
  // 識別一下i2c上面是不是有gc8034存在,不存在的話會將上面的操作全部注銷掉
  ret = gc8034_check_sensor_id(gc8034, client);
...
  // 讀取gc8034 otp寄存器
  gc8034_otp_enable(gc8034);
  gc8034_otp_read(gc8034);
  gc8034_otp_disable(gc8034);


#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
  sd->internal_ops = &gc8034_internal_ops;
  sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
         V4L2_SUBDEV_FL_HAS_EVENTS;
#endif
#if defined(CONFIG_MEDIA_CONTROLLER)
  gc8034->pad.flags = MEDIA_PAD_FL_SOURCE;
  sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
  ret = media_entity_pads_init(&sd->entity, 1, &gc8034->pad);
  if (ret < 0)
    goto err_power_off;
#endif


...
  // 此v4l2設備采用異步注冊
  ret = v4l2_async_register_subdev_sensor_common(sd);
...
  return 0;


...
}

整個probe函數很長,這里刪掉了那些錯誤處理和打印的部分,并為剩下的操作提供了注釋。它的操作流程就是先從設備樹上獲取信息,然后申請gpio等資源,注冊v4l2設備,然后嘗試讀取一下gc8034的id,如果gc8034存在,則讀取其otp寄存器。在kernel啟動的過程中,這些信息就是操作otp寄存器打印出來的

0625b364-19b3-11ee-962d-dac502259ad0.png

一般來說,模組出廠的時候要進行校準,因為各個廠家基于同一個sensor芯片設計的模組存在硬件上面的差異,校準的內容包括AF(自動對焦校準)、AWB(白平衡校準)、LSC(鏡頭陰影校準),以及模組的出廠年月日廠商名等。前者一般需要被上層獲取,以便上層配置校準參數。

然后就是v4l2框架里面幾個比較重要的結構體。如下

static const struct v4l2_subdev_core_ops gc8034_core_ops = {
  .s_power = gc8034_s_power,
  .ioctl = gc8034_ioctl,
#ifdef CONFIG_COMPAT
  .compat_ioctl32 = gc8034_compat_ioctl32,
#endif
};


static const struct v4l2_subdev_video_ops gc8034_video_ops = {
  .s_stream = gc8034_s_stream,
  .g_frame_interval = gc8034_g_frame_interval,
  .g_mbus_config = gc8034_g_mbus_config,
};


static const struct v4l2_subdev_pad_ops gc8034_pad_ops = {
  .enum_mbus_code = gc8034_enum_mbus_code,
  .enum_frame_size = gc8034_enum_frame_sizes,
  .enum_frame_interval = gc8034_enum_frame_interval,
  .get_fmt = gc8034_get_fmt,
  .set_fmt = gc8034_set_fmt,
};


static const struct v4l2_subdev_ops gc8034_subdev_ops = {
  .core  = &gc8034_core_ops,
  .video  = &gc8034_video_ops,
  .pad  = &gc8034_pad_ops,
};

其中,

v4l2_subdev_core_ops主要是通用初始化的實現,gc8034中實現了上下電操作,也就是gc8034_s_power函數,還有一個ioctl操作,也就是gc8034_ioctl和gc8034_compat_ioctl32。

0635e98c-19b3-11ee-962d-dac502259ad0.png

這個s_power函數主要借助Linux的電源管理框架(pm)來實現gc8034電源使能腳的拉高拉低,此驅動是實現了dev_pm_ops里面的suspend和resume函數的。

另外還有一個write_array函數,這個函數主要用于初始化大多數的寄存器。大多數sensor的原廠會提供幾種分辨率下寄存器的配置表。將這個函數放在這里,意思就是每一次使能gc8034的電源之后都重新初始化所有寄存器。

064b0ad8-19b3-11ee-962d-dac502259ad0.png

而ioctl函數一般是實現平臺私有的一些ioctl命令(通用的v4l2 ioctl命令通過其它的ops實現)。比如這里RKMODULE_GET_MODULE_INFO就是獲取設備樹配置的朝向和名稱等信息,RKMODULE_AWB_CFG就是獲取上文所述的otp寄存器里面的值。

v4l2_subdev_video_ops主要是對視頻流進行控制,其中s_stream是必須實現的,用于控制視頻流的開啟和關閉。g_frame_interval是用于獲取當前幀率,g_mbus_config則是用于獲取lane數的,對于gc8034只能是2lane和4lane。

v4l2_subdev_pad_ops主要是對視頻格式進行控制。enum_mbus_codeenum_frame_size

enum_frame_interval三個成員是獲取當前sensor支持的格式,分辨率以及幀率。get_fmt set_fmt兩個成員則是用于獲取和設置當前sensor的格式分辨率和幀率。

對于rk平臺來說,要實現一個sensor驅動,實現上面的api就足夠了。如果是其它平臺,則要看是否需要私有的ioctl。通用的v4l2驅動是不需要私有ioctl的。

總結

本文以RK3568外接GC8034為例,首先介紹MIPI CSI攝像頭的適配方法,然后介紹cmos sensor驅動的一些細節與cmos sensor驅動的工作流程。參考GC8034的驅動,可以在通用平臺上實現sensor的適配。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5357

    瀏覽量

    120587
  • MIPI
    +關注

    關注

    11

    文章

    310

    瀏覽量

    48663
  • GPIO
    +關注

    關注

    16

    文章

    1205

    瀏覽量

    52163
  • RK3568
    +關注

    關注

    4

    文章

    517

    瀏覽量

    5094

原文標題:RK3568 MIPI CSI攝像頭GC8034 適配

文章出處:【微信號:風火輪技術團隊,微信公眾號:風火輪技術團隊】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    求助大神如何驅動TB8034攝像頭

    買了一個TOYBRICK的RK3568板子和一個適配的TB8034攝像頭,板子上燒了debian的系統,并下載了一個cheese無法打開攝像頭
    發表于 04-02 14:06

    RK3568單板的linux什么時候釋放支持雙路攝像頭的代碼

    使用RK3568單板,Camera拓撲為:Camera -》 mipi dphy -》 csi2 host-》 vicap ; mipi_lvds_sditf -》 isp vir0,
    發表于 04-14 11:35

    RK3568 CPU處理器測試步驟

    攝像頭的輸入能力,可滿足用戶多媒體方面的需求。  五、接口功能測試  RK3568具有較多的GPIO接口,PCIe總線,CAN總線,具備RTC,板載MIC、板載MIPI CSI,耳機接
    發表于 04-18 09:56

    RK3568 Sensor驅動包括了哪些回調函數

    ).static int gc8034_s_power(struct v4l2_subdev *sd, int on){struct gc8034 *gc8034 = to_gc8034
    發表于 04-29 15:25

    盤點RK3568為什么深受歡迎,且看RK3568核心板全新替代RK3288

    ;兩路MIPI攝像頭;3、RK3568功耗方面會更低一些,發熱量小,適合更多場景下應用;4、RK3568支持兩路MIPI
    發表于 04-29 15:55

    RK3566/RK3568平臺上的Camera使用指南

    1、MIPI CSI用法RK3566/RK3568平臺僅有一個標準物理mipi csi2 dph
    發表于 04-29 18:23

    RK3568 Ubuntu系統不能使用mipi攝像頭這是怎么回事

    問題描述及復現步驟:請問,AIO-3568J的板子,配套mipi攝像頭為CAM-2MS2MF 雙目攝像頭模組,采用雙目攝像頭模組的Ubunt
    發表于 08-25 16:58

    【飛凌RK3568開發板試用體驗】8-USB攝像頭實時AI物品識別初體驗

    上篇文章介紹Qt中USB攝像頭的使用,在調通攝像頭功能后,可用獲取攝像頭的每一幀畫面進行圖像處理。RK3568具有1TOPS算力的NPU,可以在板子上進行AI計算。OK
    發表于 12-13 23:31

    請問RK3568 MIPI RX DPHY接收MIPI協議的是否同時支持CSI與DSI兩種協議?

    請問RK3568 MIPI RX DPHY接收MIPI協議的是否同時支持CSI與DSI兩種協議?
    發表于 02-22 16:59

    國產工業級RK3568核心板-AI人臉識別產品方案

    ,自動對焦等功能的攝像頭模組,以保證圖像質量和拍攝效果。在圖像采集的過程中,可以使用RK3568內置的ISP圖像處理單元對圖像進行優化,提高人臉識別的準確率和穩定性。 LCD顯示屏:目前提供7寸MIPI
    發表于 05-06 14:30

    基于Rockchip RK3568的路由器開發方案

    。M.2 Key-e和mini PCIe接口,2 mipi DSI接口(可通過軟件切換LVDS), 1個CSI攝像頭接口,1個HDMI輸出.支持Android,Linux,OpenWRT系統 BPI-R2
    發表于 06-07 09:17

    如何連接STM32MP1系列產品與MIPI CSI-2攝像頭的信息

    本應用筆記提供關于如何連接 STM32MP1 系列產品與 MIPI CSI-2 攝像頭的信息。STM32MP1 系列產品(如 STM32 高性能MCU)可通過其 DCMI(數碼相機模塊接口)并行接口
    發表于 09-07 08:16

    RK3568麒麟系統板卡

    ;擁有MIPI-CSI x2,MIPI-DSI x2,HDMI2.0,EDP視頻接口,最多可支持三屏異顯輸出;內置8M ISP圖像信號處理器,可支持雙攝像頭與HDR功能;視頻輸入接口可外接攝像
    的頭像 發表于 03-22 15:48 ?880次閱讀
    <b class='flag-5'>RK3568</b>麒麟系統板卡

    RK3568/RK3588開發板人工智能AI攝像頭識別功能方案

    RK3568/RK3588開發板人工智能AI攝像頭識別功能方案
    的頭像 發表于 03-27 17:15 ?2107次閱讀
    <b class='flag-5'>RK3568</b>/<b class='flag-5'>RK</b>3588開發板人工智能AI<b class='flag-5'>攝像頭</b>識別功能方案

    迅為RK3568開發板Debian系統使用python 進行攝像頭開發

    迅為RK3568開發板Debian系統使用python 進行攝像頭開發
    的頭像 發表于 09-14 16:58 ?1561次閱讀
    迅為<b class='flag-5'>RK3568</b>開發板Debian系統使用python 進行<b class='flag-5'>攝像頭</b>開發
    主站蜘蛛池模板: 小雪奶水涨翁工帮吸的推荐语录| 伦 乱真实故事| 交换邻居波多野结衣中文字幕| 漂亮的av女演员| 2017年伦理片免费观看| 久久99精品AV99果冻传媒| 亚洲不卡一卡2卡三卡4卡5卡| 疯狂第一次国语| 熟妇的味道HD中文字幕| 丰满人妻熟女色情A片| 日久精品不卡一区二区| 丰满的大白屁股ass| 色www.亚洲免费视频| 丰满的寡妇hd高清在线观看| 桥本有菜护士| 大香伊人中文字幕精品| 色色色999| 爽死你个放荡粗暴小淫货漫画| 波多野结衣二区| 日本无码欧美激情在线视频| 成年AV动漫| 天天插天天射天天干| 国产毛多水多高潮高清| 亚洲成A人片在线观看中文不卡 | 亚欧日韩毛片在线看免费网站 | 久久精品电影院| 18美女腿打开无遮软件| 噼里啪啦免费观看视频大全| 怪物高h粗暴无尽| 亚洲h视频在线观看| 久久无码人妻中文国产| 99精品国产免费久久久久久下载 | 亚洲色t图| 内射少妇三洞齐开| 成人免费视频在线看| 午夜国产大片免费观看| 超碰97免费人妻| 无码AV毛片色欲欧洲美洲| 好姑娘社区在线视频| 中文字幕成人免费高清在线| 女人精69xxxxx舒心|