[rhéobus] contrôle logiciel des ventilateurs

Autres projets et contributions
avi3000
Chu Ko Nu
Messages : 330
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

[rhéobus] contrôle logiciel des ventilateurs

Message par avi3000 » sam. 13 juin 2015, 19:47

Bonjour,

N'étant pas satisfait du fonctionnement de fancontrol, j'ai codé mon rhéobus (30 €+ de hardware économisé).
les sources sont ici

Utiliser pwmconfig (en root) pour détecter les contrôleurs des ventilos.
Avec les cartes mères asus, il faut positionner l'option q-fan dans le bios.

config.h (exemple)

Code : Tout sélectionner

/*------------------------------------------------------*/
/*  rheobus : contrôle de la vitesse des ventilateurs   */  
/*------------------------------------------------------*/

#define HOSTNAME    "asus4570"
#define PWMPATH     "/sys/class/hwmon/hwmon1/"
#define NIVEAUX     5   

typedef struct {
    char            *device;
    char            *enable;
    char            *input;
    unsigned char   pwm[NIVEAUX];
    int             speed[NIVEAUX]; /* pour usage */
} Fan;

static Fan fans[] = { 
/*[1] = {"pwm1", "pwm1_enable", "fan1_input", {1,  100, 140, 200, 255}, {820,1130,1300,1400,1500}},*/
[2] = {"pwm2", "pwm2_enable", "fan2_input", {0,  160, 172, 192, 255}, {920,1050,1200,1450,1700}},
};

// vim: ts=4 sw=4
rheobus.c

Code : Tout sélectionner

/*---------------------------------------------------------*/
/*  rheobus n :   contrôle de la vitesse des ventilateurs  */
/*                règle tous les ventilateurs au niveau n. */
/*                La vitesse de chaque ventilateur n'est   */
/*                pas forcément identique pour un niveau.  */
/*                                                         */
/*  rheobus n v : règle la vitesse du ventilateur v au     */
/*                niveau n.                                */
/*---------------------------------------------------------*/

#define PRGNAME     "rheobus"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "config.h"     /*  settings    */         

#define NBFAN   sizeof(fans) / sizeof(fans[0])

static FILE *open_file(char *fname, char *mode);
static unsigned int read_uint(char *fname);
static void usage(void);

/*--------------------------------------*/
/*  ouvre un fichier dans pwmpath       */
/*--------------------------------------*/
FILE *open_file(char *fname, char *mode)
{
    static char path[60];
    sprintf(path, PWMPATH "%s", fname);
    return(fopen(path, mode));
}

/*--------------------------------------*/
/*  extrait l'entier d'un fichier       */
/*--------------------------------------*/
unsigned int read_uint(char *fname)
{
    static FILE *f;
    static unsigned int i;

    if ( (f = open_file(fname, "rb")) == NULL )
        return(0);

    fscanf(f, "%u", &i);
    fclose(f);
    return(i);
}

void usage(void) {
    int j;
    fprintf(stderr,
        "\n\trheobus multi-voies: contrôle de la vitesse des ventilateurs"
        "\n\t\tconfiguration %s\n"
        "\n\tUsage: %s niveau [ventilateur {0..9}]\n",
        HOSTNAME, PRGNAME);

    for(j=0;j<NBFAN;j++) {
        if ( !fans[j].device )
            continue;
        fprintf(stderr,
            "\n\tfan%i,\n\tpwm, rpm : %3u, %4u\n",
            j, read_uint(fans[j].device), read_uint(fans[j].input));
        fprintf(stderr,
            "\n\tniveau: %6i, %4i, %4i, %4i, %4i", 1, 2, 3, 4, 5);
        fprintf(stderr,
            "\n\tpwm:%10i, %4i, %4i, %4i, %4i",
            fans[j].pwm[0], fans[j].pwm[1], fans[j].pwm[2], fans[j].pwm[3], fans[j].pwm[4]);
        fprintf(stderr,
            "\n\ttours/mn: %4i, %4i, %4i, %4i, %4i\n\n",
            fans[j].speed[0], fans[j].speed[1], fans[j].speed[2], fans[j].speed[3], fans[j].speed[4]);
    }
    exit(1);
}

int main(int argc, char *argv[]) {
    static unsigned char c, niveau;
    static int i, ub=NBFAN;
    static FILE *f;

    if ( argc > 3 || argc < 2 || strlen(argv[1]) != 1  )
        usage();
    else if ( argc > 2 && strlen(argv[2]) != 1  )
        usage();

    niveau = argv[1][0] - '0';
    if ( niveau > NIVEAUX || niveau < 1 )
        usage();

    if ( argc > 2 ) {
        c = argv[2][0] - '0';
        if ( fans[c].device ) {
            i = c;
            ub = i + 1;
        }
        else {
            fprintf(stderr, "\n\tventilateur %s inexistant.\n\n", argv[2]);
            usage();
        }
    }

    for(;i<ub;i++) {
        if ( !fans[i].device )
            continue;
        if ( (f = open_file(fans[i].enable, "w")) == NULL )
            usage();
        fprintf(f, "1");
        fclose(f);

        if ( (f = open_file(fans[i].device, "w")) == NULL )
            usage();
        c = argv[1][0] - '0';
        fprintf(f, "%i", fans[i].pwm[niveau-1]);
        fclose(f);
    }
}

// vim: ts=4 sw=4
Makefile

Code : Tout sélectionner

#
CC			= gcc
OPTIONS     = -std=c99 -Wall -o
CFLAGS		=

all: rheobus

rheobus: rheobus.c
	@$(CC) $(OPTIONS) $@ $< $(CFLAGS)

install:
	cp rheobus /usr/local/bin
	chmod +s /usr/local/bin/rheobus

clean:
	rm -f *.o
# vim:sw=4 ts=4

Avatar de l’utilisateur
Xorg
Maître du Kyudo
Messages : 1927
Inscription : dim. 22 janv. 2012, 19:25
Localisation : Entre le clavier et la chaise.
Contact :

Re: [rhéobus] contrôle logiciel des ventilateurs

Message par Xorg » sam. 13 juin 2015, 21:13

Merci à toi. C'est FoolEcho qui va être content. :D
Arch Linux x86_64 - Gnome 3 (Wayland)
- Desktop : Intel® Core™ i5 2500K - 8Go de DDR3 - SSD 250Go + 2 HDD 500Go
- Laptop : Intel® Pentiuml® 4405U - 4Go de DDR4 - SSD 120Go
Image AUR___Image Wiki___Image GitHub
Tux est un manchot, et non un pingouin. :marche:

avi3000
Chu Ko Nu
Messages : 330
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [rhéobus] contrôle logiciel des ventilateurs

Message par avi3000 » sam. 13 juin 2015, 22:21

Utilise mon programme, tu pourras revendre ton rhéobus 6 ports sur iBé

avi3000
Chu Ko Nu
Messages : 330
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [rhéobus] contrôle logiciel des ventilateurs

Message par avi3000 » sam. 13 juin 2015, 22:24

ou sur le bon quouin

Avatar de l’utilisateur
Xorg
Maître du Kyudo
Messages : 1927
Inscription : dim. 22 janv. 2012, 19:25
Localisation : Entre le clavier et la chaise.
Contact :

Re: [rhéobus] contrôle logiciel des ventilateurs

Message par Xorg » dim. 14 juin 2015, 12:37

Non désolé, je ne compte pas le revendre. J'ai moddé tous mes câbles de ventilateurs, et la majorité des ventilateurs ont un câble de retour sur la carte-mère pour que j'aie leur vitesse de rotation.
Donc ça serait défaire du travail où j'ai passé plusieurs heures dessus. Et je préfère la solution matérielle, c'est plus rapide quand tu veux modifier la vitesse de tous les ventilateurs (et j'ai un bouton on/off par ventilateur), et c'est plus universel comme méthode, je n'ai pas à me poser des questions quand je boot en PXE, la vitesse des ventilateurs est identique peut importe l'OS qui tourne. :chinois:

Je n'ai pas de compte sur eBay et LeBonCoin car je revends rien. :)
Arch Linux x86_64 - Gnome 3 (Wayland)
- Desktop : Intel® Core™ i5 2500K - 8Go de DDR3 - SSD 250Go + 2 HDD 500Go
- Laptop : Intel® Pentiuml® 4405U - 4Go de DDR4 - SSD 120Go
Image AUR___Image Wiki___Image GitHub
Tux est un manchot, et non un pingouin. :marche:

Répondre