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:19:18 2015 +0000
Revision:
12:613ab276bf37
Parent:
11:250b05a5266d
Child:
13:7ffbbfe999c5
Updated API documentation

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