全志ARM926 Melis2.0系统的开发指引①

news2024/11/15 23:04:47

全志ARM926 Melis2.0系统的开发指引①

  • 1. 编写目的
  • 2. Melis2.0 系统概述
  • 3. Melis2.0 快速开发
    • 3.1. Melis2.0 SDK 目录结构
    • 3.2. Melis2.0 编译环境
    • 3.3. Melis2.0 固件打包
    • 3.4. Melis2.0 固件烧录
    • 3.5.串口打印信息
    • 3.6. Melis2.0 添加和调用一个模块
      • 3.6.1. 为什么划分模块?
      • 3.6.2. UART 驱动模块
        • 3.6.2.1.编译
        • 3.6.2.2.加载和使用
        • 3.6.2.3.UART0 的 PIN 脚配置
  • -. 全志相关工具和资源
    • -.1 全志固件镜像修改工具 ImageModify.exe 下载
    • -.2 全志固件USB刷机工具 PhoenixSuit 下载
    • -.3 全志Melis2.0 用户手册.pdf下载
    • -.4 全志melis2.0 sdk源码库下载

1. 编写目的

在这里插入图片描述

本文档是全志 Melis2.0 系统的开发指引文档,旨在协助开发者了解和掌握 Melis 系统,快速搭建 Melis系统的开发环境,将 Melis2.0 系统应用到产品开发中。

2. Melis2.0 系统概述

Melis2.0 系统是基于全志芯片平台自主研发的一套软件系统,其内容涵盖 SDK 代码包、资源制作工具组、编译链接脚本、固件打包烧录工具套件、调试工具 5 个部分,本文档将在后续章节向开发者逐一进行
介绍。
图1:
在这里插入图片描述

3. Melis2.0 快速开发

3.1. Melis2.0 SDK 目录结构

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 应用程序,例如将一些配置信息更新到已经生成的可执行文件中,就会使用到本文件夹中的工具。

3.2. Melis2.0 编译环境

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:
在这里插入图片描述

3.3. Melis2.0 固件打包

进入 SDK 的 workspace\suniv\beetles\文件夹,双击 image.bat 运行该脚本,把各驱动、中间件、应
用模块等独立的可执行文件合成到 ePDKv100.img 镜像文件,以便 PhoenixSuit 烧录工具烧录到开发板的Norflash 中。
image.bat 脚本的具体运行流程,可通过文本编辑工具打开查阅和修改,如【图 4】。
图4:
在这里插入图片描述

3.4. Melis2.0 固件烧录

Melis2.0 使用的烧录工具是 PhoenixSuit,通过该工具将固件烧录到开发板的 Norflash 中,安装
PhoenixSuit 的操作文档请参看章节《固件烧录工具的安装》。下面我们介绍其中一种烧录方法。
【step1】双击 PhoenixSuit 图标运行 PhoenixSuit 软件,点击“一键刷机”选项卡,通过“浏览”按
钮选择想要烧录的固件的存放路径;
【step2】用 USB 链接线把电脑和开发板链接起来;
【step3】短路 Norflash 的 1、2 引脚,上电 1 到 2 秒钟之后即可松开,当烧录软件出现进度条,表明
PhoenixSuit 通过 USB 检测到开发板,之后烧录软件自动完成剩余的烧录工作;
【step4】等待烧录完成,会有弹窗提示烧录成功,表明烧录完成,之后就可重启设备运行新固件。
烧录期间和重启设备后,都可以通过查看开发板的调试串口输出的打印信息来判断软件的运行状态。
图5:
在这里插入图片描述

图6:
在这里插入图片描述

图7:
在这里插入图片描述

3.5.串口打印信息

安装串口工具(例如 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:

在这里插入图片描述

3.6. Melis2.0 添加和调用一个模块

3.6.1. 为什么划分模块?

模块在 Melis2.0 中是一个独立的可执行文件,在介绍前文 SDK 文档目录时提到过模块的概念。一个模块在 SDK 中是如何存在的?它的代码组成基本结构如何?它是如何编译生成的?在固件中如何存在?又如何被加载调用?我们接下来介绍一下。
为使 SDK 结构层次清晰,Melis2.0 将内核操作系统、驱动、中间件、应用等区分开来,单独编译链接生成 ELF 可执行文件,方便各模块独立维护。一个模块需要使用时,要先加载其 ELF 可执行文件,才能使用,不使用时,则可以卸载掉。

3.6.2. UART 驱动模块

图12:
在这里插入图片描述

例如串口驱动,进入到 eMod/drv_uart 文件夹,可以看到如【图 12】所示的内容。

3.6.2.1.编译

【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:
在这里插入图片描述

3.6.2.2.加载和使用

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。

3.6.2.3.UART0 的 PIN 脚配置

考虑到芯片引脚封装、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:
在这里插入图片描述

`

-. 全志相关工具和资源

-.1 全志固件镜像修改工具 ImageModify.exe 下载

在这里插入图片描述
下载地址:
固件镜像修改工具 ImageModify.exe下载 ImageModify_20230906.rar

-.2 全志固件USB刷机工具 PhoenixSuit 下载

在这里插入图片描述
下载地址:
USB刷机工具 PhoenixSuit下载 PhoenixSuit_CN_V1.1.1_20230906.rar

-.3 全志Melis2.0 用户手册.pdf下载

下载地址:
全志Melis2.0 用户手册.pdf下载 documents_20230906_melis_v2.0.rar

-.4 全志melis2.0 sdk源码库下载

下载地址:
全志melis2.0 sdk源码库下载 melis2.0-sdk-release_20230906V2.0.rar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1060763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sentinel-微服务保护

一、初识Sentinel 1、雪崩问题及解决方案 雪崩问题 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。 解决雪崩问题的常见方式有四种: 1、超时处理:设定超时时间,请求超过一定时间…

【C语言】内存函数的详细教学和模拟实现

🚀write in front🚀 🔎大家好,我是gugugu。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🆔本文由 gugugu 原创 CSDN首发🐒 如需转载还请通知⚠…

全志ARM926 Melis2.0系统的开发指引②

全志ARM926 Melis2.0系统的开发指引② 编写目的4. 编译工具链使用4.1.工具链通用配置4.2.模块的工具链配置4.3.简单的 makefile 5. 固件烧录工具的安装5.1.PhoenixSuit 的安装步骤5.2.检验 USB 驱动安装5.3.使用烧录软件 PhoenixSuit -全志相关工具和资源-.1 全志固件镜像修改工…

Python:操作SQLite数据库简单示例

本文用最简单的示例演示python标准库提供的SQLite数据库进行新增、查询数据的过程。 代码文件app.py # -*- coding: UTF-8 -*- from flask import Flask import sqlite3app Flask(__name__)app.route(/) def hello_world():return Hello World!#创建数据库 app.route(/creat…

Go基础之变量和常量

Go基础之变量和常量 文章目录 Go基础之变量和常量一. 标识符、关键字、内置类型和函数1.1 标识符1.2 关键字1.3 保留字1.4 内置类型1.4.1 值类型:1.4.2 引用类型:(指针类型)1.5 内置函数1.6 内置接口error 二.Go变量命名规范2.1 采用驼峰体命名2.2 简单、…

Python无废话-办公自动化Excel图表制作

openpyxl 支持用Excel工作表中单元格的数据,创建条形图、折线图、散点图和饼图等。 图表制作步骤 在openpyxl模块中创建图表,步骤如下: ①选择一个单元格区域,创建Reference 对象,作为图形数据a)(Value)。 ②创建一个Chart对象…

阿里云ECS服务器上启动的portainer无法访问的问题

如下图,在阿里云ECS服务器上安装并启动了portainer,但是在自己电脑上访问不了远程的portainer。 最后发现是要在网络安全组里开放9000端口号,具体操作如下: 在云服务器管理控制台点击左侧菜单中的网络与安全-安全组,然…

阻塞队列--线程安全问题

之前的队列在很多场景下都不能很好地工作,例如 大部分场景要求分离向队列放入(生产者:主要调用offer方法)、从队列拿出(消费者:主要调用poll方法)两个角色、它们得由不同的线程来担当&#xff0…

uboot启动流程-uboot内存分配工作总结

一. uboot 启动流程 _main 函数中会调用 board_init_f 函数,本文继续简单分析一下 board_init_f 函数。 本文继续具体分析 board_init_f 函数。 本文继上一篇文章的学习,地址如下: uboot启动流程-uboot内存分配_凌肖战的博客-CSDN博客 二…

【C语言】浮点数在内存中的存储和读取——底层分析

🚀write in front🚀 🔎大家好,我是gugugu。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🆔本文由 gugugu 原创 CSDN首发🐒 如需转载还请通知⚠…

【12】c++设计模式——>单例模式练习(任务队列)

属性: (1)存储任务的容器,这个容器可以选择使用STL中的队列(queue) (2)互斥锁,多线程访问的时候用于保护任务队列中的数据 方法:主要是对任务队列中的任务进行操作 &…

MySql运维篇---008:日志:错误日志、二进制日志、查询日志、慢查询日志,主从复制:概述 虚拟机更改ip注意事项、原理、搭建步骤

1. 日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的&a…

[激光原理与应用-71]:光电传感器的工作原理详解:光电效应原理、类型、光信号的光谱、电信号的频谱

目录 前言: 一、光电传感器组成 二、光电元件:光电效应的分类 2.1 外光电效应:逸出效应 2.2 内光电效应:光电导效应 2.3 内光电效应:光生伏特效应(电流效应) 2.3.1 光电转换元件PD 三、…

云安全之等级保护详解

等级保护概念 网络安全等级保护,是对信息系统分等级实行安全保护,对信息系统中使用的安全产品实行按等级管理,对信息系统中发生的信息安全事件分等级进行响应、处置。 网络安全等级保护的核心内容是:国家制定统一的政策、标准&a…

【ldt_struct】0ctf2021-kernote

前言 题目给的文件系统是 ext4,所以我们只需要将其挂载即可使用: 1、创建一个空目录 2、使用 mount 将其挂载即可 3、使用 umount 卸载即可完成打包 开启了 smap、smep、kaslr 和 kpti 保护,并且给了如下内核编译选项: Her…

SpringBoot大文件上传实现分片、断点续传

大文件上传流程 客户端计算文件的哈希值,客户端将哈希值发送给服务端,服务端检查数据库或文件系统中是否已存在相同哈希值的文件,如果存在相同哈希值的文件,则返回秒传成功结果,如果不存在相同哈希值的文件&#xff0…

GO 中的指针?

本文也主要聊聊在 GO 中的指针和内存,希望对你有点帮助 如果你学习过 C 语言,你就非常清楚指针的高效和重要性 使用 GO 语言也是一样,项目代码中,不知道你是否会看到函数参数中会传递各种 map,slice ,自定…

使用正则表达式批量修改函数

贪心匹配,替换中的$1代表括号中的第一组。 使用[\s\S\r]代表所有字符,同时加个问号代表不贪心匹配:

【RP-RV1126】烧录固件使用记录

文章目录 烧录完整固件进入MASKROM模式固件烧录升级中:升级完成: 烧录部分进入Loader模式选择文件切换loader模式 烧录完整固件 完整固件就是update.img包含了所有的部件,烧录后可以直接运行。 全局编译:./build.sh all生成固件…

Java数据结构————优先级队列(堆)

一 、 优先级队列 有些情况下,操作的数据可能带有优先级, 一般出队列时,可能需要优先级高的元素先出队列。 数据结构应该提供两个最基本的操作, 一个是返回最高优先级对象, 一个是添加新的对象。 这种数据结构就是优…