linux gpio字符设备驱动

时间:2022-02-26 10:06:45

在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(...);/*释放管脚*/

}