Linux下SPI驱动分析(1)

本文解析了Linux环境下SPI总线驱动的核心代码及其工作原理,介绍了如何通过SPI接口实现设备驱动,并逐步分析了核心代码与具体设备驱动之间的关联。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux下SPI总线驱动有通用接口,一般的SPI设备驱动使用这个驱动接口实现设备驱动。分析驱动最好是先了解核心代码,然后从具体设备分析入手,然后从下至上,了解整个框架,再从上到下分析,理解透彻。

以下分析内核根目录均以"src"代替。内核代码http://lxr.linux.no/,版本2.6.37.2。

SPI的核心代码即

"src/drivers/spi/spi.c"——SPI 初始化和核心代码

"src/drivers/spi/spi_gpio.c"——IO模拟SPI接口代码

头文件:

"src/include/linux/spi/spi.h"

"src/include/linux/spi/spi_gpio.h"

"src/include/linux/spi/spi_bitbang.h"

 

首先,先看核心代码。

一步步来,先分析代码,然后看了具体驱动再回过头来看这个核心代码。

spi.c

 


 

/* 这个函数是驱动模块卸载时使用 */ 32static void spidev_release(struct device *dev) 33{ /* 标准设备结构体转换成SPI设备结构体 * 调用container_of函数获取dev设备所在的SPI设备结构体指针 */ 34 struct spi_device *spi = to_spi_device(dev); 35 36 /* spi masters may cleanup for released devices */ /* 清空SPI主机申请的内存 */ 37 if (spi->master->cleanup) 38 spi->master->cleanup(spi); 39 /* 减调用次数 */ 40 spi_master_put(spi->master); /* 释放SPI设备节点内存 */ 41 kfree(spi); 42}

43

      /* 打印模块别名 */ 44static ssize_t 45modalias_show(struct device *dev, struct device_attribute *a, char *buf) 46{ 47 const struct spi_device *spi = to_spi_device(dev); 48 49 return sprintf(buf, "%s/n", spi->modalias); 50}

 51

/* 设置SPI总线属性——名称/显示 */

  52static struct device_attribute spi_dev_attrs[] = {

  53        __ATTR_RO(modalias),

  54        __ATTR_NULL,

  55};

56

 

/* 获取设备ID */ 57/* modalias support makes "modprobe $MODALIAS" new-style hotplug work, 58 * and the sysfs version makes coldplug work too. 59 */ 60 61static const struct spi_device_id *spi_match_id(const struct spi_device_id *id, 62 const struct spi_device *sdev) 63{ /* 判断设备中名称与模块别名相同,则返回该设备ID */ 64 while (id->name[0]) { 65 if (!strcmp(sdev->modalias, id->name)) 66 return id; 67 id++; 68 } 69 return NULL; 70} 71 /* 返回设备ID */ 72const struct spi_device_id *spi_get_device_id(const struct spi_device *sdev) 73{ 74 const struct spi_driver *sdrv = to_spi_driver(sdev->dev.driver); 75 76 return spi_match_id(sdrv->id_table, sdev); 77} 78EXPORT_SYMBOL_GPL(spi_get_device_id);



 

先到这,且见下回分解,累了,睡觉~~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值