wince GPIO 学习

OMAP3530 WINCE GPIO驱动开发过程

 
       一开始上来整TI的OMAP3530,直接碰的就是系统移植和GPIO驱动。看了TI的DATASHEET和产品的性能介绍,说实话真的是一分钱一分货,与曾经的三星的相比,三星产品的本地化(中国)做得比较好,首先价格较同类便宜,第二由于第一点造就了用的人多,人多英文的变成中文的手册多,例子多,书多,源码多。天下源码一大抄吗,所以一般而言,三星的就更受欢迎了,但是回过头来,TI的产品真让你心服口服。他的支持之多,超过了三星,只是多是英文的,起点高,所以。。。
       言归正传,OMAP3530的GPIO(General-purpose Interface)按照分组的原则,共有6组,每组的控制类寄存器是32bit的,代表了32个GPIO,所以总共有192个GPIO,这些是属于MPU控制的,超过192编号的GPIO是属于IVA2.2(DSP)控制的。结构框图如下:
       OMAP3530 <wbr>WINCE <wbr>GPIO驱动开发过程
OMAP3530的GPIO具有以下功能:
1)数据输入(捕获)/输出(驱动)
2) 带有防抖功能的键盘接口
3)外部事件检测(电平中断、边沿中断)
4) 在空闲模式下通过外部事件的睡眠唤醒功能
相关的配置需要仔细参照技术手册
       接下来是WINCE下的GPIO驱动,跳过流驱动的标准框架以及MDD层框架和PDD层的与硬件相关的寄存器设置。这些和三星ARM的GPIO驱动大同小异。
       着重介绍可能遇到的问题,忽略的地方:
我在编写完OMAP3530的GPIO驱动后,发现有的GPIO能够控制输入输出,有的则不能。经过同学提醒,重新看了技术手册,原来在技术手册的第7章System Control Module(SCM)中明确介绍了core modul(内核模块)和wake-up module(唤醒模块)。
       SCM主要负责以下功能
1)I/O端口功能复用、多工选择
2) Pad块配置(端口上拉/下拉)
3) 设备状态
4) MPU和DSP(IVA2.2)的外围扩展设备特性
5) 静态设备配置
6)调试和观测功能IO复用
7) 存储pad块的配置
pad块配置寄存器如下:
OMAP3530 <wbr>WINCE <wbr>GPIO驱动开发过程

其中pad块的配置中有一项就是端口的MODE(3bits),由于一个GPIO可能有多个功能,他们是互斥的,只能选择一个,就涉及到端口功能的选择,总共有MODE0到MODE7八个模式,默认是MODE0,MODE7是安全模式。比如GPIO143总共有实实在在的5个模式:mcbsp3_fsx/uart2_rx/gpio143/hsusb3_till_data7/safemode。所以在配置GPIO的时候需要选择成GPIO模式,不然操作GPIO就没有效果,这是问题1.
     另外,上面的配置只能解决端口的输出控制,当端口配置成输入时,就不一定能读取端口电平。问题出在哪里呢,继续仔细参照技术手册的SCM模块。pad块中还有两项是GPIO的上拉/下拉选项、输入使能选项。针对当GPIO端口配置为输入时不能读取正确的引脚电平的问题,主要原因是由于GPIO端口的输入使能被关闭了。
     输入使能(INPUTENABLE)(1bits)的描述如下:
1)INPUTENABLE = 0,关闭引脚输入,引脚只能够作为输出。
2)  INPUTENABLE = 1,使能引脚输入,引脚具有双向端口功能,即输入/输出。
所以我们应该使能SCM中,pad块的这项功能。
     具体到相关的WINCE文件有
GPIO驱动:
     1) $\WINCE600\PLATFORM\TI_EVM_3530\SRC\DRIVERS\GPIO\gpio.cpp
     2)$\WINCE600\PLATFORM\COMMON\SRC\SOC\OMAP35XX_TPS659XX_TI_V1\omap35xx\GPIO\omap35xx_gpio.cpp
启动时安装配置成GPIO的文件:
     1)$\WINCE600\PLATFORM\TI_EVM_3530\SRC\BOOT\XLDR\platform.c
比如:
      VOID GpioSetup()函数下的GPIO模式和端口方向定制:
  OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D0, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
       OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D1, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
       OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D2, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
       OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D3, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
       OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D4, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
       OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D5, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
       OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D6, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
       OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D7, (INPUT_ENABLE | PULL_INACTIVE | MUX
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值