嵌入式開發之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 驅動


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM