历史上的今天
返回首页

历史上的今天

今天是:2024年11月12日(星期二)

正在发生

2019年11月12日 | 关于驱动中调用内核函数实现gpio寄存器的设置

2019-11-12 来源:51hei

系列函数

系列函数的定义在arch/arm/mach-s3c2410/gpio.c,相关的宏定义在include/asm-arm/arch-s3c2410/regs-gpio.h

(1)void s3c2410_gpio_setpin(unsigned int pin, unsigned intto);

设置相应GPIO口的输出值,例如:

pin=S3C2410_GPG2,to=0,则设置S3C2410_GPG2的输出值为0;

pin=S3C2410_GPG2,to=1,则设置S3C2410_GPG2的输出值为1。

函数定义:

viewplain


void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)  

{  

    void __iomem *base = S3C2410_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);  



(2)unsigned int s3c2410_gpio_getpin(unsigned intpin);

获取相应GPIO口的值。

函数定义:

viewplain


unsigned int s3c2410_gpio_getpin(unsigned int pin)  

{  

    void __iomem *base = S3C2410_GPIO_BASE(pin);  

    unsigned long offs = S3C2410_GPIO_OFFSET(pin);  

  

    return __raw_readl(base + 0x04) & (1<< offs);  

}  

  

EXPORT_SYMBOL(s3c2410_gpio_getpin);  



(3)void s3c2410_gpio_cfgpin(unsigned int pin, unsigned intfunction);

设置相应GPIO口的工作模式,输入、输出、中断等。

函数定义:

viewplain


void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)  

{  

    void __iomem *base = S3C2410_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;  

    }  

  

    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);  



(4)unsigned int s3c2410_gpio_getcfg(unsigned intpin);

获取相应GPIO口的工作模式,输入、输出、中断等。

函数定义:

viewplain


unsigned int s3c2410_gpio_getcfg(unsigned int pin)  

{  

    void __iomem *base = S3C2410_GPIO_BASE(pin);  

    unsigned long mask;  

  

    if (pin < S3C2410_GPIO_BANKB) {  

        mask = 1 << S3C2410_GPIO_OFFSET(pin);  

    } else {  

        mask = 3 << S3C2410_GPIO_OFFSET(pin)*2;  

    }  

  

    return __raw_readl(base) & mask;  

}  

  

EXPORT_SYMBOL(s3c2410_gpio_getcfg);  



(5)voids3c2410_gpio_pullup(unsigned int pin, unsigned intto);

设置相应的GPIO口的电平,例如:

pin=S3C2410_GPG2,to=0,则拉低S3C2410_GPG2,也就是设置S3C2410_GPG2的值为0;

pin=S3C2410_GPG2,to=1,则拉高S3C2410_GPG2,也就是设置S3C2410_GPG2的值为1。

函数定义:

viewplain


void s3c2410_gpio_pullup(unsigned int pin, unsigned int to)  

{  

    void __iomem *base = S3C2410_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);  



(6)unsigned int s3c2410_modify_misccr(unsigned int clear,unsigned int change);

杂项设置,设置寄存器MISCCR,具体看函数定义。

函数定义:

viewplain


unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change)  

{  

    unsigned long flags;  

    unsigned long misccr;  

  

    local_irq_save(flags);  

    misccr = __raw_readl(S3C2410_MISCCR);  

    misccr &= ~clear;  

    misccr ^= change;  

    __raw_writel(misccr, S3C2410_MISCCR);  

    local_irq_restore(flags);  

  

    return misccr;  

}  

  

EXPORT_SYMBOL(s3c2410_modify_misccr);  



(7)int s3c2410_gpio_getirq(unsigned intpin);

获取相应的GPIO口所对应的中断号。

函数定义:

viewplain


int s3c2410_gpio_getirq(unsigned int pin)  

{  

    if (pin < S3C2410_GPF0 || pin > S3C2410_GPG15_EINT23)  

        return -1;   

  

    if (pin < S3C2410_GPG0 && pin > S3C2410_GPF7)  

        return -1;   

  

    if (pin < S3C2410_GPF4)  

        return (pin - S3C2410_GPF0) + IRQ_EINT0;  

  

    if (pin < S3C2410_GPG0)  

        return (pin - S3C2410_GPF4) + IRQ_EINT4;  

  

    return (pin - S3C2410_GPG0) + IRQ_EINT8;  

}  

  

EXPORT_SYMBOL(s3c2410_gpio_getirq);  



(8)int s3c2410_gpio_irqfilter(unsigned int pin, unsignedint on, unsigned int config);

中断过滤配置,具体看函数定义。

函数定义:

viewplain


int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on,  

               unsigned int config)  

{  

    void __iomem *reg = S3C2410_EINFLT0;  

    unsigned long flags;  

    unsigned long val;  

  

    if (pin < S3C2410_GPG8 || pin > S3C2410_GPG15)  

        return -1;  

  

    config &= 0xff;  

  

    pin -= S3C2410_GPG8_EINT16;  

    reg += pin & ~3;  

  

    local_irq_save(flags);  

  

      

  

    val = __raw_readl(reg);  

    val &= ~(0xff << ((pin & 3) * 8));  

    val |= config << ((pin & 3) * 8);  

    __raw_writel(val, reg);  

  

      

  

    val = __raw_readl(S3C2410_EXTINT2);  

    val &= ~(1 << ((pin * 4) + 3));  

    val |= on << ((pin * 4) + 3);  

    __raw_writel(val, S3C2410_EXTINT2);  

  

    local_irq_restore(flags);  

  

    return 0;  

}  

  

EXPORT_SYMBOL(s3c2410_gpio_irqfilter); 

推荐阅读

史海拾趣

ATP [ATP Electronics]公司的发展小趣事

面对工业应用领域的特殊需求,ATP敏锐地捕捉到了市场机遇。公司成功推出了业界首款工业级SLC e.MMC产品E800Pi,这款产品以其高达6万次的单元擦写耐久性和出色的耐高温、交叉温度能力,受到了工业领域的广泛认可。E800Pi的推出,不仅拓宽了ATP的产品线,也进一步提升了公司在工业存储解决方案领域的市场地位。

Foxboro I C T Inc公司的发展小趣事

为了适应全球市场的变化,ATP积极推进全球化战略。公司在美国硅谷设立总部,并在英国、台湾、中国大陆等地设立分公司,构建起了全球化的研发、生产和销售网络。这一战略布局不仅增强了ATP在全球市场的竞争力,也为公司带来了更多的合作机会和发展空间。

ABI Electronics公司的发展小趣事

随着业务的不断发展和产品的不断升级,ABI Electronics公司的品牌影响力也逐渐提升。其产品在市场上获得了良好的口碑和声誉,成为了电子行业内的知名品牌。同时,ABI还积极参与行业内的交流和合作,为行业的发展做出了积极的贡献,进一步提升了其在行业内的地位和影响力。

这五个故事展示了ABI Electronics公司在电子行业里的发展历程,从电路板测试技术的突破,到集成电路测试技术的创新,再到全球市场布局和合作伙伴关系的建立,以及研发实力的持续增强和品牌影响力的提升,都体现了ABI Electronics公司不断进取、不断创新的精神。

电连(ECT)公司的发展小趣事

电连技术股份有限公司(ECT)于2006年在深圳成立,专注于微型电子连接器及互连系统相关产品的技术研究、设计、制造和销售服务。在成立初期,ECT便凭借其高可靠、高性能的产品设计制造能力,在通讯设备、智能消费电子等领域获得了初步的市场份额。公司团队通过不断的技术创新和产品优化,逐渐在行业内树立了良好的口碑。

珠海艾派克(APEXMIC)公司的发展小趣事

随着技术的不断进步,艾派克逐渐在打印机芯片领域取得了突破。公司成功研发出一系列从打印机主控SoC芯片到耗材加密芯片的全系列打印机芯片产品,不仅满足了国内市场的需求,还成功打入国际市场,成为全球打印机通用耗材芯片的重要供应商。这一成就标志着艾派克在打印机芯片领域的领先地位得到了进一步巩固。

Global Navigation Systems公司的发展小趣事
远程无线防盗报警(发射)电路通常包括入侵探测器、微型无线报警发射机和无线报警接收控制器三大部分。当入侵探测器检测到异常情况(如门窗被非法打开)时,会触发微型无线报警发射机发出编码报警电信号。这个信号通过无线方式传输给远程的无线报警接收控制器,接收控制器解码后触发报警装置(如警铃、灯光等)进行报警,并可能通过GSM模块等通讯方式将报警信息发送给用户或监控中心。

问答坊 | AI 解惑

可视倒车雷达

ddddddddddddddddddddddddddddddd…

查看全部问答>

锁相环的作用

今天听讲的时候,听说锁相环有三大功效! 倍频。软件的分频用延时就可以实现。要倍频的话,的确需要它。稳定时钟。为了得到稳定的时钟频率。用锁相环吧!调相。为了得到可靠的有用信号,特别是是一些检测信号。一个始终内的延时。就需要调相了。不 ...…

查看全部问答>

dsp晶振选用

请问dps外接晶振用无源的好还是有源的好?57个问题中说:晶体没有电压的问题,可以适应于任何DSP,建议用无源的晶体,是这样吗?…

查看全部问答>

Thumb2汇编程序(博大家一笑而已)

反正最近的工作就是在CORTEX-M3平台上做产品 最近在研究其堆栈布局和使用的时候 写出了一个本人有屎以来最短的程序 编译生成的目标代码只有12个字节 其中,中断向量表8个字节,程序,2个字节,另外两个是ARMASM要求的字对其, 实际上没啥技术 ...…

查看全部问答>

散分!!!!!!!

恭喜发财,我散分,我发财,大家一起发财!!!!!!…

查看全部问答>

如何选择A/D

我最近要做一个温度检测系统,范围0---99,检测分辨率 0.1℃,在检测电路设计上用铂电阻电桥检测(三线),由于第一次做设计不懂如何选择A\\D,请各位朋友帮忙小弟一下,感激不尽!…

查看全部问答>

eVC++ 对web service 的调用可以么??

论坛以前有这个帖子可是没有明确的答复。 如果谁知道这个问题可以麻烦帮忙解答一下么?? 如果不能调用可以说出根据 或者 文章出处么/? 如果可以调用的话,可以介绍一下方法么?? 谢谢!!…

查看全部问答>

NXP和UPM加强合作推出数据存取方便的 NFC标签

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 NXP 半导体 N.V.公司是总部设在荷兰Eindhoven的全球半导体器件公司, UPM RFID 是无源 HF 和 UHF无线识别标签和芯片领先的设计和制造商,两家公司宣布 ...…

查看全部问答>