我是android开发人员的新手,但我想编写一个spi驱动程序来连接一个spi ic,然后编写一个android应用程序来从ic发送和接收数据。
从那以后,我真的不知道在哪里创建驱动程序(以及它应该包含什么)以及如何在上面链接应用程序。我有一个可定制的android内核(9.0pie,apq8096_la.um.7.5.r1-03100-8x96.0_p_v5.0)及其所有的.dts、.dts i、.c等等。我还得到了一个评估委员会和足够的地图文件。
我搜了一个星期都没找到我要找的东西。我了解了一些设备树系统。因为我有一个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)

我用快速启动闪现了我的评估板,然后我去了亚行。
$ 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编写设备驱动程序似乎并不常见……

最佳答案

不需要为snapdragon编写spi驱动程序它已经在内核中了。也许你需要写些东西把它连接到你的设备上。
向用户空间公开spi控制器的最简单方法是mapping spidev to your device
必须在内核(添加了CONFIG_SPI_SPIDEV=y配置标志)和总线下的设备树中支持此功能
像这样的:

&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(或其他号码)
可以使用复杂的操作。
要验证您的软件是否与spi总线完全连接,请连接一根从mosi到miso的电线,spi writeread命令将回显它接收到的相同数据-删除电线并验证没有任何内容。
这时你应该开始与你的传感器通信,并开发它的控制软件。
在上面的例子中,我将开始检查内核引导的日志打印,以验证它是否正确标识了硬件并加载了驱动程序。

关于android - SPI驱动程序,搜索从哪里开始,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56460916/

10-12 12:24