我正在尝试为自定义硬件实现SPI驱动程序。我已经开始使用spidev驱动程序的副本,它几乎支持我所需要的一切。
我们使用的协议有三个部分:命令位(读/写)地址和任意数量的数据。
我曾假设只是添加lseek功能将是最好的方法。 "寻求"到所需的地址,然后读或写任意数量的字节。我在新驱动程序的file_operations中创建了一个自定义.llseek,但我从未见过甚至调用过该函数。我尝试过使用fseek(),lseek()和pread(),但这些函数似乎都没有调用新的my_lseek()函数。每次通话报告" errno 29 ESPIPE Illegal Seek"
设备在board.c文件中定义:
static struct spi_board_info my_spi_board_info[] __initdata = {
[0] = {
.modalias = "myspi",
.bus_num = 1,
.chip_select = 0,
.max_speed_hz = 3000000,
.mode = SPI_MODE_0,
.controller_data = &spidev_mcspi_config,
}, ...
我怀疑dev文件的创建方式可能有些,主要是因为我找到的示例参考了filp-> f_pos
static int myspi_llseek(struct file *filp, loff_t off, int whence)
{
...
newpos = filp->f_pos + off;
...
}
所以我的问题是:有没有办法让这个驱动程序(轻微修改的spidev)支持"寻找"呼叫?在什么时候这被定义为返回errno 29?我是否必须从新的驱动程序开始而不能依赖spi_board_info()和spi_register_board_info()设置?
/ drivers / spi目录中只有一个驱动程序(spi-dw)引用lseek,它们使用default_llseek实现。有几个" hacks"我们已经提出让所有事情都能正常运行,但我倾向于成为一个想要学会以正确的方式完成任务的人。
非常感谢任何建议! (PS,OMAP Android系统的内核版本为3.4.48)
答案 0 :(得分:4)
Spi驱动程序不支持任何llseek或fseek功能。它有很多回调功能。
struct spi_driver {
const struct spi_device_id *id_table;
int (*probe)(struct spi_device *spi);
int (*remove)(struct spi_device *spi);
void (*shutdown)(struct spi_device *spi);
int (*suspend)(struct spi_device *spi, pm_message_t mesg);
int (*resume)(struct spi_device *spi);
struct device_driver driver;
};
现在 drivers / spi / spi-dw.c 注册为包机驱动程序(debugfs_create_file(“registers”,S_IFREG | S_IRUGO, dws-> debugfs,(void *)dws,& dw_spi_regs_ops);)。因此,他们实现了在debugfs文件系统中创建文件。他们实现了lseek回调函数。
static const struct file_operations dw_spi_regs_ops = {
.owner = THIS_MODULE,
.open = simple_open,
.read = dw_spi_show_regs,
.llseek = default_llseek,
}; file_operations结构在linux / fs.h中定义,并保存指向由驱动程序定义的函数的指针,这些函数在设备上执行各种操作。结构的每个字段对应于驱动程序定义的某个函数的地址,以处理请求的操作
lseek - : lseek是一个系统调用,用于更改文件描述符的读/写指针的位置。
SPI - “串行外设接口”(SPI)是一种同步四线串行链路,用于将微控制器连接到传感器,存储器和外设。 SPI无法提供任何lseek和fseek功能。
有两种类型的SPI驱动程序(https://www.kernel.org/doc/Documentation/spi/spi-summary)
控制器驱动程序......控制器可以内置在片上系统中 处理器,通常支持主角色和从属角色。 这些驱动程序触及硬件寄存器,可能使用DMA。 或者它们可以是PIO bitbangers,只需要GPIO引脚。
协议驱动程序......这些通过控制器传递消息 驱动程序与从站或主设备通信 SPI链路的另一端。
如果您想要用户read,write和llseek,那么您必须在SPI上注册一个包机驱动程序。然后你就可以实现你的收获。