linux gpio字元裝置驅動
在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(...);/*釋放管腳*/
}