(我真的不确定要应用哪个标签,所以如果我选择了错误的标签,请提前道歉。)
我希望这不是一个太愚蠢的问题,但我真的迷路了。
一个客户借给我一台Atmel SAMA5D2 Xplained板与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吗?
如果我看一下Linux4SAM源树中的Makefile,就会发现第1171行内核不支持加载模块。这是否意味着我必须重新编译内核以包括我的新驱动程序?这似乎是一种愚蠢的方法;如果我不能用它访问硬件,为什么要提供Linux发行版呢?
我在这里错过了什么?(我觉得自己很蠢.)
编辑要清楚:我想访问将连接到某些外部设备的外部接口。我认为m25p80是一些内部的闪存;我对在那里读/写没有兴趣。
发布于 2017-02-01 08:37:34
@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输出中看到了“spidevspi32765.0: buggy : spidev直接列在DT中”)。
现在,如果我运行spidev_test,它仍然不工作(超时),但我想这是另一个问题。
发布于 2018-11-15 15:51:36
spidev是一个标准Linux设备驱动程序,它只是通过/dev接口向用户空间导出一个低级API。
如果您想访问特定的SPI客户端(从),您应该根据Linux驱动程序模型编写驱动程序:
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>;
};第二,
兼容= "linux,spidev";
Linux不鼓励使用这种兼容的属性,因为节点应该描述真实的HW设备,而不是用户空间抽象。
https://stackoverflow.com/questions/41828308
复制相似问题