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");
#defineGPM4CON0X110002E0
#defineGPM4DAT0X110002E4
#defineLED_ON_IOW(‘G‘,0,int)
#defineLED_OFF_IOW(‘G‘,1,int)
staticstructcdevdev;//1.1分配cdev结构
staticdev_tdev_no;
structclass*led_class;
staticunsignedint*led_con;
staticunsignedint*led_dat;
longled_ioctl(structfile*file,unsignedintcmd,unsignedlongarg)
{
switch(cmd)
{
caseLED_ON:
writel((readl(led_dat)&(~(0x1<<(arg-1)))),led_dat);
break;
caseLED_OFF:
writel((readl(led_dat)|(0x1<<(arg-1))),led_dat);
break;
default:
return-EINVAL;
break;
}
return0;
}
structfile_operationsled_fops={
.owner=THIS_MODULE,
.unlocked_ioctl=led_ioctl,
};
staticvoidhw_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);
}
staticintled_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("initleddeviceok!\n");
return0;
}
voidled_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-djni-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:=$(callmy-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程序的资料整理,谢谢大家对本站的支持!