English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Escribir LED en el controlador Android-Programa NDK

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!

Te gustaría que te gustara