Configuration des boutons d'entrée sur le carte de développement 100ASK_V853-PRO

  1. Introduction

La carte de développement 100ASK_V853-PRO dispose de 5 boutons функциональных. Ce chapitre explique comment activer ces cinq boutons.

  1. Principe des boutons функциональных du V853

Les 5 boutons disponibles sur la carte 100ASK_V853-PRO sont simulés via le module de conversion analogique-numérique GPADC haute précision. Le GPADC est un module de conversion avec une résolution de 12 bits et une précision d'échantillonnage de 8 bits. Le nombre de canaux spécifiques peut être trouvé dans la documentation technique correspondante. La plage d'entrée analogique est de 0 à 1,8V, avec un taux d'échantillonnage maximal de 1 MHz. Le module prend en charge la comparaison de données et l'auto-vérification, fonctionnant dans plusieurs modes configurables :

  1. Single mode : Effectue une conversion sur le canal spécifié et place les données dans le registre correspondant.
  2. Single-cycle mode : Effectue une conversion en un cycle sur le canal spécifié et place les données dans le registre.
  3. Continuous mode : Effectue des conversions continues sur le canal spécifié et place les données dans le registre.
  4. Burst mode : Échantillonne et convertit simultanément, plaçant les données dans un FIFO de 32 octets avec gestion des interruptions.

Certaines interfaces GPADC sont utilisées pour la lecture des boutons du module KEY, incluant généralement VOL+, VOL-, HOME, MENU, ENTER, etc. Le circuit GPADC0 utilisé pour les boutons est illustré ci-dessus. L'alimentation AVCC-AP est de 1,8V. Cuando se presiona diferentes botones, la tensión en el puerto GPADC0 varía. El CPU determina qué botón se ha presionado midiendo esta tensión. Comme le montre la figure, les tensions pour VOL+, VOL-, MENU, ENTER et HOME/UBOOT sont respectivement 0,21V, 0,41V, 0,59V, 0,75V et 0,88V. Pour plus de détails, consultez le manuel de développement système 100ASK-V853_Pro, chapitre 13 de la cinquième partie sur le développement de drivers Linux GPADC.

  1. Pilote GPADC

Le pilote GPADC se trouve aux emplacements suivants :

tina-v853-open/kernel/linux-4.9/drivers/input/sensor/sunxi_gpadc.c
tina-v853-open/kernel/linux-4.9/drivers/input/sensor/sunxi_gpadc.h

  1. Configuration du noyau GPADC

Dans le répertoire racine de Tina, exécutez make kernel_menuconfig :

book@100ask:~/workspaces/tina-v853-open$ make kernel_menuconfig

Accédez au répertoire suivant et appuyez sur Y pour activer le pilote SUNXI GPADC :

→ Device Drivers 
    → Input device support 
        → Sensors
             <*>   SUNXI GPADC

La configuration terminée est illustrée dans la figure ci-dessous. Enregistrez et quittez l'interface de configuration du noyau.

  1. Configuration de l'arbre de périphériques GPADC

Emplacement de l'arbre de périphériques du noyau :

tina-v853-open/device/config/chips/v853/configs/100ask/board.dts

Accédez à ce répertoire et ouvrez board.dts avec vi board.dts :

book@100ask:~/workspaces/tina-v853-open$ cd device/config/chips/v853/configs/100ask/
book@100ask:~/workspaces/tina-v853-open/device/config/chips/v853/configs/100ask$ ls
BoardConfig.mk  board.dts  buildroot  env.cfg  linux-4.9  sys_config.fex  uboot-board.dts
book@100ask:~/workspaces/tina-v853-open/device/config/chips/v853/configs/100ask$ vi board.dts

Recherchez le nœud &gpadc, qui contient la configuration d'échantillonnage, les clés et les données de tension.

&gpadc {
    channel_num = <1>;                        // Utilisation du canal 1
    channel_select = <0x01>;                  // Sélection du canal 0x01
    channel_data_select = <0>;                // Activation du canal de données
    channel_compare_select = <0x01>;          // Activation de la fonction de comparaison de canal
    channel_cld_select = <0x01>;              // Activation de la fonction de comparaison inférieure
    channel_chd_select = <0>;                 // Activation de la fonction de comparaison supérieure
    channel0_compare_lowdata = <1700000>;     // Déclenchement d'interruption si inférieur à cette valeur
    channel0_compare_higdata = <1200000>;     // Déclenchement d'interruption si supérieur à cette valeur
    channel1_compare_lowdata = <460000>;      // Déclenchement d'interruption si inférieur à cette valeur
    channel1_compare_higdata = <1200000>;     // Déclenchement d'interruption si supérieur à cette valeur
    key_cnt = <5>;                            // Nombre de boutons
    key0_vol = <210>;                         // Tension du bouton en mV
    key0_val = <115>;                         // Valeur de la touche pressée
    key1_vol = <410>;                         // Tension du bouton en mV
    key1_val = <114>;                         // Valeur de la touche pressée
    key2_vol = <590>;                         // Tension du bouton en mV
    key2_val = <139>;                         // Valeur de la touche pressée
    key3_vol = <750>;                         // Tension du bouton en mV
    key3_val = <28>;                          // Valeur de la touche pressée
    key4_vol = <880>;                         // Tension du bouton en mV
    key4_val = <102>;                         // Valeur de la touche pressée
    status = "okay";                          // Activation du GPADC
};

Nous pouvons également trouver dans le fichier board.dts une partie de la configuration rarement modifiée, conservée dans le fichier sun8iw21p1.dtsi. Accédez à ce répertoire et ouvrez ce fichier.

book@100ask:~/workspaces/tina-v853-open$ cd kernel/linux-4.9/arch/arm/boot/dts/
book@100ask:~/workspaces/tina-v853-open/kernel/linux-4.9/arch/arm/boot/dts$ vi sun8iw21p1.dtsi

Consultez le nœud gpadc. La configuration ici contient les informations d'interruption et d'horloge, mais n'est pas activée par défaut. Remarque : vous n'avez pas besoin de modifier ceci car la configuration status définie ici sera écrasée par le status dans board.dts. Tant que board.dts est défini sur activé, l'arbre de périphériques généré et intégré à l'image sera activé.

gpadc:gpadc@2009000 {
    compatible = "allwinner,sunxi-gpadc";         // Pour la liaison entre pilote et périphérique
    reg = <0x0 0x02009000 0x0 0x400>;             // Adresse des registres utilisés par le périphérique
    interrupts = <GIC_SPI 57 IRQ_TYPE_NONE>;      // Interruptions utilisées par le périphérique
    clocks = <&clk_gpadc>;                        // Horloge utilisée par le périphérique
    status = "disabled";                          // Configuration GPADC désactivée par défaut
};

  1. Ajout du package de test getevent

Exécutez make menuconfig dans le répertoire racine de Tina :

book@100ask:~/workspaces/tina-v853-open$ make menuconfig

Accédez au répertoire Utilities et appuyez sur Y pour sélectionner getevent :

 > Utilities
     <*> getevent.................................... getevent for Android Toolbox 

La configuration terminée est illustrée dans la figure ci-dessous. Enregistrez et quittez l'interface de configuration Tina.

  1. Compilation, empaquetage et flashage

Dans le répertoire racine de Tina, exécutez make -j32 :

book@100ask:~/workspaces/tina-v853-open$ make -j32
...
book@100ask:~/workspaces/tina-v853-open$ pack
...

Après la génération de l'image, copiez l'image v853_linux_100ask_uart0.img du répertoire tina-v853-open/out/v853/100ask/openwrt/ vers un ordinateur Windows. Utilisez l'outil de flashage PhoenixSuit d'Allwinner pour graver l'image sur la carte de développement.

Branchez le câble d'alimentation 12V et les deux câbles Type-C, basculez l'interrupteur vers l'interface d'alimentation pour mettre sous tension. Après le flashage de la nouvelle image, attendez le démarrage du système. Entrez getevent dans la ligne de commande pour accéder au programme de test. Grâce aux informations imprimées, nous savons que les informations rapportées par le pilote gpadc utilisent /dev/input/event1. Appuyez sur un bouton pour lire sa valeur.

root@TinaLinux:~# getevent
add device 1: /dev/input/event2
  name:     "ft6336"
add device 2: /dev/input/event1
  name:     "sunxi-gpadc0"
add device 3: /dev/input/event0
  name:     "axp2101-pek"
poll 4, returned 1
/dev/input/event1: 0001 0073 00000001
poll 4, returned 1
/dev/input/event1: 0000 0000 00000000
poll 4, returned 1
/dev/input/event1: 0001 0073 00000000
poll 4, returned 1
/dev/input/event1: 0000 0000 00000000

Appuyez sur Ctrl+C pour terminer le test.

  1. Écriture d'une application de test

Through previous chapter testing, we learned that gpadc uses /dev/input/event1 to report button data. Therefore, the node for data acquisition in our application should be /dev/input/event1. The application is shown below.

#include <stdio.h>
#include <linux/input.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <limits.h>
#include <unistd.h>
#include <signal.h>

#define INPUT_NODE "/dev/input/event1"
static int gpadc_handle = 0;

unsigned int read_gpadc_data(const char * event_path)
{
    int code = 0, iter;
    struct input_event ev_data;
    gpadc_handle = open(INPUT_NODE, O_RDONLY);

    if(gpadc_handle <= 0)
    {
        printf("Échec de l'ouverture de %s!\n", INPUT_NODE);
        return -1;
    }

    for(iter = 0; iter < 10; iter++)
    {
        read(gpadc_handle, &ev_data, sizeof(ev_data));
        if(ev_data.value == 1)
        {
            printf("Bouton %d pressé\n", ev_data.code);
        }
        else if(ev_data.value == 0)
        {
            printf("Bouton %d relâché\n", ev_data.code);
        }
    }
    close(gpadc_handle);
    return 0;
}

int main(int argc, const char *argv[])
{
    return read_gpadc_data(INPUT_NODE);
}

  1. Compilation de l'application et test

Créez un nouveau répertoire gpadc pour stocker l'application et le programme exécutable.

book@100ask:~/workspaces$ mkdir gpadc_test
book@100ask:~/workspaces$ cd gpadc_test/
book@100ask:~/workspaces/gpadc_test$ vi gpadc_test.c

Copiez l'application écrite dans la section précédente dans gpadc_test.c et enregistrez.

Après l'écriture, nous devons fournir l'environnement de compilation pour l'application gpadc_test. Entrez :

book@100ask:~/workspaces/gpadc_test$ export STAGING_DIR=~/workspaces/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchainsunxi-musl-gcc-830/toolchain/arm-openwrt-linux-muslgnueabi

Utilisez la chaîne d'outils de compilation croisée pour compiler le fichier binaire. Remarque : le répertoire du package Tina SDK doit être remplacé par votre propre répertoire.

book@100ask:~/workspaces/gpadc_test$ ~/workspaces/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux-gcc -o gpadc_test gpadc_test.c

Après la compilation, un programme exécutable gpadc_test sera généré dans le répertoire courant. Copiez-le sur la carte de développement pour l'exécuter. Ci-dessous, nous utilisons la méthode par carte TF pour copier le fichier sur la carte de développement. À ce stade, supposons que vous avez copié le fichier sur la carte TF. Après l'avoir insérée dans la carte de développement, entrez les commandes suivantes dans la ligne de commande pour monter la carte SD dans le répertoire /mnt/ et copier l'application gpadc_test dans le répertoire root.

root@TinaLinux:/# mount /dev/mmcblk1p1 /mnt/
[   26.744697] FAT-fs (mmcblk1p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
root@TinaLinux:/# cd /mnt/
root@TinaLinux:/mnt# ls
System Volume Information  gpadc_test
root@TinaLinux:/mnt# cp gpadc_test /root/

Accédez au répertoire /root/ et exécutez le programme de test. Ce programme lit 10 valeurs puis se termine automatiquement.

root@TinaLinux:/mnt# cd /root/
root@TinaLinux:~# ./gpadc_test
Bouton 115 pressé
Bouton 0 relâché
Bouton 115 relâché
Bouton 0 relâché
Bouton 114 pressé
Bouton 0 relâché
Bouton 114 relâché
Bouton 0 relâché
Bouton 139 pressé
Bouton 0 relâché

Étiquettes: embedded-linux allwinner v853 gpadc device-tree

Publié le 11 juillet à 22h35