Android系统下CAN总线驱动程序的设计与实现
摘要 嵌入式操作系统Android下CAN驱动程序的实现,不但需要在Linux内核中添加CAN驱动设备,还要实现Android HAL层的调用。以S5PV 210微处理器与CAN总线控制器MCP2515为例,分析了Android设备驱动原理,以及Android下CAN设备驱动程序的开发流程和方法,设计了相关的重要数据结构和代码,实现了CAN总线的驱动程序开发。
关键词 CAN总线;Android;Android HAL
Android是指“机器人”,由Google公司于2007年11月5日发布的基于Linux平台的开源手机操作系统,是首个为移动终端打造的真正开放和完整的移动软件。Android是一个开放平台,在嵌入式移动设备领域里具有良好的应用前景,但在不同的设备上往往有不同的硬件支持,要在Android中添加这些硬件应用,不是单纯地在Linux内核中添加驱动模块,还必须在用户空间和应用框架中添加对应的支持。
控制器局域网络(Control Area Network,CAN),属于现场总线的范畴,是德国Bosch公司在20世纪80年代初,为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通信总线。由于CAN总线的数据通信具有良好的可靠性、实时性和灵活性,CAN已经在汽车工业、航空工业、工业控制等领域中得到了广泛应用。文中以S5PV210微处理器为硬件平台,通过扩展其SPI接口,实现了CAN控制器MCP 2515在Android操作系统下的驱动程序开发。
1 系统硬件结构
系统数据的收发都要通过CAN总线模块,CAN总线模块设计框图如图1所示,S5PV210通过SPI接口实现与MCP2515的连接,MCP2515的CAN输入输出引脚和CAN总线收发器MCP2551接在一起,构成一个完整的CAN总线收发模块。
1.1 S5PV210的SPI接口
接口协议(Setial Peripheral Interface,SPI)是Motorola公司推出的一种使用时钟线和2根数据线传输数据的同步串行协议,即串行外设接口。S5PV210提供的SPI接口主要用于S5PV210与外围低速器件之间进行同步串行数据传输,可以实现全双工通信,传输速度最高可达5 Mbit·s-1。SPI总线接口主要用于主从分布式的通信网络,由4根线即可完成主从之间的数据通信,这4根线分别为:时钟线(SCLK)、数据输入线(SI)、数据输出线(SO)和片选线(CS),其中CS的有效与否完全由主控制器决定,时钟信号也由主控制器发出。
1.2 CAN控制器MCP2515
MCP2515是Microchip生产的一款独立CAN协议控制器。MCP2515支持CAN1.2、CAN2.0A、主动和被动CAN2.0B等版本的协议,能够发送和接收标准和扩展报文,它还同时具备验收过滤以及报文管理功能。图2为MCP2515的结构框图。该器件主要由3个部分组成:(1)CAN协议引擎。(2)为器件及其运行进行配置的控制逻辑和SRAM寄存器。(3)SPI协议模块。
1.3 CAN收发器MCP2551
MCP2551是一个可容错的高速CAN器件,可作为CAN协议控制器和物理总线接口。MCP2551可为CAN协议控制器提供差分收发能力,它完全符合ISO—11898标准,且满足24 V电压要求。它的工作速率达1 Mbit·s-1。
2 CAN总线驱动程序的设计
2.1 Android操作系统驱动原理
Android虽然使用了Linux内核,但应用程序是用Java语言开发的,所以应用程序在调用设备驱动不能像Linux应用程序那样使用系统调用,必须用Java虚拟机的JNI的本地(Native)方法。另一方面,Android要成为一个通用性强的平台,必须加强它的可移植性,这也是在Andr oid架构添加一个(HAL)硬件抽象层的原因,目的是为设备的调用提供一个更高级的封装。图3所示为Android驱动程序的技术结构。
HAL Stub以*.so库的形式存在,在整个驱动架构中,它是驱动运行在用户空间的一部分,它往上为Dalvik虚拟机提供硬件设备的抽象接口,往下通过系统调用与Linux内核中的驱动程序交互数据,在这个过程中HAL可以对驱动程序的数据进行处理,即在Linux内核中的驱动程序只需提供一个与硬件设备传输数据的功能,而具体的操作可以由HAL完成。Android下CAN总线驱动程序的实现,不但要在Linux内核中添加CAN驱动模块,还必须在用户空间和应用框架中添加对应的支持。
2.2 CAN驱动程序实现流程
主控制器S5PV210通过其自身的SPI接口实现与MCP2515的连接,若要使平台正常工作,软件的实现是必需的。首先要确保S5PV210的SPI口可以正常收发数据,然后利用SPI口对MCP2515的寄存器进行设置。CAN驱动程序流程图如图4所示,第一步是实现S5PV210的SPI总线的加载和声明;第二步是Linuxkernel中CAN驱动的实现,包括MCP2515的初始化、MCP2515的读写、CAN驱动的加载。第三步是Android HAL层的调用。
3.1 SPI总线加载和声明
系统的CAN总线设备通过S5PV210的SPI总线连接,因此,需要设计SPI线驱动完成数据接收与发送。关于SPI总线驱动在Linux内核中已有良好的支持,加载并声明SPI总线就可以直接使用。Linux内核使用包装后的抽象设备驱动spi_driver,间接与原始设备驱动建立联系,并最终通过调用driver_register来注册原始设备驱动,即只需要在内核提供的spi_driver上修改调试,大幅提高了程序效率和可移植性。
这样在结构体mop2515_driver里完成了对MCP2515驱动函数probe,remove的赋值。然后就可以通过SPI对MCP2515的寄存器进行设置来实现CAN总线驱动程序。
设计 实现 驱动程序 总线 系统 CAN Android 相关文章:
- 基于FPGA的DSP设计方法(08-26)
- 电力电子装置控制系统的DSP设计方案(04-08)
- 基于DSP Builder的VGA接口设计(04-10)
- 基于DSP和USB的高速数据采集与处理系统设计(05-01)
- 数字信号处理(DSP)应用系统中的低功耗设计(05-02)
- 基于DSP的嵌入式显微图像处理系统的设计(06-28)