{"id":2221,"date":"2012-05-21T07:00:31","date_gmt":"2012-05-21T06:00:31","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=2221"},"modified":"2012-05-21T07:00:31","modified_gmt":"2012-05-21T06:00:31","slug":"gpio-pandaboard-et-temps-reel-3-lecture-sur-des-entrees","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2012\/05\/21\/gpio-pandaboard-et-temps-reel-3-lecture-sur-des-entrees\/","title":{"rendered":"GPIO, Pandaboard et temps r\u00e9el &#8211; 3 &#8211; Lecture sur des entr\u00e9es"},"content":{"rendered":"<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/2012\/05\/21\/gpio-pandaboard-et-temps-reel-3-lecture-sur-des-entrees\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-2445\" title=\"GPIO, Pandaboard et temps r\u00e9el - 3\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/05\/img-02.jpg\" alt=\"GPIO, Pandaboard et temps r\u00e9el - 3\" width=\"150\" height=\"201\" \/><\/a>Dans les articles pr\u00e9c\u00e9dents, nous avons vu comment acc\u00e9der aux sorties GPIO de la Pandaboard depuis l&rsquo;espace utilisateur (<a title=\"GPIO, Pandaboard et temps r\u00e9el \u2013 1 \u2013 Sorties depuis l\u2019espace utilisateur\" href=\"http:\/\/www.blaess.fr\/christophe\/2012\/05\/09\/gpio-pandaboard-temps-reel-1\/\">premier article<\/a>) et depuis l&rsquo;espace noyau (<a title=\"GPIO, Pandaboard et temps r\u00e9el \u2013 2 \u2013 sorties depuis l\u2019espace kernel\" href=\"http:\/\/www.blaess.fr\/christophe\/2012\/05\/14\/gpio-pandaboard-et-temps-reel-2-sorties-depuis-lespace-kernel\/\">second article<\/a>) Linux et Xenomai. Nous allons maintenant nous int\u00e9resser \u00e0 la lecture de l&rsquo;\u00e9tat des entr\u00e9es GPIO.<\/p>\n<p>\n<!--more-->\n<\/p>\n<h1>Lecture depuis l&rsquo;espace utilisateur<\/h1>\n<p style=\"text-align: justify;\">La plupart des broches du port d&rsquo;extension de la Pandaboard sont affect\u00e9es par d\u00e9faut en entr\u00e9e. Ceci pour des raisons de s\u00e9curit\u00e9&nbsp;: elles se trouvent ainsi dans un \u00e9tat dit de \u00ab\u00a0haute imp\u00e9dance\u00a0\u00bb dans lequel on peut sans rique leur appliquer une tension.<\/p>\n<p style=\"text-align: justify;\">Si au contraire une broche \u00e9tait configur\u00e9e par d\u00e9faut en sortie, elle aurait une tension d\u00e9finie et l&rsquo;application par erreur de la tension oppos\u00e9e d\u00e9clencherait un court-circuit fatal au micro-processeur.<\/p>\n<p style=\"padding-left: 60px; text-align: justify;\" id=\"warning\">Notez que l&rsquo;application d&rsquo;une tension sur une broche GPIO de la Pandaboard est par d\u00e9finition risqu\u00e9e. En confondant la broche 1 (+1.8 V) du connectecteur d&rsquo;extension et sa broche 2 (+5V), j&rsquo;ai appliqu\u00e9 par erreur une tension de +5V sur une entr\u00e9e ne tol\u00e9rant que +1.8 V, ce qui s&rsquo;est sold\u00e9 par <strong>la destruction imm\u00e9diate du processeur OMAP<\/strong>. Soyez donc tr\u00e8s prudents dans vos essais&nbsp;; je d\u00e9cline toute responsabilit\u00e9 s&rsquo;il arrive malheur \u00e0 vos cartes suite aux exp\u00e9riences d\u00e9crites ici.<\/p>\n<p style=\"text-align: justify;\">\u00a0Nous allons utiliser la m\u00eame broche (num\u00e9ro 10 du connecteur A) que celle employ\u00e9e lors des articles pr\u00e9c\u00e9dents. Naturellement nous pourrions en choisir une autre en nous reportant au <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-05-10\/Panda_Board_Spec_REVEA1_04.pdf\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-05-10\/Panda_Board_Spec_REVEA1_04.pdf\" target=\"_blank\">manuel de r\u00e9f\u00e9rence de la Pandaboard<\/a>. C&rsquo;est ce que nous ferons dans le prochain article car nous aurons besoin simultan\u00e9ment d&rsquo;une entr\u00e9e et d&rsquo;une sortie.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/05\/img-22.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2237\" title=\"Connecteur d'extension A de la Pandaboard\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/05\/img-22.jpg\" alt=\"Connecteur d'extension A de la Pandaboard\" width=\"600\" height=\"200\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Avant d&rsquo;appliquer une tension sur cette broche nous allons v\u00e9rifier sa direction. Comme nous l&rsquo;avons vu dans le premier article, nous allons acc\u00e9der \u00e0 notre GIO depuis l&rsquo;interface <code>\/sys<\/code>.<\/p>\n<pre>$ <strong>ssh root@192.168.5.152<\/strong>\nroot@192.168.5.152's password:\n[Panda]# <strong>cd \/sys\/class\/gpio\/<\/strong>\n[Panda]# <strong>ls<\/strong>\nexport       gpio62       gpiochip128  gpiochip32   gpiochip96\ngpio1        gpiochip0    gpiochip160  gpiochip64   unexport\n[Panda]# <strong>echo 138 &gt; export <\/strong>\n[Panda]# <strong>ls<\/strong>\nexport       <strong>gpio138<\/strong>      gpiochip0    gpiochip160  gpiochip64   unexport\ngpio1        gpio62       gpiochip128  gpiochip32   gpiochip96\n[Panda]# <strong>cat gpio138\/direction<\/strong>\nin\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">La broche est bien configur\u00e9e en entr\u00e9e. Si elle \u00e9tait dirig\u00e9e en sortie (apr\u00e8s l&rsquo;une des exp\u00e9riences des pr\u00e9c\u00e9dents articles par exemple), il suffirait d&rsquo;un \u00ab\u00a0<code>echo in &gt; gpio138\/direction<\/code>\u00a0\u00bb pour rectifier son sens. Lisons sa valeur&nbsp;:<\/p>\n<pre>[Panda]# <strong>cat gpio138\/value<\/strong>\n0\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">Lorsqu&rsquo;aucune tension n&rsquo;est appliqu\u00e9e sur cette broche d&rsquo;entr\u00e9e, celle-ci se trouve automatiquement ramen\u00e9e \u00e0 la masse par une r\u00e9sistance de rappel interne du processeur OMAP. Le sens du rappel (<em>pull-up<\/em> si la broche est implicitement raccord\u00e9e \u00e0 la tension d&rsquo;alimentation ou <em>pull-down<\/em> si elle est ramen\u00e9e \u00e0 la masse) est initialis\u00e9 par le bootloader U-boot. Voici un extrait du fichier <code>u-boot-2011.06\/board\/ti\/panda\/panda.h<\/code> dans lequel nous voyons que la broche 10 du connecteur J3 (dont la fonction principale est <code>SPI1_CS1<\/code>) est tir\u00e9e par un pull-down (<code>PTD<\/code>) alors que la broche 4 (<code>GPIO_140<\/code>) par exemple dispose d&rsquo;un pull-up (<code>PTU<\/code>).<\/p>\n<pre>#ifndef _PANDA_H_\n#define _PANDA_H_\n\n#include &lt;asm\/io.h&gt;\n#include &lt;asm\/arch\/mux_omap4.h&gt;\n\nconst struct pad_conf_entry core_padconf_array[] = {\n  [...]\n  {MCSPI1_CS0, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, \/* mcspi1_cs0  *\/\n  <strong>{MCSPI1_CS1, (PTD | IEN | OFF_EN | OFF_PD | OFF_IN | M3)},<\/strong> \/* mcspi1_cs1  *\/\n  {MCSPI1_CS2, (PTU | OFF_EN | OFF_OUT_PTU | M3)},           \/* gpio_139    *\/\n  {MCSPI1_CS3, (PTU | IEN | M3)},                            \/* gpio_140    *\/\n  {UART3_CTS_RCTX, (PTU | IEN | M0)},                        \/* uart3_tx    *\/\n  [...]\n};\n[...]<\/pre>\n<p style=\"text-align: justify;\">Le noyau Linux peut intervenir (au moment de son initialisation) sur le param\u00e9trage des GPIO mais il consid\u00e8re g\u00e9n\u00e9ralement que ce travail a \u00e9t\u00e9 effectu\u00e9 par le bootloader et les laisse dans leurs \u00e9tats pr\u00e9c\u00e9dents. V\u00e9rifions si le GPIO 140 est bien tir\u00e9 vers la tension d&rsquo;alimentation.<\/p>\n<pre>[Panda]# <strong>echo 140 &gt; export<\/strong>\n[Panda]# <strong>cat gpio140\/direction<\/strong>\nin\n[Panda]# <strong>cat gpio140\/value<\/strong>\n1\n[Panda]# <strong>echo 140 &gt; unexport<\/strong>\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">Appliquons \u00e0 pr\u00e9sent une valeur sur la broche 10. Pour cela je la mets en contact avec la broche num\u00e9ro 1 du m\u00eame port (+1.8V). En faisant attention \u00e0 ne pas confondre avec la broche 2 pour ne pas recommencer la m\u00eame m\u00e9saventure&nbsp;! Pour s&rsquo;en assurer, nous pouvons v\u00e9rifier si la tension entre notre broche d&rsquo;alimentation (2) et celle de masse (28) est bien \u00e9gale \u00e0 1,8V et surtout pas \u00e0 5V.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/05\/img-23.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2238\" title=\"V\u00e9rification de la tension d'alimentation GPIO\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/05\/img-23.jpg\" alt=\"V\u00e9rification de la tension d'alimentation GPIO\" width=\"600\" height=\"474\" \/><\/a>Mise en contact de la broche 10 et de la broche 1&#8230;<\/p>\n<p><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/05\/img-24.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2239\" title=\"Contact entre broches 1 et 10 de la Pandaboard\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/05\/img-24.jpg\" alt=\"Contact entre broches 1 et 10 de la Pandaboard\" width=\"600\" height=\"350\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Nous pouvons mesurer \u00e0 pr\u00e9sent la valeur d&rsquo;entr\u00e9e du GPIO.<\/p>\n<pre>[Panda]# <strong>cat gpio138\/value<\/strong>\n1\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">Si nous d\u00e9connectons les deux broches et relions la broche 10 avec la masse (28), nous retrouvons la valeur pr\u00e9c\u00e9dente.<\/p>\n<pre>[Panda]# <strong>cat gpio138\/value<\/strong>\n0\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">Notons que nous pouvons inverser le sens logique affect\u00e9e \u00e0 la tension \u00e9lectrique. La broche 10 est toujours reli\u00e9e \u00e0 la masse.<\/p>\n<pre>[Panda]# <strong>cat gpio138\/active_low<\/strong>\n0\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">L&rsquo;entr\u00e9e n&rsquo;est pas consid\u00e9r\u00e9e comme active (1) au niveau bas (0V). Inversons ceci.<\/p>\n<pre>[Panda]# <strong>echo 1 &gt; gpio138\/active_low <\/strong>\n[Panda]# <strong>cat gpio138\/active_low <\/strong>\n1\n[Panda]# <strong>cat gpio138\/value <\/strong>\n1\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">Maintenant l&rsquo;entr\u00e9e est active si une tension nulle y est appliqu\u00e9e et inactive sinon. Connectons la broche 10 au +1.8V et v\u00e9rifions.<\/p>\n<pre>[Panda]# <strong>cat gpio138\/value<\/strong>\n0\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">Je r\u00e9tablis l&rsquo;\u00e9tat initial pour la suite.<\/p>\n<pre>[Panda]# <strong>echo 0 &gt; gpio138\/active_low <\/strong>\n[Panda]# <strong>cat gpio138\/value <\/strong>\n1\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">Nous savons comment lire l&rsquo;\u00e9tat d&rsquo;une entr\u00e9e GPIO depuis l&rsquo;espace utilisateur. Notre manipulation faite depuis la ligne de commande pourrait tr\u00e8s bien \u00eatre r\u00e9alis\u00e9e \u00e0 l&rsquo;identique depuis un script ou une application en C par exemple.<\/p>\n<h1>Lecture depuis le kernel<\/h1>\n<p style=\"text-align: justify;\">Il est bien entendu possible d&rsquo;utiliser l&rsquo;API offerte par le noyau Linux pour lire l&rsquo;\u00e9tat d&rsquo;une entr\u00e9e GPIO depuis l&rsquo;espace noyau. Voici un petit exemple provenant des exemples de mon cours \u00ab\u00a0<a title=\"Formation &quot;\u00c9criture de drivers pour Linux&quot;\" href=\"http:\/\/www.logilin.fr\/Formation_Drivers_Linux.html\" target=\"_blank\">\u00c9criture de drivers pour Linux<\/a>\u00a0\u00bb que j&rsquo;ai simplifi\u00e9 pour ne conserver que le sens \u00ab\u00a0lecture\u00a0\u00bb.<\/p>\n<pre><a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-05-21\/entree-gpio.c\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-05-21\/entree-gpio.c\"><strong>entree-gpio.c :<\/strong><\/a>\n#include &lt;linux\/cdev.h&gt;\n#include &lt;linux\/device.h&gt;\n#include &lt;linux\/fs.h&gt;\n#include &lt;linux\/gpio.h&gt;\n#include &lt;linux\/module.h&gt;\n#include &lt;linux\/sched.h&gt;\n#include &lt;linux\/version.h&gt;\n#include &lt;asm\/uaccess.h&gt;\n\n  static int gpio_in = 138; \/\/ Par defaut : broche 10\n  module_param(gpio_in, int, 0644);\n\n  static dev_t          exemple_dev;\n  static struct cdev    exemple_cdev;\n  static struct class * exemple_class = NULL;\n\n  static int exemple_read(struct file * filp, char * buffer, size_t length, loff_t * offset);\n\n  static struct file_operations fops_exemple = {\n    .owner   =  THIS_MODULE,\n    .read    =  exemple_read,\n  };\n\nstatic int __init exemple_init (void)\n{\n  int err;\n\n  if ((err = <strong>gpio_request<\/strong>(gpio_in, THIS_MODULE-&gt;name)) != 0) {\n    return err;\n  }\n\n  if ((err = <strong>gpio_direction_input<\/strong>(gpio_in)) != 0) {\n    gpio_free(gpio_in);\n    return err;\n  }\n\n  if ((err = <strong>alloc_chrdev_region<\/strong>(&amp; exemple_dev, 0, 1, THIS_MODULE-&gt;name)) &lt; 0) {\n    gpio_free(gpio_in);\n    return err;\n  }\n\n  exemple_class = <strong>class_create<\/strong>(THIS_MODULE, \"classe_exemple\");\n  if (IS_ERR(exemple_class)) {\n    unregister_chrdev_region(exemple_dev, 1);\n    gpio_free(gpio_in);\n    return -EINVAL;\n  }\n\n  <strong>device_create<\/strong>(exemple_class, NULL, exemple_dev, NULL, THIS_MODULE-&gt;name);\n\n  <strong>cdev_init<\/strong>(&amp; exemple_cdev, &amp; fops_exemple);\n\n  if ((err = <strong>cdev_add<\/strong>(&amp; exemple_cdev, exemple_dev, 1)) != 0) {\n    device_destroy(exemple_class, exemple_dev);\n    class_destroy(exemple_class);\n    unregister_chrdev_region(exemple_dev, 1);\n    gpio_free(gpio_in);\n    return err;\n  }\n  return 0;\n}\n\nstatic void __exit exemple_exit (void)\n{\n  <strong>cdev_del<\/strong>(&amp; exemple_cdev);\n  <strong>device_destroy<\/strong>(exemple_class, exemple_dev);\n  <strong>class_destroy<\/strong>(exemple_class);\n  <strong>unregister_chrdev_region<\/strong>(exemple_dev, 1);\n  <strong>gpio_free<\/strong>(gpio_in);\n}\n\nstatic int exemple_read(struct file * filp, char * buffer, size_t length, loff_t * offset)\n{\n  char chaine[32];\n  int lg;\n  snprintf(chaine, 32, \"%dn\", <strong>gpio_get_value<\/strong>(gpio_in));\n  lg = strlen(chaine) + 1;\n  if (lg &gt; length)\n    return -ENOMEM;\n  if (<strong>copy_to_user<\/strong>(buffer, chaine, lg) != 0)\n    return -EFAULT;\n  return lg;\n}\n\nmodule_init(exemple_init);\nmodule_exit(exemple_exit);\nMODULE_LICENSE(\"GPL\");<\/pre>\n<p style=\"text-align: justify;\">La compilation s&rsquo;effectue comme dans l&rsquo;<a title=\"GPIO, Pandaboard et temps r\u00e9el \u2013 2 \u2013 sorties depuis l\u2019espace kernel\" href=\"http:\/\/www.blaess.fr\/christophe\/2012\/05\/14\/gpio-pandaboard-et-temps-reel-2-sorties-depuis-lespace-kernel\/\" target=\"_blank\">article pr\u00e9c\u00e9dent<\/a> avec une invocation de <code>make<\/code> qui pr\u00e9cise la cha\u00eene de compilation et l&#8217;emplacement des sources du noyau, aucune valeur par d\u00e9faut n&rsquo;\u00e9tant pr\u00e9cis\u00e9e dans le <strong><a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-05-21\/Makefile\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-05-21\/Makefile\" target=\"_blank\"><code>Makefile<\/code><\/a>.<\/strong><\/p>\n<pre>$ <strong>make ARCH=arm CROSS_COMPILE=~\/cross-panda\/usr\/bin\/arm-linux- KERNEL_DIR=~\/Projets\/Panda\/linux-2.6.38.8 modules<\/strong>\nmake -C \/home\/cpb\/Projets\/Panda\/linux-2.6.38.8\/ SUBDIRS=\/home\/cpb\/Documents\/Articles\/Blog\/article-2012-05-21  modules\n[...]\nmake[1]: quittant le r\u00e9pertoire \u00ab \/home\/cpb\/Projets\/Panda\/linux-2.6.38.8 \u00bb\n$ <strong>scp entree-gpio.ko root@192.168.3.152:\/root\/<\/strong>\nroot@192.168.3.152's password:\nentree-gpio.ko                                                100%  102KB 101.7KB\/s   00:00\n$<\/pre>\n<p style=\"text-align: justify;\">Connectons-nous sur la carte Pandaboard et consultons l&rsquo;\u00e9tat du driver par l&rsquo;interm\u00e9diaire du fichier sp\u00e9cial qui appara\u00eet dans <code>\/dev<\/code> lors du chargement du module.<\/p>\n<pre>$ <strong>ssh root@192.168.3.152<\/strong>\nroot@192.168.3.152's password:\n[Panda]# <strong>\/sbin\/insmod \/root\/entree-gpio.ko<\/strong>\n[Panda]# <strong>cat \/dev\/entree_gpio<\/strong>\n0\n0\n0\n0\n...<\/pre>\n<p style=\"text-align: justify;\">L&rsquo;entr\u00e9e \u00e9tant connect\u00e9e \u00e0 la masse, nous lisons (en boucle via la commande <code>cat<\/code>) la valeur 0. Raccordons la broche 10 \u00e0 l&rsquo;alimentation.<\/p>\n<pre>[...]\n0\n0\n0\n1\n1\n1\n1\n[...]<\/pre>\n<p style=\"text-align: justify;\">La valeur passe \u00e0 1. Nous pouvons r\u00e9it\u00e9rer l&rsquo;exp\u00e9rience autant que voulu, puis nous arr\u00eatons la lecture en pressant Contr\u00f4le-C.<\/p>\n<pre>1\n1\n1\n1\n  <em><strong>(Contr\u00f4le-C)<\/strong><\/em>\n[Panda]#<\/pre>\n<h1>Conclusion<\/h1>\n<p style=\"text-align: justify;\">Nous avons pu utiliser tr\u00e8s facilement une entr\u00e9e GPIO depuis l&rsquo;espace utilisateur ou depuis le noyau Linux. Ceci ouvre la porte \u00e0 la conception de syst\u00e8mes interactifs r\u00e9agissant \u00e0 des \u00e9v\u00e9nements ext\u00e9rieurs (robotique, domotique, etc.) Toutefois, dans la plupart de ces applications, il est important de r\u00e9agir rapidement \u00e0 ces \u00e9v\u00e9nements. Il faut donc \u00eatre pr\u00e9venu d\u00e8s qu&rsquo;il y a un changement d&rsquo;\u00e9tat sur une entr\u00e9e. Pour cela on utilisera les interruptions GPIO qui permettront d&rsquo;invoquer une routine sp\u00e9cifique d\u00e8s qu&rsquo;un signal sera d\u00e9tect\u00e9 par le microprocesseur sur une brioche GPIO. Ce sera l&rsquo;objet <a title=\"GPIO, Pandaboard et temps r\u00e9el \u2013 4 \u2013 Gestion des interruptions\" href=\"http:\/\/www.blaess.fr\/christophe\/2012\/05\/28\/gpio-pandaboard-et-temps-reel-4-gestion-des-interruptions\/\">du prochain article<\/a>&#8230;<\/p>","protected":false},"excerpt":{"rendered":"<p>Dans les articles pr&eacute;c&eacute;dents, nous avons vu comment acc&eacute;der aux sorties GPIO de la Pandaboard depuis l&rsquo;espace utilisateur (premier article) et depuis l&rsquo;espace noyau (second article) Linux et Xenomai. Nous allons maintenant nous int&eacute;resser &agrave; la lecture de l&rsquo;&eacute;tat des entr&eacute;es GPIO.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,10,13,14],"tags":[],"class_list":["post-2221","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2","category-microprocesseur","category-shell","category-temps-reel"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/2221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=2221"}],"version-history":[{"count":0,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/2221\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=2221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=2221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=2221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}