2017년 1월 17일 화요일

아두이노 듀에에서 TRNG(True Random Number Generator) 사용하기

아두이노 듀에는 ATMEL의 SAM3X8E (ARM Cortex M3)를 사용하는데 이 칩은 하드웨어 TRNG(True Random Number Generator)를 가지고 있다.
아두이노 환경에서 이 TRNG를 사용하는 방법을 소개한다.



가장 간단한 방법은 다음과 같다.

void setup()

  Serial.begin(115200);
  pmc_enable_periph_clk(ID_TRNG);
  trng_enable(TRNG);
}

void loop()
{
  uint32_t t = trng_read_output_data(TRNG);
  Serial.println(t);
  delay(50);
}

pmc_enable_periph_clk 는 hardware/arduino/sam/system/libsam/source/pmc.c 에 정의되어 있고 trng_enable(), trng_read_output_data() 는 hardware/arduino/system/libsam/source/trng.c 에 정의되어 있다. 엄밀히 말하면 데이터를 읽기 전에 random number generator에서 데이터를 읽을 수 있을 때 까지 기다려야 한다. 하지만 SAM3X8E의 TRNG가 빠르기 때문에 (매 84 클럭 사이클마다 랜덤넘버 하나를 생성) 따로 기다리지 않아도 안전하다. 위의 코드에서 생성된 랜덤 넘버는 unsigned 32비트 숫자로 취급한다.

다른 방법으로는 TRNG 인터럽트를 활성화해서 랜덤넘버가 생성될 때 마다 인터럽트가 그 값을 처리하도록 할 수도 있다.

void setup()

  Serial.begin(115200);
  pmc_enable_periph_clk(ID_TRNG);
  trng_enable(TRNG);

  NVIC_DisableIRQ(TRNG_IRQn);
  NVIC_ClearPendingIRQ(TRNG_IRQn);
  NVIC_SetPriority(TRNG_IRQn, 0);
  NVIC_EnableIRQ(TRNG_IRQn);
  trng_enable_interrupt(TRNG);
}

void TRNG_Handler(void)
{
  uint32_t stat = trng_get_interrupt_status(TRNG);

  if ((stat & TRNG_ISR_DATRDY) == TRNG_ISR_DATRDY) {
    int r = trng_read_output_data(TRNG);
    Serial.println(r);
  }
}

void loop()
{
}

여기서는 TRNG ISR의 상태를 확인해 랜덤넘버를 읽기 전에 값이 생성되었는지 본다. trng_read_output_data 가 리턴하는 값은 signed 또는 unsigned로 해석해도 상관 없다. 위의 예제에서는 signed 32비트 integer로 처리하기 때문에 랜덤값은 0을 기준으로 위/아래로 균등하게 분포하고 있다. NVIC_* 루틴은 hardware/arduino/sam/system/CMSIS/CMSIS/Include/core_cm3.h 에 inline 되어 있다.

데이터쉬트를 보면 SAM3X8E의 TRNG는 American NIST Special Publication 800-22와 Diehard Random Tests를 통과했다고 쓰여 있다.

2017년 1월 5일 목요일

라즈베리 파이 제로 테스트 패드 배치 (Raspberry Pi Test Pad Layout)

라즈베리 파이 제로는 크기가 작다 보니 제대로(?) 활용을 하려면 주변에 몇가지 장치들을 붙여줘야 한다. 특히 USB 허브를 붙이려고 할 때 USB 케이블을 이용하면 케이블이 옆으로 튀어나와 보기에도 안좋고 케이블이 빠지기도 쉽다.
그래서 해결책은 보드의 아래쪽 면에 테스트 패드들을 활용하는 것이다. 기본적인 전원 신호, USB 데이터 신호선, SD카드 신호선들이 나와 있어 이 패드에 납땜을 하거나 아니면 좀 더 깔끔한 방법으로는 스프링이 들어있는 pogo pin을 이용하면 바깥쪽으로 튀어나온 케이블 없이 깔끔하게 주변회로를 부착할 수 있다.

USB 무선랜 동글을 직접 납땜





스프링이 달려 있는 pogo pin으로 납땜하지 않고 연결



Test pad의 위치는 다음과 같다.

라즈베리 파이 제로 v1.2 (클릭하면 크게 확대해 볼 수 있음)

라즈베리 파이 제로 v1.3 (클릭하면 크게 확대해 볼 수 있음)

주의할 것은 라즈베리 파이 v1.2와 v1.3의 테스트 패드 위치가 다르다. v1.2는 카메라 커넥터가 없는 초기모델이고 v1.3은 카메라 커넥터가 붙어있는 모델이다. 최근에 구입한 사람이라면 대부분 v1.3이겠지만 인터넷에서 pogo pin으로 연결하는 보드를 구입하는 경우 버젼을 꼭 확인하고 구입해야만 한다.

USB 허브를 연결하려면 PP1, PP6, PP22, PP23에 각각 +5V, GND, D+, D- 선을 연결해 주면 된다.
반대로 전원 공급을 마이크로USB 케이블을 이용하지 않고 라즈베리 파이에 직접 공급하고 싶은 경우에도 PP1, PP6에 +5V, GND를 연결해 줘도 된다.