首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读写SPI设备

读写SPI设备
EN

Stack Overflow用户
提问于 2017-01-24 12:31:12
回答 2查看 10.3K关注 1票数 1

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

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

一个客户借给我一台Atmel SAMA5D2 Xplained板与Linux4SAM来玩。我试图在上面连接SPI接口,但是我不知道从哪里开始。

要明确的是,我使用了类似的板(不是这个)裸露金属。我也使用Linux很多年了,几年前我写了一些简单的设备驱动程序。但我还是迷路了。

dmesg | grep spi提供了以下输出:

代码语言:javascript
复制
[    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吗?

如果我看一下Linux4SAM源树中的Makefile,就会发现第1171行内核不支持加载模块。这是否意味着我必须重新编译内核以包括我的新驱动程序?这似乎是一种愚蠢的方法;如果我不能用它访问硬件,为什么要提供Linux发行版呢?

我在这里错过了什么?(我觉得自己很蠢.)

编辑要清楚:我想访问将连接到某些外部设备的外部接口。我认为m25p80是一些内部的闪存;我对在那里读/写没有兴趣。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-01 08:37:34

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

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

代码语言:javascript
复制
        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输出中看到了“spidevspi32765.0: buggy : spidev直接列在DT中”)。

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

票数 1
EN

Stack Overflow用户

发布于 2018-11-15 15:51:36

spidev是一个标准Linux设备驱动程序,它只是通过/dev接口向用户空间导出一个低级API。

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

代码语言:javascript
复制
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节点。

代码语言:javascript
复制
            myspi@0 {
            compatible = "xxxx,yyyyy";
            spi-max-frequency = <5000000>;
            reg = <0>;
        };

第二,

兼容= "linux,spidev";

Linux不鼓励使用这种兼容的属性,因为节点应该描述真实的HW设备,而不是用户空间抽象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41828308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档