http://www.emtronix.com/article/article2013603.html
一、简述
EM9287工控主板CPU为Freescale 的iMX287,主频454MHz,以具有丰富的通讯接口为特色,可同时支持双网口、7路串口、32路GPIO、SPI、I2C以及CAN通讯等接口。CAN是一种在世界范围内广泛用于自动控制、嵌入式设备和汽车领域的网络技术,EM9287 的CAN通讯接口是通过FlexCAN模块来实现控制局域网络协议(CAN)通信的,FlexCAN模块同时支持CAN协议规范2.0,包括协议所规定的标准帧和扩展帧。
Linux下最早使用CAN的方法是基于字符设备来实现的,在EM9287上移植的Linux-3.9.7内核中FlexCAN模块驱动实现的是Socket CAN方式,Scoket CAN使用了socket接口和Linux网络协议栈,这种方法使得CAN设备驱动可以通过网络接口函数来调用,这样大大地方便了熟悉Linux网络编程的程序员,由于调用的都是标准的socket 函数,也使得应用程序便于移植,而不会因为硬件的调整而修改应用程序,这样加强了应用程序的可维护性。关于Socket CAN在Linux内核文档中有更为详细的介绍(/Linux-3.9.7/Documentation/networtking/can.txt)。
本文将简要介绍EM9287在Linux-3.9.7内核上如何实现CAN驱动以及如何在应用程序中使用Socket CAN。
二、Linux内核配置
内核配置中增加以下选项(make menuconfig):
Networking support --->
CAN bus subsystem support --->
Raw CAN Protocol (raw access with CAN-ID filtering)
Broadcast Manger CAN Protocol (with content filtering)
CAN Gateway/Router (with netlink configuration)
CAN Device Drivers --->
Platform CAN drivers with Netlink support
[*] CAN bit-timing calculation
Support for Freescale FLEXCAN based chips
EM9287移植的是Linux-3.9.7版本,对于硬件的描述和配置都是通过device tree相关文件进行传递,除了内核的配置外,还需要在相应的dst文件中增加can0节点。如:
can0: can@80032000 {
compatible = 'fsl,imx28-f