1. 程式人生 > >am335x嵌入式開發-GPIO操作

am335x嵌入式開發-GPIO操作

GPIO操作是嵌入式開發中最常見的操作,本文將從硬體、驅動層、應用層去剖析am335x soc 的GPIO操作。

官方文件

ti官方關於gpio的支援,點選以下連結進入

官方文件1
官方文件2

應用層使用

GPIO編號

  • GPIO的所有操作都是基於編號的,可以說編號是一個GPIO的ID,TI AM335x系列處理器GPIO的編號規則如下:

    pin_num=bank_num32+pin_bank_num
    pin_num=GPIO
    bank_num=GPIO
    pin_bank_num=GPIOGPIO

  • AM335x系列SOC有4個bank,每個bank有32個GPIO,一共支援 32

    4=128 個GPIO,GPIO的bank表示方法為: bank0[0:31] bank1[0:31] bank2[0:31] bank3[0:31]。例如晶片上有一個pin為gpio2_3,
    則這個pin的GPIO編號為:number=232+3=67

GPIO操作例項

  • 將GPIO對映到sysfs檔案系統:
# echo 67 > /sys/class/gpio/export
  • 設定GPIO模式(設定為IO口模式):
# echo "7" > /sys/class/gpio/gpio67/mode
  • 設定GPIO方向(輸入或輸出):
# echo "out" > /sys/
class/gpio/gpio67/direction

or

# echo "in" > /sys/class/gpio/gpio67/direction
  • 操作GPIO

    1. 設定GPIO電平

      
      # echo 0 > /sys/class/gpio/gpio67/value // set gpio value to low
      
      
      # echo 1 > /sys/class/gpio/gpio67/value // set gpio value to high
      
    2. 讀GPIO當前電平

# cat /sys/class/gpio/gpio67/value // read gpio value
# 1
  • 解除GPIO對映
# echo 67 /sys/class/gpio/unexport

核心配置

要使能linux下的GPIO功能,需要對核心進行配置,筆者使用的sdk是 sdk-am335x-evm-05.06.00.00 的官方釋出包,主機系統為ubuntu-14.04。假設sdk的配置已經做過。

  • 進入核心配置
# make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm menuconfig

在執行過程中報錯,顯示很多呼叫找不到,這是因為ubuntu缺少一些庫的支援,解決辦法如下:

# sudo apt-get install libncurses5  libncurses5-dev
  • 使能核心的GPIO功能

選擇裝置驅動

這裡寫圖片描述

這裡寫圖片描述

  • 退出儲存並重新編譯核心

驅動使用GPIO

  • 驅動路徑

    am335x gpio驅動包含兩個檔案:

    原始碼檔案 說明
    drivers/gpio/omap-gpio.c 處理器 gpio驅動
    drivers/gpio/omap-gpiolib.c sysfs gpio驅動

  • 如何在kernel中使用GPIO

    API 例項 說明
    gpio_request() err = gpio_request(67, “sample_name”); 申請GPIO資源
    gpio_free() err = gpio_free(67); 釋放GPIO資源
    gpio_direction_input() err = gpio_direction_input(67); 將GPIO設為輸出
    gpio_direction_output() err = gpio_direction_output(67,1); 將GPIO設為輸出並初始化高
    gpio_get_value() val = gpio_get_value(); 讀取GPIO的當前電平

  • 如何在kernel中使用GPIO中斷

    API 例項 說明
    gpio_to_irq() irq_num = gpio_to_irq(67); 獲取GPIO中斷號
    request_irq() request_irq(irq_num, handler, 0, “gpio_test”, NULL); 申請中斷
    set_irq_type() set_irq_type(irq_num, IRQ_TYPE_EDGE_RISING); 設定中斷型別
    free_irq() free_irq(irq_num, NULL); 釋放中斷


    注意:在使用gpio中斷前要先申請對應的GPIO資源,在釋放中斷後要釋放GPIO資源

晶片GPIO結構