原创 Linux的SPI代码及逐行解析

2023-10-14 20:35 501 3 3 分类: 物联网 文集: 学习分享

在Linux中,SPI(Serial Peripheral Interface)通常使用内核的SPI子系统进行访问。下面是一个简单的SPI代码示例,并对每行进行逐行解析:

c复制代码
#include
#include
#include
#include
#include
MODULE_LICENSE("GPL");
static struct spi_device *spi_dev;
static struct gpio_desc *cs_gpiod;
static int spidev_probe(struct platform_device *pdev)
{
int ret;
/* 获取SPI设备 */
spi_dev = of_find_device_by_node(pdev->dev.of_node);
if (!spi_dev) {
return -ENODEV;
}
/* 初始化GPIO描述符 */
cs_gpiod = devm_gpiod_get(&spi_dev->dev, "cs", GPIOD_ASIS);
if (IS_ERR(cs_gpiod)) {
ret = PTR_ERR(cs_gpiod);
return ret;
}
/* 设置GPIO方向为输出 */
gpiod_set_value_cansleep(cs_gpiod, 0);
/* 注册SPI设备 */
ret = spi_register_device(spi_dev);
if (ret) {
return ret;
}
return 0;
}
static int spidev_remove(struct platform_device *pdev)
{
/* 注销SPI设备 */
spi_unregister_device(spi_dev);
return 0;
}
static const struct of_device_id spidev_of_match[] = {
{ .compatible = "example,spidev" },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, spidev_of_match);
static struct platform_driver spidev_driver = {
.probe = spidev_probe,
.remove = spidev_remove,
.driver = {
.name = "spidev",
.of_match_table = spidev_of_match,
.pm = NULL,
},
};
module_platform_driver(spidev_driver);

以下是代码逐行解析:

  1. #include :包含Linux内核模块相关的头文件,用于定义模块的初始化和退出函数等。
  2. #include :包含SPI子系统的头文件,用于访问SPI设备和操作SPI传输。
  3. #include :包含中断处理相关的头文件,用于注册中断处理程序等。这个头文件在SPI设备驱动程序中不是必需的,但通常会包含其他相关的头文件。
  4. #include :包含平台设备驱动程序相关的头文件,用于访问平台设备和获取设备相关的信息。
  5. #include :包含GPIO消费者相关的头文件,用于操作GPIO。这里用于获取GPIO描述符。
  6. MODULE_LICENSE("GPL");:定义模块的许可证为GPL,表示遵循GPL协议。这是Linux内核模块的惯例。
  7. static struct spi_device *spi_dev;:定义一个静态的全局变量spi_dev,用于保存SPI设备的指针。这个变量在整个驱动程序中都可以访问。
  8. static struct gpio_desc *cs_gpiod;:定义一个静态的全局变量cs_gpiod,用于保存GPIO描述符的指针。这个变量在整个驱动程序中都可以访问。
  9. static int spidev_probe(struct platform_device *pdev):定义一个静态的探针函数spidev_probe,用于初始化SPI设备驱动程序。这个函数在设备驱动程序被探测到时调用。参数pdev是平台设备的指针。这个函数的返回值是整数类型,用于表示操作成功或失败。
  10. int ret;:定义一个整型变量ret,用于保存函数调用的返回值。这个变量在函数内部使用。
  11. spi_dev = of_find_device_by_node(pdev->dev.of_node);:使用of_find_device_by_node()函数从平台设备

作者: 丙丁先生, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3996156.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条