查看: 9741|回复: 6

[求助] IMX6Q sabreSD PCIE + TW6865问题求助

[复制链接]

该用户从未签到

1

主题

7

帖子

0

新手上路

Rank: 1

积分
25
最后登录
1970-1-1
发表于 2015-1-14 10:17:30 | 显示全部楼层 |阅读模式
本帖最后由 devhuan 于 2015-1-14 10:33 编辑

大家好,我们在调试飞思卡尔的4in1编码器TW6865时遇到了难以解决的问题,希望大家给个意见和帮助;
在通过内核中System        Type->Freescale        MXC        Implementations下的PCI        Express选项
  1. [*] PCI        Express        support        
  2.   [ ]        PCI  Express EP mode in the IMX6  RC/EP interconnection system        
  3.   [ ]        PCI  Express RC mode in the IMX6  RC/EP interconnection system
  4. 在内核中通过补丁pcie_cap_patch.patch 向kernel中添加TW6865相关的驱动和配置;并在内核的选项选上tw68系列的encoder的编码器
  5. <*> Multimedia support  --->  
  6.     [*]   Video capture adapters  --->
  7.         Encoders, decoders, sensors and other helper chips  --->
  8.            <*> pcie TW68 video encoder
复制代码

启动之后,我们的log中可以看到pcie可以link up,也就是说linkpcie
PMU: registered new PMU device of type 0
Static Power Management for Freescale i.MX6
wait mode is enabled for i.MX6
cpaddr = c0880000 suspend_iram_base=c091c000
PM driver module loaded
iMX6 PCIe PCIe RC mode imx_pcie_pltfm_probe entering.
PCIE: imx_pcie_pltfm_probe start link up.
IMX PCIe port: link up.
PCI: bus0: Fast back to back transfers disabled
liutest start fixup imx6dq pcie tw6869
pci 0000:01:00.0: Setting PCI class for tw6868 PCIe device
liutest END fixup imx6dq pcie tw6869
PCI: bus1: Fast back to back transfers disabled
pci 0000:00:00.0: BAR 0: assigned [mem 0x01000000-0x010fffff 64bit pref]
pci 0000:00:00.0: BAR 0: set to [mem 0x01000000-0x010fffff 64bit pref] (PCI address [0x1000000-0x10fffff])
pci 0000:00:00.0: BAR 9: assigned [mem 0x01100000-0x011fffff pref]
pci 0000:00:00.0: BAR 6: assigned [mem 0x01200000-0x0120ffff pref]
pci 0000:01:00.0: BAR 0: assigned [mem 0x01100000-0x01100fff pref]
pci 0000:01:00.0: BAR 0: set to [mem 0x01100000-0x01100fff pref] (PCI address [0x1100000-0x1100fff])
pci 0000:00:00.0: PCI bridge to [bus 01-01]
pci 0000:00:00.0:   bridge window [io  disabled]
pci 0000:00:00.0:   bridge window [mem disabled]
pci 0000:00:00.0:   bridge window [mem 0x01100000-0x011fffff pref]
liutest PCI: r->start =0x1000000  r->end =0x10fffff
IMX usb wakeup probe
add wake up source irq 75
IMX usb wakeup probe

从这段log中可以看到pcie在探测插槽上的设备时是找到了设备的,并且成功连接,但是我们在这之后,CPU却在运行到如下log的地方停住了;
.......
ARC USBOTG Device Controller driver (1 August 2005)
mousedev: PS/2 mouse device common for all mice
i2c-core: driver [isl29023] using legacy suspend method
i2c-core: driver [isl29023] using legacy resume method
snvs_rtc snvs_rtc.0: rtc core: registered snvs_rtc as rtc0
i2c /dev entries driver
Linux video capture interface: v2.00
TW6868_: v4l2 driver version 2.0.1 loaded
PCI register init called                        //【死在了这里,没有继续往下启动了】

跟踪内核中的运行到函数__pci_enable_device_flags(struct pci_dev *dev,resource_size_t flags)时在里面调用函数pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);时没有返回一直停留在这个函数里面了,但是CPU没有死掉,就是停在里面了,因为在我注释掉这个函数之后,程序可以正确的跑到printk(KERN_INFO "pos 4 : after PCI register init called\n");函数;
File:pci.c
  1. static int __pci_enable_device_flags(struct pci_dev *dev,resource_size_t flags)
  2. {
  3. int err;
  4. int i, bars = 0;
  5. /*
  6. * Power state could be unknown at this point, either due to a fresh
  7. * boot or a device removal call.  So get the current power state
  8. * so that things like MSI message writing will behave as expected
  9. * (e.g. if the device really is in D0 at enable time).
  10. */
  11. if (dev->pm_cap) {
  12. u16 pmcsr;
  13. // add by huan.gong @ 2015-01-13
  14. printk(KERN_INFO "pos 3 : after PCI register init called\n");
  15. pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
  16. dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK);
  17. }
  18. // add by huan.gong @ 2015-01-13
  19. printk(KERN_INFO "pos 4 : after PCI register init called\n");
  20. if (atomic_add_return(1, &dev->enable_cnt) > 1)
  21. {
  22. // add by huan.gong @ 2015-01-13
  23. printk(KERN_INFO "pos 5 : after PCI register init called\n");
  24. return 0;        /* already enabled */
  25. }
复制代码
之后我又跟踪了函数pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);内联函数

  1. static inline int pci_read_config_word(struct pci_dev *dev, int where, u16 *val)
  2. {
  3. return pci_bus_read_config_word(dev->bus, dev->devfn, where, val);
  4. }
  5. EXPORT_SYMBOL(pci_bus_read_config_word);
复制代码


为了提高性能这个函数最终的实现时宏
  1. #define PCI_OP_READ(size,type,len) \
  2. int pci_bus_read_config_##size \
  3.         (struct pci_bus *bus, unsigned int devfn, int pos, type *value)        \
  4. {                                                                        \
  5.         int res;                                                        \
  6.         unsigned long flags;                                                \
  7.         u32 data = 0;                                                        \
  8.         if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER;        \
  9.         printk(KERN_INFO "::::lock irq\n");\
  10.         raw_spin_lock_irqsave(&pci_lock, flags);                        \
  11.         printk(KERN_INFO "::::read before\n");\
  12.         res = bus->ops->read(bus, devfn, pos, len, &data);                \
  13.         printk(KERN_INFO "::::read after\n");\
  14.         *value = (type)data;                                                \
  15.         raw_spin_unlock_irqrestore(&pci_lock, flags);                \
  16.         printk(KERN_INFO "::::unlock irq\n");\
  17.         return res;                                                        \
  18. }
复制代码

#define PCI_OP_READ(size,type,len) \
int pci_bus_read_config_##size \
        (struct pci_bus *bus, unsigned int devfn, int pos, type *value)        \
{                                                                        \
        int res;                                                        \
        unsigned long flags;                                                \
        u32 data = 0;                                                        \
        if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER;        \
        printk(KERN_INFO "::::lock irq\n");\
        raw_spin_lock_irqsave(&pci_lock, flags);                        \
        printk(KERN_INFO "::::read before\n");\
        res = bus->ops->read(bus, devfn, pos, len, &data);                \
        printk(KERN_INFO "::::read after\n");\
        *value = (type)data;                                                \
        raw_spin_unlock_irqrestore(&pci_lock, flags);                \
        printk(KERN_INFO "::::unlock irq\n");\
        return res;                                                        \
}

最终,cpu是挂在了第39行的read函数里面,而这个是一个函数指针,是在驱动开发的过程中通过.read = XXXX()来指定的,如果结合我们前面分析的那部分应该是read(dev->bus, dev->devfn,dev->pm_cap + PCI_PM_CTRL,&pmcsr)其中dev就是pcie设备;也就是说在读取pciePCI_PM_CTRL控制字(16bit)时进去就没能出来,而原本读出来是要存入pmcsr的。
        通过代码不难猜测出,是在去读取pcie电源相关配置字的时候除了问题。其实在这之前,我们可以是启动到内核加载DVFS module时挂掉的,后来卸载了patch之后,重新打上这个补丁,就变成这样了,而且用没有修改过的最原始的kernel来测试还是在PCI register init called..之后不动了.../欲哭无泪の
通过测试我们还看到了其他的log,在挂起之前,也有调用这个函数,只不过传进来的位置和要读取的长度不一样而已。
       这可能是目前遇到的最难处理的问题,也不知道如何下手去处理,我们前期功能验证和测试的时候用的是成都嵌智捷科技的板子,后来我们的工程师开发的定制的板子,嵌智捷的板子上我们没有测试过PCIE,希望有相关经验的来帮忙分析一些,不胜感激.....提前来个万分感谢....
我知道答案 目前已有6人回答
2015-01-14 10:05:00的屏幕截图.png
回复

使用道具 举报

该用户从未签到

1

主题

7

帖子

0

新手上路

Rank: 1

积分
25
最后登录
1970-1-1
 楼主| 发表于 2015-1-14 10:33:49 | 显示全部楼层
大家帮忙分析下。谢谢.....
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

835

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1795
最后登录
2016-4-2
发表于 2015-1-30 23:04:12 | 显示全部楼层
本帖最后由 柳叶刀 于 2015-2-2 11:21 编辑

读取pcie电源相关配置字的时候出了问题
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

825

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1687
最后登录
2015-2-10
发表于 2015-1-31 00:02:23 | 显示全部楼层
帮顶一下~
回复

使用道具 举报

该用户从未签到

1

主题

825

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1687
最后登录
2015-2-10
发表于 2015-1-31 18:08:09 | 显示全部楼层
看看mark
回复

使用道具 举报

该用户从未签到

1

主题

7

帖子

0

新手上路

Rank: 1

积分
25
最后登录
1970-1-1
 楼主| 发表于 2015-2-3 12:42:04 | 显示全部楼层
柳叶刀 发表于 2015-1-30 23:04
读取pcie电源相关配置字的时候出了问题

有什么建议吗,我们还么解决这个问题呢
回复 支持 反对

使用道具 举报

该用户从未签到

45

主题

2369

帖子

0

金牌会员

Rank: 6Rank: 6

积分
3275
最后登录
1970-1-1
发表于 2015-2-6 11:12:08 | 显示全部楼层
楼主你好,这个问题我帮你看了,搞不定,要不你到我们的官网上创建一个技术服务请求吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-17 17:54 , Processed in 0.098924 second(s), 26 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表