9x25 LED 驱动框架分析 2016.07.13

进入内核 make menuconfig
输入 /led 回车搜索到
│ Location: │
│ -> Device Drivers │
│ -> LED Support (NEW_LEDS [=y])
进入LED Support发现有这一项 []LED Support for GPIO connected LEDs
在内核搜索该字符串 grep "LED Support for GPIO connected LEDs" * -nR
搜索到 drivers/leds/Kconfig:166: tristate "LED Support for GPIO connected LEDs"
打开 Kconfig查看,里面这样描述
config LEDS_GPIO
tristate "LED Support for GPIO connected LEDs"
depends on LEDS_CLASS
depends on GENERIC_GPIO
help
This option enables support for the LEDs connected to GPIO
outputs. To be useful the particular board must have LEDs
and they must be connected to the GPIO lines. The LEDs must be
defined as platform devices and/or OpenFirmware platform devices.
The code to use these bindings can be selected below.
接着在内核搜索 grep "LEDS_GPIO" * -nR
搜索到 drivers/leds/Makefile:25:obj-$(CONFIG_LEDS_GPIO)
进入makefile 查看 发现内核会编译该文件
25 obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o
分析 leds-gpip.c
gpio_led_init(void)
platform_driver_register(&gpio_led_driver); //说明内核把led当作平台设备来处理,并注册进平台总线

分析gpio_led_driver
static struct platform_driver gpio_led_driver = {
.probe = gpio_led_probe,
.remove = __devexit_p(gpio_led_remove),
.driver = {
.name = "leds-gpio",
.owner = THIS_MODULE,
.of_match_table = of_gpio_leds_match,
},
};
//从结构体的类型struct platform_driver可知,这属于平台驱动
//该平台驱动名字“leds-gpio”,那么还有个平台设备 名字应该也为“leds-gpio”
在内核搜索“leds-gpio”
Leds.c (arch\arm\mach-at91): .name = "leds-gpio",
进入分析 leds.c
static struct platform_device at91_gpio_leds_device = {
.name = "leds-gpio",
.id = -1,
.dev.platform_data = &led_data,
};
//从结构体的类型struct platform_device可知,这属于平台设备
at91_gpio_leds(struct gpio_led *leds, int nr)
{
led_data.leds = leds;
led_data.num_leds = nr;
platform_device_register(&at91_gpio_leds_device);
}
//at91_gpio_leds,提供了一个注册led的函数入口,他里面调用platform_device_register(&at91_gpio_leds_device);
//但是at91_gpio_leds_device这个结构体只是提供了平台设备的名字,不对应实际的led设备,所以at91_gpio_leds需要我们传入一个
//led实际设备的数据结构,和led的个数
在内核搜索at91_gpio_leds
发现调用者非常多,我暂时就取arch\arm\mach-at91\Board-stamp9g20.c分析
/*
* LEDs
*/
static struct gpio_led portuxg20_leds[] = {
{
.name = "LED2",
.gpio = AT91_PIN_PC5,
.default_trigger = "none",
}, {
.name = "LED3",
.gpio = AT91_PIN_PC4,
.default_trigger = "none",
}, {
.name = "LED4",
.gpio = AT91_PIN_PC10,
.default_trigger = "heartbeat",
}
};

static void __init portuxg20_board_init(void)
{
/* LEDs */
at91_gpio_leds(portuxg20_leds, ARRAY_SIZE(portuxg20_leds));
}

仿照该文件写一个led驱动

#include <linux/types.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/platform_device.h>

#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/irq.h>

#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/irq.h>

#include <mach/hardware.h>
#include <mach/board.h>
#include <mach/gpio.h>

#include "generic.h"

/*配置led 引脚 lsh 2016.07.13*/
static struct gpio_led bdth_leds[] = {
{ /* led1 心跳闪烁*/
.name = "led1",
.gpio = AT91_PIN_PB14,
.active_low = 1,
.default_trigger = "heartbeat",
},
{ /* led2 */
.name = "led2",
.gpio = AT91_PIN_PB15,
.active_low = 1,
.default_trigger = "none",
},
{ /* led3 */
.name = "led3",
.gpio = AT91_PIN_PB12,
.active_low = 1,
.default_trigger = "none",
},
};
static int __init bdth_leds_init(void)
{
at91_gpio_leds(bdth_leds, ARRAY_SIZE(bdth_leds));
}
static int __exit bdth_leds_exit(void)
{
printk(KERN_ERR "cannot del led devices ! :bdth lsh 2016.07.13\n");

}
module_init(bdth_leds_init);
module_exit(bdth_leds_exit);
MODULE_LICENSE("GPL");

测试:
make menuconfig里面配置,如下
Device Driversà[*]LED Supportà[*]LED class support
[*]LED support for GPIO connected LEDS
[*]LED Trigger support
[*]LED heartbeat trigger

测试下led1,如下
led1,是配置的心跳功能,他会自己闪烁

测试下led2,如下
# echo 1 > /sys/class/leds/led2/brightness
led2会亮。
继续测试
# echo 0 > /sys/class/leds/led2/brightness
led2会灭掉。

led3同理

原文地址:https://www.cnblogs.com/liushuhe1990/p/9608991.html

时间: 2024-10-11 17:01:18

9x25 LED 驱动框架分析 2016.07.13的相关文章

9x25 PPS test 代码分析 2016.07.14

pps-tools-master\Ppstest.c main find_source(char *path, pps_handle_t *handle, int *avail_mode) open(path, O_RDWR); time_pps_create(ret, handle); ioctl(source, PPS_GETPARAMS, &dummy); *handle = source; time_pps_getcap(*handle, avail_mode); ioctl(handl

驱动学习之LED驱动框架

一:什么是驱动框架  (1)内核中驱动部分维护者针对每个种类的驱动设计一套成熟的.标准的.典型的驱动实现,然后把不同厂家的同类硬件驱动中相同的部分抽出来自己实现好,再把不同部分留出接口给具体的驱动开发工程师来实现,这就叫驱动框架.  (2)内核维护者在内核中设计了一些统一管控系统资源的体系,这些体系让内核能够对资源在各个驱动之间的使用统一协调和分配,保证整个内核的稳定健康运行.譬如系统中所有的GPIO就属于系统资源,每个驱动模块如果要使用某个GPIO就要先调用特殊的接口先申请,申请到后使用,使用

Linux USB驱动框架分析 【转】

转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结当然不可缺,更何况我决定为嵌入式卖命了.好,言归正传,我说一说这段时间的收获,跟大家分享一下Linux的驱动开发.但这次只先针对Linux的USB子系统作分析,因为周五研讨老板催货.当然,还会顺带提一下其他的驱动程序写法. 事实上,Linux的设备驱动都遵循一个惯例——表征驱动程序(用driver更

Linux USB驱动框架分析(2)【转】

转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html 看了http://blog.chinaunix.net/uid-11848011-id-96188.html的驱动框架分析,感觉受益匪浅.对于一些内容,我自己查漏补缺. 首先我们按照顺序,看内核模块的注册以及释放函数如下: 点击(此处)折叠或打开 static int __init usb_skel_init(void) { int result; /* register this

USB摄像头驱动框架分析(五)

一.USB摄像头驱动框架如下所示:1.构造一个usb_driver2.设置   probe:        2.1. 分配video_device:video_device_alloc        2.2. 设置           .fops           .ioctl_ops (里面需要设置11项)           如果要用内核提供的缓冲区操作函数,还需要构造一个videobuf_queue_ops        2.3. 注册: video_register_device   

十九、eMMC驱动框架分析

一.MMC简介 eMMC在封装中集成了一个控制器,提供标准接口并管理Nand Flash,使得手机厂商就能专注于产品开发的其它部分,并缩短向市场推出产品的时间. 对于我们来说,eMMC就是在Nand Flash上添加负责ECC.管理坏块等功能的控制器. 在内核中,使用MMC子系统统一管理MMC.SD.SDIO等设备.从MMC规范发布至今,基于不同的考量(物理尺寸.数据位宽和clock频率等),进化出了MMC.SD.microSD.SDIO.eMMC等不同的规范.其本质是一样的,这也是内核将它们统

7 Linux usb驱动框架分析

现象:将USB设备接入PC,PC右下角上会弹出"发现xx新设备",例如"发现andriod phone"若PC上没有安装该设备的驱动程序,则会弹出对话框提示"安装驱动程序". 问1:没有安装设备的驱动程序之前,为什么PC还能发现andriod phone设备呢? 答1:windows系统中已经安装了USB的"总线驱动程序",是"总线驱动程序"发现了新的设备,而提示我们安装的是"设备驱动程序&quo

Linux下USB驱动框架分析【转】

转自:http://blog.csdn.net/brucexu1978/article/details/17583407 版权声明:本文为博主原创文章,未经博主允许不得转载. http://www.cnblogs.com/general001/articles/2319552.html http://blog.csdn.net/uruita/article/details/7263290:MODULE_DEVICE_TABLE http://blog.chinaunix.net/uid-2590

tty初探—uart驱动框架分析

本文参考了大量牛人的博客,对大神的分享表示由衷的感谢. 主要参考: tty驱动分析 :http://www.wowotech.net/linux_kenrel/183.html Linux TTY驱动--Uart_driver底层:http://blog.csdn.net/sharecode/article/details/9196591 Linux TTY驱动--Serial Core层  :http://blog.csdn.net/sharecode/article/details/9197