天桥陨石分享 http://blog.sciencenet.cn/u/chrujun 让地球物理仪器飞起来

博文

SPI串行外围设备驱动移植

已有 8166 次阅读 2010-6-6 01:27 |个人分类:地球物理及仪器|系统分类:论文交流| Linux, 移植, SPI, 驱动程序

 SPI串行外围设备驱动移植

仇洁婷,陈儒军

       SPI串行外围设备接口是一种高速的,全双工,同步的通信总线,它只需用四根线:时钟线SCK、片选线NPSC、数据输入线MOSI和数据输出线MISO,不仅节约了芯片管脚,而且也节省PCB的布局空间。
       Linux-2.6.21内核中,有两组SPI代码:SPI Support ,Atmel SPI ControlerSPI Driver(legacy) for at91rm9200 processor。前者是内核增加的SPI新代码,后者是为了兼容以前版本,而作为保留选项。本文采用SPI Driver(legacy) for at91rm9200 processor中的代码。该代码主要由linux-2.6.21/drivers/char/目录下的at91_spi.cat91_spidev.c实现。
1at91_spi.c文件
       at91_spi.c文件实现了spi设备驱动的加载和卸载,并向at91_spidev.c文件导出3个函数:spi_access_bus()函数用于使能SPI总线,完成SPI传输前的准备工作;spi_transfer()函数实现SPI传输;spi_release_bus()函数释放SPI总线。
EXPORT_SYMBOL(spi_access_bus);
EXPORT_SYMBOL(spi_release_bus);
EXPORT_SYMBOL(spi_transfer);
SPI驱动的加载由at91spi_init()实现。它调用platform_driver_register (&at91spi_driver)注册spi驱动,进而转向at91spi_probe()函数。at91spi_probe()函数获取了SPI使用的内存、时钟源,调用ioremap完成内存的物理地址到虚拟空间的映射,设置SPI的传输速率和SPI0~SPI3的传输模式,最后注册SPI的中断号。
SPI驱动的卸载由at91spi_exit()实现,包括:禁止SPI总线传输、释放SPI的内存资源和中断号等。
2at91_spidev.c文件
at91_spidev.c文件实现了SPI设备号的注册和释放,以及SPI设备文件接口函数。文件接口spidev_fops代码如下:
static struct file_operations spidev_fops = {
.owner          = THIS_MODULE,
.llseek           = no_llseek,
.read             = spidev_rd_wr,
.write            = (int (*) (struct file *file, const char *buf, size_t count, loff_t *offset))spidev_rd_wr,
.ioctl             = spidev_ioctl,
.open            = spidev_open,
.release = spidev_close,
};
其中read()write()都是采用spidev_rd_wr()函数实现。spidev_rd_wr()函数通过调用at91_spi.c文件的三个导出函数来实现SPI的传输:
spi_access_bus(spi_device);
spi_transfer(list);
spi_release_bus(spi_device);
为了AT91RM9200CS5376ASPI接口能够通信,需要在Linux2.6内核的SPI驱动程序上修改3个地方。


https://blog.sciencenet.cn/blog-39626-332586.html

上一篇:UART串口驱动程序移植
下一篇:USB驱动移植
收藏 IP: .*| 热度|

4 申瑞杰 姚红春 邓景华 luxh11

发表评论 评论 (1 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-13 15:03

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部