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
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
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
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)/>
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
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
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
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
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
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.
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;
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:
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
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.
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
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
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
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
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
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
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
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 .
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
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
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 .
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);
}
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
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/