在一个嵌入式系统中使用最多的莫过于 通用输入输出 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 驱动的更多相关文章

  1. 嵌入式开发之hi3519---GPIO 按键驱动

    摸索了一个星期,终于把海思HI3515开发板的按键中断程序搞出来了,hi3515的核心芯片与网上例子较多的s3c之类的有一些区别,以至于浪费了好些时间去琢磨.管脚配置方式不一样,中断的使用情况也不一样 ...

  2. 嵌入式驱动开发之usb 无线网卡驱动---RT2870STA dm368

    RT2870STA 368的无线网卡驱动! http://www.linuxidc.com/Linux/2014-02/96979.htm

  3. 嵌入式开发之zynq---Zynq PS侧I2C驱动架构

    http://blog.chinaunix.net/uid-24148050-id-120532.html http://bbs.csdn.net/topics/390538368?page=1 ht ...

  4. 嵌入式开发之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 ...

  5. 嵌入式开发之zynq---Zynq PS侧sd驱动

    http://blog.chinaunix.net/uid-29404121-id-4217026.html http://blog.chinaunix.net/uid-29709984-id-430 ...

  6. 嵌入式开发之zynq---Zynq PS侧DMA驱动

    http://xilinx.eetrend.com/blog/10760 http://xilinx.eetrend.com/blog/10787

  7. 嵌入式开发之NorFlash 和NandFlash

    http://blog.csdn.net/tigerjibo/article/details/9322035 [摘要]:作为一个嵌入式工程师,要对NorFlash 和NandFlash要有最起码的认知 ...

  8. 嵌入式开发之zynq——赛灵思的一款两a9加一fpga芯片的开发板

    没办法,回家入职新公司,做通信的,用到这款zynq加ad9163射频架构的开发版,要我做驱动,这可是初次接触zynq,带fpga的集成芯片,心里还是有点惊喜和忧愁,忧愁怎么最快啃下这个硬骨头,好吧上网 ...

  9. 嵌入式开发之zynqMp ---Zynq UltraScale+ MPSoC 图像编码板zcu102

    1.1 xilinx zynqMp 架构 1.1.1 16nm 级别工艺 Zynq UltraScale+  MPSoC架构 Xilinx新一代Zynq针对控制.图像和网络应用推出了差异化的产品系,这 ...

随机推荐

  1. (华中科大)江南雨烟 C++ STL 专栏

    本文转载来自,华中科技大学江南雨烟的C/C++专栏部分STL剖析文章,以作学习之用. [1]  [C++ STL学习之一]容器的共通能力和共通操作总结 [2]  [C++ STL学习之二]容器vect ...

  2. php中对Mysql数据库的访问操作

    一:  PHP-MySQL 是 PHP 操作 MySQL 资料库最原始的 Extension ,PHP-MySQLi 的 i 代表 Improvement ,提更了相对进阶的功能,就 Extensio ...

  3. Android getWidth和getMeasuredWidth

    1. 在一个类初始化时,即在构造函数当中我们是得不到View的实际大小的.感兴趣的朋友可以试一下,getWidth()和getMeasuredWidth()得到的结果都是0.但是我们可以从onDraw ...

  4. 将java项目传输到centos7服务端

    http://www.xdowns.com/so.asp?keyword=flashfxp 下载flashfxp之后进行一系列配置即可 https://cloud.baidu.com/?from=co ...

  5. 服务器被ddos攻击?分析如何防止DDOS攻击?

    上周知名博主阮一峰的博客被DDOS攻击,导致网站无法访问而被迫迁移服务器的事情,引起了广大网友的关注及愤慨,包括小编的个人博客也曾接受过DDOS的“洗礼”,对此感同身受.所以,本文我们一起来了解下DD ...

  6. AngularJS中ui-router全攻略

    首先是angular-ui-router的基本用法. ■ 如何引用依赖angular-ui-router angular.module('app',["ui.router"]) . ...

  7. android:四种基本布局

    一个丰富的界面总是要由很多个控件组成的,那我们如何才能让各个控件都有条不紊地 摆放在界面上,而不是乱糟糟的呢?这就需要借助布局来实现了.布局是一种可用于放置很 多控件的容器,它可以按照一定的规律调整内 ...

  8. WordPress基础:极简手动安装教程

    1.下载WordPress 2.将解压后的文件夹,放到网站根目录,并重命名为你喜欢的目录如:w, 3.重命名文件wp-config-sample.php 为 wp-config.php,并进行配置 4 ...

  9. 最课程阶段大作业之01:使用SVN实现版本控制

    版本控制在友军那里都是放在整个培训的最后阶段才开始讲的,但我们打算放到SE阶段.与其匆匆在项目实战阶段弄个半生不熟,然后进入实际工作中接受他人对你的怀疑,不如……早死早超生~~~. 可是,我们毕竟现在 ...

  10. IntelliJ IDEA全局内容搜索和替换

      在做项目时,有时会在整个项目里或指定文件夹下进行全局搜索和替换,这是一个很方便功能.使用方法如下: 一.全局搜索 1.使用快捷键Ctrl+Shift+F打开搜索窗口,或者通过点击Edit–> ...