当前位置:   article > 正文

Linux下SPI驱动:SPI设备驱动简介_linuxspi驱动

linuxspi驱动

一. 简介

Linux下的SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC的 SPI 控制器接口,SPI设备驱动也就是所操作的SPI设备的驱动。

本文来学习一下Linux下SPI设备驱动。

二. Linux下SPI驱动:SPI设备驱动简介

1. spi_driver 结构体

spi 设备驱动也和 i2c 设备驱动也很类似, Linux 内核使用 spi_driver 结构体来表示 spi 设备 驱动,我们在编写 SPI 设备驱动的时候需要实现 spi_driver spi_driver 结构体定义在 include/linux/spi/spi.h 文件中,结构体内容如下:
  1. struct spi_driver {
  2. const struct spi_device_id *id_table;
  3. int (*probe)(struct spi_device *spi);
  4. int (*remove)(struct spi_device *spi);
  5. void (*shutdown)(struct spi_device *spi);
  6. struct device_driver driver;
  7. };

可以看出,spi_driver i2c_driverplatform_driver 基本一样,当 SPI 设备和驱动匹配成功以后 probe 函数就会执行。

2. SPI设备驱动注册与注销

同样的, spi_driver 初始化完成以后需要向 Linux 内核注册, spi_driver 注册函数为spi_register_driver函数 ,函数原型如下:
int spi_register_driver(struct spi_driver *sdrv)
函数参数和返回值含义如下:
sdrv 要注册的 spi_driver
返回值: 0 ,注册成功;赋值,注册失败。

注销 SPI 设备驱动以后也需要注销掉前面注册的 spi_driver ,使用 spi_unregister_driver 函数完成 spi_driver 的注销,函数原型如下:
void spi_unregister_driver(struct spi_driver *sdrv)
函数参数和返回值含义如下:
sdrv 要注销的 spi_driver。
返回值: 无。

三.  spi_driver 注册示例代码

SPI设备驱动的注册示例代码,即spi_driver 注册示例程序如下:
  1. /*SPI设备驱动的注册示例代码*/
  2. /* probe 函数 */
  3. static int probe(struct spi_device* dev)
  4. {
  5. //具体的函数内容
  6. return 0;
  7. }
  8. /* remove 函数 */
  9. static int remove(struct spi_device* dev)
  10. {
  11. //具体的函数内容
  12. return 0;
  13. }
  14. /* 传统匹配方式 ID 列表 */
  15. static struct spi_device_id xxx_id_table[] = {
  16. {"xxx", 0},
  17. {}
  18. };
  19. /* 设备树匹配列表 */
  20. static struct of_device_id xxx_of_match_table[] = {
  21. {.compatible = "xxx"},
  22. {}
  23. };
  24. /* SPI 驱动结构体 */
  25. static struct spi_driver xxx_spi_driver = {
  26. .driver = {
  27. .name = "xxx_spi",
  28. .owner = THIS_MODULE,
  29. .of_match_table = xxx_of_match_table,
  30. },
  31. .id_table = xxx_id_table,
  32. .probe = xxx_probe,
  33. .remove = xxx_remove,
  34. };
  35. /* 驱动入口函数 */
  36. static int __init xxx_init(void)
  37. {
  38. spi_register_driver(&xxx_spi_driver); //SPI设备驱动的注册
  39. }
  40. /* 驱动出口函数 */
  41. static void __exit xxx_exit(void)
  42. {
  43. spi_unregister_driver(&xxx_spi_driver); //SPI设备驱动的注销
  44. }
  45. module_init(xx_init);
  46. module_exit();

1~38 行, spi_driver 结构体,需要 SPI 设备驱动人员编写,包括匹配表、 probe 函数等。
i2c_driver platform_driver 一样,就不详细讲解了。
41~44 行,在驱动入口函数中,调用 spi_register_driver 来注册 spi_driver
46~49 行,在驱动出口函数中,调用 spi_unregister_driver 来注销 spi_driver

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/712349
推荐阅读
相关标签
  

闽ICP备14008679号