VxWorks系统下龙芯平台的PCI驱动与硬件配置
概述
在VxWorks操作系统中,PCI(外围组件互连)总线的支持对于嵌入式系统至关重要。本文档将详细解释龙芯(Loongson)平台上VxWorks系统的PCI驱动架构,重点分析g64120aPci.c驱动文件和hwconf.c硬件配置文件的作用及其相互关系。
系统架构
1. PCI驱动层 (g64120aPci.c)
g64120aPci.c是VxWorks系统中针对龙芯平台的PCI总线控制器驱动程序,基于Marvell/Galileo GT64120A系统控制器。
主要功能:
PCI总线枚举与配置
自动扫描PCI总线上的设备
配置设备的基地址寄存器(BAR)
分配中断资源
配置空间访问
实现PCI配置空间的读写操作
支持Type 0和Type 1配置周期
处理配置访问中的异常情况
内存空间管理
映射PCI内存空间到CPU地址空间
管理I/O空间和内存空间的地址转换
中断处理
提供PCI设备的中断连接和断开功能
管理中断向量分配
关键函数:
/* PCI配置空间读写 */
LOCAL STATUS g64120aPciMethodDevCfgRead(VXB_DEVICE_ID, PCI_HARDWARE*, UINT32, UINT32, void*);
LOCAL STATUS g64120aPciMethodDevCfgWrite(VXB_DEVICE_ID, PCI_HARDWARE*, UINT32, UINT32, UINT32);
/* 地址转换 */
LOCAL STATUS g64120aPciMethodConvertBaseAddress(VXB_DEVICE_ID, UINT32*);/* 设备控制 */
LOCAL STATUS g64120aPciDevControl(VXB_DEVICE_ID, pVXB_DEVCTL_HDR);
2. 硬件配置层 (hwconf.c)
hwconf.c文件定义了系统的硬件资源配置,使用VxWorks的硬件配置框架(HCF)来描述所有硬件设备及其资源。
配置结构:
PCI控制器资源配置
const struct hcfResource godson2fPci0Resources[] = {{ "regBase", HCF_RES_INT, { (void *)0xbf002000 } },{ "mem32Addr", HCF_RES_ADDR, { (void *)NULL } },{ "mem32Size", HCF_RES_INT, { (void *)0 } },{ "memIo32Addr", HCF_RES_ADDR, { (void *)0x14000000 } },{ "memIo32Size", HCF_RES_INT, { (void *)0x04000000 } },// ... 更多资源配置
};
中断控制器配置
const struct intrCtlrInputs mipsLsnIntCtlrInputs0[] = {{11, "ns16550", 0, 0 }, /* 串口0中断 */{12, "ns16550", 1, 0 }, /* 串口1中断 */{16, "lsPciInt", 0, 0 }, /* PCI中断0 */{17, "lsPciInt", 1, 0 }, /* PCI中断1 */// ... 更多中断配置
};
设备列表
const struct hcfDevice hcfDeviceList[] = {{ "g64120aPci", 0, VXB_BUSID_PLB, 0, godson2fPci0Num, godson2fPci0Resources },{ "mipsLsnIntCtlr", 0, VXB_BUSID_PLB, 0, mipsLsnIntCtlrNum0, mipsLsnIntCtlrResources0 },{ "ns16550", 0, VXB_BUSID_PLB, 0, ns16550Dev0Num, ns16550Dev0Resources },// ... 更多设备
};
协同工作机制
1. 系统初始化流程
VxBus注册阶段
g64120aPciRegister()函数注册PCI驱动到VxBus系统
系统读取hwconf.c中的设备配置信息
设备实例初始化
g64120aPciInstInit()初始化PCI控制器
配置PCI桥接器和地址空间
调用vxbPciAutoConfig()进行自动配置
PCI总线枚举
系统扫描PCI总线上的所有设备
为每个设备分配资源并创建VxBus设备实例
2. 地址空间映射
龙芯平台的PCI地址空间映射关系:
text
CPU地址空间 PCI地址空间
0x1fd00000 <--> PCI I/O空间
0x14000000 <--> PCI内存空间
0x08000000 <--> PCI预取内存空间
3. 中断处理流程
PCI设备产生中断
GT64120A中断控制器接收中断
通过mipsLsnIntCtlr转发到CPU
VxWorks中断服务程序处理中断
应用层开发
1. PCI设备驱动开发
基于这个架构,开发PCI设备驱动的典型流程:
/* 初始化PCI设备 */
STATUS pciDeviceInit(void)
{VXB_DEVICE_ID pciDev;STATUS status;/* 查找PCI设备 */pciDev = vxbPciDeviceFindByVendor(busCtrlID, VENDOR_ID, DEVICE_ID);if (pciDev == NULL) {return ERROR;}/* 获取内存资源 */pResource = vxbResourceGet(pciDev, VXB_RES_MEM, 0);if (pResource == NULL) {return ERROR;}/* 映射内存空间 */virtAddr = vmMap(NULL, pResource->start, pResource->len, VM_WRITE | VM_READ | VM_UNCACHED);return OK;
}
2. 配置自定义PCI设备
在hwconf.c中添加新设备:
/* 添加新的PCI设备资源 */
struct hcfResource myPciDeviceResources[] = {{ "vendorId", HCF_RES_INT, { (void *)0x1234 } },{ "deviceId", HCF_RES_INT, { (void *)0x5678 } },{ "memBase", HCF_RES_ADDR, { (void *)0x50000000 } },{ "memSize", HCF_RES_INT, { (void *)0x100000 } },
};/* 注册到设备列表 */
const struct hcfDevice hcfDeviceList[] = {// ... 其他设备{ "myPciDriver", 0, VXB_BUSID_PCI, 0, NELEMENTS(myPciDeviceResources), myPciDeviceResources },
};
调试与问题排查
1. 启用调试信息
在g64120aPci.c中设置调试标志:
UINT32 g64120aDebug = TRUE; /* 启用调试输出 */
2. 常见问题
PCI设备未找到
检查Vendor ID和Device ID配置
验证PCI总线扫描范围
内存映射失败
检查地址空间冲突
验证物理地址到虚拟地址的转换
中断无法工作
检查中断控制器配置
验证中断线分配
总结
VxWorks系统在龙芯平台上的PCI支持通过g64120aPci.c驱动和hwconf.c配置文件的紧密配合实现。这种架构提供了灵活的硬件配置能力和强大的PCI设备管理功能,为嵌入式系统开发提供了坚实的基础。理解这两个文件的工作原理对于在龙芯平台上开发VxWorks应用程序至关重要。
后续在龙芯1e300上验证读写fpga内存。。。
#include <vxWorks.h>#define PCI_MEM_BASE_ADDR 0xb0000000int FpgaPciRead32(unsigned int offset)
{return (*(volatile int*)(PCI_MEM_BASE_ADDR + offset));
}void FpgaPciWrite32(unsigned int offset, int data)
{*(volatile int*)(PCI_MEM_BASE_ADDR + offset) = data;
}