1.硬件
先看pcie有哪些引脚
这个是X1的
这个是X16的
即差分数据+差分时钟
2.协议
pcie spec
精解PCI Express---基础篇
精解PCI Express---物理结构篇
精解PCI Express---系统架构篇
3.驱动
board-mx6q_sabresd.c中定义平台设备私有数据,并注册平台设备
static const struct imx_pcie_platform_data mx6_sabresd_pcie_data __initconst = {
.pcie_pwr_en = SABRESD_PCIE_PWR_EN,
.pcie_rst = SABRESD_PCIE_RST_B_REVB,
.pcie_wake_up = SABRESD_PCIE_WAKE_B,
//.pcie_dis = SABRESD_PCIE_DIS_B,//ljsong for led
#ifdef CONFIG_IMX_PCIE_EP_MODE_IN_EP_RC_SYS
.type_ep = 1,
#else
.type_ep = 0,
#endif
};
imx6q_add_pcie(&mx6_sabresd_pcie_data);
此函数最终调用下面函数,完成平台设备的注册
imx_add_platform_device("imx-pcie", -1,res, ARRAY_SIZE(res),
平台驱动文件位于arch/arm/mach-mx6/pcie.c
在初始化时会注册平台驱动
static int __init imx_pcie_drv_init(void)
{
return platform_driver_register(&imx_pcie_pltfm_driver);
}
1.在drivers/media/video/tw68-core.c里面有一个 module_init(TW68_init)
此处注册pci设备
static int TW68_init(void)
{
INIT_LIST_HEAD(&TW686v_devlist);
printk(KERN_INFO "TW6868_: v4l2 driver version %d.%d.%d loaded\n", 2, 0, 1);
return pci_register_driver(&TW68_pci_driver);
}
pci的最重要的结构体
static struct pci_driver TW68_pci_driver = {
.name = "TW6868",
.id_table = TW68_pci_tbl,
.probe = TW68_initdev,
.remove = __devexit_p(TW68_finidev),
//#ifdef CONFIG_PM
// .suspend = TW6868_suspend,
// .resume = TW6868_resume
//#endif
};
其中probe函数是在pcie控制器检测到pcie设备时回调