我有一个Intrinsyc Open-Q µ820评估板和一个带SPI引脚的完全可访问接头。在这些引脚上,我想连接一个SPI从设备。我的linux内核全部设置为dts文件,如下所示:
&soc {
[...]
spi_0: spi@7575000 { /* BLSP1 QUP1 */
compatible = "qcom,spi-qup-v2";
#address-cells = <1>;
#size-cells = <0>;
reg-names = "spi_physical", "spi_bam_physical";
reg = <0x07575000 0x600>, <0x07544000 0x2b000>;
interrupt-names = "spi_irq", "spi_bam_irq";
[...]
device@0 { // Slave driver and CS ID
compatible = "me,myDevice"; /
#address-cells = <1>;
#size-cells = <1>;
reg = <0>;
spi-max-frequency = <5000000>;
};
[...]
};
我想用我的设备编写一个驱动程序,以使用自定义功能发送自定义消息。我已经花了一个月的时间在做这个工作,但是我无法完全掌握应该怎么做。
我写的实际驱动程序包含:
static const struct of_device_id mySpi_id[] = {
{ .compatible = "me,myDevice", },
{ .compatible = "qcom,spi-msm-codec-slave", },
{},
};
MODULE_DEVICE_TABLE(of, mySpi_id);
static const struct spi_device_id mySpi_dev[] = {
{"myDevice", 0 },
{},
};
MODULE_DEVICE_TABLE(spi, mySpi_dev);
static struct spi_driver myDevice_driver =
{
.driver = {
.name = DEVICE_NAME,
.owner = THIS_MODULE,
},
.probe = myDevice_probe,
.remove = myDevice_remove,
.id_table = mySpi_dev,
};
static struct spi_board_info spi_board_info = {
.modalias = DEVICE_NAME,
.max_speed_hz = 5000000,
.chip_select = 0,
.mode = SPI_MODE_0, // CPOL = 0, CPHA = 0
};
static int __init myDevice_init(void){[...]} // Don't know what to put here
static void __exit myDevice_exit(void){[...]} // Don't know what to put here
module_init(myDevice_init);
module_exit(myDevice_exit);
MODULE_ALIAS("spi:myDevice");
MOLULE_LICENSE("GPL");
这些结构似乎将我的驱动程序链接到我的设备。但是我无法编写.probe .open .write .read __init __exit
来配置我的引脚并在其上进行写操作(例如SPIdev驱动程序)。
如果我对DTS文件了解得很深,那么qcom,spi-msm-codec-slave
是SPI主设备,必须在其下定义我的从设备(例如 device @ 0 ) 。我已经在我的Linux存储库中解析了所有spi驱动程序,但无法编写函数。
所以我的问题是:当使用诸如以下命令时,我应该如何编写 file_operations 函数以使其像SPIdev一样工作
$ adb shell cat myDevice
和$ adb shell echo "whatever" > myDevice
?