android leds简单代码总结

linux leds

 

【源码:linux-3.2-rc7】

关于led,前两天被问道一个问题,这里顺便总结下吧。

 

led,对于我们所有的人来说这是一个比较简单的模块,当然也是学习时比较好入口的一个模块。

分析驱动,都了解先看Makefile &Kconfig

# LED Core

obj-$(CONFIG_NEW_LEDS)                         += led-core.o

obj-$(CONFIG_LEDS_CLASS)              += led-class.o

obj-$(CONFIG_LEDS_TRIGGERS)               += led-triggers.o

 

# LED Platform Drivers

obj-$(CONFIG_LEDS_88PM860X)              += leds-88pm860x.o

obj-$(CONFIG_LEDS_ATMEL_PWM)                  += leds-atmel-pwm.o

obj-$(CONFIG_LEDS_S3C24XX)                  += leds-s3c24xx.o

............

# LED SPI Drivers

obj-$(CONFIG_LEDS_DAC124S085)          += leds-dac124s085.o

 

# LED Triggers

obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) += ledtrig-heartbeat.o

obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT)  += ledtrig-backlight.o

.........

 

再来看看Kconfig对这些宏的定义

先看看NEW_LEDS

         bool"LED Support"

         help

           Say Y to enable Linux LED support.  This allows control of supported

           LEDs from both userspace and optionally, bykernel events (triggers).

 

           This is not related to standard keyboard LEDswhich are controlled

           via the input system.

          

         configLEDS_CLASS

         bool"LED Class Support"

         help

           This option enables the led sysfs class in/sys/class/leds.  You'll

           need this to do anything useful withLEDs.  If unsure, say N.

          

         configLEDS_TRIGGERS

         bool"LED Trigger support"

         dependson LEDS_CLASS

         help

           This option enables trigger support for theleds class.

           These triggers allow kernel events to drivethe LEDs and can

           be configured via sysfs. If unsure, say Y.      

          

看了上面的解释,大家也都有一个基本的了解了,这里我们拿2410的例子来解释。

makefile中定义

obj-$(CONFIG_LEDS_S3C24XX)                  += leds-s3c24xx.o

Kconfig中定义

config LEDS_S3C24XX

         tristate"LED Support for Samsung S3C24XX GPIO LEDs"

         dependson LEDS_CLASS

         dependson ARCH_S3C2410

         help

           This option enables support for LEDsconnected to GPIO lines

           on Samsung S3C24XX series CPUs, such as theS3C2410 and S3C2440.

          

在Kconfig中,我们注意到使用leds-s3c24xx.c需要打开LEDS_CLASS,并且依赖于ARCH S3C2410。

 

 

下面我们分析具体的代码

代码路径linux-3.2-rc7/drivers/leds/leds-s3c24xx.c

 

static inline struct s3c24xx_gpio_led*pdev_to_gpio(struct platform_device *dev)

 

static inline struct s3c24xx_gpio_led*to_gpio(struct led_classdev *led_cdev)

 

static void s3c24xx_led_set(structled_classdev *led_cdev,

                                enum led_brightness value)

 

static int s3c24xx_led_remove(structplatform_device *dev)

 

static int s3c24xx_led_probe(structplatform_device *dev)

{

         structs3c24xx_led_platdata *pdata = dev->dev.platform_data;

         structs3c24xx_gpio_led *led;

         intret;

 

         led= kzalloc(sizeof(struct s3c24xx_gpio_led), GFP_KERNEL);

         if(led == NULL) {

                   dev_err(&dev->dev,"No memory for device\n");

                   return-ENOMEM;

         }

 

         platform_set_drvdata(dev,led);

 

         led->cdev.brightness_set= s3c24xx_led_set;

         led->cdev.default_trigger= pdata->def_trigger;

         led->cdev.name= pdata->name;

         led->cdev.flags|= LED_CORE_SUSPENDRESUME;

 

         led->pdata= pdata;

 

         /*no point in having a pull-up if we are always driving */

 

         if(pdata->flags & S3C24XX_LEDF_TRISTATE) {

                   s3c2410_gpio_setpin(pdata->gpio,0);

                   s3c2410_gpio_cfgpin(pdata->gpio,S3C2410_GPIO_INPUT);

         }else {

                   s3c2410_gpio_pullup(pdata->gpio,0);

                   s3c2410_gpio_setpin(pdata->gpio,0);

                   s3c2410_gpio_cfgpin(pdata->gpio,S3C2410_GPIO_OUTPUT);

         }

 

         /*register our new led device */

 

         ret= led_classdev_register(&dev->dev, &led->cdev);

         if(ret < 0) {

                   dev_err(&dev->dev,"led_classdev_register failed\n");

                   kfree(led);

                   returnret;

         }

 

         return0;

}

 

static struct platform_drivers3c24xx_led_driver = {

         .probe                = s3c24xx_led_probe,

         .remove            = s3c24xx_led_remove,

         .driver                = {

                   .name                = "s3c24xx_led",

                   .owner               = THIS_MODULE,

         },

};

 

static int __init s3c24xx_led_init(void)

{

         returnplatform_driver_register(&s3c24xx_led_driver);

}

 

static void __exit s3c24xx_led_exit(void)

{

         platform_driver_unregister(&s3c24xx_led_driver);

}

 

这里可以看到整个的驱动是一个简单的设备注册的过程,只不过这里对led的注册的时候出现了led_classdev_register这样的注册的方式。

在leds-class.txt中找到的对其的简单的描述如下:

In its simplest form, the LED class justallows control of LEDs from

userspace. LEDs appear in /sys/class/leds/.

 

在Android中的基本的框架图是:


在android的手机中可以看到如上的分布

R,G,B三色LED,button-backlight,keyboard-backlight,lcd-backlight,torch-flash。而这里的spotlight则要根据你具体的外设看有没有了。


Have Fun!

### 回答1: 在Android上通过JNI打开LED灯,我们可以按照以下步骤进行操作: 1. 首先,我们需要编写一个JNI接口,将其与Java代码连接起来。在JNI接口中,我们可以调用底层C代码来完成对LED的控制。 2. 在C代码中,我们可以使用Linux的文件系统接口来控制LED。例如,对于某些设备,LED的控制文件路径可能是"/sys/class/leds/led1/brightness"。我们可以通过打开该文件,然后将相应的值写入文件来控制LED的开关状态。 3. 在JNI接口中,我们可以定义一个函数来接收Java代码传递的控制命令,并根据命令调用相应的C函数来操作LED。 4. 在Java代码中,我们需要加载JNI库,并调用JNI接口来控制LED。我们可以使用System.loadLibrary()方法加载JNI库,并通过JNI接口调用相应的函数来控制LED的开关状态。 需要注意的是,具体的实现方法可能因不同的设备而异。特定设备的LED控制方式可能不同,因此需要根据实际情况进行调整。 总结起来,通过JNI打开LED需要编写JNI接口将Java代码与底层C代码连接起来,使用Linux的文件系统接口来控制LED的开关状态,并在Java代码中加载JNI库和调用JNI接口来控制LED的开关状态。 ### 回答2: 要在Android上通过JNI打开LED,需要遵循以下步骤: 1. 创建一个C/C++的JNI接口函数。这个函数将会调用底层的硬件接口以控制LED的打开和关闭。这个函数需要与Java层的代码进行绑定。 2. 在Java层,创建一个Native方法,该方法与JNI接口函数进行绑定。可以使用`native`关键字来定义这个方法。 3. 使用Java Native Interface(JNI)工具将Java层的代码与C/C++层的代码进行连接。创建一个JNI头文件,并将C/C++代码实现功能。 4. 在C/C++层的代码中,使用底层硬件接口控制LED的打开和关闭。这里需要根据具体的硬件和设备进行不同的实现。 5. 在Android项目中,将C/C++代码编译成共享库。可以使用Android的NDK工具来进行编译。编译成功后,可以将.so文件复制到Android项目的相应目录中。 6. 在Java层的代码中,加载编译好的共享库,并调用Native方法来打开LED。可以使用`System.loadLibrary()`方法进行加载。 7. 最后,在Android设备上运行应用程序,调用对应的Java方法,即可通过JNI打开LED。 总体来说,上述步骤涵盖了在Android上通过JNI打开LED所需的基本操作。但是由于涉及到底层硬件接口的控制,具体的实现方式还需要根据所用的硬件设备和操作系统进行调整和细化。 ### 回答3: 要在Android中使用JNI打开LED灯,需要以下步骤: 1. 创建一个Java类来管理JNI的调用。在这个类中,添加native方法声明。例如,创建一个名为LedControl的类,添加一个native方法openLed(),声明如下: ```java public class LedControl { public native void openLed(); } ``` 2. 生成.h头文件。使用命令行工具在项目的JNI目录下运行以下命令: ```shell javah -jni com.example.LedControl ``` 这将为LedControl类生成一个.h头文件,用于在C/C++代码中引用该类。 3. 编写C/C++代码。在C/C++代码中,实现openLed()方法以打开LED灯。这需要根据所使用的硬件平台和设备进行编码。示例代码如下: ```c #include <jni.h> JNIEXPORT void JNICALL Java_com_example_LedControl_openLed(JNIEnv *env, jobject obj) { // 在这里编写打开LED的逻辑代码 // 例如,使用GPIO库函数控制GPIO引脚输出为高电平以打开LED // ... } ``` 4. 在Android.mk文件中添加C/C++源文件。在jni目录下的Android.mk文件中,将C/C++源文件添加到LOCAL_SRC_FILES列表中: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ledcontrol LOCAL_SRC_FILES := LedControl.c include $(BUILD_SHARED_LIBRARY) ``` 5. 编译和构建项目。在项目的根目录下运行以下命令,编译并构建项目: ```shell ndk-build ``` 这将编译C/C++代码并生成共享库。 6. 调用JNI方法。在Java代码中调用native方法,实现与C/C++代码的交互。例如,在Activity中调用openLed()方法: ```java LedControl ledControl = new LedControl(); ledControl.openLed(); ``` 这将通过JNI调用C/C++代码中的openLed()方法,从而控制LED灯的打开。 需要注意的是,以上提供的只是一个简单的示例,具体的实现方式取决于硬件平台、设备和使用的库函数。在实际应用中,需要根据相关文档或资料进行详细的配置和编码。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值