高通APQ8074 spi 接口配置

高通APQ8074 spi 接口配置


8074 平臺含有兩個BLSP(BAM Low-Speed Peripheral) , 每一個BLSP含有兩個QUP, 每一個QUP可以被配置爲I2C, SPI, UART, UIM接口, BLSP是高通對於低速接口的一種管理方式。


每個QUP是和特定的引腳相關的, 如下圖所示,比如下面的引腳是屬於BLSP8的, 也就是第二個BLSP的第二個QUP, 



注意這些引腳只能被配置到第二個BLSP的第2個QUP上,可以通過繼續查看高通相關資料


QUP的中斷相關信息



得到這些信息後,如果只是要將SPI配置成FIFO模式,而不是BAM模式,需要修改如下文件

diff --git a/arch/arm/boot/dts/msm8974.dtsi b/arch/arm/boot/dts/msm8974.dtsi
index 4178acf..649aa87 100644
--- a/arch/arm/boot/dts/msm8974.dtsi
+++ b/arch/arm/boot/dts/msm8974.dtsi
@@ -20,6 +20,7 @@
        aliases {
                spi0 = &spi_0;
                spi7 = &spi_7;
+               spi8 = &spi_8;
                sdhc1 = &sdhc_1; /* SDC1 eMMC slot */
                sdhc2 = &sdhc_2; /* SDC2 SD card slot */
                sdhc3 = &sdhc_3; /* SDC3 SDIO slot */
@@ -888,6 +889,27 @@
                qcom,master-id = <86>;
        };
 
+       spi_8: spi@f9964000 {
+               compatible = "qcom,spi-qup-v2";
+               reg = <0xf9964000 0x1000>;
+               interrupts = <0 102 0>;
+               spi-max-frequency = <19200000>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               qcom,gpio-clk  = <&msmgpio 48 0>; /* CLK */
+               qcom,gpio-miso = <&msmgpio 46 0>; /* MISO */
+               qcom,gpio-mosi = <&msmgpio 45 0>; /* MOSI */
+               qcom,gpio-cs0 = <&msmgpio 47 0>;
+
+               qcom,master-id = <84>;
+
+               spidev@0 { //Slave driver and CS ID
+                       compatible = "qcom,spi_name"; //Manufacture, and Mode
+                       reg = <0>; //Same as CS ID
+                       spi-max-frequency = <3200000>; //Max Frequency for Device
+               };
+       };
+
        qcom,clock-krait@f9016000 {
                compatible = "qcom,clock-krait-8974";
                reg = <0xf9016000 0x20>,

/*使能 spi驅動, 可以修改spidev.c的 compatible 把名字修改爲device tree相同的名字,之後kernel會掛在這個設備到spi總線,dev目錄下將會出現spidev8.0的設備節點*/

diff --git a/arch/arm/configs/msm8974_defconfig b/arch/arm/configs/msm8974_defconfig
index a12538a..74c51e6 100755
--- a/arch/arm/configs/msm8974_defconfig
+++ b/arch/arm/configs/msm8974_defconfig
@@ -315,7 +315,7 @@ CONFIG_I2C_CHARDEV=y
 CONFIG_I2C_QUP=y
 CONFIG_SPI=y
 CONFIG_SPI_QUP=y
-CONFIG_SPI_SPIDEV=m
+CONFIG_SPI_SPIDEV=y
 CONFIG_SPMI=y
 CONFIG_SPMI_MSM_PMIC_ARB=y
 CONFIG_MSM_QPNP_INT=y

修改gpio SPI屬性,注意GPIO的function不要和已經註冊的function 衝突

diff --git a/arch/arm/mach-msm/board-8974-gpiomux.c b/arch/arm/mach-msm/board-8974-gpiomux.c
index cec1a8f..6d67f18 100755
--- a/arch/arm/mach-msm/board-8974-gpiomux.c
+++ b/arch/arm/mach-msm/board-8974-gpiomux.c
@@ -683,6 +683,35 @@ static struct msm_gpiomux_config msm_blsp_configs[] __initdata = {
                        [GPIOMUX_SUSPENDED] = &gpio_suspend_config[0],
                },
        },
+
+       {
+               .gpio = 45,      /* BLSP2 QUP1 SPI_DATA_MOSI */
+               .settings = {
+                       [GPIOMUX_ACTIVE] = &gpio_spi_config,
+                       [GPIOMUX_SUSPENDED] = &gpio_suspend_config[1],
+               },
+       },
+       {
+               .gpio = 46,      /* BLSP2 QUP1 SPI_DATA_MISO */
+               .settings = {
+                       [GPIOMUX_ACTIVE] = &gpio_spi_config,
+                       [GPIOMUX_SUSPENDED] = &gpio_suspend_config[1],
+               },
+       },
+       {
+               .gpio = 48,      /* BLSP2 QUP1 SPI_CLK */
+               .settings = {
+                       [GPIOMUX_ACTIVE] = &gpio_spi_config,
+                       [GPIOMUX_SUSPENDED] = &gpio_suspend_config[0],
+               },
+       },
+       {
+               .gpio = 47,      /* BLSP2 QUP1 SPI_CS0_N */
+               .settings = {
+                       [GPIOMUX_ACTIVE] = &gpio_spi_config,
+                       [GPIOMUX_SUSPENDED] = &gpio_suspend_config[0],
+               },
+       },
 };


diff --git a/arch/arm/mach-msm/clock-8974.c b/arch/arm/mach-msm/clock-8974.c
index 128a363..adff33a 100755
--- a/arch/arm/mach-msm/clock-8974.c
+++ b/arch/arm/mach-msm/clock-8974.c
@@ -4967,7 +4967,8 @@ static struct clk_lookup msm_clocks_8974_common[] __initdata = {
        CLK_LOOKUP("core_clk", gcc_blsp2_qup1_i2c_apps_clk.c, ""),
        CLK_LOOKUP("core_clk", gcc_blsp2_qup1_spi_apps_clk.c, ""),
        CLK_LOOKUP("core_clk", gcc_blsp2_qup2_i2c_apps_clk.c, ""),
-       CLK_LOOKUP("core_clk", gcc_blsp2_qup2_spi_apps_clk.c, ""),
+       CLK_LOOKUP("iface_clk", gcc_blsp2_ahb_clk.c, "f9964000.spi"),
+       CLK_LOOKUP("core_clk", gcc_blsp2_qup2_spi_apps_clk.c, "f9964000.spi"),
        CLK_LOOKUP("core_clk", gcc_blsp2_qup3_i2c_apps_clk.c, ""),
        CLK_LOOKUP("core_clk", gcc_blsp2_qup3_spi_apps_clk.c, ""),
        CLK_LOOKUP("core_clk", gcc_blsp2_qup4_i2c_apps_clk.c, ""),


最後注意下使能的spidev.c設備驅動,這個驅動也需要修改spi_qsd.c 保存實際傳輸數據長度的actual_lenght字段不會被賦值,需要對spidev.c文件進行少許的修改

diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
index aaf0265..efb7d07 100644
--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c

@@ -198,14 +204,14 @@ spidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
 
        mutex_lock(&spidev->buf_lock);
        status = spidev_sync_read(spidev, count);
-       if (status > 0) {
+       if (status >= 0) {
                unsigned long   missing;
 
-               missing = copy_to_user(buf, spidev->buffer, status);
-               if (missing == status)
+               missing = copy_to_user(buf, spidev->buffer, count);
+               if (missing == count)
                        status = -EFAULT;
                else
-                       status = status - missing;
+                       status = count - missing;
        }
        mutex_unlock(&spidev->buf_lock);

之後可以通過打開dev/spidev8.0文件進行SPI設備的讀寫測試,需要注意的是,如果你用dragonboard, 需要注意一下電平轉換芯片的電壓,一定要在PMIC中時能對應的電壓。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章