sd卡驱动 linux linux驱动软件

大家好,关于sd卡驱动 linux很多朋友都还不太明白,今天小编就来为大家分享关于linux驱动软件的知识,希望对各位有所帮助!

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

【完】

为什么SD卡在Linux下/dev下的设备名叫mmcblk0p1

SD/MMC卡的设备构造差不多,MMC应该是 SD的前身,不过 MMC当时的设计比 SD小一半。

所以,SD/MMC的驱动通用,进一步的,Linux的设备节点就延续了 MMC的这个名字,后面的 blk是块设备这个英文的简写, mmcblk也就是“ mmc/sd块设备”,0就是这个 mmc/sd设备的顺序编号,p1就是第一个分区。

mmc卡与sd卡的区别:

1、mmc卡和baisd卡的长宽是一样的,SD卡略厚。

2、SD卡的触点比MMC卡多一个,是用于数字版dao权保护(DRM)的。

3、SD卡的侧边比MMC卡多一个写保护的开关。

扩展资料:

SD模式

驱动模式

SD卡有两种驱动模式:SPI模式与SDIO模式。它们所使用的接口信号是不同的。在SPI模式下,只会用到SD卡的4根信号线,即CS、DI、SCLK与DO(分别是SD卡的片选、数据输入、时钟与数据输出)。

传输模式

SD卡共支持三种传输模式:SPI模式(独立序列输入和序列输出),1位SD模式(独立指令和数据通道,独有的传输格式), 4位SD模式(使用额外的针脚以及某些重新设置的针脚。支持四位宽的并行传输)。

参考资料:百度百科-SD存储卡

linux系统中没有USB驱动怎么办

要启用 Linux USB支持,首先进入"USB support"节并启用"Support for USB"选项(对应模块为usbcore.o)。尽管这个步骤相当直观明了,但接下来的 Linux USB设置步骤则会让人感到糊涂。特别地,现在需要选择用于系统的正确 USB主控制器驱动程序。选项是"EHCI"(对应模块为ehci-hcd.o)、"UHCI"(对应模块为usb-uhci.o)、"UHCI(alternate driver)"和"OHCI"(对应模块为usb-ohci.o)。这是许多人对 Linux的 USB开始感到困惑的地方。

要理解"EHCI"及其同类是什么,首先要知道每块支持插入 USB设备的主板或 PCI卡都需要有 USB主控制器芯片组。这个特别的芯片组与插入系统的 USB设备进行相互操作,并负责处理允许 USB设备与系统其它部分通信所必需的所有低层次细节。

Linux USB驱动程序有三种不同的 USB主控制器选项是因为在主板和 PCI卡上有三种不同类型的 USB芯片。"EHCI"驱动程序设计成为实现新的高速 USB 2.0协议的芯片提供支持。"OHCI"驱动程序用来为非 PC系统上的(以及带有 SiS和 ALi芯片组的 PC主板上的)USB芯片提供支持。"UHCI"驱动程序用来为大多数其它 PC主板(包括 Intel和 Via)上的 USB实现提供支持。只需选择与希望启用的 USB支持的类型对应的"?HCI"驱动程序即可。如有疑惑,为保险起见,可以启用"EHCI"、"UHCI"(两者中任选一种,它们之间没有明显的区别)和"OHCI"。(赵明注:根据文档,EHCI已经包含了UHCI和OHCI,但目前就我个人的测试,单独加EHCI是不行的,通常我的做法是根据主板类型加载UHCI或OHCI后,再加载EHCI这样才可以支持USB2.0设备)。

启用了"USB support"和适当的"?HCI"USB主控制器驱动程序后,使 USB启动并运行只需再进行几个步骤。应该启用"Preliminary USB device filesystem",然后确保启用所有特定于将与 Linux一起使用的实际 USB外围设备的驱动程序。例如,为了启用对 USB游戏控制器的支持,我启用了"USB Human Interface Device(full HID) support"。我还启用了主"Input core support"节下的"Input core support"和"Joystick support"。

一旦用新的已启用 USB的内核重新引导后,若/proc/bus/usb下没有相应USB设备信息,应输入以下命令将 USB设备文件系统手动挂装到/proc/bus/usb:

# mount-t usbdevfs none/proc/bus/usb

为了在系统引导时自动挂装 USB设备文件系统,请将下面一行添加到/etc/fstab中的/proc挂装行之后:

none/proc/bus/usb usbdevfs defaults 0 0

模块的配置方法.

在很多时候,我们的USB设备驱动并不包含在内核中。其实我们只要根据它所需要使用的模块,逐一加载。就可以使它启作用。

首先要确保在内核编译时以模块方式选择了相应支持。这样我们就应该可以在/lib/modules/2.4.XX目录看到相应.o文件。在加载模块时,我们只需要运行modprobe xxx.o就可以了(modprobe主要加载系统已经通过depmod登记过的模块,insmod一般是针对具体.o文件进行加载)

对应USB设备下面一些模块是关键的。

usbcore.o要支持usb所需要的最基础模块usb-uhci.o(已经提过)usb-ohci.o(已经提过)uhci.o另一个uhci驱动程序,我也不知道有什么用,一般不要加载,会死机的ehci-hcd.o(已经提过 usb2.0)hid.oUSB人机界面设备,像鼠标呀、键盘呀都需要usb-storage.oUSB存储设备,U盘等用到

相关模块

ide-disk.oIDE硬盘ide-scsi.o把IDE设备模拟SCSI接口scsi_mod.oSCSI支持

注意kernel config其中一项:

Probe all LUNs on each SCSI device

最好选上,要不某些同时支持多个口的读卡器只能显示一个。若模块方式就要带参数安装或提前在/etc/modules.conf中加入以下项,来支持多个LUN。

add options scsi_mod max_scsi_luns=9

sd_mod.oSCSI硬盘sr_mod.oSCSI光盘sg.oSCSI通用支持(在某些探测U盘、SCSI探测中会用到)

常见USB设备及其配置

在Linux 2.4的内核中已经支持不下20种设备。它支持几乎所有的通用设备如键盘、鼠标、modem、打印机等,并不断地添加厂商新的设备象数码相机、MP3、网卡等。下面就是几个最常见设备的介绍和使用方法:

USB鼠标:

键盘和鼠标属于低速的输入设备,对于已经为用户认可的PS/2接口,USB键盘和USB鼠标似乎并没有太多更优越的地方。现在的大部分鼠标采用了PS/2接口,不过USB接口的鼠标也越来越多,两者相比,各有优势:一般来说,USB的鼠标接口的带宽大于PS/2鼠标,也就是说在同样的时间内,USB鼠标扫描次数就要多于PS/2鼠标,这样在定位上USB鼠标就更为精确;同时USB接口鼠标的默认采样率也比较高,达到125HZ,而PS/2接口的鼠标仅有40HZ(Windows 9x/Me)或是60HZ(Windows NT/2000)。

对于USB设备你当然必须先插入相应的USB控制器模块:usb-uhci.o或usb-ohci.o

modprobe usb-uhci

USB鼠标为了使其正常工作,您必须先插入模块usbmouse.o和mousedev.o

modprobe usbmouse

modprobe mousedev

若你把HID input layer支持和input core支持也作为模块方式安装,那么启动hid模块和input模块也是必要的。

modprobe hid

modprobe input

USB键盘:

一般的,我们现在使用的键盘大多是PS/2的,USB键盘还比较少见,但是下来的发展,键盘将向USB接口靠拢。使用USB键盘基本上没有太多的要求,只需在主板的BIOS设定对USB键盘的支持,就可以在各系统中完全无障碍的使用,而且更可以真正做到在即插即用和热插拔使用,并能提供两个USB连接埠:让您可以轻易地直接将具有USB接头的装置接在您的键盘上,而非计算机的后面。

同样你当然必须先插入相应的USB控制器模块:usb-uhci.o或usb-ohci.o

modprobe usb-uhci

然后您还必须插入键盘模块usbkbd.o,以及keybdev.o,这样usb键盘才能够正常工作。此时,运行的系统命令:

modprobe usbkbd

modprobe keybdev

同样若你把HID input layer支持和input core支持也作为模块方式安装,那么启动hid模块和input模块也是必要的。

U盘和USB读卡器:

数码存储设备现在对我们来说已经是相当普遍的了。CF卡、SD卡、Memory Stick等存储卡已经遍及我们的身边,通常,他们的读卡器都是USB接口的。另外,很多MP3、数码相机也都是USB接口和计算机进行数据传递。更我们的U盘、USB硬盘,作为移动存储设备,已经成为我们的必须装备。

在Linux下这些设备通常都是以一种叫做usb-storage的方式进行驱动。要使用他们必须加载此模块

modprobe usb-storage

当然,usbcore.o和usb-uhci.o或usb-ohci也肯定是不可缺少的。另外,若你系统中SCSI支持也是模块方式,那么下面的模块也要加载

modprobe scsi_mod

modprobe sd_mod

在加载完这些模块后,我们插入U盘或存储卡,就会发现系统中多了一个SCSI硬盘,通过正确地mount它,就可以使用了(SCSI硬盘一般为/dev/sd?,可参照文章后面的常见问题解答)。

mount/dev/sda1/mnt

Linux支持的其他USB设备。

MODEM--(比较常见)网络设备摄像头--(比较常见)例如ov511.o联机线--可以让你的两台电脑用USB线实现网络功能。usbnet.o显示器--(我没见过)游戏杆电视盒--(比较常见)手写板--(比较常见)扫描仪--(比较常见)刻录机--(比较常见)打印机--(比较常见)

注意:

上面所说的每个驱动模块,并不是都要手动加载,有很多系统会在启动或你的应用需要时自动加载的,写明这些模块,是便于你在不能够使用USB设备时,可以自行检查。只要用lsmod确保以上模块已经被系统加载,你的设备就应该可以正常工作了。当然注意有些模块已经以内核方式在kernel启动时存在了(这些模块文件在/lib/modules/2.4.XX中是找不到的)。

输入相关命令

阅读剩余
THE END