s3c2410_gpio_cfgpin等内核导出函数

发布者:beup001最新更新时间:2016-10-13 来源: elecfans关键字:s3c2410_gpio_cfgpin  内核  导出函数 手机看文章 扫描二维码
随时随地手机看文章
//这里面的函数都是内核导出函数/plat-s3c24XX/gpio.c中

#include
#include
#include
#include
#include
#include

#include
#include
#include

#include

//设置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输出为1

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

关键字:s3c2410_gpio_cfgpin  内核  导出函数 引用地址:s3c2410_gpio_cfgpin等内核导出函数

上一篇:S3C2440 摄像接口CamInit()函数初始化之分析
下一篇:有关STM32固件库的一些想法

推荐阅读最新更新时间:2024-03-16 15:15

图像处理芯片内核市场已开始乱战
除了移动SoC及处理器核心之外,绘图芯片也是充满着战场的烟硝味。由于下一代行动SoC更强调处理多媒体视讯的功能,加上透过绘图处理核心、降低主处理器作业负担的设计,逐渐成为下一代行动SoC架构的主流,因此绘图晶片的角色非常吃重。 在这里,ARM有意藉由Mali-T604进取更多市占率,而Imagination也不敢轻敌持续保持既有优势。Nvidia的GeForce绘图晶片和AMD的Fusion APU架构,则是各有一片天。 ARM 透过推出Mali-T604绘图GPU处理架构,已经补足好了3D绘图的关键板块。Mali-T604代表ARM在绘图处理GPU架构的自主能力,加上整合Cortex-A15应用处理器核心架构,并
[嵌入式]
《ARM与Linux些许问题》第三章:Linux如何从用户态进入内核
本文基于mstar801平台Linux2.6.35.11内核。 一、Linux从用户态切换到内核态的方法有哪些? 大体分为两种;主动式和被动式。 1.被动式:就是Linux在用户态(ARM在用户模式)工作,没有主动发起请求、而被动地进入内核态;包括硬件中断和程序异常。 2.主动式:就是Linux在用户态(ARM在用户模式)工作,通过发起用户态程序发起命令请求、ARM响应进入特权模式进而Linux切入内核态;就是系统调用。 二、分析上述两种切换的原理 1.被动式原理:当硬件中断过来时,通过硬件直接给CPSR置位、ARM进入IRQ模式、Linux系统进入内核态;或者用户态代码出现异常、硬件也自动完成上述工作
[单片机]
强大的MCU源于内核,系统架构和外设的综合设计
“最早的8051内核中就已经有飞利浦(恩智浦的前身)的部分专利。”恩智浦半导体资深软件工程师辛华峰表示,也正是由于恩智浦在MCU产业耕耘如此之久,才使其一直处于MCU领域的第一梯队。 据辛华峰介绍,恩智浦2003年就与ARM签订了MCU内核使用协议,05年左右推出基于ARM的MCU产品,属于最早一批和ARM合作开发MCU的厂商,同时也正是和ARM的密切合作,其MCU产品组合已涵盖ARM的所有微控制器产品内核,包括ARM7、ARM9、Cortex-M0、M3及M4等。“恩智浦和ARM已不能用合作伙伴来形容了,更像是亲如兄弟。”辛华峰笑称。 “既然大家都有相同的内核,那么恩智浦有何独门武器呢?”辛华峰表示,首先在生产方面,恩智浦一
[单片机]
强大的MCU源于<font color='red'>内核</font>,系统架构和外设的综合设计
ARM Linux启动流程分析——内核自解压阶段
本文整理了ARM Linxu启动流程的第一阶段——内核自解压,内核版本为3.12.35。我以手上的树莓派b(ARM11)为平台示例来分析uboot跳转到Linux内核运行后做了哪些初始化动作,以及如何转入真正的内核开始运行。 内核版本:Linux-3.12.35 分析文件:linux/arch/arm/boot/compressed/head.S 单板:树莓派b 在内核启动前,bootloader(我使用的是uboot)做如下准备工作: 1.CPU寄存器:R0 = 0、R1 = 机器码(linux/arch/tools/mach-types)、R2 = tags在RAM中的物理地址 2.CPU和MMU:SVC
[单片机]
ARM Linux启动流程分析——<font color='red'>内核</font>自解压阶段
BootLoader与Linux内核的参数传递
  在嵌入式系统中,BootLoader 是用来初始化硬件,加载内核,传递参数。因为嵌入式系统的硬件环境各不相同,所以嵌入式系统的BootLoader 也各不相同,其中比较通用的是U-Boot,它支持不同的体系结构,如ARM,PowerPC,X86,MIPS 等。本文着重介BootLoader与内核之间参数传递这一基本功能。本文的硬件平台是基于AT91RM9200 处理器系统,软件平台是Linux-2.6.19.2 内核。内核映像文件为zImage。   1. 系统硬件平台简介   AT91RM9200 处理器,它是由Atmel 公司基于ARM920T 内核的微处理器,带有内存管理单元,CPU 时钟最高可达240MHz,它具有丰
[单片机]
乐鑫推出新一代产品,采用RISC-V内核
日前乐鑫宣布推出ESP32-C6和ESP32-P4,都采用了RISC-V内核。 ESP32-C6 ESP32-C6 拥有一个用于高性能的 160MHz RISC-V 内核和用于节能的 20MHz RISC-V 处理器,并具有320kByte ROM,512kbyte RAM以及外部闪存。 集成了用于 2.4GHz Wi-Fi 6 和蓝牙 5 (LE) 以及 802.15.4 LR-WPAN协议的收发器。 “ESP32-C6 支持 IEEE 802.15.4 和 Wi-Fi、蓝牙5,使客户能够构建符合 Matter 标准的 Wi-Fi 端点设备和 Thread 端点设备,从而实现互操作性智能家居设备。”该公司表示。“
[单片机]
飞思卡尔融合45纳米工艺推突破效率、性能和规模的多内核通信平台
结合45 纳米技术、片上结构和增强型Power Architecture内核,飞思卡尔引领嵌入式多内核半导体设计 佛罗里达州奥兰多(飞思卡尔技术论坛)-2007年5月25日- 飞思卡尔半导体公司发布了一款新的多内核通信平台,这是一款具有创新性的多内核架构,提供突破性的效率、性能和规模,同时可解决多内核软件开发过程中不断出现的一些问题。飞思卡尔新技术最根本的优势在于节省电源,并融合了45纳米工艺技术中的优势。 消费者和企业要求新的服务和丰富的内容,这使各地的网络容量高涨。与此同时,渐进式的半导体产品创新不足以满足市场要求。设备生产商在寻求新的处理解决方案来制造持久的以软件为导向的平台,使服务供应商可以在融合网络快速推出新服务。
[新品]
基于S3C2440的Linux内核移植和yaffs2文件系统制作--启动系统
第三章 启动系统 将前面两章生成的内核映像文件和根文件系统映像文件下载到mini2440开发板,查看启动信息。我成功移植启动信息如下: VIVI version 0.1.4 ( root@capcross ) (gcc version 2.95.3 20010315 (release)) #0.1.4 Mon Oct 27 10:18:15 CST 2008 MMU table base address = 0x33DFC000 Succeed memory mapping. DIVN_UPLL0 MPLLVal CLKDIVN:5h +------------------------------------------
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved