diff --git a/zh-cn/device-dev/Readme-CN.md b/zh-cn/device-dev/Readme-CN.md index 9018e58fe98cecd6b4846a1a30b00a15e6cd3b2d..b3c8b1d7af6fe04c94087aa09b47c6086527d35f 100644 --- a/zh-cn/device-dev/Readme-CN.md +++ b/zh-cn/device-dev/Readme-CN.md @@ -97,7 +97,7 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按

开发参考

- + @@ -167,7 +167,7 @@ OpenHarmony也提供了一系列可选的系统组件,方便设备开发者按

开发参考

- + diff --git a/zh-cn/device-dev/faqs/faqs-building.md b/zh-cn/device-dev/faqs/faqs-building.md new file mode 100644 index 0000000000000000000000000000000000000000..21f29b629a556174aab2d14463bd4d9c2cfe8deb --- /dev/null +++ b/zh-cn/device-dev/faqs/faqs-building.md @@ -0,0 +1,245 @@ +# 编译构建子系统常见问题 + +- [轻量和小型系统](#section78686441462) + - [编译构建过程中,提示“usr/sbin/ninja: invalid option -- w”](#section67961431372) + - [编译构建过程中,提示“/usr/bin/ld: cannot find -lncurses”](#section199631617371) + - [编译构建过程中,提示“line 77: mcopy: command not found”](#section937435175) + - [编译构建过程中,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”](#section1115535018713) + - [编译构建过程中,提示“No module named 'Crypto'”](#section17982573813) + - [编译构建过程中,提示“xx.sh : xx unexpected operator”](#section53663205819) + - [编译构建过程中,提示“Could not find a version that satisfies the requirement six\>=1.9.0”](#section1917790845) + - [编译构建过程中,提示找不到“-lgcc”](#section141771701647) + - [编译构建过程中,提示找不到“python”](#section51781202415) + - [编译构建过程中,提示找不到“python3”](#section1917950148) + + +## 轻量和小型系统 + +### 编译构建过程中,提示“usr/sbin/ninja: invalid option -- w” + +- **现象描述:** + + 编译失败,提示“usr/sbin/ninja: invalid option -- w”。 + +- **可能原因:** + + 编译环境中ninja版本太低,不支持--w选项。 + +- **解决办法:** + + 卸载环境中ninja和gn,按照[获取工具](../get-code/gettools-ide.md)。 + + +### 编译构建过程中,提示“/usr/bin/ld: cannot find -lncurses” + +- **现象描述:** + + 编译失败,提示“/usr/bin/ld: cannot find -lncurses”。 + +- **可能原因:** + + 编译环境ncurses库缺失。 + +- **解决办法:** + + ``` + sudo apt-get install lib32ncurses5-dev + ``` + + +### 编译构建过程中,提示“line 77: mcopy: command not found” + +- **现象描述:** + + ​编译失败,提示“line 77: mcopy: command not found”。 + +- **可能原因:** + + 编译环境未安装mcopy。 + +- **解决办法:** + + ``` + ​sudo apt-get install dosfstools mtools + ``` + + +### 编译构建过程中,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory” + +- **现象描述:** + + 编译失败,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”。 + +- ​**可能原因:** + + 当前用户对riscv编译器路径下的文件访问权限不够。 + +- ​**解决办法:** + + 查询gcc\_riscv32所在目录。 + + ``` + which riscv32-unknown-elf-gcc + ``` + + 使用chmod命令修改目录权限为755。 + + +### 编译构建过程中,提示“No module named 'Crypto'” + +- **现象描述:** + + 编译失败,提示“No module named 'Crypto'”。 + +- **可能原因:** + + python3未安装Crypto。 + +- **解决办法:** + 1. 查询Python版本号。 + + ``` + python3 --version + ``` + + 2. 需使用python3.7以上版本,然后安装pycryptodome。 + + ``` + sudo pip3 install pycryptodome + ``` + + + +### 编译构建过程中,提示“xx.sh : xx unexpected operator” + +- **现象描述:** + + 编译失败:“xx.sh \[: xx unexpected operator”。 + +- **可能原因:** + + 编译环境shell不是bash。 + +- **解决办法:** + + ``` + sudo rm -rf /bin/sh + sudo ln -s /bin/bash /bin/sh + ``` + + +### 编译构建过程中,提示“Could not find a version that satisfies the requirement six\>=1.9.0” + +- **现象描述** + + 编译构建过程中出现以下错误: + + ``` + Could not find a version that satisfies the requirement six>=1.9.0 + ``` + + +- **可能原因** + + 环境中未安装合适的“six”。 + + +- **解决办法** + + 方法1:通过命令“pip3 install six”,在线安装。 + + 方法2:离线安装 + + 通过网页[https://pypi.org/project/six/\#files](https://pypi.org/project/six/#files),下载安装包。 + + ![](figures/download-six.png) + + 将源码放置在Linux服务器中,并安装“pip3 install six-1.14.0-py2.py3-none-any.whl”。 + + 完成上述安装后,重新构建。 + + +### 编译构建过程中,提示找不到“-lgcc” + +- **现象描述** + + 编译构建过程中出现以下错误: + + ``` + riscv32-unknown-elf-ld: cannot find -lgcc + ``` + + +- **可能原因** + + 交叉编译器gcc\_riscv32的PATH添加错误,如下,在"bin"后多添加了一个“/”,应该删除。 + + ``` + ~/gcc_riscv32/bin/:/data/toolchain/ + ``` + + +- **解决办法** + + 重新修改gcc\_riscv32的PATH,将多余的“/”删除。 + + ``` + ~/gcc_riscv32/bin:/data/toolchain/ + ``` + + +### 编译构建过程中,提示找不到“python” + +- **现象描述** + + 编译构建过程中出现以下错误: + + ``` + -bash: /usr/bin/python: No such file or directory + ``` + + +- **可能原因**1 + + 没有装python。 + +- **解决办法** + + 请按照[安装Python环境](../quickstart/quickstart-lite-env-setup-linux.md) + +- **可能原因2** + + ![](figures/reason-no-python-soft-link.png) + +- **解决办法** + + usr/bin目录下没有python软链接,请运行以下命令添加软链接: + + ``` + # cd /usr/bin/ + # which python3 + # ln -s /usr/local/bin/python3 python + # python --version + ``` + + 例: + + ![](figures/solution-add-soft-link.png) + + +### 编译构建过程中,提示找不到“python3” + +- **现象描述** + + ![](figures/11.png) + + +- **可能原因** + + 没有装python3。 + +- **解决办法** + + 请按照[安装python](../quick-start/quickstart-lite-env-setup-linux.md)。 + + diff --git a/zh-cn/device-dev/faqs/faqs-burning.md b/zh-cn/device-dev/faqs/faqs-burning.md new file mode 100644 index 0000000000000000000000000000000000000000..a2a469f79234ecec37f21e551f786c5a83a02c87 --- /dev/null +++ b/zh-cn/device-dev/faqs/faqs-burning.md @@ -0,0 +1,133 @@ +# 烧录常见问题 + +- [轻量和小型系统](#section278314413530) + - [烧写选择串口后提示失败](#section18988185615914) + - [烧写失败](#section1370982513317) + - [串口无回显](#section183421944953) + - [Windows电脑与单板网络连接失败](#section1215410450215) + + +## 轻量和小型系统 + +### 烧写选择串口后提示失败 + +- **现象描述** + + 点击烧写并选择串口后,出现Error: Opening COMxx: Access denied。 + + ![](figures/Failed-to-open-the-serial-port.png) + +- **可能原因** + + 串口已经被占用。 + +- **解决办法** + +1. 按图依次选择下拉框,查找带有serial-xx的终端 + + ![](figures/hi3516-checking-whether-the-serial-port-is-used.png) + +2. 点击标号中的垃圾桶图标,关闭串口。 + + ![](figures/hi3516-disabling-the-terminal-using-the-serial-port.png) + +3. 重新点击烧写,选择串口并开始烧写程序 + + ![](figures/hi3516-restarting-burning.png) + + +### 烧写失败 + +- **现象描述** + + 点击烧写并选择串口后,出现无法烧写的情况。 + +- **可能原因** + + 安装IDE插件DevEco后未重启。 + +- **解决方法** + + 重启IDE。 + + +### 串口无回显 + +- **现象描述** + + 串口显示已连接,重启单板后,回车无任何回显。 + +- **可能原因1** + + 串口连接错误。 + +- **解决办法** + + 修改串口号。 + + 请查看设备管理器,确认连接单板的串口与终端中连接串口是否一致,若不一致,请按镜像运行修改串口号。 + + +- **可能原因2** + + 单板U-boot被损坏。 + +- **解决办法** + + 烧写U-boot。 + + 若上述步骤依旧无法连接串口,可能由于单板U-boot损坏,按下述步骤烧写U-boot。 + + +1. 获取引导文件U-boot。 + + >![](../public_sys-resources/icon-notice.gif) **须知:** + >单板的U-boot文件请在开源包中获取: + >Hi3516DV300:device\\hisilicon\\hispark\_taurus\\sdk\_liteos\\uboot\\out\\boot\\u-boot-hi3516dv300.bin + >Hi3518EV300:device\\hisilicon\\hispark\_aries\\sdk\_liteos\\uboot\\out\\boot\\u-boot-hi3518ev300.bin + +2. 根据USB烧写步骤烧写U-boot文件。 + + 按照[Hi3516系列USB烧写步骤](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3516_upload-0000001052148681)/[Hi3518系列USB烧写步骤](https://device.harmonyos.com/cn/docs/ide/user-guides/hi3518_upload-0000001057313128)中描述的USB烧写方法,选择对应单板的U-boot文件进行烧写。 + +3. 烧写完成后,登录串口如下图所示。 + + **图 1** U-boot烧写完成串口显示图 + ![](figures/U-boot烧写完成串口显示图.png "U-boot烧写完成串口显示图") + + +### Windows电脑与单板网络连接失败 + +- **现象描述** + + 点击烧写并选择串口后,无法获取文件。 + + **图 2** 网络不通,Hi3516单板无法获取文件 + ![](figures/网络不通-Hi3516单板无法获取文件.png "网络不通-Hi3516单板无法获取文件") + +- **可能原因** + + 单板网络与Windows电脑不联通。 + + Windows电脑防火墙未允许Visual Studio Code联网。 + +- **解决方法** + +1. 检查网线是否连接。 +2. 点击Windows防火墙。 + + ![](figures/hi3516-network-and-firewall-setting.png) + +3. 点击“允许应用通过防火墙”。 + + ![](figures/hi3516-firewall-and-network-protection.png) + +4. 查找Visual Studio Code应用。 + + ![](figures/hi3516-selecting-the-visual-studio-code-application.png) + +5. 勾选Visual Studio Code的专用和公用网络的访问权限。 + + ![](figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png) + + diff --git a/zh-cn/device-dev/faqs/faqs-environment-building.md b/zh-cn/device-dev/faqs/faqs-environment-building.md new file mode 100644 index 0000000000000000000000000000000000000000..29ff2a322c3980befd1ff7543d5d44e0e220eefa --- /dev/null +++ b/zh-cn/device-dev/faqs/faqs-environment-building.md @@ -0,0 +1,239 @@ +# 环境搭建常见问题 + +- [轻量和小型系统](#section1742119306399) + - [安装hb过程中,出现乱码、段错误](#section36351051193919) + - [安装hb过程中,提示"cannot import 'sysconfig' from 'distutils'"](#section48221013144011) + - [安装hb过程中,提示"module 'platform' has no attribute 'linux\_distribution'"](#section10307193044111) + - [安装hb过程中,提示"Could not find a version that satisfies the requirement ohos-build"](#section8692735427) + - [安装python3过程中,提示“configure: error: no acceptable C compiler found in $PATH”](#section870082884217) + - [安装python3过程中,提示“-bash: make: command not found”](#section198707170455) + - [安装python3过程中,提示“zlib not available”](#section85401445204518) + - [安装python3过程中,提示“No module named '\_ctypes'”](#section12202694460) + - [安装 kconfiglib时,遇到lsb\_release错误](#section5803174135115) + - [Linux编译服务器终端输入不识别的命令时提示“ImportError: No module named apt\_pkg”](#section510820516515) + + +## 轻量和小型系统 + +### 安装hb过程中,出现乱码、段错误 + +- **现象描述** + + 执行“python3 -m pip install --user ohos-build”出现乱码、段错误(segmentation fault)。 + + +- **可能原因** + + pip版本过低。 + +- **解决办法** + + 执行如下命令升级pip。 + + ``` + python3 -m pip install -U pip + ``` + + +### 安装hb过程中,提示"cannot import 'sysconfig' from 'distutils'" + +- **现象描述** + + 执行“python3 -m pip install --user ohos-build”提示"cannot import 'sysconfig' from 'distutils'"。 + + +- **可能原因** + + 缺少distutils模块。 + +- **解决办法** + + 执行如下命令安装。 + + ``` + sudo apt-get install python3.8-distutils + ``` + + +### 安装hb过程中,提示"module 'platform' has no attribute 'linux\_distribution'" + +- **现象描述** + + 执行“python3 -m pip install --user ohos-build”提示"module 'platform' has no attribute 'linux\_distribution'"。 + + +- **可能原因** + + python3 pip安装兼容性问题。 + +- **解决办法** + + 执行如下命令重新安装pip。 + + ``` + sudo apt remove python3-pip + curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py + python get-pip.py + ``` + + +### 安装hb过程中,提示"Could not find a version that satisfies the requirement ohos-build" + +- **现象描述** + + 执行“python3 -m pip install --user ohos-build”提示"Could not find a version that satisfies the requirement ohos-build" + + +- **可能原因** + + 可能是网络环境较差导致的安装失败。 + +- **解决办法** + 1. 请检查网络连接是否正常。如果网络有问题,请修复网络问题后重新安装。 + 2. 若网络正常,请尝试指定临时pypi源的方式安装: + + ``` + python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ohos-build + ``` + + + +### 安装python3过程中,提示“configure: error: no acceptable C compiler found in $PATH” + +- **现象描述** + + 安装python3过程中出现以下错误: + + ``` + configure: error: no acceptable C compiler found in $PATH. See 'config.log' for more details + ``` + +- **可能原因** + + 环境中未安装“gcc”。 + +- **解决办法** + + 1、通过命令“apt-get install gcc”在线安装。 + + 2、完成后,重新安装python3。 + + +### 安装python3过程中,提示“-bash: make: command not found” + +- **现象描述** + + 安装python3过程中出现以下错误: + + ``` + -bash: make: command not found + ``` + +- **可能原因** + + 环境中未安装“make”。 + +- **解决办法** + + 1、通过命令“apt-get install make”在线安装。 + + 2、完成后,重新安装python3。 + + +### 安装python3过程中,提示“zlib not available” + +- **现象描述** + + 安装python3过程中出现以下错误: + + ``` + zipimport.ZipImportError: can't decompress data; zlib not available + ``` + +- **可能原因** + + 环境中未安装“zlib”。 + +- **解决办法** + + 方法1:通过命令“apt-get install zlib”在线安装。 + + 方法2:如果软件源中没有该软件,请从“www.zlib.net”下载版本代码,并离线安装。 + + ![](figures/download-zlib.png) + + 完成下载后,通过以下命令安装: + + ``` + # tar xvf zlib-1.2.11.tar.gz + # cd zlib-1.2.11 + # ./configure + # make && make install + ``` + + 完成后,重新安装python3。 + + +### 安装python3过程中,提示“No module named '\_ctypes'” + +- **现象描述** + + 安装python3过程中出现以下错误: + + ``` + ModuleNotFoundError:No module named ‘_ctypes’ + ``` + + +- **可能原因** + + 环境中未安装“libffi”和“libffi-devel”。 + + +- **解决办法** + + 1、通过命令“apt-get install libffi\* -y”,在线安装。 + + 2、完成后,重新安装python3。 + + +### 安装 kconfiglib时,遇到lsb\_release错误 + +- **现象描述** + + 安装kconfiglib过程中遇到如下错误打印: + + ``` + subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1. + ``` + +- **可能原因** + + lsb\_release模块基于的python版本与现有python版本不一致 + +- **解决办法** + + 执行"find / -name lsb\_release",找到lsb\_release位置并删除,如:"sudo rm -rf /usr/bin/lsb\_release" + + +### Linux编译服务器终端输入不识别的命令时提示“ImportError: No module named apt\_pkg” + +- **现象描述** + + Linux编译服务器终端输入不识别的命令时,提示"ImportError: No module named apt\_pkg" + + +- **可能原因** + + python3 apt安装兼容性问题。 + +- **解决办法** + + 执行如下命令重新安装python3-apt。 + + ``` + sudo apt-get remove python3-apt + sudo apt-get install python3-apt + ``` + + diff --git a/zh-cn/device-dev/faqs/faqs-init.md b/zh-cn/device-dev/faqs/faqs-init.md new file mode 100644 index 0000000000000000000000000000000000000000..fcf83e376c0bd33e4e4e8bdbcffcd24e9df2679a --- /dev/null +++ b/zh-cn/device-dev/faqs/faqs-init.md @@ -0,0 +1,57 @@ +# 启动恢复常见问题 + +- [系统启动过程中打印“parse failed!”错误后停止启动](#section835662214302) +- [系统启动过程未结束就自动重启,如此反复持续](#section3857921143117) +- [参数正确的情况下调用SetParameter/GetParameter返回失败](#section548818116328) + +## 系统启动过程中打印“parse failed!”错误后停止启动 + +**现象描述** + +系统启动过程中,打印“\[Init\] InitReadCfg, parse failed! please check file /etc/init.cfg format.”错误,启动过程停止,如下图所示: + +**图 1** 运行报错图 +![](figures/运行报错图.png "运行报错图") + +**可能原因** + +修改init.cfg文件时,漏掉或多加了逗号或括号等,导致init.cfg文件的json格式被破坏。 + +**解决办法** + +仔细检查init.cfg文件,确保其格式符合json格式要求。 + +## 系统启动过程未结束就自动重启,如此反复持续 + +**现象描述** + +镜像烧写完成后系统启动,启动过程未完成即自动重新启动,如此反复持续。 + +**可能原因** + +被init启动的服务都有一个叫做“importance”的属性(详见[第2章表3](../nottoctopics/zh-cn_topic_0000001062722441.md#table14737791471)[第2章表3](../subsystems/subsys-boot-init.md)描述)。 + +- 当该属性为0时,表示若当前服务进程退出,init不需要重启单板。 +- 当该属性为1时,表示若当前服务进程退出,init需要重启单板。 + +因此出现上述现象的可能原因:有“importance”属性为1的服务在每次启动的过程中都会退出(可能是进程崩溃或出错自动退出),导致init进程自动重启单板。 + +**解决办法** + +1. 需要通过日志确认崩溃或报错退出的服务,并解决其崩溃/报错的问题,然后重新烧写镜像即可。 +2. 也可以将崩溃/报错退出的服务的“importance”属性改为0,然后重新烧写镜像,这样即使其退出,init也不会重启单板。 + +## 参数正确的情况下调用SetParameter/GetParameter返回失败 + +**现象描述** + +在各参数正确的情况下调用SetParameter/GetParameter返回失败。 + +**可能原因** + +程序对SetParameter/GetParameter这两个接口做了权限校验,在各参数正确的情况下调用SetParameter/GetParameter返回操作失败,很有可能是调用者的uid大于1000,没有调用权限。 + +**解决办法** + +无需处理 + diff --git a/zh-cn/device-dev/faqs/faqs-kernel.md b/zh-cn/device-dev/faqs/faqs-kernel.md new file mode 100644 index 0000000000000000000000000000000000000000..42b541cfc09099810af74957dc92f4acbe35a6db --- /dev/null +++ b/zh-cn/device-dev/faqs/faqs-kernel.md @@ -0,0 +1,92 @@ +# 内核常见问题 + +- [基础内核](#section263912372168) + - [LiteOS-A和LiteOS-M内核对外API的差异](#section447571122918) + - [如何分析线程栈溢出](#section8623141711293) + +- [文件系统](#section098519592162) + - [Hi3516开源板以写的模式打开同一个文件失败(LiteOS-A)](#section517972255311) + - [LiteOS内核已支持哪些硬件平台](#section868413518533) + - [LiteOS内核已支持哪几款芯片架构](#section1131661465417) + +- [三方组件](#section971818231178) + - [OpenHarmony已支持哪些三方组件](#section74138185411) + - [在OpenHarmony上使用OpenSSL,出现秘钥长度校验不正确](#section10564614135516) + - [setsockopt是否支持SO\_RCVBUF和SO\_SNDBUF选项](#section2093373215556) + +- [编译链接](#section10955302179) + - [Arm Linux开发的应用程序,OpenHarmony如何在LiteOS-A上运行](#section1164175713557) + - [OpenHarmony在什么系统下编译,使用什么编译器](#section132287223567) + - [LiteOS-M上使用单独编译成静态库的三方组件,出现三方组件中的全局变量值不正确,或调用三方组件的函数后系统卡死](#section15189154225619) + - [LiteOS-A生成目标可执行文件时,提示 use VFP register arguments,xxx.o does not](#section193571012578) + - [clock\_gettime接口获取的时间打印不对](#section8973152015717) + + +## 基础内核 + +### LiteOS-A和LiteOS-M内核对外API的差异 + +基础内核API存在差异,但是LiteOS-A提供标准POSIX接口,LiteOS-M提供标准POSIX和CMSIS接口。如果要支持跨平台,三方适配建议使用POSIX等标准接口。 + +### 如何分析线程栈溢出 + +**问题现象** + +系统异常,提示CURRENT task xxx stack overflow! + +**解决措施** + +1. 创建xxx线程的时候成倍加大栈空间,多次尝试如果问题不复现,则说明任务栈不够,需要调整; +2. 如果成倍加大线程栈,问题依旧复现,则排查xxx线程中是否定义超大数组,或者流程是否存在递归调用; +3. 确认无前述问题,则需要排查是否存在踩内存的情况。 + +## 文件系统 + +### Hi3516开源板以写的模式打开同一个文件失败(LiteOS-A) + +Hi3516开源板使用FAT文件系统,不允许该操作。 + +### LiteOS内核已支持哪些硬件平台 + +开源版本LiteOS-A已支持Hi3516/Hi3518开发板;LiteOS-M已支持Hi3861开发板、STM32F103、野火挑战者STM32F429IGTb、Nucleo\_f767zi等,详细查看kernel/liteos\_m目录下的README\_zh.md文件。 + +### LiteOS内核已支持哪几款芯片架构 + +LiteOS-M已支持risc-v、Cortex-m3\\m4\\m7\\m33、arm9,待支持c-sky、xtensa;LiteOS-A已支持armv7-a,待支持armv8-a,请关注开源社区更新。 + +## 三方组件 + +### OpenHarmony已支持哪些三方组件 + +已提供mbedtls、lwip等开源组件和三方库,可以直接使用;另外提供标准的POSIX接口,可以自行适配。 + +### 在OpenHarmony上使用OpenSSL,出现秘钥长度校验不正确 + +OpenSSL编译选项中要注意架构类型(ARM,X86等)和系统位数(32、64位)是否选择正确。 + +### setsockopt是否支持SO\_RCVBUF和SO\_SNDBUF选项 + +不支持。 + +## 编译链接 + +### Arm Linux开发的应用程序,OpenHarmony如何在LiteOS-A上运行 + +需要用开源版本提供的交叉编译器重新编译应用程序,才可以运行。 + +### OpenHarmony在什么系统下编译,使用什么编译器 + +LiteOS-A在linux环境进行编译,使用LLVM编译器;LiteOS-M在Linux或Windows环境进行编译,使用IAR、Keil、GCC等编译工具。 + +### LiteOS-M上使用单独编译成静态库的三方组件,出现三方组件中的全局变量值不正确,或调用三方组件的函数后系统卡死 + +检查三方组件编译选项中是否有-fPIE -fpie -fPIC -fpic等地址无关编译选项,如果有,则去掉,重新编译成库使用。 + +### LiteOS-A生成目标可执行文件时,提示 use VFP register arguments,xxx.o does not + +请确认xxx.o编译时是否添加-mfloat-abi=xxx -mcpu=xxx -mfpu=xxx编译选项,若没有,则需要添加。 + +### clock\_gettime接口获取的时间打印不对 + +struct timespec结构中tv\_sec为time\_t,而time\_t为long long类型,打印控制符为%lld,请确认实际打印控制符是否正确。 + diff --git a/zh-cn/device-dev/faqs/faqs-overview.md b/zh-cn/device-dev/faqs/faqs-overview.md new file mode 100644 index 0000000000000000000000000000000000000000..999ae770e0739ef59ca3fb355119227b0fee1cc6 --- /dev/null +++ b/zh-cn/device-dev/faqs/faqs-overview.md @@ -0,0 +1,138 @@ +# 常见问题概述 + +- [环境搭建](#section93289248249) + - [轻量和小型系统](#section197234983111) + +- [编译构建子系统](#section18826114693810) + - [轻量和小型系统](#section693410399) + +- [烧录](#section6556741113712) + - [轻量和小型系统](#section1029933713812) + +- [内核](#section13741125564211) + - [基础内核](#section1723365191114) + - [文件系统](#section14523145918136) + - [芯片适配](#section141541939159) + - [三方组件](#section4988163321816) + - [编译链接](#section080219574225) + +- [移植](#section129331824154313) +- [启动恢复](#section83501764443) +- [系统服务](#section19567132114455) + - [公共基础库](#section3214181711465) + - [视觉应用常见问题](#section295651815466) + - [hdc](#section178081876506) + + +常见问题主要用于帮助开发者解决在开发过程中经常出现的一类问题问题。当前提供了如下常见问题供开发者进行查询。 + +## 环境搭建 + +### 轻量和小型系统 + +- [安装hb过程中出现乱码、段错误](faqs-environment-building.md#section36351051193919) +- [安装hb过程中,提示"cannot import 'sysconfig' from 'distutils'"](faqs-environment-building.md#section48221013144011) +- [安装hb过程中,提示"module 'platform' has no attribute 'linux\_distribution'"](faqs-environment-building.md#section8692735427) +- [安装hb过程中,提示"Could not find a version that satisfies the requirement ohos-build"](faqs-environment-building.md#section8692735427) +- [安装python3过程中,提示“configure: error: no acceptable C compiler found in $PATH”](faqs-environment-building.md#section870082884217) +- [安装python3过程中,提示“-bash: make: command not found”](faqs-environment-building.md#section198707170455) +- [安装python3过程中,提示“zlib not available”](faqs-environment-building.md#section85401445204518) +- [安装python3过程中,提示“No module named '\_ctypes'”](faqs-environment-building.md#section12202694460) +- [安装 kconfiglib时,遇到lsb\_release错误](faqs-environment-building.md#section5803174135115) +- [Linux编译服务器终端输入不识别的命令时提示“ImportError: No module named apt\_pkg”](faqs-environment-building.md#section510820516515) + +## 编译构建子系统 + +### 轻量和小型系统 + +- [编译构建过程中,提示“usr/sbin/ninja: invalid option -- w”](faqs-building.md#section67961431372) +- [编译构建过程中,提示“/usr/bin/ld: cannot find -lncurses”](faqs-building.md#section199631617371) +- [编译构建过程中,提示“line 77: mcopy: command not found”](faqs-building.md#section937435175) +- [编译构建过程中,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”](faqs-building.md#section1115535018713) +- [编译构建过程中,提示“No module named 'Crypto'”](faqs-building.md#section17982573813) +- [编译构建过程中,提示“Could not find a version that satisfies the requirement six\>=1.9.0”](faqs-building.md#section1917790845) +- [编译构建过程中,提示“Could not find a version that satisfies the requirement six\>=1.9.0”](faqs-building.md#section1917790845)” +- [编译构建过程中,提示找不到“-lgcc”](faqs-building.md#section141771701647) +- [编译构建过程中,提示找不到“python”](faqs-building.md#section51781202415) +- [编译构建过程中,提示找不到“python3”](faqs-building.md#section1917950148) + +## 烧录 + +### 轻量和小型系统 + +- [烧写选择串口后提示失败](faqs-burning.md#section18988185615914) + +- [烧写失败](faqs-burning.md#section1370982513317) +- [串口无回显](faqs-burning.md#section183421944953) +- [Windows电脑与单板网络连接失败](faqs-burning.md#section1215410450215) + +## 内核 + +### 基础内核 + +- [LiteOS-A和LiteOS-M内核对外API的差异](faqs-kernel.md#section147031836183210) +- [如何分析线程栈溢出](faqs-kernel.md#section0683151131613) + +### 文件系统 + +- [Hi3516开源板以写的模式打开同一个文件失败(LiteOS-A)](faqs-kernel.md#section517972255311) + +### 芯片适配 + +- [LiteOS内核已支持哪些硬件平台](faqs-kernel.md#section868413518533) +- [LiteOS内核已支持哪几款芯片架构](faqs-kernel.md#section1131661465417) + +### 三方组件 + +- [HarmonyOS已支持哪些三方组件](faqs-kernel.md#section74138185411)[OpenHarmony已支持哪些三方组件](faqs-kernel.md#section74138185411) +- [在HarmonyOS上使用OpenSSL,出现秘钥长度校验不正确](faqs-kernel.md#section10564614135516)[在OpenHarmony上使用OpenSSL,出现秘钥长度校验不正确](faqs-kernel.md#section10564614135516) +- [setsockopt是否支持SO\_RCVBUF和SO\_SNDBUF选项](faqs-kernel.md#section2093373215556) + +### 编译链接 + +- [Arm Linux开发的应用程序,如何在LiteOS-A上运行](faqs-kernel.md#section1164175713557) +- [HarmonyOS在什么系统下编译,使用什么编译器](faqs-kernel.md#section132287223567)[OpenHarmony在什么系统下编译,使用什么编译器](faqs-kernel.md#section132287223567) +- [LiteOS-M上使用单独编译成静态库的三方组件,出现三方组件中的全局变量值不正确,或调用三方组件的函数后系统卡死](faqs-kernel.md#section15189154225619) +- [LiteOS-A生成目标可执行文件,提示 use VFP register arguments,xxx.o does not](faqs-kernel.md#section193571012578) +- [clock\_gettime接口获取的时间打印不对](faqs-kernel.md#section8973152015717) + +## 移植 + +- [如何将用户的堆内存挂载进内核](faqs-transplant.md#section21471536184914) + +## 启动恢复 + +- [系统启动过程中打印“parse failed!”错误后停止启动](faqs-init.md#section835662214302) +- [系统启动过程未结束就自动重启,如此反复持续](faqs-init.md#section3857921143117) +- [参数正确的情况下调用SetParameter/GetParameter返回失败](faqs-init.md#section548818116328) + +## 系统服务 + +### 公共基础库 + +- [LiteOS-A内核\(Hi3516、Hi3518平台\)KV存储路径设置错误,导致KV存储运行失败](faqs-system-using.md#section16520347131511) + +### 视觉应用常见问题 + +- [是否存在一个全局变量,所有的页面都可以访问?](faqs-system-using.md#section187297991718) +- [如何获取dom中的元素](faqs-system-using.md#section1833493719175) +- [如何在页面间传值?](faqs-system-using.md#section184283812183) +- [list如何滚动到某个item?](faqs-system-using.md#section11897734131811) +- [text支持多行吗?](faqs-system-using.md#section5872656121814) +- [为什么控件不显示?](faqs-system-using.md#section7397125317107) +- [如何实现页面滑动?](faqs-system-using.md#section338794422010) +- [Left、Top为什么不生效?](faqs-system-using.md#section2597193611217) +- [动态绑定为什么不生效?](faqs-system-using.md#section6939050172115) +- [如何实现相对定位和绝对定位?](faqs-system-using.md#section5547311192215) +- [如何控制控件的显示与隐藏?](faqs-system-using.md#section16107113352213) +- [使用Margin时,有什么注意事项?](faqs-system-using.md#section1524910142314) +- [使用事件订阅时,有什么注意事项?](faqs-system-using.md#section1537132012231) +- [使用动态绑定时,有什么注意事项?](faqs-system-using.md#section96561452236) +- [swiper loop属性如何生效?](faqs-system-using.md#section690166112414) +- [使用数组时,有什么注意事项?](faqs-system-using.md#section1554552822414) + +### hdc + +- [hdc\_std连接不到设备](faqs-system-using.md#section1965012223257) +- [hdc\_std运行不了](faqs-system-using.md#section1157575212515) + diff --git a/zh-cn/device-dev/faqs/faqs-system-using.md b/zh-cn/device-dev/faqs/faqs-system-using.md new file mode 100644 index 0000000000000000000000000000000000000000..a78ff419666cd091e4c647a091f205d8ca65f41c --- /dev/null +++ b/zh-cn/device-dev/faqs/faqs-system-using.md @@ -0,0 +1,211 @@ +# 系统应用常见问题 + +- [公共基础库常见问题](#section639433461512) + - [1.LiteOS-A内核\(Hi3516、Hi3518平台\)KV存储路径设置错误,导致KV存储运行失败](#section16520347131511) + +- [视觉应用常见问题](#section787718474161) + - [是否存在一个全局变量,所有的页面都可以访问?](#section187297991718) + - [如何获取dom中的元素](#section1833493719175) + - [如何在页面间传值?](#section184283812183) + - [list如何滚动到某个item?](#section11897734131811) + - [text支持多行吗?](#section5872656121814) + - [为什么控件不显示?](#section7397125317107) + - [如何实现页面滑动?](#section338794422010) + - [Left、Top为什么不生效?](#section2597193611217) + - [动态绑定为什么不生效?](#section6939050172115) + - [如何实现相对定位和绝对定位?](#section5547311192215) + - [如何控制控件的显示与隐藏?](#section16107113352213) + - [使用Margin时,有什么注意事项?](#section1524910142314) + - [使用事件订阅时,有什么注意事项?](#section1537132012231) + - [使用动态绑定时,有什么注意事项?](#section96561452236) + - [swiper loop属性如何生效?](#section690166112414) + - [使用数组时,有什么注意事项?](#section1554552822414) + +- [hdc类问题](#section412357182518) + - [hdc\_std连接不到设备](#section1965012223257) + - [hdc\_std运行不了](#section1157575212515) + + +## 公共基础库常见问题 + +### 1.LiteOS-A内核\(Hi3516、Hi3518平台\)KV存储路径设置错误,导致KV存储运行失败 + +**现象描述** + +LiteOS-A内核\(Hi3516、Hi3518平台\)直接调用KV存储提供的接口,各参数正常的情况下,编译可执行程序运行失败。 + +**可能原因** + +直接运行编译出的可执行文件,没有将程序基于AbilityKit转换成应用,不能由BMS在应用安装时正确设置应用数据存储路径,导致KV存储运行失败。 + +**解决办法** + +显示调用KV存储的UtilsSetEnv接口,设置数据存储路径。 + +``` +UtilsSetEnv("/storage/com.huawei.kv"); +``` + +## 视觉应用常见问题 + +### 是否存在一个全局变量,所有的页面都可以访问? + +当前框架中不存在所有Page都可以访问的全局变量。 + +### 如何获取dom中的元素 + +如何获取dom中的元素? + +通过ref属性获取dom中的元素,详细示例如下图所示;获取的元素只能使用它的方法,不能改变属性。 + +``` + +
+ + +
+ +/* index.js */ +export default { + data: { + images:[ + {src:"common/frame1.png"}, + {src:"common/frame2.png"}, + {src:"common/frame3.png"} + ] + }, + handleClick(){ + //通过$refs属性获取对应的组件,在hml中,组件的ref属性要设置为animator + const animator = this.$refs.animator; + const state = animator.getState(); + if(state == "paused"){ + animator.resume(); + }else if(state == "stopped"){ + animator.start(); + }else{ + animator.pause(); + } + } +} +``` + +### 如何在页面间传值? + +通过router.replace方法中的params参数来传递,参考代码如下: + +第一个页面传递数据: + +``` +router.replace({ + uri:'pages/detail/detail', //要跳转的页面uri + params:{transferData:this.data} //传递的数据,数据个数和名称开发者自己定义, +}); +``` + +第二个界面接受数据: + +``` +onInit(){ + const data = this.transferData; //在onInit函数中接受传递的数据 +} +``` + +### list如何滚动到某个item? + +通过list的scrollTo方法滚动到指定的item,参数是目标item的index。Index参数可以通过scrollend事件获取或者开发者指定。 + +### text支持多行吗? + +text支持多行。通过回车键换行或者是不设置text的高度属性,由控件自动根据内容换行。 + +### 为什么控件不显示? + +**现象描述** + +开发者在hml文件中添加的控件无法显示 + +**可能原因** + +- 未设置width和height值; +- 样式设置错误。 + +**处理步骤** + +\(1\)检查是否设置width和height值,组件必须显式设置width和height值; + +\(2\)检查组件的样式设置是否正确。 + +### 如何实现页面滑动? + +实现页面滑动目前有三种方式:scroll(根组件大小超过屏幕的大小即自动实现scroll效果)、list、swiper。开发者可以参考开发文档查看三者的区别,并加以使用。 + +### Left、Top为什么不生效? + +除根节点外,Left、Top配合Stack组件使用才有效果。 + +### 动态绑定为什么不生效? + +在进行绑定时,必须先将要绑定的对象或者对象的属性进行定义,不能先绑定后定义 + +### 如何实现相对定位和绝对定位? + +使用div、stack(top left属性)来实现相对和绝对定位。 + +### 如何控制控件的显示与隐藏? + +通过display、show和if来控制控件的显示与隐藏。区别在于:if为false时,组件会从VDOM中移除,而show仅是渲染时不可见,组件依然存在于VDOM中。 + +### 使用Margin时,有什么注意事项? + +Stack组件不支持其子组件设置margin属性。 + +### 使用事件订阅时,有什么注意事项? + +在应用运行期间只存在一个page,所以router.replace跳转是先销毁前一个页面,然后在新创建一个界面。因此,如果涉及到事件订阅的页面,每次页面创建时要进行事件订阅,跳转离开界面前取消事件订阅。 + +### 使用动态绑定时,有什么注意事项? + +过多的动态绑定会消耗较多的内存,若非业务需要,尽量不要使用太多的动态绑定。 + +### swiper loop属性如何生效? + +去掉第一个组件或者去掉最后一个组件,剩余的长度大于swiper长度,loop生效。 + +### 使用数组时,有什么注意事项? + +数组元素不宜过多,尽量避免对大数组进行频繁操作。 + +## hdc类问题 + +### hdc\_std连接不到设备 + +- **现象描述** + + 执行 "hdc\_std list targets"命令后结果为:\[Empty\] + +- **解决方法** + 1. 设备没有被识别: + + 在设备管理器中查看是否有hdc设备,在通用串行总线设备中会有“HDC Device”信息。如果没有,hdc无法连接。此时需要插拔设备,或者烧写最新的镜像。 + + 2. hdc\_std工作异常: + + 可以执行"hdc kill"或者"hdc start -r"杀掉hdc服务或者重启hdc服务,然后再执行hdc list targets查看是否已经可以获取设备信息。 + + 3. hdc\_std与设备不匹配: + + 如果设备烧写的是最新镜像,hdc\_std也需要使用最新版本。由于hdc\_std会持续更新,请从开源仓developtools\_hdc\_standard中获取,具体位置在该开源仓的prebuilt目录。 + + + +### hdc\_std运行不了 + +- **现象描述** + + 点击hdc\_std.exe文件无法运行。 + +- **解决方法** + + hdc\_std.exe不需要安装,直接放到磁盘上就能使用,也可以添加到环境变量中。通过打开cmd执行hdc\_std命令直接使用。 + + diff --git a/zh-cn/device-dev/faqs/faqs-transplant.md b/zh-cn/device-dev/faqs/faqs-transplant.md new file mode 100644 index 0000000000000000000000000000000000000000..b481e63e2f59d021c3ebecb2a4179ea167cf200b --- /dev/null +++ b/zh-cn/device-dev/faqs/faqs-transplant.md @@ -0,0 +1,39 @@ +# 移植常见问题 + +- [如何将用户的堆内存挂载进内核](#section21471536184914) + +## 如何将用户的堆内存挂载进内核 + +- 内核堆内存配置的相关宏如下,用户可根据实际情况,在target\_config.h中配置: + +**表 1** 内核堆内存配置相关宏 + + + + + + + + + + + + + + + + +

宏名称

+

描述

+

LOSCFG_SYS_EXTERNAL_HEAP

+

这个宏决定系统是使用内核的内部堆内存还是用户的堆内存,默认为0(即使用内部的堆内存),大小为0x10000;如果用户需要基于外部的堆内存,那么可以将该宏设置为1。

+

LOSCFG_SYS_HEAP_ADDR

+

内核堆内存的起始地址。

+

LOSCFG_SYS_HEAP_SIZE

+

内核堆内存的大小,即LOSCFG_SYS_HEAP_ADDR指定的内存块大小。

+
+ +- 注意事项: + +指定的堆内存范围务必保证没有其他模块使用,避免踩内存,破坏堆内存功能。 + diff --git a/zh-cn/device-dev/faqs/figures/11.png b/zh-cn/device-dev/faqs/figures/11.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9105c313d5755f140920bbfc2399e3ccb5e2f5 Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/11.png differ diff --git a/zh-cn/device-dev/faqs/figures/Failed-to-open-the-serial-port.png b/zh-cn/device-dev/faqs/figures/Failed-to-open-the-serial-port.png new file mode 100644 index 0000000000000000000000000000000000000000..0eee1bbff2e54816d6be05f7f3972a83f615884d Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/Failed-to-open-the-serial-port.png differ diff --git "a/zh-cn/device-dev/faqs/figures/U-boot\347\203\247\345\206\231\345\256\214\346\210\220\344\270\262\345\217\243\346\230\276\347\244\272\345\233\276.png" "b/zh-cn/device-dev/faqs/figures/U-boot\347\203\247\345\206\231\345\256\214\346\210\220\344\270\262\345\217\243\346\230\276\347\244\272\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..ad4fd618860ca9f79e9bdc39436c3b2f9cdb72de Binary files /dev/null and "b/zh-cn/device-dev/faqs/figures/U-boot\347\203\247\345\206\231\345\256\214\346\210\220\344\270\262\345\217\243\346\230\276\347\244\272\345\233\276.png" differ diff --git a/zh-cn/device-dev/faqs/figures/download-six.png b/zh-cn/device-dev/faqs/figures/download-six.png new file mode 100644 index 0000000000000000000000000000000000000000..39ae26ac8f3254d023d6b90a9f9bb8a8ff0c940b Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/download-six.png differ diff --git a/zh-cn/device-dev/faqs/figures/download-zlib.png b/zh-cn/device-dev/faqs/figures/download-zlib.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7f6f4766c54f6ca1e0057fc8f869785cc63e56 Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/download-zlib.png differ diff --git a/zh-cn/device-dev/faqs/figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png b/zh-cn/device-dev/faqs/figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png new file mode 100644 index 0000000000000000000000000000000000000000..afc9028fbb61db82e6f1384032bb32f56ed2ec35 Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/hi3516-allowing-the-visual-studio-code-application-to-access-the-network.png differ diff --git a/zh-cn/device-dev/faqs/figures/hi3516-checking-whether-the-serial-port-is-used.png b/zh-cn/device-dev/faqs/figures/hi3516-checking-whether-the-serial-port-is-used.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa0ceb21f5a11d459b93721f512309c9d6da2ac Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/hi3516-checking-whether-the-serial-port-is-used.png differ diff --git a/zh-cn/device-dev/faqs/figures/hi3516-disabling-the-terminal-using-the-serial-port.png b/zh-cn/device-dev/faqs/figures/hi3516-disabling-the-terminal-using-the-serial-port.png new file mode 100644 index 0000000000000000000000000000000000000000..0c1f60638087d0fe56127f2f842244355afad85f Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/hi3516-disabling-the-terminal-using-the-serial-port.png differ diff --git a/zh-cn/device-dev/faqs/figures/hi3516-firewall-and-network-protection.png b/zh-cn/device-dev/faqs/figures/hi3516-firewall-and-network-protection.png new file mode 100644 index 0000000000000000000000000000000000000000..775ce6fe99d4894b39f2bdd613097dcaf11a37b2 Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/hi3516-firewall-and-network-protection.png differ diff --git a/zh-cn/device-dev/faqs/figures/hi3516-network-and-firewall-setting.png b/zh-cn/device-dev/faqs/figures/hi3516-network-and-firewall-setting.png new file mode 100644 index 0000000000000000000000000000000000000000..88cba0537b5431aa266364abbe19162130f4e3ca Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/hi3516-network-and-firewall-setting.png differ diff --git a/zh-cn/device-dev/faqs/figures/hi3516-restarting-burning.png b/zh-cn/device-dev/faqs/figures/hi3516-restarting-burning.png new file mode 100644 index 0000000000000000000000000000000000000000..208a4fbace342514f59f0000c4d50f5dc9321f0f Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/hi3516-restarting-burning.png differ diff --git a/zh-cn/device-dev/faqs/figures/hi3516-selecting-the-visual-studio-code-application.png b/zh-cn/device-dev/faqs/figures/hi3516-selecting-the-visual-studio-code-application.png new file mode 100644 index 0000000000000000000000000000000000000000..c735ae362e184083329cdf710289a169ad5625d4 Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/hi3516-selecting-the-visual-studio-code-application.png differ diff --git a/zh-cn/device-dev/faqs/figures/reason-no-python-soft-link.png b/zh-cn/device-dev/faqs/figures/reason-no-python-soft-link.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bc36af5339ea5a4f67640e69836965b3776e17 Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/reason-no-python-soft-link.png differ diff --git a/zh-cn/device-dev/faqs/figures/solution-add-soft-link.png b/zh-cn/device-dev/faqs/figures/solution-add-soft-link.png new file mode 100644 index 0000000000000000000000000000000000000000..9284df45bb1415d84f0325df85b4eb5c223281e8 Binary files /dev/null and b/zh-cn/device-dev/faqs/figures/solution-add-soft-link.png differ diff --git "a/zh-cn/device-dev/faqs/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3516\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" "b/zh-cn/device-dev/faqs/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3516\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..548e03da4b76123cb67d41cbd1de4a0f33f5ef4b Binary files /dev/null and "b/zh-cn/device-dev/faqs/figures/\347\275\221\347\273\234\344\270\215\351\200\232-Hi3516\345\215\225\346\235\277\346\227\240\346\263\225\350\216\267\345\217\226\346\226\207\344\273\266.png" differ diff --git "a/zh-cn/device-dev/faqs/figures/\350\277\220\350\241\214\346\212\245\351\224\231\345\233\276.png" "b/zh-cn/device-dev/faqs/figures/\350\277\220\350\241\214\346\212\245\351\224\231\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..015c38ba5516395527bcf6715535238f02b2bad9 Binary files /dev/null and "b/zh-cn/device-dev/faqs/figures/\350\277\220\350\241\214\346\212\245\351\224\231\345\233\276.png" differ diff --git a/zh-cn/device-dev/faqs/readme.md b/zh-cn/device-dev/faqs/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..4c692840a6c5d7439a02401ffbad9abadc9f4bbc --- /dev/null +++ b/zh-cn/device-dev/faqs/readme.md @@ -0,0 +1,11 @@ +# FAQs + +- [常见问题概述](faqs-overview.md) +- [环境搭建常见问题](faqs-environment-building.md) +- [编译构建子系统常见问题](faqs-building.md) +- [烧录常见问题](faqs-burning.md) +- [内核常见问题](faqs-kernel.md) +- [移植常见问题](faqs-transplant.md) +- [启动恢复常见问题](faqs-init.md) +- [系统应用常见问题](faqs-system-using.md) + diff --git "a/zh-cn/device-dev/get-code/figure/\345\214\205\347\256\241\347\220\206.png" "b/zh-cn/device-dev/get-code/figure/\345\214\205\347\256\241\347\220\206.png" index c0f1a0a961887f540f67e2550c03bc39f5bbcb6a..d98c83b3ead8e863b4db1da755b4e743afd62f46 100644 Binary files "a/zh-cn/device-dev/get-code/figure/\345\214\205\347\256\241\347\220\206.png" and "b/zh-cn/device-dev/get-code/figure/\345\214\205\347\256\241\347\220\206.png" differ diff --git "a/zh-cn/device-dev/get-code/figure/\345\217\221\350\241\214\347\211\210\347\244\272\344\276\213.png" "b/zh-cn/device-dev/get-code/figure/\345\217\221\350\241\214\347\211\210\347\244\272\344\276\213.png" index 49e517a76ad01d207f50374b9599e702e7f7d51c..a4fa09ee58922bc9b182ac688ed4553b211c452c 100644 Binary files "a/zh-cn/device-dev/get-code/figure/\345\217\221\350\241\214\347\211\210\347\244\272\344\276\213.png" and "b/zh-cn/device-dev/get-code/figure/\345\217\221\350\241\214\347\211\210\347\244\272\344\276\213.png" differ diff --git "a/zh-cn/device-dev/get-code/figure/\347\273\204\344\273\266\345\256\232\345\210\266.png" "b/zh-cn/device-dev/get-code/figure/\347\273\204\344\273\266\345\256\232\345\210\266.png" index 6dea0571ab21041f89fbb47f9fa49a7a6da5aee3..889adfe235359b5ab438ff87afb37ef4d1cf2ad9 100644 Binary files "a/zh-cn/device-dev/get-code/figure/\347\273\204\344\273\266\345\256\232\345\210\266.png" and "b/zh-cn/device-dev/get-code/figure/\347\273\204\344\273\266\345\256\232\345\210\266.png" differ diff --git a/zh-cn/device-dev/subsystems/Readme-CN.md b/zh-cn/device-dev/subsystems/Readme-CN.md index 074ff034cb4564739bdc1d9582acf3cb940f4dbc..73a09eb14ca1e80dbfd79c1b91aea1dffb68b78f 100755 --- a/zh-cn/device-dev/subsystems/Readme-CN.md +++ b/zh-cn/device-dev/subsystems/Readme-CN.md @@ -49,6 +49,9 @@ - [开发指导](subsys-application-framework-guide.md) - [开发实例](subsys-application-framework-demo.md) - [OTA升级](subsys-ota-guide.md) +- [电话服务](subsys-tel.md) + - [电话服务概述](subsys-tel-overview.md) + - [电话服务开发指导](subsys-tel-guide.md) - [安全](subsys-security.md) - [概述](subsys-security-overview.md) - [应用验签开发指导](subsys-security-sigverify.md) diff --git "a/zh-cn/device-dev/subsystems/figure/ril-adapter\346\250\241\345\235\227\346\236\266\346\236\204\345\233\276.png" "b/zh-cn/device-dev/subsystems/figure/ril-adapter\346\250\241\345\235\227\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..98917f4562e2a3beabda31362c4ff36ac8526e26 Binary files /dev/null and "b/zh-cn/device-dev/subsystems/figure/ril-adapter\346\250\241\345\235\227\346\236\266\346\236\204\345\233\276.png" differ diff --git a/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001214727595.png b/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001214727595.png new file mode 100644 index 0000000000000000000000000000000000000000..f5648acc87f23979f8078afcb2089ed3f834d3e5 Binary files /dev/null and b/zh-cn/device-dev/subsystems/figure/zh-cn_image_0000001214727595.png differ diff --git "a/zh-cn/device-dev/subsystems/figure/\345\216\273\347\224\265\350\260\203\347\224\250\346\227\266\345\272\217\345\233\276.png" "b/zh-cn/device-dev/subsystems/figure/\345\216\273\347\224\265\350\260\203\347\224\250\346\227\266\345\272\217\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..ca7bf2b79f42c07328a8342fd94b1c67013607c1 Binary files /dev/null and "b/zh-cn/device-dev/subsystems/figure/\345\216\273\347\224\265\350\260\203\347\224\250\346\227\266\345\272\217\345\233\276.png" differ diff --git a/zh-cn/device-dev/subsystems/subsys-build-mini-lite.md b/zh-cn/device-dev/subsystems/subsys-build-mini-lite.md index fea8623f14cd26554d9f26ae6a46e2bad2d1d2c3..25627414eee407cc5bc3533f51949bdc75bf868b 100644 --- a/zh-cn/device-dev/subsystems/subsys-build-mini-lite.md +++ b/zh-cn/device-dev/subsystems/subsys-build-mini-lite.md @@ -18,12 +18,12 @@ - [新增产品解决方案](#section1097623294220) - [常见问题](#section19909721104319) - - [ninja版本问题导致编译失败](#section138233464318) - - [ncurses库缺失导致编译失败](#section151033911442) - - [未安装mcopy导致编译失败](#section19811838104418) - - [权限问题导致编译失败](#section03111118451) - - [未安装Crypto导致编译失败](#section69981127125013) - - [编译环境为shell导致编译失败](#section967617530505) + - [编译构建过程中,提示“usr/sbin/ninja: invalid option -- w”](#section138233464318) + - [编译构建过程中,提示“/usr/bin/ld: cannot find -lncurses”](#section151033911442) + - [编译构建过程中,提示“line 77: mcopy: command not found”](#section19811838104418) + - [编译构建过程中,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”](#section03111118451) + - [编译构建过程中,提示“No module named 'Crypto'”](#section69981127125013) + - [编译构建过程中,提示“xx.sh : xx unexpected operator”](#section967617530505) ## 概述 @@ -37,7 +37,7 @@ ### 基本概念 -在使用编译构建子系统前,应了解如下基本概念: +在使用编译构建子系统前,应了解如下基本概念:s - 子系统 @@ -66,7 +66,7 @@ ``` build/lite ├── components # 组件描述文件 -├── figures # readme中的图片 +├── figure # readme中的图片 ├── hb # hb pip安装包源码 ├── make_rootfs # 文件系统镜像制作脚本 ├── config # 编译配置项 @@ -97,7 +97,7 @@ build/lite 为了实现芯片解决方案、产品解决方案与OpenHarmony是解耦的、可插拔的,组件、芯片解决方案和产品解决方案的路径、目录树和配置需遵循一定的规则,具体如下: -### **组件** +### 组件 组件源码路径命名规则为:**\{领域\}/\{子系统\}/\{组件\}**,组件目录树规则如下: @@ -206,7 +206,7 @@ component } ``` -### **芯片解决方案** +### 芯片解决方案 - 芯片解决方案是指基于某款开发板的完整解决方案,包含驱动、设备侧接口适配、开发板sdk等。 - 芯片解决方案是一个特殊的组件,源码路径规则为:**device/\{芯片解决方案厂商\}/\{开发板\}**。 @@ -244,7 +244,7 @@ board_cxx_flags: 开发板配置的cpp文件编译选项。 board_ld_flags: 开发板配置的链接选项。 ``` -### **产品解决方案** +### 产品解决方案 产品解决方案为基于开发板的完整产品,主要包含产品对OS的适配、组件拼装配置、启动配置和文件系统配置等。产品解决方案的源码路径规则为:**vendor/\{产品解决方案厂商\}/\{产品名称\}**_。_产品解决方案也是一个特殊的组件。 @@ -880,7 +880,7 @@ optional arguments: ## 常见问题 -### ninja版本问题导致编译失败 +### 编译构建过程中,提示“usr/sbin/ninja: invalid option -- w” - **现象描述:** @@ -892,10 +892,10 @@ optional arguments: - **解决办法:** - 卸载环境中ninja和gn,按照HarmonyOS官网[获取工具](../get-code/gettools-ide.md)。 + 卸载环境中ninja和gn,按照[获取工具](../get-code/gettools-ide.md)。 -### ncurses库缺失导致编译失败 +### 编译构建过程中,提示“/usr/bin/ld: cannot find -lncurses” - **现象描述:** @@ -912,7 +912,7 @@ optional arguments: ``` -### 未安装mcopy导致编译失败 +### 编译构建过程中,提示“line 77: mcopy: command not found” - **现象描述:** @@ -929,7 +929,7 @@ optional arguments: ``` -### 权限问题导致编译失败 +### 编译构建过程中,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory” - **现象描述:** @@ -950,7 +950,7 @@ optional arguments: 使用chmod命令修改目录权限为755。 -### 未安装Crypto导致编译失败 +### 编译构建过程中,提示“No module named 'Crypto'” - **现象描述:** @@ -975,7 +975,7 @@ optional arguments: -### 编译环境为shell导致编译失败 +### 编译构建过程中,提示“xx.sh : xx unexpected operator” - **现象描述:** diff --git a/zh-cn/device-dev/subsystems/subsys-tel-guide.md b/zh-cn/device-dev/subsystems/subsys-tel-guide.md new file mode 100644 index 0000000000000000000000000000000000000000..854d11747ab665a1829a2915b13f69de24c8dfeb --- /dev/null +++ b/zh-cn/device-dev/subsystems/subsys-tel-guide.md @@ -0,0 +1,610 @@ +# 电话服务开发指导 + +- [Modem厂商库初始化开发指导](#section211mcpsimp) + - [场景介绍](#section213mcpsimp) + - [接口说明](#section811343241215) + - [开发步骤](#section51031144122) + - [调测验证](#section5351151517132) + +- [Modem业务请求及响应开发指导](#section295mcpsimp) + - [场景介绍](#section297mcpsimp) + - [接口说明](#section9503155219134) + - [开发步骤](#section17190412101414) + - [调测验证](#section10207938171413) + +- [Modem事件上报开发指导](#section390mcpsimp) + - [场景介绍](#section401mcpsimp) + - [接口说明](#section191193791518) + - [开发步骤](#section16394112401512) + - [调测验证](#section16999174401516) + - [开发实例](#section33444350167) + +- [Modem厂商库集成指导](#section590mcpsimp) + - [编译设置](#section592mcpsimp) + - [调测验证](#section620mcpsimp) + + +## Modem厂商库初始化开发指导 + +### 场景介绍 + +Modem厂商库初始化是指在厂商库里实现const HRilOps \*RilInitOps\(const struct HRilReport \*reportOps\)函数,在该函数里处理三个重要的功能: + +- 接收RIL Adapter事件回调的函数指针,当Modem有业务事件上报时,调用对应的函数指针,把事件上报给RIL Adapter。 +- 创建读取Modem设备节点的线程,在该线程里会循环地读取Modem上报的事件,并把接收的Modem信息解析为具体业务相关的事件进行上报。 +- 返回业务请求接口的函数指针给RIL Adapter。 + +### 接口说明 + +Modem厂商库初始化接口。 + +**表 1** Modem厂商库初始化接口功能介绍 + + + + + + + + + + +

接口名

+

描述

+

const HRilOps *RilInitOps(const struct HRilReport * reportOps)

+

接口功能:Modem厂商库运行的入口。

+

参数reportOps:RIL Adapter传入的事件回调函数指针。

+

返回值:业务请求接口的函数指针。

+
+ +### 开发步骤 + +1. RilInitOps接口中设置RIL Adapter传入的事件回调函数指针。 + + ``` + // 定义Modem厂商库回调函数指针 + static struct HRilReport g_reportOps = { + OnCallReport, // 通话相关业务回调函数 + OnDataReport, // 蜂窝数据相关业务回调函数 + OnModemReport, // Modem相关业务回调函数 + OnNetworkReport, // 搜网相关业务回调函数 + OnSimReport, // SIM卡相关业务回调函数 + OnSmsReport // 短信相关业务回调函数 + }; + ``` + + +1. 创建主线程g\_reader,开启消息循环。 + + ``` + pthread_attr_t t; + pthread_attr_init(&t); + pthread_attr_setdetachstate(&t, PTHREAD_CREATE_DETACHED); + ret = pthread_create(&g_reader, &t, ReaderLoop, &t); // 创建线程 + ``` + + +1. 在g\_eventListeners线程用open\(\)打开Modem设备节点,并创建g\_reader线程循环读取处理Modem上报的消息。 + + ``` + g_fd = open(g_devicePath, O_RDWR); // 打开设备节点,入参g_devicePath是Modem设备节点 + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + ret = pthread_create(&g_eventListeners, &attr, EventListeners, NULL); + ``` + + +1. 返回业务请求接口的函数指针。 + + ``` + // call模块业务请求接口结构体 + typedef struct { + // 获取呼叫列表 + void (*GetCallList)(ReqDataInfo *requestInfo, const void *data, size_t dataLen); + // 拨打电话 + void (*Dial)(ReqDataInfo *requestInfo, const void *data, size_t dataLen); + // 挂断电话 + void (*Hangup)(ReqDataInfo *requestInfo, const void *data, size_t dataLen); + // 拒接来电 + void (*Reject)(ReqDataInfo *requestInfo, const void *data, size_t dataLen); + // 接听来电 + void (*Answer)(ReqDataInfo *requestInfo, const void *data, size_t dataLen); + } HRilCallReq; + + // call模块回调函数指针 + static const HRilCallReq g_callReqOps = { + .GetCallList = ReqGetCallList, // 获取呼叫列表接口 + .Dial = ReqDial, // 拨打电话接口 + .Hangup = ReqHangup, // 挂断电话接口 + .Reject = ReqReject, // 拒接来电接口 + .Answer = ReqAnswer, // 接听来电接口 + }; + + // 业务请求结构体 + typedef struct { + const HRilCallReq *callOps; // 通话相关业务请求结构体指针 + const HRilSimReq *simOps; // SIM卡相关业务请求结构体指针 + const HRilSmsReq *smsOps; // 短彩信相关业务请求结构体指针 + const HRilDataReq *dataOps; // 蜂窝数据相关业务请求结构体指针 + const HRilNetworkReq *networkOps; // 搜网相关业务请求结构体指针 + const HRilModemReq *modemOps; // Modem相关业务请求结构体指针 + } HRilOps; + + // 业务请求接口定义 + HRilOps g_hrilOps = { + .callOps = &g_callReqOps, // 定义通话业务请求接口 + .simOps = &g_simReqOps, // 定义SIM卡业务请求接口 + .smsOps = &g_smsReqOps, // 定义短彩信业务请求接口 + .networkOps = &g_networkReqOps, // 定义蜂窝数据业务请求接口 + .dataOps = &g_dataReqOps, // 定义搜网业务请求接口 + .modemOps = &g_modemReqOps, // 定义Modem业务请求接口 + }; + ``` + + +### 调测验证 + +1. 用[hdc\_std工具](subsys-toolchain-hdc-guide.md#section05992022154916)连接调试设备,把编译生成的libril\_vendor.z.so库文件(参见[Modem厂商库集成指导](#section590mcpsimp))通过以下命令推到/system/lib/目录下。 + + ``` + hdc_std file send libril_vendor.z.so /system/lib/ + ``` + +2. 执行hdc\_std shell sync,hdc\_std shell reboot重启设备。 + + ``` + hdc_std shell sync + hdc_std shell reboot + ``` + +3. 执行hdc\_std shell hilog,根据日志查看函数RilInitOps\(\)是否正确执行完成。如下调测验证日志供参考: + + ``` + 01-01 05:13:23.071 136 2319 D 00000/RilAdapterInit: [RilAdapterDispatch-(hril_hdf.c:55)] sbuf IPC obtain test success! + 01-01 05:13:23.071 136 2319 D 00000/RilAdapterInit: [LoadVendor-(hril_hdf.c:33)] RilInit rilInit start + 01-01 05:13:23.071 136 2319 D 00000/RilAdapterInit: [LoadVendor -(hril_hdf.c:45)] RilInit rilInit completed + ``` + + +## Modem业务请求及响应开发指导 + +### 场景介绍 + +Modem业务请求及响应是指RIL Adapter收到电话服务具体业务请求后,调用Modem厂商库初始化获得的函数指针,把具体业务请求发送给厂商库,厂商库根据业务请求ID做相应的业务处理。 + +### 接口说明 + +Modem业务请求及响应接口。 + +**表 2** Modem业务请求及响应接口功能介绍(以拨号功能模块为例) + + + + + + + + + + + + + +

接口名

+

描述

+

void ReqDial(ReqDataInfo *requestInfo, const void *data, size_t dataLen);

+

接口功能:对拨号请求进行处理。

+

参数requestInfo:请求类型信息。

+

参数data:被叫号码信息。

+

参数dataLen:数据长度。

+

返回值:无。

+

void (*OnCallReport)(struct ReportInfo reportInfo, const void *data, size_t dataLen);

+

接口功能:对通话业务执行结果进行响应,即当请求业务执行完成后,Modem将该请求执行的结果上报给RIL Adapter。

+

参数reportInfo:返回类型信息。

+

参数data:返回数据。

+

参数dataLen:数据长度。

+

返回值:无。

+
+ +### 开发步骤 + +1. 在ReqDial\(\)接口中对拨号请求进行处理。 + + ``` + // 拨号请求接口实现 + void ReqDial(ReqDataInfo *requestInfo, const void *data, size_t dataLen) + { + HRilDial *pDial = NULL; + char cmd[MAX_BUFF_SIZE] = {0}; + const char *clir = NULL; + int ret; + int err = HRIL_ERR_SUCCESS; + struct ReportInfo reportInfo = {}; + ResponseInfo *pResponse = NULL; + if (data == NULL) { + TELEPHONY_LOGE("data is null!!!"); + err = HRIL_ERR_INVALID_PARAMETER; + reportInfo = CreateReportInfo(requestInfo, err, HRIL_RESPONSE, 0); + OnCallReport(reportInfo, NULL, 0); + return; + } + pDial = (HRilDial *)data; + switch (pDial->clir) { + case CALL_CLIR_INVOCATION: + clir = "I"; + break; /* invocation */ + case CALL_CLIR_SUPPRESSION: + clir = "i"; + break; /* suppression */ + case CALL_CLIR_SUBSCRIPTION_DEFUALT: + default: + clir = ""; + break; /* subscription default */ + } + (void)sprintf_s(cmd, MAX_BUFF_SIZE, "ATD%s%s;", pDial->address, clir); + ret = SendCommandLock(cmd, NULL, 0, &pResponse); // 发送AT指令 + ...... + } + ``` + +2. 在Modem执行完拨号命令后,调用OnCallReport\(\)回调函数,把该请求执行的结果上报给RIL Adapter。 + + ``` + ret = SendCommandLock(cmd, NULL, 0, &pResponse); + if (ret != 0 || (pResponse != NULL && pResponse->success == 0)) { + TELEPHONY_LOGE("ATD send failed"); + err = HRIL_ERR_GENERIC_FAILURE; + } + reportInfo = CreateReportInfo(requestInfo, err, HRIL_RESPONSE, 0); + OnCallReport(reportInfo, NULL, 0); // 调用通话相关回调函数 + ``` + + +### 调测验证 + +1. 用[hdc\_std工具](subsys-toolchain-hdc-guide.md#section05992022154916)工具连接调试设备,把编译生成的libril\_vendor.z.so库文件通过以下命令推到/system/lib/目录下。 + + ``` + hdc_std file send libril_vendor.z.so /system/lib/ + ``` + +2. 执行hdc\_std shell sync,hdc\_std shell reboot重启设备。 + + ``` + hdc_std shell sync + hdc_std shell reboot + ``` + +3. hdc\_std shell后执行./system/bin/ril\_adapter\_test,输入编号1,根据提示输入电话号码,测试拨打电话功能。 + + ``` + hdc_std shell + # ./system/bin/ril_adapter_test + ----> Test Enter --------->Call--------------------- + + 1----> RilUnitTest::OnRequestCallDialTest + 2----> RilUnitTest:: OnRequestCallHangupTest + 3----> RilUnitTest:: OnRequestCallAnswerTest + 4----> RilUnitTest::OnRequestCallGetCurrentCallsStatusTest + 5----> RilUnitTest::OnRequestRefusedCallTest + + 1 + ``` + +4. 另开一个终端窗口,执行hdc\_std shell hilog,通过日志查看函数ReqDial\(\)是否正确执行完成。如下调测验证日志供参考: + + ``` + 01-01 05:27:27.419 136 408 D 02b01/Rilvendor: [SendCommandLock-(at_support.c:210)] SendCommandLock enter, cmd: ATD17620373527 + 01-01 05:27:27.419 136 408 D 02b01/Rilvendor: [SendCommandLock-(at_support.c:231)] SendCommandLock() command ATD17620373527 + 01-01 05:27:27.419 136 408 D 02b01/Rilvendor: [WriteATCommand-(channel.c:115)] WriteATCommand enter, cmd:ATD17620373527 + 01-01 05:27:27.421 136 187 D 02b01/Rilvendor: [ReadResponse-(channel.c:94)] g_bufferCur : + 01-01 05:27:27.421 136 187 D 02b01/Rilvendor: OK + 01-01 05:27:27.422 136 187 D 02b01/Rilvendor: [ProcessResponse-(at_support.c:144)] processLine line = OK + 01-01 05:27:27.422 136 187 D 02b01/Rilvendor: [ReadResponse-(channel.c:81)] ReadResponse enter + 01-01 05:27:27.422 136 187 D 02b01/Rilvendor: [ProcessLastResponse-(channel.c:37)] last data more than one line , FindEndOfLine g_bufferCur: + 01-01 05:27:27.422 136 187 E 02b01/Rilvendor: [ProcessLastResponse-(channel.c:39)] g_bufferCur endLine is null + 01-01 05:27:27.422 136 187 E 02b01/Rilvendor:^ORIG:1,0 + 01-01 05:27:27.422 136 408 E 02b01/Rilvendor: [SendCommandLock-(at_support.c:234)] processLine line = ^ORIG:1,0 + 01-01 05:27:27.422 136 408 E 02b01/Rilvendor: [SendCommandLock-(vendor_report.c:234)] enter to [^ORIG:1,0]:(null) + 01-01 05:27:27.422 136 408 E 02b01/Rilvendor: [SendCommandLock-(at_support.c:264)] err = 0, cmd:ADT17620373527 + ``` + + +## Modem事件上报开发指导 + +### 场景介绍 + +Modem事件上报是指在厂商库的Modem设备节点读取线程,循环读取到Modem主动上报的消息后,对Modem上报事件进行解析,然后上报给RIL Adapter。 + +### 接口说明 + +Modem事件上报接口。 + +**表 3** Modem事件上报接口功能介绍 + + + + + + + + + + +

接口名

+

描述

+

void OnNotifyOps(const char *s, const char *smsPdu)

+

接口功能:对Modem上报的事件进行分发处理。

+

参数s:AT指令前缀。

+

参数smsPdu:短信PDU信息。

+

返回值:无。

+
+ +### 开发步骤 + +1. 在Modem设备节点读取线程g\_reader里调用OnNotifyOps\(\)解析具体的Modem上报事件,判断命令类型,并调用OnXxxReport\(\)把解析得到的各模块事件上报给hril业务层。 + + ``` + // 将Modem上报数据解析为对应模块的主动上报事件 + void OnNotifyOps(const char *s, const char *smsPdu) + { + int ret = 0; + struct ReportInfo reportInfo = {0}; + reportInfo.error = HRIL_ERR_SUCCESS; + reportInfo.type = HRIL_NOTIFICATION; + if (GetRadioState() == HRIL_RADIO_POWER_STATE_UNAVAILABLE) { + return; + } + TELEPHONY_LOGD("enter to [%{public}s]:%{public}s", s, smsPdu); + // 通过AT指令判断主动上报命令类型 + if (ReportStrWith(s, "+CRING:") || ReportStrWith(s, "RING") || ReportStrWith(s, "IRING") || + ReportStrWith(s, "NO CARRIER") || ReportStrWith(s, "+CCWA") || ReportStrWith(s, "^CCALLSTATE") || + ReportStrWith(s, "^CEND") || ReportStrWith(s, "^CCWA")) { + reportInfo.notifyId = HNOTI_CALL_STATE_UPDATED; + OnCallReport(reportInfo, NULL, 0); + } else if (ReportStrWith(s, "+CMT:")) { + reportInfo.notifyId = HNOTI_SMS_NEW_SMS; + OnSmsReport(reportInfo, (void *)smsPdu, strlen(smsPdu)); + } + // 将各模块事件上报给hril业务层 + ...... + } + ``` + + +1. hril业务层将上报事件分发给Telephony Service。 + + ``` + // 呼叫状态主动上报 + int32_t HRilCall::CallStateUpdated( + int32_t slotId, int32_t notifyType, const HRilErrno e, const void *response, size_t responseLen) + { + struct HdfSBuf *dataSbuf = HdfSBufTypedObtain(SBUF_IPC); + if (serviceCallbackNotify_ == nullptr) { + TELEPHONY_LOGE("RilAdapter serviceCallbackNotify_ is null"); + HdfSBufRecycle(dataSbuf); + return HDF_FAILURE; + } + // 分发处理 + int32_t ret = serviceCallbackNotify_->dispatcher->Dispatch( + serviceCallbackNotify_, HNOTI_CALL_STATE_UPDATED, dataSbuf, nullptr); + if (ret != HDF_SUCCESS) { + HdfSBufRecycle(dataSbuf); + return HDF_FAILURE; + } + HdfSBufRecycle(dataSbuf); + return HDF_SUCCESS; + } + ``` + + +### 调测验证 + +1. 用[hdc\_std工具](subsys-toolchain-hdc-guide.md#section05992022154916)工具连接调试设备,把编译生成的libril\_vendor.z.so库文件通过以下命令推到/system/lib/目录下。 + + ``` + hdc_std file send libril_vendor.z.so /system/lib/ + ``` + +2. 执行hdc\_std shell sync,hdc\_std shell reboot重启设备。 + + ``` + hdc_std shell sync + hdc_std shell reboot + ``` + +3. hdc\_std shell后执行./system/bin/ril\_adapter\_test,输入编号1,根据提示输入电话号码,测试拨打电话功能。 + + ``` + hdc_std shell + # ./system/bin/ril_adapter_test + ----> Test Enter --------->Call--------------------- + + 1----> RilUnitTest::OnRequestCallDialTest + 2----> RilUnitTest:: OnRequestCallHangupTest + 3----> RilUnitTest:: OnRequestCallAnswerTest + 4----> RilUnitTest::OnRequestCallGetCurrentCallsStatusTest + 5----> RilUnitTest::OnRequestRefusedCallTest + + 1 + ``` + +4. 另开一个终端窗口,执行hdc\_std shell hilog,通过日志查看函数OnNotifyOps\(\)是否正确执行完成。如下调测验证日志供参考: + + ``` + 01-01 00:08:01.334 546 551 D 02b01/TelRilTest: [DialResponse-(tel_ril_call.cpp:280)] DialResponse --> radioResponseInfo->serial:2, radioResponseInfo->error:0 + 01-01 00:08:01.334 546 557 D 02b01/TelRilTest: [ProcessEvent-(tel_ril_test.cpp:1262)] TelRilTest::DemoHandler::ProcessEvent --> eventId:101 + 01-01 00:08:01.334 143 512 D 02b01/Rilvendor: [ReadResponse-(channel.c:93)] g_bufferCur : + 01-01 00:08:01.334 143 512 D 02b01/Rilvendor: ^ORIG:1,0 + 01-01 00:08:01.334 143 512 D 02b01/Rilvendor: [ReadResponse-(channel.c:108)] AT< ^ORIG:1,0 + 01-01 00:08:01.334 143 512 D 02b01/Rilvendor: [ProcessResponse-(at_support.c:137)] processLine line = ^ORIG:1,0 + 01-01 00:08:01.334 143 512 D 02b01/Rilvendor: [OnNotifyOps-(vendor_report.c:126)] enter to [^ORIG:1,0]:(null) + 01-01 00:08:01.335 143 512 W 02b01/Rilvendor: [OnNotifyOps-(vendor_report.c:167)] enter to is unrecognized command: ^ORIG:1,0 + 01-01 00:08:01.335 143 512 D 02b01/Rilvendor: [ProcessLastResponse-(channel.c:37)] last data more than one line , FindEndOfLine g_bufferCur: + 01-01 00:08:01.335 143 512 E 02b01/Rilvendor: [ProcessLastResponse-(channel.c:39)] g_bufferCur endLine is null + 01-01 00:08:01.336 143 512 D 02b01/Rilvendor: [ReadResponse-(channel.c:93)] g_bufferCur : + 01-01 00:08:01.336 143 512 D 02b01/Rilvendor: ^CCALLSTATE: 1,0,1 + 01-01 00:08:01.336 143 512 D 02b01/Rilvendor: [ReadResponse-(channel.c:108)] AT< ^CCALLSTATE: 1,0,1 + 01-01 00:08:01.336 143 512 D 02b01/Rilvendor: [ProcessResponse-(at_support.c:137)] processLine line = ^CCALLSTATE: 1,0,1 + 01-01 00:08:01.336 143 512 D 02b01/Rilvendor: [OnNotifyOps-(vendor_report.c:126)] enter to [^CCALLSTATE: 1,0,1]:(null) + 01-01 00:08:01.336 546 551 D 02b01/CoreService: [OnRemoteRequest-(tel_ril_manager.cpp:80)] RilManager OnRemoteRequest code:1001 + 01-01 00:08:01.336 546 551 D 02b01/CoreService: [NotifyObserver-(observer_handler.cpp:76)] handler->SendEvent:8 + ``` + + +### 开发实例 + +- **去电开发实例** + + 去电的调用流程示例如下图所示: + + **图 1** 去电调用时序图 + ![](figure/去电调用时序图.png "去电调用时序图") + + 当应用触发去电动作时,RIL Adapter会接收到拨打电话的请求,hril调用对应的拨打电话的接口ReqDial\(\)。在该接口里会把电话服务传过来的数据封装为对应的AT指令发送到Modem,Modem执行完拨号命令后通过OnCallReport\(\)接口把响应结果上报给RIL Adapter。 + + ``` + // call模块回调函数指针 + static const HRilCallReq g_callReqOps = { + .GetCallList = ReqGetCallList, // 获取呼叫列表接口 + .Dial = ReqDial, // 拨打电话接口 + .Hangup = ReqHangup, // 挂断电话接口 + .Reject = ReqReject, // 拒接来电接口 + .Answer = ReqAnswer, // 接听来电接口 + }; + + // 系统业务请求接口定义 + HRilOps g_hrilOps = { + .callOps = &g_callReqOps, // 定义通话业务请求接口 + .simOps = &g_simReqOps, // 定义SIM卡业务请求接口 + .smsOps = &g_smsReqOps, // 定义短彩信业务请求接口 + .networkOps = &g_networkReqOps, // 定义蜂窝数据业务请求接口 + .dataOps = &g_dataReqOps, // 定义搜网业务请求接口 + .modemOps = &g_modemReqOps, // 定义Modem业务请求接口 + }; + + // 拨号请求接口实现 + void ReqDial(ReqDataInfo *requestInfo, const void *data, size_t dataLen) + { + HRilDial *pDial = NULL; + char cmd[MAX_BUFF_SIZE] = {0}; + const char *clir = NULL; + int ret; + int err = HRIL_ERR_SUCCESS; + struct ReportInfo reportInfo = {}; + ResponseInfo *pResponse = NULL; + if (data == NULL) { + TELEPHONY_LOGE("data is null!!!"); + err = HRIL_ERR_INVALID_PARAMETER; + reportInfo = CreateReportInfo(requestInfo, err, HRIL_RESPONSE, 0); + OnCallReport(reportInfo, NULL, 0); + return; + } + pDial = (HRilDial *)data; + switch (pDial->clir) { + case CALL_CLIR_INVOCATION: + clir = "I"; + break; /* invocation */ + case CALL_CLIR_SUPPRESSION: + clir = "i"; + break; /* suppression */ + case CALL_CLIR_SUBSCRIPTION_DEFUALT: + default: + clir = ""; + break; /* subscription default */ + } + (void)sprintf_s(cmd, MAX_BUFF_SIZE, "ATD%s%s;", pDial->address, clir); + ret = SendCommandLock(cmd, NULL, 0, &pResponse); // 发送AT命令 + if (ret != 0) { + err = HRIL_ERR_CMD_SEND_FAILURE; + TELEPHONY_LOGE("ATD send failed"); + } else { + if (pResponse != NULL && pResponse->success == 0) { + TELEPHONY_LOGE("ReqDial return ERROR"); + err = HRIL_ERR_CMD_NO_CARRIER; + } + } + reportInfo = CreateReportInfo(requestInfo, err, HRIL_RESPONSE, 0); + OnCallReport(reportInfo, NULL, 0); // 调用通话相关业务回调函数 + FreeResponseInfo(pResponse); + } + ``` + + +- **来电开发实例** + + 来电的调用流程示例如下图所示: + + **图 2** 来电调用时序图 + + + ![](figure/zh-cn_image_0000001214727595.png) + + Modem设备节点读取线程g\_reader会循环读取Modem上报的消息,当Modem接收到来电时会主动上报来电相关的信息; + + 当该线程通过调用OnNotifyOps\(\)解析到Modem上报的数据是以"+CRING"、"RING"等字符开头时,表示有来电事件,然后通过OnCallReport\(reportInfo, NULL, 0\)上报给RIL Adapter完成来电事件上报。 + + ``` + // 将Modem上报数据解析为对应模块的主动上报事件 + void OnNotifyOps(const char *s, const char *smsPdu) + { + int ret = 0; + struct ReportInfo reportInfo = {0}; + reportInfo.error = HRIL_ERR_SUCCESS; + reportInfo.type = HRIL_NOTIFICATION; + if (GetRadioState() == HRIL_RADIO_POWER_STATE_UNAVAILABLE) { + return; + } + TELEPHONY_LOGD("enter to [%{public}s]:%{public}s", s, smsPdu); + // 通过AT指令判断主动上报命令类型 + if (ReportStrWith(s, "+CRING:") || ReportStrWith(s, "RING") || ReportStrWith(s, "IRING") || + ReportStrWith(s, "NO CARRIER") || ReportStrWith(s, "+CCWA") || ReportStrWith(s, "^CCALLSTATE") || + ReportStrWith(s, "^CEND") || ReportStrWith(s, "^CCWA")) { + reportInfo.notifyId = HNOTI_CALL_STATE_UPDATED; + OnCallReport(reportInfo, NULL, 0); // 调用通话相关业务回调函数 + } else if (ReportStrWith(s, "+CMT:")) { + reportInfo.notifyId = HNOTI_SMS_NEW_SMS; + OnSmsReport(reportInfo, (void *)smsPdu, strlen(smsPdu)); + } + // add your codes + ...... + } + ``` + + +## Modem厂商库集成指导 + +### 编译设置 + +Modem厂商库可通过BUILD.gn编译为一个动态库,在RIL Adapter启动时用dlopen方式加载到系统中,然后执行厂商库的初始化操作(参见[Modem厂商库初始化开发指导](#section211mcpsimp)),BUILD.gn编写示例如下: + +``` +import("//build/ohos.gni") +RIL_ADAPTER = "//base/telephony" +ohos_shared_library("ril_vendor") { // Modem厂商库名称 + sources = [ // 编译源文件 + "at_call.c", + "at_data.c", + "xxx.c", + ] + include_dirs = [ // 包含的头文件目录 + "$RIL_ADAPTER/ril_adapter/vendor/include", + "$RIL_ADAPTER/ril_adapter/interfaces/innerkits", + "include", + ] + deps = [ // 内部依赖 + "//drivers/adapter/uhdf2/osal:libhdf_utils", + "//base/telephony/core_service/utils:libtelephony_common", + ] + external_deps = [ "hilog:libhilog" ] // 外部依赖 + + part_name = "ril_adapter" // 部件名称 + subsystem_name = "telephony" // 子系统名称 +} +``` + +### 调测验证 + +1. 编译代码。 +2. 查看/out/ohos-arm-release/telephony/ril\_adapter目录是否存在libril\_vendor.z.so,存在证明集成成功。否则检查代码,重新编译验证。 + diff --git a/zh-cn/device-dev/subsystems/subsys-tel-overview.md b/zh-cn/device-dev/subsystems/subsys-tel-overview.md new file mode 100644 index 0000000000000000000000000000000000000000..596f0cc00906fd0b5004144acb7d7612aefb7fc7 --- /dev/null +++ b/zh-cn/device-dev/subsystems/subsys-tel-overview.md @@ -0,0 +1,42 @@ +# 电话服务概述 + +- [概述](#section184mcpsimp) +- [基本概念](#section187mcpsimp) +- [运作机制](#section194mcpsimp) +- [约束与限制](#section205mcpsimp) + +## 概述 + +本指南简要介绍了Modem厂商库的集成、初始化、业务请求响应和事件上报的方法,并通过通话业务的具体开发实例呈现厂商库的适配开发过程,供不同Modem芯片的开发者参考,从而帮助其高效地实现电话相关业务功能的开发。 + +## 基本概念 + +- Telephony Service:电话服务子系统核心服务层。主要功能是初始化RIL管理类、SIM卡和搜网模块;获取RIL Adapter服务,通过注册回调服务,实现与RIL Adapter的通信功能;通过发布订阅,来实现与通话、短信等功能模块之间的通信。 +- RIL Adapter:电话服务子系统RIL适配层。该层主要包括厂商库加载,业务接口实现。用于屏蔽不同Modem厂商的硬件差异,为上层提供统一的接口,通过注册HDF服务与上层接口通信。 +- HDF:硬件驱动框架(Hardware Driver Foundation)。用于提供统一外设访问能力和驱动开发、管理框架。 +- hdc\_std:OpenHarmony设备连接器(OpenHarmony Device Connector)。是OpenHarmony为开发人员提供的用于设备连接调试的命令行工具。 + +## 运作机制 + +**图 1** RIL Adapter模块架构图 + + +![](figure/ril-adapter模块架构图.png) + +RIL Adapter模块架构如图1所示,内部主要分为hril\_hdf、hril和vendorlib三层。 + +- hril\_hdf:RIL Adapter的唯一入口,主要负责Modem厂商库的加载。其中,modem\_adapter实现了单一固件对不同Modem的适配。 + + 其实现机制为:在加载Modem厂商库之前,从kernel获取Modem的设备型号,根据此型号加载对应的Modem厂商库。 + +- hril:OpenHarmony无线接口层(OpenHarmony Radio Interface Layer)。与Telephony Service交互的接口实现部分,实现了Telephony Service和vendorlib通信的功能,包括SIM卡、搜网、蜂窝数据、蜂窝通话和短彩信等。 +- vendorlib:Modem厂商库文件。不同的Modem厂商根据RIL Adapter提供的标准化接口或ID,进行Modem厂商库的开发(vendorlib由Modem厂商提供)。 + +hril\_hdf执行后,将动态加载vendorlib,vendorlib可以从hril\_hdf中获取处理响应和上报的函数指针,该过程结束后,hril\_hdf才可通过vendorlib与Modem通信。 + +## 约束与限制 + +**规格限制:** + +需要设备厂商至少支持一个Modem,如果不支持任何Modem,无需实现厂商库接口。 + diff --git a/zh-cn/device-dev/subsystems/subsys-tel.md b/zh-cn/device-dev/subsystems/subsys-tel.md new file mode 100644 index 0000000000000000000000000000000000000000..850029b583cd695cce8f07dcabd7c550e6f163f7 --- /dev/null +++ b/zh-cn/device-dev/subsystems/subsys-tel.md @@ -0,0 +1,7 @@ +# 电话服务 + +- **[电话服务概述](subsys-tel-overview.md)** + +- **[电话服务开发指导](subsys-tel-guide.md)** + + diff --git a/zh-cn/device-dev/subsystems/subsys.md b/zh-cn/device-dev/subsystems/subsys.md index 9cb0761bcd3d9947979827040ebcd13ec1e92ed0..aa174c8457746cf5e552bff26c572d36ab402f3b 100644 --- a/zh-cn/device-dev/subsystems/subsys.md +++ b/zh-cn/device-dev/subsystems/subsys.md @@ -1,33 +1,20 @@ # 子系统 - **[编译构建](subsys-build.md)** - - **[分布式远程启动](subsys-remote-start.md)** - - **[图形图像](subsys-graphics.md)** - - **[媒体](subsys-multimedia.md)** - - **[公共基础](subsys-utils.md)** - - **[AI框架](subsys-aiframework.md)** - - **[Sensor服务](subsys-sensor.md)** - - **[用户程序框架](subsys-application-framework.md)** - - **[OTA升级](subsys-ota-guide.md)** - +- **[电话服务](subsys-tel.md)** - **[安全](subsys-security.md)** - - **[启动恢复](subsys-boot.md)** - - **[测试用例开发指导](subsys-testguide-test.md)** - - **[DFX](subsys-dfx.md)** - - **[研发工具链](subsys-toolchain.md)** - - **[XTS认证用例开发指导](subsys-xts-guide.md)** diff --git a/zh-cn/readme.md b/zh-cn/readme.md index 4038130e3746c8f166c859dff796693991cc245c..fe7e34ef529a267b8eba54f2a90b9cbacad10b52 100644 --- a/zh-cn/readme.md +++ b/zh-cn/readme.md @@ -4,9 +4,9 @@ ## **文档目录结构** -- [Openharmony概述](OpenHarmony-Overview_zh.md) -- 轻量和小型系统开发指导(参考内存<128MB) - - 设备开发 +- [Openharmony概述](OpenHarmony-Overview_zh.md) +- 设备开发 + - 轻量和小型系统开发指导(参考内存<128MB) - overview:[设备开发导读](device-dev/Readme-CN.md) - quick-start:[快速入门](device-dev/quick-start/Readme-CN.md)(搭建环境、获取源码、编译、烧录等) - Basic Capability:开发基础能力 @@ -31,8 +31,7 @@ - [HPM Bundle开发指南](device-dev/bundles/bundles-guide.md) - [HPM Bundle开发示例](device-dev/bundles/bundles-demo.md) -- 标准系统开发指导(参考内存≥128MB) - - 设备开发 + - 标准系统开发指导(参考内存≥128MB) - overview:[设备开发导读](device-dev/Readme-CN.md) - quick-start:[快速入门](device-dev/quick-start/quickstart-standard.md)(搭建环境、获取源码、编译、烧录等) - Basic Capability:开发基础能力 @@ -54,6 +53,7 @@ - [HPM Bundle开发规范](device-dev/bundles/oem_bundle_standard_des.md) - [HPM Bundle开发指南](device-dev/bundles/bundles-guide.md) - [HPM Bundle开发示例](device-dev/bundles/bundles-demo.md) + - [常见问题](device-dev/FAQs/Readme.md) - 应用开发 @@ -63,7 +63,6 @@ - media:[媒体](application-dev/media/Readme-CN.md) - connectivity:[网络与连接](application-dev/connectivity/Readme-CN.md) - js-reference:[JS参考规范](application-dev/js-reference/Readme-CN.md) - - 许可证及版权信息检查工具:[开源合规审查工具](https://gitee.com/openharmony-sig/tools_oat) - glossary:[术语](device-dev/glossary/glossary.md)