tutorial uclinux

28
Tutorial de uClinux sobre NIOS II Mario Alexandre Gazziro Lirio Onofre Baptista de Almeida Coordenador: Jan Frans Willem Slaets DIPTERALAB – IFSC – USP www.dipteralab.ifsc.usp.br/novo

Upload: mario-gazziro

Post on 14-May-2015

832 views

Category:

Technology


77 download

DESCRIPTION

Tutorial de uClinux sobre NIOS IIPara Kit Terasic Altera DE-2 35

TRANSCRIPT

Page 1: Tutorial uclinux

Tutorial de uClinux sobre NIOS II

● Mario Alexandre Gazziro● Lirio Onofre Baptista de Almeida● Coordenador: Jan Frans Willem Slaets

DIPTERALAB – IFSC – USPwww.dipteralab.ifsc.usp.br/novo

Page 2: Tutorial uclinux

Organização

Parte 1: Demonstração com binários já preparados

Parte 2: Compilação do NIOS II e síntese da FPGA

Parte 3: Acréscimo do controlador de I/O ao barramento AVALON

Parte 4: Instalação do cross-compilador nios2gcc

Parte 5: Compilação do kernel do uClinux com recursos básicos

Parte 6: Compilação do kernel com suporte a rede e uso de framebuffer

Parte 7: Instalação do módulo de controle de I/O junto ao kernel

Parte 8: Compilação cruzada de aplicativo para acessar o I/O via módulo do kernel

Page 3: Tutorial uclinux

Parte 1: Demonstração com binários já preparados

Arquivos utilizados:● DE2_NIOS_HOST_MOUSE_VGA_time_limited.sof● zImage● teste

Roteiro:Entrar no "Nios II Command Shell" e mudar para o diretório onde se encontram os arquivos acima.

Carregamento do arquivo SOF (SRAM OBJECT FILE)>nios2-configure-sof DE2_NIOS_HOST_MOUSE_VGA_time_limited.sof

Entrar em outro interpretador "Nios II Command Shell"

Carregamento da imagem do kernel e do sistema de arquivos raiz>nios2-download -g zImage_de2_vga

Boot do uClinux via console JTAG>nios2-terminal

O uClinux vai apresentar as mensagens de boot através do terminal do NiosII

O símbolo /> indica o prompt do interpretador de comandos SASH (Standalone Shell) usado no uClinux

Page 4: Tutorial uclinux

uClinux/Nios IIAltera Nios II support (C) 2004 Microtronix Datacom Ltd.

setup_arch: No persistant network settings signature at 003F0000Built 1 zonelists. Total pages: 2032Kernel command line:PID hash table entries: 32 (order: 5, 128 bytes)Console: colour dummy device 80x25Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)Memory available: 5452k/8192k RAM, 0k/0k ROM Mount-cache hash table entries: 512NET: Registered protocol family 16NET: Registered protocol family 2IP route cache hash table entries: 1024 (order: 0, 4096 bytes)TCP established hash table entries: 1024 (order: 0, 4096 bytes)TCP bind hash table entries: 1024 (order: 0, 4096 bytes)TCP: Hash tables configured (established 1024 bind 1024)TCP reno registeredfb0: Altera frame buffer device, using 600K of video memoryaltps2 : base 80682010 irq 9io scheduler noop registeredio scheduler deadline registered (default)Serial: JTAG UART driver $Revision: 1.3 $ttyJ0 at MMIO 0x806810f0 (irq = 1) is a jtag_uart<DM9KS> I/O: 806810f8, VID: 90000a46mice: PS/2 mouse device common for all miceTCP cubic registeredNET: Registered protocol family 1NET: Registered protocol family 17Freeing unused kernel memory: 896k freed (0x9a4000 - 0xa83000)

Parte 1: Demonstração com binários já preparados

Shell invoked to run file: /etc/rcCommand: hostname uClinuxCommand: mount -t proc proc /procCommand: mount -t sysfs sysfs /sysinput: AT Raw Set 2 keyboard as /class/input/input0Command: mount -t usbfs none /proc/bus/usbCommand: mkdir /var/tmpCommand: mkdir /var/logCommand: mkdir /var/runCommand: mkdir /var/lockCommand: mkdir /var/emptyCommand: ifconfig lo 127.0.0.1Command: route add -net 127.0.0.0 netmask 255.0.0.0 loCommand: cat /etc/motdWelcome to ____ _ _ / __| ||_| _ _| | | | _ ____ _ _ _ _ | | | | | | || | _ \| | | |\ \/ / | |_| | |__| || | | | | |_| |/ \ | ___\____|_||_|_| |_|\____|\_/\_/ | | |_|

For further information check:http://www.uclinux.org/

Execution Finished, Exiting

Sash command shell (version 1.1.1)/>

Page 5: Tutorial uclinux

Realizar a configuração da rede TCP/IP ajustando o IP/>ifconfig eth0 192.168.180.116/>ifconfigeth0 Link encap:Ethernet HWaddr 00:07:ED:00:0 0:00 inet addr:192.168.180.116 Bcast:192.168. 180.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1 errors:0 dropped:0 overruns: 0 frame:0 TX packets:0 errors:0 dropped:0 overruns: 0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:247 (247.0 B) TX bytes:0 (0.0 B ) Interrupt:6 Base address:0x10f8

lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns: 0 frame:0 TX packets:0 errors:0 dropped:0 overruns: 0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

Parte 1: Demonstração com binários já preparados

Page 6: Tutorial uclinux

Ajuste de rota (via gateway) e habilitação de servidores de ftp e telnet

Definição da rota padrão/>route add default gw 192.168.180.1/>routeKernel IP routing tableDestination Gateway Genmask Fla gs Metric Ref Use Iface192.168.180.0 * 255.255.255.0 U 0 0 0 eth0127.0.0.0 * 255.0.0.0 U 0 0 0 lodefault 192.168.180.1 0.0.0.0 UG 0 0 0 eth0

Inicialização do servidor de FTP e TELNET embutido no BusyBox/>inetd &

>ftp 192.168.180.116Conectado a 192.168.180.116.220- Welcome to the uClinux ftpd!220 uClinux FTP server (GNU inetutils 1.4.1) ready.Usuário (192.168.180.116:(none)): ftp331 Guest login ok, type your name as password.Senha:230 Guest login ok, access restrictions apply.ftp>

>telnet 192.168.180.116Sash command shell (version 1.1.1)/>

Parte 1: Demonstração com binários já preparados

Page 7: Tutorial uclinux

Montagem de pasta em computador externo via NFS(sobre uma pasta exportada na máquina 192.168.180.122 chamada home/nios2)/>mkdir /mnt/nfs/>mount -t nfs -n -o nolock,rsize=1024,wsize=1024 192.168.180.122:/home/nios2 /mnt/nfs

Inicialização do servidor Web/>boa &

Parte 1: Demonstração com binários já preparados

Page 8: Tutorial uclinux

Inicialização do ambiente de janelas Nano-X/>nano-X &/>nanowm &

Visualização do logotipo do IFSC pelo aplicativo nxview/>nxview /mnt/nfs/IFSC.jpg

Parte 1: Demonstração com binários já preparados

Page 9: Tutorial uclinux

Criação dos devices para comunicação com o controlador de I/O/>mknod /dev/iodata c 240 0/>mknod /dev/iodir c 241 0

Execução do aplicativo de teste do controlador de I/O/>cd /mnt/nfs/>./testeImprimindo 1010101b nos leds verdes

Parte 1: Demonstração com binários já preparados

Page 10: Tutorial uclinux

Parte 2: Compilação do NIOS II e síntese da FPGA

Arquivos utilizados:● DE2_NIOS_HOST_MOUSE_VGA.ZIP● Avalon_VGA_Controller.zip● PS2.zip● de2_vga.zip

Roteiro:● Extrair o conteúdo do arquivo DE2_NIOS_HOST_MOUSE_VGA.ZIP para o diretório

\altera\qdesignsXX (onde XX é a versão do Quartus).● Extrair os demais arquivos comprimidos (indicados acima) para o diretório

\altera\qdesignsXX\DE2_NIOS_HOST_MOUSE_VGA● Executar o programa Quartus II● Abrir o projeto DE2_NIOS_HOST_MOUSE_VGA.qpf● Acessar o menu Tools, opção SOPC Builder● Clicar no botão Generate e aguardar a compilação da CPU do Nios II.● Clicar em Exit● Clicar 2 vezes no componente SDRAM_PLL e seguir o tutorial de PLL até o fim para geração dos

arquivos necessários para a nova configuração de clock (de 50 para 100MHz).● No ambiente do Quartus, selecionar menu Processing e submenu Start Compilation● Verificar se a compilação ocorreu corretamente.

OBS: Um novo arquivo em verilog descrevendo a PLL de 100MHz já foi extraído no diretório de trabalho, mas mesmo assim o tutorial de PLL deve ser executado para complementar os arquivos necessários.

Page 11: Tutorial uclinux

Parte 3: Acréscimo do controlador de I/O ao barramento AVALON

entity pio eigen isport (−− inputs:signal address : IN STD LOGIC VECTOR (1 DOWNTO 0);signal chipselect : IN STD LOGIC;signal clk : IN STD LOGIC;signal reset n : IN STD LOGIC;signal write n : IN STD LOGIC;signal read n : IN STD LOGIC;signal writedata : IN STD LOGIC VECTOR (7 DOWNTO 0); 10−− outputs:signal out port : INOUT STD LOGIC VECTOR (7 DOWNTO 0);signal readdata : OUT STD LOGIC VECTOR (7 DOWNTO 0)

);end entity pio eigen;

Page 12: Tutorial uclinux

Parte 3: Acréscimo do controlador de I/O ao barramento AVALON

Arquivos utilizados:● pio_eigen.vhd● altera_vhdl_support_lib.vhd

Roteiro:● Copiar os arquivos indicados acima para o diretório

\altera\qdesignsXX\DE2_NIOS_HOST_MOUSE_VGA● Abrir o projeto DE2_NIOS_HOST_MOUSE_VGA.qpf● Acessar o menu Tools, opção SOPC Builder● Clicar 2 vezes sobre "Create New Component..."● Selecionar o TAB "HDL Files"● Clicar em "Add HDL File..."● Selecionar "altera_vhdl_support_lib.vhd"● Aguardar a verificação do componente e clicar em Ok● Clicar novamente em "Add HDL File..."● Selecionar "pio_eigen.vhd"● Aguardar a verificação do componente e clicar em Ok● Selecionar o TAB "Signals" e verificar se aparecem os

sinais de controle do avalon● Selecionar o TAB "Component WizardDI" e escolher

um nome para o grupo do componente:

Page 13: Tutorial uclinux

Parte 3: Acréscimo do controlador de I/O ao barramento AVALON

● Component Group: DIPTERALAB● Selecione YES para salvar as alterações no componente● Selecione o grupo DIPTERALAB na lista de componentes do NIOS II● Clique 2 vezes sobre o componente recém criado "pio_eigen"● Clicar em "Finish"● Clicar em "Generate"● Clicar em "Exit"

OBS: Anotar o endereço no qual o componente foi instalado no barramento Avalon. Neste exemplo, o valor foi 0x00400000 , porém este endereço varia sempre. O componente instanciado se chama pio_eigen_0

Page 14: Tutorial uclinux

Parte 3: Acréscimo do controlador de I/O ao barramento AVALON

● No Quartus, com o projeto aberto, editar a linha 413 do arquivo DE2_NIOS_HOST_MOUSE_VGA.v :

.out_port_from_the_led_green(LEDG),

deve se tornar:

.out_port_to_and_from_the_pio_eigen_0(LEDG),

para associar os pinos do KIT DE2 ligados aos leds verdes ao novo componente criado.

● No menu "Project", selecionar "Add/Remove Files in Project..."

● Adicionar primeiro o arquivo "altera_vhdl_support_lib.vhd" e depois o arquivo "pio_eigen.vhd"

● Salvar o projeto

● Selecionar menu "Processing" e submenu "Start Compilation"

● Verificar se a compilação ocorreu corretamente.

Page 15: Tutorial uclinux

Parte 4: Instalação do cross-compilador nios2gcc

Arquivos utilizados:● nios2gcc.tar.bz2● nios2libs.tar.bz2

Roteiro:● Extrair os arquivos acima no diretório raiz

>su >tar jxf nios2gcc.tar.bz2 -C />tar jxf nios2libs.tar.bz2 -C />exit

● As ferramentas de cross-compilação serão instaladas no diretório /opt/nios

● Ajuste o Path para PATH=$PATH:/opt/nios2/bin:$HOME/bin

● Verifique a instalação com o comando>nios2-linux-uclibc-gcc -vReading specs from /opt/nios2/lib/gcc/nios2-linux-u clibc/3.4.6/specsConfigured with: /root/buildroot/toolchain_build_ni os2/gcc-3.4.6/configure --prefix=/opt/nios2 --build=i386-pc-linux-gnu --host= i386-pc-linux-gnu --target=nios2-linux-uclibc --enable-languages=c --en able-shared –disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-nls –enable-threads --disable-multilib --enable-cxx-flags=-stat icThread model: posixgcc version 3.4.6

Page 16: Tutorial uclinux

Parte 5: Compilação do kernel do uClinux com recurs os básicos

Arquivos utilizados:● uClinux-dist-20070130.tar.gz● uClinux-dist-20070130-nios2-02.diff.gz● system_0.ptf

Roteiro:● Extrair o arquivo uClinux-dist-20070130.tar.gz no diretório do usuário ($home) e aplicar o patch

>tar -zxvf uClinux-dist-20070130.tar.gz>cd uClinux-dist>zcat ../uClinux-dist-20070130-nios2-02.diff.gz | patch -p0

● Iniciar a configuração do kernel

>make menuconfig

● Ajusta o fabricante: Altera, nios2nommu

Vendor/Product Selection --->--- Select the Vendor you wish to target(Altera) Vendor--- Select the Product you wish to target(nios2nommu) Altera Products

Page 17: Tutorial uclinux

Parte 5: Compilação do kernel do uClinux com recurs os básicos

● Selecionar kernel versão 2.6.x, excluir a Libc e ajustar para configurações padrão.

Kernel/Library/Defaults Selection --->(linux-2.6.x) Kernel Version(None) Libc Version[*] Default all settings (lose changes)[ ] Customize Kernel Settings[ ] Customize Vendor/User Settings[ ] Update Default Vendor SettingsThen <exit> <exit> <yes>

● Copiar o arquivo system_0.ptf , gerado pelo SOPC Builder do Nios II (contendo especificações do processador) para o diretório ~/uClinux-dist/linux-2.6.x/

>make vendor_hwselect SYSPTF=system_0.ptf

● Escolher a partir de qual memoria o kernel deve inicializar. Escolher 1, 1 e 2 para SDRAM.

● Cria imagem do sistema de arquivos>make romfs

● Compila o kernel + filesystem, estilo initramfs>make (o primeiro make pode falhar, por causa da compilação concorrente)>make

● Cria imagem contendo o kernel e o sistema de arquivos para ser carregada na memoria do kit.>make linux image

Page 18: Tutorial uclinux

Parte 6: Compilação do kernel com suporte a rede e uso de framebuffer

Roteiro:

● Para entrar nas configurações do kernel e dos aplicativos:

>cd ~uClinux-dist>make menuconfig

Kernel/Library/Defaults Selection --->(linux-2.6.x) Kernel Version(None) Libc Version[ ] Default all settings (lose changes)[*] Customize Kernel Settings[*] Customize Vendor/User Settings[ ] Update Default Vendor Settings

Retornar ao menu principal e sair

Page 19: Tutorial uclinux

Parte 6: Compilação do kernel com suporte a rede e uso de framebuffer

● Dentro da configuração do kernel, a rede deve ser configurada como a seguir:

Networking -->[*] Networking supportNetworking options ---><*> Packet socket<*> Unix domain sockets[*] TCP/IP networking

Device Drivers -->Network device support ─>[*] Network device support[*] Ethernet (10 or 100Mbit)

[ ] SMC 91C9x/91C1xxx support[ ] Opencores (Igor) Emac support[ ] MoreThanIP 10_100_1000 Emac support[ ] DM9000 support[*] DM9000A with checksum offloading

File systems -> Network File Systems -->[*] NFS file system support[*] Provide NFSv3 client support

Page 20: Tutorial uclinux

Parte 6: Compilação do kernel com suporte a rede e uso de framebuffer

● Nas configurações do kernel, fazer os ajustes para suporte ao Nano-X

Processor type and features -->--- Platform drivers Options[*] Avalon VGA controller support[*] PS2 controller

Device Drivers --> Character devices --->[*] Virtual terminal[ ] Support for console on virtual terminal # DESELECIONAR ESTA OPÇÂO!

select the frame buffer driver,Device Drivers --> Graphics support --->Console display driver support --->[ ] VGA text console # DESELECIONAR ESTA OPÇÂO!< > Framebuffer Console support

select input device drivers,Device Drivers --> Input device support--- Generic input layer (needed for keyboard, mouse , ...)[ ] Userland interfaces[*] Mouse interface[ ] Provide legacy /dev/psaux device # DESELECIONAR ESTA OPÇÂO!(1024) Horizontal screen resolution(768) Vertical screen resolution

Page 21: Tutorial uclinux

Parte 6: Compilação do kernel com suporte a rede e uso de framebuffer

if you will use PS/2 mouse or keyboard,--- Input Device Drivers[*] Keyboard ---><*> AT keyboard[*] Mouse ---><*> PS/2 mouse Hardware I/O ports --->--- Serial I/O support[ ] i8042 PC Keyboard controller # DESELECIONAR ESTA OPÇÂO![ ] Serial port line discipline # DESELECIONAR ESTA OPÇÂO!

Retornar ao menu principal e sair

● Nas configurações dos aplicativos que vão compor o filesystem, selecionar:

Library Configuration-->[*] Build libZ[*] Build libjpeg

Page 22: Tutorial uclinux

Parte 6: Compilação do kernel com suporte a rede e uso de framebuffer

– MicroWindows --->[*] MicroWindows--- Compiling Options[*] Optimize--- Libraries[*] NanoX--- Demos[*] NanoXDemo--- Applications[*] NanoWM--- Settings(Packed-16bit-5/6/5) Screeen PixType[ ] Link App into server[*] Have File IO[*] Have JPEG Support be selected--- Display Config[*] Frame Buffer Display--- Mouse/Touch Screen[*] Serial Mouse--- Keyboard[*] Scan Keyboard--- Install These Applications[*] Nano-X[*] NanoWM[*] NTetris[*] NXclock[*] NXterm[*] NXView

Sair e salvar. Seguir as etapas finais para compilação como na Parte 4 .

Page 23: Tutorial uclinux

Parte 7: Instalação do módulo de controle de I/O ju nto ao kernel

Arquivos utilizados:● nios2rootfs.tar.bz2● nios2-uClinux-additional_hardware-files.tar.gz

Page 24: Tutorial uclinux

Parte 7: Instalação do módulo de controle de I/O ju nto ao kernel

Roteiro:● Extrair o arquivo nios2rootfs.tar.bz2 na área $home do usuário

● Acrescentar as linhas no arquivo "rootfs_list" no diretório ~/uClinux-dist/vendors/Altera/nios2nommu

nod /dev/iodata 666 0 0 c 240 0nod /dev/iodir 666 0 0 c 241 0

● Extrair o arquivo "io.c" de nios2-uClinux-additional_hardware-files.tar.gz e colocar no diretorio

~/uClinux/linux-2.6.x/drivers/misc

● Alterar o arquivo "io.c" colocando o endereço que foi atribuido automaticamente no barramento avalon para o registrador de dados e acrescente 1 para o endereço do registrador de endereços.

/* register addresses */#define DATA_REGISTER 0x00400000#define DIR_REGISTER 0x00400001

● No mesmo diretório, editar o arquivo Makefile, acrescentando a linha:

obj-$(CONFIG_IO) += io.o

Page 25: Tutorial uclinux

Parte 7: Instalação do módulo de controle de I/O ju nto ao kernel

● Ainda no mesmo diretorio, editar o arquivo Kconfig acrescentando a seção:

config IO tristate "IO module for custom IO" help Enable module to access custom IO.

OBS: O arquivo deve ser mantido terminando com "endmenu"

>make menuconfig

Kernel/Library/Defaults Selection --->(linux-2.6.x) Kernel Version(None) Libc Version[ ] Default all settings (lose changes)[*] Customize Kernel Settings[ ] Customize Vendor/User Settings[ ] Update Default Vendor Settings

● Retornar ao menu principal e sair

● Selecionar "Device Drivers --> Misc Devices"

[*] IO module for custom IO

Sair e salvar. Seguir as etapas finais para compilação como na Parte 4 .

Page 26: Tutorial uclinux

Parte 8: Compilação cruzada de aplicativo para aces sar o I/O via módulo do kernel

Arquivos utilizados:● pio_eigen.h● teste.c

Roteiro:● No computador desktop, realizar a cross-compilação do aplicativo de teste:

>nios2-linux-uclibc-gcc teste.c -o teste -elf2flt="-s 16000" -Wall

● Copiar o aplicativo teste para o diretório /home/nios2/ visível para o NFS do kit altera

● Executar o aplicativo de teste a partir do shell do uClinux/>cd /mnt/nfs/>./testeImprimindo 1010101b nos leds verdes

#include <stdio.h>#include <unistd.h>#include "pio_eigen.h"int main(void){

/* define todos os pinos como saida */write_dev(dir_file,255);printf("Imprimindo 1010101b nos leds verdes\n");write_dev(dat_file,0x55);return(0);

}

Page 27: Tutorial uclinux

Parte 8: Compilação cruzada de aplicativo para aces sar o I/O via módulo do kernel

#define DIR_FILE "/dev/iodir"#define DAT_FILE "/dev/iodata"typedef enum{dat_file,dir_file} files;

// read from device file and return value of byte unsigned char read_dev(files file){

char string[5]={0};FILE *f=NULL;int i=0;/* open requested file for reading */switch(file){

case dat_file:f=fopen(DAT_FILE,"r");break;case dir_file:f=fopen(DIR_FILE,"r");break;

}/* read line */while((i<5) && (string[i++]=fgetc(f)));fclose(f);/* return value */return atoi(string);

}

// write byte to device file void write_dev(files file, unsigned char val){

char string[5]={0};FILE *f=NULL;/* open requested file for writing */switch(file){

case dat_file:f=fopen(DAT_FILE,"r+");break;case dir_file:f=fopen(DIR_FILE,"r+");break;

}/* read line */itoa(string,val);fprintf(f,string);fclose(f);

}

No SASH:/>echo "255" > /dev/iodir/>echo "85" > /dev/iodata/>cat /dev/iodata

Page 28: Tutorial uclinux

Referências

● DE2 Kit information: http://users.ece.gatech.edu/~hamblen/DE2/

● SASH Shell: http://members.tip.net.au/~dbell/

● Busybox: http://www.busybox.net/

● Nioswiki JotSpot: http://nioswiki.jot.com/WikiHome/%C2%B5Clinux

● Nios II uClinux with additional hardware: http://piie.net/index.php?section=nios

● Niosforum: http://www.niosforum.com/

● Uclinux: http://www.uclinux.org/

● The Nano-X System: http://www.microwindows.org/