1. 程式人生 > >linux gpio字元裝置驅動

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(...);/*釋放管腳*/

}