发布时间:2025-10-15 17:59:18    次浏览
//这里面的函数都是内核导出函数/plat-s3c24XX/gpio.c中#includelinux/kernel.h#includelinux/init.h#includelinux/module.h#includelinux/interrupt.h#includelinux/ioport.h#include linux/io.h#include mach/hardware.h#include mach/gpio-fns.h#include asm/irq.h#include mach/regs-gpio.h//设置gpio的工作模式,是输入,输出还是其他的//s3c2410_gpio_cfgpin(S3C2410_GPB(5),S3C2410_GPIO_INPUT),就是设置GPB5为输入模式void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function){void __iomem *base = S3C24XX_GPIO_BASE(pin);unsigned long mask;unsigned long con;unsigned long flags;if (pin S3C2410_GPIO_BANKB) {mask = 1 S3C2410_GPIO_OFFSET(pin);} else {mask = 3 S3C2410_GPIO_OFFSET(pin)*2;}switch (function) {case S3C2410_GPIO_LEAVE:mask = 0;function = 0;break;case S3C2410_GPIO_INPUT:case S3C2410_GPIO_OUTPUT:case S3C2410_GPIO_SFN2:case S3C2410_GPIO_SFN3:if (pin S3C2410_GPIO_BANKB) {function -= 1;function = 1;function = S3C2410_GPIO_OFFSET(pin);} else {function = 3;function = S3C2410_GPIO_OFFSET(pin)*2; }}/* modify the specified register wwith IRQs off */local_irq_save(flags);con = __raw_readl(base + 0x00);con = ~mask;con |= function;__raw_writel(con, base + 0x00);local_irq_restore(flags);}EXPORT_SYMBOL(s3c2410_gpio_cfgpin);//作用:返回对应的GPIO的配置情况,例如pin=s3c2410_GPB5,则unsigned int s3c2410_gpio_getcfg(unsigned int pin){void __iomem *base = S3C24XX_GPIO_BASE(pin);unsigned long val = __raw_readl(base);if (pin S3C2410_GPIO_BANKB) {val = S3C2410_GPIO_OFFSET(pin);val = 1;val += 1;} else {val = S3C2410_GPIO_OFFSET(pin)*2;val = 3;}return val | S3C2410_GPIO_INPUT;}EXPORT_SYMBOL(s3c2410_gpio_getcfg);//设置相应的GPIO的上拉电阻,当to为1时候,相应的pin引脚设置为1,表示该GPIO要上拉电阻,to为0时候,相应的pin引脚配置为0,表示不要上拉电阻void s3c2410_gpio_pullup(unsigned int pin, unsigned int to){void __iomem *base = S3C24XX_GPIO_BASE(pin);unsigned long offs = S3C2410_GPIO_OFFSET(pin);unsigned long flags;unsigned long up;if (pin S3C2410_GPIO_BANKB)return;local_irq_save(flags);up = __raw_readl(base + 0x08);up = ~(1L offs);up |= to offs;__raw_writel(up, base + 0x08);local_irq_restore(flags);}EXPORT_SYMBOL(s3c2410_gpio_pullup);int s3c2410_gpio_getpull(unsigned int pin){void __iomem *base = S3C24XX_GPIO_BASE(pin);unsigned long offs = S3C2410_GPIO_OFFSET(pin);if (pin S3C2410_GPIO_BANKB)return -EINVAL;return (__raw_readl(base + 0x08) (1L offs)) ? 1 : 0;}EXPORT_SYMBOL(s3c2410_gpio_getpull);//当GPIO的工作为输入时候,设置某个GPIO的值//s3c2410_gpio_setpin(S3C2410_GPB(5),0),设置GPB5的输入值是0,就是低电平,to为1,表示该pin输出为1void s3c2410_gpio_setpin(unsigned int pin, unsigned int to){void __iomem *base = S3C24XX_GPIO_BASE(pin);unsigned long offs = S3C2410_GPIO_OFFSET(pin);unsigned long flags;unsigned long dat;local_irq_save(flags);dat = __raw_readl(base + 0x04);dat = ~(1 offs);dat |= to offs;__raw_writel(dat, base + 0x04);local_irq_restore(flags);}EXPORT_SYMBOL(s3c2410_gpio_setpin);//当GPIO为输出模式时候,获取GPIO的输出数值//s3c2410_gpio_getpin(S3C2410_GPB(5)),获取GPB5的输出值unsigned int s3c2410_gpio_getpin(unsigned int pin){void __iomem *base = S3C24XX_GPIO_BASE(pin);unsigned long offs = S3C2410_GPIO_OFFSET(pin);return __raw_readl(base + 0x04) (1 offs);}EXPORT_SYMBOL(s3c2410_gpio_getpin);unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change){unsigned long flags;unsigned long misccr;local_irq_save(flags);misccr = __raw_readl(S3C24XX_MISCCR);misccr = ~clear;misccr ^= change;__raw_writel(misccr, S3C24XX_MISCCR);local_irq_restore(flags);return misccr;}EXPORT_SYMBOL(s3c2410_modify_misccr);int s3c2410_gpio_getirq(unsigned int pin){if (pin S3C2410_GPF(0) || pin S3C2410_GPG(15))return -EINVAL; /* not valid interrupts */if (pin S3C2410_GPG(0) pin S3C2410_GPF(7))return -EINVAL; /* not valid pin */if (pin S3C2410_GPF(4))return (pin - S3C2410_GPF(0)) + IRQ_EINT0;if (pin S3C2410_GPG(0))return (pin - S3C2410_GPF(4)) + IRQ_EINT4;return (pin - S3C2410_GPG(0)) + IRQ_EINT8;}EXPORT_SYMBOL(s3c2410_gpio_getirq);原文链接:http://www.eeworld.com.cn/mcu/article_2016101330430.html