65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Windows 10、DragonBoard 410C 和 Android 进行开发

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (5投票s)

2020年9月8日

CPOL

27分钟阅读

viewsIcon

12699

downloadIcon

85

拆箱 DragonBoard 410C,设置 Windows 10 PC 进行开发,并使用 Android Studio

引言

最近我从 Arrow 购买了一块 DragonBoard 410C 和电源,打算将其用于探索物联网 (IoT) 领域。本文记录了我从拆箱设备到编写并尝试我的第一个应用程序的首次工作。

我从 Arrow.com 购买了我的设备,链接在此:Arrow 开发工具:DragonBoard 410C,其中还包含各种手册和文档的链接。此页面提供的资料包含 Android 和 Linux 的文档。该设备还可以运行 Windows 10 IoT Core 操作系统,请参阅Windows 10 IoT Core 概述及相关链接。

对于我的设备工作,我使用的是带有 Windows 10 专业版 Dell 笔记本电脑的 Android Studio。这对我来说似乎是最简单易行的入门方式。

为什么写这篇文章

通过这篇文章,我想记录我使用 DragonBoard 410C 和 Android 的经验和研究。我希望任何对该设备感兴趣并需要入门的人都能找到这篇文章,作为一个有用的快速入门指南,而无需花费我所花费的时间来学习我所学到的知识。

资源

Coursera 上有一门入门在线课程,物联网:设置您的 DragonBoard 开发平台,我发现它很有帮助。

另请参阅 Coursera 上的在线课程,物联网:设备的传感和执行,其中包含有关使用 GPIO 和其他 DragonBoard 外设的信息。

Arrow Electronics 在DragonBoard 产品说明和购买网页上提供了文档和资源链接。

96Boards 在96Boards DragonBoard 410C 产品说明页面上提供了参考信息以及多种操作系统替代方案(Android 和 Linux)。

Qualcomm 通过其开发者门户的DragonBoard 410C 开发板部分提供了信息和资源。DragonBoard 410C 项目页面有许多不同的项目,可查看其他人在做什么。

Google Android Studio 可通过其开发者门户获取,该门户还提供了学习 Kotlin 资源的链接

位于 https://github.com/IOT-410c 的 GitHub 仓库 IOT-410c 包含一个用 Java 编写的 DragonBoard 410C GPIO 库。

Instructable 文章 在带有 Android 和 Linux 操作系统的 DragonBoard 410c 上开发使用 GPIO 引脚的应用程序对 DragonBoard 410C 40 引脚低功耗连接器的 GPIO 引脚进行了基本回顾,并提供了有用的引脚图。GPIO 命名约定在 Android 和 Linux 之间有所不同,使用 SYS 文件系统方法操作 GPIO 引脚需要知道哪个 GPIO 引脚号对应哪个物理引脚号。

背景和初步拆箱

DragonBoard 410C 是一款小巧的信用卡大小的计算机,尺寸和形状与 Raspberry Pi 3 类似。它内置 WiFi 和蓝牙,以及一个类似于 Raspberry Pi 3 的低速 40 引脚连接器(引脚电压为 1.8v)。它有一个用于连接主机的 micro-USB 连接器和一个桶形电源连接器,此外还有一个全尺寸 HDMI 连接器和两个用于键盘和鼠标等外设的 USB 2.0 连接器(Pi 3 有四个 USB 连接器)。主板上内置了 GPS 接收器。

该设备有 1GB 内存和 8GB eMMC 持久存储,以及一个 microSD 3.0 插槽。开箱即用,DragonBoard 410C 在 eMMC 中安装了通用的 Android 5.1。可以安装其他操作系统,我计划稍后使用 Windows 10 IoT Core。

image of DragonBoard 410C from top.

Android 5.1 版本没有 Google 生态系统,这意味着没有 Google 应用程序,例如 Play 商店。但是,有许多替代的 Android 应用商店。对于应用程序开发和测试,我无论如何都会侧载应用程序。

我的初始 DragonBoard 设置是使用 HDMI 显示器以及 USB 键盘和 USB 鼠标来查看设备的外观。用户界面类似于 Android 手机,鼠标用于点击选择,通过点击/拖动进行滑动。我使用“设置”应用程序将设备连接到我的有线路由器,从而可以访问互联网。FireFox 浏览器已经安装,让我可以阅读《华盛顿邮报》。当浏览器显示新内容时,有时会出现一些延迟。

接下来,我将初始设置替换为开发测试设置,使用我大约一年前打折购买的 ASUS 多点触控触摸屏 HDMI 显示器来复制触摸屏手机界面。触摸屏显示器的 HDMI 线插入 DragonBoard 410C 上的 HDMI 连接器,USB 线插入主板上的两个 USB 端口之一。我移除了键盘,转而依赖 Android 屏幕键盘。

使用触摸屏显示器,我能够通过滑动和触摸来导航并启动应用程序。移除键盘后,屏幕键盘也可用。这是我想要用于 DragonBoard 的设置,类似于手机界面的东西。

简单的 LED 电路

一个简单的 LED 电路,用于微控制器实验,其中 GPIO 引脚的输出电压驱动 LED 的发光。该电路需要一个带有两根连接线、一个 LED 和一个电阻器的面包板。另请参阅 Instructables 文章 简单基本 LED 电路(如何使用 LED)。另请参阅这篇sparkfun 文章,发光二极管(LED),其中描述了 LED 的许多特性。

关于 LED 的一点说明。LED 是发光二极管,这意味着电流只能沿一个方向流过 LED。LED 具有极性,因此必须正确连接 LED 的引脚,使电流从阳极流向阴极。如果 LED 以错误的方向或极性连接到电路中,LED 将不会亮起。

对于大多数业余爱好类型的 LED,LED 的两个引脚长度不同,阳极是较长的引脚。阳极需要连接到电压源,例如微控制器的 GPIO 引脚或电池,阴极需要连接到地(通常是微控制器低功耗连接器上的 GND 或地引脚)。请参阅本文发光二极管 (LED),其中描述了极性以及如何识别 LED 的极性。

LED 发出的光量取决于四个因素:GPIO 引脚的输出电压、GPIO 引脚可提供的电流大小、LED 和电路中任何其他组件的电压降以及电阻器的电阻量。

流过 LED 的电流越大,它就会越亮。但是,如果电流超过 LED 的耐受范围,它就会烧毁。我们希望创建一个电路,允许足够的电流流过 LED 以达到所需的亮度水平,同时也将电流限制在 LED 的耐受水平以下,使其不会烧毁。我们通过限制施加到电路的电压和使用适当值的电阻器来限制电流。

LED 的电压降因 LED 的颜色以及 LED 中使用的材料而异。红色 LED 的电压降小于其他颜色。您可以通过更换电路中不同颜色的 LED 进行实验,而无需进行其他更改,您会发现亮度水平会因 LED 颜色而异。您还可以更换不同的电阻器,看看电阻值越低,LED 越亮。

DragonBoard 410C 低功耗连接器的 GPIO 引脚提供 1.8 伏电压,低于 Arduino Uno 的 GPIO 引脚提供的 5 伏电压。红色 LED 的电压降通常在 1.7 伏到 2 伏之间。对于使用连接到 DragonBoard 410C 的 1.8V GPIO 引脚的红色 LED 的简单 LED 电路,10 欧姆电阻器应该足够了。根据我看到的一些文档,由于 GPIO 引脚的低电压,甚至不需要电阻器。

对于多个 LED,您可以在面包板上使用一个共用接地,每个 LED 阴极连接到共用接地,然后从共用接地连接到 DragonBoard 410C 低功耗连接器上的 GND 或接地引脚。如果您希望以不同的速率闪烁单个 LED,则每个 LED 都需要自己的 GPIO 引脚。我没有尝试将几个 LED 连接到单个 GPIO 引脚,并且我没有足够的电子知识来预测这是否适用于超过几个 LED 的情况。

检查 LED 电路

由于 DragonBoard 410C 具有 1.8v 和 5v 电源引脚,因此检查 LED 是否正确插入(极性是否正确)的一种快速方法是将电路连接到连接器的 1.8v 电源引脚和接地引脚,LED 应该会亮起。如果它不亮,请检查您的电路接线是否正确。检查 LED 极性的一种快速方法是只需从面包板上拔下 LED,将其翻转并重新插入电路中。

如果 LED 极性正确,LED 不亮起的另一个可能原因是电阻器对电路供电的功率而言电阻过大。电阻器的大小取决于施加到电路的电压,由 1.8v 供电的 LED 电路需要比 5v 电压源更小值的电阻器。

设置 Windows 10 开发环境

我正在使用安装了 Windows 10 专业版的笔记本电脑作为我的开发环境。笔记本电脑上安装了 Android Studio。我的开发环境如下:

  • 带有 Windows 10 专业版的 Dell 笔记本电脑
    • 已安装 Android Studio(Android Studio 需要 Java JDK)
    • 已安装 Android SDK 平台工具(用于 adb 应用程序)
    • 已安装 Git
  • 带 HDMI 和触摸 USB 连接到 DragonBoard 410C 的 ASUS 触摸屏显示器
  • 带电源的 DragonBoard 410C(我两者都从 Arrow Electronics 购买)
  • 一端为 USB A,另一端为 micro USB 连接器,用于将 DragonBoard 连接到 PC 的手机充电线

Android 调试桥 (ADB) 软件独立于 Android Studio 安装。请参阅下面的 ADB 部分,我提供了有关 ADB 的一些文章链接。我的第一次实验不需要 *adb* 应用程序,我能够在不安装 Android SDK 平台工具的情况下进行简单的应用程序开发,专注于用户界面更改。但是,一旦我开始研究闪烁 LED,我就不得不更改 DragonBoard 启动脚本,这需要使用 *adb* 工具将脚本从/到我的开发 PC 拉取和推送。

为了测试开发环境,我使用 Android Studio 创建了一个简单的测试应用程序。该测试应用程序是根据 Android Studio 为新项目在“创建新项目”对话框中提供的简单模板(基本活动模板)生成的。生成的项目是 Java 和 Kotlin 源代码以及许多包含窗口和用户界面代码的 *.xml* 文件的组合。我能够在 Android Studio 中切换用户界面布局的设计视图和代码视图。

我使用手机充电线将 PC 连接到 DragonBoard。Windows 10 识别了新的 Android 设备,并为我设置了必要的驱动程序,以便设备可用于 Android Studio。然后我将测试应用程序下载到 DragonBoard,它出现在 *apps* 文件夹中。

我能够启动应用程序并使用触摸屏显示器操作简单的控件,感觉就像 Android 智能手机一样。

DragonBoard 基本操作

开机和关机

当电源插入墙壁插座并连接到 DragonBoard 时,主板会开机。开机大约需要 30 秒到一分钟,显示器上会显示 Qualcomm Snapdragon 徽标闪屏,随后是 Android 5.1 用户界面。

DragonBoard 上有一个电源按钮,可用于关闭或打开设备。

要关闭 DragonBoard,请按住电源按钮,直到显示器上出现提示,允许您确认关机,此时设备将关闭。

注意:在研究设备期间,我遇到过这样的建议:在拔下设备之前,应始终将其关机,以便进行有序关机。还建议一旦关机,应拔下设备,不要一直插着电,因为设备可能会重启。

连接到 PC 主机

两个 USB A 连接器是用于键盘或鼠标等外设的主机连接器。要将 DragonBoard 连接到 PC 主机,您需要连接一根 USB 线,一端是 USB A 连接器,另一端是 micro B USB 连接器,然后将其插入设备上的 micro B USB 连接器。大多数 Android 智能手机(如我的三星 Galaxy 7 Edge)随附的充电器线都可以正常工作。

我注意到,当 DragonBoard 连接到 PC 主机时,HDMI 显示屏会变黑。我不确定为什么会这样。但是,当我断开设备与主机的 USB 连接线时,显示屏会重新显示并显示 Android 用户界面。

ADB (Android 调试桥)

文档中提到除了 Android Studio 之外还要安装软件。最重要的组件是 adb 应用程序。这是 SDK 平台工具包的一部分,该工具包与 Android Studio 是独立安装的。

网上有许多文章和指南。我发现的大多数都已过时。以下是截至 2020 年 8 月我的经验。

请参阅 developer.android.com 上关于 ADB 的这篇文章:Android 调试桥 (adb)。文章中有一个指向平台工具的链接。

引用

adb 包含在 Android SDK 平台工具包中。您可以使用 SDK 管理器下载此工具包,它会将其安装到 android_sdk/platform-tools/。或者,如果您想要独立的 Android SDK 平台工具包,可以在此处下载

在 SDK 平台工具发布说明文章中,有特定操作系统的链接可下载 SDK 平台工具。由于我使用 Windows 10 进行开发,我选择了该链接,结果下载了一个 *.zip* 文件。zip 文件中有一个 platform-tools 目录。我将该目录和来自 *.zip* 文件的目录树复制到 *C:\Program Files\Android* 文件夹,这是 Android Studio 已安装的文件夹。

另请参阅这篇文章,什么是 ADB?如何安装 ADB、常见用法和高级教程

adb 应用程序需要一根 USB 线将开发计算机连接到 DragonBoard。我使用 Windows 10 命令外壳导航到 adb 所在的文件夹,然后使用命令行。

在设置 DragonBoard GPIO 引脚时,我使用 *adb* 将 */etc/init.qcom.post_boot.sh* 的副本拉取到我的 PC,使用 *Notepad* 应用程序修改它,然后将修改后的版本推送回去。我将稍后解释该过程。

我还使用命令 *adb shell* 打开一个远程 shell 到 DragonBoard,在那里可以使用标准的 Linux 命令 *ls* 和 *cd* 来查看文件系统。我使用 *adb reboot* 命令来重启 DragonBoard。

使用 Android Studio

我之前没有做过任何 Android 应用程序开发,所以 Android Studio 对我来说是全新的。然而,虽然界面不熟悉,但应用程序开发的基本功能和过程让我想起了使用 Visual Studio 2019 Community Edition 开发 UWP 应用程序。源代码是 Kotlin 或 Java,以及各种包含用户界面标记和文本字符串等资源的 *.XML* 文件。

Android Studio 中有多种设备模拟器可供使用,让您可以看到用户界面的外观和工作方式。在主机 PC 连接到 DragonBoard 的情况下,Android Studio 将创建必要的 *.apk* 文件并将应用程序下载到设备上,它将出现在应用程序选择中。

DragonBoard 410C 预装 Android 5.1,而 Android Studio 默认安装的 SDK 是最新 SDK,本文撰写时是 Android 10.0,因此您需要安装 Android 5.1 SDK。这可以通过 Android Studio 的“**工具**”菜单中的 SDK 管理器完成,该管理器提供了所有可用 Android SDK 版本的列表。您可以安装多个不同的版本。

您还可以从 Android Studio 的“**工具**”菜单中,使用 ADV 管理器添加额外的模拟器并更改模拟器使用的 Android 版本。

关于 Android Studio 的额外思考

我的理解是,也可以进行原生 C/C++ 开发,但这需要使用 Android Studio 的 SDK 管理器来安装必要的组件。我还看到过描述使用 Python 进行应用程序开发的文章和视频。

除了 Android Studio,Eclipse 也可以使用(请参阅如何设置 Eclipse 以进行 Android 应用程序开发),但我没有尝试过。而且看起来 Visual Code 也可以使用。但是,请阅读这篇文章,为什么 Android Studio 比 Eclipse 更适合 Android 开发者

另外,请参阅这篇文章 使用片段的 Android 导航抽屉示例,以了解 Android Studio 的使用。这篇文章让您了解了创建新项目的基本过程和 Android Studio 的基本用法。

我过去曾使用过 Eclipse,对我来说。使用 Android Studio 并没有那么复杂,也不需要费力安装。最重要的是,我能够下载 Android Studio,将其安装到我的 Windows 10 PC 上,并在十分钟内让我的第一个演示应用程序在我的 DragonBoard 上运行。

将 Kotlin 与 Android Studio 结合使用

Android Studio 鼓励使用 Kotlin 编程语言编写业务逻辑源代码(请参阅 kotlinlang.org 上的Kotlin 编程教程)。YouTube 上似乎有很多关于学习 Kotlin 和 Android 开发基础知识的演示(例如,请参阅这个简短的 10 分钟视频使用 Kotlin 制作您的第一个简单 Android 应用程序)。

Android Studio 提供代码补全以及几个内置的有用工具,可帮助理解和纠正错误。其中一个有用的工具是自动将 Java 源代码转换为 Kotlin 源代码的工具,因为许多 Android 源代码示例都是用 Java 编写的。

Linux 内核伪文件和使用 GPIO 引脚

作为学习如何访问 40 引脚低功耗连接器的 GPIO 引脚的一部分,我花了一些时间学习如何使用 sysfs 功能和 */sys/class/gpio* 的 Linux 内核伪文件的基础知识。

我做的第一件事之一是在 StackOverFlow 上发布了一个问题,/sys/class/gpio/export 和 /sys/class/gpio/unexport 机制是什么?底层 sysfs 功能是什么?,以寻求帮助并提供一个地方来放置我在搜索理解过程中发现的任何研究笔记。

操作系统

DragonBoard 410C 出厂时安装了 Android 5.1.1。当我检查时,内核版本是 3.10.49,构建号是 90。

我的初始工作是使用此版本完成的。一旦我订购的 32GB microSD 卡到货,我使用带有 SD 卡读卡器的 Windows 10 PC 将 96Boards 的最新 Android 5.1.1 映像安装到卡上,然后将其安装到设备的 eMMC 中。内核版本也是 3.10.49,但构建号是 99。

96Boards 网站提供了多种不同的操作系统,包括 Android、几种不同的 Linux 发行版和 Windows 10 IoT。

请参阅使用 DragonBoard 410C 页面及其上的文档和操作系统产品。

Using the Code

我为我的 DragonBoard 410C(带 Android 5.1)创建的第一个 Android Studio 应用程序仅仅是 Android Studio 从“新建项目”对话框中选择的基本模板生成的应用程序。我没有对生成的项目进行任何更改,只是编译它,然后在设备上运行生成的应用程序。

成功之后,我开始探索代码并熟悉 Android Studio,通过对 UI 进行一些小改动,例如添加按钮、修改文本字符串等。

应用程序的第一个扩展是访问低功耗 40 引脚连接器的 GPIO 引脚以闪烁 LED。成功完成此任务后,第二个扩展是闪烁多个 LED。

访问和使用 40 引脚低功耗连接器

我必须做的第一件事是找到一个库,允许我访问和操作 40 引脚低功耗连接器上的 GPIO 引脚。有几种方法可以实现这一点。

对于较旧的嵌入式 Linux,sysfs 接口方法是可用的,尽管速度较慢,其中位于“*/sys/class/gpio*”目录中的文件代表实际引脚。请参阅 kernel.org 文章 面向用户空间的 GPIO Sysfs 接口,其中提供了接口的描述。

有一些库可以直接与硬件配合使用。其中一个库 `libgpiod` 需要 Linux 4.8 中引入的 Linux GPIO 字符设备接口。根据 android.stackexchange.com 上这篇帖子中的表格,哪个 Android 运行哪个 Linux 内核?,Android 5.1 使用 Linux 3.16.1 版本,这似乎排除了使用 sysfs 接口之外的任何替代方案。

在学习如何访问 DragonBoard 410C 40 引脚低功耗连接器上的 GPIO 引脚时,我在 stackoverflow.com 上发布了这个问题,其中包含了最终的解决方案,在运行 Android 的 DragonBoard 410C 上访问 GPIO 低功耗连接器,以及背景材料的链接。

sysfs 的启动脚本更改

我需要修改启动脚本 */etc/init.qcom.post_boot.sh*,以便创建必要的 sysfs 特殊文件并进行必要的访问权限更改。这需要使用 *adb* 从 DragonBoard 中拉取文件的副本,修改它,然后推回。DragonBoard 重新启动后,启动脚本会创建特殊文件。

要使用 adb,您需要以 *root* 用户身份重新启动 adb 守护进程,然后 *重新挂载* 文件系统,使其可写。完成此操作后,您就可以使用 adb pull 命令从设备中拉取 */etc/init.qcom.post_boot.sh* 文件的副本,进行更改,然后使用 adb push 命令将修改后的 */etc/init.qcom.post_boot.sh* 文件推送到 DragonBoard 410C。推送编辑后的文件后,我使用 adb reboot 命令重新启动设备。

我在 Windows 10 上做了一件事,让它对我来说更容易,就是创建了一个文件夹 *C:\adbtempfiles*,我可以用它来放置我用 adb 拉取的任何文件。

adb root
adb remount
adb pull /etc/init.qcom.post_boot.sh /adbtempfiles/init.qcom.post_boot.sh

编辑 *init.qcom.post_boot.sh* 文件,然后使用 adb 推送修改后的文件并重新启动设备。重新启动后,您可以使用 adb shell 命令启动远程 shell,然后导航到 */sys/class/gpio* 文件夹以检查 GPIO 伪文件是否已创建。

adb push /adbtempfiles/init.qcom.post_boot.sh /etc/init.qcom.post_boot.sh
adb reboot
adb shell
cd /sys/class/gpio
ls
exit

将以下 shell 脚本添加到 */etc/init.qcom.post_boot.sh*,会在文件系统中创建特殊设备条目,从而允许操作 40 引脚低功耗连接器的 GPIO 引脚。此源可以添加到从 DragonBoard 410C 获取的文件的末尾,以便在设备重新启动时,初始化脚本将创建必要的特殊设备文件。

警告:GPIO 引脚号适用于 Android。Linux GPIO 引脚号不同。

set -A pins 938 915 1017 926 937 930 914 971 901 936 935
for i in 0 1 2 3 4 5 6 7 8 9 10
do
    echo ${pins[i]} > /sys/class/gpio/export;
    chmod 777 /sys/class/gpio/gpio${pins[i]};
    chmod 777 /sys/class/gpio/gpio${pins[i]}/value;
    chmod 777 /sys/class/gpio/gpio${pins[i]}/direction;
done

chmod 命令正在设置这些文件的读/写/执行权限,允许任何人访问和操作这些特殊设备文件。这在产品设备上可能会有安全问题,因此请将其视为仅用于测试和开发。

kernel.org 中 面向用户空间的 GPIO Sysfs 接口的描述是这样说的,关于 valuedirection 等属性:

引用
“方向”……

读取为“in”或“out”。此值通常可写入。写入“out”默认为将值初始化为低电平。为了确保无干扰操作,可以写入值“low”和“high”以将 GPIO 配置为具有该初始值的输出。

请注意,如果内核不支持更改 GPIO 的方向,或者它是由内核代码导出的,而该代码未明确允许用户空间重新配置此 GPIO 的方向,则此属性*将不存在*。

“值”……

读取为 0(低)或 1(高)。如果 GPIO 配置为输出,则此值可写入;任何非零值均视为高电平。

如果引脚可配置为生成中断,并且已配置为生成中断(参见“edge”的描述),则可以在该文件上进行 *poll(2)*,并且 *poll(2)* 将在中断触发时返回。如果使用 *poll(2)*,请设置事件 *POLLPRI* 和 *POLLERR*。如果使用 *select(2)*,请在 *exceptfds* 中设置文件描述符。在 *poll(2)* 返回后,要么 *lseek(2)* 到 sysfs 文件的开头并读取新值,要么关闭文件并重新打开以读取值。

“边缘”……

读取为“无”、“上升”、“下降”或“两者”。写入这些字符串以选择将使“value”文件上的 *poll(2)* 返回的信号边缘。

此文件仅当引脚可配置为中断生成输入引脚时才存在。

“active_low”……
读取为 0(假)或 1(真)。写入任何非零值以反转读取和写入的值属性。现有和后续的 *poll(2)* 支持通过边缘属性配置“上升”和“下降”边缘将遵循此设置。

另请参阅 poll(2) — 来自 man7.org 的 Linux 手册页 以及 poll(2) - 来自 linux.die.net 的 Linux 手册页,以了解 Linux 中 poll() 系统服务的解释。这两篇文章都包含相似的信息,尽管 man7.org 文档还包含一个简短的 C 程序示例。另请参阅 select(2) — 来自 man7.org 的 Linux 手册页lseek(2) — 来自 man7.org 的 Linux 手册页

到目前为止,我还没有能够确定如何从 Kotlin 源代码访问 poll() 函数。

引导脚本更改以访问用户 LED

DragonBoard 410C 在两个 USB A 连接器之间有一组四个用户 LED。这些用户 LED 可以通过 sysfs 接口访问,但哪些用户 LED 可用取决于操作系统,Android(用户 LED 1、2 和 3)或 Linux(仅用户 LED 4)。

这些用户 LED 位于 */sys/class/leds* 文件夹中,请参阅 StackOverflow 帖子 如何在运行 Linux 的 Dragonboard 410c 上切换板载 LED。该帖子描述了如何操作用户 LED 以及哪些用户 LED 分配给 Android 和 Linux 操作系统用于指示。

您可以修改开机后脚本 * /etc/init.qcom.post_boot.sh*,通过 sysfs 接口使用户 LED 可通过其伪文件访问。

# Set the permisions of the user LED pseudo files so that
# we can use the sysfs interface to turn them on and off.
# The following LED names are from Andoid which allows
# three of the four user LEDs, located between the two
# USB connectors of the DragonBoard 410C, to be used.
set -A pins led1 led2 led3
for i in 0 1 2
do
    chmod 777 /sys/class/leds/${pins[i]};
    chmod 777 /sys/class/leds/${pins[i]}/brightness;
done

然后,可以通过向 *brightness* 伪文件写入 1 来打开 LED,或通过向 *brightness* 伪文件写入 0 来关闭 LED,如下所示:

echo 1 > /sys/class/leds/led1/brightness

echo 0 > /sys/class/leds/led1/brightness

每个用户 LED 还带有一个关联的 *trigger* 伪文件,允许您分配一个内核事件来触发 LED 的开/关。请记住,如果您打算更改 *trigger* 特性,请修改文件权限。以下显示了查询 * /sys/class/leds* 文件夹中几个 LED 的 *trigger* 特性:

root@msm8916_64:/sys/class/leds # cat boot/trigger
none bkl-trigger [boot-indication] usb-online mmc0 mmc1 battery-charging-or-full battery-charging battery-full battery-charging-blink-full-solid wlan-indication-led
root@msm8916_64:/sys/class/leds # cat led1/trigger
[none] bkl-trigger boot-indication usb-online mmc0 mmc1 battery-charging-or-full battery-charging battery-full battery-charging-blink-full-solid wlan-indication-led
root@msm8916_64:/sys/class/leds # cat wlan/trigger
none bkl-trigger boot-indication usb-online mmc0 mmc1 battery-charging-or-full battery-charging battery-full battery-charging-blink-full-solid [wlan-indication-led]

使用 sysfs 的 Kotlin 源代码

在研究操作 40 引脚低功耗连接器 GPIO 引脚的方法时,我偶然发现了一篇 Instructable 文章,其中附带了包含 Java 源代码的文件,该文件实现了一个使用 sysfs 功能操作 GPIO 引脚的简单库。

我从该 Java 源代码开始,将其转换为 Kotlin 源代码,并进行了一些修改。互联网上似乎有几个类似的用于 Android 的 Java 源代码库。GPIO 库的源文件包含一个注释,其中包含指向我获取 Java 源代码的原始文章的链接。

关于这个 GPIO 库需要注意的一点是,它仅为数字引脚设计,即高电平提供电压或低电平不提供电压的引脚。

获取/设置 GPIO 引脚值的 Kotlin 示例代码

以下来自 *Gpio.kt* 文件的摘录显示了用于获取/设置 GPIO 引脚值的 Kotlin 代码,该引脚的方向设置为输出。有两个函数 pinHIGH()pinLOW(),一个通过将值设置为 1 来打开引脚,另一个通过将值设置为 0 来关闭引脚。通过写入 GPIO 引脚的特殊设备文件来设置值。

例如,如果 GPIO 引脚是低功耗连接器上的物理引脚 23,那么在 Android 5.1 下,它是 GPIO 938,因此要更改值,您需要写入 */sys/class/gpio/gpio938/value*。

    var value: Int
        get() {
            println("Getting Value")
            var line = ""
            try {
                val br = BufferedReader(FileReader(MakeFileName(pin, "/value")))
                line = br.readLine()
                br.close()
            } catch (e: Exception) {
                println("Error: " + e.message)
            }
            return line.toInt()
        }
        private set(value) {
            println("Setting Value")
            try {
                val out = BufferedWriter(FileWriter(MakeFileName(pin, "/value"), false))
                out.write(Integer.toString(value))
                out.close()
            } catch (e: IOException) {
                println("Error: " + e.message)
            }
        }

    /**
     * Set pin as high.
     */
    fun pinHigh() {
        value = HIGH
    }

    /**
     * Set pin as low.
     */
    fun pinLow() {
        value = LOW
    }

关注点

在研究如何访问 Android 下的 GPIO 引脚时,我在 StackOverflow 上发布了这个问题在运行 Android 的 DragonBoard 410C 上访问 GPIO 低功耗连接器,其中讨论了在 Linux 内核版本较高的情况下使用 sysfs 的几种替代方案。

能够使用 Android Studio 将 Java 源代码转换为 Kotlin 非常方便。Android Studio 本身也很容易上手,至少是基础知识。GitHub 作为版本控制系统可通过 UI 的 VCS 菜单获得。

Android Studio 的布局设计器并不总是直观的,组件/小部件约束系统似乎有点晦涩难懂,很难预测更改后的实际布局结果。我最终在下载到设备之前使用模拟器对布局进行基本检查。

当我希望在 DragonBoard 410C 上安装和运行应用程序并从我的 PC 调试它时,我发现学习如何使用 Android Studio 进行远程调试很困难。当 Micro B USB 数据线连接在主机 PC 和 DragonBoard 410C 之间时,设备连接的显示器不显示任何内容。我不确定为什么会这样。我所做的是使用“**调试**”菜单的“**调试应用程序**”菜单项,它会执行构建,然后在数据线连接的情况下从主机 PC 将应用程序安装到设备上,然后拔下主机 PC 的数据线,这样我就可以与应用程序进行交互。

历史

  • 2020 年 9 月 8 日:初始版本
    • 本文的第一个版本旨在讨论通过 DragonBoard 410C 的 40 引脚低功耗连接器的 GPIO 引脚操作 LED 的基础知识。基础知识包括对简单 UI 进行更改,添加按钮和文本字段,并将按钮链接到 Kotlin 源代码,从而提供与连接到 GPIO 引脚的面包板上的一组 LED 不同的行为。
  • 2020 年 9 月 9 日:修订 9
    • 在更新到 96Boards 提供的最新 Android 版本时,我发现需要更详细地说明如何使用 *adb* 工具更新 */etc/init.qcom.post_boot.sh*,所以我更新了该部分。
  • 2020 年 9 月 22 日:修订 10
    • 添加了“引导脚本更改以访问用户 LED”部分,描述了如何访问和使用位于两个 USB A 连接器之间的用户 LED。

未来计划

我打算更新此代码,以研究如何处理来自简单设备(如按钮开关)的 GPIO 引脚输入。

之后,我打算研究使用低功耗连接器上的额外引脚,配合使用 I2C 和 SPI 通信协议的设备。

© . All rights reserved.