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_set1\n”);
if (LED_OFF == brightness)
{
printk(KERN_INFO “off\n”);
#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 “on\n”);
#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_set2\n”);
if (LED_OFF == brightness)
{
printk(KERN_INFO “off\n”);
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 “on\n”);
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_set3\n”);
if (LED_OFF == brightness)
{
printk(KERN_INFO “off\n”);
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 “on\n”);
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 fail\n");
}
else
{
	gpio_direction_output(S5PV210_GPJ0(3), 1);
}

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

if (gpio_request(S5PV210_GPJ0(5), "gpj0_5-led3"))
{
	printk(KERN_INFO "gpio_request 5 fail\n");
}
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 fail\n");
}
printk(KERN_INFO "led_classdev_register ok\n");


//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 fail\n");
}
printk(KERN_INFO "led_classdev_register ok\n");

//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 fail\n");
}
printk(KERN_INFO "led_classdev_register ok\n");
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就可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值