Classic 기저대역: 도약 커널, 접근 코드, HEC·CRC·FEC
이어폰·자동차·키보드에서 아직 많이 쓰는 BR/EDR(Classic)은 LE와 뿌리가 다르다. 채널은 79개, 1초에 1,600번 뛰고, 어디로 뛸지는 Central의 주소와 클록을 섞는 하드웨어 회로가 정한다. 패킷의 앞머리는 LAP에서 만든 64비트 부호어이고, 헤더는 세 번씩 반복해 보낸다. 이 장은 그 회로들을 사양 Part G의 예제 데이터와 한 비트도 다르지 않게 재현한다.
- 슬롯·클록·79채널의 관계와 Central/Peripheral 슬롯을 설명할 수 있다.
- DM1·DH5·3-DH5 같은 패킷 이름을 풀고 최대 처리량을 계산할 수 있다.
- 도약 선택 커널의 입력 X·Y·A~F와 덧셈·XOR·PERM5·mod 79 단계를 따라가고, AFH 재매핑을 적용할 수 있다.
- LAP에서 Barker 수열, PN 덮개, (64,30) 부호로 동기어를 만들 수 있다.
- 패킷 헤더의 HEC와 1/3 반복, 페이로드 CRC, 2/3 FEC, 화이트닝 순서를 지켜 공중 비트를 만들 수 있다.
슬롯, 클록, 79채널
BR/EDR은 2,402 + k MHz(k = 0~78)의 79채널을 쓴다. 시간은 625 µs 슬롯으로 나뉘고, 슬롯 번호는 28비트 클록 CLK(312.5 µs마다 1 증가, 3.2 kHz)의 위 27비트다. 그래서 한 슬롯 = 클록 2틱이고, CLK₁이 0인 슬롯(짝수 슬롯)에서 Central이, 1인 슬롯에서 Peripheral이 보낸다. 연결 상태에서 도약에 쓰는 클록은 Central의 CLK이다. Peripheral은 자기 클록 CLKN에 오프셋을 더해 CLK를 추정한다.
3·5슬롯 패킷은 첫 슬롯의 주파수를 끝까지 유지하고, 그다음 슬롯은 “그 슬롯의 클록으로 계산한” 주파수로 간다. 즉 다중 슬롯 패킷 동안 건너뛴 주파수는 그냥 쓰지 않는다.
79채널: [Vol 2] Part A §2 · 슬롯과 클록: [Vol 2] Part B §2.2.3, §2.2.4 · 다중 슬롯 패킷의 주파수: §2.6.1
도약 선택 커널
커널은 32개 도약으로 된 구간을 고르고 그 안을 의사 난수 순서로 돈 다음, 다음 구간으로 미끄러진다. 레지스터 뱅크에 짝수 채널(0, 2, …, 78)을 먼저, 홀수 채널(1, 3, …, 77)을 나중에 넣어 두어, 연속한 32개 인덱스가 약 64 MHz에 퍼지게 한다. 연결 상태의 입력(Table 2.2)은 이렇다. 주소 비트 A는 Central의 LAP(A₂₃₋₀)와 UAP 하위 4비트(A₂₇₋₂₄)다.
| 입력 | 연결 상태 값 | 역할 |
|---|---|---|
| X | CLK₆₋₂ | 32개 구간 안의 위치 |
| Y1, Y2 | CLK₁, 32 × CLK₁ | Central→Peripheral / Peripheral→Central |
| A | A₂₇₋₂₃ ⊕ CLK₂₅₋₂₁ | 첫 덧셈 (mod 32) |
| B | A₂₂₋₁₉ | 하위 4비트 XOR |
| C | A₈,₆,₄,₂,₀ ⊕ CLK₂₀₋₁₆ | PERM5 제어 P₉₋₁₃ (Y1과 XOR) |
| D | A₁₈₋₁₀ ⊕ CLK₁₅₋₇ | PERM5 제어 P₀₋₈ |
| E | A₁₃,₁₁,₉,₇,₅,₃,₁ | 둘째 덧셈 |
| F | 16 × CLK₂₇₋₇ mod 79 | 구간마다 16씩 밀기 |
계산은 다섯 단계다. ① Z′ = (X + A) mod 32. ② Z = Z′의 하위 4비트를 B와 XOR. ③ PERM5: 다섯 비트를 7단 나비 연산 14개로 섞는데, 제어 비트 P₁₃부터 P₀까지 차례로 1이면 표의 두 비트를 맞바꾼다. ④ (PERM5 출력 + E + F + Y2) mod 79. ⑤ 그 값을 레지스터 뱅크 인덱스로 써서 채널을 얻는다.
AFH(적응 도약): 커널이 쓰지 않는 채널을 내면 k′ = (PERM5 출력 + E + F′ + Y2) mod N으로 다시 고른다. F′ = 16 × CLK₂₇₋₇ mod N이고, 표는 쓰는 짝수 채널 오름차순 + 쓰는 홀수 채널 오름차순이다. 커널이 쓰는 채널을 냈으면 그대로 둔다. 또 Peripheral은 바로 앞 Central 슬롯과 같은 채널로 답한다.
도약 커널 ([Vol 2] Part G §2의 세 주소)
선택 방식과 커널: [Vol 2] Part B §2.6.1, §2.6.2(PERM5 제어 Table 2.1) · AFH 재매핑: §2.6.3.1 · 입력(Table 2.2)과 주소(Table 2.3): §2.6.4 · 예제: [Vol 2] Part G §2
패킷 종류: DM1에서 3-DH5까지 이름 읽기
BR/EDR 패킷 이름은 규칙만 알면 그대로 읽힌다. ACL(데이터) 패킷을 예로 들면 다음과 같다.
- D: Data, ACL 논리 전송의 데이터 패킷.
- M / H: Medium rate(페이로드에 2/3 FEC를 씌움) / High rate(FEC 없이 그만큼 더 실음).
- 숫자 1·3·5: 차지하는 슬롯 수(625 µs 단위). 5슬롯이면 3.125 ms 동안 한 패킷이다.
- 앞의 2- / 3-: EDR. 페이로드를 π/4-DQPSK(2 Mb/s) 또는 8DPSK(3 Mb/s)로 보낸다. EDR 패킷에는 FEC가 없다(DH 계열만 있다).
그래서 3-DH5는 “3 Mb/s EDR, FEC 없는 데이터, 5슬롯” 패킷이다. 음성 쪽은 SCO의 HV1·HV2·HV3(재전송과 CRC 없음, 각각 1/3 FEC·2/3 FEC·FEC 없음)와 eSCO의 EV3·EV4·EV5, 2-EV3…3-EV5(CRC가 있고 재전송 창 안에서 다시 보냄)가 있다. NULL·POLL·FHS·ID는 데이터가 아니라 링크 제어용이다.
헤더의 TYPE은 4비트뿐이라 같은 코드가 여러 패킷을 뜻한다. 코드 구간이 곧 슬롯 수다(0000~1001은 1슬롯, 1010~1101은 3슬롯, 1110~1111은 5슬롯). ACL에서 1111이 DH5인지 3-DH5인지는 LMP로 정한 ptt(packet_type_table)가 0인지 1인지에 달렸다. 즉 수신기는 이름이 아니라 (논리 전송, ptt, TYPE)으로 패킷을 알아본다.
ACL 패킷 종류와 최대 처리량 ([Vol 2] Part B Table 6.2·6.8)
TYPE 코드 1111을 받았다. 이 패킷은 무엇일까?
Table 6.2에서 1111이 있는 칸을 모두 찾아보자.
패킷 종류와 TYPE 코드(Table 6.2): [Vol 2] Part B §6.5 · 링크 제어 패킷: §6.5.1 · SCO·eSCO 패킷: §6.5.2, §6.5.3 · ACL 패킷: §6.5.4 · 요약 표(Table 6.7~6.9): §6.7
접근 코드: LAP에서 64비트 동기어로
모든 패킷은 접근 코드로 시작한다. 프리앰블 4비트 + 동기어 64비트 + (헤더가 따라오면) 트레일러 4비트. 동기어는 수신기가 “우리 피코넷의 패킷”인지 상관기로 찾는 지문이라 서로 다른 LAP끼리 해밍 거리가 커야 한다(최소 14). 만드는 법은 네 단계다.
- 정보 30비트 = LAP 24비트 + Barker 6비트. LAP 최상위 비트가 0이면 001101, 1이면 110010(전송 순서). LAP MSB와 합쳐 길이 7 Barker 수열이 된다.
- PN 수열 p(64비트, 전송 순서로 3F2A33DD69B121C1)의 p₃₄~p₆₃과 XOR.
- (64,30) 확장 BCH 부호: 패리티 34비트 = D³⁴·x̃(D) mod g(D), g = 0x585713DA9.
- 부호어 전체를 다시 p와 XOR. 정보 부분은 원래 LAP·Barker로 돌아오고 패리티만 섞인다.
프리앰블은 동기어 첫 비트가 1이면 1010, 0이면 0101이고, 트레일러는 동기어 마지막 비트가 0이면 1010, 1이면 0101. 어느 쪽이든 경계에서 0과 1이 번갈아 나오게 한다. 조회(inquiry)는 Central LAP 대신 예약 LAP를 쓴다. 일반 조회 GIAC = 0x9E8B33.
동기어 만들기
접근 코드 종류와 프리앰블: [Vol 2] Part B §6.3.1, §6.3.2 · 동기어: §6.3.3, §6.3.3.1 · PN 수열: §6.3.3.2 · 트레일러: §6.3.4 · 예제: [Vol 2] Part G §3
헤더와 페이로드: HEC, CRC, FEC, 화이트닝
패킷 헤더는 LT_ADDR(3) · TYPE(4) · FLOW · ARQN · SEQN의 10비트에 HEC 8비트를 붙인 18비트이고, 이것을 비트마다 세 번 반복(1/3 FEC)해 54비트로 보낸다. HEC는 g(D) = D⁸ + D⁷ + D⁵ + D² + D + 1의 LFSR을 Central의 UAP로 미리 채운 뒤 헤더를 LSB부터 넣어 얻는다. 접근 코드가 같아도 UAP가 다르면 HEC가 틀리므로 다른 피코넷의 패킷을 걸러 낸다.
페이로드(ACL)는 페이로드 헤더(LLID·FLOW·LENGTH, 1슬롯 패킷은 8비트) + 데이터 + CRC-16(CRC-CCITT, 역시 UAP로 초기화)이다. DM 패킷은 여기에 (15,10) 단축 해밍(g = 0x35)을 씌워 10비트마다 패리티 5비트를 붙인다. 10의 배수가 되도록 0을 0~9개 덧붙인다. DH 패킷은 FEC 없이 그만큼 더 싣는다.
화이트닝(g = D⁷ + D⁴ + 1)은 FEC 전에 헤더와 페이로드(CRC 포함)에 XOR한다. 레지스터는 CLK₆₋₁ 위에 1을 얹은 7비트로 시작하고, 헤더가 끝난 상태 그대로 페이로드로 이어 간다. 받는 쪽은 FEC를 푼 뒤에 화이트닝을 걷어 낸다.
헤더는 봉투의 주소란이라 잘못 읽으면 안 되니 같은 글자를 세 번씩 크게 쓴다(1/3 반복). HEC는 봉투의 우편번호 검산 숫자이고, 우리 동네 번호(UAP)를 섞어 계산하므로 옆 동네 봉투는 검산에서 떨어진다. 내용물은 CRC라는 봉인을 붙이고, 험한 길(DM)이면 완충재(2/3 FEC)를 더 넣는다.
공중 비트 만들기 ([Vol 2] Part G §6의 패킷)
헤더 필드: [Vol 2] Part B §6.4.1~§6.4.6 · 페이로드 헤더: §6.6.2 · HEC·CRC 초기화와 생성: §7.1, §7.1.1, §7.1.2 · 화이트닝: §7.2 · 1/3 FEC: §7.4 · 2/3 FEC: §7.5 · 예제: [Vol 2] Part G §4, §5, §6, §8, §9
두 피코넷의 Central LAP가 우연히 같고 UAP만 다르다. 한쪽 Peripheral이 다른 피코넷의 패킷을 받으면?
HEC 초기값.
핵심 정리
- 79채널, 625 µs 슬롯 = CLK 2틱, CLK₁ = 0이 Central 슬롯. 연결 도약은 Central의 CLK와 LAP·UAP로 정한다.
- 패킷 이름: [2-/3- EDR] D(M = 2/3 FEC | H = FEC 없음)(슬롯 1·3·5). TYPE 4비트의 뜻은 논리 전송과 ptt로 정해진다.
- 커널: (X + A) mod 32 → 하위 4비트 ⊕ B → PERM5(C⊕Y1, D) → (+E + F + Y2) mod 79 → 짝수·홀수 순 레지스터.
- AFH: 쓰지 않는 채널만 k′ = (PERM5 + E + F′ + Y2) mod N으로 재매핑, Peripheral은 앞 Central 슬롯 채널.
- 동기어 = LAP + Barker → PN 덮개 → (64,30) 부호 → PN 다시. 프리앰블·트레일러는 경계를 0101/1010으로.
- 헤더 10비트 + HEC(UAP 초기화) → 화이트닝 → 1/3 반복. 페이로드 + CRC(UAP) → 화이트닝 → (DM이면) 2/3 FEC.
확인 퀴즈
연결 상태 도약 커널에서 Central→Peripheral과 Peripheral→Central을 가르는 입력은?
LAP의 최상위 비트가 1이다. 동기어 정보 부분 끝 6비트(전송 순서)는?
화이트닝과 FEC의 순서는?
DM1에 데이터 5바이트를 실으면 FEC 앞 비트 수와 덧붙이는 0의 수는?