中投建设集团有限公司 网站营销型网站及原因有哪些方面
一. 简介
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 。 
 
 
 
 
 
 
 
 
 
 
 
 
