关键流程设计
初始化流程
CAN 模块的初始化流程如下:
-
释放 reset 和 clock 信号
-
调用 candev,给 device 类型的变量分配空间
-
初始化结构体 priv 的各个成员变量
-
调用 candev 注册 CAN 设备
中断处理流程
CAN 的中断处理流程由两种方式:
-
利用内核中网络的 NAPI 机制,定义一个轮询函数,将该函数加入 NAPI 链表,接收中断触发时,由 schedule 调度轮询函数的执行,以轮询方式接收所有的数据包直到接收结束。
-
不采用 NAPI 机制,而是直接在中断中进行轮询,达到最大轮询次数后退出中断。
内核官方文档推荐参考的 MSCAN 和 SJA1000 的驱动中,分别采用了上述的两种方式实现。AIC 的 CAN 模块驱动中断处理流程是采用的第二种方式,即在中断中进行限定次数的轮询。驱动中设置的最大轮询次数为 20。中断处理流程如下:
-
进入中断处理函数后,判断有中断标志置位且轮询次数不超过 20,进入 while 循环。
-
若为发送结束中断,则 stats 的 tx_bytes 和 packets 增加,记录发送的数据字节大小和包个数
-
若为接收中断,则循环接收数据,直到 RXFIFO 为空
-
若出现仲裁错误、总线错误、主动错误、被动错误、数据溢出。则需要进行错误处理,并上报错误类型。
-
清空中断标志
数据发送流程
由于 CAN 每帧的数据量只有 8byte,所以发送数据时没有采用 DMA 或中断方式,而是直接调用发送函数将数据发送出去。CAN 模块驱动的数据发送流程如下: