English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
1. Primero escribe el módulo LED del kernel de LINUX
#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() { //Inicializar el registro de control GPIO led_con = ioremap(GPM4CON, 4 ); //Mapeo de direcciones 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 Inicializar la estructura cdev alloc_chrdev_region(&dev_no, 0, 1, "my_led"); cdev_init(&dev, &led_fops); dev.owner = THIS_MODULE; //1.3 Registrar la estructura cdev cdev_add(&dev, dev_no, 1 ); //2.Inicialización de hardware hw_init(); //3.Crear el archivo de dispositivo led_class = class_create(THIS_MODULE,"my_led"); //Crear la clase de dispositivo device_create(led_class, NULL, dev_no,NULL,"%s","my_led"); printk("¡inicialización del dispositivo led correcta!\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());
2Necesita generar archivos de cabecera.
La generación de archivos de cabecera requiere la aplicación. Por lo tanto, se utiliza el software app proporcionado por Guoqin. Descomprimir y modificar la dirección correspondiente del archivo local.properties.
Abrir studio.sh y recompilar el proyecto.
Después de compilar el proyecto, ejecutar el comando en la carpeta del archivo de proyecto de la aplicación.
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
Entre ellos/opt/android-sdk-linux/platforms/android-23/android.jar es la dirección en el sdk de Android.
/home/my_Android/led/NDK/NDK_APP/app/build/intermediates/classes/debug/ Es la dirección en el proyecto de ingeniería de archivos de origen de la aplicación Android correspondiente.
com.android.jack.ndk.happy.MainActivity es el nombre del proyecto de Android.
Después de ejecutar el comando, se generará una carpeta jni en el directorio. El archivo com_android_jack_ndk_happy_MainActivity.h es el archivo de encabezado que necesitamos.
Las declaraciones de archivos en ellas son las funciones que necesitamos implementar.
Cree los archivos de fuente ndk_led.c y makefile Android.mk en el archivo jni
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ndk_test_myled LOCAL_SRC_FILES := ndk_led.c include $(BUILD_SHARED_LIBRARY)
Si desea generar una biblioteca estática, cambie SHARED a STATIC.
Luego, regrese al directorio superior y ejecute el comando ndk-build. Se generará libs/armeabi/El archivo de biblioteca de libndk_test_myled.so.
A continuación, se explica la escritura del controlador LED para Android-La organización de información de programas NDK, ¡gracias a todos por el apoyo a este sitio!