免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5409 | 回复: 12
打印 上一主题 下一主题

GPIO驱动疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-20 15:48 |只看该作者 |正序浏览
写一个控制led灯熄灭的应用程序 也就是通过gpio口来发送一个高低电平
可是我在看驱动的时候很是疑惑
首先gpio驱动 和led驱动 就让我很晕 我在想在应用层怎样调用他们底层的函数呢
还有就是leds_gpio.c注释LEDs driver for GPIOs  而leds.c注释为LED driver for Atmel AT91-based boards.
他们的差异是什么呢
请高手指教
感谢!!!

论坛徽章:
0
13 [报告]
发表于 2008-10-18 08:07 |只看该作者

回复 #1 xiaoyao183 的帖子

LZ,我看了内核是没找到gpio提供给应用程序接口.自己改写了一个关于GPIO驱动,提供应用程序操作接口.Atmel9260 + linux-2.6.25.

论坛徽章:
8
2015年辞旧岁徽章
日期:2015-03-03 16:54:15午马
日期:2015-02-04 12:00:07羊年新春福章
日期:2015-02-04 11:57:56双子座
日期:2014-12-02 11:44:59金牛座
日期:2014-10-08 16:47:08狮子座
日期:2014-08-29 13:37:46巳蛇
日期:2014-08-26 17:32:29NBA常规赛纪念章
日期:2015-05-04 22:32:03
12 [报告]
发表于 2008-09-01 11:29 |只看该作者
这就是个GPIO的驱动,LZ的问题没有体现出来啊???

论坛徽章:
0
11 [报告]
发表于 2008-08-25 19:19 |只看该作者
/*
* LED driver for Atmel AT91-based boards.
*
*  Copyright (C) SAN People (Pty) Ltd
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

#include <asm/mach-types.h>
#include <asm/arch/board.h>
#include <asm/arch/gpio.h>


/* ------------------------------------------------------------------------- */

#if defined(CONFIG_NEW_LEDS)

#include <linux/platform_device.h>

/*
* New cross-platform LED support.
*/

static struct gpio_led_platform_data led_data;

static struct platform_device at91_leds = {
        .name                        = "leds-gpio",
        .id                        = -1,
        .dev.platform_data        = &led_data,
};

void __init at91_gpio_leds(struct gpio_led *leds, int nr)
{
        int i;

        if (!nr)
                return;

        for (i = 0; i < nr; i++)
                at91_set_gpio_output(leds.gpio, leds.active_low);

        led_data.leds = leds;
        led_data.num_leds = nr;
        platform_device_register(&at91_leds);
}

#else
void __init at91_gpio_leds(struct gpio_led *leds, int nr) {}
#endif


/* ------------------------------------------------------------------------- */

#if defined(CONFIG_LEDS)

#include <asm/leds.h>

/*
* Old ARM-specific LED framework; not fully functional when generic time is
* in use.
*/

static u8 at91_leds_cpu;
static u8 at91_leds_timer;


static inline void at91_led_on(unsigned int led)
{
        at91_set_gpio_value(led, 0);
}

static inline void at91_led_off(unsigned int led)
{
        at91_set_gpio_value(led, 1);
}

static inline void at91_led_toggle(unsigned int led)
{
        unsigned long is_off = at91_get_gpio_value(led);
        if (is_off)
                at91_led_on(led);
        else
                at91_led_off(led);
}


/*
* Handle LED events.
*/
static void at91_leds_event(led_event_t evt)
{
        unsigned long flags;

        local_irq_save(flags);

        switch(evt) {
        case led_start:                /* System startup */
                at91_led_on(at91_leds_cpu);
                break;

        case led_stop:                /* System stop / suspend */
                at91_led_off(at91_leds_cpu);
                break;

#ifdef CONFIG_LEDS_TIMER
        case led_timer:                /* Every 50 timer ticks */
                at91_led_toggle(at91_leds_timer);
                break;
#endif

#ifdef CONFIG_LEDS_CPU
        case led_idle_start:        /* Entering idle state */
                at91_led_off(at91_leds_cpu);
                break;

        case led_idle_end:        /* Exit idle state */
                at91_led_on(at91_leds_cpu);
                break;
#endif

        default:
                break;
        }

        local_irq_restore(flags);
}


static int __init leds_init(void)
{
        if (!at91_leds_timer || !at91_leds_cpu)
                return -ENODEV;

        leds_event = at91_leds_event;

        leds_event(led_start);
        return 0;
}

__initcall(leds_init);


void __init at91_init_leds(u8 cpu_led, u8 timer_led)
{
        /* Enable GPIO to access the LEDs */
        at91_set_gpio_output(cpu_led, 1);
        at91_set_gpio_output(timer_led, 1);

        at91_leds_cpu        = cpu_led;
        at91_leds_timer        = timer_led;
}

#else
void __init at91_init_leds(u8 cpu_led, u8 timer_led) {}
#endif

论坛徽章:
0
10 [报告]
发表于 2008-08-25 18:13 |只看该作者
原帖由 xiaoyao183 于 2008-8-25 16:46 发表
我用的是linux-2.6.24
板子是atmel91 sam9263
上面有2个led灯 需要通过gpio的  pb8 pc29引脚来控制开关
我现在的疑惑是 在驱动中找不到 应用程序的接口函数 也就是能在程序中来控制这两个灯吗
在网上看了一 ...

猜===在驱动中应该有read,write,ioctl之类的接口吧,或者是设置寄存器的接口?在驱动程序和最后的应用程序中间可能还有一个API,由api调用驱动中read,write,ioctl之类的设置寄存器,然后应用程序再调用这组api接口。

如果原来的驱动可以设置相应的寄存器的话就不用写了

ps:lz还是贴*.*的文件吧

[ 本帖最后由 蓝豆 于 2008-8-25 18:14 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-08-25 16:46 |只看该作者
我用的是linux-2.6.24
板子是atmel91 sam9263
上面有2个led灯 需要通过gpio的  pb8 pc29引脚来控制开关
我现在的疑惑是 在驱动中找不到 应用程序的接口函数 也就是能在程序中来控制这两个灯吗
在网上看了一些 都是自己编写的驱动  我是不是也要编写一个类似的led驱动吗  难道在内核中不能驱动吗

论坛徽章:
0
8 [报告]
发表于 2008-08-25 11:51 |只看该作者
我也来寒喧一下哈!

gpio也就是一些寄存器的操作,而leds是相关gpio操作的封装吧!  

当然,具体的得看您的代码与手册

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2008-08-25 08:26 |只看该作者

回复 #6 蓝豆 的帖子

呵呵,大家互相讨论学习,才是硬道理。

论坛徽章:
0
6 [报告]
发表于 2008-08-24 22:10 |只看该作者
原帖由 xiaoyao183 于 2008-8-24 19:32 发表
感觉两位好象"功夫"都十分了得  我刚刚接触 而且基础也不是很好 现在在恶补 呵呵 希望以后能得到两为的帮助 嘿嘿

xiaoyao183兄,别,我也菜鸟,接触也不长,有问题大家一起叨咕叨咕,群策群力

论坛徽章:
0
5 [报告]
发表于 2008-08-24 19:32 |只看该作者
感觉两位好象"功夫"都十分了得  我刚刚接触 而且基础也不是很好 现在在恶补 呵呵 希望以后能得到两为的帮助 嘿嘿
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP