嵌入式Linux驱动案例之一

本文记录了一个嵌入式Linux驱动案例,原始方法使用ioremap访问LocalBus上的DSP,但在高性能需求下存在延迟问题。通过对内核IO接口函数的深入理解和应用,尤其是使用内联汇编的out和in系列函数,解决了写地址后的等待和读取Ready寄存器的问题,显著提升了实时性和CPU利用率。
摘要由CSDN通过智能技术生成


前几天解决一个嵌入式Linux驱动问题,做为一个案例进行记录。


   本案例是一个CPU通过LocalBus总线访问外围一个设备,具体设备是一个DSP器件,在实际应用中,性能要求很高,对数据访问速度提出比较高的要求。既然是通过LocalBus总线来访问,实际上也就是在CPU的IO寻址空间。原来的做法是通过ioremap的方式将这个空间进行重映射,然后CPU对其进行读写访问。读取DSP的一个数据需要经过写地址,读数据两个步骤。


   现象描述:

        发现无论如何,在写完地址之后一定要等待一段时间,或者一定要先读取一下DSP的Ready寄存器。这个操作在大数据处理时消耗相当可观,而实际应用上对性能要求很高,这个等待或者读取Ready寄存器的动作必须清除。


原因分析:

      本系统中采用的CPU是Powerpc,对LocalBus进行读写操作,那么读和写操作两个之间进行切换是有一个过程的,先写后读,转换太快可能写会不成功,问题的根本是驱动中采用的是ioremap之后的操作方式。


解决方法:

    改变ioremap的方式,使用Linux 内核中对IO的操作接口out和in的方式。调用函数为in_be16和out_le16。定义如下:


inline void out_8(volatile unsigned char *addr, int val)
{
__asm__ __volatile__("stb%U0%X0 %1,%0; s

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值