高通linux-总线介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。转载请标注出处: https://blog.csdn.net/sheji105/article/details/82625952
  1. i2c
    1. 概述

驱动:

drivers/i2c/

高通平台的i2c:

drivers/i2c/busses/i2c-msm-v2.c

 

      1. 分析

本产品用到i2c的地方有:camera。

以camera的i2c为例:

设备树内容内容:


  1. i2c_3: i2c@78b7000 {
  2. compatible = "qcom,i2c-msm-v2";
  3. #address-cells = <1>;
  4. #size-cells = <0>;
  5. reg-names = "qup_phys_addr";
  6. reg = <0x78b7000 0x1000>;
  7. interrupt-names = "qup_irq";
  8. interrupts = <0 97 0>;
  9. clocks = <&clock_gcc 0x8caa5b4f>,
  10. <&clock_gcc 0x9e25ac82>;
  11. clock-names = "iface_clk", "core_clk";
  12. qcom,clk-freq-out = <100000>;
  13. qcom,clk-freq-in = <19200000>;
  14. pinctrl-names = "i2c_active", "i2c_sleep";
  15. pinctrl-0 = <&i2c_3_active>;
  16. pinctrl-1 = <&i2c_3_sleep>;
  17. qcom,noise-rjct-scl = <0>;
  18. qcom,noise-rjct-sda = <0>;
  19. dmas = <&dma_blsp1 8 64 0x20000020 0x20>,
  20. <&dma_blsp1 9 32 0x20000020 0x20>;
  21. dma-names = "tx", "rx";
  22. qcom,master-id = <86>;
  23. };

 

根据内核配置文件和compatible = "qcom,i2c-msm-v2"; 很容易找到概述

drivers/i2c/busses/i2c-msm-v2.c。

 

摘取i2c-msm-v2.c中关键内容:


  1. static struct of_device_id i2c_msm_dt_match[] = {
  2.        {
  3.               .compatible = "qcom,i2c-msm-v2",
  4.        },
  5.        {}
  6. };
  7.  
  8. static struct platform_driver i2c_msm_driver = {
  9.        .probe  = i2c_msm_probe,
  10.        .remove = i2c_msm_remove,
  11.        .driver = {
  12.               .name           = "i2c-msm-v2",
  13.               .owner          = THIS_MODULE,
  14.               .pm             = &i2c_msm_pm_ops,
  15.               .of_match_table = i2c_msm_dt_match,
  16.        },
  17. };
  18.  
  19. static int i2c_msm_init(void)
  20. {
  21.        return platform_driver_register(&i2c_msm_driver);
  22. }

 

结合linux i2c设备驱动原理,熟悉上面出现的函数。

 

以下函数,可对应到设备树内容中很多信息:


  1. /*
  2.  * i2c_msm_rsrcs_process_dt: copy data from DT to platform data
  3.  * @return zero on success or negative error code
  4.  */
  5. static int i2c_msm_rsrcs_process_dt(struct i2c_msm_ctrl *ctrl,
  6.                            struct platform_device *pdev)
  7. {
  8.    u32 fs_clk_div, ht_clk_div, noise_rjct_scl, noise_rjct_sda;
  9.    int ret;
  10.    struct i2c_msm_dt_to_pdata_map map[] = {
  11.    {"i2c",                        &pdev->id,    DT_REQ,  DT_ID,  -1},
  12.    {"qcom,clk-freq-out",          &ctrl->rsrcs.clk_freq_out,
  13.                                          DT_REQ,  DT_U32,  0},
  14.    {"qcom,clk-freq-in",           &ctrl->rsrcs.clk_freq_in,
  15.                                          DT_REQ,  DT_U32,  0},
  16.    {"qcom,disable-dma",           &(ctrl->rsrcs.disable_dma),
  17.                                          DT_OPT,  DT_BOOL, 0},
  18.    {"qcom,master-id",             &(ctrl->rsrcs.clk_path_vote.mstr_id),
  19.                                          DT_SGST, DT_U32,  0},
  20.    {"qcom,noise-rjct-scl",        &noise_rjct_scl,
  21.                                          DT_OPT,  DT_U32,  0},
  22.    {"qcom,noise-rjct-sda",        &noise_rjct_sda,
  23.                                          DT_OPT,  DT_U32,  0},
  24.    {"qcom,high-time-clk-div",     &ht_clk_div,
  25.                                          DT_OPT,  DT_U32,  0},
  26.    {"qcom,fs-clk-div",            &fs_clk_div,
  27.                                          DT_OPT,  DT_U32,  0},
  28.    {NULL,  NULL,                                0,       0,       0},
  29.    };
  30.    ret = i2c_msm_dt_to_pdata_populate(ctrl, pdev, map);
  31.    if (ret)
  32.        return ret;
  33.    /* set divider and noise reject values */
  34.    return i2c_msm_set_mstr_clk_ctl(ctrl, fs_clk_div, ht_clk_div,
  35.                                   noise_rjct_scl, noise_rjct_sda);
  36. }

 

输入输出时钟设置:

  qcom,clk-freq-out = <100000>;

  qcom,clk-freq-in = <19200000>;

 

 

    1.  i2c、spi、usb驱动架构的类比

这几个设备用的架构是linux常用架构之一。从板级逻辑层看,usb具有总线热拔插能力,这层对于usb设备已无意义;假如usb设备有这层代码,说明板子上有这个设备,但实际并没有usb设备,反而带来了错误。熟悉类比图中出现的函数名。

猜你喜欢

转载自blog.csdn.net/sheji105/article/details/82625952