在i.MX8MP开发板上实现SPI转CAN
2023年09月11日 15:27 发布者:繁花之语
飞凌嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。说明[*]OKMX8MP-C核心板有两路原生的SPI总线,目前是将SPI1的引脚用作了LED和UART3的功能,SPI2做成了正常的SPI2接口。此处以SPI2转CAN为例,移植SPI转CAN芯片;
[*]SPI转CAN芯片型号为:MCP2518,这款芯片可转出CAN-FD,若只需要CAN功能,可参照该方式移植MCP2515或其他芯片;
[*]本次移植的MCP2518芯片驱动来源是i.MX8MQ的源码(处理器中默认移植MCP2518芯片)。
01移植MC2518芯片驱动在OK8MP-linux-kernel/drivers/net/can/spi/路径下创建一个文件夹——mcp25xxfd,将相关文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夹中。
02补全对can_rx_offload_add_manual函数的定义vi OK8MQ-linux-kernel/include/linux/can/rx-offload.h添加:复制
[*]
[*]int can_rx_offload_add_manual(struct net_device *dev,
[*] struct can_rx_offload *offload,
[*] unsigned int weight)
[*]
复制代码
vi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c添加:复制
[*]
[*]int can_rx_offload_add_manual(struct net_device *dev,
[*] struct can_rx_offload *offload,
[*] unsigned int weight)
[*]{
[*] if (offload->mailbox_read)
[*] return -EINVAL;
[*] return can_rx_offload_init_queue(dev, offload, weight);
[*]}
[*]EXPORT_SYMBOL_GPL(can_rx_offload_add_manual);
复制代码
03修改上一级目录spi/下的Makefile和Kconfigvi OK8MP-linux-kernel/drivers/net/can/spi/Makefile添加:复制
[*]obj-y += mcp25xxfd/
复制代码
vi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig添加:复制
[*]source "drivers/net/can/spi/mcp25xxfd/Kconfig"
复制代码
04修改驱动配置文件,将MCP2518编译进内核vi OK8MP-linux-kernel/arch/ARM64/configs/OK8MP-C_defconfig找到:CONFIG_CAN_MCP251X=y改为:# CONFIG_CAN_MCP251X is not set添加:CONFIG_CAN_MCP25XXFD=y
05在设备树中配置时钟vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts添加:复制
[*]
[*]clocks{
[*] mcp2518fd_clock:
[*] mcp2518fd_clock{
[*] compatible = "fixed-clock";
[*] #clock-cells = <0>;
[*] clock-frequency = <40000000>;
[*] };
[*]};
复制代码
06找一个引脚用作芯片的中断引脚此处是将GPIO4_IO21用作了中断引脚。vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts添加:复制
pinctrl_ecspi2_can: ecspi2can{
fsl,pins = <
MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21 0x40000
>;
};
07在设备树的ecspi2节点中进行修改vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts从:复制
[*]&ecspi2{
[*] #address-cells= <1>;
[*] #size-cells= <0>;
[*] fsl,spi-num-chipselects= <1>;
[*] pinctrl-names= "default";
[*] pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>;
[*] cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>;
[*] status= "okay";
[*]
[*] spidev1:spi@0 {
[*] reg= <0>;
[*] compatible= "rohm,dh2228fv";
[*] spi-max-frequency= <500000>;
[*] };
[*]};
复制代码
[*]
[*] [*] 改为: [*]复制 [*] [*] &ecspi2{ |