Forlinx OKMX8MP-C 開発ボードには、2 つのネイティブ CAN バスが装備されています。ただし、特定の製品開発シナリオでは、追加の CAN バスが必要になります。この記事では、 SPI から CAN への変換方法を紹介し、エンジニアの参考にさせていただきます。
説明
• FETMX8MP-C SoM には2 つのネイティブ SPI バスがあります。現在、SPI1 のピンは LED および UART3 機能に使用されており、SPI2 は通常の SPI2 インターフェイスとして構成されています。SPI2 から CAN への変換を例にとると、このプロセスには SPI を CAN チップに移植することが含まれます。
• SPI to CAN チップのモデルは MCP2518 です。このチップはCAN-FDへの変換が可能です。CAN 機能のみが必要な場合は、この方法を参照して MCP2515 またはその他のチップを移植できます。
• この移植プロセスにおける MCP2518 チップのドライバーは、i.MX8MQ のファームウェア コードから供給されます。MCP2518 チップはデフォルトでプロセッサにすでに移植されています。
1. MCP2518 チップ ドライバーの移植
パス「OK8MP-linux-kernel/drivers/net/can/spi/」の下に「mcp25xxfd」という名前のフォルダーを作成します。関連ファイル (.c ファイル、.h ファイル、Makefile、Kconfig など) をこのフォルダーに配置します。
2. 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);
3. 以前のディレクトリ 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"
4. ドライバー構成ファイルを変更し、MCP2518 をカーネルにコンパイルします。
vi OK8MP-linux-kernel/arch/arm64/configs/OK8MP-C_defconfig
取得:CONFIG_CAN_MCP251X=y
変更:# CONFIG_CAN_MCP251X が設定されていない
追加:CONFIG_CAN_MCP25XXFD=y
5. デバイスツリーでクロックを設定します。
vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts 以下を
追加します。
clocks{ mcp2518fd_clock: mcp2518fd_clock{ compatible = "fixed-clock"; #clock-cells =; clock-frequency =; }; };
6. チップの割り込みピンとして使用するピンを見つけます。
ここでは GPIOUNK1IO21 が割り込みピンとして使用されます。
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 >; };
7. デバイスツリーのecspi2ノードを変更します。
vi OK8MP-linux-kernel/arch/arm64/boot/dts/freescale/OK8MP-C.dts
より:
&ecspi2{ #address-cells=; #size-cells=; fsl,spi-num-chipselects=; pinctrl-names= "default"; pinctrl-0= <&pinctrl_ecspi2 &pinctrl_ecspi2_cs>; cs-gpios= <&gpio5 13 GPIO_ACTIVE_LOW>; status= "okay"; spidev1:spi@0 { reg=; compatible= "rohm,dh2228fv"; spi-max-frequency=; }; };
への変更:
&ecspi2{ #address-cells=; #size-cells=; fsl,spi-num-chipselects=; 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=; spi-max-frequency=; clocks= <&mcp2518fd_clock2>; interrupts-extended= <&gpio4 21 IRQ_TYPE_LEVEL_LOW>; }; };
上記の変更を完了したら、新しく生成されたイメージを使用して OKMX8MP-C 開発ボードをコンパイルし、書き込むことができます。
MCP2518 チップを SPI2 インターフェイスに接続し、OKMX8MP-C 開発ボードを起動し、ifconfig -a コマンドを使用して表示すると、CAN ノードが 1 つ増えていることがわかります。
元は www.forlinx.net で公開されています。