zoukankan      html  css  js  c++  java
  • 嵌入式开发之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 驱动

  • 相关阅读:
    开源:不断创新的动力
    Inkpad中文翻译已合并到官方项目
    Inkpad绘图原理浅析
    Vectoroid
    发布大幅重构优化的 TouchVG 1.0.2
    清理掉一直想研究的开源项目
    函数指针调用方式
    音视频直播优化
    std::unique_lock与std::lock_guard区别示例
    c++容器的操作方法总结
  • 原文地址:https://www.cnblogs.com/pengkunfan/p/7944685.html
Copyright © 2011-2022 走看看