Problème avec le st25r95

Bonjour,

Nous avons tenté d’utiliser le driver que vous nous avez fourni (st_st25r59). Cependant, nous rencontrons un problème : l’overlay app ne fonctionne pas correctement avec le fichier samples/main.c et nous obtenons une erreur __device_dts_ord_66.

Pourriez-vous nous aider à réaliser un code permettant de valider le bon fonctionnement du composant ?

Merci d’avance pour votre assistance.

Cordialement,

Alexis Gairaud

Bonjour Alexis,

Je vais avoir besoin de quelques informations supplémentaires pour pouvoir identifier le problème :

  • le contenu du fichier devicetree_generated.h situé dans build/zephyr/include/generated/zephyr,
  • le contenu du fichier prj.conf,
  • le contenu du ficher app.overlay ou tout autre .overlay utilisé dans les arguments de compilation,
  • le contenu du fichier CMakeLists.txt si modifié,
  • la ligne de commande employée pour la compilation.

Il est à noter que le driver st25r95 n’est pas fonctionnel, c’est un « dummy » driver.
Ceci étant, une première possibilité est que le prj.conf ne configure pas CONFIG_SENSOR à la valeur y : CONFIG_SENSOR=y. Cette configuration active le driver du st25r95 qui a son tour active le SPI. D’où le problème rencontré. Si cela ne règle pas le problème, j’aurais besoin des informations cité précédemment.

Logan Saint-Germain

Bonsoir,

Merci pour votre retour. Voici les informations demandées :

Fichier devicetree_generated.h
/*
 * Generated by gen_defines.py
 *
 * DTS input file:
 *   /home/n/nic.schmauch/Téléchargements/6tron-workspace/build/zephyr/zephyr.dts.pre
 *
 * Directories with bindings:
 *   /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/6tron_connector/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/ams_as621x/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/bosch_bno055/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/honeywell_hpma115/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/ilitek_ili9163c/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/maxim_max17201/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/microchip_mcp3425/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/microcrystal_rv8803/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/omron_2smpb-02e/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/quectel_l86/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/sensirion_scd4x/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/te-connectivity_htu21d/dts/bindings, /home/n/nic.schmauch/Téléchargements/6tron-workspace/6tron/drivers/ti_tsc2003/dts/bindings, $ZEPHYR_BASE/dts/bindings
 *
 * Node dependency ordering (ordinal and path):
 *   0   /
 *   1   /aliases
 *   2   /chosen
 *   3   /soc
 *   4   /soc/interrupt-controller@e000e100
 *   5   /clocks
 *   6   /clocks/clk-hsi
 *   7   /clocks/pll
 *   8   /soc/rcc@40023800
 *   9   /soc/pin-controller@40020000
 *   10  /soc/pin-controller@40020000/adc_in5_pa5
 *   11  /soc/adc@40012400
 *   12  /dietemp
 *   13  /memory@20000000
 *   14  /sixtron-connector-1
 *   15  /sixtron-connector-1-adc
 *   16  /sixtron-connector-1-pwm
 *   17  /soc/pin-controller@40020000/i2c1_scl_pb8
 *   18  /soc/pin-controller@40020000/i2c1_sda_pb9
 *   19  /soc/i2c@40005400
 *   20  /smbus1
 *   21  /soc/i2c@40005800
 *   22  /smbus2
 *   23  /vref
 *   24  /clocks/clk-hse
 *   25  /clocks/clk-lse
 *   26  /clocks/clk-lsi
 *   27  /clocks/clk-msi
 *   28  /cpus
 *   29  /cpus/cpu@0
 *   30  /soc/pin-controller@40020000/gpio@40020000
 *   31  /gpio_keys
 *   32  /gpio_keys/button
 *   33  /leds
 *   34  /leds/led_0
 *   35  /soc/pin-controller@40020000/dac_out1_pa4
 *   36  /soc/dac@40007400
 *   37  /soc/dma@40026000
 *   38  /soc/eeprom@8080000
 *   39  /soc/interrupt-controller@40010400
 *   40  /soc/pin-controller@40020000/usart2_rx_pa3
 *   41  /soc/pin-controller@40020000/usart2_tx_pa2
 *   42  /soc/rcc@40023800/reset-controller
 *   43  /soc/serial@40004400
 *   44  /soc/serial@40004800
 *   45  /soc/serial@40004c00
 *   46  /soc/serial@40005000
 *   47  /soc/pin-controller@40020000/usart1_rx_pa10
 *   48  /soc/pin-controller@40020000/usart1_tx_pa9
 *   49  /soc/serial@40013800
 *   50  /soc/spi@40013000
 *   51  /soc/timer@e000e010
 *   52  /soc/watchdog@40002c00
 *   53  /soc/watchdog@40003000
 *   54  /soc/adc@40012400/channel@5
 *   55  /soc/flash-controller@40023c00
 *   56  /soc/flash-controller@40023c00/flash@8000000
 *   57  /soc/pin-controller@40020000/gpio@40020c00
 *   58  /soc/pin-controller@40020000/gpio@40021000
 *   59  /soc/pin-controller@40020000/gpio@40021400
 *   60  /soc/rtc@40002800
 *   61  /soc/rtc@40002800/backup_regs
 *   62  /soc/pin-controller@40020000/spi2_miso_pb14
 *   63  /soc/pin-controller@40020000/spi2_mosi_pb15
 *   64  /soc/pin-controller@40020000/spi2_sck_pb13
 *   65  /soc/spi@40003800
 *   66  /soc/spi@40003800/st25r95@1
 *   67  /soc/pin-controller@40020000/spi3_miso_pb4
 *   68  /soc/pin-controller@40020000/spi3_mosi_pb5
 *   69  /soc/pin-controller@40020000/spi3_sck_pb3
 *   70  /soc/spi@40003c00
 *   71  /soc/pin-controller@40020000/gpio@40020400
 *   72  /soc/pin-controller@40020000/gpio@40020800
 *   73  /soc/spi@40003c00/sx1272@0
 *   74  /soc/timers@40000000
 *   75  /soc/timers@40000000/counter
 *   76  /soc/timers@40000000/pwm
 *   77  /soc/timers@40000400
 *   78  /soc/timers@40000400/counter
 *   79  /soc/pin-controller@40020000/tim3_ch3_pb0
 *   80  /soc/timers@40000400/pwm
 *   81  /soc/timers@40000800
 *   82  /soc/timers@40000800/counter
 *   83  /soc/timers@40000800/pwm
 *   84  /soc/timers@40000c00
 *   85  /soc/timers@40000c00/pwm
 *   86  /soc/timers@40010800
 *   87  /soc/timers@40010800/counter
 *   88  /soc/timers@40010800/pwm
 *   89  /soc/timers@40010c00
 *   90  /soc/timers@40010c00/counter
 *   91  /soc/timers@40010c00/pwm
 *   92  /soc/timers@40011000
 *   93  /soc/timers@40011000/counter
 *   94  /soc/timers@40011000/pwm
 *
 * Definitions derived from these nodes in dependency order are next,
 * followed by /chosen nodes.
 */
Fichier prj.conf

CONFIG_SENSOR=y

Fichier app.overlay
#include <zephyr/dt-bindings/gpio/sixtron-header.h>
#include <zephyr/dt-bindings/display/panel.h>

&sixtron_spi {
    status = "okay";
    cs-gpios = <&sixtron_connector ADC1 GPIO_ACTIVE_LOW>;

    nfc: st25r95@1 {
        compatible = "st,st25r95";
    	spi-max-frequency = <2000000>;
    	reg = <1>;
		wkup-gpios = <&sixtron_connector DAC GPIO_ACTIVE_LOW>;
    };
};
Fichier CMakeLists.txt n'a pas été modifié, mais voici son contenu
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(st25r95)

FILE(GLOB app_sources src/main.c)
target_sources(app PRIVATE ${app_sources})
Ligne de commande utilisée pour la compilation

west build -p always -b zest_core_mtxdot

Nicolas

Bonjour Nicolas,

Je n’ai pas réussi à reproduire le problème exact, cependant, j’ai pu remarquer quelques erreurs :

  • nfc: st25r95@1 devrait être nfc: st25r95@0 puisque cs-gpios n’a qu’un seul phandle (celui qui vous intéresse).
  • par conséquent reg = <1>; devrait aussi être reg = <0>;

Par ailleurs, peut-être que le main.c de votre application ne récupère pas correctement le device en question.
Est-ce que le device est récupéré avec la ligne suivante ?
static const struct device *nfc_dev = DEVICE_DT_GET(DT_NODELABEL(nfc));

J’espère que cela pourra régler le problème, n’hésité pas à revenir vers nous si cela ne fonctionne toujours pas.

Logan Saint-Germain

Bonjour,

J’ai réussi à compiler et flasher, mais je ne comprends pas pourquoi le driver est un « dummy ». S’il s’agit vraiment d’un « dummy », que dois-je faire pour faire fonctionner le NFC ?

Nicolas

Bonjour,

Le driver actuel, du st25r95 est bel et bien un dummy mais permet de valider la présence du composant sur la carte.

Il vous faut donc, pour faire fonctionner le NFC, écrire le driver zephyr correspondant. Vous pouvez reprendre le dummy driver actuel et y ajouter l’API avec les commandes I2C nécessaire ou repartir de zéro.
La datasheet du st25r95 est disponible ici.

Je serai disponible si un problème survient lors du développement du driver.

Logan Saint-Germain

J’ai réussi à compiler et à flasher le code, mais une erreur 0x83 (« Invalid protocol ») est apparue. Après quelques modifications du pilote, nous avons réussi à faire fonctionner le NFC et à obtenir l’UID des badges scannés. Cependant, pour poursuivre le développement du pilote, nous aimerions comprendre à quoi correspondent les deux dernières fonctions, qui sont vides : « st25r95_attr_set » et « st25r95_channel_get ». De plus, nous souhaiterions savoir comment ajouter le irq_out dans le fichier app.overlay afin de pouvoir récupérer l’UID correctement.

Le driver modifié

Bonjour,

  • La commande st25rg95_attr_set n’est pas nécessaire dans votre développement.
  • La seconde commande est lié au fonctionnement de Zephyr pour la récupération de donnée des composants suivant l’API SENSOR. Pour comprendre le fonctionnement complet, je vous propose de lire la documentation Zephyr. Pour faire simple les SENSORS fonctionnement en deux étapes :
    • Tout d’abord, il faut « échantillonner » et donc utiliser la fonction sensor_sample_fetch(dev) qui dans le cas du st25r95 est redirigé vers st25r95_sample_fetch(dev). Cette fonction se charge de communiquer avec le capteur et d’enregistrer les données de la réponse du capteur dans la structure st25r95_data.
    • Une fois l’échantillonnage terminé, il est alors possible de demander au pilote une valeur issue de l’étape précédente : sensor_channel_get(dev, channel, &value) => st25r95_channel_get(...). Cette fonction permet de retourner dans la variable value la valeur qui correspond au channel demandé. Dans votre cas, le channel SENSOR_CHAN_ALL pourrait tout à fait convenir. La liste des channels déjà supportée sur Zephyr est disponible ici. Le pilote doit donc retourner la valeur demander seulement dans le cas où le bon channel est demandé.

Pour ce qui est de rajouter des propriétés au pilote, il faut alors modifier le bindings la documentation zephyr se trouve ici. Il faut donc rajouter les lignes suivante au fichier st,st25r95.yaml:

irq-gpios:
    type: phandle-array
    description: Configures ST25R95 interrupt signal.

Ce faisant, vous pourrez ensuite ajouter le phandle correspondant à votre signal d’interruption.

nfc: st25r95@1 {
        compatible = "st,st25r95";
        spi-max-frequency = <2000000>;
        reg = <1>;
        wkup-gpios = <&sixtron_connector DAC GPIO_ACTIVE_LOW>;
        irq-gpios = <&sixtron_connector DIO3 GPIO_ACTIVE_LOW>;
    };

Logan Saint-Germain