注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

火车的家

Put first thing first

 
 
 

日志

 
 

2011.07.20 蓝牙 uart (四)  

2011-07-20 15:36:44|  分类: linux kernel |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
接前文: link

Alex 最终用 apb dma 完美地解决了这个问题,佩服!基本思路是:用 apb dma 收发 bt uart 数据包,再用一个timer把apb dma buffer 刷到 kernel 的 serial core 里去。另外,对于接收数据,当 apb dma buffer 被填满的时候要关闭 RTS,待到 apb dma buffer 里的数据被刷到 serial core 之后再打开 RTS。 这个方法虽然很好,但是有个缺点,就是要占用两个apb dma channel,一个用来读,另一个用来写(不可能用一个 channel 实现,会冲突的)。

其他:
1. 问:如果rx fifo的触发值永远达不到会怎么样?是不是就不能触发中断?比如,rx fifo的触发level设为16字节,如果只来了12个字节数据并且以后就没数据了,是不是就没法触发中断?假如没法触发中断的话,会不会造成丢数据?
答:是有可能。但是,uart 还有一个 timeout 中断,如果出现了前文的情况,就会触发这个中断,从而可以读取 fifo 的数据。

2. 问:apb dma 须指定要 dma 多少数据,但有时这是不可能的。比如,对于接收 bt uart 数据,不可能预知将要接收多少数据,这时就没法填这个参数,怎么办?
答:可以传给 apb dma 一个 buffer size(这个值比较大),然后开一个 timer,再在 timer 里每隔一段时间就把当前已经 dma 到的数据刷到 serial core 里去,就能解决这个问题。但是怎么知道当前 dma 了多少数据呢?可以保留上次 dma 的地址,然后用本次 dma 的地址(apb 有这个寄存器接口),减去这个地址就行。

3. apb dma 机制。apb dma 可以对 uart 或者 sd 卡等慢速设备做 dma,这样可以减轻 cpu 的 loading,并且在 cpu loading 高的时候可以避免低速设备丢数据(overrun error)。另外,像 uart 或者 sd 卡之类的慢速设备可以有中断和 apb dma 两种取数据的方式。apb dma的方式为首选,这种做法的好处如前文。
  评论这张
 
阅读(544)| 评论(1)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018