Android system :led_class驱动
一、代码:
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(0), "led1"}, {EXYNOS4212_GPM4(1), "led2"}, {EXYNOS4212_GPM4(2), "led3"}, {EXYNOS4212_GPM4(3), "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, 0); else gpio_set_value(dev->gpio, 1); } 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[0]), GFP_KERNEL); if (led_devs == NULL) { printk("No memory for device\n"); return -ENOMEM; } for (i = 0; i < sizeof(led_gpios)/sizeof(led_gpios[0]); i++) { s3c_gpio_cfgpin(led_gpios[i].gpio, S3C_GPIO_OUTPUT); gpio_set_value(led_gpios[i].gpio, 1); /* 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 >= 0) { led_classdev_unregister(&led_devs[i].cdev); i--; } kfree(led_devs); return -EIO; } } return 0; } static void leds_exit(void) { int i; for (i = 0; i < sizeof(led_gpios)/sizeof(led_gpios[0]); 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 系统开发
posted on 2017-04-30 12:57 sheldon_blogs 阅读(410) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY