[6319] | 1 | /** @file wlan_mac_misc_util.c |
---|
| 2 | * @brief Miscellaneous Utilities |
---|
| 3 | * |
---|
| 4 | * This contains code common to both CPU_LOW and CPU_HIGH that allows them |
---|
| 5 | * to interact with the MAC Time and User IO cores. |
---|
| 6 | * |
---|
| 7 | * @copyright Copyright 2013-2019, Mango Communications. All rights reserved. |
---|
| 8 | * Distributed under the Mango Communications Reference Design License |
---|
| 9 | * See LICENSE.txt included in the design archive or |
---|
| 10 | * at http://mangocomm.com/802.11/license |
---|
| 11 | * |
---|
| 12 | * This file is part of the Mango 802.11 Reference Design (https://mangocomm.com/802.11) |
---|
| 13 | */ |
---|
| 14 | |
---|
| 15 | /***************************** Include Files *********************************/ |
---|
| 16 | |
---|
| 17 | #include "w3_userio.h" |
---|
| 18 | #include "include/w3_userio_util.h" |
---|
| 19 | #include "wlan_platform_common.h" |
---|
| 20 | #include "xparameters.h" |
---|
| 21 | |
---|
| 22 | |
---|
| 23 | /*********************** Global Variable Definitions *************************/ |
---|
| 24 | |
---|
| 25 | |
---|
| 26 | /*************************** Variable Definitions ****************************/ |
---|
| 27 | |
---|
| 28 | |
---|
| 29 | /*************************** Functions Prototypes ****************************/ |
---|
| 30 | |
---|
| 31 | |
---|
| 32 | /******************************** Functions **********************************/ |
---|
| 33 | |
---|
| 34 | |
---|
| 35 | /*****************************************************************************/ |
---|
| 36 | /** |
---|
| 37 | * @brief Mapping of hexadecimal values to the 7-segment display |
---|
| 38 | * |
---|
| 39 | * @param hex_value - Hexadecimal value to be converted (between 0 and 15) |
---|
| 40 | * @return u8 - LED map value of the 7-segment display |
---|
| 41 | */ |
---|
| 42 | u8 hex_to_seven_segment(u8 hex_value) { |
---|
| 43 | switch(hex_value) { |
---|
| 44 | case(0x0) : return 0x3F; |
---|
| 45 | case(0x1) : return 0x06; |
---|
| 46 | case(0x2) : return 0x5B; |
---|
| 47 | case(0x3) : return 0x4F; |
---|
| 48 | case(0x4) : return 0x66; |
---|
| 49 | case(0x5) : return 0x6D; |
---|
| 50 | case(0x6) : return 0x7D; |
---|
| 51 | case(0x7) : return 0x07; |
---|
| 52 | case(0x8) : return 0x7F; |
---|
| 53 | case(0x9) : return 0x6F; |
---|
| 54 | |
---|
| 55 | case(0xA) : return 0x77; |
---|
| 56 | case(0xB) : return 0x7C; |
---|
| 57 | case(0xC) : return 0x39; |
---|
| 58 | case(0xD) : return 0x5E; |
---|
| 59 | case(0xE) : return 0x79; |
---|
| 60 | case(0xF) : return 0x71; |
---|
| 61 | default : return 0x00; |
---|
| 62 | } |
---|
| 63 | } |
---|
| 64 | |
---|
| 65 | |
---|
| 66 | |
---|
| 67 | /*****************************************************************************/ |
---|
| 68 | /** |
---|
| 69 | * @brief Enable the PWM functionality of the hex display |
---|
| 70 | * |
---|
| 71 | * This function will tell the User I/O to enable the PWM to pulse the hex display. |
---|
| 72 | * |
---|
| 73 | * @param None |
---|
| 74 | * @return None |
---|
| 75 | */ |
---|
| 76 | void enable_hex_pwm() { |
---|
| 77 | userio_set_pwm_ramp_en(USERIO_BASEADDR, 1); |
---|
| 78 | } |
---|
| 79 | |
---|
| 80 | |
---|
| 81 | |
---|
| 82 | /*****************************************************************************/ |
---|
| 83 | /** |
---|
| 84 | * @brief Disable the PWM functionality of the hex display |
---|
| 85 | * |
---|
| 86 | * This function will tell the User I/O to disable the PWM to pulse the hex display. |
---|
| 87 | * |
---|
| 88 | * @param None |
---|
| 89 | * @return None |
---|
| 90 | */ |
---|
| 91 | void disable_hex_pwm() { |
---|
| 92 | userio_set_pwm_ramp_en(USERIO_BASEADDR, 0); |
---|
| 93 | } |
---|
| 94 | |
---|
| 95 | |
---|
| 96 | |
---|
| 97 | /*****************************************************************************/ |
---|
| 98 | /** |
---|
| 99 | * @brief Set the PWM period for the Hex display |
---|
| 100 | * |
---|
| 101 | * This function will set the period used to pulse the hex display |
---|
| 102 | * |
---|
| 103 | * @param period - Period of the PWM ramp (u16) |
---|
| 104 | * @return None |
---|
| 105 | */ |
---|
| 106 | void set_hex_pwm_period(u16 period) { |
---|
| 107 | userio_set_pwm_period(USERIO_BASEADDR, period); |
---|
| 108 | } |
---|
| 109 | |
---|
| 110 | |
---|
| 111 | |
---|
| 112 | /*****************************************************************************/ |
---|
| 113 | /** |
---|
| 114 | * @brief Set the Min / Max timing for the PWM ramp |
---|
| 115 | * |
---|
| 116 | * This function will set the Min / Max timing parameters for the PWM pulse of |
---|
| 117 | * the hex display. The values should be less that the period set by |
---|
| 118 | * set_hex_pwm_period(), but that condition is not enforced. |
---|
| 119 | * |
---|
| 120 | * @param min - Timing parameter for when the PWM reaches minimum value (u16) |
---|
| 121 | * @param max - Timing parameter for when the PWM reaches maximum value (u16) |
---|
| 122 | * @return None |
---|
| 123 | * |
---|
| 124 | * @note This function will disable the PWM. Therefore, the PWM must be enabled |
---|
| 125 | * after calling this function. |
---|
| 126 | */ |
---|
| 127 | void set_hex_pwm_min_max(u16 min, u16 max) { |
---|
| 128 | // Ramp must be disabled when changing ramp params |
---|
| 129 | userio_set_pwm_ramp_en(USERIO_BASEADDR, 0); |
---|
| 130 | userio_set_pwm_ramp_min(USERIO_BASEADDR, min); |
---|
| 131 | userio_set_pwm_ramp_max(USERIO_BASEADDR, max); |
---|
| 132 | } |
---|
| 133 | |
---|
| 134 | |
---|
| 135 | |
---|
| 136 | /*****************************************************************************/ |
---|
| 137 | /** |
---|
| 138 | * @brief Write a Decimal Value to the Hex Display |
---|
| 139 | * |
---|
| 140 | * This function will write a decimal value to the board's two-digit hex displays. |
---|
| 141 | * The display is right justified; WLAN Exp will indicate its connection state |
---|
| 142 | * using the right decimal point. |
---|
| 143 | * |
---|
| 144 | * @param val - Value to be displayed |
---|
| 145 | * 0 - 99: Displayed normally |
---|
| 146 | * 99 - 254: "00" displayed |
---|
| 147 | * 255: "--" displayed |
---|
| 148 | * @return None |
---|
| 149 | */ |
---|
| 150 | void write_hex_display(u8 val) { |
---|
| 151 | u32 right_dp; |
---|
| 152 | u8 left_val; |
---|
| 153 | u8 right_val; |
---|
| 154 | |
---|
| 155 | // Need to retain the value of the right decimal point |
---|
| 156 | right_dp = userio_read_hexdisp_right(USERIO_BASEADDR) & W3_USERIO_HEXDISP_DP; |
---|
| 157 | |
---|
| 158 | userio_write_control(USERIO_BASEADDR, (userio_read_control(USERIO_BASEADDR) & (~(W3_USERIO_HEXDISP_L_MAPMODE | W3_USERIO_HEXDISP_R_MAPMODE)))); |
---|
| 159 | |
---|
| 160 | if (val < 10) { |
---|
| 161 | left_val = 0; |
---|
| 162 | right_val = hex_to_seven_segment(val); |
---|
| 163 | } else { |
---|
| 164 | if (val < 100) { |
---|
| 165 | left_val = hex_to_seven_segment(((val / 10) % 10)); |
---|
| 166 | right_val = hex_to_seven_segment((val % 10)); |
---|
| 167 | } else { |
---|
| 168 | if (val != 255) { |
---|
| 169 | left_val = hex_to_seven_segment(0x00); |
---|
| 170 | right_val = hex_to_seven_segment(0x00); |
---|
| 171 | } else { |
---|
| 172 | left_val = 0x40; |
---|
| 173 | right_val = 0x40; |
---|
| 174 | } |
---|
| 175 | } |
---|
| 176 | } |
---|
| 177 | |
---|
| 178 | userio_write_hexdisp_left(USERIO_BASEADDR, left_val); |
---|
| 179 | userio_write_hexdisp_right(USERIO_BASEADDR, (right_val | right_dp)); |
---|
| 180 | } |
---|
| 181 | |
---|
| 182 | |
---|
| 183 | |
---|
| 184 | /*****************************************************************************/ |
---|
| 185 | /** |
---|
| 186 | * @brief Write a Decimal Value to the Hex Display with PWM pulsing |
---|
| 187 | * |
---|
| 188 | * This function will write a decimal value to the board's two-digit hex displays. |
---|
| 189 | * The display is right justified and will pulse using the pwms; WLAN Exp will |
---|
| 190 | * indicate its connection state using the right decimal point. |
---|
| 191 | * |
---|
| 192 | * @param val - Value to be displayed |
---|
| 193 | * 0 - 99: Displayed normally |
---|
| 194 | * 99 - 254: "00" displayed |
---|
| 195 | * 255: "--" displayed |
---|
| 196 | * @return None |
---|
| 197 | */ |
---|
| 198 | void write_hex_display_with_pwm(u8 val) { |
---|
| 199 | u32 hw_control; |
---|
| 200 | u32 temp_control; |
---|
| 201 | u32 right_dp; |
---|
| 202 | u8 left_val; |
---|
| 203 | u8 right_val; |
---|
| 204 | u32 pwm_val; |
---|
| 205 | |
---|
| 206 | // Need to retain the value of the right decimal point |
---|
| 207 | right_dp = userio_read_hexdisp_right(USERIO_BASEADDR) & W3_USERIO_HEXDISP_DP; |
---|
| 208 | |
---|
| 209 | if (val < 10) { |
---|
| 210 | left_val = 0; |
---|
| 211 | right_val = hex_to_seven_segment(val); |
---|
| 212 | } else { |
---|
| 213 | if (val < 100) { |
---|
| 214 | left_val = hex_to_seven_segment(((val / 10) % 10)); |
---|
| 215 | right_val = hex_to_seven_segment((val % 10)); |
---|
| 216 | } else { |
---|
| 217 | if (val != 255) { |
---|
| 218 | left_val = hex_to_seven_segment(0x00); |
---|
| 219 | right_val = hex_to_seven_segment(0x00); |
---|
| 220 | } else { |
---|
| 221 | left_val = 0x40; |
---|
| 222 | right_val = 0x40; |
---|
| 223 | } |
---|
| 224 | } |
---|
| 225 | } |
---|
| 226 | |
---|
| 227 | // Store the original value of what is under HW control |
---|
| 228 | hw_control = userio_read_control(USERIO_BASEADDR); |
---|
| 229 | |
---|
| 230 | // Need to zero out all of the HW control of the hex displays; Change to raw hex mode |
---|
| 231 | temp_control = (hw_control & (~(W3_USERIO_HEXDISP_L_MAPMODE | W3_USERIO_HEXDISP_R_MAPMODE | W3_USERIO_CTRLSRC_HEXDISP_R | W3_USERIO_CTRLSRC_HEXDISP_L))); |
---|
| 232 | |
---|
| 233 | // Set the hex display mode to raw bits |
---|
| 234 | userio_write_control(USERIO_BASEADDR, temp_control); |
---|
| 235 | |
---|
| 236 | // Write the display |
---|
| 237 | userio_write_hexdisp_left(USERIO_BASEADDR, left_val); |
---|
| 238 | userio_write_hexdisp_right(USERIO_BASEADDR, (right_val | right_dp)); |
---|
| 239 | |
---|
| 240 | pwm_val = (right_val << 8) + left_val; |
---|
| 241 | |
---|
| 242 | // Set the HW / SW control of the user io (raw mode w/ the new display value) |
---|
| 243 | userio_write_control(USERIO_BASEADDR, (temp_control | pwm_val)); |
---|
| 244 | |
---|
| 245 | // Set the pins that are using PWM mode |
---|
| 246 | userio_set_hw_ctrl_mode_pwm(USERIO_BASEADDR, pwm_val); |
---|
| 247 | } |
---|
| 248 | |
---|
| 249 | |
---|
| 250 | |
---|
| 251 | /*****************************************************************************/ |
---|
| 252 | /** |
---|
| 253 | * @brief Set Error Status for Node |
---|
| 254 | * |
---|
| 255 | * Function will set the hex display to be "Ex", where x is the value of the |
---|
| 256 | * status error |
---|
| 257 | * |
---|
| 258 | * @param status - Number from 0 - 0xF to indicate status error |
---|
| 259 | * @return None |
---|
| 260 | */ |
---|
| 261 | void set_hex_display_error_status(u8 status) { |
---|
| 262 | u32 right_dp; |
---|
| 263 | |
---|
| 264 | // Need to retain the value of the right decimal point |
---|
| 265 | right_dp = userio_read_hexdisp_right(USERIO_BASEADDR) & W3_USERIO_HEXDISP_DP; |
---|
| 266 | |
---|
| 267 | userio_write_control(USERIO_BASEADDR, (userio_read_control(USERIO_BASEADDR) & (~(W3_USERIO_HEXDISP_L_MAPMODE | W3_USERIO_HEXDISP_R_MAPMODE)))); |
---|
| 268 | |
---|
| 269 | userio_write_hexdisp_left(USERIO_BASEADDR, hex_to_seven_segment(0xE)); |
---|
| 270 | userio_write_hexdisp_right(USERIO_BASEADDR, (hex_to_seven_segment(status % 16) | right_dp)); |
---|
| 271 | } |
---|
| 272 | |
---|
| 273 | |
---|
| 274 | |
---|
| 275 | /*****************************************************************************/ |
---|
| 276 | /** |
---|
| 277 | * @brief Blink LEDs |
---|
| 278 | * |
---|
| 279 | * For WARP v3 Hardware, this function will blink the hex display. |
---|
| 280 | * |
---|
| 281 | * @param num_blinks - Number of blinks (0 means blink forever) |
---|
| 282 | * @param blink_time - Time in microseconds between blinks |
---|
| 283 | * |
---|
| 284 | * @return None |
---|
| 285 | */ |
---|
| 286 | void blink_hex_display(u32 num_blinks, u32 blink_time) { |
---|
| 287 | u32 i; |
---|
| 288 | u32 hw_control; |
---|
| 289 | u32 temp_control; |
---|
| 290 | u8 right_val; |
---|
| 291 | u8 left_val; |
---|
| 292 | |
---|
| 293 | // Get left / right values |
---|
| 294 | left_val = userio_read_hexdisp_left(USERIO_BASEADDR); |
---|
| 295 | right_val = userio_read_hexdisp_right(USERIO_BASEADDR); |
---|
| 296 | |
---|
| 297 | // Store the original value of what is under HW control |
---|
| 298 | hw_control = userio_read_control(USERIO_BASEADDR); |
---|
| 299 | |
---|
| 300 | // Need to zero out all of the HW control of the hex displays; Change to raw hex mode |
---|
| 301 | temp_control = (hw_control & (~(W3_USERIO_HEXDISP_L_MAPMODE | W3_USERIO_HEXDISP_R_MAPMODE | W3_USERIO_CTRLSRC_HEXDISP_R | W3_USERIO_CTRLSRC_HEXDISP_L))); |
---|
| 302 | |
---|
| 303 | // Set the hex display mode to raw bits |
---|
| 304 | userio_write_control(USERIO_BASEADDR, temp_control); |
---|
| 305 | |
---|
| 306 | // Use wlan_usleep to blink the display |
---|
| 307 | if (num_blinks > 0) { |
---|
| 308 | // Perform standard blink |
---|
| 309 | for (i = 0; i < num_blinks; i++) { |
---|
| 310 | userio_write_hexdisp_left(USERIO_BASEADDR, (((i % 2) == 0) ? left_val : 0x00)); |
---|
| 311 | userio_write_hexdisp_right(USERIO_BASEADDR, (((i % 2) == 0) ? right_val : 0x00)); |
---|
| 312 | wlan_usleep(blink_time); |
---|
| 313 | } |
---|
| 314 | } else { |
---|
| 315 | // Perform an infinite blink |
---|
| 316 | i = 0; |
---|
| 317 | while (1) { |
---|
| 318 | userio_write_hexdisp_left(USERIO_BASEADDR, (((i % 2) == 0) ? left_val : 0x00)); |
---|
| 319 | userio_write_hexdisp_right(USERIO_BASEADDR, (((i % 2) == 0) ? right_val : 0x00)); |
---|
| 320 | wlan_usleep(blink_time); |
---|
| 321 | i++; |
---|
| 322 | } |
---|
| 323 | } |
---|
| 324 | |
---|
| 325 | // Set control back to original value |
---|
| 326 | userio_write_control( USERIO_BASEADDR, hw_control ); |
---|
| 327 | } |
---|
| 328 | |
---|
| 329 | |
---|
| 330 | |
---|
| 331 | /*****************************************************************************/ |
---|
| 332 | /** |
---|
| 333 | * @brief Set Right Decimal Point on the Hex Display |
---|
| 334 | * |
---|
| 335 | * This function will set the right decimal point on the hex display |
---|
| 336 | * |
---|
| 337 | * @param val - 0 - Clear decimal point; 1 - Set decimal point |
---|
| 338 | * @return None |
---|
| 339 | */ |
---|
| 340 | void set_hex_display_right_dp(u8 val) { |
---|
| 341 | if (val) { |
---|
| 342 | userio_write_hexdisp_right(USERIO_BASEADDR, (userio_read_hexdisp_right(USERIO_BASEADDR) | W3_USERIO_HEXDISP_DP)); |
---|
| 343 | } else { |
---|
| 344 | userio_write_hexdisp_right(USERIO_BASEADDR, (userio_read_hexdisp_right(USERIO_BASEADDR) & ~W3_USERIO_HEXDISP_DP)); |
---|
| 345 | } |
---|
| 346 | } |
---|
| 347 | |
---|
| 348 | |
---|
| 349 | |
---|
| 350 | /*****************************************************************************/ |
---|
| 351 | /** |
---|
| 352 | * @brief Set Left Decimal Point on the Hex Display |
---|
| 353 | * |
---|
| 354 | * This function will set the left decimal point on the hex display |
---|
| 355 | * |
---|
| 356 | * @param val - 0 - Clear decimal point; 1 - Set decimal point |
---|
| 357 | * @return None |
---|
| 358 | */ |
---|
| 359 | void set_hex_display_left_dp(u8 val) { |
---|
| 360 | if (val) { |
---|
| 361 | userio_write_hexdisp_left(USERIO_BASEADDR, (userio_read_hexdisp_left(USERIO_BASEADDR) | W3_USERIO_HEXDISP_DP)); |
---|
| 362 | } else { |
---|
| 363 | userio_write_hexdisp_left(USERIO_BASEADDR, (userio_read_hexdisp_left(USERIO_BASEADDR) & ~W3_USERIO_HEXDISP_DP)); |
---|
| 364 | } |
---|
| 365 | } |
---|
| 366 | |
---|
| 367 | |
---|