历史上的今天

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

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

发布者:advancement4 来源: 51hei关键字:驱动  调用内核函数  gpio寄存器 手机看文章 扫描二维码
随时随地手机看文章

系列函数

系列函数的定义在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); 

关键字:驱动  调用内核函数  gpio寄存器 引用地址:关于驱动中调用内核函数实现gpio寄存器的设置

上一篇:让arm开发板的mnt文件夹可以显示linux虚拟机中的成为挂载
下一篇:ARM for ADS1.2

推荐阅读

据长江日报报道,10日,首家京东X未来餐厅在天津开业,从点餐、配菜、炒菜、传菜到用餐、结算,智能机器人和人工智能后台贯穿餐厅运营全过程。消费者点餐后,后台将炒菜任务分配给烹饪机器人,开始菜品的烹制,最后传菜机器人会将烹制好的菜品送到餐桌前,目前共有40多道菜可供选择。京东相关负责人表示,首家餐厅运营成熟后,将向包括武汉在内的其他城市...
11 月 12 日讯,汽车行业的电子化步伐正在加速,恩智浦也加快了中国本土车企合作脚步。 近期,恩智浦宣布新一代智能驾舱在启辰 T90 上实现首次量产,而此前,恩智浦已相继宣布了与长安汽车、吉利汽车和北汽集团的战略合作。 作为全球第一大汽车市场,中国对以汽车半导体为核心业务的恩智浦意义重大,而随着中国对汽车电动化和自动驾驶发展的重视,恩...
5G发展正在如火如荼地进行,多款5G手机已问市,但只有少数几款手机能够提供所有可用频谱,而且仍存在消耗列空间(column space) 的问题。 目前可获得的28 GHz的mmWave波段对消费者市场来说是全新的。更高的频率,例如超高频,EHF( 30至300千兆赫兹的名称),可能会在未来出现。但人们希望在接受这项新技术之前了解潜在的健康影响。 虽然5G频谱的上游提供...
万用表测电阻有两个作用,一是测量未知电阻的参数,二是核实某电阻或电路的阻值是否符合要求。一、测量未知电阻在日常工作中经常遇到需要了解某个电阻的阻值。比如手里电阻上印刷的字看不清了,或对色环电阻的读法不太熟悉,所以就要用欧姆档测一下具体的阻值,以免用错。另一种情况是了解可调电阻的确切阻值。比较典型的就是我们对晶体管工作点的调整。有...

史海拾趣

问答坊 | AI 解惑

AD8065

本帖最后由 paulhyde 于 2014-9-15 08:56 编辑 AD8065资料,有好多图,不是汉语。  …

查看全部问答∨

Hi-kara/随身携带卡拉OK机!/超小型携带电玩

  没有机器猫的万能口袋,也能把K歌房随身携带噢! 它就是一个月前刚刚上市的超炫小家电“Hi-kara”,TAKARATOMY公司推出的个人专用的迷你卡拉OK设备。机身是7cm的正方体,重量仅有150克,可以托在手掌上,说它是世界最小真是一点都不夸张。对照着 ...…

查看全部问答∨

串口通讯问题:RS232和RS485转换

  下位机通过RS485向上位机发送数据,中间通过第三方的RS232-485转换器(购买的,型号HXSP-2108C)后,再通过USB转232接到PC端,再通过串口测试软件COMMASTER进行上位机和下位机的数据通讯。   但是现在碰到一个问题,下位机 ...…

查看全部问答∨

谁对搭建一个LPC2134FBD64的开发平台熟悉啊

这是一款philips的ARM7芯片,希望上面打一个开发板出来,不知道哪位高手有用过的 希望指教 想搭一个开发平台,包括SD卡,USB口,液晶驱动和AD采集 QQ:12665590…

查看全部问答∨

我想去尚观培训嵌入式,寻人一起

本人打算毕业后去北京尚观培训,想寻两个人一起,可以打9折。有此意向的加qq群:57772872…

查看全部问答∨

在Keil不能监控局部变量

一个KEIL的项目中有多个C文件。在软件仿真下,其中有一个函数的局部变量不能监控,显示值的位置提示<out ot scope>   请高手指点。…

查看全部问答∨

定时器启动AD转换的问题

LF2407A,利用定时器定时读取AD转换值,为什么在中断处理程序中去掉将IFR清零的语句仍然可以不断的进入AD中断程序读取AD值呢?不是IFR如果不人工清零的话,对于以后的中断就不处理吗?谁能解释一下?好奇怪 …

查看全部问答∨

有关verilog阻塞与非阻塞语句的一个案例

 ////////////////////////////////代码1///////////////////////////////////////  module pipeMult(product, mPlier, mCand, go, clock);   input          go, clock;   ...…

查看全部问答∨

LWIP SYN ACK

各位好,我有个问题请大家帮忙,我按照现成的例子: tcp_new,tcp_bind,tcp_listen,tcp_accept,走,可以后面收到测试包,但是用抓包工具,发现,我这边的本端在建链时,没有回应SYN ACK,我认为不对,请问怎么产生这个过程…

查看全部问答∨

Vishay发布业内首款在单片器件内集成了信号探测和处理功能的学习型遥控码IC

Vishay发布业内首款在单片器件内集成了信号探测和处理功能的学习型遥控码IC   该IC针对通用遥控器、平板电脑和智能手机而设计,兼容所有遥控数据格式   宾夕法尼亚、MALVERN — 2012 年 7 月30 日 — 日前,Vishay Intertechnology ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved