新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > Android系统下CAN总线驱动程序的设计与实现

Android系统下CAN总线驱动程序的设计与实现

作者:时间:2013-04-25来源:网络收藏

3.2 Linux中
针对MCP2515控制器,在Linux kernel中采用字符设备驱动开发的形式。驱动初始化函数staticint_init MCP2515_init(),首先通过ioremap()函数将S5PV210的SPI寄存器的物理地址映射到内核空间,这样才可以在中访问和配置S5PV210的SPI寄存器。在正确配置S5PV210的SPI寄存器后,通过register_chrdev()函数为MCP2515注册设备驱动,分配主设备号,这样在设备文件目录中创建对应的设备文件后,就可以用Linux的函数操作MCP2515了。而分配内存部分放在probe()函数中完成,分配空间包括为设备数据结构以及其内部的接收发送缓冲区动态分配空间。同时在probe()还需要完成申请中断工作,并初始化中断处理队列,在中断处理队列中读取INTF寄存器,判断是接收/发送中断的哪一个缓冲器,或者说是错误中断最后通过enable_irq()函数使能S5PV210相应的中断引脚。
(1)MCP2515初始化。在了SPI的加载和声明后,就可以利用SPI写命令对MCP2515进行初始化。MCP2515的初始化过程为:首先将控制寄存器CANCTRL的REQOP2:0>位设置为‘100’进入配置模式,所有错误计数器被清零,进入配置模式后设置波特率,禁止所有中断,设置滤波器,清除发送接收缓存,打开中断,完成MCP2515的初始化。MCP2515初始化过程如图5所示。

本文引用地址:http://www.eepw.com.cn/article/148042.htm

e.JPG


(2)MCP2515中断方式。由于CAN接收数据时必须与以中断方式交换数据,所以必须注册中断。使用的中断函数有request_irq(),free_irq(),enable_irq()和disable_irq(),其中函数request_irq()是给定的中断源装载中断处理程序;enable_irq()调用中断控制函数使给定的中断链有效;free_irq()释放分配给已定中断的内存;disable_irq()使定义中断链失效。具体代码为request_irq(irq_EINTO mcp2515_int,IRQF_DISABLED,device_name,NULL);其中函数request_irq()的第1个参数是设备申请的中断号;第2个参数是向注册的中断处理函数;第3个参数是中断处理的属性,IRQF_DISABLED表示中断处理程序是一个快速中断处理程序,被调用时屏蔽所有中断;第4个参数是中断的设备名称;第5个参数是申请时通知系统的设备标志,该函数返回值为0表示申请成功,返回负数表示失败,这样当中断发生时,在中断处理函数mcp2515_int()中读取CAN状态寄存器CANSTAT,判断RXB0是否装入报文,如果是则把报文通过SPI接收数据寄存器读取到buff er中,等待系统函数CAN_Read()读取。
(3)MCP2515的核心文件结构file_operations。CAN应用程序通过file_operations数据结构访问CAN设备驱动函数,/kem el/linux/fs.h>对file_operations数据结构中的各个变量做了详解。内核可以通过文件结构来访问驱动程序的函数,系统调用。
CAN应用程序可以通过系统函数read()和write()实现读取和写入相应的数据,open()函数中完成设备的打开,close()函数中完成注销设备的工作,ioctl()函数中需要完成MCP2515控制器的初始化工作:设置控制器的工作模式、设置控制的波特率、清空发送缓冲区和接收缓冲区等。
3.3 CAN驱动编译
(1)将写好的驱动源文件拷贝到/kernel/drivers/char/下,并打开Kconfig添加如下代码:
config S5pv210_CAN
tristate“S5pv210 can controller driver”
depends on ARCH_S5pv210
help
This option enable support for CAN
(2)在/kernel/drivers/char/Makefile文件的适当位置添加如下代码:
obj-$(CONFIG_S5pv210_CAN)+=S5pv210-can.o
(3)添加can功能。在/kernel/下make menuconfig DeviceDrivers→Characterdevices→M>S5pv210 cancontroller driver动态加载CAN驱动并保存退出。
(4)重新编译内核。在终端进入/kernel/目录,执行make命令后在/kernel/drivers/char/下找到S5pv210_can.o,此为Linux kernel层生成的CAN设备驱动文件,kernel层驱动向下直接操作硬件,向上层也就是HAL层,提供/dev/can设备节点文件,提供驱动接口unclocked_ioctl()函数。

4 HAL层的调用
CAN驱动程序在系统下的实现,硬件抽象层(HAL)的调用是关键。将系统移植到其他硬件平台或在Android系统中添加新硬件支持时,都需要对Android HAL层进行移植或实现在libhardware接口的头文件hardware.h中,定义了HAL实现过程中的3个通用结构体struct hw_module_t、struct hw_module_methods_t和struct hw_device_tostruct hw modules_methods_t用来表示一个模块表示方法,结构体中只包含了打开模块的函数指针。struethw_module_t用来定义一个硬件模块的信息,具体的硬件模块中,需要“继承”这个结构体。st ruct hw_device_t用来表示一个硬件设备,在一个硬件模块中可以同时包含多个硬件设备。在一个模块的HAL层开发中,具体的硬件调用流程为:(1)通过ID得到硬件模块。(2)从硬件模块得到hw_modules_t,打开得到硬件设备hw_device_t。(3)调用hw_device_t中的各个方法。(4)通过hw_device_t的close关闭设备。
Android系统下CAN模块的实现在完成SPI总线和:MCP2515控制器的驱动后必须实现Android HAL层的调用。CAN总线的HAL层调用流程如图6所示。

f.JPG


编写HAL层使用struet hw_module_t、struct hw_module_methods_t和struct hw_device_t 3个结构体来设置对CAN模块的操作方法;JNI层主要完成对HAL层提供的硬件操作方法的注册,JNI通过CAN_HARDWARE_MODULE_ID找到对应的stub,使Framework层可以使用这些方法;Setv ice层主要声明了JNI可以提供的方法,加载libcan_runtime.so,加载时会调用JNI层的JNI_OnLoad,这样JNI中的方法可以被 Service调用;编写App应用程序,使App直接调用service,完成Android HAL层的调用。之后将can文件夹放到系统development目录下。
配置环境变量执行../build/envsetup.sh。然后执行mmm development/can编译文件。最后,重新编译内核,生成镜像文件,下载并运行操作系统。此时,CAN总线驱动程序将会加载,这样就实现了Android系统下CAN控制器MCP2515驱动程序的开发。

5 结束语
在分析Android驱动原理的基础上,介绍了CAN总线在Android下的实现流程,并添加了CAN驱动程序在嵌入式操作系统Android中,对其他Android平台非标准设备驱动程序的开发有一定的借鉴作用。

尘埃粒子计数器相关文章:尘埃粒子计数器原理

上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭