赞
踩
Linux下的SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC的 SPI 控制器接口,SPI设备驱动也就是所操作的SPI设备的驱动。
本文来学习一下Linux下SPI设备驱动。
- 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 函数就会执行。
int spi_register_driver(struct spi_driver *sdrv)
void spi_unregister_driver(struct spi_driver *sdrv)
- /*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();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。