高通CamX框架學習系列:Bring Up Actuator


這篇文章主要介紹在高通平台的CamX框架里面,如何去點亮攝像頭馬達,需要修改哪些相關的文件。

一、大體瀏覽

先來個整體的瀏覽,看下涉及到需要修改哪些目錄下的文件。可以看下圖,要讓馬達運轉起來,我們需要修改的基本就是下面4個目錄下的相關文件。

1、各種型號的馬達配置文件目錄
vendor/qcom/proprietary/chi-cdk/oem/qcom/actuator

2、Camera sensor配置文件目錄
vendor/qcom/proprietary/chi-cdk/oem/qcom/module

3、各個Camera sensor編譯配置的文件目錄
vendor/qcom/proprietary/chi-cdk/tools/buildbins

4、這個目錄下是dtsi文件,主要配置Camera sensor上電時序等信息
vendor/qcom/proprietary/camera-devicetree

二、修改文件內容詳細分析

1)vendor/qcom/proprietary/chi-cdk/oem/qcom/actuator

這個目錄下,是各個型號的馬達配置文件,高通源碼里面已經有一些比較常見的馬達型號的配置文件,我們可以進行參考。

vendor/qcom/proprietary/chi-cdk/oem/qcom/actuator$ ls
ak7371_actuator.xml      dw9714v_actuator.xml  dw9763b_actuator.xml  gt9764_actuator.xml      lc898217xc_actuator.xml
ak7374_actuator.xml      dw9718s_actuator.xml  dw9767_actuator.xml   gt9772_actuator.xml
bu64297gwz_actuator.xml  dw9763_actuator.xml   dw9800_actuator.xml   

針對我們項目上用到的Camera sensor,模組廠會給我們提供關於該顆sensor的相關文檔,我們需要獲取的馬達相關信息,也能從提供的文檔中找到。

如下圖所示,就是模組廠提供的文檔里面的截圖,可以看到這個sensor是imx481,馬達型號是dw9714v,也就是在vendor/qcom/proprietary/chi-cdk/oem/qcom/actuator 這個目錄下,我們需要添加個dw9714v_actuator.xml的文件,如果sersor 用的馬達型號高通源碼已經有了,那直接用高通原始的配置就可以了。

我們隨便打開個xml的文件,看下里面都配置了哪些相關的信息。

<actuatorDriver
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="../../../api/sensor/camxactuatordriver.xsd">
  <module_version major_revision="1" minor_revision="0" incr_revision="0"/>

  <!--Actuator slave information -->
  <slaveInfo>
    <!--Name of  the actuator -->
    <actuatorName>ak7374</actuatorName>
    <!--8-bit or 10-bit write slave address 0x1C-->
    <slaveAddress>0x18</slaveAddress>
    <!--I2C frequency mode of slave
        Supported modes are: STANDARD (100 KHz), FAST (400 KHz), FAST_PLUS (1 MHz), CUSTOM (Custom frequency in DTSI) -->
    <i2cFrequencyMode>FAST</i2cFrequencyMode>
    <!--Actuator type Supported types are: VCM, BIVCM -->
    <actuatorType>VCM</actuatorType>
    <!--Data width in bits -->
    <dataBitWidth>10</dataBitWidth>
    <!--Sequence of power configuration type and configuration value required to control power to the device -->
    <powerUpSequence>
      <!--Power setting configuration
          Contains: configType, configValue and delay in milli seconds -->
      <powerSetting>
        <!--Power configuration type
            Supported types are: MCLK, VANA, VDIG, VIO, VAF, RESET, STANDBY -->
        <configType>VAF</configType>
        <!--Configuration value for the type of configuration -->
        <configValue>1</configValue>
        <!--Delay in milli seconds -->
        <delayMs>10</delayMs>
</powerSetting>
    </powerUpSequence>
    <!--Sequence of power configuration type and configuration value required to control power to the device -->
    <powerDownSequence>
      <!--Power setting configuration
          Contains: configType, configValue and delay in milli seconds -->
      <powerSetting>
        <!--Power configuration type
            Supported types are: MCLK, VANA, VDIG, VIO, VAF, RESET, STANDBY -->
        <configType>VAF</configType>
        <!--Configuration value for the type of configuration -->
        <configValue>0</configValue>
        <!--Delay in milli seconds -->
        <delayMs>1</delayMs>
      </powerSetting>
    </powerDownSequence>
  </slaveInfo>

   ......

<actuatorDriver

2)vendor/qcom/proprietary/chi-cdk/oem/qcom/module

這個目錄下,就是關於camera sensor的配置文件了,關於某顆sensor的的詳細信息,是在這邊進行創建添加的。

vendor/qcom/proprietary/chi-cdk/oem/qcom/module$ ls
altek1_imx577_module.xml              liteon_max7366_eyetrack_module.xml  pmd_irs1645_module.xml          sunny_imx519_module_talos.xml
altek2_imx577_module.xml              liteon_max7366_ov6211_module.xml    

下面是其中某顆sensor的module文件內容。

<?xml version="1.0" encoding="utf-8" ?>
<!--========================================================================-->
<!-- Copyright (c) 2017 Qualcomm Technologies, Inc.                         -->
<!-- All Rights Reserved.                                                   -->
<!-- Confidential and Proprietary - Qualcomm Technologies, Inc.             -->
<!--========================================================================-->
<cameraModuleData
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="..\..\..\api\sensor\camxmoduleconfig.xsd">
  <module_version major_revision="1" minor_revision="0" incr_revision="0"/>

    <!--Module group can contain either 1 module or 2 modules
      Dual camera, stereo camera use cases contain 2 modules in the group -->
  <moduleGroup>
    <!--Module configuration -->
    <moduleConfiguration description="Module configuration">
      <!--CameraId is the id to which DTSI node is mapped.
          Typically CameraId is the slot Id for non combo mode. -->
      <cameraId>0</cameraId>
      <!--Name of the module integrator -->
      <moduleName>oflim</moduleName>
      <!--Name of the sensor in the image sensor module -->
      <sensorName>imx376</sensorName>
      <!--Actuator name in the image sensor module
          This is an optional element. Skip this element if actuator is not present -->
      <actuatorName>dw9800</actuatorName>
      <!--EEPROM name in the image sensor module
          This is an optional element. Skip this element if EEPROM is not present -->
      <eepromName></eepromName>
      <!--Flash name is used to used to open binary.
          Binary name is of form flashName_flash.bin Ex:- pmic_flash.bin -->
      <flashName>pmic</flashName>
      <!--Chromatix name is used to used to open binary.
          Binary name is of the form sensor_model_chromatix.bin -->
      <chromatixName>ofilm_imx376</chromatixName>
      <!--Position of the sensor module.
       Valid values are: REAR, FRONT, REAR_AUX, FRONT_AUX, EXTERNAL -->
      <position>REAR</position>
      <!--CSI Information -->
      <CSIInfo description="CSI Information">
          <laneAssign>0x3210</laneAssign>
          <isComboMode>0</isComboMode>
      </CSIInfo>
      <!--Lens information -->
      <lensInfo description="Lens Information">
        <!--Focal length of the lens in millimeters. -->
        <focalLength>4.04</focalLength>
        <!--F-Number of the optical system. -->
        <fNumber>2.0</fNumber>
        <!--Minimum focus distance in meters. -->
        <minFocusDistance>0.1</minFocusDistance>
        <!--Total focus distance in meters. -->
        <maxFocusDistance>3.496</maxFocusDistance>
        <!--Horizontal view angle in degrees. -->
        <horizontalViewAngle>61.6</horizontalViewAngle>
        <!--Vertical view angle in degrees. -->
        <verticalViewAngle>46.2</verticalViewAngle>
        <!--Maximum Roll Degree. Valid values are: 0, 90, 180, 270, 360 -->
        <maxRollDegree>90</maxRollDegree>
        <!--Maximum Pitch Degree. Valid values are: 0 to 359 -->
        <maxPitchDegree>360</maxPitchDegree>
        <!--Maximum Yaw Degree. Valid values are: 0 to 359 -->
        <maxYawDegree>360</maxYawDegree>
      </lensInfo>
    </moduleConfiguration>
  </moduleGroup>
</cameraModuleData>

3)/vendor/qcom/proprietary/chi-cdk/tools/buildbins

前面我們說了馬達信息的配置文件和camera sensor的配置文件,那這些配置信息是在哪里會用到的呢,好了,就是在這個目錄下了。看到buildbins這個名字,我們就可以看到是和編譯相關的了,camx里面,各個模塊分的更細了,每顆sensor的module和turning等模塊,都是可以編譯成各自獨立的so文件,修改某個模塊的內容后,我們可以切到chi-cdk目錄下,進行mm編譯,編譯生成的對應so文件在vendor/lib*/目錄下。

vendor/qcom/proprietary/chi-cdk/tools/buildbins$ ls
buildbins_bengal.yaml  buildbins_lito.yaml  buildbins_sm6150.yaml  linux64  win32
buildbins_kona.yaml    buildbins.py         buildbins.yaml         NOTICE   yaml

我們打開其中一個yaml文件,看下里面的內容:

sensor_drivers:
- com.qti.sensormodule.truly_imx476:
    - sensor/imx476/imx476_sensor.xml
    - module/truly_imx476_module.xml

- com.qti.sensormodule.sunny_imx519:
    - sensor/imx519/imx519_sensor.xml
    - sensor/imx519/imx519_pdaf.xml
    - module/sunny_imx519_module.xml
    - eeprom/gt24p64b_imx519_eeprom.xml
    - actuator/dw9718s_actuator.xml
    - flash/back_sensor_flash.xml

4)vendor/qcom/proprietary/camera-devicetree

camera-devicetree 這邊的dtsi文件,配置的就是和camera上電相關的內容了, 修改了該目錄下的文件后,我們需要編譯dtbo.img文件來燒錄更新修改。

vendor/qcom/proprietary/camera-devicetree$ ls 
bengal-camera.dtsi             kona-camera-sensor-mtp.dtsi    lito-camera.dtsi
bengal-camera-sensor-idp.dtsi  kona-camera-sensor-qrd.dtsi    lito-camera-sensor-cdp.dtsi

我們打開其中一個dtsi文件,看下里面的內容;

&soc {
        led_flash_rear: qcom,camera-flash0 {
                cell-index = <0>;
                compatible = "qcom,camera-flash";
                flash-source = <&pm8150l_flash0 &pm8150l_flash1>;
                torch-source = <&pm8150l_torch0 &pm8150l_torch1>;
                switch-source = <&pm8150l_switch2>;
                status = "ok";
        };

        led_flash_rear_aux: qcom,camera-flash1 {
                cell-index = <1>;
                compatible = "qcom,camera-flash";
                flash-source = <&pm8150l_flash0 &pm8150l_flash1>;
                torch-source = <&pm8150l_torch0 &pm8150l_torch1>;
                switch-source = <&pm8150l_switch2>;
                status = "ok";
        };

        led_flash_triple_rear: qcom,camera-flash@4 {
                cell-index = <4>;
                compatible = "qcom,camera-flash";
                flash-source = <&pm8150l_flash0 &pm8150l_flash1>;
                torch-source = <&pm8150l_torch0 &pm8150l_torch1>;
                switch-source = <&pm8150l_switch2>;
                status = "ok";
        };

        led_flash_triple_rear_aux: qcom,camera-flash@5 {
                cell-index = <5>;
                compatible = "qcom,camera-flash";
                flash-source = <&pm8150l_flash0 &pm8150l_flash1>;
                torch-source = <&pm8150l_torch0 &pm8150l_torch1>;
                switch-source = <&pm8150l_switch2>;
                status = "ok";
        };
led_flash_triple_rear_aux2: qcom,camera-flash@6 {
                cell-index = <6>;
                compatible = "qcom,camera-flash";
                flash-source = <&pm8150l_flash0 &pm8150l_flash1>;
                torch-source = <&pm8150l_torch0 &pm8150l_torch1>;
                switch-source = <&pm8150l_switch2>;
                status = "ok";
        };

        qcom,cam-res-mgr {
                compatible = "qcom,cam-res-mgr";
                status = "ok";
        };
};

&cam_cci0 {
        actuator_rear: qcom,actuator0 {
                cell-index = <0>;
                compatible = "qcom,actuator";
                cci-master = <0>;
                cam_vaf-supply = <&pm8150a_l7>;
                regulator-names = "cam_vaf";
                rgltr-cntrl-support;
                rgltr-min-voltage = <2856000>;
                rgltr-max-voltage = <3104000>;
                rgltr-load-current = <100000>;
        };

        actuator_rear_aux: qcom,actuator1 {
                cell-index = <1>;
                compatible = "qcom,actuator";
                cci-master = <1>;
                cam_vaf-supply = <&pm8150a_l7>;
                regulator-names = "cam_vaf";

 };

        actuator_triple_wide: qcom,actuator4 {
                cell-index = <4>;
                compatible = "qcom,actuator";
                cci-master = <0>;
                cam_vaf-supply = <&pm8150a_l7>;
                regulator-names = "cam_vaf";
                rgltr-cntrl-support;
                rgltr-min-voltage = <2856000>;
                rgltr-max-voltage = <3104000>;
                rgltr-load-current = <100000>;
        };

        actuator_triple_tele: qcom,actuator5 {
                cell-index = <5>;
                compatible = "qcom,actuator";
                cci-master = <0>;
                cam_vaf-supply = <&pm8150a_l7>;
                regulator-names = "cam_vaf";
                rgltr-cntrl-support;
                rgltr-min-voltage = <2856000>;
                rgltr-max-voltage = <3104000>;
                rgltr-load-current = <100000>;
        };

        actuator_triple_uw: qcom,actuator6 {
                cell-index = <6>;
                compatible = "qcom,actuator";
                cci-master = <1>;
                cam_vaf-supply = <&pm8150a_l7>;
                regulator-names = "cam_vaf";
                rgltr-cntrl-support;
                rgltr-min-voltage = <2856000>;
                rgltr-max-voltage = <3104000>;
                rgltr-load-current = <100000>;
};

        eeprom_rear: qcom,eeprom0 {
                cell-index = <0>;
                compatible = "qcom,eeprom";
                cam_vio-supply = <&pm8009_l7>;
                cam_vana-supply = <&pm8009_l5>;
                cam_vdig-supply = <&pm8009_l1>;
                cam_clk-supply = <&titan_top_gdsc>;
                cam_vaf-supply = <&pm8150a_l7>;
                regulator-names = "cam_vio", "cam_vana", "cam_vdig",
                        "cam_clk", "cam_vaf";
                rgltr-cntrl-support;
                rgltr-min-voltage = <1800000 2800000 1104000 0 2856000>;
                rgltr-max-voltage = <1800000 3000000 1104000 0 3104000>;
                rgltr-load-current = <120000 80000 1200000 0 100000>;
                gpio-no-mux = <0>;
                pinctrl-names = "cam_default", "cam_suspend";
                pinctrl-0 = <&cam_sensor_mclk0_active
                                &cam_sensor_active_rear>;
                pinctrl-1 = <&cam_sensor_mclk0_suspend
                                &cam_sensor_suspend_rear>;
                gpios = <&tlmm 94 0>,
                        <&tlmm 93 0>;
                gpio-reset = <1>;
                gpio-req-tbl-num = <0 1>;
                gpio-req-tbl-flags = <1 0>;
                gpio-req-tbl-label = "CAMIF_MCLK0",
                                        "CAM_RESET0";
                sensor-position = <0>;
                sensor-mode = <0>;
                cci-master = <0>;
                status = "ok";
                clocks = <&clock_camcc CAM_CC_MCLK0_CLK>;
clock-names = "cam_clk";
                clock-cntl-level = "turbo";
                clock-rates = <24000000>;
        };

        eeprom_rear_aux: qcom,eeprom1 {
                cell-index = <1>;
                compatible = "qcom,eeprom";
                cam_vdig-supply = <&pm8009_l2>;
                cam_vio-supply = <&pm8009_l7>;
                cam_vana-supply = <&pm8009_l6>;
                cam_clk-supply = <&titan_top_gdsc>;
                cam_vaf-supply = <&pm8150a_l7>;
                regulator-names = "cam_vio", "cam_vana", "cam_vdig",
                        "cam_clk", "cam_vaf";
                rgltr-cntrl-support;
                rgltr-min-voltage = <1800000 2800000 1200000 0 2856000>;
                rgltr-max-voltage = <1800000 3000000 1200000 0 3104000>;
                rgltr-load-current = <120000 80000 1200000 0 100000>;
                gpio-no-mux = <0>;
                pinctrl-names = "cam_default", "cam_suspend";
                pinctrl-0 = <&cam_sensor_mclk1_active
                                 &cam_sensor_active_rear_aux>;
                pinctrl-1 = <&cam_sensor_mclk1_suspend
                                 &cam_sensor_suspend_rear_aux>;
                gpios = <&tlmm 95 0>,
                        <&tlmm 92 0>;
                gpio-reset = <1>;
                gpio-req-tbl-num = <0 1>;
                gpio-req-tbl-flags = <1 0>;
                gpio-req-tbl-label = "CAMIF_MCLK1",
                                        "CAM_RESET1";
                sensor-position = <0>;
                sensor-mode = <0>;
                cci-master = <1>;

status = "ok";
                clocks = <&clock_camcc CAM_CC_MCLK2_CLK>;
                clock-names = "cam_clk";
                clock-cntl-level = "turbo";
                clock-rates = <24000000>;
        };

qcom,cam-sensor0 {
                cell-index = <0>;
                compatible = "qcom,cam-sensor";
                csiphy-sd-index = <0>;
                sensor-position-roll = <90>;
                sensor-position-pitch = <0>;
                sensor-position-yaw = <180>;
                actuator-src = <&actuator_rear>;
                led-flash-src = <&led_flash_rear>;
                eeprom-src = <&eeprom_rear>;
                cam_vio-supply = <&pm8009_l7>;
                cam_bob-supply = <&pm8150a_bob>;
                cam_vana-supply = <&pm8009_l5>;
                cam_vdig-supply = <&pm8009_l1>;
                cam_clk-supply = <&titan_top_gdsc>;
                regulator-names = "cam_vio", "cam_vana", "cam_vdig",
                        "cam_clk", "cam_bob";
                rgltr-cntrl-support;
                pwm-switch;
                rgltr-min-voltage = <1800000 2800000 1104000 0 3008000>;
                rgltr-max-voltage = <1800000 3000000 1104000 0 3960000>;
                rgltr-load-current = <120000 80000 1200000 0 2000000>;
                gpio-no-mux = <0>;
                pinctrl-names = "cam_default", "cam_suspend";
                pinctrl-0 = <&cam_sensor_mclk0_active
                                &cam_sensor_active_rear>;
                pinctrl-1 = <&cam_sensor_mclk0_suspend
                                &cam_sensor_suspend_rear>;
                gpios = <&tlmm 94 0>,
                        <&tlmm 93 0>;
                gpio-reset = <1>;
                gpio-req-tbl-num = <0 1>;
                gpio-req-tbl-flags = <1 0>;
                gpio-req-tbl-label = "CAMIF_MCLK0",
 gpio-req-tbl-label = "CAMIF_MCLK0",
                                        "CAM_RESET0";
                sensor-mode = <0>;
                cci-master = <0>;
                status = "ok";
                clocks = <&clock_camcc CAM_CC_MCLK0_CLK>;
                clock-names = "cam_clk";
                clock-cntl-level = "turbo";
                clock-rates = <24000000>;
        };

        qcom,cam-sensor1 {
                cell-index = <1>;
                compatible = "qcom,cam-sensor";
                csiphy-sd-index = <1>;
                sensor-position-roll = <90>;
                sensor-position-pitch = <0>;
                sensor-position-yaw = <180>;
                eeprom-src = <&eeprom_rear_aux>;
                led-flash-src = <&led_flash_rear_aux>;
                actuator-src = <&actuator_rear_aux>;
                cam_bob-supply = <&pm8150a_bob>;
                cam_vdig-supply = <&pm8009_l2>;
                cam_vio-supply = <&pm8009_l7>;
 regulator-names = "cam_vio", "cam_vana", "cam_vdig",
                        "cam_clk", "cam_bob";
                rgltr-cntrl-support;
                pwm-switch;
                rgltr-min-voltage = <1800000 2800000 1200000 0 3008000>;
                rgltr-max-voltage = <1800000 3000000 1200000 0 3960000>;
                rgltr-load-current = <120000 80000 1200000 0 2000000>;
                gpio-no-mux = <0>;
                pinctrl-names = "cam_default", "cam_suspend";
                pinctrl-0 = <&cam_sensor_mclk1_active
                                &cam_sensor_active_rear_aux>;
                pinctrl-1 = <&cam_sensor_mclk1_suspend
                                &cam_sensor_suspend_rear_aux>;
                gpios = <&tlmm 95 0>,
                        <&tlmm 92 0>;
                gpio-reset = <1>;
                gpio-req-tbl-num = <0 1>;
                gpio-req-tbl-flags = <1 0>;
                gpio-req-tbl-label = "CAMIF_MCLK1",
                                        "CAM_RESET1";
                sensor-mode = <0>;
                cci-master = <1>;
                status = "ok";
                clocks = <&clock_camcc CAM_CC_MCLK1_CLK>;
                clock-names = "cam_clk";
                clock-cntl-level = "turbo";
                clock-rates = <24000000>;
        };

&cam_cci1 {
qcom,cam-sensor2 {
                cell-index = <2>;
                compatible = "qcom,cam-sensor";
                csiphy-sd-index = <2>;
                sensor-position-roll = <270>;
                sensor-position-pitch = <0>;
                sensor-position-yaw = <0>;
                eeprom-src = <&eeprom_front>;
                cam_vio-supply = <&pm8009_l7>;
                cam_bob-supply = <&pm8150a_bob>;
                cam_vana-supply = <&pm8009_l6>;
                cam_vdig-supply = <&pm8009_l3>;
                cam_clk-supply = <&titan_top_gdsc>;
                regulator-names = "cam_vio", "cam_vana", "cam_vdig",
                        "cam_clk", "cam_bob";
                rgltr-cntrl-support;
                pwm-switch;
                rgltr-min-voltage = <1800000 2800000 1056000 0 3008000>;

pinctrl-0 = <&cam_sensor_mclk2_active
                                 &cam_sensor_active_rst2>;
                pinctrl-1 = <&cam_sensor_mclk2_suspend
                                 &cam_sensor_suspend_rst2>;
                gpios = <&tlmm 96 0>,
                        <&tlmm 78 0>;
                gpio-reset = <1>;
                gpio-req-tbl-num = <0 1>;
                gpio-req-tbl-flags = <1 0>;
                gpio-req-tbl-label = "CAMIF_MCLK2",
                                        "CAM_RESET2";
                sensor-mode = <0>;
                cci-master = <0>;
                status = "ok";
                clocks = <&clock_camcc CAM_CC_MCLK2_CLK>;
                clock-names = "cam_clk";
                clock-cntl-level = "turbo";
                clock-rates = <24000000>;
        };

        qcom,cam-sensor3 {
                cell-index = <3>;
                compatible = "qcom,cam-sensor";
                csiphy-sd-index = <3>;
                eeprom-src = <&eeprom_tof>;
                sensor-position-roll = <270>;
                sensor-position-pitch = <0>;
                sensor-position-yaw = <0>;
                cam_vio-supply = <&pm8009_l7>;
                cam_vdig-supply = <&vreg_tof>;
                cam_clk-supply = <&titan_top_gdsc>;
rgltr-min-voltage = <1800000 3600000 0>;
                rgltr-max-voltage = <1800000 3600000 0>;
                rgltr-load-current = <180000 120000 0>;
                gpio-no-mux = <0>;
                pinctrl-names = "cam_default", "cam_suspend";
                pinctrl-0 = <&cam_sensor_mclk3_active
                                 &cam_sensor_active_3>;
                pinctrl-1 = <&cam_sensor_mclk3_suspend
                                 &cam_sensor_suspend_3>;
                gpios = <&tlmm 97 0>,
                        <&tlmm 109 0>;
                gpio-reset = <1>;
                gpio-req-tbl-num = <0 1>;
                gpio-req-tbl-flags = <1 0>;
                gpio-req-tbl-label = "CAMIF_MCLK3",
                                        "CAM_RESET3";
                sensor-mode = <0>;
                cci-master = <1>;
                status = "ok";
                clocks = <&clock_camcc CAM_CC_MCLK3_CLK>;
                clock-names = "cam_clk";
                clock-cntl-level = "turbo";
                clock-rates = <24000000>;
        };
};

------- 2020.05.18   20:36

=======================================================================================

*本人從事Android Camera相關開發已有5年,
*目前在深圳上班,
*小伙伴記得點我頭像關注,也可以關注我的微信公眾號【小馳筆記】,希望和更多的小伙伴一起交流 ~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM