T507 buildroot linux4.9之MCP2515 can网络开发调试

文章目录


前言

由于T507这款soc中没有带can接口,而项目中需要can接口,故采用了mcp2515 spi转can进行调试。


一、设备树配置

1.1、SPI总线确认

通过原理图确认SPI总线,并把SPI总线的片选以及总线的复用情况进行整理配置

c 复制代码
diff --git a/device/config/chips/t507/configs/demo2.0/board.dts b/device/config/chips/t507/configs/demo2.0/board.dts
index dd51dbc284..bf15f85f5a 100755
--- a/device/config/chips/t507/configs/demo2.0/board.dts
+++ b/device/config/chips/t507/configs/demo2.0/board.dts
@@ -83,13 +83,13 @@
 			};
 
 			spi1_pins_b: spi1@1 {
-				allwinner,pins = "PH5", "PH9";
-				allwinner,pname = "spi1_cs0", "spi1_cs1";
+				allwinner,pins = "PH5";
+				allwinner,pname = "spi1_cs0";
 				allwinner,function = "spi1";
 			};
 
 			spi1_pins_c: spi1@2 {
-				allwinner,pins = "PH5", "PH6", "PH7", "PH8", "PH9";
+				allwinner,pins = "PH5", "PH6", "PH7", "PH8";
 				allwinner,function = "io_disabled";
 			};
c 复制代码
diff --git a/device/config/chips/t507/configs/demo2.0/sys_config.fex b/device/config/chips/t507/configs/demo2.0/sys_config.fex
index bb583b70d6..ff3a11776a 100755
--- a/device/config/chips/t507/configs/demo2.0/sys_config.fex
+++ b/device/config/chips/t507/configs/demo2.0/sys_config.fex
@@ -132,12 +132,12 @@ uart_debug_port = 0
 uart_debug_tx   = port:PH00<2><1><default><default>
 uart_debug_rx   = port:PH01<2><1><default><default>
 
-[jtag_para]
-jtag_enable     = 1
-jtag_ms         = port:PH9<3><default><default><default>
-jtag_ck         = port:PH10<3><default><default><default>
-jtag_do         = port:PH11<3><default><default><default>
-jtag_di         = port:PH12<3><default><default><default>
+;[jtag_para]
+;jtag_enable     = 1
+;jtag_ms         = port:PH9<3><default><default><default>
+;jtag_ck         = port:PH10<3><default><default><default>
+;jtag_do         = port:PH11<3><default><default><default>
+;jtag_di         = port:PH12<3><default><default><default>

1.2、DTS配置

对mcp2515进行配置,clk信号以及中断等处理,同时在项目中如果有3.3v转5v的电平转换芯片,需要确保改转换ic的工作正常。

c 复制代码
diff --git a/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw9p1-clk.dtsi b/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw9p1-clk.dtsi
index 7708d3083b..6466bfe206 100755
--- a/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw9p1-clk.dtsi
+++ b/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw9p1-clk.dtsi
@@ -10,6 +10,13 @@ clocks {
 	      <0x0 0x07000000 0x0 0x4>;
 
 /* register fixed rate clock*/
+		mcp251x_clk: mcp251x_clk{
+			#clock-cells = <0>;
+			compatible = "allwinner,fixed-clock";
+			clock-frequency = <8000000>;
+			clock-output-names = "mcp251x_clk";
+		};
+	
 		clk_losc: losc {
 			#clock-cells = <0>;
 			compatible = "allwinner,fixed-clock";
c 复制代码
diff --git a/device/config/chips/t507/configs/demo2.0/board.dts b/device/config/chips/t507/configs/demo2.0/board.dts
index dd51dbc284..bf15f85f5a 100755
--- a/device/config/chips/t507/configs/demo2.0/board.dts
+++ b/device/config/chips/t507/configs/demo2.0/board.dts 
 
@@ -273,6 +273,15 @@
                     allwinner,drive = <1>;
                     allwinner,pull = <0>;
             }; 
+
+            can_irq: can0@0 {
+                allwinner,pins = "PH9";
+                allwinner,pname = "can_irq";
+                allwinner,function = "irq";
+                allwinner,muxsel = <6>;
+                allwinner,drive = <1>;
+                allwinner,pull = <0>;
+            };			
 			
 		};
 
@@ -293,7 +302,8 @@
        spi1: spi@05011000 {
 			pinctrl-0 = <&spi1_pins_a &spi1_pins_b>;
 			pinctrl-1 = <&spi1_pins_c>;
 			spi_slave_mode = <0>;
-			status = "disabled";
+			status = "okay"; 
+			mcp2515{
+                status = "okay"; 
+                reg = <0x0>;
+                compatible = "microchip,mcp2515";
+                spi-max-frequency = <24000000>;
+                clocks = <&mcp251x_clk>;
+                interrupt-parent = <&pio>;
+                interrupts = <PH  9  IRQ_TYPE_EDGE_BOTH>;
+                pinctrl-names = "default";
+                pinctrl-0 = <&can_irq>;
+            }; 
 		}; 

二、驱动配置

2.1、驱动位置

定为驱动,使用内核中的驱动即可,包括mcp2515驱动,spi总线以及can网络配置

mcp2515驱动:

c 复制代码
kernel/linux-4.9/drivers/net/can/spi/mcp251x.c

spi总线:

c 复制代码
kernel/linux-4.9/drivers/spi

can网络:

c 复制代码
kernel/linux-4.9/drivers/net/can

使用宏来配置驱动。

2.2、使用config宏配置驱动

c 复制代码
diff --git a/kernel/linux-4.9/arch/arm64/configs/sun50iw9p1smp_longan_defconfig b/kernel/linux-4.9/arch/arm64/configs/sun50iw9p1smp_longan_defconfig
index d9b09b74ab..9ec92f7774 100755
--- a/kernel/linux-4.9/arch/arm64/configs/sun50iw9p1smp_longan_defconfig
+++ b/kernel/linux-4.9/arch/arm64/configs/sun50iw9p1smp_longan_defconfig
@@ -1038,7 +1038,11 @@ CONFIG_NET_FLOW_LIMIT=y
 # CONFIG_NET_PKTGEN is not set
 # CONFIG_NET_DROP_MONITOR is not set
 # CONFIG_HAMRADIO is not set
-# CONFIG_CAN is not set
+CONFIG_CAN=y 
+CONFIG_CAN_RAW=y
+CONFIG_CAN_BCM=y
+CONFIG_CAN_GW=y
+CONFIG_CAN_MCP251X=y
 # CONFIG_IRDA is not set
 CONFIG_BT=y
 CONFIG_BT_BREDR=y
@@ -1382,7 +1386,7 @@ CONFIG_TUN=y
 CONFIG_ETHERNET=y
 CONFIG_NET_VENDOR_ALLWINNER=y
 # CONFIG_SUN4I_EMAC is not set
-# CONFIG_SUNXI_GMAC is not set
+CONFIG_SUNXI_GMAC=y
 # CONFIG_ALTERA_TSE is not set
 CONFIG_NET_VENDOR_AMAZON=y
 CONFIG_NET_VENDOR_AMD=y
@@ -1912,7 +1916,10 @@ CONFIG_I2C_SUNXI=y
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_SPI is not set
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+CONFIG_SPI_SPIDEV=y
+CONFIG_SPI_SUNXI=y
 # CONFIG_SPMI is not set
 # CONFIG_HSI is not set

2.3、MCP2515驱动调试中遇到的问题

2.3.1、问题描述

调试mcp2515 spi转can过程中,软件写复位读出来的状态是0x01复位不了mcp2515

2.3.2、分析问题

软件复位中,spi的写操作过快,没有将mcp2515寄存器进行复位完成

2.3.3、处理问题

在软复位中,添加timer处理

c 复制代码
diff --git a/kernel/linux-4.9/drivers/net/can/spi/mcp251x.c b/kernel/linux-4.9/drivers/net/can/spi/mcp251x.c
index f3f05fea8e..82169895a0 100755
--- a/kernel/linux-4.9/drivers/net/can/spi/mcp251x.c
+++ b/kernel/linux-4.9/drivers/net/can/spi/mcp251x.c
@@ -627,7 +627,7 @@ static int mcp251x_setup(struct net_device *net, struct mcp251x_priv *priv,
 static int mcp251x_hw_reset(struct spi_device *spi)
 {
 	struct mcp251x_priv *priv = spi_get_drvdata(spi);
-	u8 reg;
+	unsigned long timeout;
 	int ret;
 
 	/* Wait for oscillator startup timer after power up */
@@ -638,13 +638,14 @@ static int mcp251x_hw_reset(struct spi_device *spi)
 	if (ret)
 		return ret;
 
-	/* Wait for oscillator startup timer after reset */
-	mdelay(MCP251X_OST_DELAY_MS);
-	
-	reg = mcp251x_read_reg(spi, CANSTAT);
-	if ((reg & CANCTRL_REQOP_MASK) != CANCTRL_REQOP_CONF)
-		return -ENODEV;
-
+ 	timeout = jiffies + HZ;
+ 	while ((mcp251x_read_reg(spi, CANSTAT) & CANCTRL_REQOP_MASK) != CANCTRL_REQOP_CONF) {
+ 		usleep_range(MCP251X_OST_DELAY_MS * 1000,MCP251X_OST_DELAY_MS * 1000 * 2); 
+ 		if (time_after(jiffies, timeout)) {
+ 			printk("MCP251x didn't enter in conf mode after reset\n");
+ 			return -EBUSY;
+ 		}
+ 	}
 	return 0;
 }

三、buildroot 集成can测试工具

sdk的buildroot中can测试工具是没有的,需要自行进行添加,同时需要将out目录下的.config删除

.config:

c 复制代码
out/t507/demo2.0/longan/buildroot/.config

集成can测试工具

c 复制代码
diff --git a/buildroot/buildroot-201902/configs/sun50iw9p1_longan_defconfig b/buildroot/buildroot-201902/configs/sun50iw9p1_longan_defconfig
index 8cafd7e907..3b3c8b1f28 100755
--- a/buildroot/buildroot-201902/configs/sun50iw9p1_longan_defconfig
+++ b/buildroot/buildroot-201902/configs/sun50iw9p1_longan_defconfig
@@ -1943,7 +1943,7 @@ BR2_PACKAGE_QEMU_ARCH_SUPPORTS_TARGET=y
 # BR2_PACKAGE_BRIDGE_UTILS is not set
 # BR2_PACKAGE_BWM_NG is not set
 # BR2_PACKAGE_C_ICAP is not set
-# BR2_PACKAGE_CAN_UTILS is not set
+BR2_PACKAGE_CAN_UTILS=y
 # BR2_PACKAGE_CANNELLONI is not set
 # BR2_PACKAGE_CHRONY is not set
 # BR2_PACKAGE_CIVETWEB is not set
@@ -2024,7 +2024,7 @@ BR2_PACKAGE_HOSTAPD_VLAN_NETLINK=y
 # BR2_PACKAGE_IODINE is not set
 # BR2_PACKAGE_IPERF is not set
 # BR2_PACKAGE_IPERF3 is not set
-# BR2_PACKAGE_IPROUTE2 is not set
+BR2_PACKAGE_IPROUTE2=y
 # BR2_PACKAGE_IPSEC_TOOLS is not set
 # BR2_PACKAGE_IPSET is not set
 # BR2_PACKAGE_IPTABLES is not set

四、测试

c 复制代码
ip link set can0 down 		#关闭can设备;
ip link set can0 up type can bitrate 250000 #设置can波特率
ip link set can0 up   		#开启can设备  
cansend can0 123#000102030405060708 #发送信息
candump can0  			    #接收can总线发来数据
ip -details link show can0 	#显示can设备详细信息 
ifconfig can0 down 			#关闭can设备,以便配置
相关推荐
IT果果日记5 分钟前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教7 分钟前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
羑悻的小杀马特20 分钟前
环境变量简介
linux
小陈phd1 小时前
Vscode LinuxC++环境配置
linux·c++·vscode
是阿建吖!1 小时前
【Linux】进程状态
linux·运维
明明跟你说过1 小时前
Linux中的【tcpdump】:深入介绍与实战使用
linux·运维·测试工具·tcpdump
Komorebi.py2 小时前
【Linux】-学习笔记05
linux·笔记·学习
Mr_Xuhhh3 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
内核程序员kevin6 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
朝九晚五ฺ10 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习