一:前言
以前申请到了荔枝派zero,在发了两个开箱贴后就放在一边吃灰了。后来又购买了荔枝派nano,刷了几个教程中的系统之后又放到一边吃灰了。虽然有屯板子的习惯,却没有使用板子的能力。
后来,经过断断续续的摸索和群里面的新手教程,终于搭建好了Licheepi Nano的交叉编译环境,自己GCC了一个hellowworld传输到了开发板并运行了起来。可是......对,于是又继续吃灰。
再后来,在大神 @晕哥 的 填坑网 (https://debugdump.com/index.html)看到了 另一个大神@达克罗德 的几篇帖子 ,竟是生生的写出了Licheepi nano的裸机代码!此代码包含了GPIO、timer、定时器、I2C、SPI等基本操作,最关键的是,它直接支持了对屏幕的操作,并剥离出了显示驱动,非常方便使用。 于是怀着敬畏的心情,将大神放出的源代码下载了下来,并经过一番摸索实现了裸机的操作和程序的下载。在此基础上,移植了ZLG_GUI和3D旋转立方体的演示程序,由于我以前移植过很多遍,所以很方便就移植好了。大神的源地址:F1C100S裸奔framebuffer+PWM+GPIO驱动
为了总结使用过程和方便比我还小点的小白们,特写了此篇文章,从编译环境的搭建到程序的修改和下载运行等的全教程。
然后,还是要感谢填坑网,感谢达克罗德大神,也感谢荔枝派的创造者@泽畔无材 和其他创造者和贡献者,他们的工作和贡献让世界变得更加美好(好大的概括)。本教程中的代码除个人创造部分,全部来源于网络,移植于网络,最终,也将免费贡献于网络(如果有侵权行为,请告诉我,我会尽快删除)。但是,辛苦不能白费。所以,如果你有幸看到了本文,并且使用了本文内容或转载了本文,请注明出处和保留作者,然后你就可以大方的使用了。谢谢。
好了,正文开始。
二:简介
Licheepi Nano 是荔枝派推出的一款超高性价比的跨界开发板,支持linux、RTT、裸机等开发环境。
淘宝网:Licheepi Nano
荔枝派社区:http://bbs.lichee.pro/
其他资料在 荔枝派社区 中基本都能找到地址。
当然,你也可以在填坑网看大神的填坑历程:https://debugdump.com/t_1623.html
注意:当ubuntu中打开win传过去的文件中存在乱码时,请在win环境下用记事本打开 .c 或.h文件,点击文件->另存为,将下方的 编码 选择为UTF-8 的格式,点击保存并选择是进行覆盖保存,再传入ubuntu就不会乱码了。
三:开始
最基本的要求是:一个带LCD屏的荔枝派,一根USB数据线,一台电脑。选配:TTL串口转接线。
本文使用VMware+ubuntu16.04的环境。
另外,本帖已经与百度达成深度合作,任何本文未提到但你又不懂的都可以去请教他,绝对知无不言。
1:下载代码和编译器
在F1C100S裸奔framebuffer+PWM+GPIO驱动 帖中下载 minimal_f1c100s_framebuffer.zip 和后来更新的一个.c文件。当然,这个帖子中还有其他方面的改动,可以详细看看。
然后,同样是此帖子,下载大神提供的编译器:http://pan.baidu.com/s/1dDtssIt ,或是后面有坑友提供的连接:
https://releases.linaro.org/components/toolchain/binaries/5.3-2016.05/arm-eabi/
选择与电脑相匹配的下载。我的是64位的,就下载了后面那个链接的。
至于周立功的GUIZLG_GUI和3D显示相关的代码,可以在我的另一篇博客园的文章中找到并下载下来,我很早以前就移植并发在网上了(怀念当年在学校中啃3D显示代码的时光......),或是下载最后的完整代码。
将两个压缩包和编译器通过 VMware的 共享文件夹 都放入到ubuntu环境下,或是直接在ubuntu环境中下载。
2:环境搭建
在荔枝派的开源交流群(826307240)中有一篇《基于荔枝派Nano的Linux新手学习笔记》,将它打开,一步一步的操作。当然,如果只是想实现本帖内容的话,只需要按上面实现:虚拟机的搭建、sunxi-tool的安装 这两个教程就可以了。而且它里面的交叉编译链在编译自己的.c文件时不管用,生成的文件下载到开发板不能运行,需要重新安装:
sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
然后使用arm-linux-gnueabi-gcc xx.c -o xx 进行编译,将刚编译完的文件复制到共享文件夹,串口软件(如SecureCRT或新手文档中提到的软件)连接后输入 lrz 命令进行文件传输。在开发板的串口中输入chmod 777 xx(刚传进来的可执行文件) 来进行赋权限,然后就可 ./xx 执行了。当然,这个需要TF卡刷群文件中 Nano_pub_V2/image 文件夹下的 .dd镜像。至于TF的烧写方法在荔枝派社区有。好了,这些都是题外话。以后再写一个linux的教程,会详细提到这些。
sunxi-tool 工具的安装 摘录如下:
1)用git clone -b f1c100s-spiflash https://github.com/Icenowy/sunxi-tools.git命令下载,用cd sunxi-tools命令切换到sunxi-tools文件目录
2)用sudo apt-get install libusb-1.0-0-dev命令安装libusb,用sudo su命令切换root 用户,用apt-get install zlib1g-dev命令安装zlib1g
3)用make && sudo make install命令适配 Nano 的下载工具,通过命令 sudo sunxi-fel ver 来确认有无成功进入fel模式
4)报ERROR: Allwinner USB FEL device not found!,重新烧录或重进fel模式,先拉低SPI flash的CS引脚1,再将MicoUSB与电脑连接,在Windows下运行 zadig-2.3.exe,点击 Options -> List All Devices,选择 WinUSB (v6.1.7600.16385),点击 【Install WCID Driver】安装驱动(教程https://debugdump.com/t_993.html)
5)右击我的电脑选择管理->服务和应用程序->服务,在弹出的对话框找到VMware USB Arbitration Service 右击选择启动设置为自动启动,在虚拟机中的可移动设备中选择连接该板(教程https://blog.csdn.net/u013064187/article/details/41894021)
6)用sudo sunxi-fel ver命令测试成功进入fel模式,断开SPI flash的CS引脚1与GND的连接,用cd u-boot命令切换到u-boot文件目录,用sudo su命令切换root 用户,用sunxi-fel -p spiflash-write 0 ./u-boot-sunxi-with-spl.bin命令下载程序
7)断电连接LCD和串口E0、E1,上电查看LCD显示,打开Xshell 5软件选择连接->SERIAL,设置波特率115200,连接后发送bdinfo,查看接收信息
”
3:编译测试
将三个文件夹分别解压到合适的目录下。我的放在Download文件夹下。然后将fb-fc100s.c复制替换到minimal_f1c100s_framebuffer\minimal_f1c100s\driver 文件夹下。至于为什么,你仔细看一遍帖子就知道了。
将解压的编译器 gcc-linaro-5.3.1-2016.05-x86_64_arm-eabi 放到/opt文件夹下(不放也可以,但后边的路径自己要改一下)。然后你有两种选择,一是参考《基于荔枝派Nano的Linux新手学习笔记》中安装交叉编译链 的步骤,将其中的编译链替换成自己刚刚解压的这个,其他照做。或是使用临时的方法,每次使用前都要执行一次的(我用的就是这个方法):
终端中输入 sudo su ,然后输入密码进入root模式,然后输入 export PATH=$PATH:/opt/gcc-linaro-5.3.1-2016.05-x86_64_arm-eabi/bin (注意替换为自己下载的编译链的名字和放置的实际地址),既将编译链临时加入到路径中。关闭终端后再开启需要重新输入。
终端中cd 到minimal_f1c100s_framebuffer\minimal_f1c100s 文件夹下,然后输入 make ,回车开始编译。当提示什么错误时,你需要再看看交叉编译环境的搭建部分。
无误后,会提示 bootloader size =1800等, 并且当前文件夹目录下多出一个build文件夹。cd build 到build文件夹下,按照新手学习笔记中的方式进行程序下载:
先将flash的1脚拉低,然后插入usb供电,进入fel下载模式,以后每次下载程序都要这样。此时VMware的 虚拟机->可移动设备 中会多出 onda WINusb Generic Device 的选项,点击连接。然后断开flash的拉低。
输入 sunxi-fel -p spiflash-write 0 ./firmware.bin 进行下载。成功后断电重新供电,可以看到屏幕亮了。说明测试成功。
4:移植ZLG_GUI
ZLG_GUI是周立功公司提供的一套适用于单片机液晶屏的点阵式GUI,功能丰富,硬件要求低,移植及其简单。
将ZLG_GUI文件夹复制到minimal_f1c100s 文件夹下。
首先,要进行规范性修改。将下面所有的.h文件和.c文件的.H .C统一改写成小写的。另外,在.c文件中将包含的 #include<xxx.h>中统一改写成和文件名大小写一致的内容,否则编译报错。
对于这个GUI,只要实现 lcmdrv.c中的几个基本的初始化、画点、清屏三个函数就够了。可以直接在此处修改,也可以新建一个Mycommon.c和Mycommon.h来实现。代码如下:
1 #include <stdint.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <malloc.h> 5 #include <dma.h> 6 #include <framebuffer.h> 7 8 #include <types.h> 9 #include <common.h> 10 11 12 framebuffer_t fb_f1c100s; 13 render_t* render; 14 15 /*初始化屏幕*/ 16 void Screen_Init(void){ 17 fb_f1c100s_init(&fb_f1c100s); 18 render = fb_f1c100s_create(&fb_f1c100s); 19 } 20 /*画点函数*/ 21 void Set_Point(int x,int y,uint32_t color){ 22 ((uint32_t*)render->pixels)[x+y*800] = color; 23 } 24 void Fill_Screen(uint32_t color){ //屏幕填充函数 25 for (int i = 0; i < render->pixlen/4;i++) 26 { 27 ((uint32_t*)render->pixels)[i] =color; 28 } 29 } 30 /*点色获取*/ 31 uint32_t Get_Point(int x ,int y){ 32 return ((uint32_t*)render->pixels)[x+y*800]; 33 } 34 /*将缓冲buf刷到屏幕上显示*/ 35 void Show_Screen(void){ 36 fb_f1c100s_present(&fb_f1c100s, render); 37 } 38 void Screen_Setbl(void){//背光 39 fb_f1c100s_setbl(&fb_f1c100s, 100); 40 }
都是原来main.c中的函数。
-----------------------------------------2019-10-26 补充-------------------------------------------------
上面的 800是指屏幕的宽度为800(用的屏幕的分辨率为800x480的),若是该屏幕分辨率可以更改此值。也可以自行提取为宏定义(在挖坑网中看到有人这么建议的)。
----------------------------------------------------------------------------------------------------------------
在lcmdrv.c中包含进Mycommon.h,并将上面的代码分别移植到lcmdrv.c下对应的函数下。
main.c中加入 #include <config.h>,这个是调用ZLG_GUI唯一需要包含的头文件。
main函数中注释掉不必要的函数,在while 前加入新移植的初始化函数,加入屏幕填充函数,划线函数,显示函数:
GUI_Initialize();
GUI_FillSCR(0x00FFFFFFU);
GUI_Line(0,0,800,480,0xF000FF00);
GUI_Exec();
Screen_Setbl();
r然后编辑Makefile文件:在SRC_C部分加入
SRC_C +=\
ZLG_GUI/ConvertColor.c \
ZLG_GUI/font5_7.c \
ZLG_GUI/FONT8_8.c \
ZLG_GUI/FONT24_32.c \
ZLG_GUI/GUI_BASIC.c \
ZLG_GUI/GUI_StockC.c \
ZLG_GUI/lcmdrv.c \
ZLG_GUI/loadbit.c \
ZLG_GUI/menu.c \
#ZLG_GUI/spline.c \ #此处有 math.h 中函数找不到的报错,先注释掉,后面进行解决
ZLG_GUI/windows.c \
INCDIRS下面加入: INCDIRS += -I3Ddisplay -Ilib
保存。然后终端输入 cd .. 回到minimal_f1c100s文件夹,make 开始编译。若还有错误,请按照提示进行解决。无误后,cd build ,并再次拉低flash进行下载。重新上电后可以看到一条斜线,说明移植ZLG_GUI 成功。
5:移植3D立方体程序
我以前花时间整理好了,移植起来也很快,实现了画点函数基本上就能直接用了。所以包含进 config.h就可以了。同时要修改Makefile,将.c文件和.和文件夹都写进去。但是编译后会发现,cos等函数找不到。所以在 Makefile 文件中的 -lgcc 后面加上 -lm来链接静态库。可是此时又蹦出来很多的错误。一番搜索下,意思是裸机没有除法造成的(当然,本来来的函数中就有个除法,既然能用,说明是别的问题)。自从与百度达成深度合作后,事情方便了很多,于是一番搜索加实验。反正各种处理后的结果是,没处理好。好吧,此路不通。只好换个方法。
自己建一个Mymath.c,从网上找到纯c编写的三角函数等的实现方法,复制,去掉空白字符(可能会有此类的报错,只要一个一个删除掉上面的空白处就好了),将需要math库的地方加进头文件。编译。成功!以后再慢慢的修改实现标准math库的移植。
好了,main函数中加入3D显示程序,立方体就旋转起来了。(额......由于gif图片的压缩,看起来变得好难看......其实实际显示还是很不错的。)
四:最后
大神的裸机开发包还包含了其他操作,而且貌似大神都移植好了NES,不过没放出源码,以后我得自己移植。可悲的是,人家都能写出来,咱都不会用......此处只做抛转,希望板子不要再吃灰了。
我想画一个一荔枝派Nano为基础的掌机,或是一个拓展中心,左右能插掌机键盘,下面能插全键盘或数字键盘,就是一个拓展中心的那种。然后开发能够以linux、RTT、裸机等开发,或是本身为带python的linux或是拓展屏幕的Micropython,能够插上全键盘后直接脱机写程序的(类似C.H.I.P)。外壳都是3D打印。这么一想,人生苦短,要学的东西还真多啊!
好了,全部代码如下:https://files.cnblogs.com/files/zhinianzhizhan/minimal_f1c100s_framebuffer.rar
---------------------------------------------------------------------------------------分割线-----------------------------------------------------------------------------------------------------------
后来大神@晕哥 下载体验了本demo,说有整数类型定义错误,不过我前面编译时没发现。所以若是有同学也出现这个问题并且不会解决的话,可以下载他编译过的试试:https://files.cnblogs.com/files/zhinianzhizhan/minimal_f1c100s_fb_zlggui.rar 。在此感谢 @晕哥 的修改。
我会再补一些3D方面的显示,并且尽量使用之前实现了的函数。如果有感兴趣的,可以私信我,我们一起探讨。
--------------------------------------2019-10-26补充-----------------------------------------------------------------------
我后来用Python实现了 文字旋转时钟 ,其实就是套用的这个C语言版本的旋转立方体的代码。等我有空了(额.....没准......)再移植为C语言的再跑一跑。
作者:执念执战
QQ:572314251
微信:聊技术还是用QQ吧
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------2020-4-30补充--------------------------------------------------------------------------------------------------------
好几个人问我要过文中那个文档了。这个是群里面不知谁写的,当年的群貌似已经解散了。。。。。反正群里没那个东西了。
这个不是我写得到,我也找不到是谁写的了。若有原作者可以联系我我备注上。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
本文水平有限,内容很多词语由于知识水平问题不严谨或很离谱,但主要作为记录作用,能理解就好了,希望以后的自己和路过的大神对必要的错误提出批评与指点,对可笑的错误不要嘲笑,指出来我会改正的。 -------------随梦,随心,随愿,执念执战,执战苍天!