我正在尝试为自定义硬件实现 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,
}, ...
我怀疑开发文件的创建方式可能有些问题,主要是因为我找到的示例引用了 filp->f_pos
static int myspi_llseek(struct file *filp, loff_t off, int whence)
{
...
newpos = filp->f_pos + off;
...
}
所以我的问题是:有没有办法让这个驱动程序(轻微修改的 spidev)支持“seek”调用?这在什么时候被定义为返回 errno 29?我是否必须从新驱动程序开始,并且不能依赖 spi_board_info() 和 spi_register_board_info() 设置?
/drivers/spi 目录 (spi-dw) 中只有一个驱动程序引用 lseek,它们使用 default_llseek 实现。我们想出了一些“技巧”来让一切正常运行,但我倾向于学习以正确的方式完成它。
任何建议都非常感谢!(PS,OMAP安卓系统内核版本为3.4.48)