本文档是全志 Melis2.0 系统的开发指引文档,旨在协助开发者了解和掌握 Melis 系统,快速搭建 Melis系统的开发环境,将 Melis2.0 系统应用到产品开发中。
Melis2.0 系统是基于全志芯片平台自主研发的一套软件系统,其内容涵盖 SDK 代码包、资源制作工具组、编译链接脚本、固件打包烧录工具套件、调试工具 5 个部分,本文档将在后续章节向开发者逐一进行
介绍。
图1:
Melis2.0 发布版本的 SDK 目录结构如下【图 2】所示,下面按照源码文件夹、打包文件夹、临时库文
件夹、工具文件夹的顺序介绍各文件夹的功能,使开发者对 Melis2.0 SDK 的目录结构有一个初步印象。
图2:
【eBSP】板级支持包文件夹,该文件夹存放的是 spi、uart、sdio 等驱动的源码文件,包含了各驱动模块对应寄存器的设置代码,生成的目标文件是.a 后缀的库文件,在编译链接 eMod 中的驱动时使用这些.a 库。
【eLIBs】公共库文件夹,生成的目标文件是.a 后缀的库文件,包含了一些公共库函数接口,例如一些本平台自定义的 stdio、string 等接口。
【eMod】驱动模块文件夹,本文件夹主要是以 drv_、mod_开头的子文件夹,各子文件夹代表一个独立的驱动/中间件模块,编译每个子文件夹中的源码会生成一个 ELF 格式的可执行文件。eBSP 库中生成的.a 库大多是在这里的驱动模块编译链接时使用。
【includes】此文件夹用于存放公用的.h 后缀头文件,为使代码结构清晰,这些头文件会按照功能分别放到各个子文件夹中。
【interinc】此文件夹存放的头文件主要是与 ELF 格式可执行文件的解析相关的宏定义和结构体定义等。
【livedesk】本文件夹属于应用层文件夹,桌面、音乐、视频、相册、日历、录音等功能的代码均存放于此。
【makefile】SDK 根目录编译脚本文件,打开 cygwin 命令行窗口,进入 SDK 目录,输入 make clean;make命令后按“回车”键,就会执行此 makefile 脚本把整个 SDK 重新编译一遍。
【workspace】编译 eMod、livedesk 文件夹中的源码所生成的驱动、中间件、应用等独立模块的 ELF 可执行文件均存放于此,通过运行 workspace\suniv\beetles\image.bat 脚本,将这些独立的可执行文件,打包合成一个.img 后缀的文件,用于烧录到开发板中的存储设备(比如 Norflash)。
【libs】本文件夹主要是存放.a 库,不存放源码,eBSP、eLIBs 文件夹中编译生成的.a 后缀文件均存放在本文件夹中;
【softwares】本文件夹用于存放工具软件。
【tools】本文件夹主要存放打包脚本中调用到的 windows 应用程序,例如将一些配置信息更新到已经生成的可执行文件中,就会使用到本文件夹中的工具。
Melis2.0 的编译环境是 Cygwin + RVDS2.2。
Cygwin 是在 windows 上运行的类 Unix 环境;RVDS2.2 即 RealView Development Suite 2.2,是由 ARM公司出品的交叉编译工具套件。
双击 cygwin 图标运行 cygwin,通过命令行窗口输入命令。进入 SDK 根目录,输入 make clean;make命令来执行根目录的 makefile 脚本,重新编译整个 sdk,参考下【图 3】。可使用文本编辑工具打开 makefile
文件查看和修改。
根目录下的 makefile 脚本运行时,逐层编译链接 eBSP、eLIBs、eMOD、livedesk 文件夹中各个子目
录 , 生 成 ELF 格 式 的 可 执 行 文 件 以 供 打 包 生 成 固 件 。 这 些 ELF 可 执 行 文 件 的 分 别 存 放 到 了
workspace/beetles/ramfs 或 workspace/beetles/rootfs 文件夹。
关于 Melis2.0 编译链接工具的具体调用流程,请参考第 4 章《编译工具链使用》。
图3:
进入 SDK 的 workspace\suniv\beetles\文件夹,双击 image.bat 运行该脚本,把各驱动、中间件、应
用模块等独立的可执行文件合成到 ePDKv100.img 镜像文件,以便 PhoenixSuit 烧录工具烧录到开发板的Norflash 中。
image.bat 脚本的具体运行流程,可通过文本编辑工具打开查阅和修改,如【图 4】。
图4:
Melis2.0 使用的烧录工具是 PhoenixSuit,通过该工具将固件烧录到开发板的 Norflash 中,安装
PhoenixSuit 的操作文档请参看章节《固件烧录工具的安装》。下面我们介绍其中一种烧录方法。
【step1】双击 PhoenixSuit 图标运行 PhoenixSuit 软件,点击“一键刷机”选项卡,通过“浏览”按
钮选择想要烧录的固件的存放路径;
【step2】用 USB 链接线把电脑和开发板链接起来;
【step3】短路 Norflash 的 1、2 引脚,上电 1 到 2 秒钟之后即可松开,当烧录软件出现进度条,表明
PhoenixSuit 通过 USB 检测到开发板,之后烧录软件自动完成剩余的烧录工作;
【step4】等待烧录完成,会有弹窗提示烧录成功,表明烧录完成,之后就可重启设备运行新固件。
烧录期间和重启设备后,都可以通过查看开发板的调试串口输出的打印信息来判断软件的运行状态。
图5:
图6:
图7:
安装串口工具(例如 SecureCRT)并打开,通过串口线接收 SoC 输出的 UART 串口打印信息,可以对软件的运行状态做判断,参考【图 9】。
UART 串口波特率是 115200bps,串口收发引脚 Rx/Tx 参看 workspace/eFex/sys_config.fex 文件中的uart_debug_port、uart_debug_tx、uart_debug_rx 参数,如【图 8】所示为窗口 1UART port1 的 PA2/PA3
脚。
图8:
图9:
下面简单介绍一下 SecureCRT 的串口使用步骤。
【step1】双击 图标打开 SecureCRT 软件,通过菜单“文件”->“快速链接”,或直接点击工具
栏的“快速链接”按钮 来直接启动快速链接,出现如【图 10】的提示窗口,点击“协议”条目出现下
拉菜单,选择“Serial”。
图10:
【step2】选择 Serial 协议之后,如【图 11】所示,选择指定的串口,把波特率设置成 115200bps,取消流控的勾选项,然后点击“连接”按钮即可。至此串口 SecureCRT 即可用于收发开发板 UART1 串口的数据。
图11:
模块在 Melis2.0 中是一个独立的可执行文件,在介绍前文 SDK 文档目录时提到过模块的概念。一个模块在 SDK 中是如何存在的?它的代码组成基本结构如何?它是如何编译生成的?在固件中如何存在?又如何被加载调用?我们接下来介绍一下。
为使 SDK 结构层次清晰,Melis2.0 将内核操作系统、驱动、中间件、应用等区分开来,单独编译链接生成 ELF 可执行文件,方便各模块独立维护。一个模块需要使用时,要先加载其 ELF 可执行文件,才能使用,不使用时,则可以卸载掉。
图12:
例如串口驱动,进入到 eMod/drv_uart 文件夹,可以看到如【图 12】所示的内容。
【make.cfg】
1、通过包含 CROSSTOOL.CFG 指定了编译链接工具为 RVDS 以及 RVDS 工具在电脑上的存储路径;
2、通过 INCLUDES 指定了头文件的包含路径;
3、通过 LIBS 指定了库文件的包含路径;
4、通过 TARGET 指定了输出文件的名称和路径;
5、通过 SRCDIRS 指定了本文件夹及最大 3 层深度的子文件夹中所包含的所有文件名列表;
6、通过 LINK_SCT 指定了链接所使用的文件路径;
7、指定了其他编译选项;
【makefile】通过 SRCCS、SRCSS 过滤得到 SRCDIRS 变量所表示的文件名列表中的.c 和.s 后缀文件参与编译连接,通过 cygwin 进入本文件所在路径,输入 make clean;make 后按“Enter”键,就会执行此 makefile脚本,并将 ELF 可执行文件输出到 TARGET 所指定的路径下,默认 TARGET 是 SDK 目录下的workspace\suniv\rootfs\drv\文件夹,客户可按需自行修改。
图13:
uart.drv 生成之后,会在打包时一起合入.img 固件烧录到 Norflash 中,要使用运行该驱动,还需要
把该驱动加载到内存中,并注册给系统的设备管理器。
【magic.c】每个模块都有一个 magic.c 文件,本文件定义了一个结构体,需要注意的是“type”和“mif”
元素:
【type】type 是一个无符号单字节变量,emod.h 头文件以宏定义的形式为每个模块分配了独占的
“type”值,uart 按键驱动的 type 值是 EMOD_TYPE_DRV_UART,开发者如果想添加新模块,可自行添加宏定义,但与其他模块的值不可相同。
【mif】mif 表示模块的接口函数结构体,通过 esDEV_Plugin 函数加载驱动的过程中,依次调用
mif.MInit、mif.MOpen、mif.MIoctrl、mif.MClose 函数,完成 uart.drv 文件的加载、初始化、打开、设备注册和关闭。至此,开发者可通过打开设备注册名所获得的句柄来调用对应的注册函数,下面是一段 UART0驱动使用代码。
图14:
【esDEV_Plugin(“\drv\uart.drv”, 0, NULL, 0)】:如上文所属会根据"\drv\uart.drv"加载固件中
的 uart.drv 驱动到内存,然后调用 mif.init、mif.open、mif.ioctrol、mif.close 接口,在本串口驱动
中则对应的是 DRV_UART_MInit、DRV_UART_MOpen、DRV_UART_MIoctrl、DRV_UART_MClose。需要注意的是函数 DRV_UART_MIoctrl(__mp *mp, __u32 cmd, __s32 aux, void *pbuffer)在这个过程中的 4 各参数:
mp:DRV_UART_MOpen 的返回值;
cmd:DRV_CMD_PLUGIN;
aux:对应的是 esDEV_Plugin 函数的第二个参数 0;
pbuffer:对应的是 esDEV_Plugin 函数的第三个参数 NULL;
【pfuart0 = eLIBs_fopen(“\BUS\UART0”, 0)】:需要注意的是,参照源码 DRV_UART_MIoctrl 在处理
DRV_CMD_PLUGIN 消息的过程中调用了 esDEV_DevReg 函数,将为类名为“BUS”、设备名为“UART0”的设备及其接口函数结构体变量 uart_devop 一同注册到内核中。为使 eLIBs_fioctrl 这个接口映射成uart_devop.Ioctl 接口,需要先通过 eLIBs_fopen 接口打开“\BUS\UART0”获得句柄,再将句柄传递给eLIBs_fioctrl 接口,则此时 eLIBs_fioctrl == uart_devop.Ioctl,传参也一一对应。
eLIBs_fwrite函数也因为pfuart0参数映射成了uart_devop.Write,eLIBs_fclose函数也因为pfuart0
参数映射成了 uart_devop.Close;所以上述示例代码中设置波特率和数据发送的工作的得以实现。
类似的如果调用 eLIBs_fread 附带参数 pfuart0 就会映射成为 uart_devop.Read。
考虑到芯片引脚封装、PCBA 成本之类的问题,目前市面上的控制器大多采用了引脚复用的方式来减少芯片管脚的使用,全志平台的芯片也采用了引脚复用的方法。
引脚的配置文件是“sdkroot\workspace\suniv\eFex\sys_config.fex”,uart 部分的配置如【图 14】
所示,uart 驱动代码中的 esCFG_GetKeyValue 函数和 esCFG_GetGPIOSecData 函数会通过字符串传参来搜索下面的键值,需要使用的串口要把 uart_used 设置为 1,并将 IO 和复用功能号配置正确。本章侧重于讲解模块的加载和使用以及为配合 UART 测试所涉及到的内容,所以对 sys_config.fex 和 GPIO 不在此详述,相关内容可参考《Melis2.0 文档使用指南.xlsx》
图15:
`
下载地址:
固件镜像修改工具 ImageModify.exe下载 ImageModify_20230906.rar
下载地址:
USB刷机工具 PhoenixSuit下载 PhoenixSuit_CN_V1.1.1_20230906.rar
下载地址:
全志Melis2.0 用户手册.pdf下载 documents_20230906_melis_v2.0.rar
下载地址:
全志melis2.0 sdk源码库下载 melis2.0-sdk-release_20230906V2.0.rar