Android.mk android驱动学习1-驱动开发流程

软件环境:
操作系统: 10
IDE版本:3.4.2
JAVA版本:jdk-8u221--x64
NDK版本:-ndk-r20--
版本:linux 3.0
开发板版本: 4.0.3
硬件环境:
开发板:itop-4412精英版
本文内容:本文描述了如何使用应用程序调用linux驱动控制LED灯的亮灭 。要实现应用程序控制LED,需要三个程序,LED的linux驱动,JNI库和应用程序 。应用程序通过JNI库调用LED驱动程序,从而实现应用程序控制LED 。

Android.mk  android驱动学习1-驱动开发流程

文章插图
1.开发板环境搭建
开发环境搭建请参考《iTOP-4412开发板之精英版使用手册_V3.1.pdf》,本文使用的配置是
uboot:320.tar
:..tar
:51120.tar
编译完成后将-uboot.img,.img,,u-boot-iTOP-4412.bin文件通过OTG或SD烧写到开发板的EMMC中,如果在uboot下使用OTG,发现 10装不上光盘中的.exe驱动,可以谷歌搜索安装.exe 。
2.LED的驱动程序
LED驱动在的/char/-leds.c中,从-leds.c中我们可以得知LED驱动的设备文件名叫“leds” 。驱动程序实现了ioctl函数 。
long leds_ioctl(struct file *filp,unsigned int cmd,unsigned long arg){printk("debug: leds_ioctl cmd is %d\n" , cmd);switch(cmd){case 0:case 1:if (arg > LED_NUM) {return -EINVAL;}gpio_set_value(led_gpios[arg], cmd);break;default:return -EINVAL;}return 0;}
的cmd参数表示灯的亮灯,arg参数表示灯的编号,根据文件中的定义可以知,0表示,也就是LED2,1表示,也就是LED3 。
static int led_gpios[] = {EXYNOS4_GPL2(0),EXYNOS4_GPK1(1),};
【Android.mkandroid驱动学习1-驱动开发流程】接下来我们查看/char/文件,宏控制LED驱动是否编译
obj-$(CONFIG_LEDS_CTL)+= itop4412_leds.o
Android.mk  android驱动学习1-驱动开发流程

文章插图
再查看/char/文件,默认就是y
config LEDS_CTLbool "Enable LEDS config"default yhelpEnable LEDS config
再查看.,已经将LED驱动编入了内核
CONFIG_LEDS_CTL=y
看来板子的驱动已经做好了,完全不用我们动手,接下我们看怎么编写JNI接口调用linux驱动
3.JNI和NDK
因为是使用java语言进行开发的,但linux驱动是用C语言进行开发的,所以面临java如果调用C语言接口的问题,JNI提供的API就是解决java和其他语言通信的问题 。NDK 是一套工具集合,允许你使用C语言来实现应用程序的部分功能 。我们写好JNI接口后使用NDK打包成库文件,就可以提供给应用程序调用了 。接下来我们新建工程编写JNI 。
新建一个空
填写工程名,选择工程路径,开发语言选择java,API选择15
创建工程后得待编译完成,然后在包名下创建一个名叫的类
文件内容如下:
package com.example.led_test;public class jni_led {public native static String Leds_Operation(int ledNum, boolean status); //操作接口}
打开的 ,使用javac命令将java文件编译成.class文件
F:\OneDrive\Linux\android_project\led_test>javac .\app\src\main\java\com\example\led_test\jni_led.java
使用javah命令创建头文件 。- UTF-8表示指定编码格式,防止出现“错误: 编码GBK的不可映射字符”,-d jni表示在当前目录下创建jni目录,将生成的文件放在jni目录中,-表示指定类文件的路径 。这里有一个地方要注意,类文件在写的时候是包名+类名,所有路径只用写到java目录,后面的com,和虽然都是文件夹,但这里表示包名(第一次写在这里纠结了好久,我想我路径明明写对了啊,为什么找不到\app\src\main\java\com\\文件夹下的类)
F:\OneDrive\Linux\android_project\led_test>javah -encoding UTF-8 -d jni -classpath ./app/src/main/java com.example.led_test.jni_led