读/写SPI设备

时间:2017-01-24 12:31:12

标签: linux-device-driver embedded-linux atmel

(我真的不确定要应用哪些标签,所以如果我选择了错误的标签,请提前道歉。)

我希望这不是一个太愚蠢的问题,但我真的迷失了。

一位客户借给我一个Atmel SAMA5D2 Xplained board with Linux4SAM来玩。我试图在其上连接SPI接口,但我不知道从哪里开始。

为了清楚起见,我使用过类似的板(不是特定的)裸金属板。我已经使用Linux多年了,并在几年前编写了一些简单的设备驱动程序。我还是迷路了。

dmesg | grep spi给出了以下输出:

[    1.840000] atmel_spi f8000000.spi: version: 0x311
[    1.840000] atmel_spi f8000000.spi: Using dma0chan0 (tx) and dma0chan1 (rx) for DMA transfers
[    1.850000] atmel_spi f8000000.spi: Using FIFO (16 data)
[    1.860000] atmel_spi f8000000.spi: Atmel SPI Controller at 0xf8000000 (irq 32)
[    1.860000] m25p80 spi32766.0: at25df321a (4096 Kbytes)

由此我推断驱动程序已加载并且配置为使用DMA。然而,查看/dev/没有什么看起来像SPI设备(我期待找到像/dev/spidev/dev/spi32766.0或类似的东西。)

这是否意味着没有加载实际的设备驱动程序?我是否必须写一个才能使用SPI?

如果我查看Makefile in the Linux4SAM source tree,我会在第1171行看到内核不支持加载模块。这是否意味着我必须重新编译内核以包含我的新驱动程序?这似乎是一种愚蠢的做法;如果我不能用它访问硬件,为什么要提供Linux发行版?

我在这里缺少什么? (我觉得相当愚蠢......)

编辑要明确:我想访问将连接到某个外部设备的外部SPI接口。我认为m25p80是一些内部闪存;我对那里的读/写不感兴趣。

2 个答案:

答案 0 :(得分:1)

spidev 是标准的Linux设备驱动程序,它仅通过 / dev 界面将低级API导出到用户空间

如果要访问特定的SPI客户端(从属),则应编写驱动程序 根据Linux SPI驱动程序模型:

static const struct of_device_id myspi_dt_ids[] = {
{ .compatible = "xxxx,yyyyy" },
{},

static struct spi_driver xxx_spi_driver = {
.driver = {
    .name =     "myspi",
    .owner =    THIS_MODULE,
    .of_match_table = of_match_ptr(myspi_dt_ids),
},
.probe =    myspi_probe,
.remove =   myspi_remove,

例如定义spi_driver结构,of_device_id结构,回调(挂钩)并进行注册。 您应该使用兼容的属性字符串将其绑定到DT节点。

            myspi@0 {
            compatible = "xxxx,yyyyy";
            spi-max-frequency = <5000000>;
            reg = <0>;
        };

  

compatible =“ linux,spidev”;

Linux不鼓励使用此兼容属性,因为节点应 描述真实的硬件设备而不是用户空间抽象

答案 1 :(得分:0)

@ 0andriy让我走上正轨。我必须将SPI资源添加到设备树并将编译设备树Blob闪存到电路板。 (因为我根本不了解设备树,所以很难找到这些信息......)。

我现在有一个/dev/spidev32765.0。我将其添加到设备树中:

        spi1: spi@fc000000 {
            pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_spi1_default>;
            status = "okay";

            spidev@0 {
                compatible = "linux,spidev";
                spi-max-frequency = <83000000>;
                reg = <0>;
            };
        };

        pinctrl@fc038000 {
            pinctrl_spi1_default: spi1_default {
                pinmux = <PIN_PD25__SPI1_SPCK>,
                     <PIN_PD26__SPI1_MOSI>,
                     <PIN_PD27__SPI1_MISO>,
                     <PIN_PD28__SPI1_NPCS0>;
                bias-disable;
            };
        };

虽然我读到添加spidev@0并不是正确的事情(我确实在dmesg输出中看到了“spidev spi32765.0:bug DT:直接在DT中列出的spidev”)。

现在,如果我运行spidev_test它仍然不起作用(它超时),但我猜这是另一个问题。