一. 简介
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
文件中,结构体内容如下:
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);
struct device_driver driver;
};
可以看出,spi_driver 和 i2c_driver、platform_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
注册示例程序如下:
/*SPI设备驱动的注册示例代码*/
/* probe 函数 */
static int probe(struct spi_device* dev)
{
//具体的函数内容
return 0;
}
/* remove 函数 */
static int remove(struct spi_device* dev)
{
//具体的函数内容
return 0;
}
/* 传统匹配方式 ID 列表 */
static struct spi_device_id xxx_id_table[] = {
{"xxx", 0},
{}
};
/* 设备树匹配列表 */
static struct of_device_id xxx_of_match_table[] = {
{.compatible = "xxx"},
{}
};
/* SPI 驱动结构体 */
static struct spi_driver xxx_spi_driver = {
.driver = {
.name = "xxx_spi",
.owner = THIS_MODULE,
.of_match_table = xxx_of_match_table,
},
.id_table = xxx_id_table,
.probe = xxx_probe,
.remove = xxx_remove,
};
/* 驱动入口函数 */
static int __init xxx_init(void)
{
spi_register_driver(&xxx_spi_driver); //SPI设备驱动的注册
}
/* 驱动出口函数 */
static void __exit xxx_exit(void)
{
spi_unregister_driver(&xxx_spi_driver); //SPI设备驱动的注销
}
module_init(xx_init);
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
。