SPI驱动程序,搜索从哪里开始

时间:2019-06-05 12:54:31

标签: android adb linux-device-driver spi device-tree

我是Android开发专家中的新手,但我想编写一个SPI驱动程序以连接SPI IC,然后编写一个Android应用程序以从该IC发送数据和从该IC接收数据。

从那里,我真的不知道在哪里创建驱动程序(以及驱动程序应包含的内容)以及如何在其上链接应用程序。我有一个可定制的Android内核(9.0 Pie, APQ8096_LA.UM.7.5.r1-03100-8x96.0_P_v5.0 )及其所有.dts,.dtsi,.c等。我还获得了评估板和用于映射的足够文档。

我用Google搜索了一个星期,却没有找到我想要的东西。我了解了一些有关设备树系统的知识。由于我拥有Snapdragon 820 msm8996,因此我修改了“ msm8996-blsp.dtsi”和“ msm8996-pinctrl.dtsi”。 我有这段代码:

msm8996-pinctrl.dtsi

&soc {
...
    spi_0 {
        spi_0_active: spi_0_active {
            spi_0 {
                pins = "gpio0", "gpio1", "gpio2", "gpio3";
                function = "blsp_spi1";
                drive-strength = <6>;
                bias-disable;
            };

        };

        spi_0_sleep: spi_0_sleep {
            spi_0 {
                pins = "gpio0", "gpio1", "gpio2", "gpio3";
                function = "blsp_spi1";
                drive-strength = <6>;
                bias-disable;
            };
        };
    };
...          

msm8996-blsp.dtsi

&soc {
...
    spi_0: spi@7575000 { //QUP Base address for BLSP1_QUP0
        compatible = "qcom,spi-qup-v2"; //Manufacturer and Model
        #address-cells = <1>;
        #size-cells = <0>;
        reg-names = "spi_physical", "spi_bam_physical";
        reg = <0x07575000 0x600>,
        <0x07544000 0x2b000>;
        interrupt-names = "spi_irq", "spi_bam_irq";
        interrupts = <0 95 0>, <0 238 0>;
        spi-max-frequency = <5000000>; //Maximum supported frequency in HZ
        qcom,infinite-mode = <0>;
        qcom,use-bam; // Enable BAM mode
        /* Add BAM pipes */
        qcom,bam-consumer-pipe-index = <12>;
        qcom,bam-producer-pipe-index = <13>;
        qcom,ver-reg-exists;
        qcom,master-id = <86>;
        qcom,use-pinctrl;
        pinctrl-names = "spi_default", "spi_sleep";
        pinctrl-0 = <&spi_0_active>;
        pinctrl-1 = <&spi_0_sleep>;
        clock-names = "iface_clk", "core_clk";
        clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>,
        <&clock_gcc clk_gcc_blsp1_qup1_spi_apps_clk>;
        status = "enabled";
    }
...

我用

构建此内核
$ ./build.sh msm8996 -j $(nproc)

我用fastboot刷新了评估板,然后进入adb。

$ adb root
$ adb wait-for-device
$ adb shell
# cd /sys/class/spi_master
# ls
// Nothing here

考虑到我的spi地址定义为@ 7575000,我希望输出为

# spi_0

我的代码是否正确才能启用它(我对设备树还不满意)?如果是这样,为什么在adb中不可见?我应该如何使其可见?使用Android应用程序访问此SPI的下一步应该是什么?

我在很多地方搜索了stackoverflow,但是为Android编写设备驱动程序似乎并不常见...

1 个答案:

答案 0 :(得分:0)

您无需为已在内核中的snapdragon编写SPI驱动程序。也许您需要编写一些内容以将其连接到设备。

将spi控制器公开给用户空间的最简单方法是mapping spidev to your device

您的内核(已添加CONFIG_SPI_SPIDEV=y config标志)和总线下的设备树

类似这样的东西:

&spi_0 {
   spidev@1 {
      #address-cells = <1>;
      #size-cells = <1>;
      compatible = "linux, spidev";
      spi-max-frequency = <20000000>;
      reg = <1>;   
   };
};

设备树与内核一起编译,并且除其他外还包含gpio映射和DMA配置,因此同一内核可以为多个板卡提供服务。确保android使用的是您新编译的内核和设备树,有时它会意外地使用预编译的内核之一进行构建。

完成这些步骤后,/ dev中应该有一个/dev/spidev0.0(或其他数字) 使用ioctl可以使用复杂的操作。

要验证您的软件是否已与SPI总线完全连接,请从MOSI到MISO连接一条导线,SPI writeread命令将回显它接收到的相同数据-拔下导线并确认没有任何导线。

这时您应该开始与传感器通信,并开发其控制软件。

在上述情况下,我将开始检查内核引导过程中的日志打印,以验证它可以正确识别硬件并加载了驱动程序。