嵌入式开发之hi3519---GPIO 驱动
在一个嵌入式系统中使用最多的莫过于 通用输入输出 GPIO口。看到论坛中经常有朋友问海思为什么没有提供GPIO驱动。其实不然。
在海思SDK xxx/osdrv/tools/board_tools/reg-tools-1.0.0/source/tools/下 提供了himm的读写工具源码。
你也可以根据himm的源码来写一个文件设备操作的驱动。毕竟轮子已经有了,我们就没必要再去造轮子了。
这个工具是用来 配置海思寄存器的。当然可以稍加改造或者在应用直接使用来控制通用寄存器。
根据海思提供资料 ,配置一个通用GPIO需要做如下工作。
1. 参考“管脚复用控制寄存器”配置管脚的相应位,使能需要使用的 GPIO管脚功能。(这块大家自己去查复用寄存器表)
2. 配置寄存器 GPIO_DIR,选择 GPIO是作为输入还是输出。
GPIO用于输入:外部信号通过 GPIO 管脚送进来,此时可通过 GPIO_DATA 寄存器查看输入信号值。
注意:输入的信号会同时送到和 GPIO复用的管脚上。
GPIO用于输出:先向 GPIO_DATA 寄存器写入相应值后,再通过 GPIO输出写入值。
GPIO8 0x201D_0000
GPIO7 0x201C_0000
GPIO6 0x201B_0000
GPIO5 0x201A_0000
GPIO4 0x2019_0000
GPIO3 0x2018_0000
GPIO2 0x2017_0000
GPIO1 0x2016_0000
GPIO0 0x2015_0000
GPIOn对应的寄存器地址为:GPIOn基地址+该寄存器偏移地址。
下面是比较关键的一个问题:我们知道对GPIO_DATA的操作可以控制输出,如果DIR方向是输入,可以读取这个地址的值 。那么怎么进行位操作呢?
海思的手册给出如下解释。海思的DATA寄存器通过 一个10位的地址中的高8位进行位寻址。
比如我要操作
若地址为 0x3FC(0b11_1111_1100) ,则对 GPIO_DATA[7:0]这 8bit操作全部有效。
操作方式: 基地址+偏移地址 0x3FC就为便宜地址,如果对该地址的寄存器操作则对所有8个IO的控制有效。
若地址为 0x200(0b10_0000_0000) ,则仅对 GPIO_DATA[7]的操作有效。
另一个关键寄存器
GPIO_DIR 方向寄存器 偏移地至 0x400
下面举个栗子: (控制开发板3G电源)
比如控制GPIO0_1
基地址 GPIO0_BASE 0x2015_0000
GPIO_DIR = GPIO0_BASE + OFFSET(0x400) 0:输入 1:输出
则数据DATA寄存器地址 0b00_0000_1000 = 0x08
对了别忘了复用:
复用的基地址 0x200F0000 复用偏移地址 0x09c
该寄存器 bit0 控制复用 0 为GPIO 1为功能。
himm 0x200F009C 0
himm 0x20150400 2
himm 0x20150008 0xFF
附图:
3G_RST = RMII_TXD0 功能1 : GPIO0-2
3G_Power = RMII_TXEN 功能1: GPIO0-1
复用寄存器基地址 0x200F 0000
偏移地址
这是HI3531的/etc/init.d/rcS的内容,结合HIMM工具,我们分析一下。
#GPIO17 3~6
himm 0x200F0234 0
himm 0x200F0238 0
himm 0x200F023C 0
himm 0x200F0240 0
#GPIO17 DIR
himm 0x20260400 0x20
#GPIO17_5 BUZZER
himm 0x20260080 0x20
ifconfig eth0 192.168.0.140
ifconfig eth1 192.168.1.163
telnetd&
#GPIO17_5 BUZZER
himm 0x20260080 0x0
#GPIO17 3~6
himm 0x200F0234 0
himm 0x200F0238 0
himm 0x200F023C 0
himm 0x200F0240 0
这四行是定义GPIO17的3~6引脚为GPIO1的功能,即用作IO管理用。
地址计算为基地址0X200F0000, 再加上0X234, 定义GP17.3的地址。
#GPIO17 DIR
himm 0x20260400 0x20
这是定义GPIO17.5脚为输出引脚,即方向引脚。记住:0X400都是方向引脚,一个组只有一个寄存器
#GPIO17_5 BUZZER
himm 0x20260080 0x20
这里直接输出17_5的引脚为高电平,引脚为高,蜂鸣器开始响了。 0X20为0B0010_0000, 也就是BIT5, 管脚号是GPIO17_0~GPIO17_7,
这里的0x20260080 的数据寄存器
再加上偏移地址0X080, 计算方法为: 0X20260000 + (1 《 (5 + 2))
其中5为管脚号, 2为右移MASK地址PADDR[9:2]
#GPIO17_5 BUZZER
himm 0x20260080 0x0
在运行了网络配置和TELNET程序后,置GPIO17_5脚为低电平,关掉蜂鸣器。
http://blog.csdn.net/USB_ABC/article/details/51714458
http://blog.csdn.net/xyyangkun/article/details/8485426?reload 驱动
嵌入式开发之hi3519---GPIO 驱动的更多相关文章
- 嵌入式开发之hi3519---GPIO 按键驱动
摸索了一个星期,终于把海思HI3515开发板的按键中断程序搞出来了,hi3515的核心芯片与网上例子较多的s3c之类的有一些区别,以至于浪费了好些时间去琢磨.管脚配置方式不一样,中断的使用情况也不一样 ...
- 嵌入式驱动开发之usb 无线网卡驱动---RT2870STA dm368
RT2870STA 368的无线网卡驱动! http://www.linuxidc.com/Linux/2014-02/96979.htm
- 嵌入式开发之zynq---Zynq PS侧I2C驱动架构
http://blog.chinaunix.net/uid-24148050-id-120532.html http://bbs.csdn.net/topics/390538368?page=1 ht ...
- 嵌入式开发之zynq驱动—— zynq ps pl ddr 内存地址空间映射
http://www.wiki.xilinx.com/Zynq-7000+AP+SoC+-+32+Bit+DDR+Access+with+ECC+Tech+Tip http://patchwork.o ...
- 嵌入式开发之zynq---Zynq PS侧sd驱动
http://blog.chinaunix.net/uid-29404121-id-4217026.html http://blog.chinaunix.net/uid-29709984-id-430 ...
- 嵌入式开发之zynq---Zynq PS侧DMA驱动
http://xilinx.eetrend.com/blog/10760 http://xilinx.eetrend.com/blog/10787
- 嵌入式开发之NorFlash 和NandFlash
http://blog.csdn.net/tigerjibo/article/details/9322035 [摘要]:作为一个嵌入式工程师,要对NorFlash 和NandFlash要有最起码的认知 ...
- 嵌入式开发之zynq——赛灵思的一款两a9加一fpga芯片的开发板
没办法,回家入职新公司,做通信的,用到这款zynq加ad9163射频架构的开发版,要我做驱动,这可是初次接触zynq,带fpga的集成芯片,心里还是有点惊喜和忧愁,忧愁怎么最快啃下这个硬骨头,好吧上网 ...
- 嵌入式开发之zynqMp ---Zynq UltraScale+ MPSoC 图像编码板zcu102
1.1 xilinx zynqMp 架构 1.1.1 16nm 级别工艺 Zynq UltraScale+ MPSoC架构 Xilinx新一代Zynq针对控制.图像和网络应用推出了差异化的产品系,这 ...
随机推荐
- C# 格式化新招
C# 格式化新招 ) from Attribute_Item where AttributeSysNo=$AttributeSysNo and Name='$Name' and SysNo !=$Sy ...
- Java Comparator字符排序(数字、字母、中文混合排序)
Java.lang.Character类 复习一下 这是修正前的排序效果: 这是修正后的排序效果: 完整示例: 以下是排序的部份代码(非全部代码:拼音首字母算法不在其中) import java.ut ...
- Knockout.Js官网学习(selectedOptions绑定、uniqueName 绑定)
selectedOptions绑定 selectedOptions绑定用于控制multi-select列表已经被选择的元素,用在使用options绑定的<select>元素上. 当用户在m ...
- C#中Split用法【转】
https://www.cnblogs.com/webenh/p/6570801.html 1.用字符串分隔: using System.Text.RegularExpressions;string ...
- C# Queue 和Stack的实现
Queue 和Stack的使用就不用多说吧,一个是先进先出,一个是后进先出. 这里我主要关注其实现原理. queue的实现如下: public class Queue<T> : IEnum ...
- 虚拟机下CentOS7开启SSH连接
在虚拟机(Vmware Workstation)下,安装了CentOS7,现在想通过SSH工具连接虚拟机中的CentOS7 1. 首先,要确保CentOS7安装了 openssh-server,在 ...
- MongoDB(1)--简单介绍以及安装
前段时间接触了NoSql类型的数据库redis,当时是作为缓存server使用的.那么从这篇博客開始学习还有一个非常出名的NoSql数据库:MongoDb.只是眼下还没有在开发其中使用.一步一步来吧. ...
- IASetIndexBuffer Offset
这个Offset官方解释是:Offset (in bytes) from the start of the index buffer to the first index to use. 翻译成中文就 ...
- Python多进程库multiprocessing中进程池Pool类的使用[转]
from:http://blog.csdn.net/jinping_shi/article/details/52433867 Python多进程库multiprocessing中进程池Pool类的使用 ...
- golang 面向对象编程
概述 Golang语言的面向对象与c++,py等语言有所不同,是由于Golang不支持继承:与上述支持聚合和继承的面向对象的语言不同,Golang只支持聚合(也叫做组合)和嵌入.聚合和嵌入的区别: t ...