过去的大半年时间,一直带着学生备战全国职业院校技能大赛“嵌入式系统应用开发”赛项。由于是首次参加该赛项,很多东西都是从0到1的摸索和积累,最后的成绩自然也不甚理想。作为指导教师,备赛期间除了给予学生必要的指导,自己也花了不少精力研究了大赛指定的龙芯1B200嵌入式开发板,并尝试使用RT-Thread操作系统和LVGL图形组件,实现了样题的几十项任务,大大小小的版本也写了30多个,也算磕出点名堂了,见图1~图3。
本着分享和开源精神,也为了给以后的参赛学生循序渐进的指导,于是就有了这个实战笔记系列。希望自己摸索的过程能给更多的嵌入式学习者一些指引,也为国产嵌入式处理器和国产嵌入式操作系统的推广助一点力。
由于个人能力和精力的限制,再加上龙芯嵌入式的开发资料十分有限,很多问题没法像STM32那样深入到库文件和寄存器的程度,还希望有见解的网友在这些问题上能给与点评和分享。最后,我想说的是,这个实战笔记不是面向0基础的朋友,起码得有龙芯嵌入式裸机的开发经验,了解RT-Thread操作系统的线程、定时器、信号量、邮箱等相关知识,知道LVGL图形用户界面开发的基本套路。
好了,开场白说完了,本文是实战笔记的第一篇,我们把最基本的文件和代码添加到工程项目中,形成一个最原始的工程项目。
一、关于IDE和工具链的版本
如图4和图5所示,本人使用的IDE版本是目前官网(http://www.loongide.com)最新的1.2 beta3,工具链用的是GCC 4.9.2 for MIPS ELF,并选择了-O1级别的编译优化(这样运行的UI效果明显比不优化的要流畅的多)。至于低版本的IDE或其他工具链,学生在调试的时候多少会有点莫名其妙的问题,所以建议网友们尽量使用与笔者一致的版本,避免除代码之外的软件问题。
二、创建最初的项目
这一步没啥技术含量,按照新建项目的向导,一步步选择最匹配和最需要的即可,这里把向导的每一步进行了截图(图6~图9),大家跟着选就行了。
三、触摸屏驱动的移植和配置
由于后续所有任务的交互都是依赖触摸屏来完成,因此移植触摸屏的驱动就成了当务之急。而且,移植不是简单的把驱动文件加进工程,还要与LVGL输入和输出设备的相关代码结合起来。下面就是我个人摸索的移植过程,供各位借鉴和参考。
3.1 准备横版屏幕的触摸输入驱动文件
其实,上面刚创建好的工程已经包含了屏幕的显示输出驱动文件 ls1x_fb.c 和 ls1x_fb.h(所在目录如图10所示),以及触摸输入驱动文件 gt1151.c 和 gt1151.h(所在目录如图11所示)。但这里有个很纠结的问题就是,前者的显示输出驱动文件是针对横版屏幕(800×480)编写的,而后者的触摸输入驱动文件是针对竖版屏幕(480×800)编写的。因此,必须想办法让两者对屏幕采取一致的驱动方式。
好在龙芯官方已经写好了针对横版的触摸输入驱动文件 gt1151q.c 和 gt1151q.h,放在了开发板的配套例程 10_LCD_touch 中(如图12所示),那接下来我们就用这两个文件去替换工程里原有的 gt1151.c 和 gt1151.h。
3.2 替换竖版的触摸输入驱动文件
这一步也很简单,把工程里原有的触摸输入驱动文件删除,拷入新的文件,并将其添加进当前工程即可,如图13~图15所示。
3.3 补充头文件路径
这一点跟 Keil 一个套路,必须把所有头文件所在的路径都添加进来,按照当前的工程目录,图16所示的几个路径是需要手动添加的,如果你自己还规划了其他目录放头文件,也请一并加进来。
3.4 修改LVGL的输入设备驱动文件
我们心里要清楚,所有的GUI效果都是通过LVGL的图形化组件来实现的,无论是显示输出还是触摸输入,就必须让LVGL知道该调用哪个对应的设备驱动。在这里,显示输出应该调用 ls1x_fb.c 驱动文件,打开LVGL显示输出的驱动文件
./lvgl-7.0.1/porting/lv_port_disp.c(如图17所示),可以看到该文件引用的正是所需的硬件驱动文件,因此 lv_port_disp.c 文件不必修改。
再来看LVGL输入的驱动文件
./lvgl-7.0.1/porting/lv_port_indev.c(如图18所示),很明显并没有调用所需的 gt1151q.c 触摸输入驱动,因此要对 lv_port_indev.c 文件进行必要的修改才行。一共有6处需要修改,如图19~图24所示。为了清晰展示修改前后的代码差异,这里使用了 Notepad++ 编辑器中的 Compare 插件来对比,怎么样,挺好用的把^_^
四、修改龙芯开发板的板级支持(BSP)文件
配置龙芯开发板BSP的文件有两个:一个是 ./include/bsp.h 文件,如图25所示,这个文件里的很多宏需要根据实际情况进行配置,后续时常要与之打交道;另一个是
./ls1x-drv/ls1x_drv_init.c 文件,如图26所示,这个文件修改的地方不多。
4.1 修改 bsp.h 文件
当前对该文件的修改一共有两处,如图27和图28所示,跟之前一样,还是把修改前后的差异对比着看。这两处修改针对的是触摸屏驱动芯片GT1151,以及所占用的I2C0总线。
4.2 修改 ls1x_drv_init.c 文件
这个文件目前只有2处需要修改,如图29和图30所示,换成横屏对应的驱动文件和初始化函数即可。
五、修改LVGL的全局配置
./lvgl-7.0.1/lv_conf.h 是LVGL的全局配置文件,如图31所示。这里,我们针对屏幕分辨率、字体大小、中文支持等进行了修改,如图32~图36所示。
六、编译和测试
本文的主要目的是搞定与移植有关的配置,并不打算编写实质性的代码。通过上面的步骤,移植工作几乎全部完成,接下来就可以直接编译整个工程来进行检验了。这里就不贴main.c的源码了,除了修改一下显示模式,如图37所示,其他源码都保留不变。由于工程文件较多,第一次编译耗费的时间会比较长。
编译没错的话就可以运行或下载本程序了,效果上就是一个线程在运行,每0.5s通过串口打印一下运行时间,如图38所示。至于GUI效果,默认的源码里并没有添加,所以屏幕上什么也没有,我们在下一版来添加。
至此,移植的工作就算告一段落了,虽然工作量不大,但网上并没有针对龙芯的移植教程,几乎都是针对STM32的,移植的大多也是LVGL8,所以上面的移植经验也是反复折腾总结出来的。大家在移植的时候有什么问题,欢迎在评论区留言。后续我们就可以在此基础上添加一个个我们想要的效果了。
(本文完)