Android 驱动编写LED-NDK程序

1. 首先编写LINUX内核模块LED

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/cdev.h>

MODULE_LICENSE("GPL");

#define GPM4CON 0X110002E0
#define GPM4DAT 0X110002E4

#define LED_ON _IOW(‘G‘,0,int)

#define LED_OFF _IOW(‘G‘,1,int)

static struct cdev dev;//1.1 分配cdev结构

static dev_t dev_no;
struct class *led_class;

static unsigned int *led_con;
static unsigned int *led_dat;

long led_ioctl( struct file *file, unsigned int cmd, unsigned long arg )
{
  switch( cmd )
  {
    case LED_ON:
      writel((readl(led_dat)&(~(0x1<<(arg-1)))),led_dat);
      break;

    case LED_OFF:
      writel( (readl(led_dat)|(0x1<<(arg-1))),led_dat);
      break;

    default:
      return -EINVAL;
      break;
  }
  return 0;
}

struct file_operations led_fops = {
  .owner = THIS_MODULE,
  .unlocked_ioctl = led_ioctl,
};

static void hw_init()
{

  //初始化GPIO控制寄存器
  led_con = ioremap( GPM4CON, 4 );  //地址映射
  led_dat = ioremap( GPM4DAT, 4 );
  writel((readl(led_con)&~0xffff)|0x1111,led_con);
  writel(readl(led_dat)|0xf,led_dat);  

}

static int led_init()
{

  //1.2 初始化cdev结构
  alloc_chrdev_region( &dev_no, 0, 1, "my_led" );
  cdev_init( &dev, &led_fops );
  dev.owner = THIS_MODULE;
  //1.3 注册cdev结构
  cdev_add( &dev, dev_no, 1 );
  //2.硬件初始化
  hw_init();
  //3.创建设备文件
  led_class = class_create(THIS_MODULE,"my_led");        //创建设备类
  device_create( led_class, NULL, dev_no,NULL,"%s","my_led");

  printk("init led device ok!\n");

  return 0;
}

void led_exit()
{
  device_destroy(led_class,dev_no);
  class_destroy(led_class);

  iounmap(led_con);
  iounmap(led_dat);

  cdev_del(&dev);
  unregister_chrdev_region(dev_no,1);
}

module_init( led_init );
module_exit( led_exit );

 2. 需要生成头文件。

生成头文件则需要应用程序。故用国嵌提供的app软件。解压后修改local.properties文件相应的地址。

打开studio.sh,重新编译工程。

编译工程后,在app的工程文件那个文件夹执行命令。

javah -d jni -classpath /opt/android-sdk-linux/platforms/android-23/android.jar:/home/my_Android/led\
/NDK/NDK_APP/app/build/intermediates/classes/debug/ com.android.jack.ndk.happy.MainActivity

其中/opt/android-sdk-linux/platforms/android-23/android.jar是安卓sdk中的地址。

/home/my_Android/led/NDK/NDK_APP/app/build/intermediates/classes/debug/ 是相应安卓app源文件工程中的地址。

com.android.jack.ndk.happy.MainActivity为安卓的项目名称。

运行命令后,会在目录中生成jni文件夹。其中com_android_jack_ndk_happy_MainActivity.h为我们需要的头文件。

其中的文件声明为我们需要实现的函数。

在jni文件中创建ndk_led.c源文件和makefile文件Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ndk_test_myled
LOCAL_SRC_FILES := ndk_led.c
include $(BUILD_SHARED_LIBRARY)

若想生成静态库 则修改SHARED为STATIC即可。

然后返回上一级目录  执行命令ndk-build。将会生成libs/armeabi/libndk_test_myled.so 库文件。

以上就是对Android 驱动编写LED-NDK程序的资料整理,谢谢大家对本站的支持!

(0)

相关推荐

  • android开发实践之ndk编译命令简单示例

    前言 Android提供了NDK工具,用来编译native代码(c/c++),该工具配置好了相关的交叉编译环境和工具链,只需要你简单地编写几个.mk文件即可将你的c/c++代码编译为Android的java工程/Android手机可以识别.加载和运行的库或者应用程序. 默认情况下,使用NDK编译c/c++代码,需要将该代码放置到任一个Android应用工程的jni目录下,然后编写相应的Android.mk文件,并执行ndk-build命令完成编译.其实你也是可以在任意目录下去编译native代码

  • Android NDK开发详细介绍

    Android之NDK开发 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言.但这并不等同于"第三方应用只能使用Java".在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,"Java+C"的

  • Android NDK开发的环境搭建与简单示例

    一.NDK与JNI简介 NDK全称为native development kit本地语言(C&C++)开发包.而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持java语言开发). 简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用.NDK开发的可以称之为底层开发或者jni(java native interface)层开发,SDK开发可以称为上层开发. Andro

  • Android NDK开发入门

    神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理,通过在线视频教育网站,我初步了解了NDK的神秘面纱,好东西自然要分享,接下来我们就一起来认识一下Android NDK开发. 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三

  • NDK 数据结构之队列与栈等的实现

    NDK 数据结构之队列与栈等的实现 com_tz_ndk_cpp_NDKCpp.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_tz_ndk_cpp_NDKCpp */ #ifndef _Included_com_tz_ndk_cpp_NDKCpp #define _Included_com_tz_ndk_cpp_NDKCpp #ifdef __cp

  • Android NDK 生成以及调用so 文件

    1.使用NDK来生成so文件: hello-jni.c 函数名Java +包名+函数名字 2.修改Android.mk文件 LOCAL_SRC_FILES :=hello-jni.c 指定c++文件 3.编译so文件 4.调用so文件 so文件copy到android项目的libs/armeabi目录下 最后输出一下结果: 以上就是本篇文章对Android  JNI开发流程的梳理,希望可以帮助开发 JNI的朋友.

  • Android NDK开发简单程序分享(Hello Word!)

    在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android程序,首先你必须了解C语言.JAVA语言以及Linux操作系统,这样可以帮助你开始上手,当然不是说你必须是大牛才能进行NDK开发,下面我们来一起实现一个简单的NDK程序. 第一步,创建Android工程 打开开发环境eclipse,在左侧空白区域,右键单击创建Android工程(非常简单,不再赘述)

  • Android NDK开发之:配置环境的详解

    一.Windows:Windows下的开发环境需要安装以下软件:Java JDK Apache ANT Build SystemAndroid SDKCygwinAndroid NDKEclipse IDE1.安装Java JDKhttp://www.oracle.com/technetwork/java/javase/downloads/index.html配置环境变量:新建一个JAVA_HOME键,值设为JDK的安装目录.打开PATH键,在末尾增加 ;%JAVA_HOME%\bin检测:ja

  • Android开发的IDE、ADT、SDK、JDK、NDK等名词解释

    1. IDE: Intelligent Development Environm的简称.即智能开发环境.是一种开发工具.常用的IDE有adt-bundles和Android studio.两个都需要配置jdk. 2. ADT: Android Development tools的简称.即Android开发工具.ADT为Eclipse的插件.在Eclipse和SDK之间起了一个桥梁的作用. 3. SDK: Soft Development Kit的简称.软件开发工具包.在Android中,它为开发

  • Android 驱动编写LED-NDK程序

    1. 首先编写LINUX内核模块LED #include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/device.h> #include <asm/io.h> #include <asm/uaccess.h> #include <linux/cdev.

  • 使用Android studio编写一个小的jni程序

     1.简单介绍一下NDK和JNI NDK:NDK是Native Development Kit的缩写,是Google提供的一套工具集,可以让你其他语言(C.C++或汇编)开发 Android的 JNI.NDK可以编译多平台的so,开发人员只需要简单修改 mk 文件说明需要的平台,不需要改动任何代码,NDK就可以帮你编译出所需的so库. JNI:JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++) 2.打开Android

  • android ndk程序获取外置SD沙盒目录的方法讲解

    android的App只能访问外置SD指定的目录,一般是: $外置SD目录 + "/Android/data/" + $apk包名 1 获取外置SD目录的方法: 调用getenv(const char *name)方法,通过环境变量"SECONDARY_STORAGE"得到,若没有这个变量,则通过"EXTERNAL_STORAGE"得到. 如果上面方法还不行,枚举/mnt目录下的所有目录. 2 获取apk包名的方法: pid_t getpid()

  • 如何在Android Studio下进行NDK开发

    在AS中进行NDK开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 1. 到底什么是JNI,什么是NDK? 2. 何为"交叉编译"? 先看什么是JNI?JNI的全称就是Java Native Interface,即java本地开发接口.可能大家和我一样,一听到接口什么的就犯懵:"我也知道这是java本地开发接口的意思,但它具体是个什么意思我还是搞不明白."其实JNI它就是一种协议,一说协议,那它就是对某种东西的一个规范和约束,说的好听一点就是标准化.如果你想用

  • Android实现的简单蓝牙程序示例

    本文实例讲述了Android实现的简单蓝牙程序.分享给大家供大家参考,具体如下: 我将在这篇文章中介绍了的Android蓝牙程序.这个程序就是将实现把手机变做电脑PPT播放的遥控器:用音量加和音量减键来控制PPT页面的切换. 遥控器服务器端 首先,我们需要编写一个遥控器的服务器端(支持蓝牙的电脑)来接收手机端发出的信号.为了实现这个服务器端,我用到了一个叫做Bluecove(专门用来为蓝牙服务的!)的Java库. 以下是我的RemoteBluetoothServer类: public class

  • 详解linux驱动编写(入门)

    在我离职之前,工作内容几乎不涉及到驱动方面的知识.我所要做的内容就是把客户对设备的请求拆分成一个一个的接口,调用驱动的设置进行配置就可以了.当然,至于驱动下面是怎么实现那就要根据具体情况而定了.比如说,有的驱动是芯片厂商直接写好的,假设芯片厂商提供了对应平台的sdk函数,那么驱动的工作就是对这些sdk函数进行封装就可以了,另外一种就是自己编写具体平台的驱动接口了.比如说,现在你需要编写串口.i2c.i2s.FLASH.网卡.LCD.触摸屏.USB驱动了.这个时候,你手里面除了一堆芯片手册,啥也没

  • Android实现简易计算器小程序

    本文实例为大家分享了Android实现简易计算器小程序的具体代码,供大家参考,具体内容如下 目标效果: 通过编写代码,可以实现整数和小数的加减乘除运算,以及删除和清空的功能. 1.页面中Button使用的是线性布局,最外边一个是父布局,第一行C,DEL,/,*为第一个子布局,第二行7,8,9,-为第二个子布局,第三行4,5,6,+为第三个子布局,第四五行为第四个子布局,第四个子布局中还有两个相当于是孙布局的级别,1,2,3为第一个孙布局,0和.为第二个孙布局,=在两个孙布局之外第四个子布局以内.

  • Android Studio 中运行 groovy 程序的方法图文详解

    Groovy简介 Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python.Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码.由于其运行在 JVM 上的特性,Groovy也可以使用其他非Java语言编写的库. Groovy 是 用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言.使用该种语言不必编写过多的代码,同时又具有闭包和动态语

  • linux 驱动编写之虚拟字符设备的编写实例详解

     linux 驱动编写 前言: 昨天我们说了一些简单模块编写方法,但是终归没有涉及到设备的编写内容,今天我们就可以了解一下相关方面的内容,并且用一个实例来说明在Linux上面设备是如何编写的.虽然我不是专门做linux驱动的,却也经常收到一些朋友们的来信.在信件中,很多做驱动的朋友对自己的工作不是很满意,认为自己的工作就是把代码拷贝来拷贝去,或者说是改来改去,没有什么技术含量.有这种想法的朋友不在少数,我想这主要还是因为他们对自己的工作缺少了解导致.如果有可能,我们可以问问自己这样几个问题: (

  • Android编程实现监控各个程序流量的方法

    本文实例讲述了Android编程实现监控各个程序流量的方法.分享给大家供大家参考,具体如下: public void getAppTrafficList(){ //获取所有的安装在手机上的应用软件的信息,并且获取这些软件里面的权限信息 PackageManager pm=getPackageManager();//获取系统应用包管理 //获取每个包内的androidmanifest.xml信息,它的权限等等 List<PackageInfo> pinfos=pm.getInstalledPac

随机推荐