在一个嵌入式系统中使用最多的莫过于 通用输入输出 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脚为低电平,关掉蜂鸣器。

对HI3531的GPIO使用的再分析的更多相关文章

  1. Node.js开发入门—HelloWorld再分析

    在Node.js开发入门(1)我们用http模块实现了一个简单的HelloWorld站点,这次我们再来细致分析下代码.了解很多其它的细节. 先看看http版本号的HelloWorld代码: 代码就是这 ...

  2. Permutations II 再分析

    记得第一遍做这题的时候其实是没什么思路的,但是第二次的时候,我已经有"结果空间树"的概念了.这时候再看https://oj.leetcode.com/problems/permut ...

  3. 再分析 返回值加引用&,const

    本文主要分析,返回&,和返回值加const的作用. 返回& 定义一个数组模板: template<class T>class Array{ enum{size = 100} ...

  4. SparkHiveContext和直接Spark读取hdfs上文件然后再分析效果区别

    最近用spark在集群上验证一个算法的问题,数据量大概是一天P级的,使用hiveContext查询之后再调用算法进行读取效果很慢,大概需要二十多个小时,一个查询将近半个小时,代码大概如下: try: ...

  5. CRM项目再分析建表

    今天老师带着我们分析了一点项目的业务,我们就觉得有些地方呢 有一些不妥额地方,然后呢  我们就在原来表的基础上做了一些修改! 我们也把我们组的项目业务的工作分配了一下! 但是我们遇到了一个组员不和我们 ...

  6. ffmpeg tutorial01 再分析

    如下图

  7. socket编程再分析(-)——基础

    linux 网络编程-基础篇 0.Socket简介 socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Inter ...

  8. rpn网络结构再分析

    这是rpn网络train阶段的网络结构图 rpn_conv1之前的网络是特征提取层,也是和fast rcnn共享的层.rpn_conv1是一层1*1的卷积,这一层是单独为rpn网络多提取一层特征,这一 ...

  9. 阶段3 1.Mybatis_04.自定义Mybatis框架基于注解开发_3 基于注解的自定义再分析

    这里只需要 一是连接数据库的 二是映射的 注解是class的方式  dom4j技术获取xml的数据,这是xml的方式获取的下面几个关键的点 注解的方式回去dao类里面的几个主要的信息 User黄色的部 ...

随机推荐

  1. 零基础实现node+express个性化聊天室

    本篇文章使用node+express+jquery写一个个性化聊天室,一起来get一下~(源码地址见文章末尾) 效果图 项目结构 实现功能 登录检测 系统自动提示用户状态(进入/离开) 显示在线用户 ...

  2. Asp.net Core 入门实战 2.请求流程

    Asp.Net Core 是开源,跨平台,模块化,快速而简单的Web框架. Asp.net Core官网的一个源码合集,方便一次性Clone,喜欢的(Star),本系列持续更新,也可以通过我的网站访问 ...

  3. C#中的out参数/ref参数/params可变参数

    out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型. static void Main(string[] args ...

  4. jQuery&Ajax应用

    jQuery对Ajax操作进行了封装,在jQuery中$.ajax()方法属于最底层的方法,第二层是load(),$.get()和$.post()方法,第三层是$.getScript(),$.getJ ...

  5. virtualbox创建虚拟机及增加硬盘记录

    创建虚拟机 jken01VBoxManage createvm --name "jken01" --basefolder /data/virtualDir/jken01 --reg ...

  6. iOS-电子书开发 笔记

    前言 刚接手电子书项目时,和安卓开发者pt Cai老师[aipiti Cai,一个我很敬佩很资深的开发工程师,设计领域:c++.Java.安卓.QT等]共同商议了一下,因为项目要做要同步,移动端[手机 ...

  7. 济南清北学堂游记 Day 5.

    十一月的第一天.算下来在济南已经呆了接近一星期了...... 还剩九天...看着洛谷的倒计时心里直发慌. 也许我不该过多纠结于高级算法,基础也是很重要的. 今天晚上就自由的敲一些板子吧.最后的九天,让 ...

  8. BZOJ 4537: [Hnoi2016]最小公倍数 [偏序关系 分块]

    4537: [Hnoi2016]最小公倍数 题意:一张边权无向图,多组询问u和v之间有没有一条a最大为a',b最大为b'的路径(不一定是简单路径) 首先想到暴力做法,题目要求就是判断u和v连通,并查集 ...

  9. BZOJ 2959: 长跑 [lct 双连通分量 并查集]

    2959: 长跑 题意:字词加入边,修改点权,询问两点间走一条路径的最大点权和.不一定是树 不是树

  10. Typora最常用快捷键

    插入图片:直接拖动到指定位置即可或者ctrl+shift+i 插入链接:ctrl+k 对于本地图片,我们可以直接拖进来 双回车可以回到行首