{"id":394,"date":"2012-09-30T18:29:08","date_gmt":"2012-09-30T16:29:08","guid":{"rendered":"http:\/\/www.martoni.fr\/wordpress\/?p=394"},"modified":"2013-10-07T10:48:28","modified_gmt":"2013-10-07T08:48:28","slug":"genese-dun-pilote-linux","status":"publish","type":"post","link":"https:\/\/www.fabienm.eu\/wordpress\/2012\/09\/30\/genese-dun-pilote-linux\/","title":{"rendered":"Gen\u00e8se d&rsquo;un pilote Linux (Part1)"},"content":{"rendered":"<div class=\"dialog\">\n<ul>\n<li>\u2014 Quelle heure il est ?<\/li>\n<li>\u2014 l&rsquo;heure d&rsquo;t&rsquo;acheter un <a href=\"http:\/\/www.microchip.com\/wwwproducts\/Devices.aspx?dDocName=en551550\">MCP79400<\/a>.<\/li>\n<li>\u2014 Rhaa, mais y a pas le driver pour Linux !<\/li>\n<li>\u2014 Tu sais ce qui te reste \u00e0 faire\u2026<\/li>\n<\/ul>\n<\/div>\n<p>Un MCP79400 est une <a href=\"http:\/\/en.wikipedia.org\/wiki\/Real-time_clock\">RTC<\/a> de chez <a href=\"http:\/\/www.microchip.com\/\">microchip<\/a>.<br \/>\nUne RTC est un composant qui permet de garder l&rsquo;heure sur un syst\u00e8me, m\u00eame<br \/>\nquand celui-ci est \u00e9teint (on utilise g\u00e9n\u00e9ralement une pile bouton pour<br \/>\nalimenter le chip).<\/p>\n<p>C&rsquo;est un composant assez classique, qui d&rsquo;habitude est bien reconnu par<br \/>\n<a href=\"http:\/\/www.kernel.org\/doc\/Documentation\/rtc.txt\">Linux<\/a>. H\u00e9las pour<br \/>\nnous il se trouve que ce n&rsquo;est pas le cas du MCP79400 dont nous avons besoin<br \/>\npour un projet.<\/p>\n<p> Bon c&rsquo;est pas tellement dramatique, une RTC est un composant<br \/>\nrelativement simpliste en g\u00e9n\u00e9ral. C&rsquo;est l&rsquo;occasion de r\u00e9veiller un peu ce<br \/>\nblog et de raconter un peu ma vie palpitante de d\u00e9veloppeur de pilotes pour<br \/>\nLinux \ud83d\ude09<\/p>\n<h2>Branchons le composant sur une <a href\"http:\/\/www.armadeus.com\/francais\/produits-cartes_developpement-apf51_dev.html\">AFP51Dev<\/a><\/h2>\n<p>La premi\u00e8re \u00e9tape dans le d\u00e9veloppement de driver consiste en g\u00e9n\u00e9ral \u00e0 r\u00e9aliser un petit montage<br \/>\n\u00e9lectronique pour essayer de communiquer avec.<\/p>\n<p>Le MCP79400 communique au moyen d&rsquo;un bus <a href=\"http:\/\/fr.wikipedia.org\/wiki\/I2C\">i\u00b2c<\/a>, manque de chance, la carte de<br \/>\nd\u00e9veloppement <a href=\"http:\/\/www.armadeus.com\/wiki\/index.php?title=APF51Dev\">APF51Dev<\/a> ne poss\u00e8de pas de connecteurs avec<br \/>\nl&rsquo;i\u00b2c. On le trouve par contre sur le connecteur cam\u00e9ra <a href=\"http:\/\/www.mipi.org\/specifications\/camera-interface\">CSI<\/a>, il faut donc<br \/>\nfaire un petit montage a\u00e9rien pour extraire les deux signaux SDA et SCL du CSI<br \/>\net les souder sur un plaque d&rsquo;essais avec un MCP79400.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/www.martoni.fr\/documents\/images_articles\/mcp79400_montage.jpg\" alt=\"photo du branchement du mcp79400 sur une apf51dev\" \/><\/p>\n<h2>Premier contact avec le chip<\/h2>\n<p>\nOk nous avons branch\u00e9 le mcp79400, nous allons maintenant essayer de voir<br \/>\ncomment se comporte la bestiole sur le bus i\u00b2c.\n<\/p>\n<p>\nCe qui est bien avec le bus i\u00b2c c&rsquo;est qu&rsquo;il existe de nombreux outils permettant<br \/>\nde l&rsquo;utiliser en mode utilisateur (userland) h\u00e9rit\u00e9 du projet <a href=\"http:\/\/lm-sensors.org\/\">lm-sensors<\/a>.<\/p>\n<p>La carte \u00e9tant d\u00e9marr\u00e9e, nous allons tout d&rsquo;abord scanner le bus i\u00b2c num\u00e9ro 1<br \/>\nsur lequel se trouve notre composant au moyen de la commande <samp>i2cdetect<\/samp> :<\/p>\n<pre><code>\r\nWelcome to the Armadeus development environment.\r\narmadeus login: root\r\n\\# i2cdetect 1\r\nWARNING! This program can confuse your I2C bus, cause data loss and worse!\r\nI will probe file \/dev\/i2c-1.\r\nI will probe address range 0x03-0x77.\r\nContinue? [Y\/n] \r\n     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\r\n00:          -- -- -- -- -- -- -- -- -- -- -- -- -- \r\n10: -- -- -- -- -- -- -- -- -- -- 1a -- -- -- -- -- \r\n20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- \r\n30: -- -- -- -- -- -- UU -- 38 -- -- -- -- -- -- -- \r\n40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- \r\n50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- \r\n60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 6f \r\n70: -- -- -- -- -- -- -- --   \r\n<\/code><\/pre>\n<p>On voit qu&rsquo;il y a plusieurs composants sur ce bus, un rapide coup d&rsquo;\u0153il dans<br \/>\nla datasheet de l&rsquo;<a href=\"http:\/\/www.armadeus.com\/_downloads\/apf51_Dev\/documentation\/datasheet_APF51Dev.pdf\">apf51dev<\/a><br \/>\nnous apprend qu&rsquo;il s&rsquo;agit de l&rsquo;interface audio wolfson (WM8960) \u00e0 l&rsquo;adresse 0x1a,<br \/>\ndu DVI \u00e0 l&rsquo;adresse 0x38 et du PMIC (wolfson) en 0x36. Les caract\u00e8res UU signifient que le chip est utilis\u00e9 par un driver, donc qu&rsquo;il n&rsquo;est pas possible d&rsquo;y toucher avec des outils en userland.<\/p>\n<p> Notre MCP79400 se retrouve bien en 0x6F comme donn\u00e9 dans la datasheet. On va<br \/>\ndonc pouvoir commencer \u00e0 essayer de lui parler.  <\/p>\n<p>La table des registres de la datasheet indique que le premier registre<br \/>\n(0x00) contient les secondes ainsi que la commande <samp>st<\/samp> pour d\u00e9buter le<br \/>\ncomptage. Lisons d&rsquo;abord la valeur avec <samp>i2cget<\/samp>:<\/p>\n<pre><code>\r\n\\# i2cget -y 1 0x6f 0x02 b\r\n0x00\r\n<\/code><\/pre>\n<p>Maintenant si on \u00e9crit une valeur puis qu&rsquo;on la relit:<\/p>\n<pre><code>\r\n\\# i2cset -y 1 0x6f 0x00 0x02 b\r\n\\# i2cget 1 0x6f 0x00 b\r\n0x02\r\n<\/code><\/pre>\n<p>Puisque nous arrivons \u00e0 relire la valeur que nous venons d&rsquo;\u00e9crire nous<br \/>\npouvons confirmer que l&rsquo;acc\u00e8s i\u00b2c est fonctionnel en lecture\/\u00e9criture, ce qui<br \/>\nest d\u00e9j\u00e0 pas mal !<\/p>\n<p>Voyons voir maintenant si le composant fonctionne en d\u00e9marrant le comptage du<br \/>\ntemps au moyen du bit de start <samp>st<\/samp>:<\/p>\n<pre><code>\r\n\\# i2cset -y 1 0x6f 0x00 0x82 b\r\n\\# i2cget -y 1 0x6f 0x00 b\r\n0x83\r\n\\# i2cget -y 1 0x6f 0x00 b\r\n0x84\r\n\\# i2cget -y 1 0x6f 0x00 b\r\n0x84\r\n\\# i2cget -y 1 0x6f 0x00 b\r\n0x85\r\n\\# i2cget -y 1 0x6f 0x00 b\r\n0x85\r\n\\# i2cget -y 1 0x6f 0x00 b\r\n0x85\r\n\\# i2cget -y 1 0x6f 0x00 b\r\n0x86\r\n<\/code><\/pre>\n<p>Bingo, notre composant semble bien compter les secondes correctement. Nous<br \/>\nallons donc pouvoir embrayer sur l&rsquo;\u00e9criture du driver Linux \u00e0 proprement<br \/>\nparler.<\/p>\n<p><a href=\"http:\/\/www.martoni.fr\/wordpress\/?p=419\">[Par ici la suite &#8230;]<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u2014 Quelle heure il est ? \u2014 l&rsquo;heure d&rsquo;t&rsquo;acheter un MCP79400. \u2014 Rhaa, mais y a pas le driver pour Linux ! \u2014 Tu sais ce qui te reste \u00e0 faire\u2026 Un MCP79400 est une RTC de chez microchip. Une &hellip; <a href=\"https:\/\/www.fabienm.eu\/wordpress\/2012\/09\/30\/genese-dun-pilote-linux\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[106,10,123],"tags":[],"class_list":["post-394","post","type-post","status-publish","format-standard","hentry","category-embarque","category-informatique","category-kernel-programmation"],"_links":{"self":[{"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/394","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/comments?post=394"}],"version-history":[{"count":32,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/394\/revisions"}],"predecessor-version":[{"id":579,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/394\/revisions\/579"}],"wp:attachment":[{"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/media?parent=394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/categories?post=394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/tags?post=394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}