曙海教育集团论坛Win CE 专区WinCE系统定制与驱动开发 → 回复帖子

  回复帖子
用户名:   *您没有注册?
密码:   *忘记论坛密码?    标题采用“回复:XXX....”
主题标题:  *不得超过 200 个汉字
当前心情
上一页 发帖表情 下一页
内容
高级设置: 签名: 回帖通知:
 

主题新回顾(发布时间:2010-11-26 10:58:35)
--  作者:wangxinxin
--  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的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块配置寄存器如下:
其中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_MODE_0));  
    OUTREG16(&pConfig->CONTROL_PADCONF_SDRC_D8, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0));  
 
   综上所述:SCM模块决定了端口的功能,而GPIO模块控制了端口的GPIO功能;GPIO只是端口功能的一个子集。