Chapter 12

Classic 기저대역: 도약 커널, 접근 코드, HEC·CRC·FEC

이어폰·자동차·키보드에서 아직 많이 쓰는 BR/EDR(Classic)은 LE와 뿌리가 다르다. 채널은 79개, 1초에 1,600번 뛰고, 어디로 뛸지는 Central의 주소와 클록을 섞는 하드웨어 회로가 정한다. 패킷의 앞머리는 LAP에서 만든 64비트 부호어이고, 헤더는 세 번씩 반복해 보낸다. 이 장은 그 회로들을 사양 Part G의 예제 데이터와 한 비트도 다르지 않게 재현한다.

슬롯, 클록, 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₂₇₋₂₄)다.

입력연결 상태 값역할
XCLK₆₋₂32개 구간 안의 위치
Y1, Y2CLK₁, 32 × CLK₁Central→Peripheral / Peripheral→Central
AA₂₇₋₂₃ ⊕ CLK₂₅₋₂₁첫 덧셈 (mod 32)
BA₂₂₋₁₉하위 4비트 XOR
CA₈,₆,₄,₂,₀ ⊕ CLK₂₀₋₁₆PERM5 제어 P₉₋₁₃ (Y1과 XOR)
DA₁₈₋₁₀ ⊕ CLK₁₅₋₇PERM5 제어 P₀₋₈
EA₁₃,₁₁,₉,₇,₅,₃,₁둘째 덧셈
F16 × 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 슬롯과 같은 채널로 답한다.

SIMULATOR

도약 커널 ([Vol 2] Part G §2의 세 주소)

Central 주소 (UAP·LAP)
채널 지도
사양 예와 비교—
칠한 칸은 Central 슬롯, 흰 칸은 Peripheral 슬롯이다(한 칸 = 한 슬롯 = CLK 2틱). 해볼 것: ① 시작 CLK를 0x10부터 0x20씩 올리면 X가 한 바퀴(32) 돌 때 구간이 바뀌어 채널 대역이 이동한다. ② 짝수만 쓰는 AFH에서 Central·Peripheral 쌍이 같은 채널이 된다. ③ 0~21 미사용에서 커널이 쓰는 채널을 낸 자리는 기본 도약과 같다. 첫 줄(CLK 0x10)은 사양 표와 직접 비교하고, 검증 스크립트는 12개 표의 6,144개 값을 모두 확인한다.

선택 방식과 커널: [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(데이터) 패킷을 예로 들면 다음과 같다.

그래서 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)으로 패킷을 알아본다.

CALCULATOR

ACL 패킷 종류와 최대 처리량 ([Vol 2] Part B Table 6.2·6.8)

패킷
대칭 최대 속도—
한쪽 방향 최대 (정방향 / 역방향)—
사양 표와 비교—
속도는 계산으로 다시 구한다(사양 표에는 소수 둘째 자리를 버린 값도 있어 0.1 kb/s 안이면 같은 값으로 본다). 대칭은 양쪽이 같은 패킷을 번갈아 보낼 때로 페이로드 × 8 ÷ (2 × 슬롯 × 625 µs), 한쪽 방향은 한쪽이 이 패킷을, 상대가 같은 계열의 1슬롯 패킷으로 답할 때로 페이로드 × 8 ÷ ((슬롯 + 1) × 625 µs)다. 해볼 것: DM5와 DH5를 비교하면 FEC 하나로 실을 수 있는 양이 224 → 339바이트로 달라진다. 3-DH5의 2,178.1 kb/s가 입문편 3장 표의 그 값이다.
예측해 보기

TYPE 코드 1111을 받았다. 이 패킷은 무엇일까?

Table 6.2에서 1111이 있는 칸을 모두 찾아보자.

4비트 TYPE은 논리 전송과 ptt에 따라 뜻이 달라진다. 다만 구간이 같아 슬롯 수(5)는 코드만 보고도 안다(§6.5).

패킷 종류와 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

BRGFSK 1 Mb/s 프리4 동기어 64LAP에서 만든 부호어 트레4 헤더 5418비트 × 3번 페이로드 0~2,790ACL: 페이로드 헤더 · 데이터 · CRC-16 접근 코드 72 (헤더 없으면 트레일러 없이 68) LT_ADDR 3 · TYPE 4 · FLOW · ARQN · SEQN · HEC 8 EDR2·3 Mb/s 접근 코드 (GFSK) 헤더 (GFSK) 보호 동기 EDR 페이로드π/4-DQPSK · 8DPSK 트레 여기부터 EDR 변조 (보호 약 5 µs, 동기 11 µs)
그림 12-1. BR/EDR 패킷의 모양(단위: 비트). 접근 코드는 LAP에서 만든 64비트 동기어를 프리앰블·트레일러가 감싼 72비트(헤더가 없는 패킷은 68비트)다. 헤더 18비트는 세 번 반복해 54비트로 보낸다. EDR 패킷은 접근 코드와 헤더까지 BR과 같은 GFSK로 보내고, 보호 구간에서 변조를 바꾼 뒤 동기 신호, 위상 변조 페이로드, 트레일러를 보낸다.

접근 코드: LAP에서 64비트 동기어로

모든 패킷은 접근 코드로 시작한다. 프리앰블 4비트 + 동기어 64비트 + (헤더가 따라오면) 트레일러 4비트. 동기어는 수신기가 “우리 피코넷의 패킷”인지 상관기로 찾는 지문이라 서로 다른 LAP끼리 해밍 거리가 커야 한다(최소 14). 만드는 법은 네 단계다.

  1. 정보 30비트 = LAP 24비트 + Barker 6비트. LAP 최상위 비트가 0이면 001101, 1이면 110010(전송 순서). LAP MSB와 합쳐 길이 7 Barker 수열이 된다.
  2. PN 수열 p(64비트, 전송 순서로 3F2A33DD69B121C1)의 p₃₄~p₆₃과 XOR.
  3. (64,30) 확장 BCH 부호: 패리티 34비트 = D³⁴·x̃(D) mod g(D), g = 0x585713DA9.
  4. 부호어 전체를 다시 p와 XOR. 정보 부분은 원래 LAP·Barker로 돌아오고 패리티만 섞인다.

프리앰블은 동기어 첫 비트가 1이면 1010, 0이면 0101이고, 트레일러는 동기어 마지막 비트가 0이면 1010, 1이면 0101. 어느 쪽이든 경계에서 0과 1이 번갈아 나오게 한다. 조회(inquiry)는 Central LAP 대신 예약 LAP를 쓴다. 일반 조회 GIAC = 0x9E8B33.

SIMULATOR

동기어 만들기

LAP
동기어 (전송 순서 16진)—
사양 예와 비교—
비트열은 모두 전송 순서(왼쪽이 먼저)다. 16진은 그 비트열을 4개씩 끊은 것으로, 사양 Part G §3의 표기와 같다. 해볼 것: 000000과 FFFFFF의 끝 30비트를 보면 LAP와 Barker(001101 / 110010)가 그대로 보이고, 앞 34비트(패리티)는 전혀 달라 보인다. 검증 스크립트는 표의 130개 LAP를 모두 확인한다.

접근 코드 종류와 프리앰블: [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)를 더 넣는다.

SIMULATOR

공중 비트 만들기 ([Vol 2] Part G §6의 패킷)

패킷
화이트닝
HEC · CRC—
공중 비트 수 (접근 코드 제외)—
사양 예와 비교—
LT_ADDR 3, ARQN 1, LLID 10(L2CAP 시작), FLOW 1, 데이터 01 02 03 04 05, UAP 0x47. 사양 예는 화이트닝 없이 만든 값이다. 해볼 것: ① DH1과 DM1의 헤더는 TYPE과 HEC만 다르다. ② DM1의 페이로드는 64비트에 0 6개를 붙여 70비트, 15비트 부호어 7개 = 105비트. ③ 화이트닝을 켜고 CLK를 바꾸면 같은 데이터가 매번 다른 비트로 나간다. 검증 스크립트는 Part G §4의 HEC 20개, §5의 CRC, §8의 화이트닝 수열 127비트, §9의 FEC 10개도 확인한다.

헤더 필드: [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 초기값.

HEC와 CRC는 Central의 UAP로 초기화되므로 UAP가 다르면 대개 검사에 실패한다(§7.1). 게다가 도약 커널은 UAP 하위 4비트(A₂₇₋₂₄)도 쓰니 애초에 같은 채널에 있을 때가 드물다.

핵심 정리

  1. 79채널, 625 µs 슬롯 = CLK 2틱, CLK₁ = 0이 Central 슬롯. 연결 도약은 Central의 CLK와 LAP·UAP로 정한다.
  2. 패킷 이름: [2-/3- EDR] D(M = 2/3 FEC | H = FEC 없음)(슬롯 1·3·5). TYPE 4비트의 뜻은 논리 전송과 ptt로 정해진다.
  3. 커널: (X + A) mod 32 → 하위 4비트 ⊕ B → PERM5(C⊕Y1, D) → (+E + F + Y2) mod 79 → 짝수·홀수 순 레지스터.
  4. AFH: 쓰지 않는 채널만 k′ = (PERM5 + E + F′ + Y2) mod N으로 재매핑, Peripheral은 앞 Central 슬롯 채널.
  5. 동기어 = LAP + Barker → PN 덮개 → (64,30) 부호 → PN 다시. 프리앰블·트레일러는 경계를 0101/1010으로.
  6. 헤더 10비트 + HEC(UAP 초기화) → 화이트닝 → 1/3 반복. 페이로드 + CRC(UAP) → 화이트닝 → (DM이면) 2/3 FEC.

확인 퀴즈

연결 상태 도약 커널에서 Central→Peripheral과 Peripheral→Central을 가르는 입력은?

Y1 = CLK₁은 PERM5 제어 C와 XOR되고, Y2 = 32 × CLK₁은 둘째 덧셈에 들어간다.

LAP의 최상위 비트가 1이다. 동기어 정보 부분 끝 6비트(전송 순서)는?

§6.3.3.1. LAP MSB와 붙여 1110010, 길이 7 Barker 수열이 된다.

화이트닝과 FEC의 순서는?

§7.2: “The scrambling shall be performed prior to the FEC encoding.”

DM1에 데이터 5바이트를 실으면 FEC 앞 비트 수와 덧붙이는 0의 수는?

페이로드 헤더 8 + 데이터 40 + CRC 16 = 64, 10의 배수가 되도록 0 6개.