2015년 2월 3일 화요일

에디슨 GPIO 핀 설정 가이드

Introduction


Intel Edison 플랫폼은 GPIO, PWM, SPI, I2C, ADC등의 다양한 인터페이스 모드로 사용될 수 있도록 설정할 수 있는 외부 input/output핀을 가지고 있다. 여기서는 핀에서 사용할 수 있는 기능, 핀 제어와 I/O를 위한 상세한 GPIO 핀 매핑, 외부 I/O핀 기능을 원하는 모드로 설정하기 위해 사용하는 리눅스 명령 툴에 대해 설명한다.

GPIO allocation and shield pin control


에디슨 보드에 있는 20개의 아두이노 호환 쉴드 I/O핀은 IO0~IO19로 번호가 붙어 있다. (아래 그림 1 참조) 모든 핀은 기본 GPIO 기능을 지원한다. 일부 핀들은 PWM, ADC, SPI, I2C 기능도 지원한다. 에디슨에서 핀의 다른 기능을 선택하는건 SoC 핀 제어 인터페이스와 멀티플렉싱 제어를 위해 할당된 GPIO 출력 신호를 통해 이루어진다. 다음 장은 에디슨 플랫폼에서 각각의 GPIO핀에 가능한 기능들에 대한 매핑을 상세히 설명하는데, 이것들은 크게 다음의 카테고리로 분류된다.


  • 외부 GPIO - 외부 쉴드 핀을 통해 디지털 신호 입출력에 사용
  • Pin multiplexing 제어 - 해당 쉴드 핀에서 가능한 다른 기능을 선택
  • Pin buffer (level-shifter) direction 제어 - 입출력을 위한 해당 쉴드 핀의 버퍼를 설정하는데 사용
  • Pin pull-up resistor 제어 - 쉴드핀의 풀업저항을 활성화/비활성화하는데 사용
  • 기타

쉴드핀에 대해 제공되는 어떤 기능이건 사용하려면, 해당 핀에 대한 multiplexing, buffer direction, pull-up resistor를 먼저 설정해야 한다.

그림1. 인텔 에디슨 아두이노 보드


Shield pin GPIO mapping


다음 표는 리눅스에서 GPIO와 PWM 핀 번호와 쉴드 I/O핀에 대한 매핑을 보여준다.

  • Shield pin - 아두이노 우노 핀 번호체계에서의 digital I/O 핀 번호
  • Linux - 리눅스에서 할당된 핀 번호
  • Muxed functions - 쉴드핀에 가능한 다른 기능

  • ShieldGPIOPWMMuxed functionsNotes
    PinLinux PinLinux Pin
    IO0130 UART1_RXD 
    IO1131 UART1_TXD 
    IO2128 UART1_CTS* 
    IO3120PWM0Depends on PWM Swizzler**
    IO4129 UART1_RTS* 
    IO5131PWM1Depends on PWM Swizzler**
    IO61822PWM2Depends on PWM Swizzler**
    IO748 - 
    IO849 - 
    IO91833PWM3Depends on PWM Swizzler**
    IO1041SwizSPI_2_SS1 
    I2S_2_FS* 
    PWM4_OUTDepends on PWM Swizzler**
    IO1143SwizSPI_2_TXD 
    I2S_2_TXD* 
    PWM5_OUTDepends on PWM Swizzler**
    IO1242 SPI_2_RXD 
    I2S_2_RXD*
    IO1340 SPI_2_CLK 
    I2S_2_CLK*
    IO1444 AIN0 
    IO1545 AIN1 
    IO1646 AIN2 
    IO1747 AIN3 
    IO1814 AIN4 
    I2C_6_SDA
    IO19165 AIN5 
표1. 쉴드 핀 GPIO 매핑

* 일부 SoC핀에는 I2C나 UART flow control같은 추가 기능을 가지고 있지만, 현재 아두이노 라이브러리에서는 지원할 계획이 없음. 하지만 Linux에서는 이 기능들을 사용할수도 있다.
** SoC는 4개의 PWM핀만을 제공한다. 베이스 보드에 "PWM swizzler"라고 라벨이 붙어있는 점퍼핀들은 이 4핀이 아두이노에서 일반적으로 PWM으로 사용되는 6개의 쉴드 헤더핀중에 어디에 연결될지를 결정하는데 사용된다. 초기 설정은 IO3, IO5, IO6, IO9가 SoC의 4개의 PWM핀에 연결되도록 셋팅되어 있다. 이 설정은 점퍼핀을 바꿔 IO10이나 IO11에 연결되게 할 수 있다.

Summary Pin Function Multiplexing Control


아두이노 헤더에 있는 모든 GPIO핀은 핀을 사용할수 있게 되기 전에 내부 GPIO를 설정해 줄 필요가 있다. 일반적으로는 output enable, pull-up enable과 모드 설정 정도가 된다. 하지만 일부 핀은 SPI, PWM, I2C같은 추가 기능들을 가지고 있기 때문에, 이런 핀들을 사용하려면 추가적으로 multiplexing에 대한 설정이 필요하다.

아래 표는 이런 설정을 최대한 간단하게 정리하여 프로그래머가 아두이노 헤더핀에 영향을 미치는 모든 muxing 핀들을 쉽게 알수 있도록 한 것이다.

이 표는 아래에 있는 회로도 핀 번호등의 추가 정보를 가지고 있는 더 상세한 표와 동일한 내용이다. 대부분의 경우는 이 표면 충분할 것이다.

 Linux GPIO PinGPIO Pin MuxSoC Pin ModesOutput Enable * (high = output)Pull-up Enable**
  Linux Pin0 (low)1 (high)01LinuxLinux
IO0130   GPIOUART248216
IO1131   GPIOUART249217
IO2128   GPIOUART250218
IO312   GPIOPWM251219
IO4129   GPIOUART252220
IO513   GPIOPWM253221
IO6182   GPIOPWM254222
IO748   GPIO 255223
IO849   GPIO 256224
IO9183   GPIOPWM257225
IO1041263PWMsee 240GPIOI2S or SPI258226
240GPIO or I2SGPIO or SPI_FS
IO1143262PWMsee 241GPIOI2S or SPI259227
241GPIO or I2SGPIO or SPI TXD
IO1242242GPIO or I2SGPIO or SPI RXDGPIOI2S or SPI260228
IO1340243GPIO or I2SGPIO or SPI CLKGPIOI2S or SPI261229
IO14  (A0)44200GPIOA0GPIO 232208
IO15  (A1)45201GPIOA1GPIO 233209
IO16  (A2)46202GPIOA2GPIO 234210
IO17  (A3)47203GPIOA3GPIO 235211
IO18  (A4)14204GPIO or I2C SDAA4GPIOI2C-6236212
IO19  (A5)165205GPIO or I2C SCLA5GPIOI2C-6237213


주: Muxing을 설정하기 전에 pin 214(TRI_STATE_ALL)을 LOW로 설정하는걸 권장한다. 이 핀을 LOW로 한 후 설정을 변경하고 나서 pin 214를 다시 HIGH로 하면 된다.

예1) IO0을 출력으로 설정
  Pin 0는 muxing이 없으므로 단순히 output을 활성화 시키고 pull-up을 enable하면 됨
예2) IO10을 SPI로 설정
  non-PWM 기능을 활성화 시키기 위해 263를 HIGH로 설정할 필요가 있다. non-PWM기능이 활성화 되면 240에 의해 제어되게 된다. 그 후 240을 HIGH로 해 SoC 핀 모드를 1로 설정해 SPI 기능을 선택한다.
이 문서 마지막에 여러가지 세부 설정에 대한 예제들을 볼 수 있다.

GPIO Interrupt support


에디슨의 모든 GPIO 입력은 인터럽트를 사용할 수 있고, 모든 타입의 인터럽트를 지원한다. 다음 표는 각 핀에서 지원하는 에지트리거, 레벨트리거 인터럽트 타입을 보여준다.


ShieldPinGPIOEdge-TriggeredLevel-Triggered*
SourcePinLinuxRisingFallingBothLowHigh
IO0SoCGP130_UART1_RXD130YYYYY
IO1SoCGP131_UART1_TXD131YYYYY
IO2IO3SoCGP128_UART1_CTS128YYYYY
SoCGP12_PWM012YYYYY
IO4IO5SoCGP129129YYYYY
SoCGP13_PWM113YYYYY
IO6SoCGP182_PWM2182YYYYY
IO7SoCGP4848YYYYY
IO8SoCGP4949YYYYY
IO9SoCGP183_PWM3183YYYYY
IO10SoCGP4141YYYYY
IO11SoCGP4343YYYYY
IO12SoCGP4242YYYYY
IO13SoCGP4040YYYYY
IO14SoCGP4444YYYYY
IO15SoCGP4545YYYYY
IO16SoCGP4646YYYYY
IO17SoCGP4747YYYYY
IO18SoCGP1414YYYYY
IO19SoCGP165165YYYYY

표2. GPIO Interupt Support

* 아두이노 라이브러리에서는 레벨트리거 인터럽트를 지원하지 않는다.

Detailed Pin Function Multiplexing Control


다음 표는 pin multiplexing 제어를 위해 할당된 GPIO 출력 목록이다. 이 GPIO 출력을 0/1 (LOW/HIGH)로 설정하는 것으로 특정 쉴드 I/O핀이 다른 기능을 사용하도록 선택해 줄 수 있다. 또한 SoC의 일부 GPIO핀은 내부 mux 옵션을 가지고 있기도 하다. 이런 것들은 "SoC Pin Modes"에 표시되어 있다. 현재 이들은 해당 SoC GPIO 핀 번호 N에 대한 핀 모드를 지정(/sys/kernel/debug/gpio_debug/gpioN/current_pinmux에 원하는 모드 "0/1/2/..."를 써 줌)하는것으로 설정할 수 있다.

ShieldPinGPIO Pin MuxSoC Pin Modes
PinLinux0 (low)1 (high)Power-on defaultPinLinux012
IO0-    GP130130GPIOUART 
IO1-    GP131131GPIOUART 
IO2-    GP128128GPIOUART 
IO3-    GP1212GPIOPWM 
IO4-    GP129129GPIOUART 
IO5-    GP1313GPIOPWM 
IO6-    GP182182GPIOPWM 
IO7-    GP4848GPIO  
IO8-    GP4949GPIO  
IO9-    GP183183GPIOPWM 
IO10U34_ IO1.7263PWM4_OUTGP41 SSP5_FS_1Pulled-down inputGP41 GP11141 111GPIO GPIOI2SSPI 
U16_ IO1.0240GP41SSP5_FS_1Pulled-up input* 
IO11U34_ IO1.6262PWM5_OUTGP43 SSP5_TXDPulled-down inputGP43 GP11543 115GPIO GPIOI2SSPI 
U16_ IO1.1241GP43SSP5_TXDPulled-up input* 
IO12U16_ IO1.2242GP42SSP5_RXDPulled-up input*GP42 GP11442 114GPIO GPIOI2SSPI 
IO13U16_ IO1.3243GP40SSP5_CLKPulled-up input*GP40 GP10940 109GPIO GPIOI2SSPI 
IO14U17_ IO0.0200GP44A0Pulled-up input*GP4444GPIO  
IO15U17_ IO0.1201GP45A1Pulled-up input*GP4545GPIO  
IO16U17_ IO0.2202GP46A2Pulled-up input*GP4646GPIO  
IO17U17_ IO0.3203GP47A3Pulled-up input*GP4747GPIO  
IO18U17_ IO0.4204GP14 I2C6_SDAA4Pulled-up input*GP14 GP2714 27GPIOGPIOI2C-6I2C-8
IO19U17_ IO0.5205GP165 I2C6_SCLA5Pulled-up input*GP165 GP28165 28GPIO GPIOI2C-6I2C-8

표3. Pin Function Multiplexing Control
* 이 핀들은 전원이 켜지면 디폴트로 pull-up 입력 상태임. 그러므로 실제적으로 Mux 스위치를 활성화 시킴(즉 Mux function 1이 선택됨)

Pin direction and pull-up control


에디슨의 대부분의 쉴드핀들에는 buffer/level-shifter가 있어 입력 또는 출력 방향으로 설정되어야 하고, 외부 47K 풀업/풀다운 저항을 활설화 시킬 수 있다. 둘 다 아래 표에 나와 있는 전용 GPIO 출력에 의해 구동된다. 쉴드핀을 출력으로 설정할 때, SoC GPIO핀의 direction을 출력으로 설정하기 전에 버퍼를 출력으로 설정하는걸 권장한다. 외부 풀업/풀다운 저항에 연결을 끊으려면 그 핀을 구동하고 있는 GPIO를 high-Z 입력으로 설정할 필요가 있다. 또한 PCAL9555A GPIO expander에서의 GPIO신호들은 내부 100K 풀업저항을 가지고 있고 디폴트로 GPIO핀에 연결되어 있다. 많은 경우 이 핀들을 high-Z 입력으로 설정해 이것들을 비활성화 시킬 필요가 있다.

Shield pinOutput Enable GPIO (high = output)Pull-up Enable GPIO
PinLinuxPower-on defaultPinLinuxPower-on default
IO0U34_ IO0.0248Pulled-down*U39_IO0.0216Pulled-up input**
IO1U34_ IO0.1249Pulled-down*U39_IO0.0217Pulled-up input**
IO2U34_ IO0.2250Pulled-down*U39_IO0.0218Pulled-up input**
IO3U34_ IO0.3251Pulled-down*U39_IO0.0219Pulled-up input**
IO4U34_ IO0.4252Pulled-down*U39_IO0.0220Pulled-up input**
IO5U34_ IO0.5253Pulled-down*U39_IO0.0221Pulled-up input**
IO6U34_ IO0.6254Pulled-down*U39_IO0.0222Pulled-up input**
IO7U34_ IO0.7255Pulled-down*U39_IO0.7223Pulled-up input**
IO8U34_ IO1.0256Pulled-down*U39_IO0.7224Pulled-up input**
IO9U34_ IO1.1257Pulled-down*U39_IO0.7225Pulled-up input**
IO10U34_ IO1.2258Pulled-down*U39_IO0.7226Pulled-up input**
IO11U34_ IO1.3259Pulled-down*U39_IO0.7227Pulled-up input**
IO12U34_ IO1.4260Pulled-down*U39_IO0.7228Pulled-up input**
IO13U34_ IO1.5261Pulled-down*U39_IO0.7229Pulled-up input**
IO14U16_ IO0.0232Pulled-down*U17_ IO1.0208Pulled-up input**
IO15U16_ IO0.1233Pulled-down*U17_ IO1.1209Pulled-up input**
IO16U16_ IO0.2234Pulled-down*U17_ IO1.2210Pulled-up input**
IO17U16_ IO0.3235Pulled-down*U17_ IO1.3211Pulled-up input**
IO18U16_ IO0.4236Pulled-down*U17_ IO1.4212Pulled-up input**
IO19U16_ IO0.5237Pulled-down*U17_ IO1.5213Pulled-up input**

표4. Pin direction and pull-up control
* 이 핀들은 전원이 켜질 때 디폴트로 외부 풀다운 입력임. 그러므로 level shifter는 실질적으로 input direction이 선택되어 있음
** 이 핀들은 전원이 켜질 때 디폴트로 내부 풀업 입력임. 그러므로 실질적으로 풀업(100K+47K 저항이 직렬로)이 활성화 되어 있음

Miscellaneous GPIOs


다음의 GPIO는 다른 플랫폼 기능과 아두이노 쉴드 호환성을 위해 사용된다.
FunctionGPIODirectionPower-on defaultInitial setup
PinLinux
TRI_STATE_ALLU17_IO1.6214OutputPulled-down 
SHLD_RESETU17_IO1.7215OutputPulled-up input* 
SHLD_RESETU17_IO0.7207InputPulled-up input* 






표5. 기타 GPIO
* 이 핀들은 전원이 켜질 때 디폴트로 풀업 입력 상태임. 이 상태는 출력이 high로 설정된 경우와 동일한 효과를 가짐


Shield pin configuration guide




  1. 사용하고자 하는 아두이노 쉴드의 핀 번호(IO0~IO19)를 확인한다. 
  2. 해당 핀에서 사용할 수 있는 기능들을 확인하고, 그 중 사용하길 원하는 기능을 선택한다.
  3. 원하는 기능을 위한 pin muxing 옵션을 선택하기 위해 어떤 GPIO 신호가 설정이 필요한지 결정한다. 일부 핀은 한가지 기능만 가지고 있거나, mux control이 필요없는 경우도 있다.
  4. 핀의 buffer direction을 입력 또는 출력으로 선택하기 위해 어떤 GPIO 신호를 설정할 필요가 있는지 결정한다. 또한 필요한 direction을 결정한다.
  5. 풀업 저항 control을 선택하기 위해 어떤 GPIO 신호를 설정할 필요가 있는지, 풀업저항을 활성화 또는 비활성화 시킬지를 결정한다. 일반적으로 대부분의 핀 기능에 대해 풀업저항은 비활성화 되어야 한다. GPIO 입력 기능에서는 풀업저항이 사용자의 필요에 따라 활성화 또는 비활성화 될 수 있다. 
  6. Linux user-space 환경(즉 명령어 쉘)에서 억세스하기 위해 위의 GPIO 번호를 export한다.
  7. 위의 GPIO 번호를 출력으로 설정한다.
  8. TRI_STATE_ALL 신호를 LOW로 해서 쉴드 핀의 연결을 끊어준다.
  9. 출력 로직 레벨을 HIGH 또는 LOW로 해주기 위해 위의 GPIO를 설정한다.
  10.  SoC GPIO 핀 모드를 원하는 기능으로 설정한다.
  11. TRI_STATE_ALL 신호를 다시 HIGH로 바꿔서 쉴드 핀을 연결시켜 준다.


예제1: IO5를 풀업저항이 비활성화 된 GPIO input으로 설정


  1. 쉴드 번호는 IO5이다. 표1에 의하면 GPIO 번호는 13이 된다.
  2. 필요한 기능은 GPIO이다. 표1에 의하면 이 쉴드핀에서 사용할 수 있는 다른 기능들은 PWM이 있다.
  3. 표3에 의하면 GPIO를 선택하기 위해서는 GPIO43 pin mux가 mode0로 설정되어야만 한다. 표4에 의하면 IO5의 output direction을 비활성화 시키기 위해 GPIO253은 0으로 설정되어야만 한다.
  4. 표4에 의하면 IO5의 외부 풀업저항을 비활성화 시키기 위해 GPIO221은 high-Z input으로 설정되어야만 한다. 
  5. 표5에 의하면 TRI_STATE_ALL 신호는 GPIO214에 의해 제어된다. 

그러므로 리눅스에서의 명령은 다음과 같다.

# echo 13 > /sys/class/gpio/export 
# echo 253 > /sys/class/gpio/export 
# echo 221 > /sys/class/gpio/export 
# echo 214 > /sys/class/gpio/export 
# echo low > /sys/class/gpio/gpio214/direction 
# echo low > /sys/class/gpio/gpio253/direction 
# echo in > /sys/class/gpio/gpio221/direction 
# echo mode0 > /sys/kernel/debug/gpio_debug/gpio13/current_pinmux 
# echo in > /sys/class/gpio/gpio13/direction 
# echo high > /sys/class/gpio/gpio214/direction

설정이 끝나면 이제 IO5를 GPIO input으로 사용하면 된다.

# cat /sys/class/gpio/gpio13/value  

예제2:  IO11을 풀업저항이 비활성화 된 GPIO input으로 설정

  1. 쉴드의 핀 번호는 IO11이다. 표1에 의하면 GPIO 번호는 43이다.
  2. 필요한 기능은 GPIO이다. 표1에 의하면 이 쉴드핀에서 사용할 수 있는 다른 기능들은 PWM, SPI, I2S가 있다.
  3. 표3에 의하면 GPIO/SPI를 선택하기 위해서는 GPIO262가 1로 설정되어야만 한다. GPIO를 선택하려면 GPIO241은 0으로 설정되어야만 하고 GPIO43 pin mux는 'mode0'로 설정되어야만 한다.
  4. 표4에 의하면 IO11의 output direction을 비활성화 시키기 위해 GPIO259가 0으로 설정되어야만 한다. 
  5. 표4에 의하면 IO11의 외부 풀업저항을 비활성화 시키기 위해 GPIO227은 high-Z input으로 설정되어야만 한다. 
  6. 표5에 의하면 TRI_STATE_ALL 신호는 GPIO214에 의해 제어된다. 
그러므로 리눅스에서의 명령은 다음과 같다. 

# echo 43 > /sys/class/gpio/export 
# echo 262 > /sys/class/gpio/export 
# echo 241 > /sys/class/gpio/export 
# echo 259 > /sys/class/gpio/export 
# echo 227 > /sys/class/gpio/export 
# echo 214 > /sys/class/gpio/export 
# echo low > /sys/class/gpio/gpio214/direction 
# echo high > /sys/class/gpio/gpio262/direction 
# echo low > /sys/class/gpio/gpio241/direction 
# echo mode0 > /sys/kernel/debug/gpio_debug/gpio43/current_pinmux 
# echo low > /sys/class/gpio/gpio259/direction 
# echo in > /sys/class/gpio/gpio227/direction 
# echo in > /sys/class/gpio/gpio43/direction 
# echo high > /sys/class/gpio/gpio214/direction

설정이 끝나면 이제 IO11을 GPIO input으로 사용하면 된다.

# cat /sys/class/gpio/gpio43/value    

예제3: IO7을 풀업저항이 활성화 된 GPIO input으로 설정

  1. 쉴드의 핀 번호는 IO7이다. 표1에 의하면 GPIO 번호는 48이다.
  2. 필요한 기능은 GPIO이다. 표1에 의하면 이 쉴드핀에는 다른 기능은 없다.
  3. 표3에 의하면 IO7은 필요한 mux option이 없다.
  4. 표4에 의하면 IO7의 output direction을 비활성화 시키기 위해 GPIO255가 0으로 설정되어야만 한다. 
  5. 표4에 의하면 IO7의 외부 풀업저항을 활성화 시키기 위해 GPIO223은 HIGH로 설정되어야만 한다. 
  6. 표5에 의하면 TRI_STATE_ALL 신호는 GPIO214에 의해 제어된다. 
# echo 48 > /sys/class/gpio/export 
# echo 255 > /sys/class/gpio/export 
# echo 223 > /sys/class/gpio/export 
# echo 214 > /sys/class/gpio/export 
# echo low > /sys/class/gpio/gpio214/direction 
# echo low > /sys/class/gpio/gpio255/direction 
# echo high > /sys/class/gpio/gpio223/direction 
# echo in > /sys/class/gpio/gpio48/direction 
# echo high > /sys/class/gpio/gpio214/direction

설정이 끝나면 이제 IO7을 GPIO input으로 사용하면 된다.

# cat /sys/class/gpio/gpio48/value    

예제4: IO6을 PWM 출력으로 설정


  1. 쉴드의 핀 번호는 IO6이다. 표1에 의하면 GPIO 번호는 182이다.
  2. 필요한 기능은 PWM이다. 표1에 의하면 이 쉴드핀에서 사용할 수 있는 다른 기능들은 GPIO가 있다.
  3. 표3에 의하면 PWM을 선택하기 위해서는 GPIO182가 'mode1'로 설정되어야만 한다.
  4. 표4에 의하면 IO6의 output direction을 활성화 시키기 위해 GPIO254가 1로 설정되어야만 한다. 
  5. 표4에 의하면 IO6의 외부 풀업저항을 비활성화 시키기 위해 GPIO222는 high-Z 입력으로 설정되어야만 한다. 
  6. 표5에 의하면 TRI_STATE_ALL 신호는 GPIO214에 의해 제어된다. 
# echo 254 > /sys/class/gpio/export 
# echo 222 > /sys/class/gpio/export 
# echo 214 > /sys/class/gpio/export 
# echo low > /sys/class/gpio/gpio214/direction 
# echo high > /sys/class/gpio/gpio254/direction 
# echo in > /sys/class/gpio/gpio222/direction 
# echo mode1 > /sys/kernel/debug/gpio_debug/gpio182/current_pinmux 
# echo high > /sys/class/gpio/gpio214/direction

이제 IO6를 PWM 출력으로 사용할 수 있다.

# echo 2 > /sys/class/pwm/pwmchip0/export 
# echo 2000000 > /sys/class/pwm/pwmchip0/pwm2/duty_cycle 
# echo 1 > /sys/class/pwm/pwmchip0/pwm2/enable  


예제5: IO14를 ADC 입력으로 설정


ADC 사용시 주의사항: ADC는 SPI버스에 연결되어 있기 때문에 (콜드부팅 후) ADC가 사용되기 전에 SPI핀이 먼저 설정되어야만 한다. Pin 10~13을 입력으로 설정하는것 만으로도 IO14~19를 ADC로 사용할 수 있다.


  1. 쉴드의 핀 번호는 IO14이다. 표1에 의하면 GPIO 번호는 44이다.
  2. 필요한 기능은 ADC이다. 표1에 의하면 이 쉴드핀에서 사용할 수 있는 다른 기능들은 GPIO가 있다.
  3. 표3에 의하면 ADC를 선택하기 위해서는 GPIO200가 1로 설정되어야만 한다.
  4. 표4에 의하면 IO14의 output direction을 비활성화 시키기 위해 GPIO232가 0으로 설정되어야만 한다. 
  5. IO14에 직접 연결된 모든 GPIO 라인은 current leakage를 방지하기 위해 high-Z 입력으로 설정되어야 한다. 표4에 의하면 GPIO208이 IO14의 풀업저항을 활성화 시키는데 사용된다.
  6. 표5에 의하면 TRI_STATE_ALL 신호는 GPIO214에 의해 제어된다. 

# echo 200 > /sys/class/gpio/export 
# echo 232 > /sys/class/gpio/export 
# echo 208 > /sys/class/gpio/export 
# echo 214 > /sys/class/gpio/export 
# echo low > /sys/class/gpio/gpio214/direction 
# echo high > /sys/class/gpio/gpio200/direction 
# echo low > /sys/class/gpio/gpio232/direction 
# echo in > /sys/class/gpio/gpio208/direction 
# echo high > /sys/class/gpio/gpio214/direction



설정이 끝나면 이제 IO14를 ADC input으로 사용하면 된다.

# cat /sys/bus/iio/devices/iio:device1/in_voltage0_raw  


예제6: IO18/IO19를 I2C로 설정


  1. 쉴드의 핀 번호는 IO18과 IO19이다. 각각의 GPIO 번호는 28과 27이 된다.
  2. 필요한 기능은 I2C이다. 표1에 의하면 이 쉴드핀들에서 사용할 수 있는 다른 기능들은 GPIO, ADC가 있다.
  3. 표3에 의하면 GPIO/I2C를 선택하기 위해 GPIO204는 0으로 설정되어야만 하고, IO18에 I2C를 선택하기 위해서는 GPIO28 pin mux가 'mode1'으로 설정되어야만 한다.
  4. 표3에 의하면 GPIO/I2C를 선택하기 위해 GPIO205는 0으로 설정되어야만 하고, IO19에 I2C를 선택하기 위해서는 GPIO27 pin mux가 'mode1'으로 설정되어야만 한다.
  5. GPIO14와 GPIO165도 I2C에 연결되어 있기 때문에 GPIO18/19에서 I2C를 사용하는 경우 이 핀들은 high-Z 입력으로 설정해 이 핀들이 I2C 버스의 신호를 드라이브하는걸 방지해야만 한다.
  6. 표4에 의하면 GPIO14의 output direction을 비활성화 시키기 위해 GPIO236은 0으로 설정되어야만 한다. 그리고 GPIO165의 output direction을 비활성화 시키기 위해 GPIO237은 0으로 설정되어야만 한다.
  7. 표4에 의하면 GPIO212와 213은 각각 IO18과 IO19의 풀업저항을 비활성화 시키기 위해 high-Z 입력으로 설정되어야만 한다.
  8. 표5에 의하면 TRI_STATE_ALL 신호는 GPIO214에 의해 제어된다. 

# echo 28 > /sys/class/gpio/export 
# echo 27 > /sys/class/gpio/export 
# echo 204 > /sys/class/gpio/export 
# echo 205 > /sys/class/gpio/export 
# echo 236 > /sys/class/gpio/export 
# echo 237 > /sys/class/gpio/export 
# echo 14 > /sys/class/gpio/export 
# echo 165 > /sys/class/gpio/export 
# echo 212 > /sys/class/gpio/export 
# echo 213 > /sys/class/gpio/export 
# echo 214 > /sys/class/gpio/export 
# echo low > /sys/class/gpio/gpio214/direction 
# echo low > /sys/class/gpio/gpio204/direction 
# echo low > /sys/class/gpio/gpio205/direction 
# echo in > /sys/class/gpio/gpio14/direction 
# echo in > /sys/class/gpio/gpio165/direction 
# echo low > /sys/class/gpio/gpio236/direction 
# echo low > /sys/class/gpio/gpio237/direction 
# echo in > /sys/class/gpio/gpio212/direction 
# echo in > /sys/class/gpio/gpio213/direction 
# echo mode1 > /sys/kernel/debug/gpio_debug/gpio28/current_pinmux 
# echo mode1 > /sys/kernel/debug/gpio_debug/gpio27/current_pinmux 
# echo high > /sys/class/gpio/gpio214/direction

이제 IO18과 IO19를 사용해 I2C 통신을 할 수 있다.


예제7: IO10~IO13을 SPI로 설정



  1. 쉴드의 핀 번호는 IO10~IO13이다. 각각의 GPIO 번호는 111, 115, 114, 109가 된다.
  2. 필요한 기능은 SPI이다. 표1에 의하면 이 쉴드핀들에서 사용할 수 있는 다른 기능들은 GPIO, PWM이 있다.
  3. 표3에 의하면 GPIO/SPI를 선택하기 위해 GPIO263은 1로 설정되어야만 하고, SPI를 선택하기 위해 GPIO240은 1로, IO10에 SPI를 선택하기 위해서는 GPIO111 pin mux가 'mode1'으로 설정되어야만 한다.
  4. 표3에 의하면 GPIO/SPI를 선택하기 위해 GPIO262는 1로 설정되어야만 하고, SPI를 선택하기 위해 GPIO241은 1로, IO11에 SPI를 선택하기 위해서는 GPIO115 pin mux가 'mode1'으로 설정되어야만 한다.
  5. 표3에 의하면 SPI를 선택하기 위해 GPIO242는 1로, IO12에 SPI를 선택하기 위해서는 GPIO114 pin mux가 'mode1'으로 설정되어야만 한다.
  6. 표3에 의하면 SPI를 선택하기 위해 GPIO243은 1로, IO13에 SPI를 선택하기 위해서는 GPIO109 pin mux가 'mode1'으로 설정되어야만 한다.
  7. 표4에 의하면 IO10의 output direction을 활성화 히기 위해 GPIO258은 1로, IO11의 output direction을 활성화 히기 위해 GPIO259는 1로, IO12의 output direction을 비활성화 히기 위해 GPIO260은 0으로, IO13의 output direction을 활성화 히기 위해 GPIO261은 1로 설정되어야만 한다.
  8. 표4에 의하면 GPIO226~229는 IO10~IO13의 풀업저항을 비활성화 시키기 위해 high-Z 입력으로 설정되어야만 한다.
  9. 표5에 의하면 TRI_STATE_ALL 신호는 GPIO214에 의해 제어된다. 

# echo 111 > /sys/class/gpio/expor
# echo 115 > /sys/class/gpio/export 
# echo 114 > /sys/class/gpio/export 
# echo 109 > /sys/class/gpio/export 
# echo 263 > /sys/class/gpio/export 
# echo 240 > /sys/class/gpio/export 
# echo 262 > /sys/class/gpio/export 
# echo 241 > /sys/class/gpio/export 
# echo 242 > /sys/class/gpio/export 
# echo 243 > /sys/class/gpio/export 
# echo 258 > /sys/class/gpio/export 
# echo 259 > /sys/class/gpio/export 
# echo 260 > /sys/class/gpio/export 
# echo 261 > /sys/class/gpio/export 
# echo 226 > /sys/class/gpio/export 
# echo 227 > /sys/class/gpio/export 
# echo 228 > /sys/class/gpio/export 
# echo 229 > /sys/class/gpio/export 
# echo 214 > /sys/class/gpio/export 
# echo low > /sys/class/gpio/gpio214/direction 
# echo high > /sys/class/gpio/gpio263/direction 
# echo high > /sys/class/gpio/gpio240/direction 
# echo high > /sys/class/gpio/gpio262/direction 
# echo high > /sys/class/gpio/gpio241/direction 
# echo high > /sys/class/gpio/gpio242/direction 
# echo high > /sys/class/gpio/gpio243/direction 
# echo high > /sys/class/gpio/gpio258/direction 
# echo high > /sys/class/gpio/gpio259/direction 
# echo low > /sys/class/gpio/gpio260/direction 
# echo high > /sys/class/gpio/gpio261/direction 
# echo in > /sys/class/gpio/gpio226/direction 
# echo in > /sys/class/gpio/gpio227/direction 
# echo in > /sys/class/gpio/gpio228/direction 
# echo in > /sys/class/gpio/gpio229/direction 
# echo mode1 > /sys/kernel/debug/gpio_debug/gpio111/current_pinmux 
# echo mode1 > /sys/kernel/debug/gpio_debug/gpio115/current_pinmux 
# echo mode1 > /sys/kernel/debug/gpio_debug/gpio114/current_pinmux 
# echo mode1 > /sys/kernel/debug/gpio_debug/gpio109/current_pinmux 
# echo high > /sys/class/gpio/gpio214/direction


원문은 http://www.emutexlabs.com/project/215-intel-edison-gpio-pin-multiplexing-guide 에서 볼 수 있음.



















댓글 없음:

댓글 쓰기