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程序的资料整理,谢谢大家对本站的支持!