nvs_config: introduce configuration through NVS

Stratum and Wifi configuration can now be read from NVS on the
flash. An example config.cvs file is included and can be used
to generate the partition and then be flashed to the esp32 using
the esp-idf parttool.py.
This commit is contained in:
johnny9 2023-06-13 23:47:12 -04:00
parent 1540703850
commit 6949b73bb9
8 changed files with 131 additions and 26 deletions

View File

@ -13,8 +13,6 @@
#include "lwip/sys.h"
#define WIFI_SSD CONFIG_ESP_WIFI_SSID
#define WIFI_PASS CONFIG_ESP_WIFI_PASSWORD
#define MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY
#if CONFIG_ESP_WPA3_SAE_PWE_HUNT_AND_PECK
@ -84,7 +82,7 @@ static void event_handler(void* arg, esp_event_base_t event_base,
}
}
void wifi_init_sta(void)
void wifi_init_sta(const char * wifi_ssid, const char * wifi_pass)
{
s_wifi_event_group = xEventGroupCreate();
@ -111,8 +109,6 @@ void wifi_init_sta(void)
wifi_config_t wifi_config = {
.sta = {
.ssid = WIFI_SSD,
.password = WIFI_PASS,
/* Authmode threshold resets to WPA2 as default if password matches WPA2 standards (pasword len => 8).
* If you want to connect the device to deprecated WEP/WPA networks, Please set the threshold value
* to WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK and set the password with length and format matching to
@ -123,9 +119,14 @@ void wifi_init_sta(void)
// .sae_h2e_identifier = EXAMPLE_H2E_IDENTIFIER,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
ESP_ERROR_CHECK(esp_wifi_start() );
strncpy((char *) wifi_config.sta.ssid, wifi_ssid, 31);
wifi_config.sta.ssid[31] = '\0';
strncpy((char *) wifi_config.sta.password, wifi_pass, 63);
wifi_config.sta.password[63] = '\0';
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "wifi_init_sta finished.");
@ -140,9 +141,9 @@ void wifi_init_sta(void)
/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
* happened. */
if (bits & WIFI_CONNECTED_BIT) {
ESP_LOGI(TAG, "Connected to SSID: %s", WIFI_SSD);
ESP_LOGI(TAG, "Connected to SSID: %s", wifi_ssid);
} else if (bits & WIFI_FAIL_BIT) {
ESP_LOGI(TAG, "Failed to connect to SSID: %s", WIFI_SSD);
ESP_LOGI(TAG, "Failed to connect to SSID: %s", wifi_ssid);
} else {
ESP_LOGE(TAG, "UNEXPECTED EVENT");
}

View File

@ -1,9 +1,10 @@
#pragma once
#include "lwip/sys.h"
#include <lwip/netdb.h>
#include <arpa/inet.h>
void wifi_init_sta(void);
#define WIFI_SSID CONFIG_ESP_WIFI_SSID
#define WIFI_PASS CONFIG_ESP_WIFI_PASSWORD
void wifi_init_sta(const char * ssid, const char * pass);

10
config.cvs.example Normal file
View File

@ -0,0 +1,10 @@
key,type,encoding,value
main,namespace,,
wifissid,data,string,myssid
wifipass,data,string,mypass
stratumurl,data,string,solo.ckpool.org
stratumport,data,u16,3333
stratumuser,data,string,1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa.bitaxe
stratumpass,data,string,x
bm1397frequency,data,u16,425
bm1397voltage,data,u16,1400

View File

@ -7,6 +7,7 @@ SRCS
"INA260.c"
"led_controller.c"
"miner.c"
"nvs_config.c"
"oled.c"
"system.c"
"work_queue.c"
@ -15,7 +16,7 @@ SRCS
"./tasks/asic_task.c"
"./tasks/asic_result_task.c"
"./tasks/power_management_task.c"
INCLUDE_DIRS
INCLUDE_DIRS
"."
"tasks"
)

View File

@ -13,6 +13,7 @@
#include "global_state.h"
#include "serial.h"
#include "asic_result_task.h"
#include "nvs_config.h"
static GlobalState GLOBAL_STATE = {
.extranonce_str = NULL,
@ -24,7 +25,6 @@ static GlobalState GLOBAL_STATE = {
static const char *TAG = "miner";
void app_main(void)
{
ESP_LOGI(TAG, "Welcome to the bitaxe!");
@ -35,7 +35,12 @@ void app_main(void)
xTaskCreate(SYSTEM_task, "SYSTEM_task", 4096, (void*)&GLOBAL_STATE, 3, NULL);
ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
wifi_init_sta();
char * wifi_ssid = nvs_config_get_string(NVS_CONFIG_WIFI_SSID, WIFI_SSID);
char * wifi_pass = nvs_config_get_string(NVS_CONFIG_WIFI_PASS, WIFI_PASS);
wifi_init_sta(wifi_ssid, wifi_pass);
free(wifi_ssid);
free(wifi_pass);
queue_init(&GLOBAL_STATE.stratum_queue);
queue_init(&GLOBAL_STATE.ASIC_jobs_queue);

65
main/nvs_config.c Normal file
View File

@ -0,0 +1,65 @@
#include "nvs_config.h"
#include "nvs.h"
#include "esp_log.h"
#include <string.h>
#define NVS_CONFIG_NAMESPACE "main"
static const char * TAG = "nvs_config";
char * nvs_config_get_string(const char * key, const char * default_value)
{
nvs_handle handle;
esp_err_t err;
err = nvs_open(NVS_CONFIG_NAMESPACE, NVS_READONLY, &handle);
if (err != ESP_OK)
{
ESP_LOGW(TAG, "Key %s not found in nvs, using default value", key);
return strdup(default_value);
}
size_t size = 0;
err = nvs_get_str(handle, key, NULL, &size);
if (err != ESP_OK)
{
ESP_LOGW(TAG, "Key %s not found in nvs, using default value", key);
return strdup(default_value);
}
char * out = malloc(size);
err = nvs_get_str(handle, key, out, &size);
if (err != ESP_OK)
{
ESP_LOGW(TAG, "Key %s not found in nvs, using default value", key);
return strdup(default_value);
}
nvs_close(handle);
return out;
}
uint16_t nvs_config_get_u16(const char * key, const uint16_t default_value)
{
nvs_handle handle;
esp_err_t err;
err = nvs_open(NVS_CONFIG_NAMESPACE, NVS_READONLY, &handle);
if (err != ESP_OK)
{
ESP_LOGW(TAG, "Key %s not found in nvs, using default value", key);
return default_value;
}
uint16_t out;
err = nvs_get_u16(handle, key, &out);
if (err != ESP_OK)
{
ESP_LOGW(TAG, "Key %s not found in nvs, using default value", key);
return default_value;
}
nvs_close(handle);
return out;
}

18
main/nvs_config.h Normal file
View File

@ -0,0 +1,18 @@
#ifndef MAIN_NVS_CONFIG_H
#define MAIN_NVS_CONFIG_H
#include <stdint.h>
#define NVS_CONFIG_WIFI_SSID "wifissid"
#define NVS_CONFIG_WIFI_PASS "wifipass"
#define NVS_CONFIG_STRATUM_URL "stratumurl"
#define NVS_CONFIG_STRATUM_PORT "stratumport"
#define NVS_CONFIG_STRATUM_USER "stratumuser"
#define NVS_CONFIG_STRATUM_PASS "stratumpass"
#define NVS_CONFIG_BM1397_FREQ "bm1397frequency"
#define NVS_CONFIG_BM1397_VOLTAGE "bm1397voltage"
char * nvs_config_get_string(const char * key, const char * default_value);
uint16_t nvs_config_get_u16(const char * key, const uint16_t default_value);
#endif // MAIN_NVS_CONFIG_H

View File

@ -1,4 +1,3 @@
#include "esp_log.h"
//#include "addr_from_stdin.h"
#include "connect.h"
@ -7,6 +6,7 @@
#include "bm1397.h"
#include "global_state.h"
#include "stratum_task.h"
#include "nvs_config.h"
#include <esp_sntp.h>
#include <time.h>
@ -32,10 +32,8 @@ void dns_found_cb(const char * name, const ip_addr_t * ipaddr, void * callback_a
bDNSFound = true;
}
void stratum_task(void * pvParameters)
{
GlobalState *GLOBAL_STATE = (GlobalState*)pvParameters;
STRATUM_V1_initialize_buffer();
@ -43,14 +41,17 @@ void stratum_task(void * pvParameters)
int addr_family = 0;
int ip_protocol = 0;
char * stratum_url = nvs_config_get_string(NVS_CONFIG_STRATUM_URL, STRATUM_URL);
uint16_t port = nvs_config_get_u16(NVS_CONFIG_STRATUM_PORT, PORT);
//check to see if the STRATUM_URL is an ip address already
if (inet_pton(AF_INET, STRATUM_URL, &ip_Addr) == 1) {
if (inet_pton(AF_INET, stratum_url, &ip_Addr) == 1) {
bDNSFound = true;
} else {
//it's a hostname. Lookup the ip address.
IP_ADDR4(&ip_Addr, 0, 0, 0, 0);
ESP_LOGI(TAG, "Get IP for URL: %s\n", STRATUM_URL);
dns_gethostbyname(STRATUM_URL, &ip_Addr, dns_found_cb, NULL);
ESP_LOGI(TAG, "Get IP for URL: %s\n", stratum_url);
dns_gethostbyname(stratum_url, &ip_Addr, dns_found_cb, NULL);
while (!bDNSFound);
}
@ -60,13 +61,14 @@ void stratum_task(void * pvParameters)
ip4_addr2(&ip_Addr.u_addr.ip4),
ip4_addr3(&ip_Addr.u_addr.ip4),
ip4_addr4(&ip_Addr.u_addr.ip4));
ESP_LOGI(TAG, "Connecting to: stratum+tcp://%s:%d (%s)\n", STRATUM_URL, PORT, host_ip);
ESP_LOGI(TAG, "Connecting to: stratum+tcp://%s:%d (%s)\n", stratum_url, port, host_ip);
free(stratum_url);
while (1) {
struct sockaddr_in dest_addr;
dest_addr.sin_addr.s_addr = inet_addr(host_ip);
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(PORT);
dest_addr.sin_port = htons(port);
addr_family = AF_INET;
ip_protocol = IPPROTO_IP;
@ -76,7 +78,7 @@ void stratum_task(void * pvParameters)
ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
break;
}
ESP_LOGI(TAG, "Socket created, connecting to %s:%d", host_ip, PORT);
ESP_LOGI(TAG, "Socket created, connecting to %s:%d", host_ip, port);
int err = connect(GLOBAL_STATE->sock, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in6));
if (err != 0)
@ -89,7 +91,9 @@ void stratum_task(void * pvParameters)
STRATUM_V1_configure_version_rolling(GLOBAL_STATE->sock);
STRATUM_V1_authenticate(GLOBAL_STATE->sock, STRATUM_USER);
char * username = nvs_config_get_string(NVS_CONFIG_STRATUM_USER, STRATUM_USER);
STRATUM_V1_authenticate(GLOBAL_STATE->sock, username);
free(username);
ESP_LOGI(TAG, "Extranonce: %s", GLOBAL_STATE->extranonce_str);
ESP_LOGI(TAG, "Extranonce 2 length: %d", GLOBAL_STATE->extranonce_2_len);