C 프로그래밍과 납땜

by 김상돈 | 2017-09-22 17:09
arm cortex-m0 kvm switch pcb

납땜은 참 힘든 작업인 것 같아요.

가능한 부품을 적게 쓴다고 썼는데도 5대를 모두 작업하려니 힘들더군요 ㅠㅠ


의외의 복병은 USB Switching 칩이었습니다. 1.5 mm x 2.0 mm 짜리 칩이어서 너무나도 작았거든요.

메이크위드 에는 아두이노나 펌웨어 프로그래머 분들이 많으신 것 같으니  이쪽의 얘기를 할까 해요.

예를 들어, TS3DV642 (HDMI 스위칭 칩)을 보면 다음과 같이 Functional Table이 있습니다.

저는 Switch Disable / All A channels / All B channels 세 가지 모드만 쓸거고, 중간에 있는 D0만 사용하는건 안 쓸 예정입니다.

따라서 SEL1 핀은 항상 High(3.3V)로 되어 있으면 좋겠죠.


이런 기능들은 회로를 구현할 때 부터 고려했었기 때문에, SEL1 핀을 항상 High로 해주는 Pull-up 저항을 미리 구현 해 두었습니다. I/O핀도 가뜩이나 부족한 MCU를 쓰고 있는데, 포트 낭비하면 아깝잖아요.

그리고 나머지 EN 핀과 SEL2 핀은 C 프로그래밍에서 처리해주면 됩니다.

아래 코딩처럼요. 저는 MCU 중 STM32 시리즈를 주로 쓰는데, 아래처럼 GPIO_SetBits() 함수와 GPIO_ResetBits() 함수를 쓰면 간단하게 I/O를 3.3V 또는 0V로 설정할 수 있어요.

HDMI0 를 Enable 하려면 EN핀을 High(3.3V)로 만들어주고요, Disable 하려면 EN 핀을 Low(0V)로 만듭니다. PC A를 선택하려면 SEL2 핀을 Low(0V)로 만들어주고요, PC B를 선택하려면 SEL2 핀을 High(3.3V)로 만들어줍니다.


위에 보여드린 코딩은 단순 Function들인데, 어떻게 Function을 운용하는지에 대해 고민해보아야죠.

Interrupt Service Routine은 짧게 해야 합니다. 따라서, 버튼이 눌리는 IRQ가 발생했을 때 switch2_irq 라는 변수의 값을 1로 만들고 바로 빠집니다. main() 함수에서는 switch2_irq 변수의 값을 계속 모니터링 하고 있다가, switch2_irq == 1일 때 바로 동작을 하는겁니다.

    만약, status == 0이라면 PC-A로 연결을 바꾸고, status == 1로 바꿈.

    만약, status == 1이라면 PC-B로 연결을 바꾸고, status == 0으로 바꿈.

하나의 버튼을 누를 때 마다 status와 함께 PC 연결위치가 바뀌게 됩니다.

(이제 보니 코딩에 취약점은 조금 있네요. 하지만 잘 됩니다.)


I/O 제어는 별로 특별한 건 없으니까, 부가기능은 필요한 만큼 잘 만들어주면 됩니다.

댓글 0

MADE BY

김상돈

altera, fpga, pcb, stm32, xilinx, zynq, 아두이노