Tiny4412——Android访问硬件的方法

CSDN仅用于增加百度收录权重,排版未优化,日常不维护。请访问:www.hceng.cn 查看、评论。
本博文对应地址: https://hceng.cn/2019/03/15/Tiny4412——Android访问硬件的方法/#more

2019年,正式学习Android驱动。
以LED为切入点,学习Android访问硬件的方法。

之前写第一个Linux下的LED驱动时候,提到:Linux驱动 = 裸机 + 框架
这个思维在写Linux驱动的过程中,得到了充分验证。
如今,学习Android驱动,开始验证:Android驱动 = Linux驱动 + 框架

1. 环境搭建

开发环境主要包含:
1.一个Linux主机(虚拟机),在该主机里编译Linux内核和Android源码等;
2.一个Windows主机,在该主机里编写Android APP,并连接开发板调试;

1.1 搭建Ubuntu虚拟机

前面在学习Java时,已经安装了Ubuntu18.04的虚拟机,这里继续使用该虚拟机。

值得一提的是,虚拟机的内存给多一点,虚拟机参考配置:内存6G,硬盘100G,CPU 8核
在编译内核源码的过程中,发现编译太慢,一般挂一晚上都能编译好,之前内存给小了,编译了一天一夜也没好,后来改大了内存后,一会就编译完了。

1.2 编译Kernel和Android

以下所有安装包都是从百问网云盘下载。

1、安装交叉编译工具链
下载arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz并解压。
修改/etc/environment,将解压的交叉编译工具链加在末尾:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/tools/toolschain/4.5.1/bin"

执行source /etc/environment更新环境变量。
此时执行arm-linux-gcc -v,打印出gcc version 4.5.1 (ctng-1.8.1-FA)即OK。

2、编译Kernel
下载linux-3.0.86-20150324.tgz并解压。
进入内核源码根目录执行:

cp tiny4412_android_defconfig .config
make zImage

最后生成/work/linux_source/linux-3.0.86/arch/arm/boot/zImage

3、编译Android
下载android-5.0.2-fs-20150325.tar.gz并解压。
进入Android源码根目录执行:

. setenv
lunch

在选择界面:

You're building on Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_mips-eng
     4. aosp_mips64-eng
     5. aosp_x86-eng
     6. aosp_x86_64-eng
     7. mini_emulator_x86-userdebug
     8. m_e_arm-userdebug
     9. mini_emulator_arm64-userdebug
     10. mini_emulator_mips-userdebug
     11. mini_emulator_x86_64-userdebug
     12. aosp_hammerhead-userdebug
     13. aosp_mako-userdebug
     14. full_tiny4412-userdebug
     15. full_tiny4412-eng
     16. aosp_shamu-userdebug
     17. aosp_deb-userdebug
     18. aosp_flo-userdebug
     19. aosp_grouper-userdebug
     20. full_fugu-userdebug
     21. aosp_fugu-userdebug
     22. aosp_tilapia-userdebug
     23. aosp_manta-userdebug

Which would you like? [aosp_arm-eng] 

输入15,即选择full_tiny4412-eng
再执行make –j8,等待几个小时,编译完成后执行./gen-img.sh生成/work/android_source/android-5.0.2/system.img.

当然编译过程不可能是那么一帆风顺的,实际编译Android源码过程中遇到的问题有:
①JDK版本过高,重新安装openjdk-7-jdk,参考解决链接。
②编译报错aidl_language_l,参考解决链接。
③编译报错error: unsupported reloc 43,参考解决链接。
④制作映像文件出错mkimage: command not found,执行sudo apt-get install u-boot-tools安装即可。

4、烧写
使用厂家提供的MiniTools
zImagesystem.img分别烧写到Android KernelAndroid RooFs/System Image

1.3 安装JDK(Windows)

因为要在Windows上使用Android Studio编写APP,所以在Windows上也需要安装Java JDK(Java Development Kit)。
通过Oracle官网下载最新的JDK:

安装好后,将JDK安装路径加入Windows的环境变量:

最后在CMD里验证:

1.4 安装Android Studio

首先从官网下载Android Studio。

点击安装,会弹出首次运行没有Android SDK,点击“Cancel”。

然后选择"Custom"以自定义SDK安装路径。在弹出的界面勾选上"Android Virtual Device",再指定SDK的安装路径。

此时会下载Android SDK和AVD,两个文件都很大,为了C盘节省空间,应用界面只指定了SDK的安装路径在D盘,还需手动指定AVD的安装路径,这个需要修改环境变量设置。

然后,等待一段时间就安装完了。

1.5 Android Studio的常用快捷键

参考博客:Android Studio2.0 教程从入门到精通MAC版 - 提高篇

2. Android应用程序

我的目的是写一个Android应用程序,通过该应用程序控制开发板上的LED灯。
因此首先得设计一个APP,该APP有一个总开关控制所有灯的亮灭,每个灯又有单独的开关控制亮灭。

2.1 创建APP工程

打开Android Studio,选择"Start a new Android Studio project"创建一个新APP工程。
然后选择"Empty Activity"空主界面,最后设置APP信息、保存路径、兼容API版本。

等待自动创建完成后,会自动生成工程文件,其中有两个文件后面常用:

  • app\src\main\res\layout\activity_main.xml,界面控件布局文件,既可通过图形界面设计控件,也可直接编辑xml;
  • app\src\main\java\cn\hceng\led\MainActivity.java,实现控件各种具体功能,逻辑关系。

2.2 常用控件介绍

2.2.1 TextView

TextView是文本视图,用来显示文字的。

  • xml创建:
    {% codeblock lang:xml %}

    {% endcodeblock %}

1.标签代表着要在Activity中添加一个TextView,标签中可以设置一些属性;
2.**android:id代表TextViewID,也就是TextView的唯一标识;在java代码中我们可以通过findViewById()方法来通过ID获取控件;上述控件的唯一IDTEXT
3.
android:layout_width代表控件的宽度,该属性的值是match_parent,表示该控件的宽度与父视图的宽度相同;
4.
android:layout_height代表控件的高度,该属性的值是wrap_content,表示控件的高度根据内容的高度进行改变;
5.
android:gravity代表文字对齐方式,该属性的值是center,表示居中显示;
6.
android:text代表文字内容,该属性的值是hceng first APP!,表示显示这串字符;
7.
android:textColor代表文字的颜色,该属性的值是#008577,表示16进制色值的绿色;
7.
android:textSize代表文字的大小,该属性的值是25sp,长度宽度的数值用dp,字体的大小用sp
7.
android:textStyle**代表文字的样,normalbolditalic分别为正常,加粗、斜体,默认为normal

  • 代码控制:
    {% codeblock lang:java %}
    import android.widget.TextView;

      TextView myTextView = (TextView) findViewById(R.id.TEXT);
      String myText = myTextView.getText().toString();
      myTextView.setText(myText+"  Add String");
    

{% endcodeblock %}

2.2.2 Button

Button是按钮,用来控制某个目的的开关。

  • xml创建:
    {% codeblock lang:xml %}

    {% endcodeblock %}

1.Button标签里面的属性和前面TextView基本类似,这里就不赘述了;

  • 代码控制:
    Activity的类中也是使用findViewById()来通过ID获取该按钮。
    获取按钮后需要给按钮绑定点击事件,也就是点击按钮要做的事情,常用的方法有四种:布局文件指定响应函数直接匿名内部类新建子类实现在当前类实现接口

布局文件指定响应函数

在布局文件的

你可能感兴趣的:(Android驱动,嵌入式基础,Linux驱动)