免费注册 查看新帖 |

Chinaunix

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

[学习分享] linux下如何修改GPIO驱动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-15 17:05 |只看该作者 |倒序浏览

今天我们大家讨论下关于GPIO驱动的一些东西,首先我们来看下针对OK210开发板LED驱动的源码,这也是一个比较简单的gpio驱动程序。

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.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 <mach/gpio.h>
#include <mach/regs-gpio.h>
#include <plat/gpio-cfg.h>


#define DEVICE_NAME "leds"

static int led_gpios[] = {
#ifdef CONFIG_OK210_BOARD_V2
        S5PV210_MP04(4),  //在gpio-herring.h中对gpio寄存器有定义;
        S5PV210_MP04(5),
        S5PV210_MP04(6),
        S5PV210_MP04(7),
#else
        S5PV210_GPH2(0),
        S5PV210_GPH2(1),
        S5PV210_GPH2(2),
        S5PV210_GPH2(3),
#endif
};
上面这段代码主要是根据配置文件的不同调用不同寄存器来实现不同的功能;
#define LED_NUM                ARRAY_SIZE(led_gpios)


static long fl210_leds_ioctl(struct file *filp, unsigned int cmd,
                unsigned long arg)
{
        switch(cmd) {
                case 0:
                case 1:
                        if (arg > LED_NUM) {
                                return -EINVAL;
                        }

                        gpio_set_value(led_gpios[arg], !cmd); //对指定的GPIO寄存器写上一个值
                        printk(DEVICE_NAME": %ld %d\n", arg, cmd);
                        break;

                default:
                        return -EINVAL;
        }

        return 0;
}

static struct file_operations fl210_led_dev_fops = {
        .owner                        = THIS_MODULE,
        .unlocked_ioctl        = fl210_leds_ioctl,
};

static struct miscdevice fl210_led_dev = {
        .minor                        = MISC_DYNAMIC_MINOR,
        .name                        = DEVICE_NAME,
        .fops                        = &fl210_led_dev_fops,
};

static int __init fl210_led_dev_init(void) {
        int ret;
        int i;

        for (i = 0; i < LED_NUM; i++) {
                ret = gpio_request(led_gpios[i], "LED");
                if (ret) {
                        printk("%s: request GPIO %d for LED failed, ret = %d\n", DEVICE_NAME,
                                        led_gpios[i], ret);
                        return ret;
                }

                s3c_gpio_cfgpin(led_gpios[i], S3C_GPIO_OUTPUT);  //设置数组中的 这个gpio为输出模式

                gpio_set_value(led_gpios[i], 1);
        }

        ret = misc_register(&fl210_led_dev);// 注册杂项设备

        printk(DEVICE_NAME"\tinitialized\n");

        return ret;
}

这里我们看下 gpio_request(unsigned gpio, const char *label) 这个函数的参数,gpio则为你要申请的哪一个管脚,label则是为其取一个名字。
static void __exit fl210_led_dev_exit(void) {
        int i;

        for (i = 0; i < LED_NUM; i++) {
                gpio_free(led_gpios[i]);  //释放io
        }

        misc_deregister(&fl210_led_dev); //释放杂项设备
}

module_init(fl210_led_dev_init);
module_exit(fl210_led_dev_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Forlinx Inc.");


我们通过对这段代码的分析可以看出对GPIO的操作主要用到了gpio_set_value (),gpio_request(),s3c_gpio_cfgpin(),这三个函数和led_gpios[]数组,我们可以通过对这个数组里面的成员的修改来实现对其他管脚控制,同时运行上面三个函数可以实现对gpio的赋值控制

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2014-01-15 17:17 |只看该作者
这属于最简单的驱动了

论坛徽章:
0
3 [报告]
发表于 2014-01-15 17:21 |只看该作者
慢慢来了大哥 回复 2# amarant


   

论坛徽章:
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
4 [报告]
发表于 2014-01-16 11:48 |只看该作者
分享是种美德,需要支持的  呵呵

论坛徽章:
0
5 [报告]
发表于 2014-01-16 16:54 |只看该作者
回复 4# zhj1011


    呵呵  谢谢支持

论坛徽章:
0
6 [报告]
发表于 2014-02-11 17:22 |只看该作者
还有好评吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP