1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * devices for ESP32 C3 dev board 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Written in 2010-2021 by Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0 7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication. 8d4afb5ceSopenharmony_ci */ 9d4afb5ceSopenharmony_ci 10d4afb5ceSopenharmony_ci#define LWIP_PROVIDE_ERRNO 1 11d4afb5ceSopenharmony_ci#define _ESP_PLATFORM_ERRNO_H_ 12d4afb5ceSopenharmony_ci 13d4afb5ceSopenharmony_ci#include <stdio.h> 14d4afb5ceSopenharmony_ci#include "sdkconfig.h" 15d4afb5ceSopenharmony_ci#include "freertos/FreeRTOS.h" 16d4afb5ceSopenharmony_ci#include "freertos/task.h" 17d4afb5ceSopenharmony_ci 18d4afb5ceSopenharmony_ci#include <driver/gpio.h> 19d4afb5ceSopenharmony_ci 20d4afb5ceSopenharmony_ci#include <libwebsockets.h> 21d4afb5ceSopenharmony_ci 22d4afb5ceSopenharmony_cistruct lws_led_state *lls; 23d4afb5ceSopenharmony_cilws_display_state_t lds; 24d4afb5ceSopenharmony_cistruct lws_button_state *bcs; 25d4afb5ceSopenharmony_cilws_netdev_instance_wifi_t *wnd; 26d4afb5ceSopenharmony_ci 27d4afb5ceSopenharmony_ci/* 28d4afb5ceSopenharmony_ci * Button controller 29d4afb5ceSopenharmony_ci */ 30d4afb5ceSopenharmony_ci 31d4afb5ceSopenharmony_cistatic const lws_button_map_t bcm[] = { 32d4afb5ceSopenharmony_ci { 33d4afb5ceSopenharmony_ci .gpio = GPIO_NUM_0, 34d4afb5ceSopenharmony_ci .smd_interaction_name = "user" 35d4afb5ceSopenharmony_ci }, 36d4afb5ceSopenharmony_ci}; 37d4afb5ceSopenharmony_ci 38d4afb5ceSopenharmony_cistatic const lws_button_controller_t bc = { 39d4afb5ceSopenharmony_ci .smd_bc_name = "bc", 40d4afb5ceSopenharmony_ci .gpio_ops = &lws_gpio_plat, 41d4afb5ceSopenharmony_ci .button_map = &bcm[0], 42d4afb5ceSopenharmony_ci .active_state_bitmap = 0, 43d4afb5ceSopenharmony_ci .count_buttons = LWS_ARRAY_SIZE(bcm), 44d4afb5ceSopenharmony_ci}; 45d4afb5ceSopenharmony_ci 46d4afb5ceSopenharmony_ci/* 47d4afb5ceSopenharmony_ci * pwm controller 48d4afb5ceSopenharmony_ci */ 49d4afb5ceSopenharmony_ci 50d4afb5ceSopenharmony_cistatic const lws_pwm_map_t pwm_map[] = { 51d4afb5ceSopenharmony_ci { .gpio = GPIO_NUM_8, .index = 0, .active_level = 1 } 52d4afb5ceSopenharmony_ci}; 53d4afb5ceSopenharmony_ci 54d4afb5ceSopenharmony_cistatic const lws_pwm_ops_t pwm_ops = { 55d4afb5ceSopenharmony_ci lws_pwm_plat_ops, 56d4afb5ceSopenharmony_ci .pwm_map = &pwm_map[0], 57d4afb5ceSopenharmony_ci .count_pwm_map = LWS_ARRAY_SIZE(pwm_map) 58d4afb5ceSopenharmony_ci}; 59d4afb5ceSopenharmony_ci 60d4afb5ceSopenharmony_ci#if 0 61d4afb5ceSopenharmony_cistatic const lws_display_ssd1306_t disp = { 62d4afb5ceSopenharmony_ci .disp = { 63d4afb5ceSopenharmony_ci lws_display_ssd1306_ops, 64d4afb5ceSopenharmony_ci .w = 128, 65d4afb5ceSopenharmony_ci .h = 64 66d4afb5ceSopenharmony_ci }, 67d4afb5ceSopenharmony_ci .i2c = (lws_i2c_ops_t *)&li2c, 68d4afb5ceSopenharmony_ci .gpio = &lws_gpio_plat, 69d4afb5ceSopenharmony_ci .reset_gpio = GPIO_NUM_16, 70d4afb5ceSopenharmony_ci .i2c7_address = SSD1306_I2C7_ADS1 71d4afb5ceSopenharmony_ci}; 72d4afb5ceSopenharmony_ci#endif 73d4afb5ceSopenharmony_ci 74d4afb5ceSopenharmony_ci/* 75d4afb5ceSopenharmony_ci * led controller 76d4afb5ceSopenharmony_ci */ 77d4afb5ceSopenharmony_ci 78d4afb5ceSopenharmony_cistatic const lws_led_gpio_map_t lgm[] = { 79d4afb5ceSopenharmony_ci { 80d4afb5ceSopenharmony_ci .name = "alert", 81d4afb5ceSopenharmony_ci .gpio = GPIO_NUM_8, 82d4afb5ceSopenharmony_ci .pwm_ops = &pwm_ops, /* managed by pwm */ 83d4afb5ceSopenharmony_ci .active_level = 1, 84d4afb5ceSopenharmony_ci }, 85d4afb5ceSopenharmony_ci}; 86d4afb5ceSopenharmony_ci 87d4afb5ceSopenharmony_cistatic const lws_led_gpio_controller_t lgc = { 88d4afb5ceSopenharmony_ci .led_ops = lws_led_gpio_ops, 89d4afb5ceSopenharmony_ci .gpio_ops = &lws_gpio_plat, 90d4afb5ceSopenharmony_ci .led_map = &lgm[0], 91d4afb5ceSopenharmony_ci .count_leds = LWS_ARRAY_SIZE(lgm) 92d4afb5ceSopenharmony_ci}; 93d4afb5ceSopenharmony_ci 94d4afb5ceSopenharmony_ci/* 95d4afb5ceSopenharmony_ci * Settings stored in platform nv 96d4afb5ceSopenharmony_ci */ 97d4afb5ceSopenharmony_ci 98d4afb5ceSopenharmony_cistatic const lws_settings_ops_t sett = { 99d4afb5ceSopenharmony_ci lws_settings_ops_plat 100d4afb5ceSopenharmony_ci}; 101d4afb5ceSopenharmony_ci 102d4afb5ceSopenharmony_ci/* 103d4afb5ceSopenharmony_ci * Wifi 104d4afb5ceSopenharmony_ci */ 105d4afb5ceSopenharmony_ci 106d4afb5ceSopenharmony_cistatic const lws_netdev_ops_t wifi_ops = { 107d4afb5ceSopenharmony_ci lws_netdev_wifi_plat_ops 108d4afb5ceSopenharmony_ci}; 109d4afb5ceSopenharmony_ci 110d4afb5ceSopenharmony_ciint 111d4afb5ceSopenharmony_ciinit_plat_devices(struct lws_context *ctx) 112d4afb5ceSopenharmony_ci{ 113d4afb5ceSopenharmony_ci lws_settings_instance_t *si; 114d4afb5ceSopenharmony_ci lws_netdevs_t *netdevs = lws_netdevs_from_ctx(ctx); 115d4afb5ceSopenharmony_ci 116d4afb5ceSopenharmony_ci si = lws_settings_init(&sett, (void *)"nvs"); 117d4afb5ceSopenharmony_ci if (!si) { 118d4afb5ceSopenharmony_ci lwsl_err("%s: failed to create settings instance\n", __func__); 119d4afb5ceSopenharmony_ci return 1; 120d4afb5ceSopenharmony_ci } 121d4afb5ceSopenharmony_ci netdevs->si = si; 122d4afb5ceSopenharmony_ci 123d4afb5ceSopenharmony_ci#if 0 124d4afb5ceSopenharmony_ci /* 125d4afb5ceSopenharmony_ci * This is a temp hack to bootstrap the settings to contain the test 126d4afb5ceSopenharmony_ci * AP ssid and passphrase for one time, so the settings can be stored 127d4afb5ceSopenharmony_ci * while there's no UI atm 128d4afb5ceSopenharmony_ci */ 129d4afb5ceSopenharmony_ci { 130d4afb5ceSopenharmony_ci lws_wifi_creds_t creds; 131d4afb5ceSopenharmony_ci 132d4afb5ceSopenharmony_ci memset(&creds, 0, sizeof(creds)); 133d4afb5ceSopenharmony_ci 134d4afb5ceSopenharmony_ci lws_strncpy(creds.ssid, "xxx", sizeof(creds.ssid)); 135d4afb5ceSopenharmony_ci lws_strncpy(creds.passphrase, "xxx", sizeof(creds.passphrase)); 136d4afb5ceSopenharmony_ci lws_dll2_add_tail(&creds.list, &netdevs->owner_creds); 137d4afb5ceSopenharmony_ci 138d4afb5ceSopenharmony_ci if (lws_netdev_credentials_settings_set(netdevs)) { 139d4afb5ceSopenharmony_ci lwsl_err("%s: failed to write bootstrap creds\n", 140d4afb5ceSopenharmony_ci __func__); 141d4afb5ceSopenharmony_ci return 1; 142d4afb5ceSopenharmony_ci } 143d4afb5ceSopenharmony_ci } 144d4afb5ceSopenharmony_ci#endif 145d4afb5ceSopenharmony_ci 146d4afb5ceSopenharmony_ci /* create the wifi network device and configure it */ 147d4afb5ceSopenharmony_ci 148d4afb5ceSopenharmony_ci wnd = (lws_netdev_instance_wifi_t *) 149d4afb5ceSopenharmony_ci wifi_ops.create(ctx, &wifi_ops, "wl0", NULL); 150d4afb5ceSopenharmony_ci if (!wnd) { 151d4afb5ceSopenharmony_ci lwsl_err("%s: failed to create wifi object\n", __func__); 152d4afb5ceSopenharmony_ci return 1; 153d4afb5ceSopenharmony_ci } 154d4afb5ceSopenharmony_ci 155d4afb5ceSopenharmony_ci wnd->flags |= LNDIW_MODE_STA; 156d4afb5ceSopenharmony_ci 157d4afb5ceSopenharmony_ci if (wifi_ops.configure(&wnd->inst, NULL)) { 158d4afb5ceSopenharmony_ci lwsl_err("%s: failed to configure wifi object\n", __func__); 159d4afb5ceSopenharmony_ci return 1; 160d4afb5ceSopenharmony_ci } 161d4afb5ceSopenharmony_ci 162d4afb5ceSopenharmony_ci wifi_ops.up(&wnd->inst); 163d4afb5ceSopenharmony_ci esp_wifi_set_mode(WIFI_MODE_STA); 164d4afb5ceSopenharmony_cilws_netdev_wifi_scan_plat(&wnd->inst); 165d4afb5ceSopenharmony_ci lls = lgc.led_ops.create(&lgc.led_ops); 166d4afb5ceSopenharmony_ci if (!lls) { 167d4afb5ceSopenharmony_ci lwsl_err("%s: could not create led\n", __func__); 168d4afb5ceSopenharmony_ci return 1; 169d4afb5ceSopenharmony_ci } 170d4afb5ceSopenharmony_ci 171d4afb5ceSopenharmony_ci /* pwm init must go after the led controller init */ 172d4afb5ceSopenharmony_ci 173d4afb5ceSopenharmony_ci// pwm_ops.init(&pwm_ops); 174d4afb5ceSopenharmony_ci 175d4afb5ceSopenharmony_ci bcs = lws_button_controller_create(ctx, &bc); 176d4afb5ceSopenharmony_ci if (!bcs) { 177d4afb5ceSopenharmony_ci lwsl_err("%s: could not create buttons\n", __func__); 178d4afb5ceSopenharmony_ci return 1; 179d4afb5ceSopenharmony_ci } 180d4afb5ceSopenharmony_ci 181d4afb5ceSopenharmony_ci lws_button_enable(bcs, 0, lws_button_get_bit(bcs, "user")); 182d4afb5ceSopenharmony_ci// lws_led_transition(lls, "alert", &lws_pwmseq_static_off, 183d4afb5ceSopenharmony_ci// &lws_pwmseq_static_on); 184d4afb5ceSopenharmony_ci 185d4afb5ceSopenharmony_ci lwsl_notice("%s: exiting device init\n", __func__); 186d4afb5ceSopenharmony_ci return 0; 187d4afb5ceSopenharmony_ci} 188