Difference between revisions of "User:FabienM"

From ArmadeusWiki
Jump to: navigation, search
(Une led qui clignote avec le spartan 3)
(Blog)
 
(91 intermediate revisions by 3 users not shown)
Line 1: Line 1:
= ''' Présentation ''' =
+
[[MemberList | << liste des membres]]
  
Fabien Marteau, Électronicien/Informaticien en dernière année d'école d'ingé spécialisée en systèmes embarqués ([http://uuu.enseirb.fr/~kadionik/se/index.html ENSEIRB])
 
  
J'ai toujours fait de l'électronique/informatique, depuis les magnétoscopes et réveils que j'ai démonté en passant par la filière SI du Bac S ainsi que le DUT GEII et l'[http://www.enseirb.fr/ ENSEIRB]. J'aime bidouiller des petits circuits électroniques avec des applications plus ou moins utiles comme ma [http://fabienmarteau.free.fr/?page=stationmeteo/stationmeteoindex station météo].
+
= Mes petites bidouilles avec l'armadeus =
  
En tant que membre d'[http://eirbot.enseirb.fr  Eirbot] je suis très intéressé par les applications en robotiques réalisable avec armadeus. Je suis aussi particulièrement intéressé par les applications en domotique avec la gestion de capteurs ainsi que la gestion de l'énergie.
+
* [[Une led qui clignote avec le spartan 3]]
.
+
* [[Petits trucs en vrac]]
 +
* [[Led sensor]]
 +
* [[vim | The best editor in the world]]
  
 +
= Trucs =
  
== Compétences : ==
+
== Python en environnement virtuel ==
- réalisation de cartes electroniques numériques ([http://www.cadsoft.de/ Eagles] et [http://www.lis.inpg.fr/realise_au_lis/kicad/ Kicad])
+
  
- programmation en C / assembleur 68000
+
Un pense bète pour installer la version voulue de python en environnement virtuel avec virtualenv:
  
- Conception et simulation VHDL
+
=== virtualenv et autre tkinter ===
  
- microcontrolleurs Atmega, 68HC11, PIC
+
<pre>
 +
apt-get install python-tk python3-tk tk-dev
 +
apt-get install python-virtualenv
 +
</pre>
  
= Objectifs : =
+
=== Python 3.7.4 ===
- Faire de l'embarqué sur des platforme autre que x86 avec les vrais contraintes de l'embarqué
+
  
- me former à Linux embarqué
+
<pre>
 +
sudo apt-get install libffi-dev
 +
wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz
 +
tar -Jxvf Python-3.7.4.tar.xz
 +
cd Python-3.7.4
 +
./configure --enable-shared
 +
make
 +
sudo make install
 +
sudo ldconfig /usr/local/lib
 +
</pre>
  
- créer ...
+
=== virtualenv ===
  
= '''Mes petites bidouilles avec l'armadeus''' =
+
* Virtual env configuration:
  
== Une led qui clignote avec le spartan 3 ==
+
<pre>
 +
apt-get install python-virtualenv
 +
mkdir virtenv
 +
cd virtenv
 +
virtualenv --python=/usr/local/bin/python3.7 envp37
 +
</pre>
  
Pour me faire la main avec le kit et surtout avec le fpga je me suis mis en tête de faire clignoter le une led du fpga. Pour cela je me suis un peu inspiré du montage proposé [[FPGA_and_led]] que j'ai modifié pour pouvoir tester ensuite [http://www.hackaday.com/2007/12/16/diy-led-multi-touch-panel/ la led en capteur de lumière].
+
* enum bug fix:
  
[[Image:diode.png]]
+
<pre>
 +
cd ~/virtenv/envp37/lib/python3.7
 +
ln -s /usr/local/lib/python3.7/enum.py
 +
</pre>
  
L'intérêt du clignotement d'une led est relativement limité, cependant il permet de prendre en main la totalité de la chaine de développement sur la carte Armadeus.
+
* Activation:
 +
<pre>
 +
source /home/armadeus/virtenv/envp37/bin/activate
 +
</pre>
  
Après avoir installé le Xilinx Web Pack généreusement par Xilinx, il suffit de réaliser un compteur qui divisera la fréquence de l'horloge de manière à avoir un clignotement de quelques Hertz (La fréquence du spartan3 étant de 96MHz nous diviserons par 48000000 !).
+
* Desactivation:
 +
<pre>
 +
deactivate
 +
</pre>
  
<source lang="VHDL">
+
= '''P'''eripheral '''O'''n '''D'''emand =
library IEEE;
+
 
use IEEE.STD_LOGIC_1164.ALL;
+
* [[Specification feedback]]
entity Clk_div_led is
+
 
    Port ( Clk : in STD_LOGIC;
+
= Participation à la documentation ArmadeuS Project =
          led_cathode : out STD_LOGIC;
+
 
          led_anode : out STD_LOGIC);
+
* [[How to make a VHDL design in Ubuntu/Debian]]
end Clk_div_led;
+
* [[How to simulate post synthesis and post place & route design with GHDL]]
architecture Behavioral of Clk_div_led is
+
 
constant max_count : natural := 48000000;
+
* [[Using FPGA]]
signal count : natural range 0 to max_count;
+
 
begin
+
* [[A simple design with Wishbone bus]]
-- compteur de 0 à max_count
+
 
compteur : process(Clk)
+
* [[How to use kernel 2.6.38.x on APF27]]
begin
+
 
if Clk'event and Clk = '1' then -- rising clock edge
+
== Trash ==
if count < max_count/2 then
+
* [[APF27_FPGA-IMX_interface_description | Description of FPGA-IMX interface for APF27]]
led_anode <='1';
+
* [[APF51_FPGA-IMX_interface_description | Description of FPGA-IMX interface for APF51]]
led_cathode <='0';
+
* [[FPGA | FPGA on APF introduction]]
count <= count + 1;
+
* [[FPGA and led | Button and LED]]
elsif count < max_count then
+
 
led_anode <='0';
+
== Projets ==
led_cathode <='0';
+
 
count <= count + 1;
+
* Camera [[C38A]] with chip ov7620
else
+
* Camera omnivision [[VC21CC1]]
count <= 0;
+
* [[Robotic]]
led_anode <='1';
+
* [[Home monitoring energy | Compteur d'énergie électrique]]
led_cathode <='0';
+
* [[OOCP]] (Only One Cable Project)
end if;
+
* [[Use MySQL-client on apf9328]]
end if;
+
* [[Light-APF27Dev | Light-APF27Dev project ]]
end process compteur;
+
 
end Behavioral;
+
= Liens utiles =
 +
 
 +
* Projets [http://sourceforge.net/projects/armadeus sourceforge]
 +
* Site [http://www.armadeus.com/english/index.html entreprise]
 +
* Les codes de retour d'erreurs : http://www.opengroup.org/onlinepubs/007908799/xsh/errno.h.html
 +
* [[Buildroot_Packages]]
 +
* [http://sebsauvage.net/files/20130426_cpp_quovadis2013cppontheweb-130425105424-phpapp01.pdf Un papier très intéressant] d'un développeur de jeux vidéo prônant l'utilisation du C++ ... pour le web. Notamment grâce à l'utilisation de [http://sebsauvage.net/files/20130426_cpp_multiplatformconthewebwithemscripten-130405172545-phpapp01.pdf emscripten] qui permet de compiler du C++ vers le javascript (HTML5).
 +
 
 +
= Somes usefull tricks =
 +
== press a button ==
 +
Here, function to «press enter to continue» on apf in different languages :
 +
 
 +
<source lang="bash">
 +
setbit /proc/driver/gpio/portFmode 13 1 # set pin as gpio
 +
setbit /proc/driver/gpio/portFdir 13 0 # set pin as input
 +
setbit /proc/driver/gpio/portFirq 13 1  # irq on rising edge
 +
 
 +
/usr/bin/testsuite/testbutton /dev/gpio/PF13 3
 
</source>
 
</source>
  
Attention, ce code ne respecte pas vraiment les standards de la programmation en VHDL. Par exemple, je n'ai pas cablé le Reset ... ce qui est mal.
+
With ''testbutton'' program comming from
 +
''target/linux/modules/fpga/wishbone_example/wb_button''. Type «make» in this
 +
directory to compile it.
  
Pour que ISE puisse savoir sur quels pin brancher chaques signal, il est nécessaire de lui fournir un fichier de contrainte en *.ucf :
+
== Logging with timestamps in seconds ==
 +
 
 +
<source lang="bash">
 +
#!/bin/sh
 +
while true
 +
do
 +
LIGHT=$(cat /sys/class/hwmon/hwmon0/device/in3_input)
 +
TIME=$(date +%s)
 +
echo $TIME", sec, "$LIGHT", mV," >> log;
 +
sleep 2
 +
done
 +
</source>
 +
 
 +
== Press enter to continue ==
 +
=== C ===
 +
 
 +
<source lang="C">
 +
#include <stdio.h>
 +
 
 +
void pressEnterToContinue(void)
 +
{
 +
    printf("Press enter to continue\n");
 +
    getc(stdin);//XXX
 +
    while( getc(stdin) != '\n') ;
 +
}
 +
 
 +
 
 +
</source>
 +
 
 +
=== C++ ===
 +
<source lang="C">
 +
#include <stdio.h> //XXX
 +
#include <iostream>
 +
 
 +
void pressEnterToContinue(void)
 +
{
 +
    cout << "Press enter to continue" << endl;
 +
    getc(stdin); //XXX
 +
    std::cin.ignore( std::numeric_limits <std::streamsize> ::max(), '\n' );
 +
}
 +
 
 +
</source>
 +
 
 +
=== Python 2 ===
 +
 
 +
<source lang="python">
 +
 
 +
def pressEnterToContinue():
 +
    print "Press enter to continue"
 +
    raw_input()
 +
 
 +
</source>
 +
 
 +
=== Python 3 ===
 +
 
 +
 
 +
<source lang="python">
 +
 
 +
def pressEnterToContinue():
 +
    print("Press enter to continue")
 +
    input()
 +
 
 +
</source>
  
NET "Clk" LOC = "P55";
+
= Kernel Driver =
NET "Clk" TNM_NET = "Clk";
+
TIMESPEC "TS_Clk" = PERIOD "Clk" 10 ns HIGH 50 %;
+
NET "led_cathode" LOC = "P119"| IOSTANDARD = LVCMOS33 ;
+
NET "led_anode"  LOC = "P118"| IOSTANDARD = LVCMOS33 ;
+
  
Des exemples de ucf peuvent être trouvés dans le répertoire firmware du projet Armadeus.
+
* [[IIO kernel driver model]]
 +
* [[UIO kernel driver model]]
  
Une fois que ces deux fichiers sont écrits il suffit de générer le bitstream en double cliquant sur "Synthetize - XST" puis sur "Implement Design" et enfin "Generate Programming File". Si c'est opération se sont bien passées, on se retrouve avec un fichier Clk_div_led.bit (du nom du vhdl).
+
= bac à sable =
 +
[[Image:dessin.svg]]
  
C'est à partir de maintenant que les ennuis commencent (ou les choses intéressante c'est selon) il faut télécharger le bitstream dans le fpga. Pour cela j'ai utilisé UBoot, en ayant bien pris soin de configurer le réseau correctement comme expliqué sur la page [[Connection_with_U-Boot_on_Linux]].
+
* [[APF6_SP_DDR3_PINOUT]]
 +
* [[APF6_SP The full howto]]
  
il faut donc mettre le bitstream dans le répertoire tftpboot :
+
== Wavedrom ==
cp Clk_div_led.bit /tftpboot
+
  
Puis via la carte armadeus, le télécharger en ram :
+
If [https://github.com/Martoni/mediawiki_wavedrom wavedrom plugin] is installed on this wiki, we can see a beautiful waves bellow :
BIOS> tftpboot 08000000 Clk_div_led.bit
+
dm9000 i/o: 0x15c00000, id: 0x90000a46
+
MAC: 00:0e:32:00:00:01
+
operating at 10M half duplex mode
+
TFTP from server 192.168.0.143; our IP address is 192.168.0.10
+
Filename 'Clk_div_led.bit'.
+
Load address: 0x8000000
+
Loading: T ##########################
+
done
+
Bytes transferred = 131029 (1ffd5 hex)
+
  
L'enregistrer en flash :
+
<wavedrom>
  BIOS> run flash_firmware
+
{ signal: [
  .. done
+
  { name: "clk", wave: "p......" },
Erased 2 sectors
+
  { name: "bus", wave: "x.34.5x",  data: "head body tail" },
Copy to Flash... done
+
  { name: "wire", wave: "0.1..0." },
Flashing Firmware succeed
+
]}
 +
</wavedrom>
  
Puis le lancer en utilisant l'adresse du fpga mappée en 0x10060000 (voir [[Target_Software_Installation]]) et la taille du bitstream donné au moment du téléchargement (Bytes transferred = 131029 (1ffd5 hex)) :
+
= Blog =
BIOS> fpga load 0 010060000 1ffd5
+
  
Et voila, si tout c'est bien passé, la led clignote ... deux jours pour arriver à faire ça ;-)
+
* [[2022_02_18_Container_docker_pour_vieux_BSP]]

Latest revision as of 16:40, 18 February 2022

<< liste des membres


Mes petites bidouilles avec l'armadeus

Trucs

Python en environnement virtuel

Un pense bète pour installer la version voulue de python en environnement virtuel avec virtualenv:

virtualenv et autre tkinter

apt-get install python-tk python3-tk tk-dev
apt-get install python-virtualenv

Python 3.7.4

sudo apt-get install libffi-dev
wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz
tar -Jxvf Python-3.7.4.tar.xz
cd Python-3.7.4
./configure --enable-shared
make
sudo make install
sudo ldconfig /usr/local/lib

virtualenv

  • Virtual env configuration:
apt-get install python-virtualenv
mkdir virtenv
cd virtenv
virtualenv --python=/usr/local/bin/python3.7 envp37
  • enum bug fix:
cd ~/virtenv/envp37/lib/python3.7
ln -s /usr/local/lib/python3.7/enum.py
  • Activation:
source /home/armadeus/virtenv/envp37/bin/activate
  • Desactivation:
deactivate

Peripheral On Demand

Participation à la documentation ArmadeuS Project

Trash

Projets

Liens utiles

Somes usefull tricks

press a button

Here, function to «press enter to continue» on apf in different languages :

setbit /proc/driver/gpio/portFmode 13 1 # set pin as gpio
setbit /proc/driver/gpio/portFdir 13 0  # set pin as input
setbit /proc/driver/gpio/portFirq 13 1  # irq on rising edge

/usr/bin/testsuite/testbutton /dev/gpio/PF13 3

With testbutton program comming from target/linux/modules/fpga/wishbone_example/wb_button. Type «make» in this directory to compile it.

Logging with timestamps in seconds

#!/bin/sh
while true
do
LIGHT=$(cat /sys/class/hwmon/hwmon0/device/in3_input)
TIME=$(date +%s)
echo $TIME", sec, "$LIGHT", mV," >> log;
sleep 2
done

Press enter to continue

C

#include <stdio.h>

void pressEnterToContinue(void)
{
    printf("Press enter to continue\n");
    getc(stdin);//XXX 
    while( getc(stdin) != '\n') ; 
}

C++

#include <stdio.h> //XXX
#include <iostream>

void pressEnterToContinue(void)
{
    cout << "Press enter to continue" << endl;
    getc(stdin); //XXX
    std::cin.ignore( std::numeric_limits <std::streamsize> ::max(), '\n' );
}

Python 2

def pressEnterToContinue():
    print "Press enter to continue"
    raw_input()

Python 3

def pressEnterToContinue():
    print("Press enter to continue")
    input()

Kernel Driver

bac à sable

Dessin.svg

Wavedrom

If wavedrom plugin is installed on this wiki, we can see a beautiful waves bellow :

Blog