1. 程式人生 > >海思晶片.通用GPIO 使用篇

海思晶片.通用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複用的管腳上。 

        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(0011_1111_1100) ,則對 GPIO_DATA[7:0]這 8bit操作全部有效。  操作方式: 基地址+偏移地址,0x3FC就為偏移地址,如果對該地址的暫存器操作則對所有8個IO的控制有效。 若地址為 0x200(0010_0000_0000) ,則僅對 GPIO_DATA[7]的操作有效。 
另一個關鍵暫存器 ,GPIO_DIR 方向暫存器 偏移地至 0x400 繼續舉例子: 比如控制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 偏移地址