aboutsummaryrefslogblamecommitdiff
path: root/projects/hsm/mgmt-misc.h
blob: 862ca0c063228a0f2ebd9643b9820ca169f4fb14 (plain) (tree)




































                                                                           

                   

                                                    

                                                                                                            

                                                    
                                    
/*
 * mgmt-misc.h
 * -----------
 * Management CLI miscellaneous functions.
 *
 * Copyright (c) 2016, NORDUnet A/S All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 *
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * - Neither the name of the NORDUnet nor the names of its contributors may
 *   be used to endorse or promote products derived from this software
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef __STM32_CLI_MGMT_MISC_H
#define __STM32_CLI_MGMT_MISC_H

#include <libcli.h>

typedef int (*cli_data_callback)(uint8_t *, size_t);

extern int cli_receive_data(struct cli_def *cli, uint8_t *buf, size_t len, cli_data_callback data_callback);

extern void configure_cli_misc(struct cli_def *cli);

#endif /* __STM32_CLI_MGMT_MISC_H */
IN_9|GPIO_PIN_10|GPIO_PIN_11 \ |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15) #define GPIOF_PINS (GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 \ |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_12|GPIO_PIN_13 \ |GPIO_PIN_14|GPIO_PIN_15) #define GPIOG_PINS (GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 \ |GPIO_PIN_4|GPIO_PIN_5) #define GPIOH_PINS (GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 \ |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15) #define GPIOI_PINS (GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_0|GPIO_PIN_1 \ |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6|GPIO_PIN_7) int main() { stm_init(); // enable gpio clocks __GPIOA_CLK_ENABLE(); __GPIOB_CLK_ENABLE(); __GPIOD_CLK_ENABLE(); __GPIOE_CLK_ENABLE(); __GPIOF_CLK_ENABLE(); __GPIOG_CLK_ENABLE(); __GPIOH_CLK_ENABLE(); __GPIOI_CLK_ENABLE(); while (1) { HAL_GPIO_TogglePin(LED_PORT, LED_GREEN); uart_send_string("\r\n\r\n\r\n\r\n\r\n"); test_for_shorts('B', GPIOB, GPIOB_PINS); test_for_shorts('D', GPIOD, GPIOD_PINS); test_for_shorts('E', GPIOE, GPIOE_PINS); test_for_shorts('F', GPIOF, GPIOF_PINS); test_for_shorts('G', GPIOG, GPIOG_PINS); test_for_shorts('H', GPIOH, GPIOH_PINS); test_for_shorts('I', GPIOI, GPIOI_PINS); led_toggle(LED_BLUE); HAL_Delay(2000); } } void configure_all_as_input(GPIO_TypeDef* GPIOx, uint16_t GPIO_Test_Pins) { GPIO_InitTypeDef GPIO_InitStruct; /* Configure all pins as input. XXX do all pins (0xffff) instead of just GPIO_Test_Pins? */ GPIO_InitStruct.Pin = GPIO_Test_Pins; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); } uint8_t check_no_input(char port, GPIO_TypeDef* GPIOx, uint16_t GPIO_Test_Pins, char wrote_port, uint16_t wrote_value) { uint16_t read; /* Read all pins from port at once. XXX check all pins, not just GPIO_Test_Pins? */ read = (GPIOx->IDR & GPIO_Test_Pins); if (! read) { /* No unexpected pins read as HIGH */ return 0; } led_on(LED_RED); uart_send_string("Wrote "); uart_send_binary(wrote_value, 16); uart_send_string(" to port GPIO"); uart_send_char(wrote_port); uart_send_string(", read "); uart_send_binary(read, 16); uart_send_string(" from GPIO"); uart_send_char(port); uart_send_string("\r\n"); return 1; } void test_for_shorts(char port, GPIO_TypeDef* GPIOx, uint16_t GPIO_Test_Pins) { GPIO_InitTypeDef GPIO_InitStruct; uint16_t i, fail = 0, Test_Pin, read; configure_all_as_input(GPIOB, GPIOB_PINS); configure_all_as_input(GPIOD, GPIOD_PINS); configure_all_as_input(GPIOE, GPIOE_PINS); configure_all_as_input(GPIOF, GPIOF_PINS); configure_all_as_input(GPIOG, GPIOG_PINS); configure_all_as_input(GPIOH, GPIOH_PINS); configure_all_as_input(GPIOI, GPIOI_PINS); check_no_input('B', GPIOB, GPIOB_PINS, 'x', 0); check_no_input('D', GPIOD, GPIOD_PINS, 'x', 0); check_no_input('E', GPIOE, GPIOE_PINS, 'x', 0); check_no_input('F', GPIOF, GPIOF_PINS, 'x', 0); check_no_input('G', GPIOG, GPIOG_PINS, 'x', 0); check_no_input('H', GPIOH, GPIOH_PINS, 'x', 0); check_no_input('I', GPIOI, GPIOI_PINS, 'x', 0); for (i = 0; i < 31; i++) { Test_Pin = 1 << i; if (! (GPIO_Test_Pins & Test_Pin)) continue; configure_all_as_input(GPIOx, GPIO_Test_Pins); /* Change one pin to output */ GPIO_InitStruct.Pin = Test_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOx, Test_Pin, GPIO_PIN_SET); /* Slight delay after setting the output pin. Without this, the Test_Pin bit might read as zero, as it is only sampled once every AHB1 clock cycle. Reference manual DM00031020 section 8.3.1. */ HAL_Delay(1); /* Read all input GPIOs from port at once. XXX check all pins, not just GPIO_Test_Pins? */ read = GPIOx->IDR & GPIO_Test_Pins; if (read == Test_Pin) { /* No unexpected pins read as HIGH */ led_toggle(LED_GREEN); } else { led_on(LED_RED); uart_send_string("GPIO"); uart_send_char(port); uart_send_string(" exp "); uart_send_binary(Test_Pin, 16); uart_send_string(" got "); uart_send_binary(read, 16); uart_send_string(" diff "); uart_send_binary(read ^ Test_Pin, 16); uart_send_string("\r\n"); fail++; } /* Check there is no input on any of the other GPIO ports (adjacent pins might live on different ports) */ if (port != 'B') fail += check_no_input('B', GPIOB, GPIOB_PINS, port, Test_Pin); if (port != 'D') fail += check_no_input('D', GPIOD, GPIOD_PINS, port, Test_Pin); if (port != 'E') fail += check_no_input('E', GPIOE, GPIOE_PINS, port, Test_Pin); if (port != 'F') fail += check_no_input('F', GPIOF, GPIOF_PINS, port, Test_Pin); if (port != 'G') fail += check_no_input('G', GPIOG, GPIOG_PINS, port, Test_Pin); if (port != 'H') fail += check_no_input('H', GPIOH, GPIOH_PINS, port, Test_Pin); if (port != 'I') fail += check_no_input('I', GPIOI, GPIOI_PINS, port, Test_Pin); HAL_GPIO_WritePin(GPIOx, Test_Pin, GPIO_PIN_RESET); } if (fail) { uart_send_string("\r\n"); } }