第1章 PCIE驱动框架介绍
pci驱动分为总线驱动和设备驱动。总线驱动是linux内核完成,主要完成设备的枚举,常规64个字节配置空间的访问。设备驱动是针对PCI接口具体设备需要实现的功能
hisi3559的ARM平台的PCIE目前不支持热插拔。
第2章 PCIE驱动增加
配置内核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
Hisi3559硬件复用
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中加入了管脚复用的配置,无需增加代码
io 空间不够的问题
遇到问题一:
提示
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
#defin