chore: clock stuff, wlan

This commit is contained in:
2024-12-08 05:12:47 +06:00
parent 2f5f9dfe40
commit 42f1e255e8
4 changed files with 1184 additions and 33 deletions

View File

@@ -1,39 +1,258 @@
#include <stdint.h>
#include <strings.h>
#include "rtl8710bx.h"
extern uint32_t DiagPrintf(const char *fmt, ...)
__attribute__((format(printf, 1, 2)));
extern void DelayMs(uint32_t ms);
#define printf DiagPrintf
static inline void delay_cycles(unsigned int count) {
__asm volatile(
"1: \n"
" subs %[count], %[count], #1 \n"
" bne 1b \n"
: [count] "+r"(count)
:
: "cc");
typedef struct {
char ssid[33];
uint8_t bssid[6];
uint8_t channel;
int8_t rssi;
} Network_Info_t;
static void wifi_init(void) {
PERI_ON->PESOC_CLK_CTRL |=
BIT_SOC_ACTCK_BTCMD_EN | BIT_SOC_ACTCK_VENDOR_REG_EN;
PERI_ON->SOC_HCI_COM_FUNC_EN |= BIT_SOC_HCI_WL_MACON_EN;
WIFI->SYS.FUNC_EN |= FEN_MREGEN;
WIFI->SYS.APS_FSMCO |= APFM_ONMAC;
WIFI->SYS.APS_FSMCO &= ~SUS_HOST;
WIFI->SYS.ISO_CTRL &= ~PWC_EV12V;
// printf("waiting for APS_FSMCO\n");
// while (!(wifi->SYS.APS_FSMCO & RDY_MACON));
// printf("RDY_MACON\n");
WIFI->WMAC.RCR |= (BM_DATA_EN | UC_DATA_EN); // broadcast, unicast
WIFI->MAC.CR |= MACRXEN; // en RX
}
static inline void delay_ms(unsigned int ms) {
for (unsigned int i = 0; i < ms; i++) {
delay_cycles(15625); // 62500/4 cycles
void print_wifi_version(void) {
printf("SYSTEM_CFG0 address: 0x%08X\n", (uint32_t)&SYSTEM_CTRL->SYSTEM_CFG0);
printf("SYSTEM_CFG0: 0x%08X\n", SYSTEM_CTRL->SYSTEM_CFG0);
// printf("SYSTEM_CFG1 address: 0x%08X\n",
// (uint32_t)&SYSTEM_CTRL->SYSTEM_CFG1); printf("SYSTEM_CFG1: 0x%08X\n",
// SYSTEM_CTRL->SYSTEM_CFG1); printf("SYSTEM_CFG2 address: 0x%08X\n",
// (uint32_t)&SYSTEM_CTRL->SYSTEM_CFG2); printf("SYSTEM_CFG2: 0x%08X\n",
// SYSTEM_CTRL->SYSTEM_CFG2);
// uint32_t xtal_type = ((cfg ^ 0x10000) >> 16) & 1;
// uint32_t cut_id = (cfg >> 8) & 3;
// uint32_t chip_id = (cfg >> 4) & 0xF;
// uint32_t revision;
// if (cut_id == 1)
// revision = 2;
// else if (cut_id == 2)
// revision = 1;
// else
// revision = 0;
// printf("SYSCFG0: 0x%08X\n", cfg);
// printf("Version: 11\n");
// printf("XTAL Type: 0x%x\n", xtal_type);
// printf("Chip ID: 0x%x\n", chip_id);
// printf("Revision: 0x%x\n", revision);
}
#define CLK_TABLE_ROM 0x00046E68
#define XTAL_TABLE_ROM 0x000046E10
/* REG_SYS_CLK_CTRL1 */
#define BIT_PESOC_EXT32K_CK_SEL (0x00000001 << 8)
#define BIT_PESOC_OCP_CPU_CK_SEL (0x00000007 << 4)
#define BIT_PESOC_EELDR_CK_SEL (0x00000001 << 0)
/* REG_SYS_SYSPLL_CTRL1 */
/* 1:200MHz, 0:166.666MHz */
#define BIT_SYS_SYSPLL_CL200M_SEL (0x00000001 << 17)
/* 1:external source 0:PLL */
#define BIT_SYS_SYSPLL_CK500K_SEL (0x00000001 << 15)
/* enable CK200M */
#define BIT_SYS_SYSPLL_CK200M_EN (0x00000001 << 14)
/* 1: enable CK_SDRAM */
#define BIT_SYS_SYSPLL_CKSDR_EN (0x00000001 << 13)
/* SDR PLL select: 00/01/10/11 no clock/25M/50M/100M */
#define BIT_SYS_SYSPLL_CKSDR_DIV (0x00000003 << 11)
/* 1:enable CK24.576M PLL */
#define BIT_SYS_SYSPLL_CK24P576_EN (0x00000001 << 10)
/* 1: enable CK22.5792M PLL */
#define BIT_SYS_SYSPLL_CK22P5792_EN (0x00000001 << 9)
/* 1: enable CK83.33M PLL */
#define BIT_SYS_SYSPLL_CK83P33M_EN (0x00000001 << 8)
/* reg_ps_en Enable phase shift */
#define BIT_SYS_SYSPLL_CK_PS_EN (0x00000001 << 7)
/* "decide clock phase when reg_ps_enb = 1000/001<30><31>/111: phase 0, 45<34><35>315 */
#define BIT_SYS_SYSPLL_CK_PS_SEL (0x00000007 << 4)
/* REG_SYS_EFUSE_SYSCFG2 */
#define BIT_MASK_SYS_EERROM_ANAPAR_SPLL_24_15 (0x000003ff << 21)
#define BIT_MASK_SYS_EEROM_ANAPAR_SPLL_05_02 (0x0000000f << 16)
#define BIT_MASK_SYS_EEROM_XTAL_STEL_SEL (0x00000003 << 12)
#define BIT_MASK_SYS_EEROM_XTAL_FREQ_SEL (0x0000000f << 8)
void dump_hex(const void *data, size_t size, const char *prefix) {
const uint8_t *bytes = (const uint8_t *)data;
for (size_t i = 0; i < size; i++) {
if (i % 16 == 0) printf("\n%s%04zX: ", prefix, i);
printf("%02X ", bytes[i]);
}
printf("\n");
}
void analyze_clock_config(void) {
printf("\n=== CLOCK CONFIGURATION ===\n");
// all releveant regs
printf("\nRegister Values (Raw):\n");
printf("CLK_CTRL1: 0x%08X\n", SYSTEM_CTRL->CLK_CTRL1);
printf("SYSPLL_CTRL1: 0x%08X\n", SYSTEM_CTRL->SYSPLL_CTRL1);
printf("EFUSE_SYSCFG2: 0x%08X\n", SYSTEM_CTRL->EFUSE_SYSCFG[2]);
// CLK_CTRL1
uint32_t clk_ctrl1 = SYSTEM_CTRL->CLK_CTRL1;
printf("\nCLK_CTRL1:\n");
printf(" EXT32K_CK_SEL: %d\n",
(clk_ctrl1 & BIT_PESOC_EXT32K_CK_SEL) ? 1 : 0);
printf(" OCP_CPU_CK_SEL: %d\n",
(clk_ctrl1 & BIT_PESOC_OCP_CPU_CK_SEL) >> 4);
printf(" EELDR_CK_SEL: %d\n",
(clk_ctrl1 & BIT_PESOC_EELDR_CK_SEL) ? 1 : 0);
// SYSPLL_CTRL1
uint32_t syspll_ctrl1 = SYSTEM_CTRL->SYSPLL_CTRL1;
printf("\nSYSPLL_CTRL1:\n");
printf(" CL200M_SEL: %d\n",
(syspll_ctrl1 & BIT_SYS_SYSPLL_CL200M_SEL) ? 1 : 0);
printf(" CK500K_SEL: %d\n",
(syspll_ctrl1 & BIT_SYS_SYSPLL_CK500K_SEL) ? 1 : 0);
printf(" CK200M_EN: %d\n",
(syspll_ctrl1 & BIT_SYS_SYSPLL_CK200M_EN) ? 1 : 0);
printf(" CKSDR_EN: %d\n",
(syspll_ctrl1 & BIT_SYS_SYSPLL_CKSDR_EN) ? 1 : 0);
printf(" CKSDR_DIV: %d\n",
(syspll_ctrl1 & BIT_SYS_SYSPLL_CKSDR_DIV) >> 11);
printf(" CK24P576_EN: %d\n",
(syspll_ctrl1 & BIT_SYS_SYSPLL_CK24P576_EN) ? 1 : 0);
printf(" CK22P5792_EN: %d\n",
(syspll_ctrl1 & BIT_SYS_SYSPLL_CK22P5792_EN) ? 1 : 0);
printf(" CK83P33M_EN: %d\n",
(syspll_ctrl1 & BIT_SYS_SYSPLL_CK83P33M_EN) ? 1 : 0);
printf(" CK_PS_EN: %d\n",
(syspll_ctrl1 & BIT_SYS_SYSPLL_CK_PS_EN) ? 1 : 0);
printf(" CK_PS_SEL: %d\n",
(syspll_ctrl1 & BIT_SYS_SYSPLL_CK_PS_SEL) >> 4);
// EFUSE_SYSCFG2
uint32_t efuse_syscfg2 = SYSTEM_CTRL->EFUSE_SYSCFG[2];
uint32_t spll_24_15 =
(efuse_syscfg2 & BIT_MASK_SYS_EERROM_ANAPAR_SPLL_24_15) >> 21;
uint32_t spll_05_02 =
(efuse_syscfg2 & BIT_MASK_SYS_EEROM_ANAPAR_SPLL_05_02) >> 16;
uint32_t xtal_stel_sel =
(efuse_syscfg2 & BIT_MASK_SYS_EEROM_XTAL_STEL_SEL) >> 12;
uint32_t xtal_freq_sel =
(efuse_syscfg2 & BIT_MASK_SYS_EEROM_XTAL_FREQ_SEL) >> 8;
printf("\nEFUSE_SYSCFG2:\n");
printf(" SPLL 24:15 Config: 0x%03X\n", spll_24_15);
printf(" SPLL 05:02 Config: 0x%X\n", spll_05_02);
printf(" XTAL_STEL_SEL: 0x%X\n", xtal_stel_sel);
printf(" XTAL_FREQ_SEL: 0x%X\n", xtal_freq_sel);
// rom XTAL table
printf("\nXTAL Table Contents (first 16 entries):\n");
const uint32_t *xtal_table = (const uint32_t *)XTAL_TABLE_ROM;
for (int i = 0; i < 16; i++) {
printf(" [%d]: %d (0x%x Hz)\n", i, xtal_table[i], xtal_table[i]);
}
// xtal freq
uint32_t xtal_freq = xtal_table[xtal_freq_sel];
printf("\nSelected Crystal:\n");
printf(" Index: %d\n", xtal_freq_sel);
printf(" Frequency: %d Hz (0x%08X)\n", xtal_freq, xtal_freq);
// dump clock table
printf("\nClock Table Contents (first 16 entries):\n");
const uint8_t *clk_table = (uint8_t *)CLK_TABLE_ROM;
for (int i = 0; i < 16; i++) {
printf(" [%2d]: %d MHz (0x%x)\n", i, clk_table[i], clk_table[i]);
}
// PLL freq
uint32_t pll_base_freq =
(syspll_ctrl1 & BIT_SYS_SYSPLL_CL200M_SEL) ? 200000000 : 166666666;
printf("\nPLL Frequencies:\n");
printf(" Base: %d Hz (0x%x)\n", pll_base_freq, pll_base_freq);
printf(
" SDR Clock: %d Hz (if enabled)\n",
pll_base_freq >> (2 - ((syspll_ctrl1 & BIT_SYS_SYSPLL_CKSDR_DIV) >> 11)));
printf(" 83.33M: %d Hz (if enabled)\n", 83330000);
printf(" 24.576M: %d Hz (if enabled)\n", 24576000);
printf(" 22.5792M: %d Hz (if enabled)\n", 22579200);
// some rom table
uint32_t cpu_clock_sel = (clk_ctrl1 & BIT_PESOC_OCP_CPU_CK_SEL) >> 4;
uint32_t cpu_freq = clk_table[cpu_clock_sel];
printf("\nCPU Configuration:\n");
printf(" Clock Selection Index: %d\n", cpu_clock_sel);
printf(" Frequency: %d MHz (0x%x)\n", cpu_freq, cpu_freq);
uint32_t xtal_to_pll = (pll_base_freq / (xtal_freq / 1000));
uint32_t pll_to_cpu =
((uint32_t)(cpu_freq * 1000000UL) / (pll_base_freq / 1000));
uint32_t xtal_to_cpu =
((uint32_t)(cpu_freq * 1000000UL) / (xtal_freq / 1000));
printf("\nFrequency Relationships (x1000):\n");
printf(" XTAL to PLL Base: %x.%03x\n", xtal_to_pll / 1000,
xtal_to_pll % 1000);
printf(" PLL Base to CPU: %x.%03x\n", pll_to_cpu / 1000, pll_to_cpu % 1000);
printf(" XTAL to CPU: %x.%03x\n", xtal_to_cpu / 1000,
xtal_to_cpu % 1000);
}
int main(void) {
printf("hello from main\n");
printf("[main]\n");
PERI_ON->SOC_PERI_FUNC1_EN |= BIT_PERI_GPIO_EN;
PERI_ON->PESOC_CLK_CTRL |= APBPeriph_GPIO_CLOCK;
PINMUX_Config(_PA_0, PINMUX_FN_GPIO);
PINMUX_ConfigPadPull(_PA_0, GPIO_PuPd_DOWN);
GPIOA->DDR |= (1 << 0);
uint32_t primask = __get_PRIMASK();
__disable_irq();
SYSTEM_CTRL->CLK_CTRL1 = (SYSTEM_CTRL->CLK_CTRL1 & ~0x70) | (2 << 4);
if (!primask) {
__enable_irq();
}
analyze_clock_config();
// __asm volatile("udf #0");
// DelayMs(5000);
// NVIC_SystemReset();
// print_wifi_version();
// wifi_init();
// delay_ms(3000);
// PERI_ON->SOC_PERI_FUNC1_EN |= BIT_PERI_GPIO_EN;
// PERI_ON->PESOC_CLK_CTRL |= APBPeriph_GPIO_CLOCK;
// PINMUX_Config(_PA_0, PINMUX_FN_GPIO);
// PINMUX_ConfigPadPull(_PA_0, GPIO_PuPd_DOWN);
// GPIOA->DDR |= (1 << 0);
// uint32_t c = 0;
while (1) {
GPIOA->DR |= (1 << 0);
delay_ms(2000);
GPIOA->DR &= ~(1 << 0);
delay_ms(2000);
// GPIOA->DR |= (1 << 0);
// delay_ms(1000);
// GPIOA->DR &= ~(1 << 0);
// delay_ms(1000);
}
}