Sigmatel37xx GPIO的使用
//========================================================================
//TITLE:
// Sigmatel37xx GPIO的使用
//AUTHOR:
// norains
//DATE:
// Thursday 21-August-2008
//Environment:
// NONE
//========================================================================
在文章开篇之前,先小小抱怨一下。Sigmatel的硬件部分做得不错,这个是必须承认的;但WinCE的软件部分,却不能不让人抓狂。用一句
黑话来说,就是见过烂的,没有见过这么烂的:条理杂乱无章,结构模糊不清,更不用说那些莫名其妙的BUG了。以GPIO为例子,其实在
Sigmatel 37xx BSP包已经有驱动,但实际上只是一些代码而已,没有注册表,没有PB选项,换句话说,你根本无法通过简单的设置来使用GPIO
驱动。
如果想控制GPIO,那么唯一的办法就是直接对寄存器进行读写。
首先我们必须要做的就是,包含头文件:regspinctrl.h。不过这个可得小心了,因为这文件有两个,一个位于:/SRC/INC/37xxRegs,另
一个则是在/SRC/SOCFirmware/include/37xx/registers。并且这不同位置的文件的开头描述都是一样的,但实际上在宏定义方面区别还挺大,
从而导致包含不同的regspinctrl.h,程序代码就有不同的写法。弱弱地感叹一下,不能不拜服sigmatel的方式。
在这里为了简便起见,我们用的是/SRC/INC/37xxRegs/regspinctrl.h。
首先,在使用之前,我们必须映射一下内存地址:
static PVOID pv_HwRegPinCtrl;
static PHYSICAL_ADDRESS PhysAddr;
PhysAddr.QuadPart = _PA_REGS_PINCTRL_BASE;
pv_HwRegPinCtrl = (PVOID) MmMapIoSpace(PhysAddr, 0x1000, FALSE);
if ( pv_HwRegPinCtrl == NULL)
{
RETAILMSG(1, (TEXT("Failed to map device registers /r/n")));
return FALSE;
}
如果提示找不到PHYSICAL_ADDRESS的声明,请先包含ceddk.h。在这里还有一点需要提醒一下的是,pv_HwRegPinCtrl变量只能用该名字,
并且作用域是全局的,否则在接下来的宏使用中会编译无法通过。
在对GPIO进行操作之前,我们先了解如下几个宏:
REG_HW_PINCTRL_MUXSELx_SET : 设置pin的功能。
BF_PINCTRL_MUXSELx_BANKx_PINxx :将相应的pin功能转化为写入寄存器的数值。
REG_HW_PINCTRL_DOUTx_SET :输出high
REG_HW_PINCTRL_DOUTx_CLR :输出low
REG_HW_PINCTRL_DOEx_SET :输出使能
REG_HW_PINCTRL_DOEx_CLR :输入使能
REG_HW_PINCTRL_DINx_RD :如果PIN为输入,则该宏用来读取相应寄存器的数值。
宏中的x代表数字,对应相应的PIN。
现在以实际例子对pin做一次操作。
如果我们在datasheet中看到某个PIN有如下描述:
HW_PINCTRL_MUXSEL0 BANK0_PIN08
GPMI_D08 Pin Function Selection.
00 = GPMI_D8.
01 = EMI_ADDR15.
10 = Reserved.
11 = GPIO.
如果我们想令该PIN作为GPIO并输出high,那么代码如下:
REG_HW_PINCTRL_MUXSEL0_SET(BF_PINCTRL_MUXSEL0_BANK0_PIN08(3));
REG_HW_PINCTRL_DOUT0_CLR(1 << 8);
REG_HW_PINCTRL_DOE0_SET(1 << 8);
对应datasheet,我们就不难发现以上三个宏的x如何选择相应的数字,如图:
若是想将该pin作为输入,也是比较简单,样例代码如下:
REG_HW_PINCTRL_MUXSEL0_SET(BF_PINCTRL_MUXSEL0_BANK0_PIN08(3));
REG_HW_PINCTRL_DOE0_CLR(1 << 8); //设置为输入
if((REG_HW_PINCTRL_DIN0_RD() & (1 << 8)) != 0)
{
//Input high
}
else
{
//Input low
}
代码宏中数字的选择,可参考之前图片的解释,在此就不再详表。
转载于:https://www.cnblogs.com/wodeyitian/archive/2008/08/21/2460414.html
Sigmatel37xx GPIO的使用相关推荐
- STM32 GPIO的原理、特性、选型和配置
目录 1.基本结构 2.4种输入模式 3.4种输出模式 4.GPIO选型和配置 1.基本结构 STM32 GPIO是通用输入/输出端口的英文简称,其可实现输入.输出.驱动.通信等功能,STM32的I/ ...
- STM32低功耗模式下GPIO如何配置最节能?
目录 1.将未使用的GPIO 配置为模拟输入模式 2.调节GPIO 速度 3.GPIO不使用时禁用寄存器时钟 4.避免悬空未使用的引脚 STM32低功耗模式下GPIO如何配置最节能,这里总结了一下四点 ...
- 【驱动】GPIO 作为按键时的 设备树 配置
#[驱动]GPIO作为按键时的 设备树 配置 0.设备树 0.0 别名 imx6ul.dtsi 什么作用??? /*************开始/ / { aliases {- gpio0 = &am ...
- 【驱动】GPIO寄存器配置总结
#[驱动]GPIO寄存器配置总结 0.设置复用功能为GPIO 1.设置引脚特性,与硬件匹配 2.配置寄存器举例 字段解释: 2.0.SRE 数据位:0 SRE(Slew Rate Field):转换速 ...
- linux驱动:设备-总线-驱动(以TI+DM8127中GPIO为例)
一:说明:这次学习设备-总线-驱动是以TI+DM8127的GPIO为例 1.GPIO资源注册到omap_hwmod链表中 2.初始化GPIO 3.将GPIO注册到plarform层 4.将GPIO注册 ...
- linux驱动:TI+DM8127+GPIO(五)之plarform
五.[GPIO驱动框架>平台platform] (一)设备找驱动 1.drivers/base/platform.c中 int platform_device_register(structpl ...
- linux驱动:TI+DM8127+GPIO(四)之设备
四.[GPIO驱动框架>设备device] arch/arm/mach-omap2/gpio.c中 1.static int __init omap2_gpio_init(void) { ret ...
- linux驱动:TI+DM8127+GPIO(三)之omap_hwmod中添加GPIO资源
三.[GPIO驱动框架>向omap_hwmod中添加GPIO资源] ***将GPIO硬件信息添加到注册到omap_hwmod_list列表中 Arch/arm/plat-omap/include ...
- linux驱动:TI+DM8127+GPIO(二)之驱动
二.[GPIO驱动框架>驱动driver] 重要结构体 gpio_chip:管理一组GPIO gpio_desc:描述每个GPIO gpio_bank:封装了gpio_chip加入GPIO控制的 ...
最新文章
- 机器视觉中彩色成像必须考虑的十个问题
- 雨林木风Ghost Win7 SP1 装机版 YN2012.05
- RFC 协议下载方法
- 别再傻傻地用这些软件G转P了,修复后不稳定的真相在这里
- python常用模块之shelve模块
- Python切片中的误区与高级用法
- 驼峰设计 PPT设计网站
- kettle 脚本 java_Kettle 执行SQL脚本
- OpenVINO安装之安装openCL
- oracle怎么设置出蓝色边,Oracle 数据库入门之———————-,多行函数-蓝色留心...
- 数据竞赛入门-金融风控(贷款违约预测)五、模型融合
- oracle11g安装
- ubuntu 安装redash
- 【IntellJ IDEA】idea的Terminal窗口中文乱码 解决方法
- centos时间同步
- 吴恩达教授机器学习笔记【一】- 线性回归(2)
- 电脑默认重置html,windows10电脑默认自带浏览器被篡改如何恢复
- android h5 指定浏览器_微信h5网页如何实现跳转到手机默认浏览器
- QtWebApp的使用【在Qt中搭建HTTP服务器】(三)
- 浏览器显示海康摄像头实时预览画面纯前端解决方案