我是靠谱客的博主 娇气纸鹤,最近开发中收集的这篇文章主要介绍linux的gpiolib的使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用gpiolib完成led驱动,代码如下:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/leds.h>
#include <linux/io.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-bank.h>
#include <linux/gpio.h>

#define GPJ0CON S5PV210_GPJ0CON
#define GPJ0DAT S5PV210_GPJ0DAT

static struct led_classdev led_cdev1;
static struct led_classdev led_cdev2;
static struct led_classdev led_cdev3;

static void s5pv210_led_set1(struct led_classdev *led_cdev,
enum led_brightness brightness)
{
printk(KERN_INFO “s5pv210_led_set1n”);
if (LED_OFF == brightness)
{
printk(KERN_INFO “offn”);
#if 0
iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);

	temp = ioread32(GPJ0DAT);
	temp |= (1<<3);
	iowrite32(temp, GPJ0DAT);	

#endif
gpio_set_value(S5PV210_GPJ0(3), 1);
}
else
{
printk(KERN_INFO “onn”);
#if 0
iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);

	temp = ioread32(GPJ0DAT);
	temp &= ~(1<<3);
	iowrite32(temp , GPJ0DAT);

#endif
gpio_set_value(S5PV210_GPJ0(3), 0);
}
}

static void s5pv210_led_set2(struct led_classdev *led_cdev,
enum led_brightness brightness)
{
printk(KERN_INFO “s5pv210_led_set2n”);
if (LED_OFF == brightness)
{
printk(KERN_INFO “offn”);
gpio_set_value(S5PV210_GPJ0(4), 1);
#if 0
iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);

	temp = ioread32(GPJ0DAT);
	temp |= (1<<4);
	iowrite32(temp, GPJ0DAT);		

#endif
}
else
{
printk(KERN_INFO “onn”);
gpio_set_value(S5PV210_GPJ0(4), 0);
#if 0
iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);

	temp = ioread32(GPJ0DAT);
	temp &= ~(1<<4);
	iowrite32(temp , GPJ0DAT);

#endif
}
}

static void s5pv210_led_set3(struct led_classdev *led_cdev,
enum led_brightness brightness)
{
printk(KERN_INFO “s5pv210_led_set3n”);
if (LED_OFF == brightness)
{
printk(KERN_INFO “offn”);
gpio_set_value(S5PV210_GPJ0(5), 1);
#if 0
iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);

	temp = ioread32(GPJ0DAT);
	temp |= (1<<5);
	iowrite32(temp, GPJ0DAT);	

#endif
}
else
{
printk(KERN_INFO “onn”);
gpio_set_value(S5PV210_GPJ0(5), 0);
#if 0
iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);

	temp = ioread32(GPJ0DAT);
	temp &= ~(1<<5);
	iowrite32(temp , GPJ0DAT);

#endif
}
}

static int __init s5pv210_led_init(void)
{
int ret = -1;

if (gpio_request(S5PV210_GPJ0(3), "gpj0_3-led1"))
{
	printk(KERN_INFO "gpio_request 3 failn");
}
else
{
	gpio_direction_output(S5PV210_GPJ0(3), 1);
}

if (gpio_request(S5PV210_GPJ0(4), "gpj0_4-led2"))
{
	printk(KERN_INFO "gpio_request 4 failn");
}
{
	gpio_direction_output(S5PV210_GPJ0(4), 1);
}

if (gpio_request(S5PV210_GPJ0(5), "gpj0_5-led3"))
{
	printk(KERN_INFO "gpio_request 5 failn");
}
else
{
	gpio_direction_output(S5PV210_GPJ0(5), 1);
}

led_cdev1.name = "led1";
led_cdev1.brightness = 0;
led_cdev1.max_brightness = 1;
led_cdev1.brightness_set = s5pv210_led_set1;
ret = led_classdev_register(NULL, &led_cdev1);
if (ret)
{
	printk(KERN_INFO "led_classdev_register failn");
}
printk(KERN_INFO "led_classdev_register okn");


//led2
led_cdev2.name = "led2";
led_cdev2.brightness = 0;
led_cdev2.max_brightness = 1;
led_cdev2.brightness_set = s5pv210_led_set2;
ret = led_classdev_register(NULL, &led_cdev2);
if (ret)
{
	printk(KERN_INFO "led_classdev_register failn");
}
printk(KERN_INFO "led_classdev_register okn");

//led3
led_cdev3.name = "led3";
led_cdev3.brightness = 0;
led_cdev3.max_brightness = 1;
led_cdev3.brightness_set = s5pv210_led_set3;
ret = led_classdev_register(NULL, &led_cdev3);
if (ret)
{
	printk(KERN_INFO "led_classdev_register failn");
}
printk(KERN_INFO "led_classdev_register okn");
return 0;

}

static void __exit s5pv210_led_exit(void)
{
led_classdev_unregister(&led_cdev1);
led_classdev_unregister(&led_cdev2);
led_classdev_unregister(&led_cdev3);

gpio_free(S5PV210_GPJ0(3));
gpio_free(S5PV210_GPJ0(4));
gpio_free(S5PV210_GPJ0(5));

}

module_init(s5pv210_led_init);
module_exit(s5pv210_led_exit);

// MODULE_xxx这种宏作用是用来添加模块描述信息
MODULE_LICENSE(“GPL”); // 描述模块的许可证
MODULE_AUTHOR(“Mark 867439374@qq.com”); // 描述模块的作者
MODULE_DESCRIPTION(“s5pv210 led driver”); // 描述模块的介绍信息
MODULE_ALIAS(“s5pv210_led”); // 描述模块的别名信息


1.在init函数中,我们使用gpio_request申请gpio
gpio_request函数:
参数1:gpio的编号,在gpiolib中的编号
参数2:使用debugfs的时候,可以看到这个字符串,没啥用
返回值:申请成功返回0
2.申请成功之后,我们设置输出:
gpio_direction_output
参数1:gpio的编号,在gpiolib中的编号
参数2:设置输出的值
返回值:设置成功返回0
3.gpio_set_value函数,可以设置gpio的值
参数1:gpio的编号,在gpiolib中的编号
参数2:设置的值,0-低电平,1-高电平
无返回值
4.gpio_get_value
参数1:gpio的编号,在gpiolib中的编号
返回值:gpio的电平


调试技巧
1./sys/class/gpio下面有export和unexport两个,使用方法就是:
echo 23 > export,下面就会多一个gpio23的目录,目录下面就会有这个
gpio相关的信息。
不用了就使用:echo 23 > unexport
2.在内核中查看gpio的使用情况,内核中提供了debugfs里面有一个gpio文件提供gpio的使用信息。
使用方法:mount -t debugfs debugfs /tmp ,挂载之后,cat gpio就可以

最后

以上就是娇气纸鹤为你收集整理的linux的gpiolib的使用的全部内容,希望文章能够帮你解决linux的gpiolib的使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部