版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/83047550
经常会遇到这四个,来进行gpio的操作
gpio_request(S5PV210_GPD0(2), "GPD0"); //申请gpio,这里会对该gpio进行上锁
s3c_gpio_setpull(S5PV210_GPD0(2), S3C_GPIO_PULL_UP); //设置为上升
s3c_gpio_cfgpin(S5PV210_GPD0(2), S3C_GPIO_SFN(1)); //设置gpio的CON寄存器
gpio_set_value(S5PV210_GPD0(2), 0); //设置gpio的DAT寄存器的值
源码分析:
gpio_set_value
void gpio_set_value(unsigned gpio, int on)
{
int ret = -ENOTSUPP;
struct gpio_chip *chip;
unsigned long irq_flags;
spin_lock_irqsave(&gpio_chips_lock, irq_flags);
chip = get_gpio_chip_locked(gpio);
if (chip && chip->write)
ret = chip->write(chip, gpio, on);
spin_unlock_irqrestore(&gpio_chips_lock, irq_flags);
}
s3c_gpio_setpull
int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull)
{
struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin);
unsigned long flags;
int offset, ret;
if (!chip)
return -EINVAL;
offset = pin - chip->chip.base;//得到偏移值
s3c_gpio_lock(chip, flags);
ret = s3c_gpio_do_setpull(chip, offset, pull);//设置为上升
s3c_gpio_unlock(chip, flags);
return ret;
}
s3c_gpio_cfgpin
int s3c_gpio_cfgpin(unsigned int pin, unsigned int config)
{
struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin);
unsigned long flags;
int offset;
int ret;
if (!chip)
return -EINVAL;
offset = pin - chip->chip.base;
s3c_gpio_lock(chip, flags);
ret = s3c_gpio_do_setcfg(chip, offset, config);//设置CON值
s3c_gpio_unlock(chip, flags);
return ret;
}
s3c_gpio_getcfg
unsigned s3c_gpio_getcfg(unsigned int pin)
{
struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin);
unsigned long flags;
unsigned ret = 0;
int offset;
if (chip) {
offset = pin - chip->chip.base;
s3c_gpio_lock(chip, flags);
ret = s3c_gpio_do_getcfg(chip, offset);
s3c_gpio_unlock(chip, flags);
}
return ret;
}