嵌入式Linux驱动案例之一

前几天解决一个嵌入式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; sync"

: "=m" (*addr) : "r" (val));

}

inline unsigned in_le16(const volatile u16 *addr)

{

unsigned ret;

__asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync"

: "=r" (ret) : "r" (addr), "m" (*addr));

return ret;

}

可以看出是用汇编实现的,其中有一个指令sync,表示同步操作。应该是类似于cache操作的原理,加上同步操作之后数据可以完成读和写的全部操作过程。

经过修改,问题得到解决,不需要等待也不需要在写和读的切换过程中增加其它操作。最后,整个系统比原来使用ioremap的方式在实时性上有很大的提高,而且CPU占用率大大降低。

总结:

在Linux驱动开发中,对于IO的操作应该使用内核提供的IO接口函数,最好是参照内核其它驱动的例子,平时多阅读内核代码是最好的学习方法。

嵌入式Linux驱动案例之一

时间: 2024-12-26 15:55:39

嵌入式Linux驱动案例之一的相关文章

linux驱动开发重点关注内容--摘自《嵌入式Linux驱动模板精讲与项目实践》

本文摘自本人拙著 <嵌入式Linux驱动模板精讲与项目实践> 初步看起来Linux设备驱动开发涉及内容非常多,而须要实现驱动的设备千差万别.事实上做一段时间驱动之后回首看来主要就是下面几点: (1)对驱动进行分类.先归纳为哪个类型的驱动.归类正确再利用内核提供的子系统进行开发,往往会发现事实上非常多通用的事情内核已经帮我们做了,一个优秀的驱动project师应该最大程度上利用内核的资源.内核已经实现的毕竟稳定性强.可移植性高. (2)找到内核的提供的子系统.接下来就是要制作该子系统对该类设备提

Linux开源模块移植概述暨交叉编译跨平台移植总结--摘自《嵌入式Linux驱动模板精讲与项目实践》

本文摘自<嵌入式Linux驱动模板精讲与项目实践>一书中的"开发与调试技巧". Linux的强大威力就在于有很多开源项目可以使用,通常很多需求可以通过寻找相关的开源模块做为快速解决方案.要把这些开源模块应用到嵌入式中,其中一个关键点就是要使用交叉编译工具对开源项目进行交叉编译. 根据具体情况,下载的开源项目在组织上有很多情况,在此对各种情况进行归类介绍. 1. 下载的开源软件包找不到Makefile 对于这种开源包通常是采用configure的方式组织的,那么第一步就是使用

Linux开源模块迁移概述暨交叉编译跨平台移植总结--从《嵌入式Linux驱动模板简洁和工程实践》

本文摘录<嵌入式Linux驱动模板简洁和工程实践>一本书"开发和调试技术". Linux强大的是,有那么多的开源项目可以使用.通常非常需要可以通过寻找相关的源模块被定义为高速的解决方案.使这些开源模块的嵌入.对开源项目进行交叉编译. 依据详细情况.下载的开源项目在组织上有非常多情况,在此对各种情况进行归类介绍. 1. 下载的开源软件包找不到Makefile 对于这样的开源包一般是採用configure的方式组织的,那么第一步就是使用软件包中的configure生成Makef

嵌入式Linux驱动开发实战视频教程

嵌入式Linux驱动开发实战教程(内核驱动.看门狗技术.触摸屏.视频采集系统)适合人群:高级课时数量:109课时用到技术:嵌入式 Linux涉及项目:驱动开发.看门狗技术.触摸屏.视频采集咨询qq:1840215592 课程介绍:本课程即是针对有兴趣学习嵌入式linux驱动开发又不知道从何处着实开始学习嵌入式linux驱动开发的在校同学以及社会在职人员.本课程采用理论教学与实验相结合的方式,软件与硬件相结合的方式,重点给大家讲解嵌入式linux驱动开发的方法,系统地介绍嵌入式linux驱动开发的

嵌入式linux驱动开发之给你的linux系统添加温度传感器模块

忙了几天,终于可以让ds18b20在自己的开发板的linux系统上跑了!虽然ds18b20不是什么新鲜玩意,但是想想知己可以给linux系统添加模块了还是有点小鸡冻呢! 虽然说现在硬件的资源非常丰富而且剩余很多,可以用软件资源来代替硬件资源,比如说可以用视频编解码软件取代硬件来工作.但有很多模块需要实时的采集数据这都是软件永远无法代替的,而且随着互联网的进一步发展,智能化也是一个必然的趋势,因此大量的传感器和控制芯片将被应用到生产生活中,所以个人觉得驱动开发还是个不错的方向.同时,作为学习者,再

嵌入式Linux驱动开发实战教程

嵌入式Linux驱动开发实战教程(内核驱动.看门狗技术.触摸屏.视频采集系统) http://www.ibeifeng.com/goods-475.html 咨询QQ2110053820 课程讲师:韩老师 课程分类:Linux 适合人群:高级 课时数量:109课时 更新程度:完成 用到技术:嵌入式 Linux 涉及项目:驱动开发.看门狗技术.触摸屏.视频采集 课程简介:    嵌入式软件开发无疑是当今最热门的行业,嵌入式软件工程师的薪资比普通的软件工 程师的薪资平均高50%以上.随着智能控制.物

驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的住,不然真像一些人说的,学了一年嵌入式感觉还没找到门. 不能再扯了,涉及到linux的驱动开发知识面灰常广,再扯文章就会变得灰常长.首先还是回到led驱动的本身上,自从linux被移植到arm上后,做驱动开发的硬件知识要求有所降低,很多都回归到了软件上,这是系统编程的一大特点,当然 ,也不排除有很多

嵌入式linux驱动开发之点亮led未遂(驱动编程思想之初体验)

有了上两篇文章的基础,我们就可以开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的住,不然真像一些人说的,学了一年嵌入式感觉还没找到门. 另外实践很重要,一年多以前就知道了arm,那时整天用单片机的思维去yy着arm,直到前段时间弄来一块arm板,烧上linux系统后才知道,坑呀!根本不是那回事,所以实践是学习计算机类最重要的基本素质,如果整天看书,那基本上

嵌入式Linux驱动开发之helloword心得

自从选择了物联网这个专业,智能XX的字样牵动着每一个学习这个专业的孩子. 大家兴致勃勃的来到了学校,结果一切想象和自己的设想并不一样.想象中的各种智能般梦幻的场景变成了真实的高数/电路/模电等等诸如此类!不知道这个世界什么时候变得如此的浮躁,当大家的一段时间的努力看不到结果的时候就往往会不太感兴趣,模电大家都没听懂,于是大家自我安慰tmd学这玩意到底干什么?本人当初也是这样,可是到了后来接触了单片机,接触了应用电路的设计才知道那些课程那个没用啊!当初还是too young,too simple呀