高通APQ8074 spi 接口配置
高通APQ8074 spi 接口配置
8074 平臺含有兩個BLSP(BAM Low-Speed Peripheral) , 每一個BLSP含有兩個QUP, 每一個QUP可以被配置為I2C, SPI, UART, UIM接口, BLSP是高通對于低速接口的一種管理方式。
每個QUP是和特定的引腳相關(guān)的, 如下圖所示,比如下面的引腳是屬于BLSP8的, 也就是第二個BLSP的第二個QUP,?
注意這些引腳只能被配置到第二個BLSP的第2個QUP上,可以通過繼續(xù)查看高通相關(guān)資料
QUP的中斷相關(guān)信息
得到這些信息后,如果只是要將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驅(qū)動, 可以修改spidev.c的 compatible 把名字修改為device tree相同的名字,之后kernel會掛在這個設備到spi總線,dev目錄下將會出現(xiàn)spidev8.0的設備節(jié)點*/
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不要和已經(jīng)注冊的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設備驅(qū)動,這個驅(qū)動也需要修改spi_qsd.c 保存實際傳輸數(shù)據(jù)長度的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, 需要注意一下電平轉(zhuǎn)換芯片的電壓,一定要在PMIC中時能對應的電壓。
總結(jié)
以上是生活随笔為你收集整理的高通APQ8074 spi 接口配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩托罗拉SE4500 德州仪器TI Om
- 下一篇: Linux加载DTS设备节点的过程(以高