linux注册设备,linux 驱动开发
大家好,今天小编来为大家解答以下的问题,关于linux注册设备,linux 驱动开发这个很多人还不知道,现在让我们一起来看看吧!
LINUX 如何查看裸设备
df命令
说明:df命令可显示所有文件系统对i节点和磁盘块的使用情况。
该命令各个选项的含义如下:
-a显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。
-k以k字节为单位显示。
-i显示i节点信息,而不是磁盘块。
-t显示各指定类型的文件系统的磁盘空间使用情况。
-x列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。
-T显示文件系统类型。
例1:列出各文件系统的磁盘空间使用情况。
$ df
Filesystem 1 K-blocks Used Available Use% Mounted on
/dev/hda2 1361587 1246406 44823 97%/
df命令的输出清单的第1列是代表文件系统对应的设备文件的路径名(一般是硬盘上的分区);第2列给出分区包含的数据块(1024字节)的数目;第3,4列分别表示已用的和可用的数据块数目。用户也许会感到奇怪的是,第3,4列块数之和不等于第2列中的块数。这是因为缺省的每个分区都留了少量空间供系统管理员使用。即使遇到普通用户空间已满的情况,管理员仍能登录和留有解决问题所需的工作空间。清单中Use%列表示普通用户空间使用的百分比,即使这一数字达到100%,分区仍然留有系统管理员使用的空间。最后,Mounted on列表示文件系统的安装点。
例2:列出各文件系统的i节点使用情况。
$ df-ia
Filesystem Inodes IUsed IFree Iused% Mounted on
/dev/ hda2 352256 75043 277213 21%/
none 0 0 0 0%/proc
localhost:(pid221) 0 0 0 0%/net
例3:列出文件系统的类型。
$ df-T
Filesystem Type 1K-blocks Used Available use% Mounted on
/dev/hda2 ext2 1361587 1246405 44824 97%/
本例中的文件系统是ext2类型的
Linux系统中列出PCI设备和USB设备的命令详解
lspci
NAME
lspci-列出所有PCI设备 [[ ]]
总览 SYNOPSIS
lspci [ options ] [[ ]]
描述 DESCRIPTION
lspci是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具。
为了能使用这个命令所有功能,你需要有 linux 2.1.82或以上版本,支持/proc/bus/pci接口的内核。在旧版本内核中,PCI工具必须使用只有root才能执行的直接硬件访问,而且总是出现竞争状况以及其他问题。
如果你要报告 PCI设备驱动中,或者是 lspci自身的 bugs,请在报告中包含 lspci-vvx的输出。
[[ ]]
选项 OPTIONS
-v
使得 lspci以冗余模式显示所有设备的详细信息。
-vv
使得 lspci以过冗余模式显示更详细的信息(事实上是 PCI设备能给出的所有东西)。这些数据的确切意义没有在此手册页中解释,如果你想知道更多,请参照/usr/include/linux/pci.h或者 PCI规范。
-n
以数字形式显示 PCI生产厂商和设备号,而不是在 PCI ID数据库中查找它们。
-x
以十六进制显示 PCI配置空间(configuration space)的前64个字节映象(标准头部信息)。此参数对调试驱动和 lspci本身很有用。
-xxx
以十六进制显示所有 PCI配置空间的映象。此选项只有 root可用,并且很多 PCI设备在你试图读取配置空间的未定义部分时会崩溃(此操作可能不违反PCI标准,但是它至少非常愚蠢)。
-b
以总线为中心进行查看。显示所有 IRQ号和内存地址,就象 PCI总线上的卡看到的一样,而不是内核看到的内容。
-t
以树形方式显示包含所有总线、桥、设备和它们的连接的图表。
-s [[bus]:][slot][.[func]]
仅显示指定总线、插槽上的设备或设备上的功能块信息。设备地址的任何部分都可以忽略,或以*代替(意味着所有值)。所有数字都是十六进制。例如:0:指的是在0号总线上的所有设备;0指的是在任意总线上0号设备的所有功能块;0.3选择了所有总线上0号设备的第三个功能块;.4则是只列出每一设备上的第四个功能块。
-d [vendor]:[device]
只显示指定生产厂商和设备 ID的设备。这两个 ID都以十六进制表示,可以忽略或者以*代替(意味着所有值)。
-i file
使用 file作为 PCI ID数据库而不是使用默认的/usr/share/hwdata/pci.ids。
-p dir
使用 dir作为包含 PCI总线信息的目录而不是使用默认的目录/proc/bus/pci。
-m
以机器可读的方式转储 PCI设备数据(支持两种模式:普通和冗余),便于脚本解析。
-M
使用总线映射模式,这种模式对总线进行全面地扫描以查明总线上的所有设备,包括配置错误的桥之后的设备。请注意,此操作只应在调试时使用,并可能造成系统崩溃(只在设备有错误的时候,但是不幸的是它们存在),此命令只有 root可以使用。同时,在不直接接触硬件的 PCI访问模式中使用-M参数没有意义,因为显示的结果(排除 lspci中的 bug的影响)与普通的列表模式相同。
--version
显示 lspci的版本。这个选项应当单独使用。
[[ ]]
PCILIB选项 PCILIB OPTIONS
PCI工具使用 PCILIB(一种可移植的库,提供平台独立的函数来访问 PCI配置空间)来和PCI卡交互。下面的选项用来控制库参数,特别是所用访问模式的指定。默认情况下,PCILIB使用第一种可用的访问模式,不会显示任何调试信息。每一个开关选项都列出了一组它所支持的硬件/软件列表。
-P dir
使用 linux 2.1风格的配置,直接访问目录 dir而非/proc/bus/pci目录。(只能在 linux 2.1或以上版本中使用)
-H1
通过 Intel架构 1来实现直接硬件访问。(只能用于 i386及其兼容机)
-H2
通过Intel架构 2来实现直接硬件访问。警告:此模式只能寻址任何总线上的前16个设备,并且在很多情况下相当不可靠。(只能用于 i386及其兼容机)
-S
使用 PCI系统调用访问。(只能用于 Alpha和 Ultra-Sparc上的 Linux)
-F file
从所给的包含 lspci-x命令输出的文件中获取相关信息。这在分析用户提交的错误报告时很有用,因为你可以用任何方式来显示硬件配置信息而无需为了获取更多信息打扰用户。(可用于所有系统)
-G
增加库的调试等级。(可用于所有系统)
例:
a,列出所有PCI设备
代码如下:
[root@localhost zhangy]# lspci-tv#列出所有PCI设备
b,查看网卡型号
代码如下:
[root@localhost zhangy]# lspci|grep-i eth
05:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8039 PCI-E Fast Ethernet Controller(rev 14)
lsusb
lsusb作用:
列出所有usb设备
lsusb语法:
lsusb [参数]
lsusb参数:
-D设备路径不扫描/proc/bus/usb,而以指定的设备路径取代
-p内核路径使用其他USB设备在内核的路径,默认为/proc/bus/usb
-t将USB设备以树状架构输出
-v列出较详细的运行过程
-vv列出完整的运行过程
-V显示版本信息
例:
代码如下:
[root@localhost zhangy]# lsusb #列出所有usb设备
如何解决Linux下USB设备节点名不固定问题
Linux下USB设备节点名不固定问题经常会遇到,下面就是解决的方法:
以USB转串口为例,通常设备节点名为ttyUSBx(x为0~n),Linux内核会根据插入设备的先后顺序进行编号的分配,比如第一个插入的设备编号为0,然后依此加1。
如果仅仅以设备节点ttyUSBn来区别具体是哪个设备,因为末位的编号是随时会变的,所以就会造成混乱。无法保证A设备就是0,B设备就是1。其实这个问题在LDD3上已经提到过,目前的内核早已经解决类似的问题,将所以有USB设备都导致到sys文件系统中,其实每个USB端口都有唯一的端口号,相当于每个门店的门牌号。只要我们依据端口号来进行设备的区分,那么问题就迎刃而解了。
比如当前设备插入两个USB转串口设备后,查看ttyUSBn所在端口的端口号:
root@android:/$ ls-l/sys/class/tty/
...
lrwxrwxrwx root root 2011-01-01 13:40 ttyUSB0->../../devices/ff540000.usb/usb3/3-1/3-1.1/3-1.1:1.0/ttyUSB0/tty/ttyUSB0
lrwxrwxrwx root root 2011-01-01 13:43 ttyUSB1->../../devices/ff540000.usb/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1
root@android:/$ 12345
其中ttyUSB0所在的端口号为3-1.1,而ttyUSB1所在的端口号为3-1.2。
其它类型USB设备同理,以上思路清理完毕。
查看系统当前usb设备,下面是对第二列排序的结果。
$ lsusb
Bus 001 Device 001: ID xxx:xxx Linux Foundation 2.0 root hub
Bus 001 Device 002: ID xxx:xxx Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 003: ID xxx:xxx Genesys Logic, Inc. GL827L SD/MMC/MS Flash Card Reader
Bus 001 Device 005: ID xxx:xxx Philips(or NXP)
Bus 002 Device 001: ID xxx:xxx Linux Foundation 2.0 root hub
Bus 002 Device 002: ID xxx:xxx Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 003: ID xxx:xxx Intel Corp.
Bus 003 Device 001: ID xxx:xxx Linux Foundation 2.0 root hub
Bus 004 Device 001: ID xxx:xxx Linux Foundation 3.0 root hub
第二列是usb设备的hub编号。pc中usb设备都是接在hub上的,即使你的主板提供好多usb口,他们实际都是接在hub上的。
第四列是usb设备编号,设备在本机的编号。
所以,上面信息显示一共有4个usb hub(3个usb2.0,一个usb3.0)。如果
黑体字部分是我机器上的三个设备,001.003是机箱自带读卡器,001.005是无线键盘,002.003是intel无线网卡蓝牙模块(具体怎么知道的往下看)。
usb设备也可以用在内核文件中找到/sys/bus/usb/devices。linux将所有设备驱动映射到了/sys下。
ls-1/sys/bus/usb/devices/
1-0:1.0
1-1
1-1:1.0
1-1.2
1-1.2:1.0
1-1.4
1-1.4.1
1-1.4:1.0
1-1.4.1:1.0
1-1.4.1:1.1
1-1.4.1:1.2
1-1.5
1-1.5:1.0
1-1.5:1.1
1-1.5:1.2
2-0:1.0
2-1
2-1:1.0
2-1.5
2-1.5:1.0
2-1.5:1.1
3-0:1.0
4-0:1.0
usb1
usb2
usb3
usb4
都是符号连接。也可以用ls-l/sys/bus/usb/devices/看具体位置
输出看起来比较乱。用 udevadm工具能比较清楚列出设备信息。命令看起来是这样的:
udevadm info-p/sys/bus/usb/devices/usb1-q property
那怎么找出是那个usb设备呢?
Bus 002 Device 003: ID xxx:xxx Intel Corp.
第二列,002就要在所有2开头的文件去找,下面的符合第一规则。
2-0:1.0
2-1
2-1:1.0
2-1.5
2-1.5:1.0
2-1.5:1.1
通常系统的usb hub占据了`-`减号后第一位0。第一个 2-0:1.0,就是usb hub。
2-1.5*文件就是上面的设备。
$ udevadm info-p/sys/bus/usb/devices/2-1.5-q property
BUSNUM=002
DEVNAME=/dev/bus/usb/002/003
DEVNUM=003
............
ID_MODEL_ID=xxx
............
ID_VENDOR=xxx
............
ID_VENDOR_FROM_DATABASE=Intel Corp.
............
002和003就是lsusb的第2/4列.第6列,来自modelID和vender。
lsusb中的的东东就是这么来的。
那问题是怎么知道是蓝牙呢?答案是继续用udevadm查:
$ udevadm info-p/sys/bus/usb/devices/2-1.5:1.0-q property
ID_USB_CLASS_FROM_DATABASE=Wireless
ID_USB_PROTOCOL_FROM_DATABASE=Bluetooth
ID_USB_SUBCLASS_FROM_DATABASE=Radio Frequency
ID_VENDOR_FROM_DATABASE=Intel Corp.