Edit online

关键流程设计

初始化流程

CAN 模块的初始化流程如下:

  1. 释放 reset 和 clock 信号

  2. 调用 candev,给 device 类型的变量分配空间

  3. 初始化结构体 priv 的各个成员变量

  4. 调用 candev 注册 CAN 设备

中断处理流程

CAN 的中断处理流程由两种方式:
  1. 利用内核中网络的 NAPI 机制,定义一个轮询函数,将该函数加入 NAPI 链表,接收中断触发时,由 schedule 调度轮询函数的执行,以轮询方式接收所有的数据包直到接收结束。

  2. 不采用 NAPI 机制,而是直接在中断中进行轮询,达到最大轮询次数后退出中断。

内核官方文档推荐参考的 MSCAN 和 SJA1000 的驱动中,分别采用了上述的两种方式实现。AIC 的 CAN 模块驱动中断处理流程是采用的第二种方式,即在中断中进行限定次数的轮询。驱动中设置的最大轮询次数为 20。中断处理流程如下:
  1. 进入中断处理函数后,判断有中断标志置位且轮询次数不超过 20,进入 while 循环。

  2. 若为发送结束中断,则 stats 的 tx_bytes 和 packets 增加,记录发送的数据字节大小和包个数

  3. 若为接收中断,则循环接收数据,直到 RXFIFO 为空

  4. 若出现仲裁错误、总线错误、主动错误、被动错误、数据溢出。则需要进行错误处理,并上报错误类型。

  5. 清空中断标志

数据发送流程

由于 CAN 每帧的数据量只有 8byte,所以发送数据时没有采用 DMA 或中断方式,而是直接调用发送函数将数据发送出去。CAN 模块驱动的数据发送流程如下:

../../images/start_xmit1.png