# Linux Port Setup

**What you’ll do**
- Ubuntu에서 USB-Serial 장치를 `/dev/ttyKMC`로 고정하고, 권한 문제를 줄입니다.

**Prerequisites**
- Ubuntu 20.04, `sudo` 권한
- 차량 보드(USB-Serial)가 연결되어 있고 `lsusb`가 동작해야 합니다.

**Next**
- {doc}`Dashboard Test </page/Setup_Test/dashboard_test>`

Ubuntu에서 하드웨어 보드를 꽂았을 때 **항상 같은 장치 경로**로 접근할 수 있도록, udev 규칙을 추가해 `/dev/ttyKMC` 같은 **고정 심볼릭 링크**를 만드는 방법입니다.

---

## 1. 준비

- Ubuntu 20.04
- USB-Serial 장치가 연결되어 있고, `idVendor`, `idProduct` 값을 확인할 수 있어야 함
- 아래 예시는 `idVendor=0403`, `idProduct=6014` (FTDI 계열에서 흔함)

### 내 장치 VID/PID 확인
장치를 꽂고 아래 실행:

```bash
lsusb
```

출력 예시에서 `ID 0403:6014` 같이 보이는 게 VID:PID 입니다.

* `0403` → `idVendor`
* `6014` → `idProduct`
```bash
Bus 002 Device 002: ID 2109:0822 VIA Labs, Inc. USB3.1 Hub             
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 8087:0029 Intel Corp. 
Bus 001 Device 063: ID 0403:6014 Future Technology Devices International, Ltd FT232H Single HS USB-UART/FIFO IC
Bus 001 Device 002: ID 2109:2822 VIA Labs, Inc. USB2.0 Hub             
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
---

## 2. udev 규칙이 하는 일

이 규칙은 다음을 설정합니다.

* USB-Serial 장치를 인식하면 `/dev/ttyKMC` 라는 심볼릭 링크 생성
* 권한을 `0660` + `dialout` 그룹으로 설정해 접근 권한 문제를 줄임


규칙 파일 경로:
* `/etc/udev/rules.d/99-usb-serial-kmc.rules`
---

## 3. 자동 설정 스크립트 실행

아래 스크립트를 파일로 저장한 뒤 실행하세요.

### (1) 스크립트 저장

예: `setup_kmc_udev.sh`로 저장

```bash
#!/usr/bin/env bash
set -e

RULE_FILE="/etc/udev/rules.d/99-usb-serial-kmc.rules"
SYMLINK_NAME="ttyKMC"
ID_VENDOR="0403"
ID_PRODUCT="6014"
MODE="0660"
GROUP="dialout"

RULE_LINE="SUBSYSTEM==\"tty\", ATTRS{idVendor}==\"${ID_VENDOR}\", ATTRS{idProduct}==\"${ID_PRODUCT}\", SYMLINK+=\"${SYMLINK_NAME}\", MODE=\"${MODE}\", GROUP=\"${GROUP}\""

echo "=== USB 시리얼 udev 규칙 설정 스크립트 ==="
echo "장치: idVendor=${ID_VENDOR}, idProduct=${ID_PRODUCT}"
echo "심볼릭 링크: /dev/${SYMLINK_NAME}"
echo "권한: ${MODE} (GROUP: ${GROUP})"
echo

echo "[1/3] udev 규칙 파일 생성: ${RULE_FILE}"
echo "${RULE_LINE}"
echo "${RULE_LINE}" | sudo tee "${RULE_FILE}" > /dev/null

echo "[2/3] udev 규칙 리로드 및 트리거"
sudo udevadm control --reload-rules
sudo udevadm trigger

echo "[3/3] 사용자 dialout 그룹 추가"
sudo usermod -aG dialout "${USER}"

echo
echo "완료!"
echo "- 이제 USB 시리얼 장치를 한 번 뺐다가 다시 꽂으세요."
echo "- /dev/${SYMLINK_NAME} 가 생기는지 확인:"
echo "    ls -l /dev/${SYMLINK_NAME}"
echo "- 그룹 변경은 로그아웃 후 다시 로그인해야 적용됩니다."
echo "  (다시 로그인 후 'groups' 쳐서 dialout 포함됐는지 확인)"
```

### (2) 실행 권한 부여 + 실행

```bash
sudo chmod +x setup_kmc_udev.sh
./setup_kmc_udev.sh
```

---

## 4. 적용 확인

### (1) 장치 재연결

USB 장치를 한 번 뺐다가 다시 꽂습니다.

### (2) `/dev/ttyKMC` 생성 확인

```bash
ls -l /dev/ttyKMC
```


정상이라면 `/dev/ttyKMC -> /dev/ttyUSB0` 같은 형태의 링크가 보입니다.
```bash
ubuntu:~$ ls -l /dev/ttyKMC
lrwxrwxrwx 1 root root 7 Jan  2 17:08 /dev/ttyKMC -> ttyUSB0
```
---

## 5. 자주 생기는 문제

### Q1. `/dev/ttyKMC`가 안 생겨요

1. VID/PID가 다를 수 있음 → `lsusb`로 확인 후 스크립트의 `ID_VENDOR`, `ID_PRODUCT` 수정
2. 규칙이 적용됐는지 확인:

```bash
cat /etc/udev/rules.d/99-usb-serial-kmc.rules
```

3. udev 재로드:

```bash
sudo udevadm control --reload-rules
sudo udevadm trigger
```

---

### Q2. 권한 때문에 열 수 없어요 (Permission denied)

로그아웃/로그인 후 `dialout` 그룹 적용이 되었는지 확인:

```bash
groups
```

출력에 `dialout`이 있어야 합니다.




