Difference between revisions of "FriendlyThings for Rockchip/zh"

From FriendlyELEC WiKi
Jump to: navigation, search
(Created page with "English ==简介== 友善电子开发了一个名为libfriendlyarm-hardware.so的函数库,用于Android应用程序访问开发...")
 
(updated by API)
Line 2: Line 2:
  
 
==简介==
 
==简介==
友善电子开发了一个名为libfriendlyarm-hardware.so的函数库,用于Android应用程序访问开发板上的硬件资源,该函数库基于Android-NDK技术开发,提供便利的硬件访问接口,开发者无需掌握过多的嵌入式知识便可使用,有效提高开发进度。<br />
+
友善电子开发了一个名为libfriendlyarm-hardware.so的函数库,用于Android应用程序访问开发板上的硬件资源,该函数库基于Android-NDK技术开发,提供便利的硬件访问接口,开发者无需掌握过多的嵌入式知识便可使用,有效提高开发进度。<br /><br />
 +
本篇文章仅适用于RK3399开发板,包括 NanoPi-NEO4, NanoPi-M4 和 NanoPC-T4。<br />
 +
其他平台也有相应的支持,请移步这里查看:[[Android Thing: Android Hardware Programming]]
  
==目前支持的硬件设备==
+
==支持如下RK3399官方Android BSP==
 +
* Android 7.1.2
 +
* Android 8.1
 +
 
 +
==支持如下RK3399硬件资源==
 
* Serial Port
 
* Serial Port
 +
* GPIO
 +
* ADC
 
* PWM
 
* PWM
* EEPROM
+
* I2C
* ADC
+
* RTC
* LED
+
* Watch dog
* LCD 1602 (I2C)
+
* SPI
* OLED (SPI)
+
 
等等, 接口包括I2C, SPI, GPIO常用的接口。<br />
 
等等, 接口包括I2C, SPI, GPIO常用的接口。<br />
<div><ul>
+
[[File:NanoPC-T4+OLED.jpg|frameless|450px|Smart4418SDK+OLED]]
<li style="display: inline-block;"> [[File:Smart4418SDK+OLED.png|frameless|350px|Smart4418SDK+OLED]]</li>
+
<li style="display: inline-block;"> [[File:NanoPCT3-I2C-LCD1602.jpg|frameless|350px|NanoPCT3-I2C-LCD1602]] </li>
+
</ul></div>
+
  
 
==支持的开发板==
 
==支持的开发板==
* NanoPC-T3/NanoPi-M3: Android 5
+
* NanoPi-NEO4
* Smart4418 SDK/NanoPC-T2/NanoPi-M2/NanoPi S2: Android 5, Android 4.4
+
* NanoPi-M4
* Tiny4412: Android 4.2, Android 5
+
* NanoPC-T4
* Tiny210/Smart210/Mini210: Android 4.2
+
* 其他开发板请移步这里查看:[[Android Thing: Android Hardware Programming]]
* Tiny6410/Mini6410: Android 2.3
+
  
==硬件示例程序集合==
+
==开源Android示例==
* github地址:https://github.com/friendlyarm/AndroidHardwareAccess
+
所有硬件访问的示例程序均已集成到 Android 的源代码当中,位于 Android7.1.2 和 Android8.1 源代码的以下目录:vendor/friendlyelec/apps,也可以单独网上下载,下表中列出各个 Demo 的源代码地址:
==Andorid示例源代码编译与部署(以SerialPortDemo进行说明) ==
+
{{libfriendlyarm-hardware.so Android8 Demos}}
===1) eclipse导入源代码,以SerialPortDemo为例===
+
{{libfriendlyarm-hardware.so Android7 Demos}}
然后打开eclipse,在eclipse菜单File上选择Import导入项目,选择Existing Android Code Into Workspace,<br />
+
{{libfriendlyarm-hardware.so Installation Guide/zh}}
我们把项目名称改为  SerialPortDemo:<br />
+
  
<div><ul>
+
==RK3399平台Android硬件资源的程序访问==
<li style="display: inline-block;">[[File:AndroidHW01.png|400px]]</li>
+
===Serial Port===
<li style="display: inline-block;">[[File:AndroidHW02.png|400px]] </li>
+
目前可用的串口是UART4,设备名称为/dev/ttyS4,其他串口资源如下表所示,你也可以使用USB转串口来扩展:
</ul></div>
+
::{| class="wikitable"
 +
|-
 +
|串口设备 || 串口资源占用情况
 +
|-
 +
|UART0  || 已被蓝牙占用
 +
|-
 +
|UART1  ||  已被千兆以太网占用 
 +
|-
 +
|UART2  ||  已被作为调试串口
 +
|-
 +
|UART3  ||  已被千兆以太网占用
 +
|-
 +
|UART4  ||  空闲,设备名称为 /dev/ttyS4 (注:需使用20180618之后的ROM)
 +
|}
  
===2) 编辑源代码,根据需要更改串口设备文件名称===
+
Android硬件库为串口API:
DEMO要访问的串口设备写死在以下源代码文件的:src/com/friendlyarm/SerialPortDemo/SerialPortDataProcessView.java<br />
+
::{| class="wikitable"
你需要根据实际情况更改:<br />
+
|-
[[File:AndroidHW03.png|500px]]<br />
+
| style="background: PaleTurquoise; color: black" | '''接口名称'''
 +
| style="background: PaleTurquoise; color: black" |'''参数与返回值说明'''
 +
| style="background: PaleTurquoise; color: black" |'''功能说明'''
 +
|-
 +
|
 +
<syntaxhighlight lang="java">
 +
int openSerialPortEx(
 +
String devName,
 +
long baud,
 +
int dataBits,
 +
int stopBits,
 +
String parityBit,
 +
String flowCtrl
 +
)
 +
</syntaxhighlight>
 +
||
 +
参数说明:<br />
 +
devName: 串口设备文件名,可选的值有:<br />
 +
/dev/ttyS4<br />
 +
baud:    波特率 <br />
 +
dataBits: 数据位 (取值 5~8,一般用8 )<br />
 +
stopBits: 停止位 (取值 1~2,一般用1 )<br />
 +
parityBit: 奇偶校验位(取值为单个字母,O表示奇校验,E表示偶校验,N表示无校验)<br />
 +
flowCtrl: 数据流控制(取值为单个字母,H表示硬件流控制,S表示软件流控制,N表示不使用数据流控制)<br />
 +
返回值说明:<br />
 +
成功打开串口时,将返回串口的文件描述符,用该描述符可进行 read、write和select等操作,如果打开失败,则返回 -1<br />
 +
||
 +
打开指定的串口设备,并返回文件描述符。
 +
|-
 +
|}
  
====各个平台开发板的串口设备名称 ====
+
串口的读写使用以下通用接口:
* Allwinner H3/H5平台开发板 (NanoPi M1/NanoPi M1 Plus等)
+
<syntaxhighlight lang="c">
UART1-> /dev/ttyS1<br />
+
HardwareControler.select  //轮询串口是否有数据可写或可读
UART2 -> /dev/ttyS2<br />
+
HardwareControler.read    //读取串口数据
UART3 -> /dev/ttyS3 (仅NanoPi M1, NanoPi K1, NanoPi K1 Plus可用)<br />
+
HardwareControler.write    //写数据到串口
 +
HardwareControler.close    //关闭设备
 +
</syntaxhighlight>
 +
===GPIO===
  
* S5P4418平台开发板 (NanoPi Fire2A/NanoPi M2A/NanoPi S2/NanoPC-T2等)
+
===ADC===
UART1 -> /dev/ttyAMA1  [注1]<br />
+
UART2 -> /dev/ttyAMA2  [注1]<br />
+
UART3 -> /dev/ttyAMA3<br />
+
UART4 -> /dev/ttyAMA4<br />
+
  
* S5P6818平台开发板 (NanoPi M3/NanoPC-T3等)
+
===PWM===
UART1 -> /dev/ttySAC1 [注1]<br />
+
UART2 -> /dev/ttySAC2  [注1]<br />
+
UART3 -> /dev/ttySAC3<br />
+
UART4 -> /dev/ttySAC4<br />
+
<br />
+
注1: 仅部分板子可用,具体请查看原理图.
+
  
===3) 编译DEMO源代码,并导出apk文件===
+
===I2C===
在Package Explorer上点击项目名称,保证其处于选中状态:<br />
+
 
[[File:AndroidHW04.png|500px]]<br />
+
===RTC===
在eclipse菜单File上选择Export...:<br />
+
可以直接使用cat和echo操作/sys/class/rtc/rtc0/下面的接口。
[[File:AndroidHW05.png|500px]]<br />
+
比如查看当前RTC的日期和时间:
选择Export Android Application:<br />
+
[[File:AndroidHW06.png|500px]]<br />
+
选择项目SerialPortDemo:<br />
+
[[File:AndroidHW07.png|500px]]<br />
+
这一步,Eclipse要求我们创建或选择自已的签名,这里我们选择Create new keystore,  填写key生成后保存的路径和密码,然后点next:<br />
+
[[File:AndroidHW08.png|500px]]<br />
+
继续参考下图完善签名信息,然后点next:<br />
+
[[File:AndroidHW09.png|500px]]<br />
+
接着选择APK文件的保存位置,这里我们选择保存到 signapk-files子目录下,以方便我们稍后要进行的签名操作:<br />
+
[[File:AndroidHW10.png|500px]]<br />
+
点Finish完成APK的导出:<br />
+
[[File:AndroidHW11.png|500px]]
+
===4) 使用系统证书对APK进行重新签名===
+
因为访问硬件需要APK有system权限,所以需要使用系统证对APK进行重新签名,<br />
+
在命令行下进入signapk-files子目录,然后执行以下命令签名即可:
+
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
cd signapk-files/
+
cat /sys/class/rtc/rtc0/date
java -jar ./signapk.jar platform.x509.pem platform.pk8 ./SerialPortDemo.apk SerialPortDemo-Signed.apk
+
# 2018-10-20                                                             
 +
cat /sys/class/rtc/rtc0/time                                           
 +
# 08:20:14
 
</syntaxhighlight>
 
</syntaxhighlight>
其中,signapk.jar以及签名文件platform.x509.pem和platform.pk8可在开发板资源下载目录的android-platform-key-files目录下找到。
+
设置开机时间,如设置120秒后开机:
 
+
===5) 运行与调试===
+
5.1) 安装APK,用microUSB线将电脑与开发板连接,用adb命令安装SerialPortDemo-Signed.apk:
+
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
adb install SerialPortDemo-Signed.apk
+
#120秒后定时开机
 +
echo +120 >  /sys/class/rtc/rtc0/wakealarm
 
</syntaxhighlight>
 
</syntaxhighlight>
  
5.2) 调试:
+
===Watch dog===
运行 SerialPortDemo后,在adb shell命令行模式下执行:
+
 
<syntaxhighlight lang="bash">
+
===SPI===
ps -Z
+
 
</syntaxhighlight>
+
然后找到com.friendlyarm.SerialPortDemo这个进程,如果前面的权限是如下所示,表明程序已经获得了 system 权限:
+
<syntaxhighlight lang="bash">
+
u:r:system_app:s0              system    1610  112  com.friendlyarm.SerialPortDemo
+
</syntaxhighlight>
+
以上是Android4的,如果是Android5,则略有不同,不过都表示已经是 system 权限:
+
<syntaxhighlight lang="bash">
+
u:r:platform_app:s0            u0_a60    1905  138  com.friendlyarm.SerialPortDemo
+
</syntaxhighlight>
+
如果程序没有获得 system 权限,则打开串口设备会失败。
+
  
 
==开发资料==
 
==开发资料==
 
* 中文API文档:https://github.com/friendlyarm/AndroidHardwareAccess/blob/master/友善电子Android硬件开发指南.pdf
 
* 中文API文档:https://github.com/friendlyarm/AndroidHardwareAccess/blob/master/友善电子Android硬件开发指南.pdf

Revision as of 08:54, 22 October 2018

English

1 简介

友善电子开发了一个名为libfriendlyarm-hardware.so的函数库,用于Android应用程序访问开发板上的硬件资源,该函数库基于Android-NDK技术开发,提供便利的硬件访问接口,开发者无需掌握过多的嵌入式知识便可使用,有效提高开发进度。

本篇文章仅适用于RK3399开发板,包括 NanoPi-NEO4, NanoPi-M4 和 NanoPC-T4。
其他平台也有相应的支持,请移步这里查看:Android Thing: Android Hardware Programming

2 支持如下RK3399官方Android BSP

  • Android 7.1.2
  • Android 8.1

3 支持如下RK3399硬件资源

  • Serial Port
  • GPIO
  • ADC
  • PWM
  • I2C
  • RTC
  • Watch dog
  • SPI

等等, 接口包括I2C, SPI, GPIO常用的接口。
Smart4418SDK+OLED

4 支持的开发板

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

https://gitlab.com/friendlyelec/rk3399-android-8.1/tree/master/vendor/friendlyelec/apps/SerialPortDemo

GPIO

https://gitlab.com/friendlyelec/rk3399-android-8.1/tree/master/vendor/friendlyelec/apps/GPIO_LED_Demo

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

https://gitlab.com/friendlyelec/rk3399-android-8.1/tree/master/vendor/friendlyelec/apps/I2C_LCD1602_Demo

RTC

https://gitlab.com/friendlyelec/rk3399-android-8.1/tree/master/vendor/friendlyelec/apps/RTC_Demo-RK3399

Watch dog

https://gitlab.com/friendlyelec/rk3399-android-8.1/tree/master/vendor/friendlyelec/apps/WatchDogDemo-RK3399

SPI

https://gitlab.com/friendlyelec/rk3399-android-8.1/tree/master/vendor/friendlyelec/apps/SPI_OLED_Demo

5.2 Android7.1.2

5.2.1 Applicable Boards

  • NanoPC-T4/NanoPi-M4/NanoPi-NEO4
Android7.1.2 Demos
Serial Port

https://gitlab.com/friendlyelec/rk3399-nougat/tree/nanopc-t4-nougat/vendor/friendlyelec/apps/SerialPortDemo

GPIO

https://gitlab.com/friendlyelec/rk3399-nougat/tree/nanopc-t4-nougat/vendor/friendlyelec/apps/GPIO_LED_Demo

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

https://gitlab.com/friendlyelec/rk3399-nougat/tree/nanopc-t4-nougat/vendor/friendlyelec/apps/I2C_LCD1602_Demo

RTC

https://gitlab.com/friendlyelec/rk3399-nougat/tree/nanopc-t4-nougat/vendor/friendlyelec/apps/RTC_Demo-RK3399

Watch dog

https://gitlab.com/friendlyelec/rk3399-nougat/tree/nanopc-t4-nougat/vendor/friendlyelec/apps/WatchDogDemo-RK3399

SPI

https://gitlab.com/friendlyelec/rk3399-nougat/tree/nanopc-t4-nougat/vendor/friendlyelec/apps/SPI_OLED_Demo

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 开发资料