
1. 개요
이 문서는 동작하는 보드상에서 리눅스 시스템이 제공하고 있는
시리얼 포트 이름 과
디바이스 파일을 생성하기 위한 주 번호와 부번호를
얻는 방법에 대하여 기술한다.
2. ARM 용 리눅스에서 시스템에서 제공하는 시리얼 포트 정보를 얻어오는 방법 조사
시리얼 디바이스 드라이버 목록은 다음과 같은 proc 파일에서 제공하고 있다.
/proc/tty/drivers
2.1 IXP420의 예
[root@falinux /]$ cat /proc/tty/drivers
/dev/tty /dev/tty 5 0 system:/dev/tty
/dev/console /dev/console 5 1 system:console
/dev/ptmx /dev/ptmx 5 2 system
/dev/vc/0 /dev/vc/0 4 0 system:vtmaster
serial /dev/ttyS 4 64-67 serial
pty_slave /dev/pts 136 0-1048575 pty:slave
pty_master /dev/ptm 128 0-1048575 pty:master
pty_slave /dev/ttyp 3 0-15 pty:slave
pty_master /dev/pty 2 0-15 pty:master
unknown /dev/tty 4 1-63 console
[root@falinux /]$
2.2 S3C6410의 예
[root@falinux ~]$ cat /proc/tty/drivers
/dev/tty /dev/tty 5 0 system:/dev/tty
/dev/console /dev/console 5 1 system:console
/dev/ptmx /dev/ptmx 5 2 system
/dev/vc/0 /dev/vc/0 4 0 system:vtmaster
ttySAC /dev/s3c2410_serial
pty_slave /dev/pts 136 0-1048575 pty:slave
pty_master /dev/ptm 128 0-1048575 pty:master
pty_slave /dev/ttyp 3 0-255 pty:slave
pty_master /dev/pty 2 0-255 pty:master
unknown /dev/tty 4 1-63 console
2.3 S3C2440의 예
[root@falinux ~]$ cat /proc/tty/drivers
/dev/tty /dev/tty 5 0 system:/dev/tty
/dev/console /dev/console 5 1 system:console
/dev/ptmx /dev/ptmx 5 2 system
/dev/vc/0 /dev/vc/0 4 0 system:vtmaster
s3c24xx_serial /dev/ttySAC
pty_slave /dev/pts 136 0-1048575 pty:slave
pty_master /dev/ptm 128 0-1048575 pty:master
pty_slave /dev/ttyp 3 0-255 pty:slave
pty_master /dev/pty 2 0-255 pty:master
unknown /dev/tty 4 1-63 console
[root@falinux ~]$
2.4 GACU 모델의 예
[root@falinux tty]$ cat drivers
/dev/tty /dev/tty 5 0 system:/dev/tty
/dev/console /dev/console 5 1 system:console
/dev/ptmx /dev/ptmx 5 2 system
/dev/vc/0 /dev/vc/0 4 0 system:vtmaster
s3c24xx_serial /dev/ttySAC
serial /dev/ttyS 4 64-79 serial
pty_slave /dev/pts 136 0-1048575 pty:slave
pty_master /dev/ptm 128 0-1048575 pty:master
pty_slave /dev/ttyp 3 0-255 pty:slave
pty_master /dev/pty 2 0-255 pty:master
unknown /dev/tty 4 1-63 console
ls -al /sys/class/tty/ttyS*
3. sys 파일에서 제공하는 시리얼 포트 정보를 얻어오는 방법 조사
3.1 S3C2440의 예
[root@falinux /]$ ls -al /sys/class/tty/ttyS*
/sys/class/tty/ttySAC0:
drwxr-xr-x 2 root root 0 Jan 15 18:51 .
drwxr-xr-x 584 root root 0 Jan 1 1970 ..
-r--r--r-- 1 root root 4096 Jan 15 18:51 dev
lrwxrwxrwx 1 root root 0 Jan 15 18:51 device -> ../../../devices/platform/s3c2440-uart.0
lrwxrwxrwx 1 root root 0 Jan 15 18:51 subsystem -> ../../../class/tty
--w------- 1 root root 4096 Jan 15 18:51 uevent
/sys/class/tty/ttySAC1:
drwxr-xr-x 2 root root 0 Jan 15 18:51 .
drwxr-xr-x 584 root root 0 Jan 1 1970 ..
-r--r--r-- 1 root root 4096 Jan 15 18:51 dev
lrwxrwxrwx 1 root root 0 Jan 15 18:51 device -> ../../../devices/platform/s3c2440-uart.1
lrwxrwxrwx 1 root root 0 Jan 15 18:51 subsystem -> ../../../class/tty
--w------- 1 root root 4096 Jan 15 18:51 uevent
/sys/class/tty/ttySAC2:
drwxr-xr-x 2 root root 0 Jan 15 18:51 .
drwxr-xr-x 584 root root 0 Jan 1 1970 ..
-r--r--r-- 1 root root 4096 Jan 15 18:51 dev
lrwxrwxrwx 1 root root 0 Jan 15 18:51 device -> ../../../devices/platform/s3c2440-uart.2
lrwxrwxrwx 1 root root 0 Jan 15 18:51 subsystem -> ../../../class/tty
--w------- 1 root root 4096 Jan 15 18:51 uevent
[root@falinux /]$
[root@falinux /]$ cat /sys/class/tty/ttySAC0/dev
204:64
3.2 S3C6410의 예
[root@falinux ~]$ ls -al /sys/class/tty/s3c2410_serial*
lrwxrwxrwx 1 root root 0 Jan 1 00:00 /sys/class/tty/s3c2410_serial0 -> ../../devices/platform/s3c6400-uart.0/tty/s3c2410_serial0
lrwxrwxrwx 1 root root 0 Jan 1 00:00 /sys/class/tty/s3c2410_serial1 -> ../../devices/platform/s3c6400-uart.1/tty/s3c2410_serial1
lrwxrwxrwx 1 root root 0 Jan 1 00:00 /sys/class/tty/s3c2410_serial2 -> ../../devices/platform/s3c6400-uart.2/tty/s3c2410_serial2
lrwxrwxrwx 1 root root 0 Jan 1 00:00 /sys/class/tty/s3c2410_serial3 -> ../../devices/platform/s3c6400-uart.3/tty/s3c2410_serial3
[root@falinux ~]$
[root@falinux ~]$ cat /sys/class/tty/s3c2410_serial0/dev
204:64
3.3 IXP420 의 예
[root@falinux ~]$ ls -al /sys/class/tty/ttyS*
/sys/class/tty/ttyS0:
drwxr-xr-x 2 root root 0 Jan 1 00:00 .
drwxr-xr-x 105 root root 0 Jan 1 00:00 ..
-r--r--r-- 1 root root 4096 Jan 1 00:02 dev
lrwxrwxrwx 1 root root 0 Jan 1 00:02 device -> ../../../devices/platform/serial8250
/sys/class/tty/ttyS1:
drwxr-xr-x 2 root root 0 Jan 1 00:00 .
drwxr-xr-x 105 root root 0 Jan 1 00:00 ..
-r--r--r-- 1 root root 4096 Jan 1 00:02 dev
lrwxrwxrwx 1 root root 0 Jan 1 00:02 device -> ../../../devices/platform/serial8250
/sys/class/tty/ttyS2:
drwxr-xr-x 2 root root 0 Jan 1 00:00 .
drwxr-xr-x 105 root root 0 Jan 1 00:00 ..
-r--r--r-- 1 root root 4096 Jan 1 00:02 dev
lrwxrwxrwx 1 root root 0 Jan 1 00:02 device -> ../../../devices/platform/serial8250
/sys/class/tty/ttyS3:
drwxr-xr-x 2 root root 0 Jan 1 00:00 .
drwxr-xr-x 105 root root 0 Jan 1 00:00 ..
-r--r--r-- 1 root root 4096 Jan 1 00:02 dev
lrwxrwxrwx 1 root root 0 Jan 1 00:02 device -> ../../../devices/platform/serial8250
[root@falinux ~]$
4 시리얼 포트 목록 및 주번호, 부번호 얻는 방법에 대한 정리
결론적으로 시리얼 포트 목록 및 주번호, 부번호를 얻는 방법은
proc 이면 충분한것으로 판단된다.
다음과 같은 방법으로 얻는다.
1) /proc/tty/drivers 를 연다.
2) 라인 단위로 읽어 들인다.
3) 라인을 공백으로 토큰 분리한다.
4) 다섯번째 토큰 문자열이 "serial"로 확인 되면 해당 라인을 시리얼 포트 정보 라인으로 판단한다.
4) 세번째 토큰 문자열을 이용하여 주번호를 획득한다.
6) 네번째 토큰 문자열을 - 로 토큰 분리하여 부번호의 시작과 끝을 획득한다.
7) 부번호 정보를 이용하여 시리얼 갯수를 획득한다.
8) 두번째 토큰 문자열을 이용하여 디바이스 이름을 획득한다.
특기 사항은 S3C6410 이다.
보통은 ttyS 로 시작하는 이름이 시리얼 포트 명인데
삼성에서 제공하는 이 프로세서 커널만 /dev/s3c2410_serial 이런식으로 되어 있다.
웃긴것은 ttySAC0으로 콘솔을 지정한다는 거다..
이건 내부적인 에프에이리눅스 커널에 재 조사 및 재 적용을 요청해야 겠다.