免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2161 | 回复: 1
打印 上一主题 下一主题

[硬件及驱动] SMP Linux下对GPIO访问老是出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-12 17:38 |只看该作者 |倒序浏览
LED挂在CPU的gpio口上,在uboot中读写正常,可以点亮熄灭LED灯。但是在Linux下面只要调用读写函数(ioread32be, iowrite32be)对ioremap后的地址进行读写时,就会引起内核异常。之前一个同事写的cpld驱动(也是驱动挂在cpld上的一个led灯)却可以正常驱动cpld上的LED,我只是在他的驱动基础上改动了一下映射的GPIO地址。

在板子的BSP上有gpiolib的标准驱动,我尝试调他的驱动的读写函数,也会在读写的时候引起内核异常,我将设备树里的GPIO节点与他的驱动注掉,再去安装我的驱动,也会异常。

下面是内核异常信息:
Machine check in kernel mode.
Caused by (from MCSR=a000): Load Error Report
Guarded Load Error Report
Oops: Machine check, sig: 7 [#1]
SMP NR_CPUS=8 P2041 RDB
Modules linked in: nt10ipua_run_led
NIP: c0013e98 LR: f1264024 CTR: c0013e94
REGS: ef94df10 TRAP: 0204   Not tainted  (3.0.34-rt55-02404-g1a39570-dirty)
MSR: 00029002 <EE,ME,CE>  CR: 20002048  XER: 00000000
TASK = ea22b5f0[1808] 'ledtest' THREAD: e8850000 CPU: 0
GPR00: c00c3028 e8851d80 ea22b5f0 f1268000 ea1b08c0 ea0e0380 00000000 00000007
GPR08: e9633442 f1264248 010d9000 c0013e94 20000042 10018894 00000000 00000000
GPR16: 00000000 100c069c 00000000 10138ce8 100f0000 1011dbc8 10138ec8 ffffffff
GPR24: ffffffff ea0e0380 00000000 ea1b08c0 c076dcb4 e8919940 c0770000 f1260000
NIP [c0013e98] ioread32be+0x4/0x14
LR [f1264024] led_open+0x1c/0x40 [nt10ipua_run_led]
Call Trace:
[e8851d80] [e8919940] 0xe8919940 (unreliable)
[e8851d90] [c00c3028] chrdev_open+0xf4/0x1b8
[e8851dd0] [c00bce5c] __dentry_open.isra.13+0x148/0x2ac
[e8851df0] [c00cd2fc] do_last.isra.35+0x2c0/0x6fc
[e8851e40] [c00cd980] path_openat+0xac/0x384
[e8851e90] [c00cdd34] do_filp_open+0x30/0x8c
[e8851f10] [c00be058] do_sys_open+0xfc/0x1c8
[e8851f40] [c000e390] ret_from_syscall+0x0/0x3c
--- Exception: c01 at 0xff17ee4
    LR = 0x10000524
Instruction dump:
7c0004ac a0630000 0c030000 4c00012c 5463043e 4e800020 7c0004ac 7c601c2c
0c030000 4c00012c 4e800020 7c0004ac
0c030000 4c00012c 4e800020
---[ end trace 6fc0efd7adf9f615 ]---

是不是SMP下访问GPIO需要加什么锁?

论坛徽章:
0
2 [报告]
发表于 2013-03-13 23:30 |只看该作者
今天用DEMO板试了一下,发现居然用一样的prebootloader, uboot, Linux, device tree的情况下,DEMO板居然可以在加载同样的GPIO驱动成功读写GPIO寄存器,但是在我们的板子上却会产生上面的异常信号。

我们的板子与DEMO板不同的地方只是少了一些像SATA,SDCARD这样的外设,为CPU与SOC提供时钟的晶振频率下降了33.33MHZ(DEMO板是100MHZ,我们的板子是66.66MHZ)而已

但是我们的板子上的uboot可以成功的点亮挂在这个GPIO的LED灯,说明硬件上面是没有问题的,难道Linux下面对时钟的要求比较敏感?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP