티스토리 뷰

Study/Linux

[Linux] 보드에 연결된 serial port의 상태 확인

생각많은 소심남 2016. 7. 21. 21:59

 UART driver를 개발하다보면서 많은 문제에 봉착하고, 그걸 해결하려고 노력을 한다. 지금 제일 큰 문제가 UART IP내에 있는 FIFO buffer에 데이터를 읽어오는 속도보다 FIFO buffer로 데이터를 push하는 속도가 빠르다는 점이다. 이게 뭔소리지 하는 사람을 위해서 첨언을 하자면 어떤 크기가 일정한 공간에서 내가 가져오는 속도보다 외부에서 여기에 집어넣는 속도가 더 빠르다는 것이다. 이렇게 되면 어느 순간부터인가는 공간의 크기보다 많은 데이터들이 들어와 중간에 손실되는 것들도 생기게 된다. 지금은 UART에 한정해서 이야기하고 있는거지만, 아마 거진 FIFO buffer를 처리해야하는 작업들 대부분은 위와같은 overflow 현상에 대한 대처를 마련해놔야 한다.

 나같은 경우는 이 UART driver가 독립적으로 동작하는게 아니라 상위단에 있는 serial_core라는 모듈에 call-back함수로 등록해서 사용하는 것이기 때문에 모든 데이터 처리가 이 serial_core에 따라서 움직인다. 이 말은 내가 IP에 대한 specification을 읽고 driver를 설계했다고 하더라도 상위단에 있는 serial_core의 동작 process를 이해하고 있어야 한다는 것이다. 문제는 또 이 serial_core이 독립적으로 동작하는게 아니라 또 상위단에 이를 처리하는 단계가 또 있다는 건데... 아직도 이 부분을 제대로 이해하지 못해서 좀 헤매고 있다. 아무튼..

 

 우선 내가 만든 UART driver가 Linux에서 정확히 인식되는지를 확인해보려면 간단하게 다음과 같이 해볼수 있다.

 

# dmesg | grep tty
[    0.000000] Kernel command line: console=ttyS1,460800 earlyprintk=smh
[    4.632250] e9038000.serial: ttyS0 at MMIO 0xe9038000 (irq = 36, base_baud = 0) is a test_SERIAL
[    4.645093] e903c000.serial: ttyS1 at MMIO 0xe903c000 (irq = 37, base_baud = 0) is a test_SERIAL
[    4.669250] console [ttyS1] enabled

 

사실 Linux가 개발보드에서 처음 부팅할때는 bootarg 라는 것을 string형태로 받는데, 이를 통해서 기본적인 console setting을 해준다. 지금은 내가 임의로 console에 관한 bootarg를 통해서 Linux에게 내가 어떤 포트로 통신을 하겠다 라는 것을 알려주었고, 이를 통해서 ttyS1이 활성화된 것을 확인할 수 있다. 물론 이밖에도 해당 UART가 어떤 baud rate을 가지고 irq number를 뭘로 가졌는지도 알수 있다.(지금은 해당 부분이 정확히 구현되어 있지 않아 입력값이 불명확하다.)

 

 이밖에도 또 알수 있는 방법이 uart driver에 대한 process 정보를 확인하는 것이다. 이전 포스트에도 몇번 언급한 적이 있지만 Linux에는 driver의 기능을 수행하는 process들이 상주해 있다. 이 중 uart driver에 대한 process의 정보를 확인하면 되는데, 다음과 같이 하면 된다.

 

 

# cat /proc/tty/driver/test_uart
serinfo:1.0 driver revision:
0: uart:test_SERIAL mmio:0xE9038000 irq:36 tx:0 rx:0
1: uart:test_SERIAL mmio:0xE903C000 irq:37 tx:177843 rx:257 RTS|DTR

 

사실 이 방법을 사용하면 해당 UART로 연결되어 있는 Flow Control 정보나 해당 port를 통해서 수행된 tx / rx count도 알 수 있기 때문에 더 명확하다. 물론 이를 이용해서 rx가 정상적으로 되는지를 확인해보려면 키입력을 해보면 된다.

 

# cat /proc/tty/driver/aurora_uart
serinfo:1.0 driver revision:
0: uart:AURORA_SERIAL mmio:0xE9038000 irq:36 tx:0 rx:0
1: uart:AURORA_SERIAL mmio:0xE903C000 irq:37 tx:177843 rx:257 RTS|DTR
# test
# cat /proc/tty/driver/aurora_uart
serinfo:1.0 driver revision:
0: uart:AURORA_SERIAL mmio:0xE9038000 irq:36 tx:0 rx:0
1: uart:AURORA_SERIAL mmio:0xE903C000 irq:37 tx:178060 rx:269 RTS|DTR

 

내가 test라고 하는 string을 입력하니까 rx count가 늘어난 것을 알 수 있다. 지금 수치상으로 12가 증가한 것을 볼 수 있는데, 내가 "test" 를 수행하면 rx handling이 12번 수행되었다는 것이다. 이 정보는 보통 uart_port 구조체내의 icount의 변수들을 parsing해서 보여주는 것으로 보인다.

 

 아무튼 위의 방법을 수행하면 현재 개발보드에서 통신되고 있는 serial port의 상태에 대해서 확인할 수 있다.

댓글