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)
 
(35 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[Android Hardware Programming for RK3399|English]]
+
[[FriendlyThings for Rockchip|English]]<br /><br />
 +
注:本篇所述仅适用于友善电子出品的Rockchip平台主板,若需其他平台请参考 [[FriendlyThings/zh]]
 +
<br />
 +
{{FriendlyThings Introduction/zh}}
 +
{{FriendlyThings AndroidVersion for Rockchip/zh}}
 +
{{FriendlyThings Boards for Rockchip/zh}}
 +
{{FriendlyThings Installation Guide/zh}}
 +
==函数库(libfriendlyarm-things.so)接口说明==
 +
请参考这份WiKi文档:[[FriendlyThings APIs/zh]]
  
==简介==
+
==硬件资源的程序访问==
友善电子开发了一个名为libfriendlyarm-hardware.so的函数库,用于Android应用程序访问开发板上的硬件资源,该函数库基于Android-NDK技术开发,提供便利的硬件访问接口,开发者无需掌握过多的嵌入式知识便可使用,有效提高开发进度。<br />
+
===Serial Port===
 +
内核默认启用了以下串口可供测试(实际以内核dts配置为准),要使用更多串口可以自行配置内核dts:
 +
{| class="wikitable"
 +
|-
 +
! CPU
 +
! Model
 +
! Port
 +
! Device Node
 +
|-
 +
| RK3588
 +
| NanoPC-T6
 +
| UART6
 +
| /dev/ttyS6
 +
|-
 +
| RK3588S
 +
| NanoPi-R6S/R6C
 +
| UART5
 +
| /dev/ttyS5
 +
|-
 +
| RK3568
 +
| NanoPi-R5S
 +
| UART9
 +
| /dev/ttyS9
 +
|-
 +
| RK3399
 +
| NanoPC-T4
 +
| UART4
 +
| /dev/ttyS4
 +
|}
  
==目前支持的硬件设备==
+
====串口读写的接口说明====
* Serial Port
+
<syntaxhighlight lang="c">
* PWM
+
HardwareControler.openSerialPortEx //打开串口设备
* EEPROM
+
HardwareControler.select  //轮询串口是否有数据可写或可读
* ADC
+
HardwareControler.read    //读取串口数据
* LED
+
HardwareControler.write    //写数据到串口
* LCD 1602 (I2C)
+
HardwareControler.close    //关闭设备
* OLED (SPI)
+
</syntaxhighlight>
等等, 接口包括I2C, SPI, GPIO常用的接口。<br />
+
接口说明请参考:[[FriendlyThings APIs/zh]]
<div><ul>
+
<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>
+
  
==支持的开发板==
+
===GPIO===
* NanoPC-T3/NanoPi-M3: Android 5
+
通过 sysfs 方式控制来 GPIO,是先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO编号,使得该 GPIO 的操作接口从内核空间暴露到用户空间,然后就可以操作引脚的 direction 和 value 等,direction 控制 GPIO 方向,而 value 可控制 GPIO 输出或获得 GPIO 输入。<br />
* Smart4418 SDK/NanoPC-T2/NanoPi-M2/NanoPi S2: Android 5, Android 4.4
+
<br />
* Tiny4412: Android 4.2, Android 5
+
下面列出内核默认配置成GPIO功能的引脚(实际以内核dts配置为准):
* Tiny210/Smart210/Mini210: Android 4.2
+
====NanoPC T6====
* Tiny6410/Mini6410: Android 2.3
+
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''Physical Index'''
 +
| style="background: PaleTurquoise; color: black" |'''GPIO Index'''
 +
|-
 +
|Pin7||106
 +
|-
 +
|Pin12||111
 +
|-
 +
|Pin15||39
 +
|-
 +
|Pin16||107
 +
|-
 +
|Pin18||108
 +
|-
 +
|Pin26||40
 +
|-
 +
|}
 +
====NanoPi R6C====
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''Physical Index'''
 +
| style="background: PaleTurquoise; color: black" |'''GPIO Index'''
 +
|-
 +
|Pin7||128
 +
|-
 +
|Pin11||129
 +
|-
 +
|Pin13||130
 +
|-
 +
|Pin15||133
 +
|-
 +
|Pin16||134
 +
|-
 +
|Pin18||137
 +
|-
 +
|Pin22||138
 +
|-
 +
|}
 +
====NanoPi R6S====
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''Physical Index'''
 +
| style="background: PaleTurquoise; color: black" |'''GPIO Index'''
 +
|-
 +
|Pin3||43
 +
|-
 +
|Pin5||41
 +
|-
 +
|Pin6||44
 +
|-
 +
|Pin7||42
 +
|-
 +
|Pin9||47
 +
|-
 +
|Pin10||46
 +
|-
 +
|}
 +
====NanoPi R5S====
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''Physical Index'''
 +
| style="background: PaleTurquoise; color: black" |'''GPIO Index'''
 +
|-
 +
|Pin3||115
 +
|-
 +
|Pin5||114
 +
|-
 +
|Pin6||97
 +
|-
 +
|Pin7||113
 +
|-
 +
|Pin11||116
 +
|-
 +
|Pin12||117
 +
|-
 +
|}
 +
====NanoPC T4====
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''物理序号'''
 +
| style="background: PaleTurquoise; color: black" |'''GPIO编号'''
 +
|-
 +
|Pin11||33
 +
|-
 +
|Pin12||50
 +
|-
 +
|Pin15||36
 +
|-
 +
|Pin16||54
 +
|-
 +
|Pin18||55
 +
|-
 +
|Pin22||56
 +
|-
 +
|Pin37||96
 +
|-
 +
|Pin38||125
 +
|-
 +
|Pin40||126
 +
|}
 +
====NanoPi M4/M4v2/M4B/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
 +
|}
 +
====SOM-RK3399/SOM-RK3399v2====
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''Physical Index'''
 +
| style="background: PaleTurquoise; color: black" |'''GPIO Index'''
 +
|-
 +
|Pin7||41
 +
|-
 +
|Pin9||42
 +
|}
  
==硬件示例程序集合==
+
====GPIO接口说明====
* github地址:https://github.com/friendlyarm/AndroidHardwareAccess
+
<syntaxhighlight lang="c">
==Andorid示例源代码编译与部署(以SerialPortDemo进行说明) ==
+
HardwareControler.exportGPIOPin      //导出GPIO
===1) eclipse导入源代码,以SerialPortDemo为例===
+
HardwareControler.setGPIODirection  //改变GPIO的方向
然后打开eclipse,在eclipse菜单File上选择Import导入项目,选择Existing Android Code Into Workspace,<br />
+
HardwareControler.getGPIODirection  //获得当前GPIO的方向
我们把项目名称改为  SerialPortDemo:<br />
+
HardwareControler.setGPIOValue    //向引脚输出高电平或低电平
 +
HardwareControler.getGPIOValue    //获得引脚的输入(当前的值)
 +
HardwareControler.unexportGPIOPin //取消导出
 +
</syntaxhighlight>
 +
接口说明请参考:[[FriendlyThings APIs/zh]]
  
<div><ul>
+
====GPIO示例说明====
<li style="display: inline-block;">[[File:AndroidHW01.png|400px]]</li>
+
可以用LED配件来测试GPIO示例,在界面上对引脚输出高电平时,LED亮,低电平时,LCD灭。
<li style="display: inline-block;">[[File:AndroidHW02.png|400px]] </li>
+
[[File:rk3399-android-gpio.png|frameless|GPIO]]
</ul></div>
+
===ADC===
 +
在 Android 下用标准的文件读取接口就可以读取,你可以将一个可调电阻配件连接到开发板上进行测试。
 +
====RK3588====
 +
Channel2对应的文件节点如下所示, 此ADC可用于查询USB-C的输入电压:
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''频道'''
 +
| style="background: PaleTurquoise; color: black" |'''文件节点'''
 +
|-
 +
|Channel 2||/sys/devices/platform/fec10000.saradc/iio:device0/in_voltage2_raw
 +
|}
 +
====RK3568====
 +
Channel2对应的文件节点如下所示, 此ADC可用于查询USB-C的输入电压:
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''频道'''
 +
| style="background: PaleTurquoise; color: black" |'''文件节点'''
 +
|-
 +
|Channel 2||/sys/devices/platform/fe720000.saradc/iio:device0/in_voltage2_raw
 +
|}
 +
====RK3399====
 +
RK3399引出了三路ADC,channel为0, 2, 3,对应的文件节点为:
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''频道'''
 +
| style="background: PaleTurquoise; color: black" |'''文件节点'''
 +
|-
 +
|Channel 0||/sys/devices/platform/ff100000.saradc/iio:device0/in_voltage0_raw
 +
|-
 +
|Channel 2||/sys/devices/platform/ff100000.saradc/iio:device0/in_voltage2_raw
 +
|-
 +
|Channel 3||/sys/devices/platform/ff100000.saradc/iio:device0/in_voltage3_raw
 +
|}
 +
===PWM===
 +
====NanoPC-T6====
 +
默认已配置 Pin32 为PWM,可以使用LED进行测试
 +
====NanoPi-R6C====
 +
默认已配置 Pin29 为PWM,可以使用LED进行测试
 +
====RK3399====
 +
<b>Note: 默认情况下,PWM接口已经用于连接风扇,如果您想自己控制PWM,则需要先禁用风扇,<br />
 +
请参考这篇文章: </b>[[Template:RK3399 Android PWMFan/zh]]<br />
 +
RK3399开发板也是通过sysfs方式来控制PWM,直接操作 /sys/class/pwm/pwmchip1 下的文件节点即可,下面以在命令行操作PWM风扇风速作为示例:
 +
=====PWM接口说明=====
 +
* 将PWM0暴露到用户空间
 +
<syntaxhighlight lang="bash">
 +
echo 0 > /sys/class/pwm/pwmchip1/export
 +
</syntaxhighlight>
 +
* 通过设置PWM的period和duty_cycle来控制风速
 +
<syntaxhighlight lang="bash">
 +
echo 0 > /sys/class/pwm/pwmchip1/pwm0/enable
 +
echo 50000 > /sys/class/pwm/pwmchip1/pwm0/period
 +
echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable
 +
echo 45000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle
 +
</syntaxhighlight>
 +
=====PWM示例说明=====
 +
可以连接一个PWM风扇(3针)到NanoPC-T4的风扇接口来测试PWM示例。<br />
 +
[[File:rk3399-android-pwm.png|frameless|PWM]]
  
===2) 编辑源代码,根据需要更改串口设备文件名称===
+
===I2C===
DEMO要访问的串口设备写死在以下源代码文件的:src/com/friendlyarm/SerialPortDemo/SerialPortDataProcessView.java<br />
+
====RK3399====
你需要根据实际情况更改:<br />
+
运行I2C Demo需要将一个LCD1602的模块连接到NanoPC-T4的以下引脚:
[[File:AndroidHW03.png|500px]]<br />
+
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''物理序号'''
 +
| style="background: PaleTurquoise; color: black" |'''I2C功能'''
 +
|-
 +
|Pin3||I2C2_SDA(3V)
 +
|-
 +
|Pin4||VCC5V0_SYS
 +
|-
 +
|Pin5||I2C2_SCL(3V)
 +
|-
 +
|Pin6||GND
 +
|}
  
====各个平台开发板的串口设备名称 ====
+
如下图所示:<br />
* Allwinner H3/H5平台开发板 (NanoPi M1/NanoPi M1 Plus等)
+
[[File:NanoPC-T4+OLED.jpg|frameless|450px]]
UART1-> /dev/ttyS1<br />
+
UART2 -> /dev/ttyS2<br />
+
UART3 -> /dev/ttyS3 (仅NanoPi M1, NanoPi K1, NanoPi K1 Plus可用)<br />
+
  
* S5P4418平台开发板 (NanoPi Fire2A/NanoPi M2A/NanoPi S2/NanoPC-T2等)
+
===RTC===
UART1 -> /dev/ttyAMA1  [注1]<br />
+
'''注:定时开关机只有某些型号支持,例如NanoPC-T4'''<br />
UART2 -> /dev/ttyAMA2  [注1]<br />
+
通过 /sys/class/rtc/rtc0/下面的接口来操作RTC,比如查看当前RTC的日期和时间:<br />
UART3 -> /dev/ttyAMA3<br />
+
UART4 -> /dev/ttyAMA4<br />
+
 
+
* S5P6818平台开发板 (NanoPi M3/NanoPC-T3等)
+
UART1 -> /dev/ttySAC1 [注1]<br />
+
UART2 -> /dev/ttySAC2  [注1]<br />
+
UART3 -> /dev/ttySAC3<br />
+
UART4 -> /dev/ttySAC4<br />
+
<br />
+
注1: 仅部分板子可用,具体请查看原理图.
+
 
+
===3) 编译DEMO源代码,并导出apk文件===
+
在Package Explorer上点击项目名称,保证其处于选中状态:<br />
+
[[File:AndroidHW04.png|500px]]<br />
+
在eclipse菜单File上选择Export...:<br />
+
[[File:AndroidHW05.png|500px]]<br />
+
选择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>
 +
[[File:rk3399-android-rtc.png|frameless|RTC]]
  
5.2) 调试:
+
===Watch dog===
运行 SerialPortDemo后,在adb shell命令行模式下执行:
+
看门狗的操作比较简单,打开设备 /dev/watchdog 并定时写入字符即可,如果系统出现问题导致没有写入字符,设备会过一段时间自动重启:
<syntaxhighlight lang="bash">
+
<syntaxhighlight lang="java">
ps -Z
+
mWatchDogFD = HardwareControler.open("/dev/watchdog", FileCtlEnum.O_WRONLY);
 +
HardwareControler.write(mWatchDogFD, "a".getBytes());
 
</syntaxhighlight>
 
</syntaxhighlight>
然后找到com.friendlyarm.SerialPortDemo这个进程,如果前面的权限是如下所示,表明程序已经获得了 system 权限:
+
[[File:rk3399-android-watchdog.png|frameless|WatchDog]]
 +
===SPI===
 +
====RK3399====
 +
=====启用SPI=====
 +
SPI由于与UART4共用引脚,所以需要修改内核DTS文件,修改方法如下: <br />
 +
编辑内核目录下的dts文件 arch/arm64/boot/dts/rockchip/rk3399-nanopi4-common.dtsi:
 +
<syntaxhighlight lang="c">
 +
cd ANDROID_SOURCE/kernel
 +
vim arch/arm64/boot/dts/rockchip/rk3399-nanopi4-common.dtsi
 +
</syntaxhighlight>
 +
其中,ANDROID_SOURCE请替换为真实的 Android7或Android8源代码目录。
 +
 
 +
首先找到 spi1 的定义:
 +
<syntaxhighlight lang="c">
 +
&spi1 {
 +
    status = "disabled";  // 将其中的 disabled 改为 okay
 +
</syntaxhighlight>
 +
然后再在 rk3399-nanopi4-common.dtsi 文件到找到 uart4 的定义:
 +
<syntaxhighlight lang="c">
 +
&uart4 {
 +
    status = "okay";  // 将其中的 okay 改为 disabled
 +
</syntaxhighlight>
 +
最后重新编译内核:
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
u:r:system_app:s0              system    1610  112  com.friendlyarm.SerialPortDemo
+
cd ANDROID_SOURCE/
 +
./build-nanopc-t4.sh -K -M
 
</syntaxhighlight>
 
</syntaxhighlight>
以上是Android4的,如果是Android5,则略有不同,不过都表示已经是 system 权限:
+
更新 rockdev/Image-nanopc_t4/resource.img 到开发板即可,可以将resource.img拷贝到安装有 eflasher 系统的TF卡中,位置是FriendlyARM分区的androidX 目录,替换里面的resource.img文件,然后用TF卡重刷系统。
 +
 
 +
=====SPI示例=====
 +
SPI示例默认没有预装,需要手动编译,方法是修改Android源代码的以下文件:<br />
 +
vendor/friendlyelec/apps# vi device-partial.mk<br />
 +
去掉前面的注释:<br />
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
u:r:platform_app:s0            u0_a60    1905  138  com.friendlyarm.SerialPortDemo
+
# PRODUCT_PACKAGES += SPI-OLED
 
</syntaxhighlight>
 
</syntaxhighlight>
如果程序没有获得 system 权限,则打开串口设备会失败。
+
然后重新编译 Android源代码。<br />
 +
<br />
 +
运行SPI示例需要在NanoPC-T4上连接一个 SPI接口的OLED,规格为0.96寸的128x64屏。<br />
 +
<br />
 +
屏幕上有7个引脚,与开发板用母对母杜邦线连接,接法如下表:<br />
 +
::{| class="wikitable"
 +
|-
 +
| style="background: PaleTurquoise; color: black" | '''OLED引脚'''
 +
| style="background: PaleTurquoise; color: black" |'''功能'''
 +
| style="background: PaleTurquoise; color: black" |'''NanoPC-T4引脚编号'''
 +
| style="background: PaleTurquoise; color: black" |'''备注'''
 +
|-
 +
|GND|| ||Pin6  GND ||
 +
|-
 +
|VCC|| ||Pin2  VCC5V ||
 +
|-
 +
|DO||SCLK||Pin23 (SPI1_CLK(3V) ||时钟信号,由主设备产生
 +
|-
 +
|DI||MOSI||Pin19 (SPI1_TXD) ||主设备数据输出,从设备数据输入
 +
|-
 +
|RES|| ||Pin16 (GPIO1_C6(3V)) ||
 +
|-
 +
|D/C|| ||Pin12 (GPIO1_C2) ||
 +
|-
 +
|CS||CS0||Pin24 (SPI1_CSn0) ||从设备使能信号,由主设备控制
 +
|}
 +
<br />
 +
====SPI接口说明====
 +
请参考:[[FriendlyThings APIs/zh]]
  
==开发资料==
+
==示例程序下载地址==
* 中文API文档:https://github.com/friendlyarm/AndroidHardwareAccess/blob/master/友善电子Android硬件开发指南.pdf
+
所有硬件访问的示例程序均已集成到 Android 的源代码当中,位于 Android7.1.2 和 Android8.1 源代码的以下目录:vendor/friendlyelec/apps,也可以单独网上下载,下表中列出各个 Demo 的源代码地址:
 +
{{FriendlyThings Android8 Demos}}
 +
{{FriendlyThings Android7 Demos}}

Latest revision as of 11:28, 17 August 2023

English

注:本篇所述仅适用于友善电子出品的Rockchip平台主板,若需其他平台请参考 FriendlyThings/zh

1 简介

FriendlyThings是友善电子开发的一套安卓硬件开发SDK(函数库),安卓软件开发者可以通过它在Android应用程序中编程访问和控制ARM主板上的各种硬件资源,比如Uart, SPI, I2C, GPIO等接口,它基于Android-NDK技术开发,开发者无需掌握底层的嵌入式知识(尤其是驱动程序),就可以构建基于安卓系统的各种IoT物联网应用。


2 Android版本

我们提供的Android BSP已经包含FriendlyThings SDK(libfriendlyarm-things.so),包含如下Android平台版本:

  • Android 12 (rk3568 & rk3588)

BSP source code download link: http://112.124.9.243:3000/friendlyelec/rk35xx-android12
Latest ROM download link: http://download.friendlyelec.com/NanoPC-T6

  • Android 8.1-rk3399

BSP source code download link: https://gitlab.com/friendlyelec/rk3399-android-8.1
BSP source code location on the network disk: sources/rk3399-android-8.1.git-YYYYMMDD.tgz
Latest ROM download link: http://download.friendlyelec.com/NanoPC-T4

  • Android 7.1.2-rk3399

BSP source code download link: https://gitlab.com/friendlyelec/rk3399-nougat
BSP source code location on the network disk: sources/rk3399-android-7.git-YYYYMMDD.tgz
Latest ROM download link: http://download.friendlyelec.com/NanoPC-T4

3 开发板型号列表

FriendlyThings SDK(libfriendlyarm-things.so)适用于友善电子出品的如下RK3399/RK3568/RK3588系列主板:

  • NanoPC-T6
  • NanoPi-R6S/R6C
  • NanoPi-R5S/R5C
  • NanoPC-T4
  • NanoPi M4 (需外接eMMC模块)
  • NanoPi NEO4 (需外接eMMC模块)

FriendlyThings也可以支持其他平台安卓主板,如三星S5P4418/S5P6818,三星S5PV210,全志H3/H5等平台,具体请查看这里FriendlyThings/zh

4 快速使用入门

4.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;

4.2 (第2步) 让你的app拥有system权限

你的app需要拥有system权限,才能访问硬件资源;
请参考下面的方法修改你 app 的 AndroidManifest.xml 和 Android.mk这两个文件;
并且最好将你的app放到Android源码中去编译,这一步不是必需的,但是建议这么做,如果你的app在外部编译,你需要对apk进行签名才能让你的app拥有system权限(新手不太建议,过程比较繁琐)。

4.2.1 修改AndroidManifest.xml

在应用程序的AndroidManifest.xml中的manifest节点中加入以下属性:

android:sharedUserId="android.uid.system"

4.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)

4.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

4.4 一个Android Studio的示例项目

https://github.com/friendlyarm/AndroidStudio-GPIODemo

5 函数库(libfriendlyarm-things.so)接口说明

请参考这份WiKi文档:FriendlyThings APIs/zh

6 硬件资源的程序访问

6.1 Serial Port

内核默认启用了以下串口可供测试(实际以内核dts配置为准),要使用更多串口可以自行配置内核dts:

CPU Model Port Device Node
RK3588 NanoPC-T6 UART6 /dev/ttyS6
RK3588S NanoPi-R6S/R6C UART5 /dev/ttyS5
RK3568 NanoPi-R5S UART9 /dev/ttyS9
RK3399 NanoPC-T4 UART4 /dev/ttyS4

6.1.1 串口读写的接口说明

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

接口说明请参考:FriendlyThings APIs/zh

6.2 GPIO

通过 sysfs 方式控制来 GPIO,是先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO编号,使得该 GPIO 的操作接口从内核空间暴露到用户空间,然后就可以操作引脚的 direction 和 value 等,direction 控制 GPIO 方向,而 value 可控制 GPIO 输出或获得 GPIO 输入。

下面列出内核默认配置成GPIO功能的引脚(实际以内核dts配置为准):

6.2.1 NanoPC T6

Physical Index GPIO Index
Pin7 106
Pin12 111
Pin15 39
Pin16 107
Pin18 108
Pin26 40

6.2.2 NanoPi R6C

Physical Index GPIO Index
Pin7 128
Pin11 129
Pin13 130
Pin15 133
Pin16 134
Pin18 137
Pin22 138

6.2.3 NanoPi R6S

Physical Index GPIO Index
Pin3 43
Pin5 41
Pin6 44
Pin7 42
Pin9 47
Pin10 46

6.2.4 NanoPi R5S

Physical Index GPIO Index
Pin3 115
Pin5 114
Pin6 97
Pin7 113
Pin11 116
Pin12 117

6.2.5 NanoPC T4

物理序号 GPIO编号
Pin11 33
Pin12 50
Pin15 36
Pin16 54
Pin18 55
Pin22 56
Pin37 96
Pin38 125
Pin40 126

6.2.6 NanoPi M4/M4v2/M4B/NEO4

物理序号 Linux索引号
Pin11 33
Pin12 50
Pin15 36
Pin16 54
Pin18 55
Pin22 56

6.2.7 SOM-RK3399/SOM-RK3399v2

Physical Index GPIO Index
Pin7 41
Pin9 42

6.2.8 GPIO接口说明

HardwareControler.exportGPIOPin      //导出GPIO
HardwareControler.setGPIODirection   //改变GPIO的方向
HardwareControler.getGPIODirection   //获得当前GPIO的方向
HardwareControler.setGPIOValue    //向引脚输出高电平或低电平
HardwareControler.getGPIOValue    //获得引脚的输入(当前的值)
HardwareControler.unexportGPIOPin //取消导出

接口说明请参考:FriendlyThings APIs/zh

6.2.9 GPIO示例说明

可以用LED配件来测试GPIO示例,在界面上对引脚输出高电平时,LED亮,低电平时,LCD灭。 GPIO

6.3 ADC

在 Android 下用标准的文件读取接口就可以读取,你可以将一个可调电阻配件连接到开发板上进行测试。

6.3.1 RK3588

Channel2对应的文件节点如下所示, 此ADC可用于查询USB-C的输入电压:

频道 文件节点
Channel 2 /sys/devices/platform/fec10000.saradc/iio:device0/in_voltage2_raw

6.3.2 RK3568

Channel2对应的文件节点如下所示, 此ADC可用于查询USB-C的输入电压:

频道 文件节点
Channel 2 /sys/devices/platform/fe720000.saradc/iio:device0/in_voltage2_raw

6.3.3 RK3399

RK3399引出了三路ADC,channel为0, 2, 3,对应的文件节点为:

频道 文件节点
Channel 0 /sys/devices/platform/ff100000.saradc/iio:device0/in_voltage0_raw
Channel 2 /sys/devices/platform/ff100000.saradc/iio:device0/in_voltage2_raw
Channel 3 /sys/devices/platform/ff100000.saradc/iio:device0/in_voltage3_raw

6.4 PWM

6.4.1 NanoPC-T6

默认已配置 Pin32 为PWM,可以使用LED进行测试

6.4.2 NanoPi-R6C

默认已配置 Pin29 为PWM,可以使用LED进行测试

6.4.3 RK3399

Note: 默认情况下,PWM接口已经用于连接风扇,如果您想自己控制PWM,则需要先禁用风扇,
请参考这篇文章:
Template:RK3399 Android PWMFan/zh
RK3399开发板也是通过sysfs方式来控制PWM,直接操作 /sys/class/pwm/pwmchip1 下的文件节点即可,下面以在命令行操作PWM风扇风速作为示例:

6.4.3.1 PWM接口说明
  • 将PWM0暴露到用户空间
echo 0 > /sys/class/pwm/pwmchip1/export
  • 通过设置PWM的period和duty_cycle来控制风速
echo 0 > /sys/class/pwm/pwmchip1/pwm0/enable
echo 50000 > /sys/class/pwm/pwmchip1/pwm0/period
echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable
echo 45000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle
6.4.3.2 PWM示例说明

可以连接一个PWM风扇(3针)到NanoPC-T4的风扇接口来测试PWM示例。
PWM

6.5 I2C

6.5.1 RK3399

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

物理序号 I2C功能
Pin3 I2C2_SDA(3V)
Pin4 VCC5V0_SYS
Pin5 I2C2_SCL(3V)
Pin6 GND

如下图所示:
NanoPC-T4+OLED.jpg

6.6 RTC

注:定时开关机只有某些型号支持,例如NanoPC-T4
通过 /sys/class/rtc/rtc0/下面的接口来操作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

RTC

6.7 Watch dog

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

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

WatchDog

6.8 SPI

6.8.1 RK3399

6.8.1.1 启用SPI

SPI由于与UART4共用引脚,所以需要修改内核DTS文件,修改方法如下:
编辑内核目录下的dts文件 arch/arm64/boot/dts/rockchip/rk3399-nanopi4-common.dtsi:

cd ANDROID_SOURCE/kernel
vim arch/arm64/boot/dts/rockchip/rk3399-nanopi4-common.dtsi

其中,ANDROID_SOURCE请替换为真实的 Android7或Android8源代码目录。

首先找到 spi1 的定义:

&spi1 {
    status = "disabled";  // 将其中的 disabled 改为 okay

然后再在 rk3399-nanopi4-common.dtsi 文件到找到 uart4 的定义:

&uart4 {
    status = "okay";   // 将其中的 okay 改为 disabled

最后重新编译内核:

cd ANDROID_SOURCE/
./build-nanopc-t4.sh -K -M

更新 rockdev/Image-nanopc_t4/resource.img 到开发板即可,可以将resource.img拷贝到安装有 eflasher 系统的TF卡中,位置是FriendlyARM分区的androidX 目录,替换里面的resource.img文件,然后用TF卡重刷系统。

6.8.1.2 SPI示例

SPI示例默认没有预装,需要手动编译,方法是修改Android源代码的以下文件:
vendor/friendlyelec/apps# vi device-partial.mk
去掉前面的注释:

# PRODUCT_PACKAGES += SPI-OLED

然后重新编译 Android源代码。

运行SPI示例需要在NanoPC-T4上连接一个 SPI接口的OLED,规格为0.96寸的128x64屏。

屏幕上有7个引脚,与开发板用母对母杜邦线连接,接法如下表:

OLED引脚 功能 NanoPC-T4引脚编号 备注
GND Pin6 GND
VCC Pin2 VCC5V
DO SCLK Pin23 (SPI1_CLK(3V) 时钟信号,由主设备产生
DI MOSI Pin19 (SPI1_TXD) 主设备数据输出,从设备数据输入
RES Pin16 (GPIO1_C6(3V))
D/C Pin12 (GPIO1_C2)
CS CS0 Pin24 (SPI1_CSn0) 从设备使能信号,由主设备控制


6.8.2 SPI接口说明

请参考:FriendlyThings APIs/zh

7 示例程序下载地址

所有硬件访问的示例程序均已集成到 Android 的源代码当中,位于 Android7.1.2 和 Android8.1 源代码的以下目录:vendor/friendlyelec/apps,也可以单独网上下载,下表中列出各个 Demo 的源代码地址:

7.1 Android8.1

7.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

7.2 Android7.1.2

7.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