//********************************************************************************************************************************************************************************** // Fichier SORTIES.C // // Contient toutes les fonctions liées à l'écriture sur les sorties, quel que soit leur type //**********************************************************************************************************************************************************************************/ // Includes : #include "main.h" // Prototypes : void ecriture_sortie(uint8_t type, uint8_t module, uint8_t no, uint8_t valeur); void ecriture_sortie_gpio(int16_t no, int8_t valeur, int8_t logique); int8_t init_sorties(void); int8_t init_sorties_gpio(void); int16_t sortie_no(uint8_t type, uint8_t module, uint8_t no); // Variables globales : struct Struct_sorties sorties; struct gpiod_chip *gpiod_chip0_sorties; // Nécessaire pour CM5 struct gpiod_line_request *gpiod_sorties_request; // Nécessaire pour CM5 /********************************************************************************************************************************************************************************** Fonction ECRITURE_SORTIE Fonction utilisée pour mettre à jour l'état d'une sortie, quel que soit sont type. Reçoit en paramètre : le Type de sortie, le module comportant la sortie, le n° sur le module et la valeur à appliquer **********************************************************************************************************************************************************************************/ void ecriture_sortie(uint8_t type, uint8_t module, uint8_t no, uint8_t valeur) { int x; x = sortie_no(type, module, no); if (x != -1) { switch(type) { case TYPE_SORTIE_GPIO : { sorties.gpio.sorties[x].valeur = valeur; ecriture_sortie_gpio(sorties.gpio.sorties[x].no, sorties.gpio.sorties[x].valeur, sorties.gpio.sorties[x].logique); break; } } } } /********************************************************************************************************************************************************************************** Fonction INIT_SORTIES Intitialisation des entrées, quel que soit leur type. **********************************************************************************************************************************************************************************/ int8_t init_sorties(void) { // Init des sorties GPIO : if (init_sorties_gpio() == -1) return(-1); return(0); } /********************************************************************************************************************************************************************************** Fonction INIT_SORTIES_GPIO Configure les I/O du GPIO Renvoi -1 en cas d'erreur lors de l'initialisation. **********************************************************************************************************************************************************************************/ int8_t init_sorties_gpio(void) { int flag_erreur = 0; uint8_t groupe; uint8_t position_groupe; uint8_t i; char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; i = 0; if (systeme.generation_shipbase == GENERATION_SHIPBASE_V1) { sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_DO_MOD_WKUP; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_DO_USB_AVANT_PWR_EN; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_DO_TO_UC; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_Pdown_HDMI_CMD_N; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_DO_WIFI_CHIP_EN; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_DO_PWKEY_MOD; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_DO_AUDIO_SD; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_DO_TEST_TP1140; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_DO_TEST_TP1141; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_DO_TEST_TP1142; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_DO_LCD_EN_VGx; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM3P_DO_LCD_EN_VDD; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; } else // V2 et V3 : { sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM4_DO_TO_UC; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM4_DO_USB_ARRIERE_PWR_EN; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM4_DO_GNSS_EXTINT; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM4_DO_AUDIO_SD; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM4_DO_GNSS_SAFEBOOT; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM4_Pdown_HDMI_CMD_N; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM4_DO_USB_AVANT_PWR_EN; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM4_DO_EN_LCD_VGx; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; sorties.gpio.sorties[i].flag_validite = TRUE; sorties.gpio.sorties[i].no = CM4_DO_EN_LCD_VDD; sorties.gpio.sorties[i].pull = NO_PUP_PDN; sorties.gpio.sorties[i].logique = 1; i ++; } //==================================================================================================== // V3 (CM5) : réservation groupée des lignes GPIO via libgpiod, en sortie, // avec valeur initiale LOW (comportement identique à l'ancienne méthode mmap au premier boot). //==================================================================================================== if (systeme.generation_shipbase == GENERATION_SHIPBASE_V3) { unsigned int offsets[MAX_NOMBRE_SORTIES_GPIO]; uint8_t nb_lignes = 0; struct gpiod_line_settings *settings = gpiod_line_settings_new(); gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_OUTPUT); gpiod_line_settings_set_output_value(settings, GPIOD_LINE_VALUE_INACTIVE); // Etat bas par défaut, cf discussion struct gpiod_line_config *line_cfg = gpiod_line_config_new(); struct gpiod_request_config *req_cfg = gpiod_request_config_new(); gpiod_request_config_set_consumer(req_cfg, "shipheart_sorties"); gpiod_chip0_sorties = gpiod_chip_open("/dev/gpiochip0"); if (gpiod_chip0_sorties == NULL) { sprintf(tmp, "Ouverture de /dev/gpiochip0 (sorties) impossible..."); affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR); return(-1); } for (i=0; i