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 - 쉴드핀에 가능한 다른 기능
Shield GPIO PWM Muxed functions Notes Pin Linux Pin Linux Pin IO0 130 UART1_RXD IO1 131 UART1_TXD IO2 128 UART1_CTS* IO3 12 0 PWM0 Depends on PWM Swizzler** IO4 129 UART1_RTS* IO5 13 1 PWM1 Depends on PWM Swizzler** IO6 182 2 PWM2 Depends on PWM Swizzler** IO7 48 - IO8 49 - IO9 183 3 PWM3 Depends on PWM Swizzler** IO10 41 Swiz SPI_2_SS1 I2S_2_FS* PWM4_OUT Depends on PWM Swizzler** IO11 43 Swiz SPI_2_TXD I2S_2_TXD* PWM5_OUT Depends on PWM Swizzler** IO12 42 SPI_2_RXD I2S_2_RXD* IO13 40 SPI_2_CLK I2S_2_CLK* IO14 44 AIN0 IO15 45 AIN1 IO16 46 AIN2 IO17 47 AIN3 IO18 14 AIN4 I2C_6_SDA IO19 165 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 Pin | GPIO Pin Mux | SoC Pin Modes | Output Enable * (high = output) | Pull-up Enable** | ||||
Linux Pin | 0 (low) | 1 (high) | 0 | 1 | Linux | Linux | ||
IO0 | 130 | GPIO | UART | 248 | 216 | |||
IO1 | 131 | GPIO | UART | 249 | 217 | |||
IO2 | 128 | GPIO | UART | 250 | 218 | |||
IO3 | 12 | GPIO | PWM | 251 | 219 | |||
IO4 | 129 | GPIO | UART | 252 | 220 | |||
IO5 | 13 | GPIO | PWM | 253 | 221 | |||
IO6 | 182 | GPIO | PWM | 254 | 222 | |||
IO7 | 48 | GPIO | 255 | 223 | ||||
IO8 | 49 | GPIO | 256 | 224 | ||||
IO9 | 183 | GPIO | PWM | 257 | 225 | |||
IO10 | 41 | 263 | PWM | see 240 | GPIO | I2S or SPI | 258 | 226 |
240 | GPIO or I2S | GPIO or SPI_FS | ||||||
IO11 | 43 | 262 | PWM | see 241 | GPIO | I2S or SPI | 259 | 227 |
241 | GPIO or I2S | GPIO or SPI TXD | ||||||
IO12 | 42 | 242 | GPIO or I2S | GPIO or SPI RXD | GPIO | I2S or SPI | 260 | 228 |
IO13 | 40 | 243 | GPIO or I2S | GPIO or SPI CLK | GPIO | I2S or SPI | 261 | 229 |
IO14 (A0) | 44 | 200 | GPIO | A0 | GPIO | 232 | 208 | |
IO15 (A1) | 45 | 201 | GPIO | A1 | GPIO | 233 | 209 | |
IO16 (A2) | 46 | 202 | GPIO | A2 | GPIO | 234 | 210 | |
IO17 (A3) | 47 | 203 | GPIO | A3 | GPIO | 235 | 211 | |
IO18 (A4) | 14 | 204 | GPIO or I2C SDA | A4 | GPIO | I2C-6 | 236 | 212 |
IO19 (A5) | 165 | 205 | GPIO or I2C SCL | A5 | GPIO | I2C-6 | 237 | 213 |
주: 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 입력은 인터럽트를 사용할 수 있고, 모든 타입의 인터럽트를 지원한다. 다음 표는 각 핀에서 지원하는 에지트리거, 레벨트리거 인터럽트 타입을 보여준다.
ShieldPin | GPIO | Edge-Triggered | Level-Triggered* | |||||
Source | Pin | Linux | Rising | Falling | Both | Low | High | |
IO0 | SoC | GP130_UART1_RXD | 130 | Y | Y | Y | Y | Y |
IO1 | SoC | GP131_UART1_TXD | 131 | Y | Y | Y | Y | Y |
IO2IO3 | SoC | GP128_UART1_CTS | 128 | Y | Y | Y | Y | Y |
SoC | GP12_PWM0 | 12 | Y | Y | Y | Y | Y | |
IO4IO5 | SoC | GP129 | 129 | Y | Y | Y | Y | Y |
SoC | GP13_PWM1 | 13 | Y | Y | Y | Y | Y | |
IO6 | SoC | GP182_PWM2 | 182 | Y | Y | Y | Y | Y |
IO7 | SoC | GP48 | 48 | Y | Y | Y | Y | Y |
IO8 | SoC | GP49 | 49 | Y | Y | Y | Y | Y |
IO9 | SoC | GP183_PWM3 | 183 | Y | Y | Y | Y | Y |
IO10 | SoC | GP41 | 41 | Y | Y | Y | Y | Y |
IO11 | SoC | GP43 | 43 | Y | Y | Y | Y | Y |
IO12 | SoC | GP42 | 42 | Y | Y | Y | Y | Y |
IO13 | SoC | GP40 | 40 | Y | Y | Y | Y | Y |
IO14 | SoC | GP44 | 44 | Y | Y | Y | Y | Y |
IO15 | SoC | GP45 | 45 | Y | Y | Y | Y | Y |
IO16 | SoC | GP46 | 46 | Y | Y | Y | Y | Y |
IO17 | SoC | GP47 | 47 | Y | Y | Y | Y | Y |
IO18 | SoC | GP14 | 14 | Y | Y | Y | Y | Y |
IO19 | SoC | GP165 | 165 | Y | Y | Y | Y | Y |
표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/..."를 써 줌)하는것으로 설정할 수 있다.
ShieldPin | GPIO Pin Mux | SoC Pin Modes | ||||||||
Pin | Linux | 0 (low) | 1 (high) | Power-on default | Pin | Linux | 0 | 1 | 2 | |
IO0 | - | GP130 | 130 | GPIO | UART | |||||
IO1 | - | GP131 | 131 | GPIO | UART | |||||
IO2 | - | GP128 | 128 | GPIO | UART | |||||
IO3 | - | GP12 | 12 | GPIO | PWM | |||||
IO4 | - | GP129 | 129 | GPIO | UART | |||||
IO5 | - | GP13 | 13 | GPIO | PWM | |||||
IO6 | - | GP182 | 182 | GPIO | PWM | |||||
IO7 | - | GP48 | 48 | GPIO | ||||||
IO8 | - | GP49 | 49 | GPIO | ||||||
IO9 | - | GP183 | 183 | GPIO | PWM | |||||
IO10 | U34_ IO1.7 | 263 | PWM4_OUT | GP41 SSP5_FS_1 | Pulled-down input | GP41 GP111 | 41 111 | GPIO GPIO | I2SSPI | |
U16_ IO1.0 | 240 | GP41 | SSP5_FS_1 | Pulled-up input* | ||||||
IO11 | U34_ IO1.6 | 262 | PWM5_OUT | GP43 SSP5_TXD | Pulled-down input | GP43 GP115 | 43 115 | GPIO GPIO | I2SSPI | |
U16_ IO1.1 | 241 | GP43 | SSP5_TXD | Pulled-up input* | ||||||
IO12 | U16_ IO1.2 | 242 | GP42 | SSP5_RXD | Pulled-up input* | GP42 GP114 | 42 114 | GPIO GPIO | I2SSPI | |
IO13 | U16_ IO1.3 | 243 | GP40 | SSP5_CLK | Pulled-up input* | GP40 GP109 | 40 109 | GPIO GPIO | I2SSPI | |
IO14 | U17_ IO0.0 | 200 | GP44 | A0 | Pulled-up input* | GP44 | 44 | GPIO | ||
IO15 | U17_ IO0.1 | 201 | GP45 | A1 | Pulled-up input* | GP45 | 45 | GPIO | ||
IO16 | U17_ IO0.2 | 202 | GP46 | A2 | Pulled-up input* | GP46 | 46 | GPIO | ||
IO17 | U17_ IO0.3 | 203 | GP47 | A3 | Pulled-up input* | GP47 | 47 | GPIO | ||
IO18 | U17_ IO0.4 | 204 | GP14 I2C6_SDA | A4 | Pulled-up input* | GP14 GP27 | 14 27 | GPIOGPIO | I2C-6 | I2C-8 |
IO19 | U17_ IO0.5 | 205 | GP165 I2C6_SCL | A5 | Pulled-up input* | GP165 GP28 | 165 28 | GPIO GPIO | I2C-6 | I2C-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 pin | Output Enable GPIO (high = output) | Pull-up Enable GPIO | ||||
Pin | Linux | Power-on default | Pin | Linux | Power-on default | |
IO0 | U34_ IO0.0 | 248 | Pulled-down* | U39_IO0.0 | 216 | Pulled-up input** |
IO1 | U34_ IO0.1 | 249 | Pulled-down* | U39_IO0.0 | 217 | Pulled-up input** |
IO2 | U34_ IO0.2 | 250 | Pulled-down* | U39_IO0.0 | 218 | Pulled-up input** |
IO3 | U34_ IO0.3 | 251 | Pulled-down* | U39_IO0.0 | 219 | Pulled-up input** |
IO4 | U34_ IO0.4 | 252 | Pulled-down* | U39_IO0.0 | 220 | Pulled-up input** |
IO5 | U34_ IO0.5 | 253 | Pulled-down* | U39_IO0.0 | 221 | Pulled-up input** |
IO6 | U34_ IO0.6 | 254 | Pulled-down* | U39_IO0.0 | 222 | Pulled-up input** |
IO7 | U34_ IO0.7 | 255 | Pulled-down* | U39_IO0.7 | 223 | Pulled-up input** |
IO8 | U34_ IO1.0 | 256 | Pulled-down* | U39_IO0.7 | 224 | Pulled-up input** |
IO9 | U34_ IO1.1 | 257 | Pulled-down* | U39_IO0.7 | 225 | Pulled-up input** |
IO10 | U34_ IO1.2 | 258 | Pulled-down* | U39_IO0.7 | 226 | Pulled-up input** |
IO11 | U34_ IO1.3 | 259 | Pulled-down* | U39_IO0.7 | 227 | Pulled-up input** |
IO12 | U34_ IO1.4 | 260 | Pulled-down* | U39_IO0.7 | 228 | Pulled-up input** |
IO13 | U34_ IO1.5 | 261 | Pulled-down* | U39_IO0.7 | 229 | Pulled-up input** |
IO14 | U16_ IO0.0 | 232 | Pulled-down* | U17_ IO1.0 | 208 | Pulled-up input** |
IO15 | U16_ IO0.1 | 233 | Pulled-down* | U17_ IO1.1 | 209 | Pulled-up input** |
IO16 | U16_ IO0.2 | 234 | Pulled-down* | U17_ IO1.2 | 210 | Pulled-up input** |
IO17 | U16_ IO0.3 | 235 | Pulled-down* | U17_ IO1.3 | 211 | Pulled-up input** |
IO18 | U16_ IO0.4 | 236 | Pulled-down* | U17_ IO1.4 | 212 | Pulled-up input** |
IO19 | U16_ IO0.5 | 237 | Pulled-down* | U17_ IO1.5 | 213 | Pulled-up input** |
표4. Pin direction and pull-up control
* 이 핀들은 전원이 켜질 때 디폴트로 외부 풀다운 입력임. 그러므로 level shifter는 실질적으로 input direction이 선택되어 있음** 이 핀들은 전원이 켜질 때 디폴트로 내부 풀업 입력임. 그러므로 실질적으로 풀업(100K+47K 저항이 직렬로)이 활성화 되어 있음
Miscellaneous GPIOs
다음의 GPIO는 다른 플랫폼 기능과 아두이노 쉴드 호환성을 위해 사용된다.
Function | GPIO | Direction | Power-on default | Initial setup | |
Pin | Linux | ||||
TRI_STATE_ALL | U17_IO1.6 | 214 | Output | Pulled-down | |
SHLD_RESET | U17_IO1.7 | 215 | Output | Pulled-up input* | |
SHLD_RESET | U17_IO0.7 | 207 | Input | Pulled-up input* | |
표5. 기타 GPIO
* 이 핀들은 전원이 켜질 때 디폴트로 풀업 입력 상태임. 이 상태는 출력이 high로 설정된 경우와 동일한 효과를 가짐Shield pin configuration guide
- 사용하고자 하는 아두이노 쉴드의 핀 번호(IO0~IO19)를 확인한다.
- 해당 핀에서 사용할 수 있는 기능들을 확인하고, 그 중 사용하길 원하는 기능을 선택한다.
- 원하는 기능을 위한 pin muxing 옵션을 선택하기 위해 어떤 GPIO 신호가 설정이 필요한지 결정한다. 일부 핀은 한가지 기능만 가지고 있거나, mux control이 필요없는 경우도 있다.
- 핀의 buffer direction을 입력 또는 출력으로 선택하기 위해 어떤 GPIO 신호를 설정할 필요가 있는지 결정한다. 또한 필요한 direction을 결정한다.
- 풀업 저항 control을 선택하기 위해 어떤 GPIO 신호를 설정할 필요가 있는지, 풀업저항을 활성화 또는 비활성화 시킬지를 결정한다. 일반적으로 대부분의 핀 기능에 대해 풀업저항은 비활성화 되어야 한다. GPIO 입력 기능에서는 풀업저항이 사용자의 필요에 따라 활성화 또는 비활성화 될 수 있다.
- Linux user-space 환경(즉 명령어 쉘)에서 억세스하기 위해 위의 GPIO 번호를 export한다.
- 위의 GPIO 번호를 출력으로 설정한다.
- TRI_STATE_ALL 신호를 LOW로 해서 쉴드 핀의 연결을 끊어준다.
- 출력 로직 레벨을 HIGH 또는 LOW로 해주기 위해 위의 GPIO를 설정한다.
- SoC GPIO 핀 모드를 원하는 기능으로 설정한다.
- TRI_STATE_ALL 신호를 다시 HIGH로 바꿔서 쉴드 핀을 연결시켜 준다.
예제1: IO5를 풀업저항이 비활성화 된 GPIO input으로 설정
- 쉴드 번호는 IO5이다. 표1에 의하면 GPIO 번호는 13이 된다.
- 필요한 기능은 GPIO이다. 표1에 의하면 이 쉴드핀에서 사용할 수 있는 다른 기능들은 PWM이 있다.
- 표3에 의하면 GPIO를 선택하기 위해서는 GPIO43 pin mux가 mode0로 설정되어야만 한다. 표4에 의하면 IO5의 output direction을 비활성화 시키기 위해 GPIO253은 0으로 설정되어야만 한다.
- 표4에 의하면 IO5의 외부 풀업저항을 비활성화 시키기 위해 GPIO221은 high-Z input으로 설정되어야만 한다.
- 표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
# 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으로 설정
- 쉴드의 핀 번호는 IO11이다. 표1에 의하면 GPIO 번호는 43이다.
- 필요한 기능은 GPIO이다. 표1에 의하면 이 쉴드핀에서 사용할 수 있는 다른 기능들은 PWM, SPI, I2S가 있다.
- 표3에 의하면 GPIO/SPI를 선택하기 위해서는 GPIO262가 1로 설정되어야만 한다. GPIO를 선택하려면 GPIO241은 0으로 설정되어야만 하고 GPIO43 pin mux는 'mode0'로 설정되어야만 한다.
- 표4에 의하면 IO11의 output direction을 비활성화 시키기 위해 GPIO259가 0으로 설정되어야만 한다.
- 표4에 의하면 IO11의 외부 풀업저항을 비활성화 시키기 위해 GPIO227은 high-Z input으로 설정되어야만 한다.
- 표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
# 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으로 설정
- 쉴드의 핀 번호는 IO7이다. 표1에 의하면 GPIO 번호는 48이다.
- 필요한 기능은 GPIO이다. 표1에 의하면 이 쉴드핀에는 다른 기능은 없다.
- 표3에 의하면 IO7은 필요한 mux option이 없다.
- 표4에 의하면 IO7의 output direction을 비활성화 시키기 위해 GPIO255가 0으로 설정되어야만 한다.
- 표4에 의하면 IO7의 외부 풀업저항을 활성화 시키기 위해 GPIO223은 HIGH로 설정되어야만 한다.
- 표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
# 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 출력으로 설정
- 쉴드의 핀 번호는 IO6이다. 표1에 의하면 GPIO 번호는 182이다.
- 필요한 기능은 PWM이다. 표1에 의하면 이 쉴드핀에서 사용할 수 있는 다른 기능들은 GPIO가 있다.
- 표3에 의하면 PWM을 선택하기 위해서는 GPIO182가 'mode1'로 설정되어야만 한다.
- 표4에 의하면 IO6의 output direction을 활성화 시키기 위해 GPIO254가 1로 설정되어야만 한다.
- 표4에 의하면 IO6의 외부 풀업저항을 비활성화 시키기 위해 GPIO222는 high-Z 입력으로 설정되어야만 한다.
- 표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
# 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
# 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로 사용할 수 있다.
- 쉴드의 핀 번호는 IO14이다. 표1에 의하면 GPIO 번호는 44이다.
- 필요한 기능은 ADC이다. 표1에 의하면 이 쉴드핀에서 사용할 수 있는 다른 기능들은 GPIO가 있다.
- 표3에 의하면 ADC를 선택하기 위해서는 GPIO200가 1로 설정되어야만 한다.
- 표4에 의하면 IO14의 output direction을 비활성화 시키기 위해 GPIO232가 0으로 설정되어야만 한다.
- IO14에 직접 연결된 모든 GPIO 라인은 current leakage를 방지하기 위해 high-Z 입력으로 설정되어야 한다. 표4에 의하면 GPIO208이 IO14의 풀업저항을 활성화 시키는데 사용된다.
- 표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로 설정
- 쉴드의 핀 번호는 IO18과 IO19이다. 각각의 GPIO 번호는 28과 27이 된다.
- 필요한 기능은 I2C이다. 표1에 의하면 이 쉴드핀들에서 사용할 수 있는 다른 기능들은 GPIO, ADC가 있다.
- 표3에 의하면 GPIO/I2C를 선택하기 위해 GPIO204는 0으로 설정되어야만 하고, IO18에 I2C를 선택하기 위해서는 GPIO28 pin mux가 'mode1'으로 설정되어야만 한다.
- 표3에 의하면 GPIO/I2C를 선택하기 위해 GPIO205는 0으로 설정되어야만 하고, IO19에 I2C를 선택하기 위해서는 GPIO27 pin mux가 'mode1'으로 설정되어야만 한다.
- GPIO14와 GPIO165도 I2C에 연결되어 있기 때문에 GPIO18/19에서 I2C를 사용하는 경우 이 핀들은 high-Z 입력으로 설정해 이 핀들이 I2C 버스의 신호를 드라이브하는걸 방지해야만 한다.
- 표4에 의하면 GPIO14의 output direction을 비활성화 시키기 위해 GPIO236은 0으로 설정되어야만 한다. 그리고 GPIO165의 output direction을 비활성화 시키기 위해 GPIO237은 0으로 설정되어야만 한다.
- 표4에 의하면 GPIO212와 213은 각각 IO18과 IO19의 풀업저항을 비활성화 시키기 위해 high-Z 입력으로 설정되어야만 한다.
- 표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로 설정
- 쉴드의 핀 번호는 IO10~IO13이다. 각각의 GPIO 번호는 111, 115, 114, 109가 된다.
- 필요한 기능은 SPI이다. 표1에 의하면 이 쉴드핀들에서 사용할 수 있는 다른 기능들은 GPIO, PWM이 있다.
- 표3에 의하면 GPIO/SPI를 선택하기 위해 GPIO263은 1로 설정되어야만 하고, SPI를 선택하기 위해 GPIO240은 1로, IO10에 SPI를 선택하기 위해서는 GPIO111 pin mux가 'mode1'으로 설정되어야만 한다.
- 표3에 의하면 GPIO/SPI를 선택하기 위해 GPIO262는 1로 설정되어야만 하고, SPI를 선택하기 위해 GPIO241은 1로, IO11에 SPI를 선택하기 위해서는 GPIO115 pin mux가 'mode1'으로 설정되어야만 한다.
- 표3에 의하면 SPI를 선택하기 위해 GPIO242는 1로, IO12에 SPI를 선택하기 위해서는 GPIO114 pin mux가 'mode1'으로 설정되어야만 한다.
- 표3에 의하면 SPI를 선택하기 위해 GPIO243은 1로, IO13에 SPI를 선택하기 위해서는 GPIO109 pin mux가 'mode1'으로 설정되어야만 한다.
- 표4에 의하면 IO10의 output direction을 활성화 히기 위해 GPIO258은 1로, IO11의 output direction을 활성화 히기 위해 GPIO259는 1로, IO12의 output direction을 비활성화 히기 위해 GPIO260은 0으로, IO13의 output direction을 활성화 히기 위해 GPIO261은 1로 설정되어야만 한다.
- 표4에 의하면 GPIO226~229는 IO10~IO13의 풀업저항을 비활성화 시키기 위해 high-Z 입력으로 설정되어야만 한다.
- 표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
# 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 에서 볼 수 있음.
댓글 없음:
댓글 쓰기