ARM-Linux下SPI设备的添加与驱动实现※

2012-09-25 03:00怯肇乾陈永超
单片机与嵌入式系统应用 2012年4期
关键词:驱动程序触摸屏中断

怯肇乾,陈永超

(北京新大陆有限公司,北 京100044)

1 SPI总线设备驱动及其实现分析

ARM-Linux操作系统下,SPI总线操作,自上而下分为3个层次:平台依赖层、硬件抽象层和用户接口层。平台依赖层对应微处理器里集成的一个或多个SPI主机控制器,包括平台设备(Platform Device)和平台驱动程序,每种处理器平台都有自己特定的SPI控制器驱动,属于平台移植相关层,主要是按照核心层定义的接口实现具体的spi_master。硬件抽象层提供核心数据结构的定义、SPI控制器驱动和设备驱动的注册、注销管理,它面向平台依赖层屏蔽实际总线控制器的差异,定义了统一的访问策略和接口。面向用户接口层提供统一的接口,以便SPI设备驱动通过总线控制器进行数据收发,其主体框架程序是GPIO模拟SPI时序spi_bitbang.c和可进行同/异步消息传输等操作的spi.c。用户接口层即设备驱动层,为用户提供了通过SPI总线访问具体设备的接口,包括SPI设备和SPI驱动程序。ARM-Linux下SPI总线的层次结构图如图1所示。

图1 ARM-Linux下SPI总线的层次结构图

嵌入式ARM-Linux操作系统对SPI总线提供完整而成熟的硬件抽象层和通用的SPI驱动spi_driver。针对具体的ARM内核微处理器体系,如Samsung公司基于Cortex-A8的S5PV110/S5PV210、TI公司基于 Cortex-A8的AM3515/AM3715、Freescale公 司 基 于 Cortex-A8 的i.MX515/i.MX535等,半导体厂商通常提供其SPI控制器驱动的platform_driver和对应的platform_device配置,还有通用spi_driver对应的spi_device配置。platform_device配置定义SPI主机信号与从机的片选信号和中断信号。spi_device配置指定具体SPI设备对应的SPI主机号、采用的SPI通信模式与传输速度和其使用的中断等。platform_device和spi_device配置通常定义在平台匹配文件 mach_xxx.c,如 mach_smdkc110.c。

所以,在ARM-Linux中添加SPI设备,可以借用SPI通用驱动快速实现,可以为其编写特定的SPI驱动。ARM-Linux设备驱动通常采用静态加载操作,它有两种方式:适配(adapter)和探测(probe),大多数设备驱动越来越趋向探测方式,也可以采用动态加载方式编写简易的SPI“设备-驱动”。SPI时序可以选择由微处理器集成的SPI总线控制器产生,也可以选择由微处理器的通用输入/输出口GPIO模拟产生。

2 借用通用spi-dev.c驱动新设备

对于一些常规的SPI设备,如存储器、温度传感器等,可以将其连接到选定的SPI主机控制器总线上,借用系统提供的通用spi-dev.c程序直接实现串行通信操作。需要做的是在平台匹配文件mach_xxx.c中添加或修改片选、中断信号,指定SPI的工作模式、传输速度、主机编号、中断编号等关键信息,相关的代码添加与变化如下(其中粗体部分为需要添加或修改的):

3 为新设备编写probe方式驱动

probe方式的驱动会根据事先的配置安排加载并通过探测初始化进而启用硬件设备。它以xxx_driver框架作统领,以xxx_probe函数完成设备的探测与初始化,以xxx_remove函数完成设备的去除。相应的设备操作配置靠mach_xxx.c文件指定。这里以SPI接口的4线电阻式触摸屏控制器驱动设计为例加以说明。该设备既是SPI设备,也是输入设备。

mach_xxx.c中需要增加的SPI设备信息如下:

设备驱动程序,通过硬件中断以消息传递形式异步完成数据采集并形成公共信息广播给上层应用系统。由于中断中不能展开SPI通信进程,这里采用了异步传输和“自旋锁”机制,由回调函数完成数据处理和上传。限于篇幅,没有考虑“去抖”滤波。主要代码略——编者注。

4 简易“设备-驱动”型设备驱动设计

动态加载形式的设备驱动便于调试、用时挂载,不用随时缷载,因而广泛采用。特别称之为简易“设备-驱动”型设备驱动。上述触摸屏驱动程序很容易变成这种形式,不同之处在于需要在初始化时完成xxx_probe函数功能和mach_xxx.c中SPI设备的配置,在缷载时完成xxx_remove函数功能。主要程序代码略——编者注。

5 GPIO模拟SPI设备驱动快速实现

选择GPIO端口模拟SPI总线驱动SPI设备,虽然对于系统整体效率不高,但是直截了当,易于操作实现。可以采用ARM-Linux已有的GPIO模拟程序,也可以选择GPIO自行独立设计。这里仍以上述触摸屏为例,自选GPIO模拟SPI时序,对动态加载形式的字符型SPI输入的简易“设备-驱动”设计加以说明。通过系统定时器进行了去抖,并对测量结果剪切和均值滤波进行处理(主要程序代码略——编者注)。

编者注:本文为期刊缩略版,全文见本刊网站www.mesnet.com.cn。

[1]怯肇乾.基于底层硬体的软件设计[M].北京:航空航天大学出版社,2008.

[2]宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.

[3]刘红波.Linux下 SPI驱动开发[EB/OL].[2011-12].http://www.linuxidc.com/Linux/2011-09/41981p2.html.

[4]CSDN博客.PowerPC+Linux2.6.25平台下的SPI驱动架构分析[EB/OL].[2011-12].http://blog.csdn.net/sailor_8318/article/details/5977733.

[5]博客园.移植 ADS7846驱动到 Tiny6410[EB/OL].[2011-12].http://www.cnblogs.com/liu_xf/archive/2011/06/22/2086750.html.

[6]王选民,李明利,张利川,等.基于ADS7846的电阻式触摸屏接口设计[J].现代电子技术,2010(11).

猜你喜欢
驱动程序触摸屏中断
PLC和触摸屏在卫生间控制系统的应用
浅析投射式多点触控电容触摸屏
基于FPGA的中断控制器设计*
计算机硬件设备驱动程序分析
皮肤“长”出触摸屏
跟踪导练(二)(5)
千里移防,卫勤保障不中断
基于MPC8280的CPU单元与内部总线驱动程序设计
触摸屏项目移植在自动化系统升级中的应用
FPGA内嵌PowerPC的中断响应分析