基于ARM嵌入式系统的SPI驱动程序设计(2)
(3)相关寄存器的设置。通过配置SPI功能寄存器设置SPI工作模式。以ioremap返回的虚拟地址为基址,通过增加不同偏移量访问相应寄存器。本次设计将本地SPI设为主设备,开启SCK信号使能,设定CPOL和CPHA均为0,SPI工作在普通模式下。设置波特率预分频寄存器(SPPRE)中的分频比为8。具体设计如下:
__raw_writel((S3C2440_SPCON_SMOD_INT|S3C2440_SPCON_ENSCK|S3C2440_SPCON_MSTR), s3c2440_SPCON);
DPRINTK(DEVICE_NAME"SPCON initializen");
__raw_writel((S3C2440_SPPIN_ENMUL | S3C2440_SPPIN_KEEP),s3c2440_SPPIN);
DPRINTK(DEVICE_NAME"SPPIN initializen");
__raw_writel(0x07,s3c2440_SPPRE);
DPRINTK(DEVICE_NAME"SPPRE initializen");
(4)初始化发送和接收数据缓冲区。数据缓冲区使用环形缓冲区结构,通过头尾指针的循环移动,实现对缓冲区的动态管理。其定义如下:
typedef struct
{
spi_buf buf[MAX_SPI_BUF];
unsigned int head, tail;
wait_queue_head_t wq;
} SPI_BUF; static SPI_BUF spi_Tx_buf;static SPI_BUF spi_Rec_buf;
其中spi_buf表示char型,MAX_SPI_BUF为缓冲区大小,设为1 024 B。head、tail分别表示头尾数组下标,wq为等待队列头。此结构依靠以下宏进行管理:
#define SPI_Tx_BUF_HEAD(spi_Tx_buf.buf[spi_Tx_buf.head])
#define SPI_Tx_BUF_TAIL(spi_Tx_buf.buf[spi_Tx_buf.tail])
#define INCBUF(x,mod)((++(x))&((mod)-1))
前两个宏用于引用缓冲区中的元素,最后一个宏用于对头尾下标进行前移,并保证头尾下标数值可循环变化,不发生溢出。
在初始化时,分别对接收和发送缓冲区的头尾指针进行清零操作,具体如下:
spi_Tx_buf.head=spi_Tx_buf.tail=0;spi_Rec_buf.head=spi_Rec_buf.tail = 0;
(5)内核机制相关的数据结构初始化。本设计所使用的内核机制包括了中断上下半部的操作和睡眠等待机制,因此需要对发送、接收等待队列以及tasklet结构进行初始化,并注册tasklet处理函数。初始化过程如下:
init_waitqueue_head(&(spi_Tx_buf.wq));
init_waitqueue_head(&(spi_Rec_buf.wq));
tasklet_init(&spi_tasklet,spi_tasklet_handler,data);
(6)初始化相应端口。根据S3C2440外部管脚配置,将与SPI功能引脚复用的GPIO设定为SPI相应功能。具体操作如下:
s3c2440_gpio_cfgpin
(S3C2440_GPE11,S3C2440_GPE11_SPIMISO0);
s3c2440_gpio_cfgpin
(S3C2440_GPE12,S3C2440_GPE12_SPIMOSI0);
s3c2440_gpio_cfgpin
(S3C2440_GPE13,S3C2440_GPE13_SPICLK0);
s3c2440_gpio_cfgpin
(S3C2440_GPG2,S3C2440_GPG2_INP);//设置nSS
s3c2440_gpio_cfgpin(S3C2440_GPB10,
S3C2440_GPB10_OUTP); //设置片选信号
s3c2440_gpio_setpin(S3C2440_GPB10,1);
2.2 SPI写操作
写操作主要是将上层应用部分的用户空间中的数据拷贝到内核空间中的环形缓冲区中,此后将缓冲区的数据送到SPI发送寄存器中,在SPI发送完一个数据后,系统产生中断,中断例程中的下半部将调用tasklet判断缓冲区状态。若缓冲区中有相应的空间,可以将下一数据填入SPI发送寄存器中,直至将缓冲区数据全部发送完毕。
本设计的写操作实现了环形缓冲区的动态管理,即在缓冲区删除数据、尾指针前移的情况下,允许向缓冲区添加数据,头指针前移。此设计可以使用户空间任务与内核空间的数据发送同时进行,提高了用户空间任务执行效率,并且当利用copy_from_user函数将数据从用户空间拷贝至内核空间时,数据发送仍在进行,即数据从用户空间至内核空间拷贝过程与数据发送过程并发,提高了驱动程序效率。(责任编辑:admin)
- “扫一扫”关注融合网微信号
免责声明:我方仅为合法的第三方企业注册用户所发布的内容提供存储空间,融合网不对其发布的内容提供任何形式的保证:不保证内容满足您的要求,不保证融合网的服务不会中断。因网络状况、通讯线路、第三方网站或管理部门的要求等任何原因而导致您不能正常使用融合网,融合网不承担任何法律责任。
第三方企业注册用户在融合网发布的内容(包含但不限于融合网目前各产品功能里的内容)仅表明其第三方企业注册用户的立场和观点,并不代表融合网的立场或观点。相关各方及作者发布此信息的目的在于传播、分享更多信息,并不代表本网站的观点和立场,更与本站立场无关。相关各方及作者在我方平台上发表、发布的所有资料、言论等仅代表其作者个人观点,与本网站立场无关,不对您构成任何投资、交易等方面的建议。用户应基于自己的独立判断,自行决定并承担相应风险。
根据相关协议内容,第三方企业注册用户已知悉自身作为内容的发布者,需自行对所发表内容(如,字体、图片、文章内容等)负责,因所发表内容(如,字体、图片、文章内容等)等所引发的一切纠纷均由该内容的发布者(即,第三方企业注册用户)承担全部法律及连带责任。融合网不承担任何法律及连带责任。
第三方企业注册用户在融合网相关栏目上所发布的涉嫌侵犯他人知识产权或其他合法权益的内容(如,字体、图片、文章内容等),经相关版权方、权利方等提供初步证据,融合网有权先行予以删除,并保留移交司法机关查处的权利。参照相应司法机关的查处结果,融合网对于第三方企业用户所发布内容的处置具有最终决定权。
个人或单位如认为第三方企业注册用户在融合网上发布的内容(如,字体、图片、文章内容等)存在侵犯自身合法权益的,应准备好具有法律效应的证明材料,及时与融合网取得联系,以便融合网及时协调第三方企业注册用户并迅速做出相应处理工作。
融合网联系方式:(一)、电话:(010)57722280;(二)、电子邮箱:2029555353@qq.com dwrh@dwrh.net
对免责声明的解释、修改及更新权均属于融合网所有。