s3c的gpio控制接口

版权声明:转载请声明 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40732350/article/details/83047550
今日推荐