Linux下SPI总线.doc
上传人:sy****28 上传时间:2024-09-13 格式:DOC 页数:25 大小:144KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

Linux下SPI总线.doc

Linux下SPI总线.doc

预览

免费试读已结束,剩余 15 页请下载文档后查看

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

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--------------------------------------------------------------------------------/*这个函数是驱动模块卸载时使用*/32staticvoidspidev_release(structdevice*dev)33{/*标准设备结构体转换成SPI设备结构体*调用container_of函数获取dev设备所在的SPI设备结构体指针*/34structspi_device*spi=to_spi_device(dev);3536/*spimastersmaycleanupforreleaseddevices*//*清空SPI主机申请的内存*/37if(spi->master->cleanup)38spi->master->cleanup(spi);39/*减调用次数*/40spi_master_put(spi->master);/*释放SPI设备节点内存*/41kfree(spi);42}43/*打印模块别名*/44staticssize_t45modalias_show(structdevice*dev,structdevice_attribute*a,char*buf)46{47conststructspi_device*spi=to_spi_device(dev);4849returnsprintf(buf,"%s\n",spi->modalias);50}51/*设置SPI总线属性——名称/显示*/52staticstructdevice_attributespi_dev_attrs[]={53__ATTR_RO(modalias),54__ATTR_NULL,55};56/*获取设备ID*/57/*modaliassupportmakes"modprobe$MODALIAS"new-stylehotplugwork,58*andthesysfsversionmakescoldplugworktoo.59*/6061staticconststructspi_device_id*spi_match_id(conststructspi_device_id*id,62conststructspi_device*sdev)63{/*判断设备中名称与模块别名相同,则返回该设备ID*/64while(id->name[0]){65if(!strcmp(sdev->modalias,id->name))66returnid;67id++;68}69returnNULL;70}71/*返回设备ID*/72conststructspi_device_id*spi_get_device_id(conststructspi_device*sdev)73{74conststructspi_driver*sdrv=to_spi_driver(sdev->dev.driver);7576returnspi_match_id(sdrv->id_table,sdev);77}78EXPORT_SYMBOL_GPL(spi_get_device_id);接上一个继续看spi.c。-------------------------------匹配设备/*名词解释of:OpenFirmware*调用层次spi_match_device-->of_driver_match_device-->of_match_device-->*of_match_node*用于驱动程序检查platform_device是否在其支持列表里*/80staticintspi_match_device(structdevice*dev,structdevice_driver*drv)81{