Linux制御GPIO


小さな需要を受けて、スタートキー3 sを押した後に機械がスタートして、このような機能を実現するにはあるGPIO出力のハイレベルあるいはローレベルがハードウェア回路の実現をサポートする必要がある.そこで、LinuxプラットフォームでGPIOをどのように制御するかをまとめます.
制御GPIOはカーネル状態とユーザ状態の制御に分けられ、カーネル状態では駆動を書くかubootで直接制御することができる.ユーザ状態制御は比較的簡単で,sysfsサブシステムによりGPIOを制御できる.
一、ユーザ空間制御GPIO
/sys/class/gpio/の下にexportファイルがあり、操作するGPIO番号をexportファイルに書き込み、このGPIOの操作インタフェースがカーネル空間からユーザ空間に露出するようにし、GPIOの操作インタフェースはdirectionやvalueなどを含み、directionはGPIOの入力または出力モードを制御し、valueはGPIOの状態または読み出し状態を制御することができる.
/sys/class/gpio/ディレクトリの各ファイルの説明:/sys/class/gpio/exportファイルは、システムが制御をエクスポートする必要があるGPIOピン番号を通知するために使用されます./Sys/class/gpio/unexportは、システムのエクスポート解除を通知するために使用されます./Sys/class/gpio/gpioX/directionファイルは、in(入力方向の設定)またはout(出力方向の設定)に書き込むことができます./Sys/class/gpio/gpioX/valueファイルは、GPIOの読み書きが可能な状態です./Sys/class/gpio/gpiochipXディレクトリは、各レジスタ制御ピンの開始番号、レジスタ名、ピン総数を含むシステム内のGPIOレジスタの情報を保存する.ここで、Xは具体的なピン番号を示す.
例として、7のGPIOをハイレベルに出力するように設定する
echo 7 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio7/direction
echo 1 > /sys/class/gpio/gpio7/value

各GPIOの使用状況を確認する
[root@eufy ~]$ cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/pinctrl, gpio0:
 gpio-2   (                    |reset               ) out hi    
 gpio-5   (                    |spk-ctl             ) out lo    
 gpio-7   (                    |sysfs            ) out hi    

GPIOs 32-63, platform/pinctrl, gpio1:
 gpio-42  (                    |sysfs               ) out hi    

GPIOs 64-95, platform/pinctrl, gpio2:

GPIOs 96-127, platform/pinctrl, gpio3:

GPIOs 128-159, platform/pinctrl, gpio4:


以下のように番号7のGPIOが出力ハイレベルに設定されている
gpio-7   (                    |sysfs            ) out hi    

二、カーネル空間制御GPIO
カーネルが提供するAPIの紹介
1.カーネルにIOの指定を申請する
int gpio_request(unsigned gpio, const char *label)

機能:カーネル申請にIOを指定し、申請したIOポートがカーネルに記録されます.既に申請されているIOは、釈放されないまで再申請は失敗する.パラメータ:gpio:IOポート番号を申請する;Label:申請者の名前、勝手に.戻り値:成功:0;失敗:負
2.カーネルに申請した指定IOを解放する
void gpio_free(unsigned gpio)

機能:カーネルに申請した指定IOを解放します.解放されたIOポートはカーネルレコードで消去されます.釈放されたioは再び申請されることができる.パラメータ:解放するioポート番号.この関数はgpio_とrequestペアで使用します.
3.gpioを出力機能に設定
int gpio_direction_output(unsigned gpio, int value)

機能:IOポートgpioを出力機能として指定し、指定レベルvalueを出力し、1はハイレベル、0はローレベルとする.パラメータ:gpioはどのIOポートを指定します.ここでioの番号です.申請したIO番号と一致するValueは出力レベルを指定します.高いですか、低いですか.戻り値:正常に0を返しました.失敗は-1を返します
4.gpioレベルの状態を読み取る
int gpio_direction_input(unsigned gpio)

機能:指定IOポートgpioレベル状態パラメータを読み取る:gpioのIOポートの番号戻り:ハイレベル戻り1;ローレベルは0を返します.
5.IOポートの状態関数を取得する
int gpio_get_value(unsigned int gpio) 

機能:IOポートを取得する状態パラメータ:gpioが取得するIOポート番号戻り:IOポート状態(高または低)
6.IOポートの状態関数を設定する
void gpio_set_value(unsigned int gpio, int value)  

機能:IOポートの状態パラメータを設定する:gpioが取得するIOポート番号、value:設定する値、0または1戻り:なし
7.IOが休眠可能かどうかを判断する(比較的少ない)
int gpio_cansleep(unsigned int gpio)

機能:IOがスリープパラメータが可能かどうかを判断する:gpioが取得するIOポート番号は:0ではなく、スリープ可能である;0、休眠不可8.Ioポート番号から対応する外部割込み番号関数に変換(よく用いられる)
int gpio_to_irq(unsigned int gpio)  

機能:Ioポート番号から対応する外部割り込み番号パラメータに変換:gpioが取得するIOポート番号戻り:成功:割り込み番号;失敗:-EINVAL
たとえば、上記の機能と一致します.
#define GPIO0_A7 7
ret = gpio_request(GPIO0_A7, "gpio0_a7");
if (!ret) {
     
	printk("request for gpio0_a7 failed:%d
"
, ret); return 0; } gpio_direction_output(GPIO0_A7,1);

GPIO番号が7の状態を表示する:
[root@eufy ~]$ cat /sys/kernel/debug/gpio 
GPIOs 0-31, platform/pinctrl, gpio0:
 gpio-2   (                    |reset               ) out hi    
 gpio-5   (                    |spk-ctl             ) out lo    
 gpio-7   (                    |gpio0_a7            ) out hi    

GPIOs 32-63, platform/pinctrl, gpio1:
 gpio-42  (                    |sysfs               ) out hi    

GPIOs 64-95, platform/pinctrl, gpio2:

GPIOs 96-127, platform/pinctrl, gpio3:

GPIOs 128-159, platform/pinctrl, gpio4:


三、GPIOの全ての情報を表示する
以上の説明から,ユーザ状態でもカーネル状態でもGPIOが設定されている状態でも具体的なGPIO番号が用いられているが,LinuxのCPU原理図がGPIO 0 A 3として提示される場合があるので,変換の過程がある.すべてのGPIO情報を表示
[root@eufy /oem]$ cat /sys/kernel/debug/pinctrl/pinctrl/pinmux-pins 
Pinmux settings per pin
Format: pin (name): mux_owner gpio_owner hog?
pin 0 (gpio0-0): wireless-wlan (GPIO UNCLAIMED) function wireless-wlan group wifi-wake-host
pin 1 (gpio0-1): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 2 (gpio0-2): (MUX UNCLAIMED) gpio0:2
pin 3 (gpio0-3): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 4 (gpio0-4): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 5 (gpio0-5): (MUX UNCLAIMED) gpio0:5
pin 6 (gpio0-6): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 7 (gpio0-7): (MUX UNCLAIMED) gpio0:7
pin 8 (gpio0-8): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 9 (gpio0-9): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 10 (gpio0-10): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 11 (gpio0-11): ff050000.i2c (GPIO UNCLAIMED) function i2c1 group i2c1-xfer
pin 12 (gpio0-12): ff050000.i2c (GPIO UNCLAIMED) function i2c1 group i2c1-xfer
pin 13 (gpio0-13): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 14 (gpio0-14): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 15 (gpio0-15): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 16 (gpio0-16): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 17 (gpio0-17): ff0d0000.serial (GPIO UNCLAIMED) function uart3-m1 group uart3m1-xfer
pin 18 (gpio0-18): ff0d0000.serial (GPIO UNCLAIMED) function uart3-m1 group uart3m1-xfer
pin 19 (gpio0-19): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 20 (gpio0-20): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 21 (gpio0-21): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 22 (gpio0-22): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 23 (gpio0-23): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 24 (gpio0-24): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 25 (gpio0-25): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 26 (gpio0-26): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 27 (gpio0-27): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 28 (gpio0-28): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 29 (gpio0-29): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 30 (gpio0-30): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 31 (gpio0-31): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 32 (gpio1-0): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 33 (gpio1-1): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 34 (gpio1-2): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 35 (gpio1-3): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 36 (gpio1-4): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 37 (gpio1-5): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 38 (gpio1-6): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 39 (gpio1-7): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 40 (gpio1-8): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 41 (gpio1-9): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 42 (gpio1-10): (MUX UNCLAIMED) gpio1:42
pin 43 (gpio1-11): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 44 (gpio1-12): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 45 (gpio1-13): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 46 (gpio1-14): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 47 (gpio1-15): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 48 (gpio1-16): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 49 (gpio1-17): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 50 (gpio1-18): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 51 (gpio1-19): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 52 (gpio1-20): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 53 (gpio1-21): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 54 (gpio1-22): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 55 (gpio1-23): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 56 (gpio1-24): ff0b0000.serial (GPIO UNCLAIMED) function uart1 group uart1-xfer
pin 57 (gpio1-25): ff0b0000.serial (GPIO UNCLAIMED) function uart1 group uart1-xfer
pin 58 (gpio1-26): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 59 (gpio1-27): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 60 (gpio1-28): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 61 (gpio1-29): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 62 (gpio1-30): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 63 (gpio1-31): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 64 (gpio2-0): ff0a0000.serial (GPIO UNCLAIMED) function uart0 group uart0-xfer
pin 65 (gpio2-1): ff0a0000.serial (GPIO UNCLAIMED) function uart0 group uart0-xfer
pin 66 (gpio2-2): ff060000.i2c (GPIO UNCLAIMED) function i2c2 group i2c2-xfer
pin 67 (gpio2-3): ff060000.i2c (GPIO UNCLAIMED) function i2c2 group i2c2-xfer
pin 68 (gpio2-4): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 69 (gpio2-5): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 70 (gpio2-6): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 71 (gpio2-7): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 72 (gpio2-8): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 73 (gpio2-9): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 74 (gpio2-10): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 75 (gpio2-11): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 76 (gpio2-12): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 77 (gpio2-13): (MUX UNCLAIMED) gpio2:77
pin 78 (gpio2-14): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 79 (gpio2-15): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 80 (gpio2-16): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 81 (gpio2-17): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 82 (gpio2-18): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 83 (gpio2-19): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 84 (gpio2-20): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 85 (gpio2-21): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 86 (gpio2-22): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 87 (gpio2-23): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 88 (gpio2-24): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 89 (gpio2-25): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 90 (gpio2-26): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 91 (gpio2-27): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 92 (gpio2-28): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 93 (gpio2-29): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 94 (gpio2-30): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 95 (gpio2-31): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 96 (gpio3-0): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 97 (gpio3-1): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 98 (gpio3-2): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 99 (gpio3-3): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 100 (gpio3-4): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 101 (gpio3-5): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 102 (gpio3-6): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 103 (gpio3-7): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 104 (gpio3-8): (MUX UNCLAIMED) gpio3:104
pin 105 (gpio3-9): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 106 (gpio3-10): ff130000.spi (GPIO UNCLAIMED) function spi1 group spi1-miso
pin 107 (gpio3-11): ff130000.spi (GPIO UNCLAIMED) function spi1 group spi1-clk
pin 108 (gpio3-12): ff130000.spi (GPIO UNCLAIMED) function spi1 group spi1-mosi
pin 109 (gpio3-13): ff130000.spi (GPIO UNCLAIMED) function spi1 group spi1-csn0
pin 110 (gpio3-14): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 111 (gpio3-15): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 112 (gpio3-16): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 113 (gpio3-17): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 114 (gpio3-18): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 115 (gpio3-19): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 116 (gpio3-20): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 117 (gpio3-21): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 118 (gpio3-22): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 119 (gpio3-23): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 120 (gpio3-24): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 121 (gpio3-25): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 122 (gpio3-26): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 123 (gpio3-27): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 124 (gpio3-28): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 125 (gpio3-29): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 126 (gpio3-30): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 127 (gpio3-31): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 128 (gpio4-0): ff4a0000.dwmmc (GPIO UNCLAIMED) function sdio group sdio-bus4
pin 129 (gpio4-1): ff4a0000.dwmmc (GPIO UNCLAIMED) function sdio group sdio-bus4
pin 130 (gpio4-2): ff4a0000.dwmmc (GPIO UNCLAIMED) function sdio group sdio-bus4
pin 131 (gpio4-3): ff4a0000.dwmmc (GPIO UNCLAIMED) function sdio group sdio-bus4
pin 132 (gpio4-4): ff4a0000.dwmmc (GPIO UNCLAIMED) function sdio group sdio-cmd
pin 133 (gpio4-5): ff4a0000.dwmmc (GPIO UNCLAIMED) function sdio group sdio-clk
pin 134 (gpio4-6): ff0e0000.serial (GPIO UNCLAIMED) function uart4 group uart4-cts
pin 135 (gpio4-7): wireless-bluetooth gpio4:135 function uart4 group uart4-rts
pin 136 (gpio4-8): ff0e0000.serial (GPIO UNCLAIMED) function uart4 group uart4-xfer
pin 137 (gpio4-9): ff0e0000.serial (GPIO UNCLAIMED) function uart4 group uart4-xfer
pin 138 (gpio4-10): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 139 (gpio4-11): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 140 (gpio4-12): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 141 (gpio4-13): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 142 (gpio4-14): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 143 (gpio4-15): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 144 (gpio4-16): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 145 (gpio4-17): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 146 (gpio4-18): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 147 (gpio4-19): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 148 (gpio4-20): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 149 (gpio4-21): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 150 (gpio4-22): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 151 (gpio4-23): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 152 (gpio4-24): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 153 (gpio4-25): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 154 (gpio4-26): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 155 (gpio4-27): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 156 (gpio4-28): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 157 (gpio4-29): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 158 (gpio4-30): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 159 (gpio4-31): (MUX UNCLAIMED) (GPIO UNCLAIMED)


なお、上記pin 7(gpio 0-7):(MUX UNCLAIME)gpio 0:7が例のgpio 0_であるa 7脚(対応原理図上の)、番号は7です.換算関係は以下の通りである(rk 3308 bを例とする):
  gpion_xy   :
n=(0,1,2,3,4......)
x=(a,b,c,d)
y=(1,2,3,4,5,6......31)
pin=n*32+(x-1)*8+y

例:gpio 4_b 0 pin=4*32+(2-1)*8+0=104備考:x=(a,b,c,d...)<==>(1,2,3,4...)