Android 驅(qū)動編寫LED-NDK程序
1. 首先編寫LINUX內(nèi)核模塊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結(jié)構(gòu) 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結(jié)構(gòu) alloc_chrdev_region( &dev_no, 0, 1, "my_led" ); cdev_init( &dev, &led_fops ); dev.owner = THIS_MODULE; //1.3 注冊cdev結(jié)構(gòu) cdev_add( &dev, dev_no, 1 ); //2.硬件初始化 hw_init(); //3.創(chuàng)建設(shè)備文件 led_class = class_create(THIS_MODULE,"my_led"); //創(chuàng)建設(shè)備類 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的工程文件那個文件夾執(zhí)行命令。
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為我們需要的頭文件。
其中的文件聲明為我們需要實現(xiàn)的函數(shù)。
在jni文件中創(chuàng)建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)
若想生成靜態(tài)庫 則修改SHARED為STATIC即可。
然后返回上一級目錄 執(zhí)行命令ndk-build。將會生成libs/armeabi/libndk_test_myled.so 庫文件。
以上就是對Android 驅(qū)動編寫LED-NDK程序的資料整理,謝謝大家對本站的支持!
相關(guān)文章
Android非XML形式動態(tài)生成、調(diào)用頁面的方法
這篇文章主要介紹了Android非XML形式動態(tài)生成、調(diào)用頁面的方法,涉及Android構(gòu)建頁面的相關(guān)技巧,需要的朋友可以參考下2015-04-04OKhttp攔截器實現(xiàn)實踐環(huán)節(jié)源碼解析
這篇文章主要為大家介紹了OKhttp攔截器實現(xiàn)實踐環(huán)節(jié)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01Android入門之IntentService的使用教程詳解
IntentService的生命周期中有一個非常好的方法-onHandleIntent方法,它是一個abstract方法,開發(fā)者在實現(xiàn)IntentService時可以覆蓋它來處理“長事務”。本文就來聊聊IntentService的使用,需要的可以參考一下2022-12-12Android自定義控件ScrollView實現(xiàn)上下滑動功能
這篇文章主要為大家詳細介紹了Android自定義控件ScrollView實現(xiàn)上下滑動功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07WorkManager解決應用退出后繼續(xù)運行后臺任務
這篇文章主要為大家介紹了WorkManager解決應用退出后繼續(xù)運行后臺任務示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07Flutter 底部彈窗ModelBottomSheet的使用示例
在實際開發(fā)過程中,經(jīng)常會用到底部彈窗來進行快捷操作,例如選擇一個選項,選擇下一步操作等等。在 Flutter 中提供了一個 showModelBottomSheet 方法用于彈出底部彈窗,本篇介紹如何使用底部彈窗。2021-06-06