本帖最后由 3guoyangyang7 于 2017-8-20 22:38 编辑
先说一下背景,这几天做一个摄像头处理的qt项目,摄像头的像素是1280*720的,25fps,用qt的painter重绘widget窗体,会出现大量占cpu的情况,在刷新图片的时候整个窗体的事件响应缓慢,定时器不准,不能忍受,基本上网上的办法都尝试过,什么多线程只在主线程刷图啊,直接写frambuffer啊,都没有什么卵用。只能抓住最后的稻草,使用gpu刷图,这样cpu的占用肯定下来。所以第一步要做的就是搭建ARM环境下OPENGL ES开发环境。以下的方法不是小狂独创,是在一个大神的指导下完成,有什么不对的地方还希望大家批评指正。 给出我的开发环境的参数。 开发板:友善之臂smart4418,(这个OPENGL ES的驱动支持mail400的gpu。只要是这个的应该都适用)。 开发板系统:内核3.4.39、系统 Ubuntu 16.04 PC机系统:ubuntu16.04 交叉编译环境:arm-cortexa9-linux-gnueabihf-4.9.3 32位。 总的步骤按照大体上分为三部分,第一部分是编译mail400的内核驱动,第二部分是编译用户层的OPENGL ES的库,第三部分是测试,下面给出具体的做法。 一、内核驱动的编译
从给出的附件中,把所有内容拷贝到你相应内核目录下/driver/gpu目录下,如果有了就覆盖就行,然后就是开始编译内核,我把smart4418具体的编译步骤给出,其他开发板的见各个厂商给的编译步骤。 1、交叉编译环境的搭建
在这里默认交叉编译环境已经建好了。具体可自行百度,或者查看厂商给的手册,这个肯定会有。 2、内核的编译
因为我的内核是从git上下载的,是有分支的第一步一定要选择分支,不然有些东西没有,编译会出错
然后配置内核,先执行以下友善的配置操作,然后再更改我们自己的,我使用的是ubuntu core的系统,所以就按照友善给的手册配置
然后执行menuconfig,添加GPU驱动
如果执行这一步出错,那你是没有安装图像话的配置界面,执行以下如下指令就行
添加gpu相应的驱动 这里如果你不知道在哪可以搜索以下,在arm文件夹下有个kconfig文件就是把选项加入到菜单的,搜索一下如下的就能找到
按照如下配置
退出menuconfig,并且保存设置。 然后执行如下指令,说实话这一条我也不知道干嘛的,一般情况下,现在就可以直接编译了。既然友善给了就有他的道理我们执行一下
然后编译内核,执行如下指令
这里的j8根据电脑的性能而定,j后边的数字代表几个线程同时编译。 等待编译完成,出现图片所示的内容就证明编译的没有问题,否则就按照提示找错误
已经把uImage编译出来了,这里只需要把你原来sd或者nand或者emmc中的uimage替换就行。
这里我的是sd卡,有个小插曲,导致浪费了很多时间,就是sd卡属于块设备,块设备对存储是有优化的,就是什么电梯优化算法之类的,当你把内容拷贝到里边的时候并没有真正的拷贝,只有等你拔卡的时候才会拷贝,我当时大意了,就直接吧卡拔了导致拷贝的数据不全,启动的时候出现了错误,在这里提醒各位,拔卡前 可以执行一次sync强制同步就行了。 到这里,驱动添加完成,我们需要查看一下是否有设备节点
如果出现上图红色框内的内容,证明你驱动移植的完全正确。 二、用户层OPENGL ES的库的编译和导入
这里给出一个连接,我也是参考这个链接中的内容来的,下面所以的内容都是在开发板上做的。 1、导入ump库(在编译的时候尽量给root权限,最起码也要sudo)
首先导入需要的工具 在ubuntu系统中可以按照我边的操作做如果是其他系统,则可以参考上边的链接
然后下载libump的源文件
进入目录,准备编译
然后执行下边一系列的编译指令,前提是在ubuntu系统下
到这ump的库编完了,我们要编mali的用户驱动了 在ubuntu下安装可以执行如下指令
2、mali的用户驱动的编译
首先下载需要用到的工具
然后下载源码
3、配置
我们要首先探测以下我们的环境需要什么,使用make config会打印下边的内容主要关注红色框内的内容
然后再配置,使用如下指令 把下边红色框内的内容换成探测到的内容,就行了
等编译完成进行最后一步导入
这个时候lib文件就会导入到/usr/lib ,头文件导入到 /usr/include。 可以查看一下
证明我们的导入已经完成 三、测试 测试,我们可以用sunxi下的一个测试程序
然后执行
如果你运气足够好,你会看到你的屏幕上出现一个彩色的三角,控制台出现如下的显示,证明已经成功了。
但是你要是出现我下图的情形那就是你的系统上本身有其他的opengl的库.,你需要吧其他的库删除然后才能使用。就必须smart4418,的ubuntu就存在这个情况,需要把nexell的库删掉才能使用。
四、总结
到了这里基本上开发环境的opengl已经完成了,下边要做的就是要建立交叉编译环境使得能在pc上的qt环境中使用opengl的库。再次感谢那位大神,又学到了一个技能。 需要gpu源文件的见readme.txt
说明:NEXELL官方提供的驱动和库并不能支持HDMI,只能支持LCD,但是按照上述方法编译的驱动和库是能支持HDMI输出的,想怎么玩耍就怎么玩耍,你还在为GPU不能适用而发愁吗,赶快行动吧。
|