在linux下编写led驱动,控制相应的gpio管脚。
在这里有两种方式
1) 直接操作相应的寄存器
2) 通过内核提供的gpio操作库函数
第一种方式就省略了,只讲第二种方式。
这里板卡上有两个led灯,在用户空间采用两种方式控制led
1. /dev/led0 /dev/led1
fd0 = open("/dev/led0", O_RD_WR);
ioctl(fd0, 1, 0);//ioctl(fd,cmd,data)
ioctl(fd0, 0, 0);
fd0 = open("/dev/led1", O_RD_WR);
ioctl(fd1, 1, 1);//ioctl(fd,cmd,data)
ioctl(fd1, 0, 1);
2. /dev/led
fd = open("/dev/led", O_RD_WR);
ioctl(fd0, 1, 0);//ioctl(fd,cmd,data)
ioctl(fd0, 0, 0);
ioctl(fd0, 1, 1);//ioctl(fd,cmd,data)
ioctl(fd0, 0, 1);
主要添加的源代码
#include <asm/gpio.h>#include <plat/gpio-cfg.h>unsigned long led_gpio_table[2] =
{
S5PV210_GPC1(3),//
S5PV210_GPC1(4),
};
int cdd_open(...)
{
gpio_request(led_gpio_table[0], "GPC1_3");/*申请gpio管脚*/
}
int cdd_ioctl(...)
{
switch(cmd)
{
case 1:
gpio_direction_output(led_gpio_table[data], 0);/*设置管脚为输出,默认输出低电平*/
s3c_gpio_setpull(ed_gpio_table[data], S3C_GPIO_PULL_NONE);/*禁止内部上拉*/
gpio_set_value(led_gpio_table[data], 1);/*设置输出高电平*/
break;
case 0:
gpio_direction_output(led_gpio_table[data], 0);/*设置管脚为输出,默认输出低电平*/
s3c_gpio_setpull(ed_gpio_table[data], S3C_GPIO_PULL_NONE);/*禁止内部上拉*/
gpio_set_value(led_gpio_table[data], 0);/*设置输出低电平*/
break;
default:
return -EINVAL;
}
}
int cdd_release(...)
{
gpio_free(...);/*释放管脚*/
}