Added BK4819 initialisation.

This commit is contained in:
Dual Tachyon 2023-08-10 11:57:44 +01:00
parent 0d1e0a084c
commit 7659792c4a
5 changed files with 228 additions and 0 deletions

View File

@ -18,6 +18,7 @@ OBJS += $(BLOB_OVERLAY).o
# Drivers
OBJS += driver/adc.o
OBJS += driver/bk1080.o
OBJS += driver/bk4819.o
OBJS += driver/crc.o
OBJS += driver/eeprom.o
OBJS += driver/flash.o

74
driver/bk4819-regs.h Executable file
View File

@ -0,0 +1,74 @@
#ifndef BK4819_REGS_H
#define BK4819_REGS_H
enum BK4819_REGISTER_t {
REG_00 = 0x00U,
REG_06 = 0x06U,
REG_07_CTC_FREQUENCY_CDCSS_BAUD_RATE = 0x07U,
REG_08_CDCSS_CALL_SYMBOL_NUMBER_AND_COEFFICIENT = 0x08U,
REG_09 = 0x09U,
REG_0B_FSK_STATUS = 0x0BU,
REG_0C_CDCSS_CTCSS_STATUS_VOX_SQ_INTR_INDICATOR = 0x0CU,
REG_0D_FREQUENCY_SCAN_INDICATOR_FREQ_HIGH = 0x0DU,
REG_0E_FREQUENCY_SCAN_FREQ_LOW = 0x0EU,
REG_10 = 0x10U,
REG_11 = 0x11U,
REG_12 = 0x12U,
REG_13 = 0x13U,
REG_14 = 0x14U,
REG_19 = 0x19U,
REG_1F = 0x1FU,
REG_20 = 0x20U,
REG_24_DTMF_SELCALL_CONFIG = 0x24U,
REG_28_EXPANDER_CONFIG = 0x28U,
REG_29_COMPRESS_CONFIG = 0x29U,
REG_2B_AF_FILTER_DISABLE = 0x2BU,
REG_30_VARIOUS_ENABLE_BITS = 0x30U,
REG_31_ENABLE_COMPANDER_VOX_SCRAMBLE = 0x31U,
REG_32_FREQUENCY_SCAN = 0x32U,
REG_33 = 0x33U,
REG_36_POWER_AMPLIFIER_BIAS_AND_GAIN = 0x36U,
REG_37_VOLTATE_LDO_AND_MISC_ENABLE = 0x37U,
REG_38_FREQUENCY_LOW = 0x38U,
REG_39_FREQUENCY_HIGH = 0x39U,
REG_3A_RSSI_THRESHOLD_FOR_SQ1_SQ0 = 0x3AU,
REG_3B_XTAL_FREQ_LOW = 0x3BU,
REG_3C_XTAL_FREQ_HIGH = 0x3CU,
REG_3E = 0x3EU,
REG_3F_INTERRUPT_ENABLE = 0x3FU,
REG_43_RF_AFT_LPF2_FILTER_BANDWIDTH = 0x43U,
REG_46_VOICE_AMPLITUDE_THRESHOLD_VOX1 = 0x46U,
REG_48_AF_RF_GAIN_DAC_GAIN = 0x48U,
REG_49 = 0x49U,
REG_4D_GLITCH_THR_SQ0 = 0x4DU,
REG_4E_SQ1_DELAY_SQ0_DELAY_GLITCH_THR_SQ1 = 0x4EU,
REG_4F_EXNOISE_THR_SQ0_EXNOISE_THR_SQ1 = 0x4FU,
REG_51_CTCSS_CDCSS_CONFIG = 0x51U,
REG_58_FSK_CONFIG_BITS = 0x58U,
REG_59_VARIOUS_FSK_ENABLE_AND_CONFIG_BITS = 0x59U,
REG_5A_FSK_SYNC_BYTES_0_1 = 0x5AU,
REG_5B_FSK_SYNC_BYTES_2_3 = 0x5BU,
REG_5C_CRC_ENABLE_AND_UNKNOWN_BITS = 0x5CU,
REG_5D_FSK_DATA_LENGTH = 0x5DU,
REG_5F_FSK_WORD_INPUT_OUTPUT = 0x5FU,
REG_64_VOXAMP = 0x64U,
REG_67_RSSI = 0x67U,
REG_68_CTCSS_SCAN_INDICATOR_FREQ = 0x68U,
REG_69_CDCSS_SCAN_INDICATOR_FREQ_HIGH = 0x69U,
REG_6A_CDCSS_SCAN_FREQ_LOW = 0x6AU,
REG_6F_AF_TX_RX_INPUT_AMPLITUDE = 0x6FU,
REG_70_TONE1_CONFIG = 0x70U,
REG_71_TONE1_SCRAMBLE_FREQ_CONTROL_WORD = 0x71U,
REG_72_TONE2_FSK_FREQUENCY_CONTROL_WORD = 0x72U,
REG_79_VOX1_DETECTION_INTERVAL_TIME_VOICE_AMPLITUDE_THRESHOLD_VOX0 = 0x79U,
REG_7A_VOX0_DETECTION_DELAY = 0x7AU,
REG_7B = 0x7BU,
REG_7C = 0x7CU,
REG_7D_MIC_SENSITIVITY_TUNING = 0x7DU,
REG_7E_DC_FILTER_BANDWIDTH_AND_AGC_FIX = 0x7EU,
};
typedef enum BK4819_REGISTER_t BK4819_REGISTER_t;
#endif

129
driver/bk4819.c Executable file
View File

@ -0,0 +1,129 @@
#include "bk4819.h"
#include "bsp/dp32g030/gpio.h"
#include "driver/gpio.h"
#include "driver/systick.h"
uint16_t gBK4819_GpioOutState;
void BK4819_Init(void)
{
GPIO_SetBit(&GPIOC->DATA, 0);
GPIO_SetBit(&GPIOC->DATA, 1);
GPIO_SetBit(&GPIOC->DATA, 2);
BK4819_WriteRegister(REG_00, 0x8000);
BK4819_WriteRegister(REG_00, 0x0000);
BK4819_WriteRegister(REG_37_VOLTATE_LDO_AND_MISC_ENABLE, 0x1D0F);
BK4819_WriteRegister(REG_36_POWER_AMPLIFIER_BIAS_AND_GAIN, 0x0022);
BK4819_SetAGC(0);
BK4819_WriteRegister(REG_19, 0x1041);
BK4819_WriteRegister(REG_7D_MIC_SENSITIVITY_TUNING, 0xE940);
BK4819_WriteRegister(REG_48_AF_RF_GAIN_DAC_GAIN, 0xB3A8);
BK4819_WriteRegister(REG_09, 0x006F);
BK4819_WriteRegister(REG_09, 0x106B);
BK4819_WriteRegister(REG_09, 0x2067);
BK4819_WriteRegister(REG_09, 0x3062);
BK4819_WriteRegister(REG_09, 0x4050);
BK4819_WriteRegister(REG_09, 0x5047);
BK4819_WriteRegister(REG_09, 0x603A);
BK4819_WriteRegister(REG_09, 0x702C);
BK4819_WriteRegister(REG_09, 0x8041);
BK4819_WriteRegister(REG_09, 0x9037);
BK4819_WriteRegister(REG_09, 0xA025);
BK4819_WriteRegister(REG_09, 0xB017);
BK4819_WriteRegister(REG_09, 0xC0E4);
BK4819_WriteRegister(REG_09, 0xD0CB);
BK4819_WriteRegister(REG_09, 0xE0B5);
BK4819_WriteRegister(REG_09, 0xF09F);
BK4819_WriteRegister(REG_1F, 0x5454);
BK4819_WriteRegister(REG_3E, 0xA037);
gBK4819_GpioOutState = 0x9000;
BK4819_WriteRegister(REG_33, 0x9000);
BK4819_WriteRegister(REG_3F_INTERRUPT_ENABLE, 0);
}
void BK4819_WriteRegister(BK4819_REGISTER_t Register, uint16_t Data)
{
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_BK4819_0);
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_BK4819_1);
SYSTICK_DelayUs(1);
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_BK4819_0);
BK4819_WriteU8(Register);
SYSTICK_DelayUs(1);
BK4819_WriteU16(Data);
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_BK4819_0);
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_BK4819_1);
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_BK4819_2);
}
void BK4819_WriteU8(uint8_t Data)
{
uint8_t i;
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_BK4819_1);
for (i = 0; i < 8; i++) {
if ((Data & 0x80U) == 0) {
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_BK4819_2);
} else {
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_BK4819_2);
}
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_BK4819_1);
SYSTICK_DelayUs(1);
Data <<= 1;
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_BK4819_1);
SYSTICK_DelayUs(1);
}
}
void BK4819_WriteU16(uint16_t Data)
{
uint8_t i;
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_BK4819_1);
for (i = 0; i < 16; i++) {
if ((Data & 0x8000U) == 0U) {
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_BK4819_2);
} else {
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_BK4819_2);
}
SYSTICK_DelayUs(1);
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_BK4819_1);
Data <<= 1;
SYSTICK_DelayUs(1);
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_BK4819_1);
SYSTICK_DelayUs(1);
}
}
void BK4819_SetAGC(uint8_t Value)
{
if (Value == 0) {
BK4819_WriteRegister(REG_13, 0x03BE);
BK4819_WriteRegister(REG_12, 0x037B);
BK4819_WriteRegister(REG_11, 0x027B);
BK4819_WriteRegister(REG_10, 0x007A);
BK4819_WriteRegister(REG_14, 0x0019);
BK4819_WriteRegister(REG_49, 0x2A38);
BK4819_WriteRegister(REG_7B, 0x8420);
} else if (Value == 1) {
uint8_t i;
BK4819_WriteRegister(REG_13, 0x03BE);
BK4819_WriteRegister(REG_12, 0x037C);
BK4819_WriteRegister(REG_11, 0x027B);
BK4819_WriteRegister(REG_10, 0x007A);
BK4819_WriteRegister(REG_14, 0x0018);
BK4819_WriteRegister(REG_49, 0x2A38);
BK4819_WriteRegister(REG_7B, 0x318C);
BK4819_WriteRegister(REG_7C, 0x595E);
BK4819_WriteRegister(REG_20, 0x8DEF);
for (i = 0; i < 8; i++) {
// Bug? The bit 0x2000 below overwrites the (i << 13)
BK4819_WriteRegister(REG_06, ((i << 13) | 0x2500U) + 0x36U);
}
}
}

15
driver/bk4819.h Executable file
View File

@ -0,0 +1,15 @@
#ifndef DRIVER_BK4819_h
#define DRIVER_BK4819_h
#include <stdint.h>
#include "driver/bk4819-regs.h"
void BK4819_Init(void);
void BK4819_WriteRegister(BK4819_REGISTER_t Register, uint16_t Data);
void BK4819_WriteU8(uint8_t Data);
void BK4819_WriteU16(uint16_t Data);
void BK4819_SetAGC(uint8_t Value);
#endif

9
main.c
View File

@ -22,6 +22,7 @@
#include "bsp/dp32g030/syscon.h"
#include "board.h"
#include "driver/crc.h"
#include "driver/bk4819.h"
#include "driver/eeprom.h"
#include "driver/flash.h"
#include "driver/gpio.h"
@ -79,6 +80,14 @@ void Main(void)
UART_Init();
UART_Send(Version, sizeof(Version));
// Not implementing authentic device checks
// TODO: EEPROM Init
BK4819_Init();
// Below this line is development/test area not conforming to the original firmware
// Show some signs of life
FLASHLIGHT_Init();
FLASHLIGHT_TurnOn();