一、代码:

leds_4412.c

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/delay.h> #include <linux/gpio.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h> #include <linux/leds.h> struct led_desc {
int gpio;
char *name;
}; static struct led_desc led_gpios[] = {
{EXYNOS4212_GPM4(), "led1"},
{EXYNOS4212_GPM4(), "led2"},
{EXYNOS4212_GPM4(), "led3"},
{EXYNOS4212_GPM4(), "led4"},
}; struct led_classdev_4412 {
struct led_classdev cdev;
int gpio;
}; static struct led_classdev_4412 *led_devs;
static void brightness_set_4412(struct led_classdev *led_cdev,
enum led_brightness brightness)
{
struct led_classdev_4412 *dev = (struct led_classdev_4412 *)led_cdev; led_cdev->brightness = brightness; if (brightness != LED_OFF)
gpio_set_value(dev->gpio, );
else
gpio_set_value(dev->gpio, );
} static int leds_init(void)
{
int i;
int ret; /* 1. alloc led_classdev */
led_devs = kzalloc(sizeof(struct led_classdev_4412) * sizeof(led_gpios)/sizeof(led_gpios[]), GFP_KERNEL);
if (led_devs == NULL) {
printk("No memory for device\n");
return -ENOMEM;
} for (i = ; i < sizeof(led_gpios)/sizeof(led_gpios[]); i++)
{ s3c_gpio_cfgpin(led_gpios[i].gpio, S3C_GPIO_OUTPUT);
gpio_set_value(led_gpios[i].gpio, ); /* 2. set */
led_devs[i].cdev.max_brightness = LED_FULL;
led_devs[i].cdev.brightness_set = brightness_set_4412;
led_devs[i].cdev.flags = LED_CORE_SUSPENDRESUME;
led_devs[i].cdev.brightness = LED_OFF;
led_devs[i].cdev.name = led_gpios[i].name;
//led_devs[i].cdev.default_trigger = "timer";
led_devs[i].gpio = led_gpios[i].gpio; /* 3. led_classdev_register */
ret = led_classdev_register(NULL, &led_devs[i].cdev);
if (ret) {
i--;
while (i >= ) {
led_classdev_unregister(&led_devs[i].cdev);
i--;
}
kfree(led_devs);
return -EIO;
}
} return ;
} static void leds_exit(void)
{
int i;
for (i = ; i < sizeof(led_gpios)/sizeof(led_gpios[]); i++)
{
led_classdev_unregister(&led_devs[i].cdev);
}
kfree(led_devs);
} module_init(leds_init);
module_exit(leds_exit); MODULE_LICENSE("GPL");
MODULE_AUTHOR("sheldon");

二、编译测试:

把 leds_4412.c 放到drivers/leds
修改 drivers/leds/Makefile:
obj-y += leds_4412.o

重新配置内核
make menuconfig

CONFIG_LEDS_CLASS
CONFIG_LEDS_TRIGGERS
CONFIG_LEDS_TRIGGER_TIMER

-> Device Drivers
-> LED Support
[*] LED Class Support
[*] LED Trigger support
<*> LED Timer Trigger

重新编译内核: make zImage

Android system :led_class驱动的更多相关文章

  1. Linux下安装Android的adb驱动-解决不能识别的问题

    Linux下安装Android的adb驱动-解决不能识别的问题 20141011更新:      老方法对我当时使用的一款设备一直都没有出现问题,最后遇到小米手机还有Android4.4版本的系统都会 ...

  2. MTK6577+Android之Camera驱动

    MTK6577+Android之Camera驱动 <MTK安卓平台的Camera效果在线调试> 1.     Camera拍照相关概念 1.1  ISP isp--(Image Signa ...

  3. 基于MT6752/32平台 Android L版本驱动移植步骤

    基于MT6752/32平台 Android L版本驱动移植步骤 根据MK官网所述,在Android L 版本上Turnkey ABS 架构将会phase out,而Mediatek Turnkey架构 ...

  4. Android系统--灯光系统驱动编写

    Android系统开发--Android灯光系统tiny4412_led_class驱动编写 框架分析 led_classdev_4412结构体 创建led_classdev_4412结构体 分配结构 ...

  5. The behavior of App killed or restored by Android System or by users

    What's the behavior of App killed or restored by Android System or by users? First, user kills the a ...

  6. 解决appium自带的Chromedriver版本和设备Android System Webview版本不一致的问题

    报错信息 selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred w ...

  7. Android字符设备驱动开发基于高通msm8916【原创 】

    本人才疏浅学,写一篇文档总结自己在msm8916平台上移植自己编写的简单的字符设备驱动开发的整个流程.这个小项目的主要功能是开发一个简单的APP,APP通过JNI去调用位于kernel的字符设备驱动. ...

  8. android驱动[置顶] 我的DIY Android之旅--驱动并控制你的Android开发板蜂鸣器

    改章节个人在深圳游玩的时候突然想到的...这几周就有想写几篇关于android驱动的博客,所以回家到之后就奋笔疾书的写出来发布了 这些天一直在想Android驱动框架层的实现,本文借助老罗教师的博客和 ...

  9. android休眠唤醒驱动流程分析【转】

    转自:http://blog.csdn.net/hanmengaidudu/article/details/11777501 标准linux休眠过程: l        power managemen ...

随机推荐

  1. HAL库详解

    转自:https://blog.csdn.net/zcshoucsdn/article/details/55213616

  2. 雷林鹏分享:C# 类型转换

    C# 类型转换 类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型.在 C# 中,类型铸造有两种形式: 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换.例如,从小的 ...

  3. breakthroughs in statistics | 统计学历史

    <breakthroughs in statistics>- 这本书理解透了,统计方面应该可以封神了. 亚马逊上有卖,貌似还有好几卷. Breakthroughs in Statistic ...

  4. every day a practice —— morning(7)

    It is probably because Willow was the last link to her parents and a pastime that goes back to her o ...

  5. android ------- 运行官方NDK 案例HelloJNI

    下载案例 HelloJNI ,导入工程到Eclipse,  可以直接下载我的案例, 源码下载:https://github.com/DickyQie/android-ndk 目录图 使用命令生成  . ...

  6. 微信小程序地图demo完整

    <block wx:for="{{data_2}}" wx:key='index' wx:if="{{data_2.length}}"> <v ...

  7. xml的解构与组装

    xml的结构 <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName>< ...

  8. 创建gitlab ssh 密钥

    SSH代表用于管理网络,操作系统和配置的Secure Shell或Secure Socket Shell,并且每次都不需要使用用户名和密码即可验证GitLab服务器. 您可以设置SSH密钥以提供计算机 ...

  9. 关于AndroidStudio混淆配置,简单的整理(转)

    1.首先需要在app下的build.gradle下配置,true表示编译时会混淆代码<span style="font-size:18px;">buildTypes { ...

  10. Find the duplicate Number (鸽巢原理) leetcode java

    问题描述: Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive ...