Used with eeprom_flash to write network configuration to STM32F103 flash

Dependents:   F103-Web-Server

Fork of my_eeprom_funcs by Chau Vo

Committer:
olympux
Date:
Sat Jan 10 16:17:52 2015 +0000
Revision:
11:250b05a5266d
Parent:
10:f37acffddef9
Child:
12:613ab276bf37
API

Who changed what in which revision?

UserRevisionLine numberNew contents of line
olympux 1:6bdc99dd8e0a 1 #include "mbed.h"
olympux 1:6bdc99dd8e0a 2 #include "my_eeprom_funcs.h"
olympux 1:6bdc99dd8e0a 3
olympux 1:6bdc99dd8e0a 4
olympux 11:250b05a5266d 5 /*
olympux 10:f37acffddef9 6 * Debug option
olympux 10:f37acffddef9 7 */
olympux 4:944a4646b825 8 #if 1
olympux 4:944a4646b825 9 //Enable debug
olympux 4:944a4646b825 10 #include <cstdio>
olympux 4:944a4646b825 11 #define DBG(x, ...) std::printf("[eeprom : DBG]"x"\r\n", ##__VA_ARGS__);
olympux 4:944a4646b825 12 #define WARN(x, ...) std::printf("[eeprom : WARN]"x"\r\n", ##__VA_ARGS__);
olympux 4:944a4646b825 13 #define ERR(x, ...) std::printf("[eeprom : ERR]"x"\r\n", ##__VA_ARGS__);
olympux 4:944a4646b825 14
olympux 4:944a4646b825 15 #else
olympux 4:944a4646b825 16 //Disable debug
olympux 4:944a4646b825 17 #define DBG(x, ...)
olympux 4:944a4646b825 18 #define WARN(x, ...)
olympux 4:944a4646b825 19 #define ERR(x, ...)
olympux 4:944a4646b825 20
olympux 4:944a4646b825 21 #endif
olympux 4:944a4646b825 22
olympux 4:944a4646b825 23
olympux 1:6bdc99dd8e0a 24 void write_eeprom_network(char *buf) {
olympux 1:6bdc99dd8e0a 25 // Write network configuration
olympux 1:6bdc99dd8e0a 26 // 4-byte IP address + 4-byte subnet + 4-byte gateway + 3-byte MAC
olympux 1:6bdc99dd8e0a 27
olympux 5:eea03d0eb95a 28 DBG("Saving network configuration for this device...");
olympux 1:6bdc99dd8e0a 29
olympux 1:6bdc99dd8e0a 30 // Unlock the Flash Program Erase controller */
olympux 1:6bdc99dd8e0a 31 FLASH_Unlock();
olympux 1:6bdc99dd8e0a 32 // EEPROM Init
olympux 1:6bdc99dd8e0a 33 EE_Init();
olympux 6:241d1539914a 34
olympux 6:241d1539914a 35 // erase first_run flag
olympux 8:4fc4b1b5509b 36 EE_WriteVariable(VirtAddVarTab[CONFIGURED_IP_FLAG_POS], DEFAULT_ENABLE_FLAG_VALUE);
olympux 6:241d1539914a 37
olympux 1:6bdc99dd8e0a 38 // IP address
olympux 1:6bdc99dd8e0a 39 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 40 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 41 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 42 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 43
olympux 1:6bdc99dd8e0a 44 // IP subnet
olympux 1:6bdc99dd8e0a 45 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 46 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 47 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 48 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 49
olympux 1:6bdc99dd8e0a 50 // IP gateway
olympux 1:6bdc99dd8e0a 51 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 52 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 53 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 54 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 55
olympux 1:6bdc99dd8e0a 56 //// TCP server port, not used
olympux 1:6bdc99dd8e0a 57 //EE_WriteVariable(VirtAddVarTab[TCP_SERVER_LOCAL_PORT_POS], *buf++);
olympux 1:6bdc99dd8e0a 58 //// UDP server port, not used
olympux 1:6bdc99dd8e0a 59 //EE_WriteVariable(VirtAddVarTab[UDP_SERVER_LOCAL_PORT_POS], *buf++);
olympux 1:6bdc99dd8e0a 60
olympux 1:6bdc99dd8e0a 61 // MAC address
olympux 1:6bdc99dd8e0a 62 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 63 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 64 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 65 FLASH_Lock();
olympux 1:6bdc99dd8e0a 66
olympux 6:241d1539914a 67 DBG("Successful");
olympux 1:6bdc99dd8e0a 68 }
olympux 1:6bdc99dd8e0a 69
olympux 10:f37acffddef9 70 /*!
olympux 10:f37acffddef9 71 * Function to load module network configuration
olympux 10:f37acffddef9 72 */
olympux 1:6bdc99dd8e0a 73 void load_eeprom_network(void) {
olympux 1:6bdc99dd8e0a 74 mbed_mac_address((char *)u8mac);
olympux 1:6bdc99dd8e0a 75
olympux 5:eea03d0eb95a 76 DBG("Loading network configuration...");
olympux 1:6bdc99dd8e0a 77
olympux 1:6bdc99dd8e0a 78 EE_Init();
olympux 1:6bdc99dd8e0a 79
olympux 1:6bdc99dd8e0a 80 // check if 1st run
olympux 8:4fc4b1b5509b 81 EE_ReadVariable(VirtAddVarTab[CONFIGURED_IP_FLAG_POS], &configured_ip);
olympux 1:6bdc99dd8e0a 82 // if not first run, load network config
olympux 8:4fc4b1b5509b 83 if (configured_ip == DEFAULT_ENABLE_FLAG_VALUE) {
olympux 5:eea03d0eb95a 84 DBG("User settings");
olympux 1:6bdc99dd8e0a 85
olympux 1:6bdc99dd8e0a 86 // IP address
olympux 1:6bdc99dd8e0a 87 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+0], &u16ip_addr[0]);
olympux 1:6bdc99dd8e0a 88 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+1], &u16ip_addr[1]);
olympux 1:6bdc99dd8e0a 89 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+2], &u16ip_addr[2]);
olympux 1:6bdc99dd8e0a 90 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+3], &u16ip_addr[3]);
olympux 1:6bdc99dd8e0a 91 u8ip_addr[0] = (uint8_t)(u16ip_addr[0] & 0x00FF);
olympux 1:6bdc99dd8e0a 92 u8ip_addr[1] = (uint8_t)(u16ip_addr[1] & 0x00FF);
olympux 1:6bdc99dd8e0a 93 u8ip_addr[2] = (uint8_t)(u16ip_addr[2] & 0x00FF);
olympux 1:6bdc99dd8e0a 94 u8ip_addr[3] = (uint8_t)(u16ip_addr[3] & 0x00FF);
olympux 1:6bdc99dd8e0a 95
olympux 1:6bdc99dd8e0a 96 // IP subnet
olympux 1:6bdc99dd8e0a 97 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+0], &u16ip_subnet[0]);
olympux 1:6bdc99dd8e0a 98 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+1], &u16ip_subnet[1]);
olympux 1:6bdc99dd8e0a 99 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+2], &u16ip_subnet[2]);
olympux 1:6bdc99dd8e0a 100 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+3], &u16ip_subnet[3]);
olympux 1:6bdc99dd8e0a 101
olympux 1:6bdc99dd8e0a 102 // IP gateway
olympux 1:6bdc99dd8e0a 103 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+0], &u16ip_gateway[0]);
olympux 1:6bdc99dd8e0a 104 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+1], &u16ip_gateway[1]);
olympux 1:6bdc99dd8e0a 105 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+2], &u16ip_gateway[2]);
olympux 1:6bdc99dd8e0a 106 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+3], &u16ip_gateway[3]);
olympux 1:6bdc99dd8e0a 107
olympux 1:6bdc99dd8e0a 108 //// TCP server port
olympux 2:57d40eaa1b1b 109 //EE_ReadVariable(VirtAddVarTab[TCP_SERVER_LOCAL_PORT_POS], &tcp_server_local_port);
olympux 1:6bdc99dd8e0a 110 //// UDP server port
olympux 2:57d40eaa1b1b 111 //EE_ReadVariable(VirtAddVarTab[UDP_SERVER_LOCAL_PORT_POS], &udp_server_local_port);
olympux 1:6bdc99dd8e0a 112
olympux 1:6bdc99dd8e0a 113 // MAC address
olympux 1:6bdc99dd8e0a 114 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], &u16mac_addr[0]);
olympux 1:6bdc99dd8e0a 115 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], &u16mac_addr[1]);
olympux 1:6bdc99dd8e0a 116 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], &u16mac_addr[2]);
olympux 1:6bdc99dd8e0a 117 u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2;
olympux 1:6bdc99dd8e0a 118 u8mac[3] = (uint8_t)(u16mac_addr[0] & 0x00FF);
olympux 1:6bdc99dd8e0a 119 u8mac[4] = (uint8_t)(u16mac_addr[1] & 0x00FF);
olympux 1:6bdc99dd8e0a 120 u8mac[5] = (uint8_t)(u16mac_addr[2] & 0x00FF);
olympux 1:6bdc99dd8e0a 121 //FLASH_Lock();
olympux 1:6bdc99dd8e0a 122
olympux 1:6bdc99dd8e0a 123 sprintf(str_ip_addr, "%d.%d.%d.%d", u8ip_addr[0], u8ip_addr[1], u8ip_addr[2], u8ip_addr[3]);
olympux 1:6bdc99dd8e0a 124 sprintf(str_ip_subnet, "%d.%d.%d.%d", (uint8_t)u16ip_subnet[0], (uint8_t)u16ip_subnet[1], (uint8_t)u16ip_subnet[2], (uint8_t)u16ip_subnet[3]);
olympux 1:6bdc99dd8e0a 125 sprintf(str_ip_gateway, "%d.%d.%d.%d", (uint8_t)u16ip_gateway[0], (uint8_t)u16ip_gateway[1], (uint8_t)u16ip_gateway[2], (uint8_t)u16ip_gateway[3]);
olympux 1:6bdc99dd8e0a 126 }
olympux 8:4fc4b1b5509b 127 // if ip is not configured, use default addresses
olympux 1:6bdc99dd8e0a 128 else {
olympux 5:eea03d0eb95a 129 DBG("No user settings, load defaults");
olympux 1:6bdc99dd8e0a 130 u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2;
olympux 1:6bdc99dd8e0a 131 u8mac[3] = DEFAULT_MAC3; u8mac[4] = DEFAULT_MAC4; u8mac[5] = DEFAULT_MAC5;
olympux 1:6bdc99dd8e0a 132 sprintf(str_ip_addr, DEFAULT_IP_ADDRESS);
olympux 1:6bdc99dd8e0a 133 sprintf(str_ip_subnet, DEFAULT_IP_SUBNET);
olympux 1:6bdc99dd8e0a 134 sprintf(str_ip_gateway, DEFAULT_IP_GATEWAY);
olympux 1:6bdc99dd8e0a 135 }
olympux 1:6bdc99dd8e0a 136
olympux 6:241d1539914a 137 DBG("Successful");
olympux 5:eea03d0eb95a 138 DBG("IP: %s", str_ip_addr);
olympux 5:eea03d0eb95a 139 DBG("MASK: %s", str_ip_subnet);
olympux 5:eea03d0eb95a 140 DBG("GW: %s", str_ip_gateway);
olympux 5:eea03d0eb95a 141 DBG("TCP server local port: %d", tcp_server_local_port);
olympux 5:eea03d0eb95a 142 DBG("UDP server local port: %d", udp_server_local_port);
olympux 1:6bdc99dd8e0a 143 }
olympux 1:6bdc99dd8e0a 144
olympux 1:6bdc99dd8e0a 145
olympux 10:f37acffddef9 146 /*!
olympux 10:f37acffddef9 147 * Function to write settings of remote TCP server. It is only used when this device in TCP client mode.
olympux 10:f37acffddef9 148 * When enabled, this device will periodically transmit data to TCP server.
olympux 10:f37acffddef9 149 * @param <char* buf> buffer as following
olympux 10:f37acffddef9 150 * 1-byte Auto transmit flag: 'Y'
olympux 10:f37acffddef9 151 * 1-byte Auto transmit period: in seconds
olympux 10:f37acffddef9 152 * 4-byte TCP server IP address
olympux 10:f37acffddef9 153 * 2-byte TCP server port (LSB MSB)
olympux 10:f37acffddef9 154 */
olympux 1:6bdc99dd8e0a 155 void write_eeprom_tcpserver(char* buf) {
olympux 1:6bdc99dd8e0a 156 // Write network configuration
olympux 2:57d40eaa1b1b 157 // 1-byte Auto transmit flag + 1-byte Auto transmit period + 4-byte TCP server IP address + 2-byte TCP server port (LSB msb)
olympux 1:6bdc99dd8e0a 158
olympux 6:241d1539914a 159 DBG("Saving TCP server settings...");
olympux 1:6bdc99dd8e0a 160
olympux 1:6bdc99dd8e0a 161 // Unlock the Flash Program Erase controller
olympux 1:6bdc99dd8e0a 162 FLASH_Unlock();
olympux 1:6bdc99dd8e0a 163 // EEPROM Init
olympux 1:6bdc99dd8e0a 164 EE_Init();
olympux 1:6bdc99dd8e0a 165
olympux 6:241d1539914a 166 // Auto transmit flag
olympux 5:eea03d0eb95a 167 if (*buf == 'Y') {
olympux 6:241d1539914a 168 EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], DEFAULT_ENABLE_FLAG_VALUE);
olympux 5:eea03d0eb95a 169 }
olympux 5:eea03d0eb95a 170 else {
olympux 6:241d1539914a 171 EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], DEFAULT_DISABLE_FLAG_VALUE);
olympux 5:eea03d0eb95a 172 }
olympux 3:69e1c4ed69e1 173 buf++;
olympux 6:241d1539914a 174 // Auto transmit period
olympux 1:6bdc99dd8e0a 175 EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_TIME_PERIOD_POS], *buf++);
olympux 1:6bdc99dd8e0a 176 // IP address
olympux 1:6bdc99dd8e0a 177 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 178 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 179 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 180 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 181 // TCP server port
olympux 2:57d40eaa1b1b 182 uint16_t port;
olympux 2:57d40eaa1b1b 183 memcpy(&port, buf, 2);
olympux 2:57d40eaa1b1b 184 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], port);
olympux 1:6bdc99dd8e0a 185
olympux 1:6bdc99dd8e0a 186 FLASH_Lock();
olympux 1:6bdc99dd8e0a 187
olympux 6:241d1539914a 188 DBG("Successful");
olympux 1:6bdc99dd8e0a 189 }
olympux 1:6bdc99dd8e0a 190
olympux 10:f37acffddef9 191 /*!
olympux 10:f37acffddef9 192 * Function to load remote TCP server configuration
olympux 10:f37acffddef9 193 */
olympux 1:6bdc99dd8e0a 194 void load_eeprom_tcpserver(void) {
olympux 5:eea03d0eb95a 195 DBG("Checking auto update mode...");
olympux 1:6bdc99dd8e0a 196
olympux 1:6bdc99dd8e0a 197 EE_Init();
olympux 1:6bdc99dd8e0a 198
olympux 1:6bdc99dd8e0a 199 // check if 1st run
olympux 1:6bdc99dd8e0a 200 EE_ReadVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], &auto_transmit_flag);
olympux 1:6bdc99dd8e0a 201 // if not auto transmit, exit
olympux 6:241d1539914a 202 if (auto_transmit_flag == DEFAULT_ENABLE_FLAG_VALUE) {
olympux 1:6bdc99dd8e0a 203 // Time period for transmitting to server
olympux 1:6bdc99dd8e0a 204 EE_ReadVariable(VirtAddVarTab[AUTO_TRANSMIT_TIME_PERIOD_POS], &transmit_time_period);
olympux 6:241d1539914a 205 // TCP server/client enable flags, not in used
olympux 10:f37acffddef9 206 EE_ReadVariable(VirtAddVarTab[ENABLE_TCP_CLIENT], &u16enable_tcp_client);
olympux 10:f37acffddef9 207 EE_ReadVariable(VirtAddVarTab[ENABLE_TCP_SERVER], &u16enable_tcp_server);
olympux 1:6bdc99dd8e0a 208 // IP address
olympux 1:6bdc99dd8e0a 209 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+0], &u16server_ip_addr[0]);
olympux 1:6bdc99dd8e0a 210 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+1], &u16server_ip_addr[1]);
olympux 1:6bdc99dd8e0a 211 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+2], &u16server_ip_addr[2]);
olympux 1:6bdc99dd8e0a 212 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+3], &u16server_ip_addr[3]);
olympux 1:6bdc99dd8e0a 213 u8server_ip_addr[0] = (uint8_t)(u16server_ip_addr[0] & 0x00FF);
olympux 1:6bdc99dd8e0a 214 u8server_ip_addr[1] = (uint8_t)(u16server_ip_addr[1] & 0x00FF);
olympux 1:6bdc99dd8e0a 215 u8server_ip_addr[2] = (uint8_t)(u16server_ip_addr[2] & 0x00FF);
olympux 1:6bdc99dd8e0a 216 u8server_ip_addr[3] = (uint8_t)(u16server_ip_addr[3] & 0x00FF);
olympux 1:6bdc99dd8e0a 217 // TCP server port
olympux 1:6bdc99dd8e0a 218 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], &u16tcp_server_port);
olympux 1:6bdc99dd8e0a 219
olympux 1:6bdc99dd8e0a 220 sprintf(str_server_ip_addr, "%d.%d.%d.%d", u8server_ip_addr[0], u8server_ip_addr[1], u8server_ip_addr[2], u8server_ip_addr[3]);
olympux 6:241d1539914a 221 DBG("Enabled auto update, module is a TCP client");
olympux 5:eea03d0eb95a 222 DBG("Update every %ds to TCP server %s on port %d", transmit_time_period, str_server_ip_addr, u16tcp_server_port);
olympux 1:6bdc99dd8e0a 223 }
olympux 1:6bdc99dd8e0a 224 // if 1st run, use default addresses
olympux 1:6bdc99dd8e0a 225 else {
olympux 9:b5fbb35bbc02 226 DBG("No auto update using TCP client");
olympux 1:6bdc99dd8e0a 227 }
olympux 1:6bdc99dd8e0a 228 }