跳转至: 导航, 搜索

RK3288 Bare-metal Experiment

目录

序言

在早期的x210,x4412,x4418,x6818开发平台上,我们陆续推出了近30个丰富有趣的裸机实例,包括各种多媒体动画,趣味游戏等,深受广大嵌入式爱好者喜爱。在x3288开发平台上,应用户所托,我们在全新的四核平台上,攻克各种难关,继续推出近20个裸机实例,供大家研究学习。很多厂商推出的裸机程序过于简单,在x3288平台上,我们由简到烦,从简单的点灯,到点亮LCD,在LCD上绘图,绘动画等,复杂的程序多达几十万行,有兴趣的读者可以仔细琢磨里面的机理,势必对嵌入式的理解,对嵌入式兴趣的培养,以及对编程水平的提高,都有很大的作用,也期望我们推出的裸机开发实验,真正能对您有所帮助。


声明:本文档全部内容为九鼎创展(深圳市九鼎创展科技有限公司)原创作品,非经九鼎创展同意(书面形式),任何单位及个人不得擅自摘录本手册部分或全部,违者我们将追究其法律责任。


裸机开发环境的搭建

开发裸机有很多种方法,之前在S3C2410,S3C2440平台上,比较常用的是ADS1.2或是MDK。但是这些工具主要针对ARM9平台,对于后续的cortex-A8,cortex-A9平台,他们是心有余而力不足。在linux下开发,需要安装linux操作系统,需要熟悉makefile,交叉编译工具链等。正因为如此,我们自主搭建了强大的eclipse开发平台,制作了两套eclipse开发环境,同时支持linux64位, windows64位操作系统。有了这二套eclipse开发环境,无论您使用ubuntu64位,或是win7,window10等等,都可以开发裸机。同时,烧写程序也不再局限于linux系统,无论您使用何种操作系统,都能方便的将映像文件写到SD卡。下面就开始我们裸机开发的神奇之旅吧!

安装eclipse

第一步:确认自己的PC机开发环境。开发板逻辑教程tools中有如下两个eclipse包:

eclipse-mars-for-arm-windows-x86_64.7z
eclipse-mars-for-arm-gtk-linux-x86_64.7z

从命名方式,我们能够很清楚的差别,我们需要的开发包。这些包全部是绿色软件,无需安装,解压即可。(建议大家使用linux做开发,这个软件包已经做过一些路径和脚本的配置。)由于笔者采用win10 64位操作系统,因此选用第一个包,读者根据自己的PC机环境选择对应安装包,后续不再重复说明。

第二步:解压eclipse安装包。(解压中可能会报错,推荐使用7zip或者360压缩)

Eclipse-package.png

如果出现这样的报错,请忽略他,也可以全部选是,这个的原因是因为window下没有linux下面的软链接造成的,不影响软件的使用。

第三步:启动eclipse

在解压的安装目录下,有eclipse.bat和eclipse.exe两个文件,双击eclipse.bat即可启动(记得每次重新打开的时候都是打开这个.bat文件)。由于使用eclipse需要一些环境变量的声明,我们专程做了个脚本eclipse.bat,双击即可声明环境变量,同时启动eclipse。这样,就不用再去手动设置环境变量了。当然用户也可以手动设置好环境变量,然后通过双击eclipse.exe来运行eclipse,这里就不赘述了。

启动后界面如下:第一次启动eclipse时,会提示我们选择工作空间路径

Eclipse-first.png

这里我们直接选择源码包所在的目录为工作空间:

Eclipse-workspace.png

点击OK。进入下面这个界面就会发现全部工程已经导入

Eclipse-import.png

双击打开某个工程,比如adc。记住一定要双击之后才会出现后面的编译选项

Eclipse-adc.png

右键adc会弹出如下画面

Eclipse-adc-right.png

点击Build Project ,就会看到如下界面。

Eclipse-adc-build.png

记住console 控制台上面 make all 表示编译开始。注意右下角的18%,可以在这么观察编译的进度。在window下编译会比较慢,请耐心等候。

编译过程中的某个界面:

Eclipse-adc-build-on.png

编译完成后:

Eclipse-adc-build-finish.png

注意控制台的打印信息,同时adc文件夹下多出来一个output目录。这样编译工作就完成了。

烧写镜像:

接下来就开始来烧写镜像了。建议大家先使用我们九鼎提供的镜像看看实验效果后,再自己烧录镜像。

注意:我们提供的开发板一般都已经烧进去了程序,而3288默认会从emmc优先启动,所以你插上刚刚制作好的tf卡会出现没有反应的现象。这时:必须先破坏mmc的启动才行。

破环的命令行是:

正常开机后,进入串命令行模式下:

第一步切换到root

su

第二步命令:下面这个为1条命令。

busybox dd if=/dev/zero of=/dev/block/mmcblk0 bs=512 count=8192 seek=1 conv=sync

完成上面的过程后,插入升级卡,重启开发板,应该就可以正常升级了。升级完成后的界面应该是:

Eclipse-led-interface.png

下面读者可以自己来编译源码,然后烧录了。

编译完成后,在工程目录下会生成output目录:

Output-directory.png


图中x-ledpak.bin即是我们最终需要的映像文件。注意千万别使用x-led.bin,该文件没有和second boot打包,不能直接使用。

这里带大家看下led.map文件:

推荐大家用notepad++打开这个文件。打开之后是这样

Led-map.png

Led.map查看那个函数在哪里,这里说明了那些函数链接到了内存中。

.text 表示代码段

Led-map-text.png

.bss未初始化数据段

Led-map-bss.png

.data 已经初始化数据段

Led-map-data.png

.comment注释段

Led-map-comment.png


下载源码到SD卡

针对x3288开发板,裸机开发我们几乎都是将裸机程序直接烧写到TF卡运行。在WindowsXP或是WIN7下,可以使用我们自主编写的烧写工具x3288_Fusing_Tool.exe烧写,该软件可无缝兼容x210、x4412开发板。

注意,下载到TF卡时,首先我们需要给TF卡分区。从光盘中找到PartitionManager.exe工具并打开,界面如下:

Partitionmanager.png

上图中H盘即为我们插入的TF卡分区。我们需要使用这个工具给TF卡预留一些空间,用于存放bootloader或裸机程序。首先我们右键点击最下面图标的可移动磁盘(H:),点击删除分区,如下图:

Partitionmanager1.png

软件会弹出确认界面:

Partitionmanager2.png

勾上下次不再询问,点击是,即删除了原来的分区。这时,TF卡就只剩一个分区了。再次右键点击该分区,点击创建分区:

Partitionmanager3.png

在请指定分区前面的自由空间大小一栏中填入我们需要预留的空间,我们这里填100M,留给bootloader或裸机已经足够用了。在请为新分区选择文件系统中选择FAT32,点击是,然后再到主界面快捷菜单栏点击应用即可。成功分区后提示如下:

Partitionmanager4.png

至此,分区成功。用户也可以在ubuntu下使用gparted工具分区。

双击x3288_Fusing_Tool.exe,将不小于2GB的TF卡通过读卡器插到PC机(注意市面上很多山寨的读卡器,推荐大家用正品行货,如飚王的读卡器,使用山寨读卡器不保证能正常将映像烧写到TF卡),这时烧写软件会自动识别出TF卡,如下图:

Fusing-tool.png

点击Browse,找到我们刚生成的x3288-led.bin文件,点击Add,映像会添加到下面的路径中,这样下次如果不更改路径,就不用再指定路径了。

Fusing-tool1.png

点击START,开始烧写。烧写完成后,会有如下提示:

Fusing-tool2.png

点击确定即可。


在linux下,方法类似。笔者使用的是ubuntu64位14.04系统,安装好对应版本的eclipse后,导入源代码,在linux平台下编译,不需要修改tools中的文件,编译好之后会产生4个文件。


Ubuntu下制作启动卡:

第一步:准备一张不小于2GB的TF卡,并插入装有ubuntu操作系统的PC机上;

第二步:删除TF卡的所有分区;在linux的终端窗口,使用fdisk/dev/sdb命令删除原来所有分区,sdb为系统为TF卡分配的设备节点。注意,具体由节点名称而定,有可能是sdc,sde等。使用如下指定查询设备节点:

cat/proc/partitions

实例如下:

Cat-partitions.png

输入d,表示删除分区,输入w 表示保存已经修改的分区信息。至此,原/dev/sdb1

被删除。拨掉TF 卡,再插入PC 机上。


注意:必须拨掉后再插入,否则仍然会提示存在/dev/sdb1 节点,会造成出错。第三步:使用gparted 工具给TF 卡预留256M 空间,用于存放uboot 映像。使用如下命令打开TF 卡分区表:

Gparted.png

选择分区->新建,预留256M 空间给uboot,剩下的分区使用fat32 格式,如下图所示:

Aparted1.png

点击添加,选择菜单中的应用全部操作,完成TF 卡的分区。

第四步:将TF 卡剩余的空间格式化为fat32 格式sudo mkfs.vfat /dev/sdb1

第五步:进入映像生成目录,即output目录,执行如下指令烧写uboot 到TF 卡:

cd output
sudo /home/lixu/eclipse/X3288-NO-OS/x-beep/tools/linux/s5p3288-sdmmc.sh  /dev/sdb  x-beeppak.bin

注意这里是笔者的路径,你们的路径参照这个填写。

注意,这里/dev/sdb 为TF 卡的节点,该节点为linux 系统自动分配,也有可能为sdc,sde等,用户可查询节点名称后再执行上面的烧写脚步。

设置开发板启动顺序

x3288开发板默认首先从EMMC通道启动,如果开发板已经烧写了映像,则必须破坏掉默认的EMMC启动,下面将会有具体的实现方法。

通过TF卡运行裸机程序

将烧有裸机程序的TF卡插到x3288开发板右侧的TF卡槽,给开发板上电,无需按任何按键,八盏LED灯已经在来回闪烁了(注意我们的3288硬件上面没有提供这样的led,我们是通过软件实现的)。

X3288裸机实例

X3288裸机实例1-LED流水灯实验

X3288硬件不包含led,我们通过软件实现的。我们直接进去下一个实验。

原理图

源码

实验现象

黄色的灯不停的闪烁。按下reconver按钮,进入命令行模式,可以查看一下设备的打印信息等等。

Eclipse-led-interface.png

X3288裸机实例2-蜂鸣器实验

原理图

Beep-schematic.png

上述电路通过一个NPN的三级管控制蜂鸣器的停止与蜂鸣。

GPIO状态

蜂鸣器状态

GPIO7_A3_D = 0

停止

GPIO7_A3_D = 1

蜂鸣

  1. 源码

Beep-soure.png

这里的三个文件,其中buzzer.c的框架,我们的开发板上面使用的是buzzer-gpio.c驱动,没有使用buzzer-pwm.c驱动。

下面来给大家讲解这个驱动。注意这次3288开发板提供的裸机实验代码量巨大,接近20个实验的代码结构都是一致的,所以我们只讲解一个驱动的源代码,带领大家怎么分析,里面具体算法怎么实现的等等内容我们不会做详细的探讨。由于代码量巨大,我们从大的结构先开始,第一条线:start.S ->main.c 这一个流程在上面已经给大家描述过了。

第二条线:这个是重点关于设备是如何创建的,也是裸机教程的重点,流程:

初始化全局变量,注册machine设备,注册各种核心组件,注册各种驱动,探测具体machine以便加载同名的json设备树,依据设备树,创建设备。

第三条线:就是具体的调用过程。

这里需要重点说明的是:第一种:驱动在arch/arm32/mach-x3288/driver里面存在,第二种:在driver里面存在,其中第二里面的驱动是3288特有的驱动,也就是只支持3288这一个芯片的驱动,而第二种里面的驱动是一些共用的驱动,不仅支持3288,也支持比如4418,6818等。而在本教程中裸机使用所用到的驱动在x3288.json中来看选择的是哪一个。

比如我们要看蜂鸣器用的是哪一个驱动,首先看

http://x.9tripod.com/wiki/zh/index.php/File:Beep-soure1.png

看到这么目录下有3个文件,到底用的是哪一个呢?打开x3288.json,用搜索功能搜buzzer,

如图

Beep-soure2.png

可以看到使用的是buzzer-gpio.c这个驱动,记住@后面是地址,现在不用去管他。打开buzzer-gpio.c文件,看到.name = buzzer_gpio就知道的确是调用的这个驱动。

Beep-soure3.png

可以明显看出驱动的名字就是这个

Beep-soure4.png

因此全部的设备数都是由x3288.json来控制的。注意x3288.json中前814行都是关于时钟的设备数,后面是关于各个驱动的设备数。

实验现象

将TF卡插到x3288开发板的SD卡槽,上电开机,可以听到每隔约500ms,蜂鸣器会鸣叫一次。

X3288裸机实例3-adc模数转换实验

原理图

Adc-schematic.png

默认开发板上存在reset,recover,power键,在每一个实验中,起的作用不同,读者自己尝试下应该就明白了。一般作用分别为重启,切换到命令行模式,电源键等,个别会又不同。

源码

Adc-source.png

由x3288.json来判断知道这个是adc驱动的目录,从这里可以很清晰的看到adc是如何创建和调用的。

Adc-source1.png

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,上电开机,可以看到显示屏有如下现象:

发现adc采样值和电压一直在变化。

Adc-test-new.png

X3288裸机实例4-analog-clock模拟时钟实验

原理图

源码

时钟驱动十分复杂,驱动涉及很多,这里不做详细描述,读者可以自行研究,遇到问题可以发到论坛。

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,上电开机:

现象:从12点开始,时钟的秒针开始转动。

Analog-clock-test.png

X3288裸机实例5-backlight背光测试实验源码原理图

源码

原理图

Backlight-schematic.png

实验现象

将TF卡插到x3288开发板的TF卡槽,上电开机,

红色条目上面的圆圈自动的左右滑动,可以看到屏幕亮度不断变化。

Backlight-test-new.png

X3288裸机实例6-color颜色测试实验

源码路径:

实验现象

将TF卡插到x3288开发板的TF卡槽,上电开机:

红黄绿上面的圆圈在不断的跳动,同时右边的方形里面的颜色在不停的变换。

Color-test-new.png

X3288裸机实例7-irrmote红外遥控测试实验

源码

原理图

Irrmote-schematic.png

实验现象

将TF卡插到x3288开发板的TF卡槽,上电开机

按任意按键,上面会出现不同的数字。

Irrmote-test.png

X3288裸机实例8-lcdscreen液晶屏测试实验

源码

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,

上电开机,显示屏会出现如下信息:

点击屏幕,颜色会不断的变化,从红、绿、蓝、红绿蓝、白、黑这样的顺序出现。

Lcdscreen-test.png

X3288裸机实例9-morsecode摩斯电码测试实验

源码

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,上电开机

点击开始测试,会出现蜂鸣声,有规律的响,这个就是在发送摩斯密码。

Morsecode-test.png

X3288裸机实例10-rc5t620电源管理芯片实验

源码

原理图

Rc5t620-schematic.png

Rc5t620-schematic2.png

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,开机。

出现一系列的的参数比如:DC1:3.30000V 当初:2.00000V等。

Rc5t620-test.png

X3288裸机实例11-reboot重启测试实验

源码

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,上电开机

点击重启,画面变暗,上半部分为黑色,,下半部分变为灰色。

Reboot-test.png

X3288裸机实例12-rtc实时时钟实验

源码

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,上电开机

显示的时间或许会和下图的时间不一样,但是可以看到时间以秒为单位在不断变化。

Rtc-test.png

X3288裸机实例13-rtttl诺基亚铃声播放器实验

源码

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,上电开机

接喇叭请注意看下图:

Pickup-horn.png

接上喇叭后,点击开始测试,会有音乐自动开始播放。

Rtttl-test.png


X3288裸机实例14-syr82x同步降压开关稳压器实验

源码

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,上电开机

会出现如下的图片,显示了2个参数。

Syr82x-test.png


X3288裸机实例15-taichi太极八卦图实验

源码

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,开机。

看到太极八卦图在不同的旋转。

Taichi-test.png

X3288裸机实例16-touchscreen触摸实验

源码

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,上电开机

看到色白色的画面,直接在上面画线,可以测试触摸屏。

Touchscreen-test-new.png

X3288裸机实例17-watchdog看门狗实验

源码

实验现象

将TF卡插到x3288开发板的右侧TF卡槽,上电开机

首先会响一声,上面的时间会由10s开始倒数,等变成0秒就开始重启,点击喂狗可以刷新时间为10秒。

Watchdog-test-new.png