pci驱动分为总线驱动和设备驱动。总线驱动是linux内核完成,主要完成设备的枚举,常规64个字节配置空间的访问。设备驱动是针对PCI接口具体设备需要实现的功能
hisi3559的ARM平台的PCIE目前不支持热插拔。
在内核的目录下:
osdrv/opensource/linux/linux-3.18.y$
执行make ARCH=arm CROSS_COMPILE=arm-hisiv600-linux- menuconfig
点击Bus support 进去
以上的选项也是顺序出现的,依次选中即可。
目前到这边,继续往下看。
另外还有一个
PCI host controller drivers —>
没有选择,目前我的PCIE的芯片是免驱的,驱动是写在一个EEPROM中,需要提前烧录好
Hisilicon PCI Express support (NEW) —>
进去之后还有一些参数的配置,
海思的文档中没有介绍,说让看
标准协议《PCI Express Base Specification Revision 2.1 》中 7.5 章节
先按照默认的,不行再修改。目前我们使用的是1G的DDR内存,海思默认的也是1G的内存。
RC(PCI Express root complex) 在RC模式时,使用PCIE类型1配置头;
EP(endpoint device)工作方式,在EP模式时,使用PCIE类型0配置头。
编译系统中有hotplug的选项,x86的系统才会支持hotplug,hisi3559 是ARM平台的,默认就没这个选项。
drivers/pci/
与hisi平台相关的代码为:
drivers/pci/hipcie
3559平台的USB3.0和PCIE是复用管脚的。
通过外部设置的电平状态去确定。
COMBO_PHY_MODE
COMBO_PHY_MODE_1,
需要设置为00
即VO_DATA7 VO_DATA9 需要接下拉电阻。
软件查看复用状态:
SYSSTAT寄存器查看状态:0x008c 基址是 0x1202_0000
读取出来的值是正确的,设置的为PCIE状态。
PCIe 参考时钟管脚被设置成输出模式,需要将芯片 VO_DATA5 下拉
PCIE 的PCIE_CLK_REQ_N 需要设置管脚复用
复用寄存器为:0x120400A8
在pcie_hi3559.c中加入了管脚复用的配置,无需增加代码
遇到问题一:
提示
request_pcie_res->197
request io resource failed,io->start=0x28400000,io->end=0x283fffff
看起来是io 空间不够导致的。
默认的BSP包中没有配置IO_SPACE_LIMIT
在以下文件增加:
osdrv/opensource/linux/linux-3.18.y/arch/arm/include/mach/hi3559_io.h
#ifdef CONFIG_PCI
#define IO_SPACE_LIMIT 0xffffffff
#define __io(a) __typesafe_io(PCI_IO_VIRT_BASE + ((a) & IO_SPACE_LIMIT))
#endif
要包含hisi3559的io配置
还必须要修改以下一个地方:
osdrv/opensource/linux/linux-3.18.y/arch/arm/mach-hisi/Kconfig
增加:
select NEED_MACH_IO_H if PCI
这样PCIE的卡就可以识别到了,
在板子上通过命令查看:
# lspci
00:00.0 Class 0604: 19e5:3519
01:00.0 Class 0c03: 9710:9990
01:00.1 Class 0c03: 9710:9990
01:00.2 Class 0c03: 9710:9990
01:00.3 Class 0c03: 9710:9990
01:00.4 Class 0c03: 9710:9990
01:00.5 Class 0c03: 9710:9990
01:00.6 Class 0c03: 9710:9990
01:00.7 Class 0c03: 9710:9990
可以看到class ID了,0C03的类型表示:USB (Universal Serial Bus)
MCS9990 是一颗PCIE转USB2.0的芯片,被识别成功后,会被当做一个USB host controller
那么需要系统有usb host的驱动。
需要增加的驱动如下:
从Device Driver 进入
把USB support 选* 然后进入
如上图所示,把标示红线的选中
EHCI 的选项是USB 2.0的host驱动支持。
EHCI: Enhanced Host Controller Interface (用于USB2.0高速设备的“增强主机控制接口”) 编译完成后,会有以下的驱动文件:
usbcore.ko
ehci-hcd.ko
ehci-pci.ko
ehci-platform.ko
安装顺序如下:
insmod usbcore.ko
insmod ehci-hcd.ko
insmod ehci-pci.ko
insmod ehci-platform.ko
通过以下命令可以查看当前的usb设备
#lsusb
Bus 003 Device 002: ID 0b95:772b
Bus 001 Device 001: ID 1d6b:0002
Bus 002 Device 001: ID 1d6b:0002
Bus 003 Device 001: ID 1d6b:0002
Bus 004 Device 001: ID 1d6b:0002
Bus 005 Device 001: ID 1d6b:0002
选中Network device support 为*
进入
选中 USB Network Adapters 为M
进入
选中划红线的3项,
海思平台的代码中默认支持ASIX AX88XXX系统的USB网卡
编译后会生成以下的几个驱动文件:
mii.ko
usbnet.ko
asix.ko
ax88179_178a.ko
执行 安装程序:
insmod mii.ko
insmod usbnet.ko
insmod asix.ko
insmod ax88179_178a.ko
这个时候用ifconfig命令应该可以看到网卡了
剩下就是通过ifconfig来配置网络了。
配置ip地址和子网掩码
ifconfig eth0 192.168.1.101 netmask 255.255.255.0 up
设置缺省网关
route add default gw 192.168.1.1
1.在usr/share/udhcpc/下增加一个default.script
这个文件在
osdrv/opensource/busybox/busybox-1.20.2/examples/udhcp/simple.script
重命名放入到usr/share/udhcpc/下即可
2.在bootapp自动启动时,增加以下命令:
ifconfig eth0 up
udhcpc
开机启动之后会自动获取IP和更新DNS。
在执行自动挂载USB网卡的时候:
出现了以下错误:
/usr/share/udhcpc/default.script: line 32: syntax error: you disabled math support for $((arith)) syntax
解决办法:
osdrv/opensource/busybox/minibusybox-1.20.2/config_v600_softfp_neon 增加以下两项支持即可:
CONFIG_SH_MATH_SUPPORT=y
CONFIG_SH_MATH_SUPPORT_64=y
hisi3559的ARM平台的PCIE目前不支持热插拔。
USB网卡热插拔之后,能够识别到网卡,但是需要重新配网。
需要重新执行:
ifconfig eth0 up
udhcpc
依次进入
Device Drivers —>
USB support —>
选中上图的 Mass Storage Support,
编译之后会生成:
usb-storage.ko
在前面已经安装了usb host驱动的前提下,
只要insmod usb-storage.ko
然后插入U盘就可以识别到了
查看 #ls /dev
有 sda
Sda1
两个文件,
通过mount挂载起来就可以看到U盘的内容了。
由于USB 鼠标,键盘是低速设备,因此需要添加
OHCI: Open Host Controller Interface (开放主机控制接口,USB1.0/1.1)的支持。
依次进入
Device Drivers —>
USB support —>
选择上图中的两项,
编译后会生成
ohci-hcd.ko
ohci-pci.ko
首先 需要确保HID input layer支持和input core 支持
Hisi3559默认都是y,不需要用模块的方式来加载了。
增加usb hid鼠标键盘的支持:
依次进入
Device Drivers —>
HID support —>
USB HID support —>
如上图所示,
选中3项,
进入到USB HID Boot Protocol drivers —>
选择:
所有的两项。
加载驱动:
insmod usbcore.ko
insmod ohci-hcd.ko
insmod ohci-pci.ko
insmod usbhid.ko
insmod usbkbd.ko
insmod usbmouse.ko
cat /dev/input/event0 | hexdump
移动鼠标,然后终端就打印出你的鼠标坐标了。