(我真的不确定要应用哪些标签,所以如果我选择了错误的标签,请提前道歉。)
我希望这不是一个太愚蠢的问题,但我真的迷失了。
一位客户借给我一个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是一些内部闪存;我对那里的读/写不感兴趣。
答案 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
它仍然不起作用(它超时),但我猜这是另一个问题。