Difference between revisions of "FriendlyThings for Rockchip/zh"

From FriendlyELEC WiKi
Jump to: navigation, search
(updated by API)
(updated by API)
Line 4: Line 4:
 
友善电子开发了一个名为libfriendlyarm-hardware.so的函数库,用于Android应用程序访问开发板上的硬件资源,该函数库基于Android-NDK技术开发,提供便利的硬件访问接口,开发者无需掌握过多的嵌入式知识便可使用,有效提高开发进度。<br /><br />
 
友善电子开发了一个名为libfriendlyarm-hardware.so的函数库,用于Android应用程序访问开发板上的硬件资源,该函数库基于Android-NDK技术开发,提供便利的硬件访问接口,开发者无需掌握过多的嵌入式知识便可使用,有效提高开发进度。<br /><br />
 
本篇文章仅适用于RK3399开发板,包括 NanoPi-NEO4, NanoPi-M4 和 NanoPC-T4。<br />
 
本篇文章仅适用于RK3399开发板,包括 NanoPi-NEO4, NanoPi-M4 和 NanoPC-T4。<br />
其他平台也有相应的支持,请移步这里查看:[[Android Thing: Android Hardware Programming]]
+
其他平台也有相应的支持,请移步这里查看:[[Android Hardware Access APIs/zh]]
  
 
==支持如下RK3399官方Android BSP==
 
==支持如下RK3399官方Android BSP==
Line 26: Line 26:
 
* NanoPi-M4
 
* NanoPi-M4
 
* NanoPC-T4
 
* NanoPC-T4
* 其他开发板请移步这里查看:[[Android Thing: Android Hardware Programming]]
+
* 其他开发板请移步这里查看:[[Android Hardware Access APIs/zh]]
  
 
==开源Android示例==
 
==开源Android示例==
Line 52: Line 52:
 
|}
 
|}
  
Android硬件库为串口API:
+
串口的读写需要使用以下硬件库接口:
::{| class="wikitable"
+
|-
+
| 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 />
+
||
+
打开指定的串口设备,并返回文件描述符。
+
|-
+
|}
+
 
+
串口的读写使用以下通用接口:
+
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 +
HardwareControler.openSerialPortEx //打开串口设备
 
HardwareControler.select  //轮询串口是否有数据可写或可读
 
HardwareControler.select  //轮询串口是否有数据可写或可读
 
HardwareControler.read    //读取串口数据
 
HardwareControler.read    //读取串口数据
Line 93: Line 60:
 
HardwareControler.close    //关闭设备
 
HardwareControler.close    //关闭设备
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
接口说明请参考:[[Android Hardware Access APIs/zh]]
 
===GPIO===
 
===GPIO===
 
+
下面中列出RK3399可直接操作的GPIO的Linux索引号:
 +
====NanoPC T4====
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''物理序号'''
 +
| style="background: PaleTurquoise; color: black" |'''Linux索引号'''
 +
|-|Pin11||33|-
 +
|-|Pin12||50|-
 +
|-|Pin15||36|-
 +
|-|Pin16||54|-
 +
|-|Pin18||55|-
 +
|-|Pin22||56|-
 +
|-|Pin37||96|-
 +
|-|Pin38||125|-
 +
|-|Pin40||126|-
 +
|}
 +
====NanoPi M4和NanoPi NEO4====
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''物理序号'''
 +
| style="background: PaleTurquoise; color: black" |'''Linux索引号'''
 +
|-|Pin11||33|-
 +
|-|Pin12||50|-
 +
|-|Pin15||36|-
 +
|-|Pin16||54|-
 +
|-|Pin18||55|-
 +
|-|Pin22||56|-
 +
|}
 
===ADC===
 
===ADC===
  
 
===PWM===
 
===PWM===
 +
操作PWM只需要直接操作 /sys/class/pwm/pwmchip1 下的文件节点即可,下面以在命令行操作PWM风扇风速作为示例:
 +
<syntaxhighlight lang="bash">
 +
echo 0 > /sys/class/pwm/pwmchip1/export
 +
echo 0 > /sys/class/pwm/pwmchip1/pwm0/enable    // disable
 +
echo 50000 > /sys/class/pwm/pwmchip1/pwm0/period // 20KHz
 +
 +
echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable    // enable
 +
echo 45000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle
 +
echo 15000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle
 +
 +
echo 0 > /sys/class/pwm/pwmchip1/pwm0/enable    // disable
 +
</syntaxhighlight>
  
 
===I2C===
 
===I2C===
 +
 +
运行I2C Demo需要将一个LCD1602的模块连接到NanoPC-T4的以下引脚:
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''物理序号'''
 +
| style="background: PaleTurquoise; color: black" |'''I2C功能'''
 +
|-|Pin3||I2C2_SDA(3V)|-
 +
|-|Pin5||I2C2_SCL(3V)|-
 +
|-|Pin27||I2C2_SDA(1.8V)|-
 +
|-|Pin28||I2C2_SCL(1.8V)|-
 +
|}
  
 
===RTC===
 
===RTC===
可以直接使用cat和echo操作/sys/class/rtc/rtc0/下面的接口。
+
通过 /sys/class/rtc/rtc0/下面的接口来操作RTC,也可以通过 /dev/rtc 设备来操作。 <br />
比如查看当前RTC的日期和时间:
+
比如查看当前RTC的日期和时间:<br />
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
cat /sys/class/rtc/rtc0/date
 
cat /sys/class/rtc/rtc0/date
Line 117: Line 135:
  
 
===Watch dog===
 
===Watch dog===
 
+
看门狗的操作比较简单,打开设备 /dev/watchdog 并定时写入字符即可,如果系统出现问题导致没有写入字符,设备会过一段时间自动重启:
 +
<syntaxhighlight lang="java">
 +
mWatchDogFD = HardwareControler.open("/dev/watchdog", FileCtlEnum.O_WRONLY);
 +
HardwareControler.write(mWatchDogFD, "a".getBytes());
 +
</syntaxhighlight>
 
===SPI===
 
===SPI===
 +
SPI由于与UART4共用引脚,所以需要修改内核DTS文件,先禁用UART4方可使用SPI功能。<br />
 +
具体方法待写 ... <br />
  
 
+
==函数库(libfriendlyarm-hardware.so)接口说明==
==开发资料==
+
请参考这份WiKi文档:[[Android Hardware Access APIs/zh]]
* 中文API文档:https://github.com/friendlyarm/AndroidHardwareAccess/blob/master/友善电子Android硬件开发指南.pdf
+

Revision as of 09:56, 22 October 2018

English

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

等等, 接口包括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)

串口的读写需要使用以下硬件库接口:

HardwareControler.openSerialPortEx //打开串口设备
HardwareControler.select   //轮询串口是否有数据可写或可读
HardwareControler.read     //读取串口数据
HardwareControler.write    //写数据到串口
HardwareControler.close    //关闭设备

接口说明请参考:Android Hardware Access APIs/zh

7.2 GPIO

下面中列出RK3399可直接操作的GPIO的Linux索引号:

7.2.1 NanoPC T4

物理序号 Linux索引号

7.2.2 NanoPi M4和NanoPi NEO4

物理序号 Linux索引号

7.3 ADC

7.4 PWM

操作PWM只需要直接操作 /sys/class/pwm/pwmchip1 下的文件节点即可,下面以在命令行操作PWM风扇风速作为示例:

echo 0 > /sys/class/pwm/pwmchip1/export
echo 0 > /sys/class/pwm/pwmchip1/pwm0/enable    // disable
echo 50000 > /sys/class/pwm/pwmchip1/pwm0/period // 20KHz
 
echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable    // enable
echo 45000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle
echo 15000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle
 
echo 0 > /sys/class/pwm/pwmchip1/pwm0/enable    // disable

7.5 I2C

运行I2C Demo需要将一个LCD1602的模块连接到NanoPC-T4的以下引脚:

物理序号 I2C功能

7.6 RTC

通过 /sys/class/rtc/rtc0/下面的接口来操作RTC,也可以通过 /dev/rtc 设备来操作。
比如查看当前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

看门狗的操作比较简单,打开设备 /dev/watchdog 并定时写入字符即可,如果系统出现问题导致没有写入字符,设备会过一段时间自动重启:

mWatchDogFD = HardwareControler.open("/dev/watchdog", FileCtlEnum.O_WRONLY);
HardwareControler.write(mWatchDogFD, "a".getBytes());

7.8 SPI

SPI由于与UART4共用引脚,所以需要修改内核DTS文件,先禁用UART4方可使用SPI功能。
具体方法待写 ...

8 函数库(libfriendlyarm-hardware.so)接口说明

请参考这份WiKi文档:Android Hardware Access APIs/zh