飞凌
嵌入式OKMX8MP-C开发板有两路原生CAN总线,但用户在开发产品时可能需要用到更多的CAN,这该如何解决呢?今天小编将为大家介绍一种SPI转CAN的方法,供各位工程师小伙伴参考。
说明
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
添加:
[url=]复制[/url]
-
- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
- <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
- <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
复制代码
vi OK8MQ-linux-kernel/drivers/net/can/rx-offload.c
添加:
[url=]复制[/url]
-
- <font color="rgb(198, 120, 221)">int</font> can_rx_offload_add_manual(<font color="rgb(198, 120, 221)">struct</font> net_device *dev,
- <font color="rgb(198, 120, 221)">struct</font> can_rx_offload *offload,
- <font color="rgb(198, 120, 221)">unsigned</font> <font color="rgb(198, 120, 221)">int</font> weight)
- {
- <font color="rgb(198, 120, 221)">if</font> (offload->mailbox_read)
- <font color="rgb(198, 120, 221)">return</font> -EINVAL;
- <font color="rgb(198, 120, 221)">return</font> 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
添加:
[url=]复制[/url]
vi OK8MP-linux-kernel/drivers/net/can/spi/Kconfig
添加:
[url=]复制[/url]
- <font color="rgb(193, 132, 1)">source</font> <font color="rgb(80, 161, 79)">"drivers/net/can/spi/mcp25xxfd/Kconfig"</font>
复制代码
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
添加:
[url=]复制[/url]
-
- 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
添加:
[url=]复制[/url]
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
从:
[url=]复制[/url]
- &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<a href="home.php?mod=space&uid=2514928" target="_blank">@0</a> {
- reg= <0>;
- compatible= "rohm,dh2228fv";
- spi-max-frequency= <500000>;
- };
- };
复制代码
- <span style="float: left; margin-right: 5px;"><table width="98%" class="t_table"><tbody><tr><td>
-
- <p style="line-height: 24px;"><font color="rgb(77, 77, 77)">改为:</font></p><div align="center">
- <span style="float: right; margin-left: 5px;"><font color="white">[url=]复制[/url]</font></span></div>
-
- <div class="blockcode"><blockquote>&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>;
- };
- };
复制代码
完成上述修改后即可进行编译,并用新生成的镜像烧写OKMX8MP-C开发板。
08
开发板验证
将MCP2518芯片接到SPI2的接口上,启动OKMX8MP-C开发板,启动后使用ifconfig -a命令查看,即可看到多出了1个CAN节点。节点生成后,即可按照用户使用手册【4.18 FlexCAN测试】章节进行测试,验证功能是否正常。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69989353/viewspace-2982417/
,如需转载,请注明出处,否则将追究法律责任。