common binary support
This commit is contained in:
@@ -1,5 +1,12 @@
|
|||||||
2015-07-15 Niibe Yutaka <gniibe@fsij.org>
|
2015-07-15 Niibe Yutaka <gniibe@fsij.org>
|
||||||
|
|
||||||
|
* src/flash.c: Detect flash_page_size at runtime.
|
||||||
|
|
||||||
|
* src/main.c: Remove dependency to board.h.
|
||||||
|
|
||||||
|
* src/neug.c: Update from NeuG 1.0.2.
|
||||||
|
* src/adc_stm32f103.c: Update.
|
||||||
|
|
||||||
* chopstx: Update to 0.07.
|
* chopstx: Update to 0.07.
|
||||||
* src/sys.c: Update.
|
* src/sys.c: Update.
|
||||||
* src/sys.h: Update.
|
* src/sys.h: Update.
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
* In this ADC driver, there are NeuG specific parts.
|
* In this ADC driver, there are NeuG specific parts.
|
||||||
* You need to modify to use this as generic ADC driver.
|
* You need to modify to use this as generic ADC driver.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011, 2012, 2013 Free Software Initiative of Japan
|
* Copyright (C) 2011, 2012, 2013, 2015
|
||||||
|
* Free Software Initiative of Japan
|
||||||
* Author: NIIBE Yutaka <gniibe@fsij.org>
|
* Author: NIIBE Yutaka <gniibe@fsij.org>
|
||||||
*
|
*
|
||||||
* This file is a part of NeuG, a True Random Number Generator
|
* This file is a part of NeuG, a True Random Number Generator
|
||||||
@@ -32,6 +33,8 @@
|
|||||||
#include "stm32f103.h"
|
#include "stm32f103.h"
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#define NEUG_CRC32_COUNTS 4
|
#define NEUG_CRC32_COUNTS 4
|
||||||
|
|
||||||
#define STM32_ADC_ADC1_DMA_PRIORITY 2
|
#define STM32_ADC_ADC1_DMA_PRIORITY 2
|
||||||
@@ -92,15 +95,6 @@
|
|||||||
| ADC_SQR3_SQ4_N(ADC_CHANNEL_VREFINT)
|
| ADC_SQR3_SQ4_N(ADC_CHANNEL_VREFINT)
|
||||||
#define NEUG_ADC_SETTING1_NUM_CHANNELS 4
|
#define NEUG_ADC_SETTING1_NUM_CHANNELS 4
|
||||||
|
|
||||||
#if !defined(NEUG_ADC_SETTING2_SMPR1)
|
|
||||||
#define NEUG_ADC_SETTING2_SMPR1 0
|
|
||||||
#define NEUG_ADC_SETTING2_SMPR2 ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5) \
|
|
||||||
| ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5)
|
|
||||||
#define NEUG_ADC_SETTING2_SQR3 ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0) \
|
|
||||||
| ADC_SQR3_SQ2_N(ADC_CHANNEL_IN1)
|
|
||||||
#define NEUG_ADC_SETTING2_NUM_CHANNELS 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do calibration for both of ADCs.
|
* Do calibration for both of ADCs.
|
||||||
@@ -133,9 +127,67 @@ void adc_init (void)
|
|||||||
RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN);
|
RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "sys.h"
|
||||||
|
#if defined(HAVE_SYS_H)
|
||||||
|
# define SYS_BOARD_ID sys_board_id
|
||||||
|
#else
|
||||||
|
# include "board.h"
|
||||||
|
# define SYS_BOARD_ID BOARD_ID
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_adc_config (uint32_t config[4])
|
||||||
|
{
|
||||||
|
config[2] = ADC_SQR1_NUM_CH(2);
|
||||||
|
switch (SYS_BOARD_ID)
|
||||||
|
{
|
||||||
|
case BOARD_ID_FST_01:
|
||||||
|
config[0] = 0;
|
||||||
|
config[1] = ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5)
|
||||||
|
| ADC_SMPR2_SMP_AN9(ADC_SAMPLE_1P5);
|
||||||
|
config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0)
|
||||||
|
| ADC_SQR3_SQ2_N(ADC_CHANNEL_IN9);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOARD_ID_OLIMEX_STM32_H103:
|
||||||
|
case BOARD_ID_STBEE:
|
||||||
|
config[0] = ADC_SMPR1_SMP_AN10(ADC_SAMPLE_1P5)
|
||||||
|
| ADC_SMPR1_SMP_AN11(ADC_SAMPLE_1P5);
|
||||||
|
config[1] = 0;
|
||||||
|
config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN10)
|
||||||
|
| ADC_SQR3_SQ2_N(ADC_CHANNEL_IN11);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOARD_ID_STBEE_MINI:
|
||||||
|
config[0] = 0;
|
||||||
|
config[1] = ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5)
|
||||||
|
| ADC_SMPR2_SMP_AN2(ADC_SAMPLE_1P5);
|
||||||
|
config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN1)
|
||||||
|
| ADC_SQR3_SQ2_N(ADC_CHANNEL_IN2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOARD_ID_CQ_STARM:
|
||||||
|
case BOARD_ID_FST_01_00:
|
||||||
|
case BOARD_ID_MAPLE_MINI:
|
||||||
|
case BOARD_ID_STM32_PRIMER2:
|
||||||
|
case BOARD_ID_STM8S_DISCOVERY:
|
||||||
|
default:
|
||||||
|
config[0] = 0;
|
||||||
|
config[1] = ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5)
|
||||||
|
| ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5);
|
||||||
|
config[3] = ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0)
|
||||||
|
| ADC_SQR3_SQ2_N(ADC_CHANNEL_IN1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void adc_start (void)
|
void adc_start (void)
|
||||||
{
|
{
|
||||||
|
uint32_t config[4];
|
||||||
|
|
||||||
|
get_adc_config (config);
|
||||||
|
|
||||||
/* Use DMA channel 1. */
|
/* Use DMA channel 1. */
|
||||||
RCC->AHBENR |= RCC_AHBENR_DMA1EN;
|
RCC->AHBENR |= RCC_AHBENR_DMA1EN;
|
||||||
DMA1_Channel1->CCR = STM32_DMA_CCR_RESET_VALUE;
|
DMA1_Channel1->CCR = STM32_DMA_CCR_RESET_VALUE;
|
||||||
@@ -156,11 +208,11 @@ void adc_start (void)
|
|||||||
ADC2->CR1 = (ADC_CR1_DUALMOD_2 | ADC_CR1_DUALMOD_1 | ADC_CR1_DUALMOD_0
|
ADC2->CR1 = (ADC_CR1_DUALMOD_2 | ADC_CR1_DUALMOD_1 | ADC_CR1_DUALMOD_0
|
||||||
| ADC_CR1_SCAN);
|
| ADC_CR1_SCAN);
|
||||||
ADC2->CR2 = ADC_CR2_EXTTRIG | ADC_CR2_CONT | ADC_CR2_ADON;
|
ADC2->CR2 = ADC_CR2_EXTTRIG | ADC_CR2_CONT | ADC_CR2_ADON;
|
||||||
ADC2->SMPR1 = NEUG_ADC_SETTING2_SMPR1;
|
ADC2->SMPR1 = config[0];
|
||||||
ADC2->SMPR2 = NEUG_ADC_SETTING2_SMPR2;
|
ADC2->SMPR2 = config[1];
|
||||||
ADC2->SQR1 = ADC_SQR1_NUM_CH(NEUG_ADC_SETTING2_NUM_CHANNELS);
|
ADC2->SQR1 = config[2];
|
||||||
ADC2->SQR2 = 0;
|
ADC2->SQR2 = 0;
|
||||||
ADC2->SQR3 = NEUG_ADC_SETTING2_SQR3;
|
ADC2->SQR3 = config[3];
|
||||||
|
|
||||||
#ifdef DELIBARATELY_DO_IT_WRONG_START_STOP
|
#ifdef DELIBARATELY_DO_IT_WRONG_START_STOP
|
||||||
/*
|
/*
|
||||||
|
|||||||
46
src/flash.c
46
src/flash.c
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* flash.c -- Data Objects (DO) and GPG Key handling on Flash ROM
|
* flash.c -- Data Objects (DO) and GPG Key handling on Flash ROM
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010, 2011, 2012, 2013, 2014
|
* Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015
|
||||||
* Free Software Initiative of Japan
|
* Free Software Initiative of Japan
|
||||||
* Author: NIIBE Yutaka <gniibe@fsij.org>
|
* Author: NIIBE Yutaka <gniibe@fsij.org>
|
||||||
*
|
*
|
||||||
@@ -35,7 +35,6 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "board.h"
|
|
||||||
#include "sys.h"
|
#include "sys.h"
|
||||||
#include "gnuk.h"
|
#include "gnuk.h"
|
||||||
|
|
||||||
@@ -65,7 +64,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define FLASH_DATA_POOL_HEADER_SIZE 2
|
#define FLASH_DATA_POOL_HEADER_SIZE 2
|
||||||
#define FLASH_DATA_POOL_SIZE (FLASH_PAGE_SIZE*2)
|
#define FLASH_DATA_POOL_SIZE (flash_page_size*2)
|
||||||
|
|
||||||
|
static uint16_t flash_page_size;
|
||||||
|
|
||||||
static const uint8_t *data_pool;
|
static const uint8_t *data_pool;
|
||||||
extern uint8_t _keystore_pool;
|
extern uint8_t _keystore_pool;
|
||||||
@@ -99,22 +100,30 @@ static int key_available_at (const uint8_t *k, int key_size)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define CHIP_ID_REG ((uint32_t *)0xe0042000)
|
||||||
const uint8_t *
|
const uint8_t *
|
||||||
flash_init (void)
|
flash_init (void)
|
||||||
{
|
{
|
||||||
uint16_t gen0, gen1;
|
uint16_t gen0, gen1;
|
||||||
uint16_t *gen0_p = (uint16_t *)&_data_pool;
|
uint16_t *gen0_p = (uint16_t *)&_data_pool;
|
||||||
uint16_t *gen1_p = (uint16_t *)(&_data_pool + FLASH_PAGE_SIZE);
|
uint16_t *gen1_p;
|
||||||
|
|
||||||
|
flash_page_size = 1024;
|
||||||
|
if (((*CHIP_ID_REG) & 0xfff) == 0x0414)
|
||||||
|
flash_page_size = 2048;
|
||||||
|
|
||||||
|
gen1_p = (uint16_t *)(&_data_pool + flash_page_size);
|
||||||
|
|
||||||
/* Check data pool generation and choose the page */
|
/* Check data pool generation and choose the page */
|
||||||
gen0 = *gen0_p;
|
gen0 = *gen0_p;
|
||||||
gen1 = *gen1_p;
|
gen1 = *gen1_p;
|
||||||
if (gen0 == 0xffff)
|
if (gen0 == 0xffff)
|
||||||
data_pool = &_data_pool + FLASH_PAGE_SIZE;
|
data_pool = &_data_pool + flash_page_size;
|
||||||
else if (gen1 == 0xffff)
|
else if (gen1 == 0xffff)
|
||||||
data_pool = &_data_pool;
|
data_pool = &_data_pool;
|
||||||
else if (gen1 > gen0)
|
else if (gen1 > gen0)
|
||||||
data_pool = &_data_pool + FLASH_PAGE_SIZE;
|
data_pool = &_data_pool + flash_page_size;
|
||||||
else
|
else
|
||||||
data_pool = &_data_pool;
|
data_pool = &_data_pool;
|
||||||
|
|
||||||
@@ -135,7 +144,7 @@ flash_init_keys (void)
|
|||||||
int key_size = gpg_get_algo_attr_key_size (i, GPG_KEY_STORAGE);
|
int key_size = gpg_get_algo_attr_key_size (i, GPG_KEY_STORAGE);
|
||||||
|
|
||||||
kd[i].pubkey = NULL;
|
kd[i].pubkey = NULL;
|
||||||
for (k = p; k < p + FLASH_PAGE_SIZE; k += key_size)
|
for (k = p; k < p + flash_page_size; k += key_size)
|
||||||
if (key_available_at (k, key_size))
|
if (key_available_at (k, key_size))
|
||||||
{
|
{
|
||||||
int prv_len = gpg_get_algo_attr_key_size (i, GPG_KEY_PRIVATE);
|
int prv_len = gpg_get_algo_attr_key_size (i, GPG_KEY_PRIVATE);
|
||||||
@@ -144,7 +153,7 @@ flash_init_keys (void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
p += FLASH_PAGE_SIZE;
|
p += flash_page_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,11 +198,11 @@ flash_copying_gc (void)
|
|||||||
if (data_pool == &_data_pool)
|
if (data_pool == &_data_pool)
|
||||||
{
|
{
|
||||||
src = &_data_pool;
|
src = &_data_pool;
|
||||||
dst = &_data_pool + FLASH_PAGE_SIZE;
|
dst = &_data_pool + flash_page_size;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
src = &_data_pool + FLASH_PAGE_SIZE;
|
src = &_data_pool + flash_page_size;
|
||||||
dst = &_data_pool;
|
dst = &_data_pool;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,7 +217,7 @@ flash_copying_gc (void)
|
|||||||
static int
|
static int
|
||||||
is_data_pool_full (size_t size)
|
is_data_pool_full (size_t size)
|
||||||
{
|
{
|
||||||
return last_p + size > data_pool + FLASH_PAGE_SIZE;
|
return last_p + size > data_pool + flash_page_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t *
|
static uint8_t *
|
||||||
@@ -322,7 +331,7 @@ static uint8_t *
|
|||||||
flash_key_getpage (enum kind_of_key kk)
|
flash_key_getpage (enum kind_of_key kk)
|
||||||
{
|
{
|
||||||
/* There is a page for each KK. */
|
/* There is a page for each KK. */
|
||||||
return &_keystore_pool + (FLASH_PAGE_SIZE * kk);
|
return &_keystore_pool + (flash_page_size * kk);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *
|
uint8_t *
|
||||||
@@ -333,7 +342,7 @@ flash_key_alloc (enum kind_of_key kk)
|
|||||||
int key_size = gpg_get_algo_attr_key_size (kk, GPG_KEY_STORAGE);
|
int key_size = gpg_get_algo_attr_key_size (kk, GPG_KEY_STORAGE);
|
||||||
|
|
||||||
/* Seek free space in the page. */
|
/* Seek free space in the page. */
|
||||||
for (k = k0; k < k0 + FLASH_PAGE_SIZE; k += key_size)
|
for (k = k0; k < k0 + flash_page_size; k += key_size)
|
||||||
{
|
{
|
||||||
const uint32_t *p = (const uint32_t *)k;
|
const uint32_t *p = (const uint32_t *)k;
|
||||||
|
|
||||||
@@ -382,10 +391,10 @@ flash_key_write (uint8_t *key_addr,
|
|||||||
static int
|
static int
|
||||||
flash_check_all_other_keys_released (const uint8_t *key_addr, int key_size)
|
flash_check_all_other_keys_released (const uint8_t *key_addr, int key_size)
|
||||||
{
|
{
|
||||||
uint32_t start = (uint32_t)key_addr & ~(FLASH_PAGE_SIZE - 1);
|
uint32_t start = (uint32_t)key_addr & ~(flash_page_size - 1);
|
||||||
const uint32_t *p = (const uint32_t *)start;
|
const uint32_t *p = (const uint32_t *)start;
|
||||||
|
|
||||||
while (p < (const uint32_t *)(start + FLASH_PAGE_SIZE))
|
while (p < (const uint32_t *)(start + flash_page_size))
|
||||||
if (p == (const uint32_t *)key_addr)
|
if (p == (const uint32_t *)key_addr)
|
||||||
p += key_size/4;
|
p += key_size/4;
|
||||||
else
|
else
|
||||||
@@ -411,7 +420,7 @@ void
|
|||||||
flash_key_release (uint8_t *key_addr, int key_size)
|
flash_key_release (uint8_t *key_addr, int key_size)
|
||||||
{
|
{
|
||||||
if (flash_check_all_other_keys_released (key_addr, key_size))
|
if (flash_check_all_other_keys_released (key_addr, key_size))
|
||||||
flash_erase_page (((uint32_t)key_addr & ~(FLASH_PAGE_SIZE - 1)));
|
flash_erase_page (((uint32_t)key_addr & ~(flash_page_size - 1)));
|
||||||
else
|
else
|
||||||
flash_key_fill_zero_as_released (key_addr, key_size);
|
flash_key_fill_zero_as_released (key_addr, key_size);
|
||||||
}
|
}
|
||||||
@@ -619,9 +628,8 @@ flash_erase_binary (uint8_t file_id)
|
|||||||
if (flash_check_blank (p, FLASH_CH_CERTIFICATE_SIZE) == 0)
|
if (flash_check_blank (p, FLASH_CH_CERTIFICATE_SIZE) == 0)
|
||||||
{
|
{
|
||||||
flash_erase_page ((uint32_t)p);
|
flash_erase_page ((uint32_t)p);
|
||||||
#if FLASH_CH_CERTIFICATE_SIZE > FLASH_PAGE_SIZE
|
if (FLASH_CH_CERTIFICATE_SIZE > flash_page_size)
|
||||||
flash_erase_page ((uint32_t)p + FLASH_PAGE_SIZE);
|
flash_erase_page ((uint32_t)p + flash_page_size);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -28,7 +28,6 @@
|
|||||||
#include <eventflag.h>
|
#include <eventflag.h>
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "board.h"
|
|
||||||
|
|
||||||
#include "sys.h"
|
#include "sys.h"
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
@@ -426,15 +425,20 @@ main (int argc, char *argv[])
|
|||||||
#ifdef DFU_SUPPORT
|
#ifdef DFU_SUPPORT
|
||||||
#define FLASH_SYS_START_ADDR 0x08000000
|
#define FLASH_SYS_START_ADDR 0x08000000
|
||||||
#define FLASH_SYS_END_ADDR (0x08000000+0x1000)
|
#define FLASH_SYS_END_ADDR (0x08000000+0x1000)
|
||||||
|
#define CHIP_ID_REG ((uint32_t *)0xE0042000)
|
||||||
{
|
{
|
||||||
extern uint8_t _sys;
|
extern uint8_t _sys;
|
||||||
uint32_t addr;
|
uint32_t addr;
|
||||||
handler *new_vector = (handler *)FLASH_SYS_START_ADDR;
|
handler *new_vector = (handler *)FLASH_SYS_START_ADDR;
|
||||||
void (*func) (void (*)(void)) = (void (*)(void (*)(void)))new_vector[9];
|
void (*func) (void (*)(void)) = (void (*)(void (*)(void)))new_vector[9];
|
||||||
|
uint32_t flash_page_size = 1024; /* 1KiB default */
|
||||||
|
|
||||||
|
if ((*CHIP_ID_ADDR)&0x07 == 0x04) /* High dencity device. */
|
||||||
|
flash_page_size = 2048; /* It's 2KiB. */
|
||||||
|
|
||||||
/* Kill DFU */
|
/* Kill DFU */
|
||||||
for (addr = FLASH_SYS_START_ADDR; addr < FLASH_SYS_END_ADDR;
|
for (addr = FLASH_SYS_START_ADDR; addr < FLASH_SYS_END_ADDR;
|
||||||
addr += FLASH_PAGE_SIZE)
|
addr += flash_page_size)
|
||||||
flash_erase_page (addr);
|
flash_erase_page (addr);
|
||||||
|
|
||||||
/* copy system service routines */
|
/* copy system service routines */
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ static int ep_process (int mode)
|
|||||||
CRC->DR = adc_buf[i*4 + 1];
|
CRC->DR = adc_buf[i*4 + 1];
|
||||||
CRC->DR = adc_buf[i*4 + 2];
|
CRC->DR = adc_buf[i*4 + 2];
|
||||||
CRC->DR = adc_buf[i*4 + 3];
|
CRC->DR = adc_buf[i*4 + 3];
|
||||||
v = CRC->DR & 0xff;
|
v = CRC->DR & 0xff; /* First byte of CRC->DR is used here. */
|
||||||
noise_source_continuous_test (v);
|
noise_source_continuous_test (v);
|
||||||
sha256_ctx_data.wbuf[i] = v;
|
sha256_ctx_data.wbuf[i] = v;
|
||||||
ep_init (NEUG_MODE_CONDITIONED); /* The rest three-byte of
|
ep_init (NEUG_MODE_CONDITIONED); /* The rest three-byte of
|
||||||
@@ -280,8 +280,6 @@ uint16_t neug_rc_max;
|
|||||||
uint16_t neug_p64_max;
|
uint16_t neug_p64_max;
|
||||||
uint16_t neug_p4k_max;
|
uint16_t neug_p4k_max;
|
||||||
|
|
||||||
#include "board.h"
|
|
||||||
|
|
||||||
static void noise_source_cnt_max_reset (void)
|
static void noise_source_cnt_max_reset (void)
|
||||||
{
|
{
|
||||||
neug_err_cnt = neug_err_cnt_rc = neug_err_cnt_p64 = neug_err_cnt_p4k = 0;
|
neug_err_cnt = neug_err_cnt_rc = neug_err_cnt_p64 = neug_err_cnt_p4k = 0;
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
#define NEUG_PRE_LOOP 32
|
#define NEUG_PRE_LOOP 32
|
||||||
|
|
||||||
#define NEUG_MODE_CONDITIONED 0
|
#define NEUG_MODE_CONDITIONED 0 /* Conditioned data. */
|
||||||
#define NEUG_MODE_RAW 1
|
#define NEUG_MODE_RAW 1 /* CRC-32 filtered sample data. */
|
||||||
#define NEUG_MODE_RAW_DATA 2
|
#define NEUG_MODE_RAW_DATA 2 /* Sample data directly. */
|
||||||
|
|
||||||
extern uint8_t neug_mode;
|
extern uint8_t neug_mode;
|
||||||
extern uint16_t neug_err_cnt;
|
extern uint16_t neug_err_cnt;
|
||||||
|
|||||||
Reference in New Issue
Block a user