i.MX8MPlus 開発ボードで SPI から CAN への変換を実現するにはどうすればよいですか?

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 チップはデフォルトでプロセッサにすでに移植されています。

www.forlinx.net

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 で公開されています。

www.forlinx.net