留言板

路过的蜗牛们,在这里留个脚印吧~

蜗窝欢迎各种言论,谈天说地、技术交流、问题求救、跳槽招聘、牢骚抱怨……哈哈。

评论:

buyit
2015-07-13 11:04
请教各位:

我现在用的一个soc有个RTC,它的中断类型是level的,当它产生中断之后,我在中断下半部去写rtc的一个寄存器去clear这个level-triggered irq,但是由于bus和时钟同步的原因,这个写的动作比较慢,所以当我从下半部的irq handler里面返回的时候并不能保证rtc到gic的中断信号已经清除了,所以有可能会造成level irq的中断仍然没有被清除,这样系统就有可能会不停进入这个level irq。 请问这种情况下有什么好办法吗? 我看到pxa的平台在处理mmc插拔的时候使用了如下方法:
1. 中断产生
2. disable_irq,
3. 启动一个timer,设置一个经验值作为到期时间,比如1s
4. 退出中断处理函数,本次中断处理完成,但是这个mmc irq处于disable状态。
5, timer到期之后,在timer handler里面polling mmc的一个寄存器,确定irq状态清除之后,enable_irq

这种方式消耗cpu是最少的,但是我很难找到其它平台使用类似的代码,因此我想是不是还有更好的解决方式?
linuxer
2015-07-14 08:47
@buyit:为何在bottom half中去清中断呢?那个操作RTC寄存器的动作真的很慢吗?
buyit
2015-07-14 08:51
@linuxer:可以在上半部清中断,不过RTC模块要等几万个cycle之后才会真正把连到GIC的那个irq信号变成inactive
linuxer
2015-07-14 09:33
@buyit:这个RTC HW block不是SOC上的吗?为何如此之慢?硬件拓扑是怎样的?RTC和Processor是通过什么bus连接的?
buyit
2015-07-14 10:03
@linuxer:是SOC上的RTC,不过芯片设计人员给出了这样子的解释,由于CPU和RTC模块的clock差太多,CPU在1ghz,RTC在32KHz,所以RTC在收到寄存器写入之后需要很久(相对于cpu的cycle来说很久,相对于rtc自己的cycle来说其实不久)才能拉irq pin。
linuxer
2015-07-14 12:37
@buyit:对level类型的中断而言,基本上在interrupt handler(top half)中需要完成clear interrupt的动作,否则,在执行完成interrupt handler之后会unmask该irq(参考handle_level_irq函数),如果没能清中断,那么中断会立刻再次进入的。

如果外设和CPU是通过慢速总线连接,那么这个clear interrupt的动作的确会比较慢,例如通过I2C接口访问寄存器来清除外设的中断。针对这种情况,基本上linux kernel中可以使用threaded interrupt handler,并且将flag设定为oneshot。当然,你这个场景的总线其实并不慢,慢的是外设的clock。不过,你说的场景有点怪,我倒是置疑硬件的设计。本质上,软件写寄存器来clear rtc interrupt,那么其irq signal应该立刻deasserted,也就是说寄存器和irq signal应该是同步的,否则,难道硬件人员还需要提供一个状态寄存器来说明rtc irq signal的状态?这太奇怪了。另外,对于RTC hw block,其包括两个clock domain,一个慢速的、驱动RTC自身功能运作的那个32768 clock,另外一个clock domain是来自和CPU 连接的bus上的clock,我认为清除硬件的中断信号这个HW功能不应该位于slow clock上。可能硬件设计有困难吧,anyway,你说的这种情况,除了在rtc interrupt handler中disable该irq,我还真是想不出其他方法了。
buyit
2015-07-14 13:50
@linuxer:非常感谢你的耐心回答,我也认为irq clear寄存器写入和irq signal应该是完全同步的,让我和硬件设计人员再沟通一下 :)
tigger
2015-07-07 20:27
wowo 同学的8核cpu方案,大核小核使用的是同一个PIMC吗?
wowo
2015-07-08 09:05
@tigger:我没有做过8核的方案。不过有研究过竞争对手的方案,确实用两个PMIC,因为功耗太大了。
另外,8核的方案有时候挺尴尬的,开小核吧性能不够,开大核吧,功耗太大。最后客户不得不放弃。ARM的初衷挺好,不过需要好的规划、定位和设计。
paul_chen
2015-07-07 11:48
@wowo and linuxer
大神们,什么时候分析下alsa系统,期待!
wowo
2015-07-07 12:28
@paul_chen:ALSA框架,我们在公司的时候,写过一些分析文档,要整理出来的话也不难,只是时间不是很多。不知道paul同学有没有兴趣帮忙整理一下?我可以把那些文档给你分享一下(有一两百页呢)。
paul_chen
2015-07-07 14:15
@wowo:@wowo
很有兴趣,工作需要,正在学习alsa,如果大神能够分享,边整理边提升,真是太好了。可以发到我的邮箱chengong924@163.com
blessed
2015-12-02 18:16
@paul_chen:paul_chen,能把资料分享一下吗,最近也在搞alsa但是不知道怎么入手啊
369979505@163.com ths!
passerby
2015-07-07 11:29
@窝蜗,请问arm iommu具体作用是什么?现在kenel报了个错误,iommu的PTE PA = 0,现在不太明白iommu是做什么的。
wowo
2015-07-07 12:25
@passerby:以前的时候,能够主动访问memory的,只有CPU、DMA等少数器件,因此MMU大多是把CPU看到的虚拟地址转换为实际的物理地址。
而现在,为了减轻CPU的压力,很多外设,也具备访问memory的能力,如GPU、codec等等。正常情况下,这些外设看到的是物理地址,因此直接使用物理地址操作memory。
使用物理地址的一个缺点是,地址必须是连续的,如果memory的需求较大(如显示相关的器件),则对内存管理形成了压力。因而很多外设本身也支持MMU功能,这时,外设看到的是连续的IO虚拟地址,经过MMU转换为不连续的物理地址。
因此,位于外设中的MMU模块,就称作IOMMU。
现在IOMMU应用比较多的地方,是GPU,另外一些显示控制器、视频codec等,也有。
passerby
2015-07-07 15:05
@wowo:那这样在IOMMU中也要建立映射页表吗?那进行iommu_map时候要得到page对应的物理地址,然后进行映射是吗?
wowo
2015-07-07 15:16
@passerby:是的。一般的原理是这样的:
1. 该设备的driver建立一个页表,并把页表的基地址告诉设备。页表的索引,就是对这个设备而言的“虚拟地址”,可以称作Device Address(DA)。
2. 应用需要给该设备发送数据时,送给该设备的driver一个虚拟地址(VA)。
3. driver通过VA获取物理地址(PA)列表,并保存在设备的页表中,同时获取DA,交给设备。
4. 设备根据DA,获取对应的PA,进而操作memory数据。

当然,实际可能比较复杂,如页表的换入换出算法等,所以可能抽象出了一个IOMMU框架。
Robert
2015-07-06 16:09
你好,请问贵站啥时出mmc驱动的内容呢?
wowo
2015-07-06 20:04
@Robert:抱歉,由于业余时间太少了,MMC尚不在计划中。
Robert
2015-07-07 09:53
@wowo:了解,大神能问个问题吗? 就是要是mmc驱动提供的接口是直接被文件系统调用的吗? 谢谢
wowo
2015-07-07 10:46
@Robert:对mmc驱动而言,只需要实现一个MMC host(struct mmc_host),并提供相应的ops(struct mmc_host_ops)即可。后续的操作逻辑,都由mmc core负责,大概包括:
启动一个用于detect的work,检测MMC card的插入(由mmc_rescan完成,会调用host->bus_ops->detect接口);
调用mmc_rescan_try_freq,根据卡的类型,使用不同的速率,扫描mmc卡;
以MMC卡为例,会调用mmc_attach_mmc,最终会调用mmc_add_card添加一个card(struct mmc_card);
card driver在系统初始化的时候,已经注册了一个mmc driver(struct mmc_driver),每当有新的card加入时,会调用mmc_blk_probe接口,进而创建一个block device;
block device之上,就是文件系统。

因此,回答您的问题:狭义的mmc driver(指的是mmc host driver),是由mmc core调用;广义的mmc driver(一些wifi卡除外),由block device调用。
希望能给您提供一点帮助。
Rebort
2015-07-07 14:15
@wowo:非常感谢,是不是block.c是给上层提供接口? 最近的任务是优化emmc驱动,求大神指点一个方向,谢谢
wowo
2015-07-07 15:22
@Rebort:是的。不过抱歉,优化是一个比较细致的事情,我也指点不了什么。
Rebort
2015-07-08 10:04
@wowo:了解,谢谢大神的帮助
tigger
2015-06-26 17:07
留言又被广告刷屏了
wowo
2015-06-26 17:19
@tigger:这家伙太执着了,不得不把IP给他封了……
tigger
2015-06-26 18:08
@wowo:都是为了生活,都不容易~~~哈哈
wowo
2015-06-26 21:16
@tigger:tiger所言极是啊,听这话就知道兄弟也是性情中人啊,哈哈
tigger
2015-06-06 11:24
好久不见啊,最近忙的不可开交,都没有时间充电了。
wowo
2015-06-08 09:53
@tigger:是啊,好久不见,都挺忙的,文章更新也比较缓慢了,呵呵。
linuxer
2015-06-11 00:19
@tigger:我也是,最近比较忙,家里和公司都忙,已经很久没有写文章了。不过没有关系,咱们的宗旨不是慢下来享受科技嘛
ZZ
2015-06-03 21:09
@wowo and linuxer
请教一个问题,怎么保存内核 coredump(gdb专用core-file),
大致思路,系统发生panic的时候,调用panic函数的同时,能否把 从coredump保存下来;供后面用gdb + vmlinux+ core-file 来恢复死机现场,调试panic debug
bear20081015
2015-06-03 23:11
@ZZ:可以在不断电的情况下重启,在uboot中把ddr内容保存到电脑上,最后用crash解析。去网上搜搜crash会有很多资料的。
ZZ
2015-06-04 22:10
@bear20081015:crash解析不出 core-file的
wowo
2015-06-05 09:03
@ZZ:kernel有专门的工具----kdump,用起来有点繁琐,你可以试试:
https://www.kernel.org/doc/Documentation/kdump/kdump.txt
如果成功了,可以发篇文章上来给大家分享一下。
ZZ
2015-06-05 22:18
@wowo:@wowo thanks ,I will try
qiyue
2015-05-21 21:13
贵站申请dmoz全球网站目录(www.dmzo.org),由于站点有部分错误;请联系编辑qiyue处理;QQ:289204338 Email:admin@qi-yue.net
Doctor
2015-05-04 16:11
一直都在看您的博文,想请教一个问题,一个混杂设备使用UART传输数据,我需要板级文件添加什么?如何向内核指明使用的是哪个UART口?

发表评论:

Copyright @ 2013-2015 蜗窝科技 All rights reserved. Powered by emlog