Session : Kernel activities

Conectare

Plăcile sunt toate configurate cu un IP static pe interfața WAN, IP-uri din subdomeniul 10.0.1.0/24 Pentru a vă putea conecta la ele, va trebui să puneți un IP adițional pe interfața de rețea a PC-ului de pe care dezvoltați programul (IP pe o subinterfața eth0:1, de exemplu) din același subdomeniu. Încercați IP-uri 10.0.1.1xx pentru a nu avea coliziuni cu plăcile.

scp <fișier> <ușer>@<adresa>:<cale>

Alternativ, puteți monta direct filesystem-ul plăcii de la server-ul NFS.

cat /proc/cmdline

ca să vă dați seama care este acesta.

Tasks

Descărcați arhiva sesiune-09.

1. Interfața /sys/class/leds Explorați /sys/class/leds

  • /sys/class/leds/a/ este folder-ul asociat led-ului A
  • /sys/class/leds/a/brightness/ controlează luminozitatea led-ului
  • /sys/class/leds/a/trigger/ declară un eveniment cu care să fie asociată aprinderea led-ului 2. Interfața __raw_writel Până acum ați interacționat cu LED-urile prin interfața oferită de un driver în /sys/class/leds. Acum vom avea ocazia să vedem ce se află în spatele acelei interfețe. AP7000 (procesorul de pe plăcuța de dezvoltare) are niște registre pentru “General Purpose I/O”. Pentru fiecare dintre cele 5 porturi (A,B,C,D,E) avem un set de registre, dintre care enunțăm:
  • PER - pin enable register
  • OER - output enable register
  • CODR - clear output data register
  • SODR - set output data register

Registrele sunt pe 32 de biți, fiecare bit configurând un anumit pin, de la cel mai semnificativ (asociat pinului 0), la cel mai nesemnificativ (asociat pinului 31 de pe portul respectiv). Registrele suportă scriere cu măști, astfel încât doar pinii biților 1 vor fi afectați. De exemplu, pentru a aprinde LED-ul de pe pinul 12 al portului E vom scrie:

per = 0x00080000
oer = 0x00080000
codr= 0x00080000

Definiții necesare pentru __raw_writel

#define PORTA 0xffe02800 
#define PORTB 0xffe02c00 
#define PORTC 0xffe03000 
#define PORTD 0xffe03400 
#define PORTE 0xffe03800 
#define PER 0x0000 
#define OER 0x0010 
#define SODR 0x0030 
#define CODR 0x0034 

Toate registrele pentru GPIO ale unui port se găsesc în aceeași locație, cu offset-i diferiți față de aceeași adresă de bază. Atât adresa de bază a fiecărui port cât și offset-ii pentru toți regiștrii se găsesc atât în datasheet cât și ca definiții în header-ele nucleului.

3. Regiștrii se pot modifica direct cu __raw_writel sau cu biblioteca gpio. Biblioteca face în plus verificări de concurență, apoi apelează tot __raw_writel. Funcțiile puse la dispoziție sunt următoarele:

  • int gpio_direction_input(unsigned gpio)
  • int gpio_direction_output(unsigned gpio, int value), unde value este valoarea inițială.
  • void gpio_set_value(unsigned gpio, int value)

gpio este un identificator dat fiecărui pin, format cu macro-ul GPIO_PIN_PA(nr) (pentru portul A). Header-ele necesare pentru funcțiile și macrourile enunțate sunt cele din exemplul de mai jos:

#include <asm/gpio.h>
#include <mach/at32ap700x.h>
 
...
 
void set_pin()
{
    gpio_direction_output(GPIO_PIN_PA(13),0); // configurează pinul 13 de pe portul A ca ieșire și valoarea inițială 0
}
...
  • Cele trei leduri sunt PA16, PA19, PE19
sesiuni/kernel/embedded.txt · Last modified: 2012/07/12 16:42 by avoinescu