Mux (Multiplexer)
pinmux는 pin을 mux하는 것이다. 따라서 pinmux를 이해하기 위해서는 먼저 mux를 이해할 필요가 있다.
디지털 논리회로 중 mux(멀티플렉서)라고 있다. Select신호를 이용하여 여러 개의 입력 중 하나를 선택하는 장치다. 아래 그림은 입력이 두개, 출력이 하나인 2X1 MUX다. SELECT신호가 0이면 OUTPUT은 입력 신호 중 하나인 A가 출력되고 SELECT신호가 1이면 B가 출력된다.
Pinmux (Pin Multiplexer)
아두이노의 ADC에 센서를 연결하면 센서값을 읽어올 수 있다. 이때 외부의 센서와 아두이노가 물리적으로 연결되는 것이 pin이다. 아래 그림은 아두이노의 pinmap으로 각 pin들을 설명하고 있다.
아두이노도 핀들이 많지만 다양한 기능을 가지는 SoC는 훨씬 많은 핀들이 요구될 수 있다. 핀이 늘어나면 패키지 사이즈(SoC의 물리적 크기)도 당연히 늘어날 수밖에 없는데, 전자제품의 소형화를 원하는 세상은 큰 패키지사이즈를 용납할 수 없다. 그래서 이 딜레마를 해결하기 위해 사용자가 핀을 커스터마이징 할 수 있는 pinmux를 사용한다.
예를 들어 어떤 SoC에 GPIO 10개, UART 10개, I2C 10개가 있고, GPIO, UART, I2C 하나당 하나의 핀이 필요하다고 하자. 그렇다면 SoC에는 총 30개의 핀이 있어야 하지만 10개의 핀만 만들어둔다. 그리고 GPIO를 10개 사용하던지 UART를 10개 사용하던지 GPIO 5개와 UART 5개를 사용하던지 사용자가 10개의 핀 안에서 자유롭게 사용할 기능을 선택할 수 있게 한다. 물론 이렇게 하면 핀이 10개밖에 없기 때문에 30개의 기능을 모두 사용하지는 못한다. 혹시 모를 약간의 리스크를 감수하고 핀의 개수를 줄일 수 있다. 경험상 일반적으로 모든 핀을 pinmux로 설정할 수 있게 하는게 아닌 일부 기능들을 pinmux로 설정하게 한다.
pinmux는 소프트웨어로 pin을 선택한다. 아래 AT03262의 데이터시트를 보면 pinmux 사용 예제가 나오는데, 핀을 GPIO에 할당한 것을 볼 수 있다.
*AT03262는 칩 자체가 Pinmux인것 같지만 딱히 다른 예제를 못 찾아서 가져왔다.
pinmux를 제공하는 SoC는 데이터시트에 pinmux 할당 방법이 나와있기 때문에 참고하면 된다.
칩 제조사에서 pinmux 툴을 제공해주는 경우도 있는 것 같다.