linux驱动笔记 ubuntu自动安装驱动

SPI转can芯片CSM300详解以及Linux驱动移植调试笔记

CSM300(A)是一款集成微处理器、CAN收发器、DC-DC隔离电源、信号隔离于一体的通信模块,支持SPI和UART接口。它能很方便地嵌入到具有SPI或UART接口的设备中,使设备获得CAN通讯接口,实现SPI设备或UART设备与CAN总线网络之间的数据通讯。CSM300(A)可以支持SPI转CAN模式和UART转CAN模式。在SPI转CAN模式下,MCU的SPI接口与CSM300(A)的SPI接口连接,同时需要额外的GPIO与RST、INT、CTL0、CTL1引脚连接,实现对CSM300(A)的有效监测与控制。在SPI配置模式下,CSM300(A)处于等待配置状态,仅能通过SPI接口进行配置。

CSM300(A)有两个SPI主机控制引脚CTL0和CTL1,受主机端控制。主机通过控制CTL0,CTL1引脚,使CSM300(A)进入不同的功能状态,实现对CSM300(A)不同操作目的。主机端控制引脚电平不同对应功能如下表所示。主机可以通过读从机当前状态来获取产品当前可以读取的字节数以及可以写入的字节数。通过SPI读出4个字节,即为状态码。状态码由32个位构成,具体定义如下表所示。

CSM300(A)只能作为SPI从机,无法主动控制其他SPI总线设备。如果接收CAN数据帧之后,必须主动返回给CPU侧。硬件上的INT反馈引脚与主机连接,出现以下两种情况时,INT引脚会由高电平变成低电平,通知主机进行读数据操作。

CAN总线一般使用直线型布线方式,总线节点数可达110个。布线推荐使用屏蔽双绞线,CANH、CANL与双绞线线芯连接,CGND与屏蔽层连接,最后屏蔽层单点接地。得益于CSM300(A)的最低波特率5kbps,总线的最长通信距离可达10km。

移植CSM300驱动时,需要连接硬件,修改设备树,根据自己的平台修改。驱动程序csm300.c需要拷贝到特定目录,修改Makefile和Kconfig文件。执行make menuconfig来选中驱动,重新编译内核即可。为了方便调试SPI通道,增加代码在板子目录/sys/bus/spi/drivers/csm300中创建state文件节点,通过写入不同的值来产生spi数据或控制RST、CFG、CTL0、CTL1这4个引脚。

开机后驱动会调用check_csm300()来测试spi通道,发送的数据为F7:F8:02……。SPI接口的CLK和MOSI引脚的波形可以看到数据与发送一致。接收数据步骤类似。驱动加载出错时,可以按照定位问题的步骤进行调试,找出错误原因。例如,CFG引脚拉低异常可能导致检查不成功,需要硬件工程师调整。RST延时不够可能导致数据接收不到,需要增加延时时间来解决问题。

文件系统中如果没有can命令,需要自行移植。设置波特率并开启can0口,发送数据,查看接收数据。调试过程中遇到错误时,可以参考驱动加载出错的log,通过检查SPI控制器与CSM300通信、RST、CFG、CTL0、CTL1引脚电平、中断计数等来定位问题。

ARM开发板LINUX系统缺少CH341驱动解决笔记

一、评估驱动兼容性

检查系统中是否存在与ch341设备对应的驱动文件,方法是查看'/lib/modules/5.15.0-76-generic/kernel/drivers/usb/serial/'目录下是否包含ch341.ko文件。需将'5.15.0-76-generic'替换为系统实际内核版本。

二、解决驱动缺失

若系统缺少所需驱动,可采取以下步骤:

1、确定内核版本:通过运行'uname-r'命令获取。

2、安装内核头文件:

a、对于官方系统,使用命令'sudo apt-get install linux-headers-$(uname-r)'完成安装。

b、对于特定定制系统,需先获取源码并按照编译指南自动生成内核头文件。

3、安装与编译ch341驱动:

a、从wch.cn下载ch341驱动源码。

b、确保系统已安装编译所需工具,如gcc、g++、make。

c、切换至驱动文件所在目录。

d、使用'make'命令编译源码,生成ch341.ko文件。

4、安装并验证驱动:

a、安装locate命令以查找系统中ch341.ko文件的位置。

b、使用'sudo modprobe ch341'命令挂载驱动。

c、执行'sudo dmesg'检查设备识别情况,确认是否已显示'/dev/ttyUSB0'。

d、设备连接时,执行'sudo apt remove brltty'命令以避免冲突。

ZYNQ+linux网口调试笔记(3)PL-ETH

在ZYNQ上使用gigE Vision协议的网络接口相机。

第一步:调通PS侧网口GEM0(Xilinx BSP默认配好)。

第二步:调通PS侧网口GEM1(见前一篇文档:开发笔记(1))。

第三步:调通PL侧网口(本文阐述)。

第四步:在PL侧网口上验证Jumbo Frame特性,并在应用层适配gigE Vision协议。

根据《xapp1082》可知,PL侧的PHY支持1000Base-X和SGMII两种配置,这两种配置对应两种不同的PHY引脚接口(连接到MAC)。而我们的hdf文件使用的是1000Base-X的配置。

关于网口的Linux驱动,我们在官网找到一份资料: Xilinx Wiki- Zynq PL Ethernet。资料很长,我们只看与我们相关的2.4.1 PL Ethernet BSP installation for 1000Base-X”这一章节就可以了。

首先导入FPGA设计同事提供的hdf文件:

在弹出的图形界面里,进入Subsystem AUTO Hardware Settings——Ethernet Settings——Primary Ethernet,确认可以看到PL侧网络设备axi_ethernet_0,说明hdf文件里已包含了必要的网口硬件信息:

上图中被选中的网口将成为Linux上的设备eth0。这里我们默认选择ps7_ethernet_0,即使用GEM0作为首选网口。

启用Xilinx AXI Ethernet驱动

进入Device Drivers-- Network device support–选中Xilinx AXI Ethernet(以及Xilinx Ethernet GEM,这是PS侧网口的驱动)

进入Networking support–选中 Random ethaddr if unset

进入Device Drivers-- Network device support-- PHY Device support and infrastructure–启用Drivers for xilinx PHYs

进入~~~~Device Drivers-- DMA Engine Support-–禁用~~~~Xilinx AXI DMAS Engine~~~(对应的配置项名为~~ CONFIG_XILINX_DMA~~~)

注意: Xilinx Wiki里对设备树节点的引用有误(&axi_ethernet),导致编译报错,应改为&axi_ethernet_0。

注:PL-ETH驱动所在路径:<project>/build/tmp/work-shared/plnx_arm/kernel-source/drivers/net/ethernet/xilinx/xilinx_axienet_main.c和xilinx_axienet_mdio.c。对应的内核配置项为CONFIG_NET_VENDOR_XILINX和CONFIG_XILINX_AXI_EMAC。

启用ethtool和tcpdump(调试用,非必须):

然后将生成的BOOT.BIN和image.ub拷贝到SD卡根目录下,将SD卡插入板子上,上电运行。

上电后,使用ifconfig eth1查看网口信息,观察MAC地址与设置的一致,且ifconfig eth1 192.168.1.11 up没有报错。

测试网络通路:ping PC是通的。说明网口工作正常。

Linux下eth1(即PL-ETH)的MAC地址有误

问题描述:

开机打印:

注意:

MAC地址是错的,驱动里解析出的是GEM0的MAC地址。

试验发现,即使在system-user.dtsi里不写local-mac-address,也照样解析出的是GEM0的MAC。

而将system-user.dtsi里的local-mac-address改名为pl-mac-address,并将驱动里解析的字符串也对应更改为pl-mac-address,则可以正确解析出来:

Passing MAC address to kernel via Device Tree Blob and U-Boot:

通过更改u-boot环境变量和设备树,为每个板子设置一个独特的MAC地址:

U-Boot里的环境变量ethaddr会覆盖掉设备树里pl-eth的local-mac-addr字段,从而影响Linux启动后的网卡MAC地址;

但U-Boot里的环境变量ipaddr不会对Linux启动后的配置产生任何影响。因为设备树里根本就没有关于IP地址的配置。

phy-mode怎么会是sgmii?查了下官方的提供的BSP里,也是“sgmii”。说明这个没问题。具体原因不清楚。

@TODO:设备树里的中断号的顺序如何影响功能?

为何读出来的IRQ号不对呢?这是因为这里读到的不是硬件的中断号,而是经过系统映射之后的软件IRQ number。两者不具有线性关系。

关于中断号的疑问:

Linux上的网口eth0、eth1的顺序,似乎是按照phy地址从小到大来排布的。

Xilinx xapp1082-zynq-eth.pdf(v5.0) July 16, 2018

Xilinx Wiki- Zynq PL Ethernet:

Xilinx Wiki- Linux Drivers:

Xilinx Wiki- Linux Drivers- Macb Driver:

Xilinx Wiki- Zynq Ethernet Performance:

查到关于Jumbo frame MTU的定义,当前值为9000,可否改大一些?

驱动源码里关于jumbo frame的说明:

设置MTU为9000,发现ping包最大长度只能设为ping 192.168.1.10-s 1472

【完】

阅读剩余
THE END