Difference between revisions of "APITestPage"
(updated by API) |
(updated by API) |
||
Line 1: | Line 1: | ||
− | + | [[Android Hardware Programming for RK3399|English]] | |
− | == | + | ==简介== |
− | + | 友善电子开发了一个名为libfriendlyarm-hardware.so的函数库,用于Android应用程序访问开发板上的硬件资源,该函数库基于Android-NDK技术开发,提供便利的硬件访问接口,开发者无需掌握过多的嵌入式知识便可使用,有效提高开发进度。<br /><br /> | |
− | + | 本篇文章仅适用于RK3399开发板,包括 NanoPi-NEO4, NanoPi-M4 和 NanoPC-T4。<br /> | |
− | + | 其他平台也有相应的支持,请移步这里查看:[[Android Hardware Access APIs/zh]] | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ==支持如下RK3399官方Android BSP== | |
− | + | * Android 7.1.2 | |
− | + | * Android 8.1 | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ==支持如下RK3399硬件资源== | |
− | + | * Serial Port | |
− | + | * GPIO | |
− | + | * ADC | |
− | + | * PWM | |
− | + | * I2C | |
− | + | * RTC | |
− | + | * Watch dog | |
− | + | * SPI | |
− | + | 等等, 接口包括I2C, SPI, GPIO常用的接口。<br /> | |
− | + | [[File:NanoPC-T4+OLED.jpg|frameless|450px|Smart4418SDK+OLED]] | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | || | + | |
− | + | ||
− | + | ||
− | + | ||
− | | | + | |
− | + | ==支持的开发板== | |
− | + | * NanoPi-NEO4 | |
− | + | * NanoPi-M4 | |
− | + | * NanoPC-T4 | |
− | + | * 其他开发板请移步这里查看:[[Android Hardware Access APIs/zh]] | |
− | + | ||
− | + | ==开源Android示例== | |
− | + | 所有硬件访问的示例程序均已集成到 Android 的源代码当中,位于 Android7.1.2 和 Android8.1 源代码的以下目录:vendor/friendlyelec/apps,也可以单独网上下载,下表中列出各个 Demo 的源代码地址: | |
− | + | {{libfriendlyarm-hardware.so Android8 Demos}} | |
− | + | {{libfriendlyarm-hardware.so Android7 Demos}} | |
− | + | {{libfriendlyarm-hardware.so Installation Guide/zh}} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
+ | ==RK3399平台Android硬件资源的程序访问== | ||
+ | ===Serial Port=== | ||
+ | 目前可用的串口是UART4,设备名称为/dev/ttyS4,其他串口资源如下表所示,你也可以使用USB转串口来扩展: | ||
+ | ::{| class="wikitable" | ||
|- | |- | ||
− | | | + | |串口设备 || 串口资源占用情况 |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | || | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | + | |UART0 || 已被蓝牙占用 | |
|- | |- | ||
− | | | + | |UART1 || 已被千兆以太网占用 |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | || | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | + | |UART2 || 已被作为调试串口 | |
|- | |- | ||
− | | | + | |UART3 || 已被千兆以太网占用 |
− | + | ||
− | + | ||
− | + | ||
− | || | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
+ | |UART4 || 空闲,设备名称为 /dev/ttyS4 (注:需使用20180618之后的ROM) | ||
+ | |} | ||
− | + | Android硬件库为串口API: | |
− | + | ||
− | + | ||
− | + | ||
::{| class="wikitable" | ::{| class="wikitable" | ||
|- | |- | ||
− | | style="background: PaleTurquoise; color: black" | '''接口名称''' | + | | style="background: PaleTurquoise; color: black" | '''接口名称''' |
− | | style="background: PaleTurquoise; color: black" |'''参数与返回值说明''' | + | | style="background: PaleTurquoise; color: black" |'''参数与返回值说明''' |
| style="background: PaleTurquoise; color: black" |'''功能说明''' | | style="background: PaleTurquoise; color: black" |'''功能说明''' | ||
|- | |- | ||
Line 155: | Line 62: | ||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
int openSerialPortEx( | int openSerialPortEx( | ||
− | String devName, | + | String devName, |
long baud, | long baud, | ||
int dataBits, | int dataBits, | ||
Line 165: | Line 72: | ||
|| | || | ||
参数说明:<br /> | 参数说明:<br /> | ||
− | devName: | + | devName: 串口设备文件名,可选的值有:<br /> |
+ | /dev/ttyS4<br /> | ||
baud: 波特率 <br /> | baud: 波特率 <br /> | ||
dataBits: 数据位 (取值 5~8,一般用8 )<br /> | dataBits: 数据位 (取值 5~8,一般用8 )<br /> | ||
Line 177: | Line 85: | ||
|- | |- | ||
|} | |} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | 串口的读写使用以下通用接口: | |
− | + | <syntaxhighlight lang="c"> | |
− | + | HardwareControler.select //轮询串口是否有数据可写或可读 | |
− | + | HardwareControler.read //读取串口数据 | |
− | + | HardwareControler.write //写数据到串口 | |
− | + | HardwareControler.close //关闭设备 | |
− | + | ||
− | + | ||
− | + | ||
− | <syntaxhighlight lang=" | + | |
− | + | ||
− | + | ||
− | + | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | ===GPIO=== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | === | + | ===ADC=== |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ===PWM=== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | === | + | ===I2C=== |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ===RTC=== | |
− | + | 可以直接使用cat和echo操作/sys/class/rtc/rtc0/下面的接口。 | |
− | <syntaxhighlight lang=" | + | 比如查看当前RTC的日期和时间: |
− | + | <syntaxhighlight lang="bash"> | |
+ | cat /sys/class/rtc/rtc0/date | ||
+ | # 2018-10-20 | ||
+ | cat /sys/class/rtc/rtc0/time | ||
+ | # 08:20:14 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | 设置开机时间,如设置120秒后开机: | |
− | + | <syntaxhighlight lang="bash"> | |
− | + | #120秒后定时开机 | |
− | + | echo +120 > /sys/class/rtc/rtc0/wakealarm | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | <syntaxhighlight lang=" | + | |
− | + | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | === | + | ===Watch dog=== |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ===SPI=== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ==函数库(libfriendlyarm-hardware.so)接口说明== | |
− | + | 请参考这份WiKi文档:[[Android Hardware Access APIs/zh]] | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
Revision as of 09:35, 22 October 2018
Contents
1 简介
友善电子开发了一个名为libfriendlyarm-hardware.so的函数库,用于Android应用程序访问开发板上的硬件资源,该函数库基于Android-NDK技术开发,提供便利的硬件访问接口,开发者无需掌握过多的嵌入式知识便可使用,有效提高开发进度。
本篇文章仅适用于RK3399开发板,包括 NanoPi-NEO4, NanoPi-M4 和 NanoPC-T4。
其他平台也有相应的支持,请移步这里查看:Android Hardware Access APIs/zh
2 支持如下RK3399官方Android BSP
- Android 7.1.2
- Android 8.1
3 支持如下RK3399硬件资源
- Serial Port
- GPIO
- ADC
- PWM
- I2C
- RTC
- Watch dog
- SPI
4 支持的开发板
- NanoPi-NEO4
- NanoPi-M4
- NanoPC-T4
- 其他开发板请移步这里查看:Android Hardware Access APIs/zh
5 开源Android示例
所有硬件访问的示例程序均已集成到 Android 的源代码当中,位于 Android7.1.2 和 Android8.1 源代码的以下目录:vendor/friendlyelec/apps,也可以单独网上下载,下表中列出各个 Demo 的源代码地址:
5.1 Android8.1
5.1.1 Applicable Boards
- NanoPC-T4/NanoPi-M4/NanoPi-NEO4
Android8.1 Demos Serial Port GPIO ADC https://gitlab.com/friendlyelec/rk3399-android-8.1/tree/master/vendor/friendlyelec/apps/ADCDemo
PWM https://gitlab.com/friendlyelec/rk3399-android-8.1/tree/master/vendor/friendlyelec/apps/PWMDemo
I2C RTC Watch dog SPI
5.2 Android7.1.2
5.2.1 Applicable Boards
- NanoPC-T4/NanoPi-M4/NanoPi-NEO4
Android7.1.2 Demos Serial Port GPIO ADC https://gitlab.com/friendlyelec/rk3399-nougat/tree/nanopc-t4-nougat/vendor/friendlyelec/apps/ADCDemo
PWM https://gitlab.com/friendlyelec/rk3399-nougat/tree/nanopc-t4-nougat/vendor/friendlyelec/apps/PWMDemo
I2C RTC Watch dog SPI
6 快速使用入门
6.1 (第1步) 集成libfriendlyarm-things.so到你的app
克隆以下仓库到本地:
git clone https://github.com/friendlyarm/friendlythings-sdk
接着复制 libs 目录下的所有内容到你的工程目录下,然后在你的Android项目的src目录下创建com/friendlyarm目录,将java/FriendlyThings目录拷贝进去即可,最后的目录的结构看上去是这样的 (注:AndroidStudio的项目可能会稍有不同,但大致如此):
YourProject/
├── AndroidManifest.xml
├── libs
│ ├── arm64-v8a
│ │ └── libfriendlyarm-things.so
│ └── armeabi
│ └── libfriendlyarm-things.so
├── src
│ └── com
│ └── friendlyarm
│ ├── FriendlyThings
│ │ ├── BoardType.java
│ │ ├── FileCtlEnum.java
│ │ ├── GPIOEnum.java
│ │ ├── HardwareControler.java
│ │ ├── SPIEnum.java
│ │ ├── SPI.java
│ │ └── WatchDogEnum.java
使用以下方法导入它们,主要的接口都集中在 HardwareControler.java文件中:
import com.friendlyarm.FriendlyThings.HardwareControler; import com.friendlyarm.FriendlyThings.SPIEnum; import com.friendlyarm.FriendlyThings.GPIOEnum; import com.friendlyarm.FriendlyThings.FileCtlEnum; import com.friendlyarm.FriendlyThings.BoardType;
6.2 (第2步) 让你的app拥有system权限
你的app需要拥有system权限,才能访问硬件资源;
请参考下面的方法修改你 app 的 AndroidManifest.xml 和 Android.mk这两个文件;
并且最好将你的app放到Android源码中去编译,这一步不是必需的,但是建议这么做,如果你的app在外部编译,你需要对apk进行签名才能让你的app拥有system权限(新手不太建议,过程比较繁琐)。
6.2.1 修改AndroidManifest.xml
在应用程序的AndroidManifest.xml中的manifest节点中加入以下属性:
android:sharedUserId="android.uid.system"
6.2.2 修改Android.mk
编写一个Android.mk文件(最简单的方法就是拷贝示例中的Android.mk文件),修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行:
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := 你的项目名 LOCAL_CERTIFICATE := platform LOCAL_MODULE_TAGS := optional LOCAL_CFLAGS := -lfriendlyarm-hardware include $(BUILD_PACKAGE)
6.3 (最后1步) 在 Android源代码中编译你的app
先在 Android源代码根目录调用 setenv.sh 导出环境变量,然后进入你的 app 目录,使用mm命令编译;
例子:编译 GPIO_LED_Demo,以RK3399平台为例:
cd rk3399-android-8.1 . setenv.sh cd vendor/friendlyelec/apps/GPIO_LED_Demo mm
6.4 一个Android Studio的示例项目
https://github.com/friendlyarm/AndroidStudio-GPIODemo
7 RK3399平台Android硬件资源的程序访问
7.1 Serial Port
目前可用的串口是UART4,设备名称为/dev/ttyS4,其他串口资源如下表所示,你也可以使用USB转串口来扩展:
串口设备 串口资源占用情况 UART0 已被蓝牙占用 UART1 已被千兆以太网占用 UART2 已被作为调试串口 UART3 已被千兆以太网占用 UART4 空闲,设备名称为 /dev/ttyS4 (注:需使用20180618之后的ROM)
Android硬件库为串口API:
接口名称 参数与返回值说明 功能说明 int openSerialPortEx( String devName, long baud, int dataBits, int stopBits, String parityBit, String flowCtrl )
参数说明:
devName: 串口设备文件名,可选的值有:
/dev/ttyS4
baud: 波特率
dataBits: 数据位 (取值 5~8,一般用8 )
stopBits: 停止位 (取值 1~2,一般用1 )
parityBit: 奇偶校验位(取值为单个字母,O表示奇校验,E表示偶校验,N表示无校验)
flowCtrl: 数据流控制(取值为单个字母,H表示硬件流控制,S表示软件流控制,N表示不使用数据流控制)
返回值说明:
成功打开串口时,将返回串口的文件描述符,用该描述符可进行 read、write和select等操作,如果打开失败,则返回 -1
打开指定的串口设备,并返回文件描述符。
串口的读写使用以下通用接口:
HardwareControler.select //轮询串口是否有数据可写或可读 HardwareControler.read //读取串口数据 HardwareControler.write //写数据到串口 HardwareControler.close //关闭设备
7.2 GPIO
7.3 ADC
7.4 PWM
7.5 I2C
7.6 RTC
可以直接使用cat和echo操作/sys/class/rtc/rtc0/下面的接口。 比如查看当前RTC的日期和时间:
cat /sys/class/rtc/rtc0/date # 2018-10-20 cat /sys/class/rtc/rtc0/time # 08:20:14
设置开机时间,如设置120秒后开机:
#120秒后定时开机 echo +120 > /sys/class/rtc/rtc0/wakealarm
7.7 Watch dog
7.8 SPI
8 函数库(libfriendlyarm-hardware.so)接口说明
请参考这份WiKi文档:Android Hardware Access APIs/zh