




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于OpenHarmony的嵌入式开发
第九章小型系统应用开发大连理工大学-朱明[9.1.0]小型系统的特点小型系统:提供比轻量系统更高的性能、更丰富的功能,但是需要更高性能硬件(CPU、内存、存储、图形能力)的支撑常用的处理器平台:Hi3518EV300、Hi3516DV300、RK3568、RK3566等本章选用的处理器
STM32MP157本章选用的硬件平台
小熊派BearPi-HMMicro开发板安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发2[9.1.1]STM32MP157概述
CPU:多核设计,异构处理器架构
2*Cortex-A7:运行频率为650MHz,同系列最高可达800MHz
1*Cortex-M4:运行频率为209MHz图形:3D图形处理单元、MIPI-DSI显示接口内存:最大支持1GB的DDR3/3L内存外设:内置了37个通信外设
10/100M/1000M以太网
3个USB2.0HOST/OTG
29个定时器
ADC/DAC、CAN、时钟、GPIO、I2C和SPI等安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发3[9.1.1]STM32MP157概述安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发4CPU、内存图形功能外部设备[9.1.2]STM32MP157硬件平台BearPi-HMMicro板载功能
部件1:USB2.0HOST
部件2:四段式耳机
部件3:2.4GSDIOWi-FiHi3881
部件4:SD/TF卡槽
部件5:主控STM32MP157AAC
部件6:DDR内存1x512MB
部件7:MIC麦克风
部件8:Type-C接口,供电烧录调试
部件9:S24接口,外接摄像头安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发5安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发6[9.1.2]STM32MP157硬件平台BearPi-HMMicro板载功能
部件10:扬声器
部件11:eMMC1×4GB
部件12:Resetkey
部件13:UserKey
部件14:LCD触摸屏
部件15:标准E53接口连接扩展板。目前支持智慧农业扩展板(LED灯、电机)、智慧路灯(RGBLED)、智慧烟感(烟雾传感器、蜂鸣器)、人体红外(红外热感、蜂鸣器)和智慧井盖(霍尔传感器)等。安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发7[9.1.3]
开发环境搭建
-方法1:单一DevEco
Windows环境
Hi3861的DevEco配置过程有所简化,但小型系统的配置过程仍繁琐
STM32MP157只能在DevEco中编辑和编译,不能下载烧录
①下载并安装DevEcoStudio从HarmonyOS网站下载软件按照软件提示完成安装
②安装SDK插件创建新工程即可同时安装安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发8[9.1.4]
开发环境搭建
-方法2:命令行模式(相对复杂!)
Linux服务器+Windows工作台组成
Linux系统要求:Ubuntu16.04(建议18以上)及以上64位系统版本
Python3.7或更高版本
bash和mkimage.stm32
Windows系统要求:WindowsXP/7/10/11以及未来版本
VisualStudioCode
远程连接工具(MobaXterm或PuTTY等)
CH341SER.EXE(USB转串口驱动程序)
STM32CubeProgrammer(用于下载烧写程序)安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发9[9.1.4]
开发环境搭建
-方法2:命令行模式
①安装编译基础环境(Linux系统)远程连接到Linux系统。MobaXterm为例(参考教材方法或其他方法)检查Linux系统的shell类型:,观察输出结果若显示为bash,则无需修改若显示为其他,可以按照如下方式修改为bash方式1:执行,选择no方式2:删除现有的sh链接,然后重新建立链接再次检查,以确认默认的shell修改成功ls-l/bin/shsudodpkg-reconfiguredashrm-rf/bin/shsudoln-s/bin/bash/bin/sh[9.1.4]
开发环境搭建
-方法2:命令行模式
②修改Linux源镜像(Ubuntu-18.04为例),国内源速度更好更新源列表缓存:,安装软件和库:安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发10deb/ubuntu/bionicmainrestricteduniversemultiversedeb-src/ubuntu/bionicmainrestricteduniversemultiversedeb/ubuntu/bionic-updatesmainrestricteduniversemultiversedeb-src/ubuntu/bionic-updatesmainrestricteduniversemultiversedeb/ubuntu/bionic-backportsmainrestricteduniversemultiversedeb-src/ubuntu/bionic-backportsmainrestricteduniversemultiversedeb/ubuntu/bionic-securitymainrestricteduniversemultiversedeb-src/ubuntu/bionic-securitymainrestricteduniversemultiversedeb/ubuntu/bionic-proposedmainrestricteduniversemultiversedeb-src/ubuntu/bionic-proposedmainrestricteduniversemultiversesudoapt-getupdatesudoapt-getinstallbuild-essentialgccg++makezlib*libffi-deve2fsprogspkg-configflexbisonperlbcopenssllibssl-devlibelf-devlibc6-dev-amd64binutilsbinutils-devlibdwarf-devu-boot-toolsmtd-utilsgcc-arm-linux-gnueabicpiodevice-tree-compilernet-toolsopenssh-servergitvimopenjdk-11-jre-headless安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发11[9.1.4]
开发环境搭建
-方法2:命令行模式
③安装并设置Python3环境检查Python版本:若输出的版本号大于3.7,则可以跳过余下的Python安装配置的内容若Ubuntu为18.xx及更新版本:若Ubuntu为16.xx,需要安装相关的依赖包python3--versionsudoapt-getinstallpython3.8sudoaptupdate&&sudoaptinstallsoftware-properties-commonsudoadd-apt-repositoryppa:deadsnakes/ppasudoaptupgradesudoaptinstallpython3.8安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发12[9.1.4]
开发环境搭建
-方法2:命令行模式
③安装并设置Python3环境
将系统默认的python和python3的链接更新到新安装的Python安装并升级Python包管理工具(pip3)
命令行方式安装包方式sudoupdate-alternatives--install/usr/bin/pythonpython/usr/bin/python3.81sudoupdate-alternatives--install/usr/bin/python3python3/usr/bin/python3.81sudoapt-getinstallpython3-setuptoolspython3-pip-ysudopip3install--upgradepipcurlhttps://bootstrap.pypa.io/get-pip.py-oget-pip.pypythonget-pip.py[9.1.4]
开发环境搭建
-方法2:命令行模式
④安装hb安装:配置环境变量,在~/.bashrc文件结尾加入内容然后执行生效:执行hb命令,检查hb是否安装成功,若出现hb版本问题,可以尝试安装OpenHarmony源码build/lite目录中的hb,在该目录中执行附:卸载hb的方法安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发13python3-mpipinstall--userohos-build==0.4.3exportPATH=~/.local/bin:$PATHsource~/.bashrcpip3install--userbuild/litepip3uninstallohos-build[9.1.4]
开发环境搭建
-方法2:命令行模式
⑤安装mkimage工具下载mkimage,传输至Linux系统中,设置可执行权限
将~/tools文件夹加入到环境变量中执行生效:安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发14chmod777~/tools/mkimage.stm32exportPATH=~/tools:$PATHsource~/.bashrc[9.1.4]
开发环境搭建
-方法2:命令行模式
⑥映射Linux目录到Windows系统官方文档推荐的SFTP软件:RaiDrive,下载并安装到Windows系统设置RaiDrive的连接信息:连接类型:NAS连接属性:取消只读
Linux系统IP地址
Linux系统用户名和密码等确定完成设置安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发15[9.1.4]
开发环境搭建
-方法2:命令行模式
⑦在Linux系统中获取源码小熊派的源码已经合并至OpenHarmony主仓库,可从主仓库下载安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发16cd/home/bearpimkdirproject&&cdprojectgitclone/bearpi/bearpi-hm_micro_small.gitmkdirOpenHarmony&&cdOpenHarmonyrepoinit-u/openharmony/manifest.git-bmasterreposync-crepoforall-c'gitlfspull'[9.1.4]
开发环境搭建
-方法2:命令行模式
⑧编译OpenHarmony系统通过hb命令设置平台:选择bearpi-hm_micro编译固件:输出结果可在Windows上通过映射文件夹查看,包括三部分
OHOS_Image.stm32:系统镜像文件
rootfs_vfat.img:根文件系统
userfs_vfat.img:用户文件系统安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发17cd/home/bearpi/project/bearpi-hm_micro_small/hbsethbbuild
--tee
-f./out/bearpi-hm_micro/bearpi-hm_micro中烧录系统必备的三个文件复制到Windows系统上,待用[9.1.5]
烧录固件并启动开发板-烧录下载并安装JRE和STM32CubeProgrammer,详细过程略检查BearPi-HMMicro在Windows系统中的串口信息
Windows系统上的虚拟机可能会将串口带入到虚拟机内部,断开即可设置BearPi-HMMicro的启动模式
B0=0
B1=0
B2=0按下RESET键安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发18决定了BearPi-HMMicro启动模式B0B1B2=000:烧录模式B0B1B2=010:正常启动模式[9.1.5]
烧录固件并启动开发板-烧录在STM32CubeProgrammer软件中,设置并连接找到正确的USB端口,并连接BearPi-HMMicro设置BearPi-HMMicro所对应的配置文件(.tvs文件)安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发19[9.1.5]
烧录固件并启动开发板-烧录
点击Browse,选择工程源码下的烧录镜像路径
点击Download,启动镜像烧录,并等待烧录完毕安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发20[9.1.5]
烧录固件并启动开发板-启动通过远程连接工具经USB串口连接至BearPi-HMMicro设置B0B1B2=010,按RESET复位启动系统启动过程中会通过串口输出启动过程的信息通过远程连接工具可以在shell终端中执行命令,如ls等在屏幕上显示界面,并进行交互安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发21[9.1.6]基本应用开发示例在shell中显示字符串的主要开发流程构建工程目录,编辑源码文件在bundle.json文件中增加目标组件在工程目录的BUILD.gn文件中增加APP字段
增加能力选项为指定的lib库,如hello_world_lib
在lib库中,通过sources来指定要编译的.c文件,通过output_name指定生成的可执行程序名称开发流程:工程目录和源文件
在./device/board/bearpi/bearpi_hm_micro/app建立my_first_app目录在目录中创建源码文件hello_world.c编译脚本文件BUILD.gn安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发22[9.1.6]基本应用开发示例开发流程:源码文件hello_world.c开发流程:编译脚本BUILD.gn安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发23#include<stdio.h>intmain(intargc,char**argv){printf("\n************************************************\n");printf("\n\t\tHelloBearPi!\n");printf("\n************************************************\n\n");return0;}import("//build/lite/config/component/lite_component.gni")lite_component("my_app"){features=[":hello_world_lib",]}executable("hello_world_lib"){output_name="hello_world"sources=["hello_world.c"]include_dirs=[]defines=[]cflags_c=[]ldflags=[]}导入gni组件将hello_world_lib打包成lite_component,并命名为my_app源文件和输出文件[9.1.6]基本应用开发示例开发流程:添加新组件
在./device/board/bearpi/bearpi_hm_micro/app/bundle.json中添加对编译的组件my_app安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发24"sub_component":["//device/board/bearpi/bearpi_hm_micro/app/launcher:launcher_hap","//device/board/bearpi/bearpi_hm_micro/app/setting:setting_hap","//device/board/bearpi/bearpi_hm_micro/app/screensaver:screensaver_hap","//device/board/bearpi/bearpi_hm_micro/app/communication:sample","//device/board/bearpi/bearpi_hm_micro/app/my_first_app:my_app"],运行结果[9.1.6]基本应用开发示例-演示视频安全边距9.1
STM32MP157特性与开发环境基于OpenHarmony的嵌入式开发25[9.2.1]
2048小游戏规则
玩家每次选择上下左右中任一方向进行滑动,每滑动一次,所有数字方块都会往滑动的方向靠拢
系统会在空白的地方随机生成一个数字方块,相同数字的方块在靠拢、相撞时会相加
新增数字方块只有2或4两种数字
玩家需要在16格的范围中合成2048数字方块。安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发26[9.2.2]创建项目项目类型
Empty
Ability项目名
Game2048
Language
JS其他使用默认设置安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发27[9.2.2]创建项目待开发的文件
index.hml决定了页面的结构(Structure)
index.css
确定组件的样式(Presentation)
index.js负责控制组件的行为(Behavior)安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发28[9.2.3]编辑源码修改项目运行设备类型
将MainAbility目录重命名为default
编辑html文件源码安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发29"deviceType":["smartVision","tablet"]<divclass="container"><divclass="info"><textclass="score">分数\n{{score}}</text><textclass="score">最高分\n{{bestScore}}</text><inputclass="restart"type="button"value="重新开始"onclick="initGame"/></div><stackclass="stack"><divclass="grid"onswipe="onSwipe"><divfor="{{tiles}}"class="tile"style="background-color:{{$item.bgcolor}}"><textstyle="color:{{$item.color}};font-size:{{$item.size}}">{{$item.text}}</text></div></div><divclass="gameover"show="{{showGameOver}}"><textclass="title">游戏结束!</text></div></stack>定义数字方格滑动手势触发的响应事件函数onSwipe:移动格子,计算数值,生成数字、绘制格子等当前得分和历史最高分[9.2.3]编辑源码编辑css文件源码安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发30.container{display:flex;flex-direction:row;justify-content:center;align-items:center;width:100%;height:100%;background-color:#fafafa;}.info{flex-direction:column;justify-content:space-around;align-items:center;width:180px;height:100%;margin:20px40px20px0;}.stack{width:420px;height:420px;}.score{width:100%;padding:20px0px;background-color:#bbada0;border-radius:30px;font-size:32px;text-align:center;color:#fafafa;}.restart{height:80px;width:100%;background-color:#bbada0;border-radius:30px;font-size:32px;}.grid{flex-wrap:wrap;width:100%;height:100%;background-color:#bbada0;}.tile{justify-content:center;align-items:center;width:100px;height:100px;margin-top:4px;margin-left:4px;border-radius:16px;}.gameover{justify-content:center;align-items:center;width:100%;height:100%;background-color:#80ffffff;}.title{font-size:64px;color:#bbada0;}[9.2.3]编辑源码模拟器静态效果预览右侧主要游戏区域中,缺少颜色方块和数字颜色方块和数字是动态的,所以不能够在html和css文件中预先设置,只能在js中实现安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发31[9.2.3]编辑源码
js文件内容定义格子内的数字定义不同数值的格子对应的数字颜色和背景颜色安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发32vargrid=[2048,1024,512,256,128,64,32,16,8,4,2,0,
8,4,2,0];constTHEME=[{bgcolor:"#D4C8BD",text:"",color:"#776E65",size:"64px"},{bgcolor:"#EEE4DA",text:"2",color:"#776E65",size:"64px"},{bgcolor:"#EEE1C9",text:"4",color:"#776E65",size:"64px"},{bgcolor:"#F3B27A",text:"8",color:"#F9F6F2",size:"64px"},{bgcolor:"#F69664",text:"16",color:"#F9F6F2",size:"48px"},{bgcolor:"#F77C5F",text:"32",color:"#F9F6F2",size:"48px"},{bgcolor:"#F75F3B",text:"64",color:"#F9F6F2",size:"48px"},{bgcolor:"#EDD073",text:"128",color:"#F9F6F2",size:"48px"},{bgcolor:"#EDCC62",text:"256",color:"#F9F6F2",size:"48px"},{bgcolor:"#ECC402",text:"512",color:"#F9F6F2",size:"48px"},{bgcolor:"#C9DD22",text:"1024",color:"#F9F6F2",size:"32px"},{bgcolor:"#60D992",text:"2048",color:"#F9F6F2",size:"32px"}];[9.2.3]编辑源码
js文件内容在导出数据中加入信息
tiles数组:实际展示的方格文字、颜色和大小等
updateGrid()函数通过全局变量grid更新tiles数组安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发33exportdefault{data:{score:0,
//当前得分
bestScore:0,
//最高分
tiles:[],
//方格信息
showGameOver:false//是否显示游戏结束画面
}}updateGrid(){letnewTiles=[];//遍历grid,将数字对应的方格的文字,颜色,大小等信息加入到tiles中
for(leti=0;i<grid.length;i++){newTiles.push(THEME[grid[i]]);}this.tiles=newTiles;}[9.2.3]编辑源码预览效果:在onInit()中调用updateGrid即可预览数字方格效果安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发34onInit(){
//测试用
this.updateGrid();},[9.2.3]编辑源码js文件内容:游戏逻辑部分初始化:在16个空的格子中随机选择两个格子增加数字2或4,其中2出现的几率应比4大还需要将本局得分设置为0,将grid数组的16个元素均设置为0,并从中随机选取两个元素使其的值为2或4,然后调用updateGrid()进行显示
initGame():游戏初始化逻辑安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发35initGame(){
this.score=0;for(leti=0;i<grid.length;i++)
//将16个格子都设为空
grid[i]=0;this.addTile();this.addTile();
//生成两个数字
this.updateGrid();
//绘制格子
this.showGameOver=false;
//隐藏游戏结束画面},[9.2.3]编辑源码js文件内容:游戏逻辑部分向空白的格子填充数字2或者4的函数addTile安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发36addTile(){letempty=[];//用于存放空格子位置的数组
for(leti=0;i<grid.length;i++){if(grid[i]==0){//遍历所有的格子,当格子为空时将其位置加入数组
empty.push(i);}}//从中随机挑选一个位置
leti=Math.floor(Math.random()*empty.length);//2出现的概率比4大
grid[empty[i]]=Math.random()<0.8?1:2;},每次只填充一个空白格子,需要调用两次满足游戏规则要求[9.2.3]编辑源码js文件内容:游戏逻辑部分
html文件中,指定onSwipe函数响应滑动手势安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发37onSwipe(event){letisMoved=false;switch(event.direction){//根据方向移动场上格子
case"up":isMoved=this.moveTile(0,1,4);break;case"down":isMoved=this.moveTile(12,1,-4);break;case"left":isMoved=this.moveTile(0,4,1);break;case"right":isMoved=this.moveTile(3,4,-1);break;}if(isMoved){//如果格子发生改变
this.addTile();//生成新的数字
this.updateGrid();//绘制格子
if(this.isGameOver()){//如果游戏结束则显示游戏结束并更新最高分
this.showGameOver=true;if(this.score>this.bestScore){this.bestScore=this.score;}}
}},moveTile(origin,delta,step)移动与合并格子的具体逻辑如果移动/合并成功,则刷新显示[9.2.3]编辑源码js文件内容:游戏逻辑部分
moveTile(origin,delta,step)实现的对表示格子数值的一维数组的操作向左移动:第一行起始3第二行起始7第三行起始11第四行起始15每行步长-1其他方向类似向右,各行起始为0/4/8/12,步长1安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发38vargrid=[2048,1024,512,256,128,64,32,16,8,4,2,0,
8,4,2,0];vargrid=[2048,1024,
512,
256,
0
1
2
3
128,
64,
32,
16,
4
5
6
7
8,
4,
2,
0,
8
9
10
11
8,
4,
2,
0,
12
13
14
15];delta是间隔向左/右=4向上/下=1[9.2.3]编辑源码安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发39moveTile(origin,delta,step){if(this.showGameOver)returnfalse;//游戏结束则不移动格子
letisMoved=false;for(leti=0;i<4;i++){//遍历每行或每列
letc=origin+i*delta;//每行或每列的第一个元素
for(letj=0;j<3;j++){//遍历当前行或列除最后一个元素的每个元素
letnext=-1;for(letk=1;k<4-j;k++){//找第j个元素下一个不为0的位置
if(grid[c+k*step]!=0){next=c+k*step;
break;}}
if(next>-1){//如果找到则进行移动合并
if(grid[c]==0){//进行移动
grid[c]=grid[next];grid[next]=0;isMoved=true;continue;//c不变直接进入下轮循环
}elseif(grid[c]==grid[next]){//进行合并
grid[c]++;this.score+=2**grid[c];grid[next]=0;isMoved=true;}}else{break;}//否则说明这行或列无法移动合并c+=step;}}returnisMoved;},[9.2.3]编辑源码js文件内容:游戏逻辑部分游戏结束判定:isGameOver()
安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发40isGameOver(){//如果有空格子则游戏继续
for(leti=0;i<grid.length;i++){if(grid[i]==0)returnfalse;}//否则如果有的格子周围有和它数字一样的格子,即有可以合并,否则游戏继续
for(lety=0;y<3;y++){for(letx=0;x<3;x++){if(grid[4*y+x]==grid[4*(y+1)+x])returnfalse;if(grid[4*y+x]==grid[4*y+(x+1)])returnfalse;}}//否则游戏结束
returntrue;},[9.2.5]打包HAP应用
打包程序以便安装使用:系统编译源码成HAP包
IDE上方菜单栏的Build->BuildHap(s)/App(s)->BuildHap(s)
安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发41在entry/build/default/outputs/default目录中找到生成的HAP文件[9.2.6]安装HAP应用
向BearPi-HMMicro开发板中安装HAP应用将HAP文件传输至BearPi-HMMicro中使用TF卡复制进系统将HAP安装包复制进FAT32格式的TF卡中
TF卡插入板子,挂载无卡复制文件在BearPi-HMMicro启动阶段Hitanykeytostopautoboot时,按回车键,使其停留在uboot,将其转换为U盘模式逐步尝试计算机中出现的U盘,勿格式化找到安装有文件系统的磁盘,将HAP安装包复制到其中
打开调试模式并安装HAP应用安全边距9.2
2048小游戏开发项目基于OpenHarmony的嵌入式开发42mount/dev/mmcblk0p0/sdcardvfatcd/sdcardums0mmc1./bmset-sdisable./bmset-denable./bminstall-p<HAP安装包名称>[9.3.1]
硬件驱动开发要点项目目标:运行GPIO控制程序,实现关灯、开灯及翻转灯的功能硬件驱动的开发要点:
用户程序无法直接访问驱动,只有驱动程序向用户态暴露其server后,用户程序才能通过Dispatch方法发送指令到驱动程序,将用户态的数据携带到驱动程序,或者从驱动程序读出数据针对本项目,可包含如下要点(1)可以发送指令到驱动,例如读写操作码LED_WRITE_READ等(2)可以携带数据到驱动,解析出开关灯的动作(3)可以读取I/O口电平状态并通过reply携带到用户程序项目的主要主要工作包括驱动程序开发和业务功能开发安全边距9.3
GPIO基础控制开发示例基于OpenHarmony的嵌入式开发43(1)编写驱动代码(2)编写驱动编译文件(3)编写驱动配置文件(1)编写业务代码(2)编写业务代码编译文件[9.3.2]
GPIO的驱动开发创建目录结构驱动程序目录:device/soc/st/stm32mp1xx/sdk_liteos/hdf_config/led/
创建驱动配置文件led_config.hcs业务功能目录:device/soc/st/common/platform/led/
创建驱动文件led.c创建编译构建文件BUILD.gn创建Makefile文件
GPIO(LED)驱动实现:一些基本的库和定义安全边距9.3
GPIO基础控制开发示例基于OpenHarmony的嵌入式开发44#include"hdf_device_desc.h"#include"hdf_log.h"#include"device_resource_if.h"#include"osal_io.h"#include"osal.h”#include"osal_mem.h"#include"gpio_if.h"#defineHDF_LOG_TAG
led_driver#defineLED_WRITE_READ1enumLedOps{LED_OFF,LED_ON,LED_TOGGLE,};structStm32Mp1ILed{uint32_tgpioNum;};staticstructStm32Mp1ILedg_Stm32Mp1ILed;uint8_tstatus=0;[9.3.2]
GPIO的驱动开发
GPIO(LED)驱动实现:Dispatch处理用户态程序下发的消息安全边距9.3
GPIO基础控制开发示例基于OpenHarmony的嵌入式开发45
int32_tLedDriverDispatch(structHdfDeviceIoClient*client,intcmdCode,structHdfSBuf*data,structHdfSBuf*reply){uint8_tcontrl;HDF_LOGE("Leddriverdispatch");if(client==NULL||client->device==NULL){
HDF_LOGE("LeddriverdeviceisNULL");
returnHDF_ERR_INVALID_OBJECT;}
switch(cmdCode){
//接收到用户态发来的LED_WRITE_READ命令
caseLED_WRITE_READ:
HdfSbufReadUint8(data,&contrl);
//读取数据赋值给contrlswitch(contrl){caseLED_ON:
GpioWrite(g_Stm32Mp1ILed.gpioNum,GPIO_VAL_LOW);status=1;break;
//开灯-低电平点亮caseLED_OFF:
GpioWrite(g_Stm32Mp1ILed.gpioNum,GPIO_VAL_HIGH);
status=0;
break;
//关灯-高电平熄灭caseLED_TOGGLE:
//切换状态
if(status==0){GpioWrite(g_Stm32Mp1ILed.gpioNum,GPIO_VAL_LOW);status=1;}else{
GpioWrite(g_Stm32Mp1ILed.gpioNum,GPIO_VAL_HIGH);
status=0;
}
break;default:
break;
}
if(!HdfSbufWriteInt32(reply,status)){
HDF_LOGE(“replayisfail”);
//将LED的状态值写入reply,传至用户程序
returnHDF_FAILURE;
}break;default:
break;
}returnHDF_SUCCESS;}[9.3.2]
GPIO的驱动开发
GPIO(LED)驱动实现:驱动对外提供的服务能力:哪3个安全边距9.3
GPIO基础控制开发示例基于OpenHarmony的嵌入式开发46//驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架int32_tHdfLedDriverBind(structHdfDeviceObject*deviceObject){if(deviceObject==NULL){HDF_LOGE("Leddriverbindfailed!");returnHDF_ERR_INVALID_OBJECT;}staticstructIDeviceIoServiceledDriver={.Dispatch=LedDriverDispatch,};deviceObject->service=(structIDeviceIoService*)(&ledDriver);HDF_LOGD("Leddriverbindsuccess");returnHDF_SUCCESS;}//驱动资源释放的接口voidHdfLedDriverRelease(structHdfDeviceObject*deviceObject){if(deviceObject==NULL){HDF_LOGE("Leddriverreleasefailed!");return;}HDF_LOGD("Leddriverreleasesuccess");return;}Release时无需对GPIO进行操作[9.3.2]
GPIO的驱动开发
GPIO(LED)驱动实现:驱动对外提供的服务能力:哪3个安全边距9.3
GPIO基础控制开发示例基于OpenHarmony的嵌入式开发47int32_tHdfLedDriverInit(structHdfDeviceObject*device){structStm32Mp1ILed*led=&g_Stm32Mp1ILed;int32_tret;if(device==NULL||device->property==NULL){HDF_LOGE("%s:deviceorpropertyNULL!",__func__);returnHDF_ERR_INVALID_OBJECT;}//读取hcs私有属性值
ret=Stm32LedReadDrs(led,device->property);if(ret!=HDF_SUCCESS){HDF_LOGE("%s:getleddeviceresourcefail:%d",__func__,ret);returnret;}//将GPIO管脚配置为输出
ret=GpioSetDir(led->gpioNum,GPIO_DIR_OUT);if(ret!=0){HDF_LOGE("GpioSerDir:failed,ret%d\n",ret);returnret;}HDF_LOGD("LeddriverInitsuccess");returnHDF_SUCCESS;}初始化GPIO端口的方向//定义驱动入口的对象structHdfDriverEntryg_ledDriverEntry={.moduleVersion=1,.moduleName="HDF_LED",.Bind=HdfLedDriverBind,.Init=HdfLedDriverInit,.Release=HdfLedDriverRelease,};//调用HDF_INIT将驱动入口注册到HDF框架中HDF_INIT(g_ledDriverEntry);[9.3.2]
GPIO的驱动开发
GPIO(LED)驱动实现:读取HCS私有配置安全边距9.3
GPIO基础控制开发示例基于OpenHarmony的嵌入式开发48staticint32_tStm32LedReadDrs(structStm32Mp1ILed*led,conststructDeviceResourceNode*node){int32_tret;structDeviceResourceIface*drsOps=NULL;drsOps=DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);if(drsOps==NULL||drsOps->GetUint32==NULL){HDF_LOGE("%s:invaliddrsops!",__func__);returnHDF_FAILURE;}//读取led.hcs中led_gpio_num的值
ret=drsOps->GetUint32(node,"led_gpio_num",&led->gpioNum,0);if(ret!=HDF_SUCCESS){HDF_LOGE("%s:readledgpionumfail!",__func__);returnret;}returnHDF_SUCCESS;}[9.3.2]
GPIO的驱动开发编译驱动:编辑led/BUILD.gn文件
编辑led/Makefile文件,加入内容,将led.c编译成hdf_led安全边距9.3
GPIO基础控制开发示例基于OpenHarmony的嵌入式开发49import("//drivers/adapter/khdf/liteos/hdf.gni")hdf_driver("hdf_led"){sources=["led.c",]}include$(LITEOSTOPDIR)/config.mkinclude$(LITEOSTOPDIR)/../../drivers/hdf_core/adapter/khdf/liteos/lite.mkMODULE_NAME:=hdf_ledLOCAL_CFLAGS+=$(HDF_INCLUDE)LOCAL_SRCS+=led.cLOCAL_CFLAGS+=-fstack-protector-strong-Wextra-Wall-Werror-fsigned-char-fno-strict-aliasing-fno-commoninclude$(HDF_DRIVER)[9.3.2]
GPIO的驱动开发编译驱动:向/device/soc/st/common/platform/BUILD.gn文件中增加内容安全边距9.3
GPIO基础控制开发示例基于OpenHarmony的嵌入式开发50group("drivers"){deps=["adc","gpio","i2c","iwdg","pwm","rng","smp","spi",
"led","stm32mp1xx_hal","uart","wlan:wifi_firmware",]}增加led编译选项LITEOS_BASELIB+=-lhdf_ledLIB_SUBDIRS+=$(ST_DRIVERS_ROOT)/led向/device/soc/st/common/platform/lite.mk文件中添加如上代码,将hdf_led编译进内核[9.3.2]
GPIO的驱动开发驱动配置:HDF框架定义的驱动设备描述和驱动私有配置信息
驱动设备描述:向device_info.hcs添加设备描述在vendor/bearpi/bearpi_hm_micro/hdf_config/device_info/目录下安全边距9.3
GPIO基础控制开发示例基于OpenHarmony的嵌入式开发51platform::host{
hostName="platform_host";
priority=50;
device_led::device{
//led设备节点
device0::deviceNode{
//led驱动的DeviceNode节点
policy=2;
//驱动服务发布的策略
priority=10;
//驱动启动优先级
preload=1;
//驱动按需加载字段
permission=0777;
//驱动创建设备节点权限
moduleName=“HDF_LED”;
//驱动名称必须与moduleName一致
serviceName=“hdf_led”;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 45460-2025钢丝绳在无轴向载荷条件下钢丝绳径向刚度的测定
- 护理课题项目申报书
- 员工价值观与企业使命的契合计划
- 2025年证券从业资格的章节梳理试题及答案
- 银行客户管理与信息系统整合试题及答案
- 2025年税务合规性审查试题及答案
- 项目管理沟通技巧考试题目及答案
- 项目管理伦理与责任探讨试题及答案
- 微生物疫苗研发问题试题及答案
- 行政管理师证书考试实践能力强化试题及答案
- 爱护环境主题班会课件
- 大班游戏活动案例《快乐沙池》
- 糖尿病饮食指导护理
- DB41T 1633-2018 排油烟设施清洗服务规范
- 连续梁线型控制技术交底
- 林业专业知识考试试题及答案
- 高三英语语法填空专项训练100(附答案)及解析
- T-CPQS C017-2024 鉴赏收藏用潮流玩偶衍生产品 树脂类艺术品
- 网络安全众测服务要求
- 《茶学概论》课件
- 肠癌筛查早发现早治疗
评论
0/150
提交评论