Linux 使用SPIDEV访问SPI设备

Linux 使用SPIDEV访问SPI设备,linux,linux-device-driver,embedded-linux,spi,Linux,Linux Device Driver,Embedded Linux,Spi,我想使用SPIDEV驱动程序访问嵌入式Linux系统上的SPI设备(Avago Tech提供的光学鼠标设备)。该设备已连接到SPI0 我在menuconfig>“设备驱动程序”>“SPI”中启用了SPI和“用户模式SPI设备驱动程序支持” 我将代码添加到board.c文件中 static struct spi_board_info spidev_board_info[] { { .modalias = "spidev", .max_speed_hz = 1

我想使用SPIDEV驱动程序访问嵌入式Linux系统上的SPI设备(Avago Tech提供的光学鼠标设备)。该设备已连接到SPI0

我在menuconfig>“设备驱动程序”>“SPI”中启用了SPI和“用户模式SPI设备驱动程序支持”

我将代码添加到board.c文件中

static struct spi_board_info spidev_board_info[] {
    {
        .modalias = "spidev",
        .max_speed_hz = 1000000,
        .bus_num = 1,
        .chips_select = 0,
        .mode = SPI_MODE_3,
    },
    {
        .modalias = "spidev",
        .max_speed_hz = 1000000,
        .bus_num = 1,
        .chips_select = 1,
        .mode = SPI_MODE_3,
    },
};
spi_register_board_info(spidev_board_info, ARRAY_SIZE(spidev_board_info));
我尝试了500000和1000000作为最大速度(1Mhz是传感器允许的最高频率)。SPI_模式_3正确,已在数据表上检查。bus_num=1应该是正确的,因为它引用了SPI0(出于好奇,我也尝试了=0)

我检查了电气连接,一切正常

内核编译并且映像正确启动,但是我在/sys/class/spidev/(在/sys/bus/spi/…)中找不到任何设备。系统引导期间也不会出现对SPI的引用


你知道问题出在哪里吗

我认为使用Atmel板,您应该使用at91_add_device_spi功能注册设备。然后是:

at91_add_device_spi(spidev_board_info, ARRAY_SIZE(spidev_board_info));

至少您必须确保该函数由您的板支持文件board-sam9x5ek.c调用,以便SPI主控制器得到初始化。如果完成此操作,则上述建议的初始化是正确的。

您确定已启用spi主控制器(在内核中)?你想在什么嵌入式系统上实现这一点,这样我们才能确保正确的驱动程序被启用(我们还必须确保它被初始化)。这是Atmel ARM处理器AT91SAM9G25。SPI主机已启用(我已选中,并且文件夹“/sys/class/SPI_master”esists也已启用)。但如果已启用,但在启动时未看到任何有关SPI的内容,则可能是“SPI主机”设备未启用。电路板的名称及其对应的电路板文件(在arch/arm/at91中)是什么?如果在这里所有内容都已正确初始化,您应该会在内核引导中看到一些“Atmel SPI Controller…”。板文件是“board-sam9x5ek.c”(作为板的名称)。该文件还不是主线,但我在邮件列表中找到了相应的补丁。在这个文件中,您必须添加spi设备,您可以将它们附加到ek_spi_devices[]表中,然后at91_add_device_spi已经被调用。我这样做了,设备显示为spidevX.X。我现在正试图按照spidev.h中的建议使用IOCTL,但我的程序在callongioctl上遇到了问题。可能是因为真正的传感器没有“连接”(电气连接),而这些设备就在那里,因为我把代码放在了BSP中?显然,spidev驱动程序不会检查硬件是否真的响应。我们通常在驱动程序中做的是读取一个带有芯片ID的寄存器,并检查读取值是否符合预期。确切地说,当我试图发送任何IOCTL(读取WHOAMI寄存器)时,它会卡住。它甚至没有到达读部分,而是停在写部分(我在写部分发送寄存器号)。可能是因为缺少硬件吗?