飛凌嵌入式OKMX8MP-C核心板有兩路原生CAN總線,但用戶在開發(fā)產(chǎn)品時可能需要用到更多的CAN,這該如何解決呢?今天小編將為大家介紹一種SPI轉(zhuǎn)CAN的方法,供各位工程師小伙伴參考。
說明
OKMX8MP-C核心板有兩路原生的SPI總線,目前是將SPI1的引腳用作了LED和UART3的功能,SPI2做成了正常的SPI2接口。此處以SPI2轉(zhuǎn)CAN為例,移植SPI轉(zhuǎn)CAN芯片;
SPI轉(zhuǎn)CAN芯片型號為:MCP2518,這款芯片可轉(zhuǎn)出CAN-FD,若只需要CAN功能,可參照該方式移植MCP2515或其他芯片;
本次移植的MCP2518芯片驅(qū)動來源是i.MX8MQ的源碼(處理器中默認(rèn)移植MCP2518芯片)。
01移植MC2518芯片驅(qū)動
在OK8MP-linux-kernel/drivers/net/can/spi/路徑下創(chuàng)建一個文件夾——mcp25xxfd,將相關(guān)文件(包含.c文件、.h文件、Makefile、Kconfig等)放置到此文件夾中。
02補全對can_rx_offload_add_manual函數(shù)的定義
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和Kconfig
vi
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修改驅(qū)動配置文件,將MCP2518編譯進(jìn)內(nèi)核
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在設(shè)備樹中配置時鐘
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在設(shè)備樹的ecspi2節(jié)點中進(jìn)行修改
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{
????#address-cells=?<1>;
????#size-cells=?<0>;
????fsl,spi-num-chipselects=?<1>;
????pinctrl-names=?"default";
????pinctrl-0=?<&pinctrl_ecspi2?&pinctrl_ecspi2_cs &pinctrl_ecspi2_can>;
????cs-gpios=?<&gpio5?13?GPIO_ACTIVE_LOW>;
????status=?"okay";
mcp1:mcp2518fd@0{
????????????compatible=?"microchip,mcp2518fd";
????????????reg=?<0>;
????????????spi-max-frequency=?<20000000>;
????????????clocks=?<&mcp2518fd_clock2>;
????????????interrupts-extended=?<&gpio4?21?IRQ_TYPE_LEVEL_LOW>;
};
};
完成上述修改后即可進(jìn)行編譯,并用新生成的鏡像燒寫OKMX8MP-C開發(fā)板。
08開發(fā)板驗證
將MCP2518芯片接到SPI2的接口上,啟動OKMX8MP-C開發(fā)板,啟動后使用ifconfig-a命令查看,即可看到多出了1個CAN節(jié)點。節(jié)點生成后,即可按照用戶使用手冊【4.18FlexCAN測試】章節(jié)進(jìn)行測試,驗證功能是否正常。
用戶使用手冊下載鏈接:https://pan.baidu.com/s/1TY4R5BrAnjAuTTJj9fNGWw
提取碼:?7qc8